← /journal

June 3, 2026 · 4 min

Building a grimoire instead of forking one

We had a Kanban fork in the drawer and open-source VTTs on the shelf — we still greenfielded DND Cards.

There was already a path. A frozen kan.bn fork sat in ~/kan — lists, cards, enough UI to tempt a “just extend this” afternoon. Foundry modules, Greasyfork exporters, Nevelish clipboard flows — all solving pieces of the same table problem.

We didn’t take the fork.

What forking would have bought

Faster pixels. Familiar drag-and-drop. Someone else’s bug backlog instead of ours. For a demo, that’s seductive.

For the product we actually wanted — wax-seal cards, DM-only columns, lore graphs, PDF shred, combat that reads the stat block on the back of the card — it was the wrong inheritance. Forks come with opinions. Roll20 thinks in tabs. Kanban tools think in tasks. We needed everything to think in cards.

Greenfield as constraint

Next.js 16, Supabase, one deploy. No second app for imports. No second login for chat. When we added dnd.chat, it shared auth.users and the deck — not because integration is trendy, because splitting the table from the board was always going to feel broken if they weren’t the same database.

The VTT layer wasn’t “Foundry in an iframe.” It was initiative and HP riding the same rows the Kanban card already pointed at. We deferred fog of war on purpose. We’re not racing feature matrices — we’re making the board feel like the table.

What we still borrow

Ideas, not repos. Massive Decks for party-game rules elsewhere. Beyond importers we link to instead of vendoring GPLv3 userscripts into the bundle. The Chrome extension scaffold hands off JSON — we didn’t fork someone else’s OAuth story into core.

I’m not allergic to open source. I’m allergic to inheriting a data model that fights card-native combat at month three.

The frozen fork stays frozen

~/kan is reference and archaeology. DND Cards is the greenfield rebuild in dndcards. When Grimoire chrome changes, we re-render hero WebPs — annoying, but ours. Turbopack stays off production builds because boring webpack deploys beat clever ENOENTs on Netlify.

The loop we care about now: shred or import, arrange the board, drop tokens, roll in-thread in the tavern without a second account. That sequence is easier to reason about when we weren’t arguing with a stranger’s schema every Tuesday.


I keep re-learning the same lesson — the fork saves a weekend and costs a quarter.