wanessalabs games production July 28, 2026

Palette Quest

Paint by numbers where each colour is locked behind three math problems. One picture a day, and finishing it puts that painting in your archive for keeps.

Vanilla JSSVGReactTypeScriptViteCloudflare Pages
Today's picture, plus an archive of every one already painted.
Today's picture, plus an archive of every one already painted.
Pick a colour, earn it, then paint. The rewards stay daily on purpose.
Pick a colour, earn it, then paint. The rewards stay daily on purpose.

This game had been telling the rest of the hub absolutely nothing since the day it launched, and there was no way to notice, because a completion event that never fires looks exactly like a game nobody finishes.

What It Is

Paint by numbers, for a kid who is learning arithmetic. Every region of the picture is numbered, every number is a colour, and every colour is locked. Tap a locked one and you get three math problems. Get them right and the colour is yours for the rest of the picture.

It went from 5 pictures to 30 this week, and the 30 are the point now rather than the scenery. One is offered per day. Finish it and that painting, in the colours you actually chose, goes into an archive you keep. Everything you have not earned yet sits in the same grid as a grey outline with its name hidden.

Thirty Pictures Is Not Thirty Days Unless You Make It

The old daily picked at random from the list. Same picture for every player on a given date, no server needed, which is the property I wanted and it had.

The problem only appears once the pictures become a set you are meant to finish. Drawing independently from 30 every day is the coupon collector’s problem: you need roughly 120 days to see all 30, and there is no day on which you are guaranteed to have seen them all. Perfectly good behaviour for a shuffle. Useless for a collection.

So each block of 30 days now shuffles all 30 with a seed derived from which block it is, and hands them out one per day. Every picture appears exactly once per block, the order is different each time round, and it still depends on nothing but the date. Thirty pictures became thirty days.

The Prize Has To Survive The Replay

The reward is the finished painting, so you have to be able to repaint one, and a repaint has to start blank with the colours locked again or there is nothing to do.

The old save format made that impossible without destroying something. The finished colouring and the half-finished one lived in the same record, so the moment you started painting a picture again, the copy the gallery was showing would be overwritten one region at a time.

The finished painting now lives in its own place that only a fresh completion may write to. In-progress work cannot reach it. Old saves migrate forward on load, so nobody loses anything they had already earned. That separation is the entire reason “paint it again” is safe to offer at all.

Three Bugs, Three Different Kinds Of Looking

Adding 25 hand-drawn pictures turned out to be three separate lessons in what a given kind of checking can and cannot see.

A region nobody could ever tap. If one shape completely covers another, the covered one is still in the file, still has an id, still passes every structural check I could write. It also cannot be painted, and the game waits for it forever, so the picture can never be finished. There is no way to reason your way to confidence here, so I asked a browser: load all 30, sweep a grid of points across each, and ask what is on top using the same call the tap handler uses. All 380 regions came back reachable. While I was there I measured how much of each one is actually exposed, and enlarged the smallest target for several colours.

White is invisible. I rendered all 30 finished pictures and looked at them, which took about a minute and was the only reason I found this. The snowman was a hat and a scarf floating in space. Pure white against a near-white canvas is nothing, and the two pictures that shipped last year already knew this: one uses a grey-white, the other a cream. Every white in the new set became a tinted off-white.

The caption outside the card. The archive cards had their bottom line of text rendering below their own border, overlapping the card underneath. I could have stared at that CSS for a long time. Instead I printed the numbers: the grid was giving every row exactly 130px while the content needed 185px, so the card was being squeezed and the overflow was simply drawn outside it. Two properties fixed it. Reading the stylesheet would not have told me which two.

The Event That Never Fired

The last one is the one worth carrying somewhere else.

This game is one of only two in the hub that runs as its own page inside a frame rather than as part of the app. The bridge between the two is a single message the game sends when you finish. The React side had always listened for it. The game had never once sent it.

So Palette Quest earned no avatar currency, and never registered a single daily completion, for as long as it had existed. Nothing surfaced that, and nothing could have, because the hub cannot tell the difference between a game whose completion signal is missing and a game that nobody has ever finished. There is now a test that plays the whole thing and fails if the message stops arriving.

What Is Not Done

I have not played it on a phone. It has been through a scripted playthrough that solves the math and paints every region, and it has been rendered and measured at phone width in a headless browser, but a real thumb on real glass is a different claim and I am not making it.

The hub tile still uses the generic card treatment rather than art of its own.

And the decision that most deserves a second opinion is not a bug at all. Gating the pictures behind the daily is what makes finishing one mean something, and it also means a kid who wants to paint the dinosaur today cannot. That was chosen deliberately, over an open library, and it is the kind of choice that reads differently once an actual child is on the other side of it.

Live at games.wanessalabs.com/games/palette-quest.

Development timeline

2 logged updates over 3 days, 28 Jul 2026 to 30 Jul 2026.

  1. Reopened for free play, with maths still gating the coloursimproved

    Every picture became playable at any time. The daily rotation that had gated all thirty was reversed at the owner's request, because the game's actual player wanted to paint whatever she liked rather than wait for the rotation to offer it.

  2. Collect thirty pictures in Palette Questlaunch

    Twenty five new hand-drawn pictures on top of the original five. Everything you finish is saved to an archive you can repaint from scratch.

Written from the release notes published with each update, not afterwards. See every project →