Git-native narrative design
for story-driven games
Schema-first. Engine-agnostic. Your story is plain JSON in your repo — no database, no export step, no proprietary format between your writers and your game.
Your story is files
Every character, dialogue, and quest is a human-readable JSON file the visual editor reads and writes directly. Git is the single source of truth — which means narrative gets branches, diffs, reviews, and CI, just like code.
{
"id": "npc_wren",
"name": "Aldous Wren",
"archetype": "apothecary",
"dialogues": [
{ "dialogue": "dlg_wren_cornered",
"showIf": { "type": "flag", "flag": "knows_wren_dismissed" } },
{ "dialogue": "dlg_wren_first" }
]
}$ git diff data/dialogues/dlg_wren_first.json "text": - "I sell tinctures. Nothing stronger." + "I sell tinctures, magistrate. Nothing stronger — + nothing that would do *that* to a man." One line of dialogue changed. One line in the diff. Review it in a pull request like everything else.
Built around the way stories actually branch
A visual editor for the whole narrative layer — not just dialogue trees. This is it, editing the demo mystery:
The dialogue canvas — a suspect's confrontation scene, with skill-check routes (green success / red failure) and live pacing analysis.
Dialogue ladders: state-aware conversations, first-match-wins
Each character carries an ordered ladder of dialogues, each rung optionally gated on game state. Talk to a suspect before you find the evidence and you get one scene; talk to them after, and the ladder re-points — no scripting required.
A live preview shows which rung currently wins, and the validator catches the classic mistakes: dead rungs, stuck rungs, missing fallthroughs.
Wren's ladder: the confrontation on top, gated on evidence; the first meeting below as the fallthrough.
A live session: the d20 roll, the effects it fired, where the story can go next, and every flag it touched.
Playtest in place — then hand anyone a playable file
Walk any scene with a live simulated game state: seeded, deterministic dice, a rewindable transcript, forced check outcomes, and edit-while-playing. When a scene is ready for feedback, export a share build — one self-contained HTML file that plays in any browser, no install.
Validation everywhere — on save, in CI, in your pipeline
Eighteen families of checks run on every save and stream to every open editor
window: dangling references, unreachable nodes, flags nothing reads, quests that
can't complete, ladder mistakes. The same validator runs headless as
parlance ci-check, so a broken story fails the build before it ships.
$ parlance ci-check . --strict ✗ [REF] dlg_accuse: choice targets missing node "node_confession" ✗ [LADDER] npc_bragg: rung 1 is unconditional — rungs below it can never win ⚠ [FLAG] flag "heard_bell" is set but never read exit 1 — the build fails, the story stays whole
A contract, not an exporter
Your engine reads the exact files the editor writes. The runtime semantics are a published contract with conformance vectors — ports prove themselves against the vectors, not against vibes.
The Godot runtime executes Parlance JSON natively in GDScript and is verified against the published conformance suite. The same vectors are how any engine — Unity, custom, whatever — gets a provably-correct port.
The contract, schemas, and vectors are published as parlance-spec under MIT — your data's meaning never depends on our goodwill.
There's also an MCP server, so LLM agents can read and write project data through the same validated path the editor uses.
PASS mulberry32 6 vectors PASS evaluate 53 vectors PASS applyEffect 27 vectors PASS resolveCheck 18 vectors PASS stepDialogue 8 vectors PASS chooseChoice 9 vectors PASS advanceNode 9 vectors PASS resolveCharacterDialogue 6 vectors SKIP resolveQuests / progression — not yet ported 136 passed, 0 failed, 19 skipped
Try it on a real mystery
The demo project is a complete, tiny whodunit: one night, one body, three suspects, three endings. Skill checks with real failure branches, evidence-gated dialogue ladders, counters, quests — every feature demonstrated in a story you can actually play. Released CC0.