An author-first AI writing surface. Every AI edit is a proposal. Every accepted proposal is logged. The ledger is exportable — as JSON for a machine, as Markdown for a reader — so the author, when asked, has an honest answer.
Manuscripts.ai was not shipped to a client. It was shipped to ourselves — a laboratory for how an author-first AI editor should behave when the industry is racing in the opposite direction.
Modern AI writing tools optimise for output volume. Type a prompt, receive a paragraph. The paragraph is elegant, sometimes better than what the author would have written. It goes into the draft. And a week later the author cannot remember whether the sentence about the mother's hands was theirs or the model's.
Attestations of authorship are now routine. An author who cannot answer the question — which words are yours — is exposed. Not because they cheated, but because their tooling didn't keep the receipts.
The most-used AI writing UIs treat the author's manuscript as raw material for the model. Prompts overwrite. Suggestions auto-apply. Nothing is filed. The writer is the second author of their own book.
The Pad — the AI brainstorm surface — cannot copy prose into the manuscript. Enforced in the system prompt, in the CSS .no-copy class, and in the microcopy. "Walk back to the manuscript" is the close button.
Every AI-accepted edit is logged with before/after text. The log is exportable as JSON and Markdown.
No dark mode. Source Serif 4. 68-character line. Light-mode only. Because that is how books are read.
There is a small betrayal that happens between an author and their draft when an AI enters the room. We built Manuscripts to keep the ledger — so that the author, when asked, has an honest answer.
The system separates three surfaces by intent — the writing surface, the exploration surface, and the analysis surface — and unifies them through a single provenance ledger. Retrieval is FTS5. Orchestration is OpenRouter. Persistence is SQLite locally, mirrored to Supabase for sync.
Every AI suggestion — from an inline command, from the Wizard's guided drafting flow, from a template run — appears in a sheet with two buttons. Accept, or Reject. Only Accept writes to the manuscript. And only Accept writes to the ledger.
Before-text, after-text, the task kind (rewrite, expand, hook-sharpen — one of twelve), the paragraph IDs, the document ID, and the timestamp of acceptance. Nothing is filed silently. Nothing is hidden.
JSON, for machine-verifiable audit. Markdown, for a human reader. And its own claim.summary is explicit: only manuscript_ai_events count as AI in the draft. Adjacent activity — Pad, Chat, Templates, Flags — is transparency-only.
{
"id": "ai_prov_01HZQ8…",
"task": "rewrite",
"model": "google/gemini-2.5-pro",
"before": "She walked to the door.",
"after": "She hesitated, then opened it.",
"accepted_at": "2026-07-24T14:22:07Z",
"claim": { "summary": "manuscript_ai_event" }
}
“The ledger is the only reason we felt honest shipping this.”
The Brainstorm Pad is where the author spars with the model — throws ideas, argues with them, sketches outlines. Nothing in the Pad can be copied into the manuscript. That constraint isn't a filter — it's the architecture. It is enforced at three layers, each of which can catch what the others miss.
user-select: none and a .no-copy class. The keyboard cannot select. The mouse cannot drag.22 of 25 authors asked for that wall, and we kept it.
Select text in the editor. A bubble menu appears. Pick a command. A suggestion streams in. Accept or reject. Every accept is a ledger row.
Three commands that violated the wall — AI Book Writer, Complete Story, Storyteller Mode — were cut from the final registry.
Manuscripts routes every LLM call through OpenRouter using the OpenAI-compatible SDK.
The default model is Gemini 2.5 Pro — a million-token context window, five-to-seven
times cheaper than Sonnet, and cheap enough that a 60,000-word manuscript can be held
in a single prompt without stitching. When quality matters more than cost, calls
escalate to Sonnet 4 or Gemini 3 Pro Preview. Costs are billed in tokens, then
multiplied by a per-model factor stored in src/lib/models.ts.
Sixteen MC-XXXX codes cover the full failure taxonomy — auth, rate limit, model refusal, malformed response, upstream 5xx. No opaque "something went wrong." When the model fails, the author knows how.
Manuscripts uses SQLite FTS5 with bm25() ranking and snippet() excerpts. Paragraph-aware chunking (roughly 300 words per chunk, respecting scene and chapter breaks) lives in src/lib/chunk.ts. There are no embeddings. There is no vector DB. The retrieval mechanism is keyword search with strong ranking.
This is a deliberate architectural bet. For a single-author corpus, keyword retrieval is faster, cheaper, deterministic and — critically — citable. Every snippet returned by the Ask surface carries a source attribution the author can verify. CLAUDE.md puts it plainly: don't add an embedding service unless asked. FTS5 is the deliberate choice.
The literary measure is not an aesthetic — it is a reading finding. Somewhere between 45 and 75 characters per line, the eye stops re-finding the start of the next line and starts reading. We chose 68. We chose Source Serif 4 because it was designed for long-form reading on screens. We chose Geist Sans for chrome because chrome should get out of the way. We chose Geist Mono for IDs and timestamps because those things are meant to be read as machine text.
Call me Ishmael. Some years ago — never mind how long precisely — having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world.
It is a way I have of driving off the spleen and regulating the circulation. Whenever I find myself growing grim about the mouth; whenever it is a damp, drizzly November in my soul; then, I account it high time to get to sea as soon as I can.
# ai_provenance row · illustrative id = "ai_prov_01HZQ8…" task = "rewrite" model = "google/gemini-2.5-pro" before = "She walked to the door." after = "She hesitated, then opened it." doc_id = "doc_01HZ…" accepted = "2026-07-24T14:22:07Z" by = "@author" # nothing filed silently
prefers-reduced-motion.
Grammar and style suggestions in Manuscripts come from Harper.js — a WebAssembly linter that runs entirely in the author's browser. No paragraphs are sent to a server. The library is lazy-imported only when an author enables the feature. When the underline appears under a sentence, no network request has been made.
She had walked to the door. There was no one there, and she had already begun to wonder if the letter had been a mistake.
Manuscripts uses custom handle-and-password authentication. Passwords are hashed with
Node's crypto.scryptSync
using a per-user 64-byte salt. Sessions are HttpOnly,
SameSite=Lax,
__Host--prefixed
cookies with a 30-day sliding TTL. Google Sign-In is available but never required.
There is no Facebook button. There is no LinkedIn button. The author's handle can be
anything from three to thirty-two characters, and the author's writing is stored under
that handle and no external identity.
5 login attempts per 5 minutes per IP+email.
Every failure is classified with an MC-XXXX code — no opaque errors.
Manuscripts is a single application organised around a single question: what would an author-first AI editor actually need?
Manuscripts is not a launched product. It is a working product in the hands of a hand-picked cohort of authors. The v3 build went to real writers on 2026-07-08. The first external author signup was 2026-07-14. The team has been shipping, listening, and cutting features — three templates were removed in the first two weeks because they violated the wall — while the ledger, the wall, and the measure held.
We are in an early-access cohort of 34 authors, actively used by a smaller subset, watched carefully by all of us. The product is not finished. It was not meant to be, yet.
Adoption is being measured by conversations, not conversions. The next chapter is being written.
The most consistent piece of feedback was gratitude for the wall. Authors do not want a tool that races them. They want a tool that keeps its hands where they can see them.
In twelve days, an early-access cohort of 34 authors signed up. Four used AI features. One wrote three hundred thousand words with zero AI calls. The shape of adoption tells us the product is a serious editor with an optional AI layer — which is exactly what we designed.
Every product decision that reinforces the wall — the CSS, the microcopy, the different page background — has been more user-praised than any AI feature we've shipped.
The choice to default to Gemini 2.5 Pro over Sonnet is not a compromise. It is a design decision. Cheaper models at large context let us hold whole books in a single prompt without stitching, which lets us give authors cleaner, more coherent suggestions.
If you're planning an AI product where the trust story matters — provenance, guardrails, human-in-the-loop, honest UX — we would like to hear about it.