Content Factory — User Guide

Content Factory turns voice notes and typed text into structured content drafts, with built-in A/B testing to help you refine your voice over time. Speak or type an idea, let AI suggest the right content type, review the draft, and send it through a scoring workflow to see what's actually working.

URL: https://factory.haiven.site


The Workflow

1. Record a voice note OR type your text
2. AI transcribes and suggests content types  you pick one
3. Draft is generated (title, tags, body)
4. Optionally: revise with voice or text feedback
5. Save  draft lands in the Drafts pipeline
6. Send to A/B Test  score two candidate versions
7. Compare results and keep the stronger draft

All data (sessions, drafts, A/B tests, scores, highlights) persists to SQLite and survives container restarts.


Content Types

Content types are suggested by the AI after transcription — you confirm or override.

Type When to use
Entry Personal journal entry, daily reflection, end-of-day note
TIL A specific thing you learned today — technical, factual, operational
Link Sharing a URL with your commentary on why it matters
Quote A quote worth keeping, with context about where it came from
Build Progress note on something you're building — what worked, what didn't
Site Page Prose content destined for a static site page

Voice Registers

The register shapes how the LLM formats your words.

Register What it does
Authority Strips hedges, writes declaratively, gets to the point fast. Good for TIL, Link, Quote, Build.
Conversational Preserves your natural voice and word choices. Good for Entry and reflective content.

Choose Authority when you want crisp, instructional prose. Choose Conversational when you want the output to sound like you talking.


Creating Content

Navigate to the Create view (#create in the URL).

Voice Path

1. Record

Click Record and speak. Animated bars appear while the microphone is active — this confirms audio is being captured. Click Stop when done.

Your browser will ask for microphone permission the first time. Grant it. The page must be loaded over HTTPS (https://factory.haiven.site) for the microphone to work.

On iOS: Settings > Safari > Microphone must be set to Allow.

2. Classify

After transcription, the AI suggests one or more content types. Review the suggestion and select the type that fits. You can override the suggestion — the AI is a starting point, not a decision.

Select your voice register at this step.

3. Review the draft

The draft appears with:

[EXPAND] markers in the body are rendered as styled callout boxes — these indicate sections the LLM flagged as expandable.

4. Revise (optional)

Voice revision: Click Record Feedback, speak your changes ("make it shorter", "add a code example", "the third paragraph is wrong"), then click Stop. The draft updates.

Text revision: Type feedback in the feedback box and click Apply Feedback. Revise as many times as needed.

You can also directly edit the title, tags, or body text in the form fields.

5. Save

Click Save Draft. The file is written to:

/mnt/apps/src/factory/content/drafts/{type}/YYYY-MM-DD-{slug}.md

A confirmation banner shows the file path. The form resets for the next entry.

Text Path

If you already have text (notes, a paste, an idea you want to structure):

  1. Click the Text tab in the Create view
  2. Type or paste your raw text — or drag-and-drop a .txt or .md file onto the text area
  3. Click Format — the AI suggests a content type and generates the draft
  4. Confirm the content type, select a register
  5. Revise and save as above

A/B Testing

A/B testing lets you score two versions of a draft against each other to find which one better reflects your voice.

Navigate to the A/B Tests view from the top navigation.

How to Create a Test

From the Drafts view, find any untested draft and click Send to A/B Test. This creates a test with Candidate A pre-populated. You can then add a Candidate B by:

The Review Flow

A/B review is sequential to prevent bias — you score each candidate independently before seeing the comparison.

Step 1: Review Candidate A

Read the full article. Optionally highlight passages:

Highlights persist to the database and appear in the compare view.

When ready, score Candidate A on three dimensions (1–5 scale):

Dimension What it measures
Voice Does this sound like you? Does it use your natural patterns?
My Arguments Are your actual ideas and reasoning captured accurately?
Tone Does the emotional register fit the content and context?

There are no pre-selected defaults. Score each dimension intentionally. Use keyboard shortcuts to move quickly (see below).

Click Submit Scores or press Enter to advance.

Step 2: Review Candidate B

Same process as Candidate A — read, highlight, score independently.

Step 3: Compare

The compare view shows:

The AI scores are generated by GLM-4.7-Flash after you submit your human scores. They're a second opinion, not a verdict — use disagreements as prompts to examine your own reasoning.

Auto-Save

Scores auto-save every 2 minutes while you're in the review flow. A visual indicator confirms each save. If you close the tab mid-review, your progress is preserved.


Drafts

Navigate to the Drafts view from the top navigation.

Drafts are organized into two sections:

Untested — Drafts saved but not yet sent through A/B testing. Each shows a Send to A/B Test button.

Tested — Drafts that have completed at least one A/B test. Score badges show the final human scores at a glance.

Draft Detail

Click any draft to open the detail view. Available actions:

Output File Format

Each saved draft is a markdown file with YAML frontmatter:

---
type: til
date: 2026-03-15
tags: [qdrant, embeddings, debugging]
---

# embedding dimensions must match at collection creation time

Qdrant collections lock their vector dimensions at collection creation time.
If you ingest with 2560-dim vectors into a 1536-dim collection, every upsert
silently fails. Drop and recreate the collection to fix.

Files are saved at: /mnt/apps/src/factory/content/drafts/{type}/


Keyboard Shortcuts

Global

Key Action
Ctrl+Enter / Cmd+Enter Save draft (when form is focused)
Space Toggle recording (when Record button is focused)

A/B Review Flow

Key Action
15 Rate the current scoring dimension
Tab Advance to next dimension (Voice → Arguments → Tone)
Shift+Tab Go back to previous dimension
Enter Submit scores / advance to next step
Escape Go back one step

The active scoring dimension is highlighted with a crimson outline so you always know where you are.


Tips

Talk first, decide later. You don't need to know what you're making before you record. Speak the idea — the AI will suggest the type. Override freely.

Speak in complete thoughts. The LLM handles filler words and false starts, but complete sentences give it better material. Lead with the finding, then the context.

Use revision freely. Record a messy first pass, then refine with a 10-second voice note about what to change. The revision loop is fast.

Don't over-edit in the form. If the body needs significant restructuring, use voice or text feedback rather than editing the textarea directly — the LLM will restructure more coherently.

Use highlights to build your feedback vocabulary. Over time, patterns in what you mark positive vs. negative reveal what "your voice" actually means — specific word choices, sentence rhythms, argument structures.

Score without defaults. The A/B form has no pre-selected ratings intentionally. Forcing yourself to choose each score from neutral prevents anchoring bias.

Check AI disagreements. When the AI and your scores diverge by 2+, it's worth asking whether the AI noticed something you rationalized away — or whether the AI is wrong about your voice specifically.

For quotes: Speak the quote word-for-word first, then add attribution and context. The formatter separates them correctly.

For links: State the URL or site name, summarize what it is, then say why it matters. The formatter structures it into a link post.

Drag-and-drop for existing notes: Drop a .txt or .md file onto the text input to populate it instantly — no copy-paste needed.


Troubleshooting

Microphone button doesn't respond

Make sure you're on https://factory.haiven.site (not HTTP). Click the microphone icon in your browser's address bar and grant microphone permission.

On iOS: Settings > Safari > Microphone must be set to Allow.

Recording waveform doesn't appear

The animated bars require Web Audio API access. If you see a static button but no waveform, microphone permission may have been granted but the audio context failed to initialize. Reload the page and grant permission when prompted.

"Transcription failed" error

haiven-transcribe may be restarting or under load. Wait 30 seconds and try again. If it persists, check https://status.haiven.site for service health.

Draft is blank or incomplete

The model may be cold-starting. GLM-4.7-Flash (used for draft generation) normally responds within a few seconds, but can take up to 30 seconds after a long idle period. Wait and click Format again.

Draft doesn't match what I said

Try the Authority register for more direct output. If the transcription itself was wrong (visible in the raw text below the form), re-record in a quieter environment or speak more slowly.

Classification suggestion seems wrong

Override it. The AI suggestion is a heuristic. If you're consistently getting wrong suggestions for a particular content pattern, the voice notes may need clearer signal — lead with the type of thing you're saying ("here's a TIL...", "this is a build note...").

A/B test scores not saving

Auto-save triggers every 2 minutes. If you don't see the save indicator, check your network connection. Scores are written to factory.db — if the /data volume is full or has a permissions issue, saves will fail silently. Contact your administrator.

Highlights disappearing after page reload

Highlights persist to SQLite. If they're gone after a reload, the container may have restarted with a missing or unbound /data volume. Check container logs: docker logs content-factory.

Page not loading / blank screen

The app uses hash-based routing (#create, #drafts, #ab-tests). If the page loads blank, try navigating directly to https://factory.haiven.site/#create.