KEEL · YARD v0.10.0

Exports & durability

The database is the book — so portability is bought deliberately, not inherited. Exports write the whole series as ordinary files anyone can read in fifty years; snapshots pin moments; and the durability story is designed so that no single failure, including Keel itself, can take your manuscript with it.

The export tree

$ keel export --tree exported tree → export\ export\ series.toml # imprint · author · canon policy loft\ calendar.yaml characters\kael.md # frontmatter + prose, one file each locations\ factions\ lore\ ledger\ facts.jsonl # one fact per line, sorted, stable bytes promises.yaml volumes\01\ volume.toml # title · target · page geometry frames\chapters.yaml keel\arc-v1.1\ arc.yaml mv-v1.1.1\ movement.yaml b-v1.1.1.1.yaml # beat cards, nested by containment planking\ ch01\01-s-0001.md # ONE SENTENCE PER LINE, reading order unassigned\ # leaves not yet in a chapter — never hidden

Run it any time; it is deterministic and complete. One-sentence-per-line survives from the original design for a simple reason: it makes diffs readable — a changed sentence is a changed line.

E-books

$ keel export --epub # or --docx exported epub → export\book.epub

The manuscript is built from clean CommonMark — every leaf through plank strip (markup collapsed to its text, @cut dropped, scene breaks as asterisks), chapters as headings — and handed to pandoc with the title and author. If pandoc is missing the error says exactly how to install it (winget install JohnMacFarlane.Pandoc); nothing fails silently. Covers and styling are a backlogged polish item; the text is complete today.

Snapshots

$ keel snapshot "Draft One" snapshot draft-one — 14 objects pinned $ keel snapshot draft-one 2026-08-25 21:14 UTC 14 objects

A snapshot pins every object’s head revision under a name — a reference point, not a copy (revisions are immutable, so pinning is just remembering numbers). Duplicate names are refused. Diffing against a snapshot (“what changed since draft one?”) is a backlogged, held-undecided item.

Stats and the burn-down

$ keel stats words 41208 / 150000 (27%) · ~137 of ~502 pages pace 5810 words this week (~830/day) burn ~131 days to target at this pace last 14 days: 2026-08-24 1240 ▮▮▮▮▮▮ 2026-08-25 2402 ▮▮▮▮▮▮▮▮▮▮▮▮

Everything is derived from revision history alone — per-day word deltas attributed to the day each revision landed. No tracking apparatus, no separate log to maintain; the store already remembers.

The durability story

What protects your book, layer by layer:
  • Immutable revisions. Nothing is ever deleted — not by check-in, not by abandoning an amendment (heads walk back; the rows remain). Every version of every leaf is one query away, hashed and compressed, in a single SQLite file per series.
  • Plain-text working files. Anything checked out is a real file in checked-out\. In-flight writing survives a crash of Keel, SQLite, Docker, or the machine’s opinion of all three.
  • The export tree, on demand. The entire series as ordinary files — the format-independence escape hatch. Run it before anything that makes you nervous.
  • The index is disposable. Search and refs are derived data, rebuilt byte-identically from the store — delete index.sqlite freely.
The honest gaps, until hosting: there is no scheduled nightly export yet, and no off-machine copy unless you make one — both arrive with hosted series (managed Postgres with point-in-time recovery, the nightly tree export to object storage, and a restore that has actually been tested). Until then: keel export --tree into something that syncs is a fine habit.