Inspiration
Every detective game we love — Ace Attorney, Return of the Obra Dinn, the Sherlock Holmes puzzle books from childhood — has the same fatal flaw: once you finish, it's over. You can't play a mystery you've already solved.
We wanted a detective game that could hand you a new murder every time you opened it — and prove the case was solvable before you ever saw it. No dead ends, no "gotcha, the killer was someone with zero clues pointing at them." Just a fair fight between you and the lie.
What it does
Cold Case is a noir murder mystery that generates itself. Every case is
built from a shareable seed, so the same seed always produces the same
crime — you can send ?seed=noir285 to a friend and they'll play the
exact same case.
You search rooms for evidence, interrogate suspects, catch one of them in a lie by presenting a clue that breaks their alibi, pin cards to an evidence board with red string, watch the timeline auto-flag contradictions, and finally accuse — with proof. Three wrong guesses and the culprit walks.
How we built it
Cold Case was built end to end using Codex with GPT-5.6. We wrote one design spec — the mechanics, the noir tone, the case-generation rules — and Codex turned it into a working prototype in a single session. No scaffolding, no starter template, no dependencies.
GPT-5.6 did the heavy lifting:
- The generator that builds the crime backwards (killer first, then alibis, then contradictions)
- The
verifySolvable()proof that guarantees every case has a unique logical solution - The dialogue system with six suspect personalities (nervous, sarcastic, formal, chatty, blunt, melodramatic)
- The evidence board with draggable cards, red string, and the auto-updating timeline
Codex ran the whole spec-to-code-to-fix loop — every bug, every UI tweak, every polish pass went back through the same session.
The result is a single HTML file, ~40KB, that runs offline in any browser. No backend, no APIs, no build step.
Challenges we ran into
Guaranteeing solvability. The hardest problem in a generated mystery isn't making it hard — it's making sure the answer is always provable from the clues the player can actually find. We solved this by generating the crime backwards: pick the killer first, give every innocent an independently verified alibi, give the killer a false one, then plant exactly two contradicting clues. A verification step then confirms the killer is the unique suspect whose alibi breaks. If it fails, the case regenerates.
Red herrings without frustration. Bad red herrings feel like the game cheating. Ours are always tied to a specific innocent motive (an affair, a theft, a secret meeting) that gets explained away when you present them to the suspect — so they add texture without wasting the player's time.
Deterministic randomness. For seeds to be shareable, every random
choice — cast, rooms, weapon, timeline, dialogue lines — has to come from
the same seeded PRNG in the same order. One misplaced Math.random()
would break the whole promise. Codex was rigorous about routing everything
through a single mulberry32 stream.
Accomplishments that we're proud of
- Zero unsolvable cases. We stress-tested thousands of generated cases across every difficulty. Every one had a unique, provable killer.
- Genuinely shippable in one session. Not a prototype, not a demo — a complete game with a title screen, save system, evidence board, timeline reconstruction, and a full accuse-and-resolve loop.
- Fully offline, single file. No backend, no build step, no dependencies. It's ~40KB you can email to someone.
- The noir voice actually lands. Six suspect personalities, procedural dialogue lines that still feel written, and a briefing screen that reads like the opening page of a paperback.
What we learned
Codex + GPT-5.6 changed what "one weekend project" means. A generator this carefully constrained — with a formal solvability proof and thousands of tested cases — would normally be a multi-week project. Going from spec to shippable game in a single session let us spend our time on the parts players actually feel: the noir voice, the interrogation payoff, the red string on the evidence board.
The other lesson: the hard part of a procedural game isn't generating variety, it's generating fairness. Anyone can shuffle a name pool. Making sure the puzzle always has exactly one right answer — that's the craft.
What's next for Cold Case
- More settings and weapon pools (currently 8 settings, 24 weapons)
- Longer cases with multiple murder windows
- A "hardcore" mode with no evidence board or timeline
- Multiplayer: two detectives working the same seed, racing to solve it
Log in or sign up for Devpost to join the conversation.