A whole campaign — its maps, its monsters, its months of session history — fits in a folder of plain Markdown files. No database, no proprietary format, no subscription. The vault is the single source of truth, and everything else is a render, an export, or a link out to a platform.
That constraint is the whole trick. Because every note is just text, the campaign gets a wikilink graph, structured database views, and an AI rendering pipeline almost for free — and it outlasts whatever note-taking app is fashionable next year.
The vault is the only source of truth
Everything lives in one Obsidian vault: campaign notes, NPC cards, monster stat blocks, loot, location descriptions, and a running session log. Every proper noun in the campaign is a wikilink — a bracketed reference that jumps straight to the note it names. Write “the party enters the mine” in a session log and it links to the location note, where the read-aloud text, the encounter, and the DM-only secrets are already waiting.
That graph is the feature that pays off most at the table. A player asks about someone they met three sessions ago, you type the name, and the note is right there. No searching, no flipping through a notebook.
Organized by place, not by date
The vault is organized spatially, not chronologically. Each campaign is a self-contained folder, and inside it the notes follow a taxonomy borrowed from RPG video games — you travel to a place, you track an objective, you play through a scripted beat:
- The campaign file is the novel: the planned story, its acts, and the plot threads still in play. It says what could happen.
- Location notes are the zones. Each one describes a persistent place — the geography, the exits, who is present, the map — plus an index of what happens there.
- Quest notes are the quest log. Each is an objective with a giver, a checklist of stages, a completion condition, and a reward. Some are critical-path, some are optional.
- Scene notes are the cutscenes: the granular run-script for one beat. A trigger, the read-aloud text, a couple of skill checks, the branches, the tactical map, and a checkbox for each beat as it plays out.
- The DM log is a scratchpad — one line per session recording where things left off.
- Reference cards hold the NPCs, monsters, and loot for quick lookup during play.
The key move is that run-scripts do not live inside the location note. A location is the place; the beats that unfold in it are separate scenes. Pulling the scripts out keeps each note short enough to parse at a glance mid-session, when you have no time to scroll.
Those note types are wired together through wikilinks and metadata back-links into a spine: a quest stage names the locations and scenes it touches, a scene names the location it happens in, and a location indexes the scenes and quests that reach it. Any note is discoverable from its neighbors, so nothing goes missing under pressure.
Database views do the bookkeeping
Obsidian Bases turn note metadata into database views — tables and cards built by querying the frontmatter, the small block of key-value fields at the top of each note. A party base shows armor class, hit points, initiative, and passive perception in one glanceable table during combat. An XP tracker pulls from every character note and computes what each one needs for the next level. The numbers live in each character’s frontmatter; the base only queries and displays them, so there is nothing to keep in sync by hand.
The art is AI-made; the direction is yours
The battlemaps, monster tokens, NPC portraits, and atmospheric scenes are AI-made; the creative direction stays yours. A few small Python scripts call Google’s Gemini API, and each render is driven by a prompt written as a Markdown file kept in the vault alongside the content it illustrates — the prompt is where the direction lives, versioned like everything else. What used to take hours per map now takes minutes, so far more of the campaign gets art at all.
Maps get one extra trick. You describe the layout in Markdown and include a DOT graph — a plain-text description of a graph, where nodes are areas and edges are the connections between them, with edge styles marking a path as normal, significant, or hidden. The model renders the art from the description; a second pass strips out any text and labels; then a precise grid, a scale bar, and column labels are overlaid to produce two copies. A DM version carries area labels and encounter markers. A clean player version is built for fog-of-war — a single image the virtual tabletop can mask and reveal as the party explores.
The graph is what makes it work. Without it, the model produces beautiful art with nonsensical spatial relationships: rooms that should connect do not, or corridors loop in ways that break the game. The graph pins down the topology and lets the model handle only the aesthetics.
Tokens, portraits, and scenes run a simpler path. A shared style instruction keeps a consistent dark-fantasy look across the whole campaign — monsters as full illustrations plus small circular tokens for the tabletop, NPCs as waist-up portraits plus tokens, and mood images for locations that want atmosphere rather than a battle grid.
The result is not hand-drawn quality. It is consistent across the entire campaign and good enough for play, which is the trade that matters.
D&D Beyond holds the mechanics
Obsidian handles the flavor, the tactics, and the DM notes; the mechanical stat blocks live in D&D Beyond. Each monster and loot note carries a D&D Beyond URL in its frontmatter, so you jump from the narrative description straight to the rollable stat block. A browser-automation tool pushes vault homebrew up to the platform, rollable dice tags included — so “2d6 fire damage” becomes clickable dice on the character sheet. No copy-pasting stat blocks between two systems that both want to be right.
A prep pass, start to finish
A prep pass follows the notes rather than fighting them:
- Read the campaign file for active threads and guess what the party does next.
- Open the location and scene notes in play; write or revise the read-aloud text, place encounters, and set skill-check DCs.
- Generate any new combat encounters, balanced to the current party.
- Render the maps, tokens, portraits, and scene art the new content needs.
- Create or update the monster and NPC cards, then push their homebrew to D&D Beyond.
- Run a link-and-structure audit to catch broken wikilinks and missing notes before they surface at the table.
- Skim the party base for the numbers you will want on hand during play.
During the session, you keep the scene note open and work down it, ticking checkboxes as each beat is revealed. Afterward, you add one line to the DM log and fold any improvised content back into the canonical notes, so the vault stays true the next time the party comes through.
It’s just files
The payoff is that none of it is locked up. Markdown, images, and a few scripts — it syncs across devices as ordinary files and it will outlast whatever note-taking app is trendy next year. The encounter generation, the homebrew publishing, and the vault cleanup are small AI-driven tools bolted onto that plain-text core, not the thing that holds it together.
It’s files all the way down, and that is exactly why it works.