On Automatic
Local-first campaign management for DFRPG & GURPS

Open the vault. Run the table.

Your campaign lives in a folder of markdown. This is the lens that reads all of it — the atlas, the cast, the factions and their secrets, the work orders, the session log — and deals tonight's screen from what is actually written down.

In development (0.1.x) · desktop builds for Windows, macOS & Linux land on this site · no account, no cloud — the vault never leaves your machine

The Campaigns on Automatic run view for a region: previously-on panel, travel rules table, and per-terrain encounter tables with linked monsters, dealt from the vault.
Tonight's screen. Dealt from the vault, live.
Read-firstwrites only the derived layers
Whole-vaultatlas, cast, quests, sessions
Local-firstno account, no cloud required
Player-safeone toggle applies the leak rules
How it works

The generators write. This is where you read.

Dungeons keys the sites, Hexes lays out the regions, and everything lands in one folder. Campaigns is the GM's screen over that folder — live, cross-referenced, and honest about what it doesn't know.

01 / OPEN

Point it at the folder

Pick a Campaign Vault on disk. The lens watches it and reloads live, so it keeps up while apps export and you edit in Obsidian next door.

02 / BROWSE

Read the whole campaign

Dashboard, region atlas, entity tables, and every note with its provenance, references, generated fences and backlinks laid bare.

03 / RUN

Deal tonight's screen

Previously-on, the cast as chips, encounter and weather tables, monster statblocks, the quest board, and a campaign clock you advance with one click.

04 / SHARE

Reveal and dispatch

Reveal chips control what the table knows; one button derives a player-safe vault. The commission board hands stub sites to Dungeons as work orders.

Read-first, by construction

A lens that cannot break the campaign.

The desktop shell shipped without a general write channel — there is no code path that could overwrite your prose. What writing exists is confined to two sanctioned lanes with the file's own state as a guard, so a surprise edit from another app or your editor means no write, never a clobber.

Write policyEnforced in the main process
01 / Reads

Everything, tolerantly. Incomplete vaults are fine; dangling references, duplicate ids and stale indexes are surfaced in their own table instead of thrown.

02 / May write

Only what the spec marks derived or sanctioned: the player-safe export, reveal states, the campaign clock, faction goal checkboxes, tonight's session-note skeleton.

03 / Compare-and-swap

Every edit is frontmatter surgery, applied only if the file still reads exactly as it did. Ambiguity fails closed.

04 / Never touches

Your prose, other apps' managed regions, foreign files in the player tree, or anything outside the folder you picked.

vault opened → read model → sanctioned lane → compare-and-swap writeResult: the campaign stays yours
What the lens shows

Everything markdown can't render on its own.

Obsidian stays your editor. This app earns its place with the pictures a text file can't draw: the map painted from frontmatter, the graph with its secrets dashed, the boards and dashboards across the whole cast.

The run view

Tonight's screen, dealt from the vault

Previously-on from the session log, the cast as chips, the region's travel rules, encounter tables with monster statblocks at hand, weather by climate band, and the in-world date one click from advancing.

previously-oncastencountersweatherstatblocksclock
The atlas

Regions drawn from frontmatter

Every region renders as its hex map — same grid math and terrain palette as Hexes — with settlement and site glyphs, a pennant on the party's hex, and click-through to the notes.

Notes with receipts

Every claim carries its source

Provenance headers, reference chips with dangling ones flagged, generated prose framed with its generator's name, your own words outside the fences, and backlinks underneath.

Relationships & quests

Who owes whom, and what's open

The faction and NPC graph draws declared edges with GM secrets dashed and directed kinds arrowed; the quest board tracks objectives, givers and dangling threads.

The boards

Prep debt, made visible

The commission board lists every work order and every stub still waiting for one. Health counts unused cast, orphans and stale indexes; Problems names what's inconsistent. Counts, not nags. See the views with a real vault loaded.

commissionshealthproblemssearch
The other side of the screen

One toggle shows what the players know.

Reveal chips sit on every note, section and secret edge. The player-view toggle re-renders the whole app through the spec's leak rules — unrevealed places vanish from search as if nothing were there — and one button derives a player/ vault you can hand to the table.

No lock-in

Yours, structurally.

The vault format is public and the guarantees are architectural, so the campaign outlives any app in the family — this one included.

One writer

Each file has one owner. Notes minted by an app stay that app's; cross-references live in frontmatter, never in app state.

Live reload

Built for the second monitor. The lens watches the folder and repaints as apps export and you edit — Obsidian on one screen, Campaigns on the other.

Ids first

Renames don't break the world. Navigation resolves stable ids before paths, exactly as the spec says to.

Plain markdown

Useful with zero apps installed. Git, grep, a text editor and Obsidian all work on the same folder, forever.

The family

Three writers. One reader.

Dungeonswrites the keyed sites
Hexeswrites the regions
Townswrites the settlements · next
Early access

New lens. Real vaults. Builds on the way.

Campaigns on Automatic is built in the same shop and release pipeline as its siblings, and it already reads every vault they write. The first public desktop builds land on the releases page; the vault format it reads is publicly specified today.