Paste a story.See what breaks.

Turn free-form prose into structured narrative events, interactive graphs, and explainable consistency diagnostics—in seconds.

Try for Free

No credit card required.

Narrative consistency graph demo showing event nodes linked across a timeline with highlighted diagnostic issues

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/extract via 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.

ErrorHigh-confidence structural contradictions
WarningHeuristic or lower-confidence signals
CategoryWhat it catches
TimelineTime ordering & temporal graph fidelity
SpatialLocation continuity & travel plausibility
CausalityCause / effect structure
Missing linksGaps & jarring jumps
RedundancyRepetition & loops
DependencyPrerequisites vs. usage

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?

Try for Free

Paste a story. Get a graph and a prioritized issue list.