🕵️ Case Closed — A Noir Detective Mystery Built Into Reddit

💡 Inspiration

We've always loved detective stories — the thrill of spotting the detail everyone else missed, the moment the pieces click together. But most mystery games live in big downloads and long sessions. When we saw Reddit's hackathon challenge — build a game inside a post that inspires collective joy — we asked ourselves:

What if a Reddit post itself was a crime scene?

No install, no loading a separate site. You're scrolling your feed, you see a rain-soaked noir scene, a button glows: START INVESTIGATION. Thirty seconds later you're pinning evidence to a corkboard and accusing a suspect. That's the experience we set out to build.

🎮 What it does

Case Closed is a fully playable detective mystery that runs inside a Reddit interactive post:

  • Cinematic landing scene — animated rain, flickering neon, a typewriter title, and a pulsing Start Investigation button, all rendered in Phaser at 60fps.
  • Evidence hunt — 6 clues are hidden in an illustrated crime scene. Interactive items glint subtly; tapping one plays a pickup animation and files it into your inventory.
  • The Evidence Board — once every clue is collected, you drag each piece onto a detective corkboard. Thumbtacks pin, red string connects, and suspect dossiers reveal alibis and motives.
  • The Accusation — place all the evidence, study the suspects, and make your call. Accuse the right culprit and the CASE CLOSED stamp slams down and the next level unlocks. Accuse the wrong one and the culprit walks free — a Try Again button sends you back to the board to re-deduce (your evidence stays collected).
  • Progression & ranks — solve on your first attempt to earn a higher Detective Rank, with per-user progress saved so you can return to crack the next case.

🛠️ How we built it

  • Devvit Web — Reddit's Developer Platform, with a client/ webview for the game and server/ endpoints for persistence.
  • Phaser 3 — five scenes (Boot → Landing → CrimeScene → Board → Result) managed by a strict state machine so the player can never reach an invalid state.
  • Redis — per-user progress (cases solved, attempts, rank) and a sorted-set leaderboard of first-try solvers.
  • A data-driven case engine — this is the part we're proudest of. Every case is a single config file: the scene layout, evidence items, suspect dossiers, the culprit, and the clue logic. Shipping a new mystery requires zero engine code — just a new data file. That's how we built two full cases and how we'll ship weekly cases post-hackathon.

All art is original — a geometric noir style we generated in code — and the ambient rain audio is procedural, so there's nothing copyrighted in the build.

🧗 Challenges we ran into

  1. Making animations feel "cinematic" on a phone. Most Reddit users are on mobile, and our first rain/fog particle setup tanked the frame rate inside the webview. We rebuilt the effects with pooled particles and cheap tween-based lighting until the landing scene held 60fps on a mid-range phone.
  2. Drag-and-drop inside a Reddit post. Dragging evidence onto the board fought with the feed's own scroll gestures on touch devices. We had to carefully capture pointer events inside the game canvas and enlarge touch targets (44px minimum) so pinning evidence felt satisfying instead of fiddly.
  3. Designing a mystery that's fair. Our first playtesters guessed the culprit randomly. We restructured every case so the evidence genuinely proves the answer — and added a post-solve case summary showing exactly how the clues pointed to the culprit, so a correct accusation feels earned.
  4. Devvit's sandboxed environment. No arbitrary network calls, and all state has to flow through server endpoints to Redis. It forced us into a cleaner client/server split than we'd normally write in a hackathon — a constraint that ended up improving the architecture.

📚 What we learned

  • Constraints are a design gift. Building inside a Reddit post — small screen, short sessions, sandboxed APIs — pushed us toward a tighter core loop than any of our previous projects.
  • How to structure a data-driven game engine, where content and code are fully separated.
  • Real-world Phaser performance tuning: object pooling, texture atlases, and why particle counts matter enormously inside a webview.
  • That retention is a design problem, not a feature: leaderboards, ranks, and the anticipation of the next case all had to be woven into the loop, not bolted on.

🚀 What's next

  • Weekly case drops — a new mystery every week, made trivial by the data-driven engine.
  • Community-authored cases — a case builder so redditors can write mysteries for each other (our favorite path toward user-generated content).
  • Harder mechanics — red herrings, multi-room crime scenes, and timed "cold case" events.

The case is never really closed. 🔍

Share this project:

Updates