Inspiration

Reddit communities already fight over everything, sports rivalries, console wars, tabs vs spaces. TideShift channels that energy into a game: a persistent map where factions literally fight for territory, one daily brain-teaser at a time. The name comes from the win condition, hold 60% of the map and the tide turns: the season ends, a victor is crowned, and the war starts over.

What it does

TideShift turns a Reddit post into a living hex-grid territory war:

  • One challenge a day: unscramble, math, trivia, or riddle. Solve it and claim tiles for your faction, growing outward from your territory.
  • Streaks: play consecutive days for bonus tiles and a 1.5× score multiplier.
  • Seasons: the first faction to control 60% of the map wins the season; the victory is announced in the comments and the map resets.
  • Community-written challenges — players submit challenges in-game; they rotate into the daily pool with author credit ("challenge by u/…"). The subreddit writes the game's content.
  • Daily recap: a scheduled job comments faction standings every midnight UTC, pulling players back.

The map persists for weeks: every hex shows who owns it, empires are visible at a glance in the live control legend, and the leaderboard tracks the topplayers.

How I built it

  • Devvit Web: devvit.json config, a Node (Hono) server with REST endpoints for game state, submissions, leaderboard, and community suggestions; Redis for all persistence; scheduler cron for the daily recap; mod menu actions to create/reset the game post.
  • Phaser 3: the entire map layer: flat-top hex grid math (offset coordinates), per-tile graphics, particle bursts and wave ripples on captures, camera pan / pinch-zoom / wheel-zoom, screen shake.
  • React 18 + Tailwind: HUD, challenge/leaderboard/profile views, onboarding tutorial, faction legend, suggest-a-challenge form. Fully theme-aware(light/dark via prefers-color-scheme).
  • WebAudio: all SFX are synthesized in ~100 lines (rising blips per tile claimed, streak fanfare, victory swell), zero audio assets.
  • Anti-cheat by design: the daily answer never leaves the server; challenges are deterministically seeded from the date so everyone gets the same one.

Challenges I ran into

  • Platform archaeology: I initially built on the classic Devvit API, then migrated the whole server layer to Devvit Web mid-hackathon, rewriting message-passing into REST endpoints while keeping the client almost untouched.
  • Hex math everywhere: offset-coordinate neighbors (different for even/odd columns), pixel↔hex conversion under a zooming/panning camera, and centering a fixed-aspect map inside an arbitrary portrait webview.
  • Season resets at scale: wiping every player's territory on a win would need a scan of all player keys, instead each player record carries a season stamp and territories are cleared lazily on next load.

Accomplishments that I'm proud of

  • A complete, polished game loop, load → see the living map → solve → watch your tiles burst in → come back tomorrow, that works end-to-end on mobile.
  • The community challenge pool: the game's content is user-generated, credited, and self-refreshing.
  • Full light/dark theming down to the Phaser canvas, and a synthesized soundtrack with zero asset files.

What I learned

  • Devvit Web's endpoint model (plain fetch + Redis + cron) is a genuinely pleasant way to build multiplayer-ish games, no infra at all.
  • Determinism is a superpower for daily games: seeding the challenge from the date eliminates state-sync classes of bugs.
  • Juice sells the loop: the particle bursts, screen shake, and per-tile claim blips did more for the "one more day" feeling than any number I tuned.

What's next for TideShift

  • Tile decay and raids on enemy territory so late-joining factions can come back.
  • Weekly "spring tide" events with double rewards.
  • Moderator review queue for community challenges, and challenge upvoting.
  • Season history page, a hall of fame of past faction victories.

Built With

Share this project:

Updates