Deterministic continuity auditing for novels. Point it at a manuscript and it catches the age-math, calendar, duration, and object bugs your beta readers miss, for free, on your own machine, in a fraction of a second.
Continuity is the one editorial pass that does not get easier with experience, because the enemy is your own familiarity with the text. A character is 30 in book two and 34 in book five. A song "written at nineteen" turns out, by the wedding math three chapters later, to be about a child. A thermos is set on the railing, then unscrewed at the wheel with both hands full. These ship, and land as the review every author dreads.
throughline reads the manuscript the way a tireless continuity editor would, and reports only what is checkable and wrong.
- Free and local. The core needs no model, no account, no network. Your manuscript never leaves your machine.
- Instant. A full novel audits in a fraction of a second.
- Precise by design. Every check is narrow and conservative, and gated so it stays silent on clean prose. A short list of real problems, not a wall of nitpicks.
git clone https://github.com/Rodder5/throughline
cd throughline
pip install -e .
No dependencies beyond the Python standard library (3.10+).
throughline my_manuscript.txt
========================================================================
TIER 1 . DETERMINISTIC (2 findings) free . local . instant
========================================================================
1. [BLOCKER] age/timeline - Gray: derived age 30 vs 37 (off by 7)
made at 19 + held 11 years | was 22 in 2009, present 2024
. wrote the first one at nineteen
. oh-nine? I was twenty-two
2. [MAJOR] duration - an activity tied to this place spans ~96 months, but the
character has been here only ~6 months.
. Six months ago the barn came up
. Eight years and that pump's been the floor under
Exit code is 0 when clean, 1 when findings, so it drops into a writing pipeline or a pre-publish check.
Each check catches the clear version of its error and stays quiet otherwise. It trades some recall for precision on purpose: a checker that cries wolf is worse than useless.
| check | catches |
|---|---|
| age / timeline | a character's age contradicting itself across chapters (dialogue-aware) |
| day-clock | two weekdays in one continuous moment; a date given two weekdays |
| duration | an activity spanning longer than the character has been at the place |
| event-date | a life event pinned to two different dates or seasons |
| physical | both hands occupied, then a one-handed action with nothing freeing a hand |
| object-location | an object set down, then used with no pick-up in between |
| knowledge | a name declared unknown, then used with no introduction |
| geography | a stated distance between two real cities that is wildly wrong |
Some continuity errors are genuinely semantic and cannot be pattern-matched: object tracking through pronouns ("it", "the mug"), a character knowing the contents of a message they never read, an action that contradicts who a character has been shown to be. These are the model tier, and only these. It targets the residual the deterministic tier cannot reach, it is fed Tier 1's findings so it never re-reports the same problem, and every finding it keeps must survive a grounding check (the quoted text must be literally present) and an adversarial second pass. It is optional and off by default:
throughline my_manuscript.txt --semantic anthropic # your ANTHROPIC_API_KEY
throughline my_manuscript.txt --semantic ollama # a local model, best effort
Precision here needs a capable model. In testing, local models missed the hard cross-scene cases, so --semantic anthropic is the real path and --semantic ollama is a local best-effort. Either way the model tier is a diagnostic aid, not a guarantee. The deterministic tier is the guarantee.
A continuity report is only worth reading if its findings are real. throughline's discipline is that every check must stay silent on clean prose across many manuscripts before it ships. The test suite runs each check against clean public-domain prose and a set of known-bug cases; a real deployment keeps a growing corpus of clean manuscripts as a precision gate. If a check ever false-positives on clean text, that is a bug in the check, and it is fixed before anything else.
throughline catches the deterministic, code-checkable family of continuity errors: numbers, dates, durations, physical simultaneity, object placement, names, real distances. It does not judge prose quality, it does not rewrite, and it does not catch every kind of continuity error. The fuller semantic cases belong to the optional model tier. What it does, it does exactly, instantly, and for free.
MIT. See LICENSE.