On Automatic
The Campaign Vault

The campaign is a folder. The apps just visit.

Under this app sits an open format: a plain folder of markdown notes with YAML frontmatter, publicly specified, readable in Obsidian with zero apps installed. Dungeons and Hexes on Automatic write into it; this lens reads all of it; the folder outlives every one of them.

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

The rules that keep it safe

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.