What the plugin does
The one-screen mental model — your project becomes three files, and C# reads them. No parsing, no node-type table.
All documentation — Start here
Start here
Concepts
Authoring for a game
Playing a story
The generated code
The plugin and sync
A TaleShard project is a graph of boards and nodes whose types the author invents. There is no
fixed vocabulary of node kinds, no built-in “dialogue node” with a speaker field and a text
field. A project can have a type called Interrogation with a field called pressure, and it will
work exactly as well as one that looks like a visual novel.
That single fact decides the whole architecture, because it makes the obvious design impossible.
Why there is no step.Text
The obvious design is a C# class per node type, and a game that writes if (node is DialogueNode d) Say(d.Speaker, d.Text). That cannot be built here. A node’s fields are addressed by ids minted when
the author created the type, and a field inside a repeater block is keyed by an instance id that
exists only in that one node’s data — so a function from type to field keys is not a function
anyone can write. It is not that it would be tedious; it does not exist.
So the resolution happens once, before your game sees anything. The sync server runs the same TypeScript the browser player runs, and writes down the answer: each node with its fields already read out of whichever store held them, its references already looked up, its rich text already rendered, and its exits already classified.
Your game receives a step and asks it questions. It never re-derives what a node meant.
Three files
| File | Written by | Read by |
|---|---|---|
runtime.json | the sync server | the runtime, at play time |
codegen.json | the sync server | the code generator, at sync time |
generated .cs | the code generator | your compiler |
The generated C# is the typed surface — your entities, your enums, your variables, your commands —
so GameData.Database and GameVariables.Trust exist and are checked by the compiler. The payload
is the story itself, and it is data rather than code because it changes every time a writer saves.
The three files covers who writes each and what changes when.
What you still write
The plugin does not draw anything. It hands you a step and a set of resolved fields, and your game
decides what a field means on screen — which is the only way it could work, given the author owns
the vocabulary. What you write is the presenter: read the fields you care about, draw them, and call
Advance or SelectChoice when the player acts.
Play your first story is that loop, in about thirty lines.