Inspiration
I wanted to build something for Reddit's "Games with a Hook" hackathon that felt native to the platform, not just a game inside a post. The brief explicitly warned against space shooters, clone apps, and AI slop. I kept looking for a shared mechanic where the community solves the exact same problem at the exact same time.
The idea of Battleship kept nagging at me. Everyone knows the rules, but the classic version is just random guessing. I wanted a game that rewarded actual thinking. The core idea became a daily logic puzzle: one hidden fleet shared by the whole subreddit, with silhouettes provided upfront so it's a real deduction puzzle instead of a coin flip.
What it does
Every day at midnight UTC, a fresh 6-ship fleet is seeded onto a 10×10 grid, giving everyone the exact same layout. You start with 32 bombs and 6 hints, earning a higher score for finding more ships with fewer resources. Keeping a daily streak unlocks "super bombs" that clear a 2×2 area at once. When finished, you can post your results directly in the comments and see where you rank on the daily leaderboard.
How we built it
The whole thing runs on Devvit's web platform, using Phaser for the game itself, a Hono server living in the Devvit backend, and Redis for state. The server never sends ship positions to the client. It only sends the fleet's shapes (an L, a square, a Z, that kind of thing), never where they actually are or how they're rotated that day. Every bomb is resolved server-side against a secretly held grid. That's the difference between "trust me, don't open dev tools" and an actual server-authoritative puzzle.
The ships themselves use real polyominoes (an L-shaped carrier, a 2×2 square battleship, a Z-shaped destroyer) with random rotation each day, which makes the deduction actually mean something.
Even the music and sound effects are code, not audio files, synthesized live with the Web Audio API. I built a battle loop from dissonant sawtooth pulses and filtered noise clangs, baked once into a buffer and looped, with layered oscillator/noise combos for the miss splash, the hit thump, and the sunk-ship boom.
Challenges we ran into
The one that got me the worst: partway through, the game just stopped launching entirely. I would tap "play," and nothing would happen. The console showed Scene key not found: Game. It turned out I had rewritten the Game scene and quietly dropped the one-line constructor() { super('Game'); } call that registers a scene with Phaser. An hour of confusion for a single missing line.
Right behind that: every time I tweaked the fleet's shapes or scoring rules mid-build, Redis kept serving the old cached puzzle from before the change, since nothing was invalidating it. I fixed it by baking a version number straight into the cache keys. When I bump the number, everything old becomes instantly irrelevant instead of silently wrong. I also learned the hard way that browsers flatly refuse to play audio until there's been a real user click, which meant rethinking exactly when and where the music should kick in.
Accomplishments that we're proud of
Getting the secrecy model right was a huge win. The client genuinely cannot know where the ships are, even by inspecting the network tab, which is a real constraint I designed around rather than an afterthought. I'm also really proud of the ship shapes themselves: real polyominoes with daily rotation instead of the boring, straight-line version I started with.
The whole UI is fully responsive and actually looks crisp on a phone, not just shrunk down from a desktop layout. That took a complete rebuild once I noticed the cell sizes turning to mush on mobile. Finally, the reward loop (streaks, super bombs, hint penalties, and bomb-efficiency bonuses) all pulls in the same direction, meaning players are rewarded for both playing well and playing often.
What we learned
Mostly: build the boring, correct foundation first, before any of the fun stuff. A deterministic seeded puzzle generator and a server that never leaks secret state look invisible when they're working, but they're the reason none of the later features (streaks, scoring, super bombs) turned into a mess of edge cases bolted on top of a shaky base. I also learned that mobile-first isn't optional when you don't control the container your game renders in. What looks fine on a laptop can be an unreadable, blurry mess on a phone if you don't design for it from the start instead of patching it in afterward.
What's next for paddleSweeper
A few things I'd love to build if this keeps going: a "players solved today" counter for a bit of live social proof, Reddit flair tied to streak milestones so your commitment is visible across the subreddit, and occasional special-format puzzles (like a bigger fleet on Sundays) to keep long-time players from plateauing. I'd also like to expand the fleet roster over time so the puzzle doesn't get memorized after a few months of daily play.
Built With
- css
- devvit
- devvitweb
- hono
- html
- javascript
- node.js
- phaser.js
- phaser3
- redis
- typescript
- vite
- webaudio
Log in or sign up for Devpost to join the conversation.