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
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
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
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
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
- 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.sqlitefreely.
keel export --tree
into something that syncs is a fine habit.