Daily Dash

Inspiration

We've all been there — scrolling through Reddit at 2 AM, and you think: "What if I could just... play a quick game right here?"

That thought spiraled into Daily Dash — a vertical endless runner that lives inside Reddit posts. No app downloads. No browser tabs. Just tap a post and you're dashing through traffic, hopping over blocks, ducking under trains, and chasing today's challenge alongside every other Redditor on the planet.

The idea clicked when we discovered Devvit's GameMaker template. A full game engine running inside a Reddit post? That's not just cool — that's dangerous. We had to build something that would make people miss their bus stop.

What it does

Daily Dash drops you into a 3-lane vertical runner where the road never ends and the obstacles never stop coming.

The basics are simple:

  • Swipe between lanes to dodge
  • Hop over blocks and cars
  • Duck under barriers and trains
  • Collect coins and chain combos up to 3.0x

But here's what makes it addictive:

Every single day, the game generates a new seeded challenge for all players — "Collect 75 coins," "Duck under 15 barriers," "Finish with full health." Same challenge, same seed, same playing field. Your score hits a global Reddit leaderboard where you compete against everyone who played that day.

You get 3 hearts. Each hit costs one and gives you 1.5 seconds of invincibility (the classic Mario flash). Shields absorb a hit for free. Magnets vacuum coins toward you. The game accelerates over 60 seconds from a casual jog to an absolute frenzy — moving obstacles start weaving between lanes, cars barrel toward you at double speed, and trains blast across the screen horizontally.

The scoring rewards style. Near-misses (threading between obstacles within 30 pixels) boost your combo multiplier and award bonus coins. Chain enough of them and your score skyrockets. Play it safe and survive, or play it risky and dominate the leaderboard. Your call.

How we built it

The tech stack is a frankenstein of game development and web infrastructure that somehow works beautifully:

Game Layer — GameMaker Studio 2 (GML) The entire game is hand-coded in GML with zero imported sprites. Every visual — the player character, obstacles, coins, UI — is drawn procedurally with primitive shapes, gradients, and math. The player is a geometric Mario-style character with squash-and-stretch animations, dynamic shadow scaling, and speed lines at high velocity. Coins spin in 3D using sine-wave ellipse scaling. Barriers have animated hazard stripes. Cars have windshields, headlights, and taillights. All from draw_rectangle() and draw_circle().

Procedural Generation — Chunk System Obstacles spawn in themed chunks: coin waves that zigzag across lanes, gauntlets that force rapid lane switches, barrier rows that demand ducking, reward chunks with power-ups flanked by coins. Seven chunk types with intensity gating — the game starts gentle and gradually unlocks deadlier patterns over 60 seconds. A seeded RNG (random_set_seed()) ensures every player faces the same obstacle sequence for daily challenges.

Reddit Integration — Devvit + Hono + Redis The game compiles to HTML5/WASM and runs inside a Devvit webview post. A Hono server handles the API layer:

  • Redis sorted sets power the leaderboard (ZADD for scores, ZRANGE for rankings, ZRANK for "your position")
  • Player state persists across sessions (best scores, challenge completion)
  • The game fetches the player's Reddit username and Snoovatar on init

Daily Challenge Engine A date-based seed (year * 10000 + month * 100 + day) feeds into a deterministic RNG that selects one of 8 challenge types with scaled targets. The same function runs on every client, producing identical challenges without any server coordination. Pure math, zero API calls.

Challenges we ran into

The health Variable Incident. GameMaker has a built-in global variable called health that we didn't know about. We named our player's health health. The engine silently overwrote it every frame, causing the player to die instantly on any collision. The error message was completely unhelpful — something about "uninitialised yyal from Audio_EngineInvokeCallback." Hours of debugging later, we renamed it to hp and everything worked. GameMaker: 1, Us: 0.

The Phantom Click Bug. When Reddit loads the Devvit webview, the click that opens it propagates into the game canvas. Our menu had mouse_check_button_pressed(mb_left) as a start trigger. Result: the game would instantly start, call room_restart() before the engine was fully initialized, and produce a black screen. The fix was surgical — remove mouse click from the menu, SPACE key only.

Drawing Everything From Scratch. No sprite sheets. No asset packs. Every pixel is code. The train alone is ~40 lines of draw calls: body, windows (8 light-blue rectangles), wheels with axle highlights, coupling rods, warning stripes. The player character has separate rendering for standing, hopping, ducking, shielded, magnetized, invincible, and dead states. It was tedious, but the result is a game that's 100% procedural art — and it loads in milliseconds because there are no image files to fetch.

Collision Detection Across 5 Obstacle Types. Each obstacle type has different collision rules. Blocks need hop detection (checking Z-axis offset). Barriers need duck detection (checking is_ducking state). Trains span the entire screen width and move horizontally. Cars move faster than the scroll speed. Moving blocks weave between lanes. Getting all five to interact correctly with the health system, shield absorption, invincibility frames, and challenge stat tracking required careful ordering of conditional checks.

Accomplishments that we're proud of

  • Zero external assets. The entire game is rendered with math and primitive draw calls. No sprites, no textures, no audio files. It's a game made of geometry.
  • The combo system feels good. Threading a 30-pixel gap between two blocks, hearing the near-miss trigger, watching your combo jump from 2.1x to 2.25x — it creates genuine "one more run" energy.
  • True daily competition. Every player gets the same seeded challenge and obstacle sequence. The leaderboard isn't just "who played the most" — it's "who played today's run the best."
  • It runs inside a Reddit post. Full WebAssembly game with procedural generation, health systems, power-ups, and live leaderboards — all in a webview that loads in under 2 seconds.
  • The health system transformed the game. The original version was instant-death. Adding 3 hearts with invincibility frames changed the entire dynamic — now you make risk/reward decisions. Do you chase that coin cluster near the train, knowing you can tank one hit?

What we learned

  • GameMaker's built-in variables are a minefield. Always prefix your variables or check the docs before naming anything health, speed, direction, or score.
  • Devvit's webview click propagation is real. Any UI interaction that opens the game canvas will fire mouse events inside the game. Design menus accordingly.
  • Procedural art scales better than sprites for web-embedded games. No loading times, no asset CDN, no cross-origin headaches. Just math.
  • Seeded RNG is incredibly powerful for multiplayer fairness. One function, zero networking, and every player gets the same experience.
  • Redis sorted sets are the perfect leaderboard primitive. ZADD, ZRANGE, ZRANK — three commands and you have a complete competitive system.

What's next for Daily Dash

  • Sound design — Procedural audio to match the procedural visuals (chip-tune engine using Web Audio API)
  • Weekly tournaments — 7-day cumulative scoring with Reddit flair rewards
  • Obstacle editor — Let subreddit moderators design custom chunk patterns for their communities
  • Multiplayer ghosts — See other players' runs as transparent overlays in real-time
  • Seasonal themes — Holiday-themed obstacles and visual palettes (snow drifts in winter, pumpkins in October)
  • Achievement system — Persistent badges for lifetime milestones (10,000 coins, 500 near-misses, complete 30 daily challenges)

Built With

  • GameMaker Studio 2 (GML)
  • TypeScript
  • Vite
  • Hono
  • Redis
  • Reddit Devvit Platform
  • WebAssembly (HTML5)

Built With

Share this project:

Updates