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
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 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 |
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.
Navigate to the Create view (#create in the URL).
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.
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.
The draft appears with:
[EXPAND] markers in the body are rendered as styled callout boxes — these indicate sections the LLM flagged as expandable.
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.
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.
If you already have text (notes, a paste, an idea you want to structure):
.txt or .md file onto the text areaA/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.
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:
A/B review is sequential to prevent bias — you score each candidate independently before seeing the comparison.
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.
Same process as Candidate A — read, highlight, score independently.
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.
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.
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.
Click any draft to open the detail view. Available actions:
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}/
| Key | Action |
|---|---|
Ctrl+Enter / Cmd+Enter |
Save draft (when form is focused) |
Space |
Toggle recording (when Record button is focused) |
| Key | Action |
|---|---|
1 – 5 |
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.
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.
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.
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.
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.
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.
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.
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...").
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 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.
The app uses hash-based routing (#create, #drafts, #ab-tests). If the page loads blank, try navigating directly to https://factory.haiven.site/#create.