Inspiration

I'm a product manager who's built apps of my own before (Monument Vault, Abbe Chup) and dabbled in puzzle design (DailyCricketGrid), but Monumental is my first actual game. Threes game by Asher Vollmer nails a rare kind of tension: simple enough to pick up in seconds, deep enough to keep you swiping for "just one more game." I love that game and wanted that same addictive core loop. So I paired the swipe and merge mechanic with the collection mechanic to give players a reason to keep playing beyond the high score. Previously I had built Monument Vault and so there was a ready library of monuments and the art to go with it. Reddit's "Games with a Hook" hackathon was the perfect excuse to fuse the two: merge tiles, and every game chips away at unlocking a personal collection of 212 real monuments from around the world.

What it does

Monumental is a 4x4 tile-merging puzzle game, played directly inside a Reddit post. Swipe to slide tiles; matching values merge and grow (1+2 makes 3, and same-value tiles double from there), and your score climbs on a 3^(n+1) curve. As you play — both within a single game and cumulatively across all your games — you unlock monument cards spanning 7 regions and three rarity tiers: Common, Rare, and Legendary. Each card comes with a photo and a fun fact about the real place it represents. Unlocks are revealed one at a time in a tap-to-reveal sequence, and everything you've found lives in the MonuDex, a Pokédex-style gallery you can browse, filter by region, and show off. Leaderboards track best single-game score, total score, and monuments collected, so there's a competitive layer on top of the collection layer. You can also share your score, your current Monudex status and the monuments you unlocked after every single game.

How we built it

The game runs on Devvit, Reddit's platform for building games and apps that live natively inside posts. Rendering is handled by Phaser 3 with TypeScript throughout; Hono handles server-side routing, and Redis (via Devvit's client) persists player state, sorted-set leaderboards, and unlock progress.

The merge mechanic itself needed to feel exactly like the genre demands: one discrete step per swipe, tiles tracked precisely, and new tiles spawning only on the edge opposite the swipe direction, only in the rows or columns that actually moved. Getting spawn balance right (weighting new 1s and 2s toward whichever the board has fewer of) took real tuning to keep games feeling fair rather than random.

For the monument system, I built two separate unlock axes: Legendary monuments unlock based on your score in a single game, while Common and Rare monuments unlock based on your cumulative score across all games. I also ensured a seeded shuffle and a region-spread pass to ensure a player didn't unlock ten monuments from the same country in a row. The Great Wall, the Pyramids of Giza, and the Taj Mahal are reserved as the final three Legendary unlocks, so there's always a long-term goal on the horizon.

For the visual style I wanted a playful design. But it was becoming tacky and gaudy. So I then made the decision to a slightly more muesuem-y style design of Basalt/Verdigris/Cream palette with Fraunces for display type and Nunito for UI.

Challenges we ran into

Devvit's sandboxed webview surfaced some platform quirks I hadn't hit before: Phaser's GeometryMask doesn't reliably work in that environment (it seems to fall back to a canvas renderer where stencil-based masking breaks on scroll), so I had to rebuild scrollable clipping using a dedicated second camera with a scoped viewport instead. Redis via Devvit also doesn't expose sAdd/sCard, so set-like operations had to be reworked around sorted sets.

I had actually wanted the monument images to be rendered from my Cloudinary storage but Reddit did not allow it. I therefore optimized the images and baked them into my project.

Balancing the unlock curve was its own puzzle. Early on, a reveal cap was masking a deeper problem: low-scoring games were crossing dozens of milestone thresholds at once because the threshold floor was set too low. I built a Node.js simulation harness running bot players at five skill levels (random through deep-lookahead) to model realistic scoring distributions and recalibrate the thresholds properly rather than just capping the symptom.

Accomplishments that we're proud of

212 monuments, fully populated with real facts and local art assets, unlocking across a scoring system that's been calibrated with actual simulated play data rather than guesswork. A tutorial and How-to-Play flow that gets new players oriented in seconds. A collection screen that feels worth returning to. And a merge mechanic that, after a lot of iteration, actually feels right under your thumb.

What we learned

Platform-specific rendering quirks (like GeometryMask breaking in Devvit's webview) don't show up until you hit them, and the fix is usually "use a more primitive tool" rather than "work around the bug." We also learned that milestone/reward pacing is a data problem as much as a design one — simulating a range of player skill levels before locking thresholds saved us from shipping a curve that felt broken for anyone who wasn't already good at the game.

What's next for Monumental

I have even more monument assets and so I want to include them too. I will also try and run Live ops where few monuments are available only during some specific time period. I would also like to explore a standalone version outside of Reddit, likely wrapped for mobile.

Built With

Share this project:

Updates

Submission history