Inspiration
I wanted to build something that used Reddit's social structure as a mechanic, not just a backdrop. Most games on Reddit are played at the community — leaderboards, trivia, polls. DRIFT is played by the community: every chain link is a real player's guess, and the midnight reveal shows everyone's contribution side by side.
The specific hook came from telephone — the children's game where a message gets distorted as it passes from person to person. I wanted to weaponize the distortion. What if the "message" was a word, and an AI scored exactly how far it drifted?
What it does
DRIFT is a daily cooperative word game. At midnight, one secret word is chosen. The first player sees it and writes 3 clue words. The next player sees only those clues — never the original word — guesses what they describe, and writes 3 new clues from their guess. The chain passes through up to 10 players.
At midnight, the full chain reveals: every guess, every clue trio, scored by Claude AI for semantic distance from the original. Green nodes held the signal. Red nodes lost it. You find out if you were the one who broke the chain.
How I built it
Stack: Devvit Web + Phaser 4 + Hono + Claude API + Redis
The game runs as a Reddit post. The UI is split into two layers:
- An HTML overlay (Devvit Web) handles all the input screens — first player, your turn, success, waiting
- A Phaser 4 canvas takes over at midnight for the chain reveal animation
The server is Hono running on Devvit's serverless Node.js. Every guess hits /api/drift/submit, which calls Claude (claude-haiku-4-5-20251001) to score semantic proximity to the original word. Scores are cached in Redis so the same guess isn't scored twice.
The leaderboard uses Redis sorted sets — zAdd on submit, zRange with reverse: true for the top 10. Streaks are calculated lazily: compare last-played date against getYesterdayKey() on each submit.
The Phaser reveal uses staggered tweens, expanding ping-ring particles, semantic arc rings (colored green→amber→red by score), and a camera shake on the final node.
Challenges
The API key problem. Devvit Web doesn't support the settings declaration that Devvit Blocks uses. I had to move the Anthropic API key into Redis (drift:config:api-key) and build a moderator-only endpoint to set it. Not documented anywhere — figured it out by reading the schema errors.
The bot ban. Reddit auto-bans new Devvit bot accounts from new subreddits. The app builds and uploads cleanly, but devvit playtest fails at subreddit creation. I built a full ?mock= dev mode into the game so all 5 screens can be previewed locally without a live subreddit — which is also how the demo video was recorded.
The Phaser/HTML stacking. The HTML overlay sits on top of the Phaser canvas via position: fixed; z-index: 10. In headless Chrome (for screenshot capture), GPU compositing layers rendered on top of the HTML layer. Fixed by passing --disable-gpu to puppeteer.
What I learned
- Devvit Web's serverless model is genuinely powerful for game-like apps — Redis sorted sets for leaderboards, scheduled jobs for cron reveals, all in one platform
- Claude's semantic scoring is surprisingly nuanced for this use case. AVALANCHE → GLACIER scores 84%. AVALANCHE → CHRISTMAS scores 19%. That gradient is what makes the reveal visually interesting
- The "midnight reveal" appointment mechanic is underused in games. The gap between submission and reveal is where the emotional investment happens
What's next
- Subreddit-specific word lists (communities choose their own secret words)
- Weekly chain-of-chains: the final word of Monday becomes the secret word for Tuesday
- Streak recovery mechanic: spend accumulated points to protect a streak after missing a day
Built With
- anthropic
- claude
- devvit
- hono
- node.js
- phaser.js
- redis
- typescript


Log in or sign up for Devpost to join the conversation.