The big picture
Everything to the left of GitHub happens once, when a case is made. Everything to the right happens in your browser while you play.
Step by step
A case is written Writing
Each case lives in its own file: the story, three to five suspects, the evidence, a puzzle for every stage, and the answers. I direct and Claude writes, following a case guide I built up: play fair, give one clean chain of reasoning, and never make the answer a guess.
The art is generated Art
A script sends a list of prompts to a free AI image model (FLUX) for suspect portraits and scene pictures. Floor plans start as a line drawing of the case, which another AI model paints. I then fix any doorways or rooms it invented.
The stages are sealed Laptop
A build script leaves stage 1 readable and locks stage 2, stage 3 and the solution with AES-256 encryption. Each stage's key is made from the answer to the stage before it, mixed with the case name.
A checker plays the case Laptop
Another script makes sure every right answer opens its lock, wrong answers don't, every picture exists, and no spoilers leak into the readable parts.
Publish GitHub Pages
The case is added to the trail and pushed to GitHub, which hosts it as a free static website. There's no server logic at all.
Pick up the next case on the trail Browser
The front page is a winding path of cases. Each one opens once you've solved the one before it.
Investigate Browser
Read statements, study the floor plan, mark suspects, take notes, and solve a hands-on puzzle: a jigsaw, Morse code, spot the difference, a combination lock or a code hidden in sheet music. Progress saves in your browser, so you can come back later.
Your answer tries the lock Browser
Your answer (a time, two names, or a set of choices) is turned into a key, and the browser tries to decrypt the next stage with it. If it opens, you were right. If not, you get a strike.
Case closed Browser
The solution unlocks. You earn up to three stars (one per stage solved with no hints or wrong guesses) and can share a Wordle-style result.
The pieces
AES-256 encryption
The standard strong encryption, done in your browser with its built-in Web Crypto tools.
Stops anyone skipping ahead by reading the page's code. There's nothing to peek at.
Answer-as-key
The key is a fingerprint (SHA-256 hash) of the case name plus your answer.
Checks answers without a server and without storing the answer anywhere.
Claude
Writes the cases and the code, working to a written case guide.
A rulebook keeps every case fair and consistent, whoever writes it.
FLUX image models
Portraits and scenes from a free image service. Floor plans painted on Cloudflare Workers AI.
Illustrated cases without an illustrator.
Build and check scripts
Node scripts that seal each case and then test it end to end.
One wrong character in an answer would make a case unsolvable, so every case is tested before it ships.
GitHub Pages
Free hosting for static files.
Because of the encryption, the game needs no backend at all.
Trade-offs I chose
- No server means no accounts and no cost, but progress lives in one browser. Switch phones and you start that case again.
- Play solo or crowd round one screen with friends, rather than real-time online multiplayer. Everyone sees the same case, so it works for any group size and needs no accounts.
- The trail lock (which case you can open) is only a convenience. The real protection is the encryption on each stage.
The Daily Corpse