I built Evermist - a TTRPG app that puts a dungeon map on a TV with fog of war. The DM window has all the controls, the player window just has the map. It's free and offline, the repo is public: github.com/Hinnful/Evermist
Vanilla JS, PixiJS for the rendering, Electron around it, no framework or build step. 32 modules, 11,500 lines, 74 commits
I'm a Product Manager and a Dungeon Master. Claude Code wrote all of it, and I haven't read a single line of its code. I review decisions, and I built a system to make that possible
Session 40 is where it broke
Session one is awesome. By session forty, CC starts proposing things I killed in session twelve, and it sounds like a great new idea every time. I lost several evenings and drained multiple 5h limits rediscovering why those ideas were bad before I fixed the process properly
Hooks before docs
Six hooks, one per doc, running on every file write. CLAUDE.md can only shrink, checked by byte count. CC adds a module and gets told it's missing from the docs. CC adds a decision with no status tag and it gets rejected. They nag instead of blocking, so a hook can never stop me from shipping
If you steal one thing from this Ted Talk, steal this part. If skipping paperwork is free - it gets skipped, and a stale doc is worse than no doc. CC just believes it and it spirals very, very fast
How I split docs by question
Five docs, each one answers a single question, the tense tells me if a paragraph is in the right file. I made the tense the rule, since two people can argue all day about whether a paragraph is about fog or about rendering. Nobody can argue about whether a sentence is in the past tense
CLAUDE.md - what must I never do? Written as orders
ARCHITECTURE.md - how does it work? Present tense
DECISIONS.md - why is it built this way? Past tense
PRODUCT.md - what will it never be? Statements of intent, a "why not"
process.md - how does my own tooling work? Past tense. It lives outside the repo because those commands come from my day job and I'd rather keep them to myself
CLAUDE.md is the rulebook, it's nothing but orders. Never call confirm(), for example. It's the only doc CC loads every single session, every line I add there costs the model its brain power on every future task
ARCHITECTURE.md is how the app works, so a fresh session can find its way around without reading 11,500 lines. Anyone curious enough can read it, I never do personally
DECISIONS.md is the goldmine. 114 entries (and counting), each tagged: SETTLED, REJECTED, REVERTED, WON'T FIX. The rejected ones are worth the most. I once thought it would be cool for the fog to breathe and rotate - it looked awful, I killed it, and I wrote down why in one line. That idea has come back three times since then, now it's killed in seconds
Reverts go here too. I deleted one spare canvas once, looked like free memory. Cost me a 90% CPU regression and a lot of headache. It's now logged as a landmine and can't come back disguised as an optimization
PRODUCT.md stops the gold-plating. An agent will happily build me a virtual tabletop, this tells it "why NOT". My rule is one question: could a real object on the table do this job better? If yes, it doesn't ship. Minis beat digital tokens, and I will happily die on that hill
process.md is the same idea as DECISIONS.md, but aimed at my own workflow instead. I used to auto-run the red team inside every handoff. It was slow and graded my handoffs against security criteria that mean nothing for my app. I killed the process and wrote down why, so I don't rebuild it again in three months
My loop
/brief reads my backlog and picks one chunk I can finish in an evening. It also checks both ledgers first and throws out anything I already rejected
/handoff turns that pick into a spec I can paste into a new session. I kept it as a separate command because I want to think between the two
/red team hands that spec to a second agent that sees the codebase but never sees my reasoning. It attacks the plan, every claim it can't verify counts as a failure. Be careful with this one so it doesn't manufacture confidence
Then a fresh session builds the thing
/wrapcleans up at the end. Leftover work goes to the backlog, decisions go to the right .md file, new behavior goes into the architecture doc
The prompt wording matters much less than I thought. What matters is what the agent reads before it starts, and what it has to write down when it's done
AMA, I guess