What Hexes writes
One export produces a region tree like this. Every note carries a stable oa_id, so links keep working after renames.
your-campaign/ ├── regions/greenfield/ │ ├── region.md overview, factions sketch, road & travel table │ ├── hexes/ one note per content hex (terrain, features, │ │ ├── hex-0302.md obstacles, residents, field description) │ │ └── ... │ ├── settlements/ a stub per town — Towns on Automatic's future inbox │ ├── sites/ a stub per dungeon site │ └── state/ the machine copy Hexes reopens (hoa-*.json) ├── factions/ faction notes + relationship map ├── commissions/ │ └── the-sunken-grotto.request.json work order for Dungeons on Automatic └── _index/ compiled ids and relationships (validator output)
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, on any re-export. - Locks freeze what you've settled. Mark a note's content, narrative or geometry with
oa_locksand regeneration leaves it alone. - No app required. It's markdown. Obsidian gets wikilinks and the relationship map for free; git, grep and a text editor all work.
Sites become dungeons by paperwork
Hexes places a dungeon site and knows only what the overworld knows: where it sits, what terrain surrounds it, roughly what lives nearby. That's exactly what goes in the work order.
- Every site export includes
commissions/<site>.request.json: a SiteCommission envelope with a coordinate-derived seed, terrain and context. Existing files are never overwritten. - Dungeons on Automatic reads the envelope and builds the keyed dungeon — maps, room key, encounters, treasure, VTT exports.
- The linkage is recorded in the vault. The dungeon never learns about the world, and the world never reaches into the dungeon; the folder holds the thread between them.
The format is deliberately boring: versioned spec, JSON schema, reference validator and an example vault live in the public CampaignsOnAutomatic repository. If you want to write tools against it, that's the contract.