DEV Community

Cover image for Darkroom Heist: turning a darkroom timer into a daily safe-cracking game
Freddy Haug
Freddy Haug

Posted on Fully Autonomous

Darkroom Heist: turning a darkroom timer into a daily safe-cracking game

I bought an old GraLab darkroom timer: a big analog dial built for timing photo prints under a red safelight. The first time I turned that knob I thought: this is a safe dial.

The plan is to gut it into a game controller (encoder behind the dial, a Pico inside, the toggle as a button). But before soldering anything, I wanted to know if the game was actually fun. So I built it for the web first.

๐Ÿ” Play it: haugf.com/vault. A new vault every night at midnight.

The loop: feel the thunk, freeze when the door opens, get your print

The game in 10 seconds

  • 3 tumblers, 60 seconds. Turn slowly and feel for the thunk: one click heavier than the rest, plus a buzz on your phone. Then lock it in.
  • The guard. You hear footsteps, the door opens, and you freeze. Move while he's looking and you're spotted (โˆ’10s). Three strikes and you're busted.
  • Daily, like Wordle. Everyone gets the same vault. Your first run is the official one, and after that it's practice.

Design before code

My one rule: mock it first, then build it. The times I jumped straight to code were the times I redid work.

  • One phone screen, no scrolling. LOCK sits in the thumb zone.
  • Stay in the darkroom. Black, safelight red. Run out of time and your print burns.
  • Make it shareable. Wordle's grid is why people post it, so this has one:
๐Ÿซ† Darkroom Heist #1
๐Ÿ’ฐ 38.2s ยท Safecracker
๐ŸŸฅ๐ŸŸฅ๐ŸŸฉ
๐ŸŸฉ
๐Ÿ’ฐ
haugf.com/vault
Enter fullscreen mode Exit fullscreen mode

๐ŸŸฉ crack ยท ๐ŸŸฅ bad lock ยท ๐Ÿ”ฆ spotted ยท ๐Ÿ’ฐ the final crack

How it's built

One HTML file. No framework, no build step.

Piece How
Daily vault Date-seeded RNG, so everyone gets the same vault and there's no server
Dial <canvas> with touch drag, mouse wheel and arrow keys
Sound All synthesized with Web Audio, no audio files
Haptics navigator.vibrate
Hosting S3 + CloudFront

iOS gotcha: the sound didn't start until your first LOCK press, because iOS only unlocks Web Audio after a tap. The fix is to unlock it on any touch with a silent buffer.

Launching it at a hackathon

I was coaching MakeCU (Columbia's hackathon) and told the room to play for a shirt. CloudFront logs from the first weekend:

  • 57 visitors, 86 game loads
  • 40 of 57 on iPhone
  • 48 came from links tapped in group chats
  • Sunday, with no hackathon push: 26 new players

What playtesters told me:

  • Too much scrolling. โ†’ the one-screen layout
  • Text highlights while dragging. โ†’ turned off selection everywhere but the share text
  • Caught while holding still. โ†’ still open: lifting your finger should count as frozen
  • Make the right number more obvious. โ†’ Easy and Hard modes are in mockups

A global leaderboard: Today's Crew

Today's Crew leaderboard next to the BANG easter egg
Sample board for illustration.

The backend is tiny: one Python Lambda behind a function URL, plus one DynamoDB table keyed by vault and device. It costs pennies.

  • Never block sharing. You always see your result first. You go on the board under three random letters, and you can tap your row any day to sign your real initials.
  • No bad words in three letters. There's a blocklist, checked in the game and on the server. Try one and you get an Easter egg: muzzle flash, gunshot, BANG., and your letters get shot out.

What's next

  • Fair freezing
  • Easy / Hard modes
  • Real art by Ally
  • The actual GraLab controller, on a screen at Wonderville

New vault every night. Come crack it: haugf.com/vault

Top comments (0)