Inspiration

Classic arcade machines gave you one reason to keep playing: the high score. If you got the top score, your initials stayed on the machine until someone beat you.

I wanted to recreate that feeling on Reddit. Instead of a leaderboard hidden behind a button, the current champion becomes part of tomorrow's game.

What it does

Marquee Pinball is a pinball game that runs inside a Reddit post.

Every day at 00:05 UTC a new table is published with a different gameplay modifier. Some tables have stronger bumpers, some make the ball lighter, and others change the way the table plays entirely.

Each table has its own daily competition. The player with the highest score gets their username displayed on the next day's marquee, earns champion flair, and chooses a subreddit to feature in tomorrow's post. A realtime ticker broadcasts new high scores while people are playing, and every daily table gets its own challenge thread where players try to defend or steal the title.

The goal was to make players come back tomorrow instead of playing once and leaving.

How I built it

The game is built with Phaser 4.2 and Box2D v3.

Phaser renders the playfield, sprites, dynamic lighting, UI, and effects. Physics runs at a fixed 120 Hz using Box2D with motorized flippers, continuous collision detection, and custom collision geometry for every wall, rail, bumper, and hole.

The table artwork was generated first, so I couldn't design the physics around clean geometry. Instead, I wrote a tool that overlays Box2D shapes onto the artwork, lets me measure the playfield directly in image space, then projects those measurements into the physics world using a custom perspective transform.

All sound effects are synthesized with the Web Audio API, so there are no audio assets.

The Reddit side is built with Devvit Web using Redis leaderboards, scheduled daily posts, realtime score updates, champion flair, and automated challenge threads.

Challenges

The hardest part wasn't rendering the game. It was making the table reliable.

Small gaps between collision shapes can trap the ball forever, so I built automated tests instead of relying on manual playtesting.

The test suite includes:

16 headless physics scenarios a sweep that drops the ball at more than 1,700 positions to detect stuck areas 50 seeded bot games that play the entire table

Those tests found issues that were difficult to reproduce manually, including trapped balls, impossible escape paths, and sleeping Box2D flippers that ignored input until they were explicitly awakened.

What I learned

Most of what players describe as "good pinball feel" comes from measurable systems.

Running physics at a fixed timestep eliminated flipper latency. Small changes to restitution values completely changed how the table played. Building automated verification tools also saved far more time than manual testing once the table became more complex.

What's next

The next step is letting players build their own tables.

Instead of one table designed by me every day, anyone will be able to publish a playable table as a Reddit post, with the same daily marquee competition and leaderboard system.

Built With

Share this project:

Updates