A cozy voxel-sculpture
merge puzzle.
Drop coloured cubes to fill ghosted 3D sculptures, chain perfect clears across a five-level roguelike run, and grow a gallery of everything you finish. One thumb, no timer, no stress. I designed and built the whole thing solo — game design, art direction, and code.
Play Cubelets
The full game, live in your browser. 16 hand-built levels, a daily challenge, a gallery, and three palette skins. Drag to aim, release to drop.
Design system
Monument-Valley pastel tokens, the seven cube hues, warm glass surfaces, and the voxel-heart mark — the full, code-truthful spec.
Under the hood
React 19 · PixiJS 8 · Three.js · Capacitor 8. Procedural Web-Audio score, an offline PWA, and a native Android build — all at a steady 60fps.
Casual puzzlers are either mindless tappers or punishingly tight. I wanted the cozy middle.
The "merge" genre is enormous, but most of it runs on stress — timers, pop-ups, energy meters, dark-pattern monetisation. I wanted a merge-and-build loop that rewards spatial thinking instead of reflexes: drop a cube, watch a 3D sculpture slowly emerge, and feel good when it clicks into place. Satisfying without being demanding — something you reach for to unwind, not to grind.
One loop, five beats. Easy to learn, hard to put down.
I sketched the core loop on paper first — deliberately low-fi, so the structure had to earn its keep before a single cube got rendered.
sculpture to fill
release to drop
wrong one stacks
as junk
junk tiles merge
& vanish
complete
big bonus. saved
to your gallery.
The decisions that shaped everything else.
"Cozy, not stressful" is easy to say and hard to build. Three early bets turned it into a system — how forgiving placement should be, where the interface sits, and what actually keeps you coming back.
Smart-snap, not pixel-perfect.
Drop a correct-colour tile anywhere near its slot and it auto-locks into the sculpture. The game is about building the picture, not threading a needle — so placement forgives, and the satisfaction comes from the shape filling in, not from twitch precision. Mis-drops aren't punished; they just stack as clearable junk.
The scene is the screen.
The 3D voxel field is the whole interface. Every menu, HUD, and panel floats above it as a single layer of warm translucent glass — you can always see your sculpture behind the chrome. No solid full-bleed panels ever come between the player and the thing they're making.
Reward the run, not the score.
A five-level roguelike run with modifier cards between levels (double score, slow time, hidden preview), a perfect-clear bonus, a gallery that keeps every sculpture you finish, and a deterministic daily challenge with a "beat yesterday's ghost" pip. The pull is progress and collection — no energy meters, no nags.
Small calls that change how the whole thing feels.
Most of what makes a game feel good rather than just functional is a pile of tiny, invisible decisions. Here are the ones I'd defend in a critique.
A generous snap radius you never see.
The correct tile locks in from a wider area than feels "fair" — tuned by hand until dropping felt confident instead of fiddly. Players read it as "I'm good at this," not "the game is helping me." Forgiveness you don't notice is the best kind.
Mistakes become a second puzzle, not a penalty.
A wrong drop doesn't cost you — it stacks as a coloured junk tile. Line up three of a colour and they merge and vaporise. So the "fail" state is just another satisfying thing to clear, which keeps a bad run from spiralling.
The cube colours are the only loud thing.
Chrome stays warm and desaturated; saturated hue is reserved entirely for the cubes. So any colour in the UI reads instantly as a gameplay hint, and the sculpture is always the brightest thing on screen.
A daily "ghost" instead of a leaderboard.
The daily challenge shows a pip of yesterday's best score that flips to "BEAT GHOST" when you overtake it. You compete with your past self — all the pull of a leaderboard, none of the backend, and zero social pressure.
Feedback you feel, on a ladder.
Combos climb a ten-step pitched snap-sound ladder and a tiered haptic pattern, so a hot streak literally rises in your hand and your ears. The final cube of a level gets its own micro punch — a scale pump before the celebration fires.
Reduced-motion is a real mode, not a toggle.
With prefers-reduced-motion on, every bounce, spin, and confetti burst collapses to a plain opacity fade. The game stays fully playable and still feels intentional — accessibility designed in, not bolted on.
One warm system, used everywhere.
Cubelets runs on a "Monument Valley pastel" system — warm cream, espresso text, and seven soft cube hues that double as the game's palette and its brand. Tokens are defined once and re-bound per palette skin. Here's the short version; the full spec lives on the Design page.
The cube colours are the brand.
No pure primaries — every hue has a soft watercolour quality. These seven are simultaneously the brand swatch and the exact colours dropped onto the field, so the moment one appears in the chrome, your eye reads it as a hint. They ride on a warm cream background (#F5E4CB) with espresso text, never cold black.
Rounded letterforms, two weights of warmth.
Chunky, friendly, unmistakably a game. Its rounded corners echo the rounded cubes. Reserved for the big moments.
One family at weight 600, set on the root so everything inherits it. Soft, legible, and quietly rounded to match.
Only where a label needs to read as "system" — section eyebrows, prism counts, the design-spec voice you're reading now.
Soft on glass, soft on chips.
Nothing sharp anywhere — the whole system is rounded to sit next to the rounded cubes. Four steps, from the score-HUD pill down to the smallest badge.
The icon is the whole game in one frame.
The app icon is a heart built from dark and red cubes, with a single pink cubelet sitting just off-centre — the merge gameplay reduced to one still frame. It reads warm and friendly at thumbnail size and tells you what the game is before you've read a word. In-product glyphs are inline line icons drawn at the same 1.6px stroke as the body text, so the chrome and the type feel cut from one tool.
Motion as feedback, not decoration.
The cuts I'd defend.
A solo game has to be ruthless about scope. Here's what I left out on purpose — each cut keeps the game cozy, offline, and free of the dark patterns the genre is famous for.
No global leaderboard, no servers, no analytics SDK. A worldwide leaderboard needs infrastructure I didn't want to run for a solo game — and it invites the exact stress I was avoiding. The deterministic daily "ghost" gives you something to chase that's entirely local.
Progress lives in local storage, not a login. Your gallery, prisms, and streaks are on-device. Zero sign-in friction, nothing to harvest, and you can start playing in the time it takes the first cube to fall. The trade-off is no cross-device sync — a fair price for a casual title.
Palette skins are earned with in-game prisms, not bought. The shop is a stub on purpose — no real-money purchases, no energy timers, no "watch an ad to continue." The whole point was a merge game you can trust to leave you alone.
16 hand-built sculptures + roguelike runs, not hundreds of hand-crafted puzzles. Bespoke one-solution levels and mid-run bonus rooms are designed but deferred — the modifier-driven runs already make each playthrough feel different without that authoring cost.
Built solo, on a modern web stack.
One codebase ships to the browser, to an installable PWA, and to native Android & iOS — at a steady 60fps. No game engine licence, no asset pipeline; even the music is synthesised at runtime.