Inspiration
Most Reddit games I looked at before starting were single-player experiences that just happened to be embedded in a post - you could lift them out and run them anywhere. I wanted to build something that could only exist as a Reddit post: a mechanic where the post itself is the game state, not just the container for it.
That became Wyrmwatch's core idea, a raid boss with one shared health bar per post. Everyone who opens that post, whether they're online at the same second or twelve hours apart, is fighting the same wyrm. Kill it as a subreddit, and a tougher one spawns to replace it. Let it sit too long, and it enrages and escapes on its own, resetting the community's streak. It's cooperative at its core, with a competitive leaderboard layered on top but the thing that makes it a "hook" instead of just another web game is that the shared, persistent boss state simply doesn't work anywhere except inside a real Reddit community.
What it does
Raid Mode is the main event: a needle sweeps around a ring, and you tap when it crosses a glowing arc to land a hit - tap the brighter inner sliver for a critical hit. Every tap costs energy that regenerates over time, and every hit chips away at the boss's HP bar for the whole subreddit to see in real time. Defeat a boss and a stronger one takes its place at the next tier.
Solo Watch is the same needle-and-arc combat, but single-player against escalating difficulty instead of a shared boss, the arc narrows, drifts, gets obstacles, and eventually the needle's own sweep direction starts flipping mid-round. You get 3 lives; miss and you lose one. Your best score sits on a subreddit-wide leaderboard that survives raid rotations.
Layered on top of both modes are the retention mechanics that make a subreddit want to keep coming back: a community-wide kill streak, a guaranteed critical hit on the first tap each day, an enrage timer that punishes letting a boss sit unkilled, and a daily recap comment that summarizes the previous raid's peak tier and top scorers before rotating in a fresh, numbered post.
How I built it
The stack is Devvit Web with vanilla TypeScript not the React template, rendering combat with Phaser and routing the backend through Hono. Boss state, energy, streaks, and leaderboards all live in Redis, and Devvit Realtime pushes boss updates to every open tab watching a raid so a hit from one player shows up instantly for everyone else. Attacks use an optimistic-update pattern client-side (the hit registers instantly for the attacker, then reconciles against the server's authoritative response) so combat feels responsive despite the round trip.
Everything visual, the boss silhouette, the combat gauge, the starfield background, the hit-flash and particle effects is drawn procedurally with Phaser Graphics and a deterministic seeded PRNG, and all the sound is synthesized at runtime with raw Web Audio oscillators. No image or audio assets, no licensing to worry about, and it kept the whole thing lightweight.
Challenges I ran into
Getting genuinely shared, real-time multiplayer state working on a serverless platform was the core challenge, Devvit Realtime channel names turned out to only accept letters, numbers, and underscores, which broke my first naming scheme. I also hit a subtle bug where using Math.random() inside Phaser's update loop desynced client-side prediction from the server; switching to a seeded PRNG fixed it. Mobile support needed its own pass too getting UI scale and boss scale to track independently, fixing a Phaser Text default-origin gotcha, and eventually bundling real webfonts after discovering Arial rendered noticeably differently on mobile versus desktop.
Accomplishments that I'm proud of
Getting a boss fight that's actually shared and synced live across independent sessions not simulated, not faked was the milestone that made the whole concept feel real instead of theoretical. I also verified the retention loop end-to-end on the real Devvit scheduler, not just type-checked and assumed working: the enrage timer genuinely resets a stale boss on its own cron cadence, and the daily recap job genuinely posts a comment and rotates in a new numbered raid post without any manual intervention.
What's next
More boss themes and visual identities, a wider tier curve so long-running subreddits stay interesting, and exploring whether Solo Watch could support small private leaderboards (friend groups, not just subreddit-wide) without adding real complexity to what's deliberately a simple core loop.
Built With
- devvit
- devvit-web
- hono
- phaser.js
- redis
- typescript
Log in or sign up for Devpost to join the conversation.