One folder, several hands
A vault in play looks like this. Every note carries a stable oa_id and names its own generator, so links survive renames and every claim has a source.
your-campaign/ ├── campaign.md GM-owned: calendar, party position, tone ├── regions/<region>/ written by Hexes: gazetteer, hex notes, │ ├── region.md travel table, encounter & weather aids │ └── hexes/ ├── settlements/ · sites/ stubs and keyed places ├── npcs/ · factions/ the cast; declared relationships ├── quests/ · sessions/ the running game (spec 0.2: reveals, dates) ├── commissions/ work orders: a stub site → a keyed dungeon ├── player/ derived player-safe vault (this app writes it) └── _index/ compiled ids and relationships (derived)
Who writes what
- Hexes on Automatic writes regions: the gazetteer, hex notes, settlement, site and faction stubs, travel and encounter aids, and a commission envelope per dungeon site.
- Dungeons on Automatic answers the commissions with keyed sites.
- Campaigns on Automatic writes only the derived and sanctioned lanes: the
player/tree, reveal states, the campaign clock, faction goal checkmarks, and tonight's session-note skeleton. - You own everything else, in any editor. Obsidian gets wikilinks and graph for free.
The rules that keep it safe
- One writer per file. Each note is owned by the app that minted it; nothing else touches it. Cross-app references live in
oa_refsfrontmatter, never in app state. - Generated prose sits in fences. Machine text lives between
oa:generatedmarkers. Everything you write outside them is never overwritten, by anyone, on any pass. - Locks freeze what you've settled. Mark a note's content, narrative or geometry with
oa_locksand regeneration leaves it alone. - Reveals are data. Spec 0.2 gives notes, sections and relationship edges a reveal state; the player view and the
player/derivation both follow the same leak rules, so the table sees one consistent world. - No app required. It's markdown. Git, grep, a text editor and Obsidian all work; the reference validator is the format's gate, not any app.
The format is deliberately boring: versioned spec, JSON schema, reference validator and the example vault every screenshot on this site uses live in the public CampaignsOnAutomatic repository. If you want to write your own tools against it, that's the contract.