Inspiration

We wanted a puzzle game that felt like it belonged on Reddit instead of one that was just embedded there. Reddit already runs on daily rituals and inside jokes, so we looked at Factory Balls, the old flash game where you dress a blank character in stencils and paint to match a target look, and asked what happens if the target look becomes a daily community puzzle, the stencils become removable accessories on a mascot, and the solving becomes something you can brag about, race a stranger over, or build yourself and hand to the subreddit as a dare. That mascot became Splot, a round slime who lives in the feed and reacts to everything you do to him.

What it does

Every level shows a goal pattern: a bare slime painted in colored zones. You start from a blank white slime and reproduce the pattern by wearing accessories as paint stencils and splashing color over them. A stencil worn when the paint lands protects whatever it covers. Taking it off later reveals what was underneath. Order is the entire puzzle, and every tap costs a move, so the same five tools can hide a two move solution or a twenty move one depending on how they're sequenced.

The signature twist is goggles. They protect like any stencil, but the very first splash that lands on them shatters them for the rest of that attempt, automatically and for free. Glasses cover almost the same area but survive forever. Deciding which splash you spend your one pair of goggles on is where most of the actual thinking happens.

On top of that core loop:

The Daily Sqlot is a fresh puzzle generated and posted every day, already skewed toward the harder end of the difficulty scale and pushed even harder on weekends, with a streak that shows up on your Reddit flair and a one time crown you can claim and post as an image if you solve it before anyone else.

Anyone can build their own level. The editor doesn't give you a separate goal-drawing tool, you just play the level yourself, and your own recorded solution becomes both the goal image and the proof that it's solvable. Publishing turns it into a real Reddit post framed as a challenge, complete with a pinned scoreboard comment that updates itself as people try to beat your move count, and a small Sparks payout to you every time ten more people solve it.

Sparks are the game's currency, earned by solving levels quickly and efficiently, and spent on a cosmetic shop for Splot: dozens of colors, faces, and accessories. Every Thursday a Fit Check thread opens where you can dress Splot up and post an actual picture of him to the thread. The community upvotes their favorite fit, the winner gets Sparks and a flair badge, and the old thread is deleted and replaced with a fresh one automatically.

Your Reddit flair updates on its own to show your streak and your Sparks tier, so your standing in the community is visible everywhere you post, not just inside the game.

How we built it

The whole thing runs on Devvit Web, Reddit's platform for building apps that live directly in posts. The client is Phaser 4, chosen because the core mechanic is really a compositing problem: each paint action layers a tinted, masked stamp onto a canvas texture, punching out whatever is currently worn using real alpha data read from the actual accessory art. That canvas becomes the slime you see, and the exact same technique renders the goal preview, the win screen, and every shareable card.

The server is Hono running on Devvit's serverless Node, with Redis for everything persistent: profiles, levels, leaderboards, the daily puzzle index, the Fit Check state. Scheduled Devvit tasks post the daily puzzle every hour until it lands, and cycle the Fit Check thread every Thursday.

The one decision that shaped everything else was putting the entire simulation, every rule about what a splash does, what a stencil protects, when goggles break, into one plain TypeScript module with no framework dependencies. The client runs it live so taps feel instant, the server runs the identical copy to verify every submitted solution, and the renderer runs it a third time just to know what to draw. Because it's one module instead of three approximations of the same idea, there's no way for client and server to quietly disagree about whether a move was legal.

Challenges we ran into

Trusting user generated levels without a moderation queue was the hardest problem. The fix was making the level's own recorded solution do double duty as its proof of solvability: the server independently replays it and rejects anything that doesn't resolve cleanly, so a broken or unsolvable level can't be published in the first place.

Getting a canvas-compositing renderer to feel instant on a phone inside a Reddit webview took real tuning. Static backgrounds get baked into a single render texture instead of redrawn every frame, and Phaser 4's newer texture APIs queue their draws instead of running them immediately, which is not obvious until you've been bitten by a stamp that silently did nothing because nothing had flushed it yet.

Audio turned out to be five times heavier than every piece of art in the game combined. We ended up splitting it so only a small set of core UI sounds loads before the game is interactive, with the rest, including the music, streaming in quietly after you're already playing.

Accomplishments that we're proud of

The whole game is one puzzle engine shared by three consumers, which means a solution that works client side is guaranteed to be accepted server side, every time, with no separate validation logic to drift out of sync.

Idle rendering sits around six milliseconds and every tap resolves in under twenty five, measured under six times CPU throttling, so it stays responsive on modest phones and not just on a dev machine.

User generated content isn't a side feature bolted onto a fixed campaign, it's the same toybox the built in levels are made from, and every published level becomes a real, self-updating Reddit post the moment you publish it.

What we learned

Building for an iframe forces a cleaner architecture than a normal web app, because a lot of the browser APIs you'd normally reach for either don't exist or are explicitly off limits, so you end up leaning on the platform's own primitives instead of working around them.

Sharing one simulation across the whole stack is worth the upfront design cost. Every bug class we avoided by construction, like a level that looks solvable client side but isn't, would otherwise have needed its own test coverage and its own fix.

What's next

More stencil types and seasonal daily themes, deeper post-solve stats so players can see how their solution compared to others, and more ways for a published community level to keep paying its creator back the longer it stays popular.

Built With

Share this project:

Updates