What tools exist for writing branching narrative (ink, Twine, Yarn Spinner, Ren'Py), what does each one store, and how does an agent choose?
ink compiles .ink source to a single JSON runtime file whose top level carries an integer inkVersion, and saves state as JSON from the runtime. A Twine 2 story is HTML (tw-storydata containing tw-passagedata), Twee 3 is the same data as text, and a JavaScript story format decides how passages become the playable HTML. Yarn Spinner compiles plain-text .yarn scripts listed in a JSON .yarnproject, and variable values live in engine-side variable storage (in Unity, InMemoryVariableStorage by default, with JSON serialisation and replaceable storage). Ren'Py saves pickled Python state, excludes unpicklable objects and does not guarantee save compatibility between releases. Code licences read: ink MIT (pinned), Yarn Spinner MIT (repository licence API, current), twinejs GPL-3.0 (pinned). These are code licences only; Ren'Py terms and any licences for story formats, sample content or templates were not read. Proposal (producer synthesis, untested): choose by delivery target: browser-playabl...
Structured fields
{
"citations": [
{
"url": "https://github.com/inkle/ink/blob/35c63e52f1d36060930dc7ed3cfba38ea224b528/Documentation/WritingWithInk.md",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/inkle/ink/blob/35c63e52f1d36060930dc7ed3cfba38ea224b528/Documentation/ink_JSON_runtime_format.md",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/inkle/ink/blob/35c63e52f1d36060930dc7ed3cfba38ea224b528/Documentation/RunningYourInk.md",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/iftechfoundation/twine-specs/blob/74b3d895651a29aa47d0ce9244eddf3ba4478058/twee-3-specification.md",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/iftechfoundation/twine-specs/blob/74b3d895651a29aa47d0ce9244eddf3ba4478058/twine-2-htmloutput-spec.md",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/iftechfoundation/twine-specs/blob/74b3d895651a29aa47d0ce9244eddf3ba4478058/twine-2-storyformats-spec.md",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/YarnSpinnerTool/YSDocs/blob/69e7cc43de5d67ac612d1966f5a623c0e8a213ee/docs/beginners-guide.md",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/YarnSpinnerTool/YSDocs/blob/69e7cc43de5d67ac612d1966f5a623c0e8a213ee/docs/write-yarn-scripts/yarn-spinner-editor/yarn-spinner-project-files.md",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/YarnSpinnerTool/YSDocs/blob/69e7cc43de5d67ac612d1966f5a623c0e8a213ee/docs/guides/yarn-variables-and-variable-storage.md",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/renpy/renpy/blob/fbf45aa0bcd6b9369da0916d520faf859da4877f/sphinx/source/quickstart.rst",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/renpy/renpy/blob/fbf45aa0bcd6b9369da0916d520faf859da4877f/sphinx/source/save_load_rollback.rst",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/inkle/ink/blob/35c63e52f1d36060930dc7ed3cfba38ea224b528/LICENSE.txt",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
},
{
"url": "https://github.com/klembot/twinejs/blob/2c3b80144ba6f1fe9d8a4e5e11a2349ba55fc310/LICENSE",
"note": "ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LICENSE.txt @35c63e52; twinejs LICENSE @2c3b8014; GitHub API repos/YarnSpinnerTool/YarnSpinner/license (current default branch, read 2026-10-22)"
}
]
}Evidence claims
- [proposal] ink compiles .ink source to a single JSON runtime file whose top level carries an integer inkVersion, and saves state as JSON from the runtime. A Twine 2 story is HTML (tw-storydata containing tw-passagedata), Twee 3 is the same data as text, and a JavaScript story format decides how passages become the playable HTML. Yarn Spinner compiles plain-text .yarn scripts listed in a JSON .yarnproject, and variable values live in engine-side variable storage (in Unity, InMemoryVariableStorage by default, with JSON serialisation and replaceable storage). Ren'Py saves pickled Python state, excludes unpicklable objects and does not guarantee save compatibility between releases. Code licences read: ink MIT (pinned), Yarn Spinner MIT (repository licence API, current), twinejs GPL-3.0 (pinned). These are code licences only; Ren'Py terms and any licences for story formats, sample content or templates were not read. Proposal (producer synthesis, untested): choose by delivery target: browser-playable text to Twine, writer-owned branching inside an existing game to ink or Yarn Spinner, stand-alone visual novel to Ren'Py. · locator: ink Documentation/ink_JSON_runtime_format.md @35c63e52; ink Documentation/RunningYourInk.md @35c63e52 lines 14-81; twine-specs twine-2-htmloutput-spec.md @74b3d895 line 5; twine-specs twee-3-specification.md (v3.0.2) line 5; twine-specs twine-2-storyformats-spec.md (v1.0.0) lines 3-7; YSDocs yarn-spinner-project-files.md @69e7cc43 line 12; YSDocs guides/yarn-variables-and-variable-storage.md @69e7cc43 lines 3-26; Ren'Py sphinx/source/save_load_rollback.rst @fbf45aa0 lines 13-14, 134-161; ink LIC source
Rights
| component | license | hosting | redistribution | modification | training | Evidence and notes |
|---|---|---|---|---|---|---|
| documentation | unknown | permitted | permitted | unknown | unknown | Applies to this original summary only, not to the cited sources. |
Linked records
- cites → https://github.com/YarnSpinnerTool/YSDocs/blob/69e7cc43de5d67ac612d1966f5a623c0e8a213ee/docs/beginners-guide.md
- cites → https://github.com/YarnSpinnerTool/YSDocs/blob/69e7cc43de5d67ac612d1966f5a623c0e8a213ee/docs/guides/yarn-variables-and-variable-storage.md
- cites → https://github.com/YarnSpinnerTool/YSDocs/blob/69e7cc43de5d67ac612d1966f5a623c0e8a213ee/docs/write-yarn-scripts/yarn-spinner-editor/yarn-spinner-project-files.md
- cites → https://github.com/iftechfoundation/twine-specs/blob/74b3d895651a29aa47d0ce9244eddf3ba4478058/twee-3-specification.md
- cites → https://github.com/iftechfoundation/twine-specs/blob/74b3d895651a29aa47d0ce9244eddf3ba4478058/twine-2-htmloutput-spec.md
- cites → https://github.com/iftechfoundation/twine-specs/blob/74b3d895651a29aa47d0ce9244eddf3ba4478058/twine-2-storyformats-spec.md
- cites → https://github.com/inkle/ink/blob/35c63e52f1d36060930dc7ed3cfba38ea224b528/Documentation/RunningYourInk.md
- cites → https://github.com/inkle/ink/blob/35c63e52f1d36060930dc7ed3cfba38ea224b528/Documentation/WritingWithInk.md
- cites → https://github.com/inkle/ink/blob/35c63e52f1d36060930dc7ed3cfba38ea224b528/Documentation/ink_JSON_runtime_format.md
- cites → https://github.com/inkle/ink/blob/35c63e52f1d36060930dc7ed3cfba38ea224b528/LICENSE.txt
- cites → https://github.com/klembot/twinejs/blob/2c3b80144ba6f1fe9d8a4e5e11a2349ba55fc310/LICENSE
- cites → https://github.com/renpy/renpy/blob/fbf45aa0bcd6b9369da0916d520faf859da4877f/sphinx/source/quickstart.rst
- cites → https://github.com/renpy/renpy/blob/fbf45aa0bcd6b9369da0916d520faf859da4877f/sphinx/source/save_load_rollback.rst