Paste a story.See what breaks.
Turn free-form prose into structured narrative events, interactive graphs, and explainable consistency diagnostics—in seconds.
No credit card required.

Built for stories that have to make sense
Whether you’re drafting fiction, reviewing a game quest, or sanity-checking a generated plot, the checker surfaces structural breaks you’d otherwise catch only on the tenth re-read.
Fiction & screenplay drafts
Catch timeline slips, impossible travel, and “character in two places” conflicts before beta readers do.
Game & interactive narrative design
Validate quest chains, item dependencies, and disconnected story branches when events are extracted as a graph.
LLM-assisted writing QA
After an LLM expands an outline, run the same story through extraction + deterministic rules to flag hallucinated structure—not just typos.
Plot debugging & revision
Switch between Timeline and Character graph modes to see sequencing problems vs. relationship and action patterns.
Optional pronoun resolution can clarify “he/she/they” before extraction (deterministic, never guessed when ambiguous).
From prose to highlighted graph
Extract events
Paste your story in /app. The server proxies to the LLM layer, which prompts Gemini, parses JSON, validates strict schemas, verifies sourceText evidence, and assigns server-side eventIds.
Build the graph
The client transforms the same events[] into either a Timeline or Character relations graph—deterministic, no second LLM call.
Run diagnostics
A rule engine scans events for timeline, spatial, causality, redundancy, missing-link, and dependency issues; findings highlight nodes/edges and populate a diagnostics panel.
Fail-open UX — the graph still renders even if diagnostics are empty; issues are additive signal, not a hard block.
How the graph is generated
Graphs are computed locally from extracted events. Switching Timeline ↔ Character does not re-call the LLM.
Extraction (backend)
- Story text →
POST /v1/events/extractvia server route; browser never holds API keys. - LLM returns candidate events: action (typed enum), actors, optional targets, location, timeHint, sourceText, confidence.
- Strict Zod validation + retries; evidence checked against original story text.
- Response:
events[]+ model metadata + requestId.
Transform (frontend)
Two modes from the same payload:
Timeline mode
Orders events by parseable timeHint first (ISO dates, ordinals). Unrecognized hints fall back to extraction order—never guessed. Dagre layout: left-to-right.
Character mode
Entity nodes from normalized character names. Edge styles: co-occurrence (dedup + count) or action-labeled (directed actor → target). Density safeguards warn/block very dense graphs. Dagre layout: top-to-bottom.
Deterministic checks, explainable findings
Diagnostics are not another LLM opinion. After extraction, the diagnostics engine runs deterministic rules on events[], assigns error or warning severity, dedupes by stable IDs, and projects highlights onto the graph.
| Category | What it catches | Example subtypes |
|---|---|---|
| Timeline | Time ordering & temporal graph fidelity | event_order_violation, simultaneity_conflict, missing_temporal_edge |
| Spatial | Location continuity & travel plausibility | location_transition_missing, travel_time_violation |
| Causality | Cause / effect structure | missing_cause, broken_chain, circular_causality |
| Missing links | Gaps & jarring jumps | missing_interaction, abrupt_transition |
| Redundancy | Repetition & loops | duplicate_event, narrative_loop |
| Dependency | Prerequisites vs. usage | dependency_reversed |
In the app
- Diagnostics panel: filter by severity or category, jump to implicated events.
- Graph highlights: affected nodes and edges are visually marked.
- Explainable: each finding includes a human-readable message, optional confidence, and evidence (event/entity refs).
Checks are structural and graph-derivable in Phase 1—they complement human judgment; they don’t replace literary critique.
Two lenses, one story
Timeline
“What happened, in what order?” — Events laid out left-to-right by parsed time hints, with sequence edges and story boundaries.
Character
“Who interacts with whom, and how often?” — Entity relationship graph showing co-occurrence counts or directed action labels.
Toggle modes instantly—same extraction, different deterministic transform.
Architecture & trust
Contract-first
Shared schemas between web-app and LLM layer.
Secrets stay server-side
Browser never calls the LLM provider directly.
Stable & repeatable
Deterministic graph IDs, transforms, and diagnostic IDs for debugging.
Ready to stress-test your narrative?
Paste a story. Get a graph and a prioritized issue list.