Inspiration

I've always been fascinated by "micro-competitive" communities, the groups of people who obsess over a daily Wordle or a high-score leaderboard. I wanted to bring that exact energy to Reddit. Bounce Streak was inspired by the simple joy of keep-it-up soccer, combined with the "Daily" hook that turns a simple game into a community ritual. I envisioned a game that wasn't just about skill, but about adapting to the "chaos" of the day.

What it does

BounceStreak is a high-performance "keep-it-up" soccer experience designed exclusively for the Reddit ecosystem. Every 24 hours, I reset the game state with a new Daily ID, which generates unique physics modifiers like horizontal wind and variable gravity. Players have one minute to keep the ball in the air, competing for the top spot on a daily leaderboard. I integrated social loops that let users share their daily scores directly in Reddit comment sections, turning a simple arcade game into a community ritual.

How we built it

I engineered the game using a modular stack designed for the Reddit Devvit SDK:

Frontend: I chose React 19 and Phaser 3.87, utilizing Antigravity as a strategic dependency to handle specialized physics calculations and state synchronization.

Backend: I developed an Express 5 server that leverages Redis (via Devvit) for daily-scoped leaderboard persistence.

Seeded Randomness: To ensure every player faces the same challenge, I implemented a deterministic PRNG system based on the UTC date: $$ \text{Seed}{daily} = YYYYMMDD $$ This seed influences the daily gravity multiplier g, which I apply to the base physics engine: $$ g_{active} = g_{base} \cdot \mu_{g} $$

Challenges we ran into

Synchronous Logic: One of my primary challenges was bridging the high-frequency Phaser physics clock with the React UI. I solved this by implementing a custom event bus that pipes timer data at 60fps, ensuring the HUD remains perfectly in sync.

Mobile UX: Standard touch events often lack the precision needed for physics games. I designed a custom "Cushion Zone," a 75px interaction radius that makes the game feel responsive on small screens without requiring pixel-perfect accuracy.

Physics Tuning: Achieving the right "feel" for the ball required precise adjustment of the coefficient of restitution \( C_R \). I tuned this value to 0.8 to balance speed and playability: $$ v_{bounce} = -C_R \cdot v_{impact} $$

Accomplishments that we're proud of

Strategic Integration: I am proud of how I integrated three distinct technologies (Phaser, Antigravity, and Devvit) into a seamless, high-performance product.

Deterministic Play: I successfully implemented a system that globally sets wind and gravity to identical values for every user on a given day, creating a level playing field for competition.

Premium Aesthetics: I crafted a "Night Park" theme using procedural rendering for the moon and ball fallbacks, ensuring the game looks professional regardless of network conditions.

What we learned

Strategic Integration: I am proud of how I integrated three distinct technologies (Phaser, Antigravity, and Devvit) into a seamless, high-performance product.

Deterministic Play: I successfully implemented a system that globally sets wind and gravity to identical values for every user on a given day, creating a level playing field for competition.

Premium Aesthetics: I crafted a "Night Park" theme using procedural rendering for the moon and ball fallbacks, ensuring the game looks professional regardless of network conditions.

What's next for BounceStreak

Head-to-Head Mode: I plan to implement real-time duels using Reddit's socket capabilities.

Customizable Gear: I'm designing a system that lets players unlock custom ball skins and physics "trails" based on their lifetime streak.

Subreddit Competition: I intend to build "Community vs Community" leaderboards to drive even deeper Reddit integration.

Built With

  • antigravity
  • express-5
  • google-gemini-api
  • phaser-3.87
  • react-19
  • reddit-devvit-sdk
  • redis
  • tailwind-css-4
  • typescript
  • vite-6
Share this project:

Updates