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.

Download Parlance Play the demo Read the docs macOS · Windows · Linux — free, including for commercial games · the format spec is MIT

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 Parlance editor: a dialogue node graph with skill-check badges, START and END markers, and a pacing panel showing words, nodes, choices, and dead ends

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.

How dialogue laddering works →

A character form in Parlance showing the Dialogue Ladder editor: rung 1 gated on a flag, rung 2 marked always (fallthrough)

Wren's ladder: the confrontation on top, gated on evidence; the first meeting below as the fallthrough.

Playtest mode in Parlance: the active node glows on the canvas while the play panel shows a passed Observation check, applied effects, a discovery pool, and a live state table

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.

Playtesting & determinism →

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.

The validation model →

$ 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.

The engine contract →

  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.

First dialogue in ten minutes