Projects

2025 to present, two people

D20 Companion

A Flutter desktop application for tabletop RPG game masters, built by two people through LLM-assisted development, almost entirely on a shared $200-a-month subscription. The repository is private. A demo is available on request.

I bring twenty-some years of running tabletop games to the design, and I own feature design, technical architecture, all data work, and the instructional scaffolding that tells agents how to work in the repo. My partner handles UI refinement, removing slop, and generating art for every SRD entity.

Shipped. A compendium covering species, classes, backgrounds, feats, spells, items, monsters, and maps and handouts. Characters. A set of tools: session planner, NPC generator, encounter builder, loot generator, dice roller, DM screen, dungeon generator, escape-route generator, ambience audio, map manager.

In progress. A campaign manager with dashboard, world, characters, and plot views, including a locations hierarchy that carries player-safe versus DM-only visibility, travel routes, power blocs, and lore.

The end point. The app becomes a harness where every user-facing tool is also an agent tool, so an LLM storyteller can create campaigns and run games itself.

The data layer

I converted SRD 5.2.1, hundreds of pages published in English, Spanish, German, French, and Italian, into structured files and then a queryable database across all five languages. About 150 hours over five to six weeks, and four attempts.Attempts two and three failed because an earlier attempt's output was still sitting in the repository. The agents locked onto it as the reference for dozens of hours, despite instructions that contradicted its scope. Stale artifacts are a stronger signal to an agent than the prompt. The fourth attempt worked by converting in small pieces to JSON with automated review after each piece.

How the work above gets done

The agentic development pipeline

Humans decide what the product should be. Agents decompose, implement, test, document, review, and integrate it through an auditable, local-first pipeline. The rules:

  • A broad feature request becomes small, independently reviewable tasks. Each owns one coherent behaviour, contract, interaction, screen, or component.
  • Product intent and accepted design decisions are written down, so later agents do not reconstruct them from memory.
  • Work runs in dedicated local branches and worktrees. Temporary task branches are never pushed.
  • Agents make reasonable technical decisions without asking permission each time. Behaviour changes get meaningful tests, red-green-refactor where it fits.
  • Every submission launches exactly one fresh reviewer, and the reviewer is diagnostic only. It inspects the full change, call paths, tests, security, persistence, documentation, and acceptance criteria, then approves or rejects with every material blocker listed. It does not repair the work.Reviews are non-mutating on purpose. A single implementer keeps its context and iterates against feedback, instead of a fresh agent being spawned for every fix and losing the thread. Rejections go back to the implementer.
  • Approval happens in a clean review worktree. A wrapper merges, pushes, verifies remote ancestry, records proof, and closes the task.
  • For UI and UX there is an additional human gate. Approval is tied to an exact commit, a person tests that exact candidate, and any later change invalidates the approval and restarts review.
  • Local first. No cloud CI.

I can set up a version of this for a small team, including the review gates and the written product record. See how an engagement works.

First benchmark running, results after full review

d20 Benchmark Suite

D20 Companion is changing shape. What stays is the goal of a storytelling engine: an agent that can create campaigns and run games. Every design decision in that engine should be settled with data before it gets built, so each one gets a benchmark, and the benchmarks together make the d20 Benchmark Suite.

The first benchmark asks whether small open models know the rules of fifth edition, and how much it helps to hand them the relevant rulebook passage. It has 12 topics with 10 cases each, written from SRD 5.2.1. Every case carries weighted claims that a correct answer must make, and material errors are tracked separately from points, so an answer can score well and still be wrong in a way that matters. Each model runs with and without passages, across open models from about 4B to 30B parameters. Agents grade first, and every case they flag gets resolved by hand.

Constraint: a single RTX 3090 and zero paid API spend. The method is the one I would bring to a client's product: look at the app, find the decisions that matter, and measure them.