Inspiration

Built solo over the hackathon window — no team, so most of these calls got made fast, alone, at whatever hour felt right at the time.

Most escape room games make you click through menus and inventory screens. I wanted something where you're actually moving — you see an object, you commit, you find out immediately if you were right. That's the whole design goal behind the dash mechanic: no "confirm" button, no pause. You either got it or you didn't, and the room lets you know instantly.

I picked Reddit specifically for the daily mode. Everyone gets the exact same maze on the exact same day — that only means something on a platform where "everyone" is an actual community that can compare notes in the comments afterward.

What it does

You're dropped into a dark room with a handful of ordinary objects — lockers, vending machines, server racks, whatever fits that layout. One of them is hiding a key. Dash into it and the door unlocks. Dash into the wrong one and you lose a heart and the whole room regenerates.

There's 20+ different object types across the maps, and each one has its own set of 5 hand-written riddle clues, so hint boxes never repeat themselves across playthroughs.

Three modes:

  • Freestyle — random room, no lock, just for practice/speedrunning
  • Daily Challenge — one seeded maze a day, same for every player, one attempt, resets at UTC midnight
  • Maze — 5 hand-built walled layouts instead of an open room

  • it also has a mobile version with all the functionality working

Win Daily Challenge and you can post your time straight into the post's comments. It's not just a "share" button faking a screenshot — the server actually re-reads your real stored score from Redis before it posts, so nobody can fake a better time than they actually got.

How I built it

Phaser 3 for the game itself, running inside a Devvit web app. Server side is Hono running on Devvit's Node runtime, Redis as the only datastore — leaderboards are just Redis sorted sets (zAdd/zRange), which made "top 10" and "my rank" basically free to compute.

The daily maze generation is the part I actually like the design of. Instead of storing "today's map" somewhere and hoping every request reads it consistently, I hash the UTC date string directly into a seeded generator on the client. Same date always produces the same maze, no server round-trip needed to agree on it, nothing to desync. The only server-side state for Daily mode is a single Redis key per player per day (daily-attempt:{day}:{username}) with a 2-day expiry, just tracking whether they've played yet.

The dash itself has a real speed curve — 50ms ease in, 110ms hold at full speed, 80ms ease out — instead of snapping instantly. There's also a short grace window after the dash animation ends where hit detection still counts as "dashing," so you don't lose a heart for barely grazing something a frame late.

Being solo meant every one of these systems — gameplay, server, Redis schema, art direction, audio — went through the same head, which kept things consistent, but also meant no second opinion when I was deep in a bad idea for too long.

Challenges I ran into

Getting the daily maze right took a couple of wrong turns. First version stored a shuffle-bag of unused maps in Redis so the same layout wouldn't repeat too often. Then I actually thought about what happens if two requests hit right as the UTC day rolls over, or if that stored state gets corrupted somehow — suddenly the map isn't guaranteed to be the same for everyone anymore, which defeats the entire point of "daily challenge." Scrapped it and went with the pure hash-of-the-date approach instead — no state to get out of sync, at the cost of occasionally repeating a layout. Worth the trade.

Also had to fix how a wrong guess felt in Daily mode specifically. Since you only get one attempt a day, one bad dash used to just end your day outright — felt terrible. Now a wrong dash rolls you into the next iteration of that day's maze (still deterministic, still the same for anyone else who reaches that iteration) instead of killing the run. Costs you time, not your whole day.

Score submission needed a floor too — MIN_PLAUSIBLE_TIME_MS rejects anything under 3 seconds so a manipulated client can't just POST a 0ms time straight to the leaderboard. Not real anti-cheat, just enough to block the obvious case.

Working solo also meant every bug was mine to find. No one else was going to stumble into an edge case I hadn't thought of — so a fair amount of time went into deliberately trying to break my own daily-reset logic and score submission before trusting them.

What's next

Right now the comment-sharing is one-way — you post a result, that's it. I want to make the comments actually feed back into the game somehow, not just be a place to brag after you've already finished.

Built With

Share this project:

Updates