The world is not a book; it is a stack of files with opinions. Seven kinds of things live in it — places, magics, spells, people, blood, the trades that shape them, and the old races the blood descends from — and each kind is a file type with a job. This chapter is how they are put together, and how to add new kinds without breaking the ledger.
The seven kinds of things
| Type | Files | Holds | Shape |
|---|
| Location | /Locations/<Name>.location.json | places and their maps | structured JSON + map |
| Magic System | /Magic Systems/<Name>.magic-system.md | the lore and rules of a magic | prose markdown |
| Spell | /Spells/<Name>.spell.json | one spell, priced and standing | structured JSON |
| Character | /Characters/<Name>.character.json | one person — stats, skills, traits, background, blood, birth | structured JSON |
| Bloodline | /Bloodlines/<Name>.bloodline.json | heredity — a born gift with an effect | structured JSON |
| Old Race | /Old Races/<Name>.old-race.json | the old blood — a race the bloodlines descend from | structured JSON |
| Background | /Backgrounds/<Name>.background.json | where a character's skills come from — two starting skills and a gift | structured JSON |
The split is deliberate: prose where the world explains itself (The Vael, The Speaker's Lexicon), structured data where the game needs numbers (spells, characters, bloodlines, backgrounds, locations), and the two books where the rules live — the Player's Handbook for how to play, the Builder's Manual for how to build.
Why the spell type is shaped this way
The spell file type was designed around the ledger — every field exists because the fiction demanded it:
- verb is a fixed list, not free text. The verb list is the hoard: a verb cannot be spoken until it is admitted. That is why the schema has an enum of twelve verbs — the validation error on an unadmitted verb is the hoard refusing the word. Adding a verb is a deliberate act (see Running the Vael), never a casual one.
- breathCost is a plain number, not a computed field. The price is the ledger's sum, but the GM is the referee: fluency, voice, and the warrant change what Breath costs at the table. Do not automate the price — the judgment is the game.
- object is free text. Coinage must be possible mid-session. Object classification (simple, living or mind, great scale) is a ruling, not a schema constraint — if it were an enum, the necromancers could never have coined korfe, and the embalmers could never have permitted it.
- register and standing are enums because every spell has exactly these two axes: how it is spoken (phrase or working) and what the law says (common, permitted, restricted, forbidden).
- modifiers is an array because affixes ride on the sentence. Keep each entry human-readable ("-un (greatly)") — the array is for the table, not for the machine.
- vaelPhrase and translation are the sentence and its meaning; description is the hook; notes carry the botch line and the story. A spell without a botch line is a spell that has never been spoken aloud.
The character type follows the same discipline — stats 1–6, computed Breath and health, skills as earned state, traits as freeform strings. The bloodline type is small on purpose: sign, origin, effect, drawback, rarity — one file per house of the blood, referenced by characters. The old race type is smaller still: the look, the origin, the homeland, the trait, and the houses that descend from it — because an old race is a story the bloodlines point up to, not a wall of rules. The background type is two skills, a gift, an optional trade — because a background is a starting point, not a wall of rules. The full intent is in Characters and Progression and the player chapters Blood and Birth, The Old Blood, and Backgrounds of Vaelaria.
What a good spell entry looks like
The conventions, in order:
- The name is the compressed Vael phrase — one word, Vael-sounding, no banned letters (b, p, g, j, q, x, ch, sh, zh).
- The price follows the ledger (the player chapter carries the table).
- The standing is honest: a war-word is restricted, a death-word is forbidden — never permitted for convenience.
- The notes carry a botch line ("botched, the beacon is the speaker").
- The notes carry lore: who coined it, who uses it, what the town thinks.
Connecting things
Kinds of things want to point at each other. When you add a field that references another file, declare it as a reference field (referencedFileTypeSlug) so the editor renders a picker and the link survives renames. One field, one target type, unless a mixed list is truly needed. Keep references shallow: a spell may name its keeper or its maker, but the keeper should not re-list every spell it holds — let the spell do the pointing. Characters already do this: their known spells reference the spell type, their bloodlines reference the bloodline type, and their background references the background type — so a spell's price, a bloodline's effect, or a background's skills change once, and every sheet sees it. An old race does the same: its bloodlines field references the bloodline type, so the houses that descend from it are real links, not text.
Adding a new kind of thing
Say you want artifacts: things that hold a spell inside them. Create a new file type (Artifact):
- Give it structured JSON, a designation ("item"), and a root folder /Artifacts/.
- Give it fields that each earn their place: name, description, spell (a reference field to the spell type), charges (a number — how many castings remain), and notes for the lore. Do not add fields you will not use; a schema is a promise you have to keep.
- Leave breathCost off the artifact — the artifact pays, not the speaker, or the spell inside does.
- If a value is derived mechanically (charges spent vs remaining), make it a computed field with an expression. If it needs judgment (is this artifact cursed?), keep it editable. The test: would two GMs agree on the number without talking? Then compute it. Otherwise, let it be written.
The pattern
The whole system is one loop: prose explains, schemas structure, enums admit, numbers price, notes tell stories. When you add a kind of thing, keep the loop intact — and when in doubt, ask what the fiction demands of the file, not what the file demands of the fiction.