Art lands, bugs fall (and the game has a name)
Three days since the last one, and this stretch had a different flavour: less “build a new system,” more “the art showed up, so hook it all in” — plus two bugs that turned out to be the actual reason for problems I’d been blaming on something else entirely.
But first, the thing I keep grinning at.
It has a name, and a face

Aquavale. I went through about four iterations of the wordmark before settling here, and I reserve the right to change my mind again — but it’s clean, it reads at small sizes, and after months of calling this thing by a working title it feels enormously good to have a name I actually want to say out loud. With a Steam page on the horizon, it was time.
The programmer tank is dead
The blue-grey box with the bright glass edges served me well for months. It’s gone. There’s a real hand-drawn tank frame now — dark trim, glass posts, a proper base — and it’s nine-sliced, which means the corners stay crisp while the rim and posts stretch to fit whatever size tank you’re on. Upgrade from small to large and the frame just… fits.
Getting it aligned was fiddlier than I expected, so I built myself sliders in the debug panel to nudge the frame’s thickness and each edge live, then baked the numbers in once it looked right. Tooling for a five-minute job that saved an hour of guess-and-check recompiles. This will become a theme.
Backgrounds: the whole scene, not just the glass
I had a system for “tank skins” — art painted on the back glass, inside the tank. I’ve repurposed it into something much better. The Store’s Backgrounds category now sells art for the entire scene behind the tank: the world your translucent water reveals.

Two to start. Greek, all sun-bleached marble and toppled amphorae, and Medieval, old stone and timber with a drowned castle in the distance.

The built-in look is always there as Default, so you can flip back any time, and each tank remembers its own choice — a Norse build and a Greek build can sit side by side in completely different worlds. What I like about this is that it makes the water opacity slider matter all over again: clear water turns the tank into a window onto that scene, murky water veils it.
New stuff to build with
A Viking set arrived: a longhall, a longship, a statue, and a great tree.

The ship and the tree are open pieces, so fish weave through the hull and the branches instead of bumping around them — which is still my favourite kind of decor, the sort that the tank’s inhabitants actually use.


There’s a great red-canopied tree too, pale-barked and getting the same weave-through treatment. Plus five new stones — river, craggy, and three smooth pebbles — small, cheap and ungated, because those little accent rocks are what make a foreground look composed instead of sparse. A corydoras joined the roster with proper art at last, having spent months swimming around as a placeholder shape. And the Decor tab was getting crowded, so it’s split into Rocks, Driftwood, and Hardscape & Decor before the themed sets.
The water surface, finally
The waterline used to be a thin bright line. It’s a foam band now: a hot white crest that stands slightly proud of the surface and melts down into the water through a scalloped skirt that varies along its length, so it reads as clinging foam rather than a drawn stripe. The ripple got a third, slower wave underneath so the line meanders instead of repeating itself.
And I finally killed the sharp horizontal line under the surface. I’d “fixed” this twice already — rebuilt the water gradient, then rebuilt the light sheen — and it kept coming back, because the actual culprit was somewhere I’d never thought to look: a leftover flat rectangle in the god-ray layer, drawn over everything with additive blending. It had been sitting there for ages, quietly slicing a line across my water. Deleted. Gone for real this time.
Two bugs worth confessing to
The one where you bought the wrong plant. Something had felt off in the shop for weeks — plants would end up in my tank that I hadn’t picked. So I audited the entire purchase chain, all 114 items, buy to inventory to does-it-show-up. Completely clean. Nothing was being lost anywhere.
Then it clicked while I watched the cart: the plants weren’t going missing. I was buying the wrong ones. Plant art is taller than its shelf, so the leaves you can see poke up into the row above — and the game was resolving clicks by row rectangle rather than by the art you were actually looking at. Click a Cryptocoryne’s upper leaves, buy the Moneywort above it. There was a subtler version too: floating plants draw at the surface directly above rooted ones, so even within a row, overlapping art could resolve to the wrong neighbour.
Clicks now resolve against the drawn art, nearest-centre wins. The plant you see is the plant you buy. (The audit wasn’t wasted — proving the data was sound is exactly what pointed the finger at the clicking.)
The one that made pouring sand chug. Pouring had been getting heavy and I’d been chipping away at it — batching redraws, capping grains, easing the update rate during long pours. All reasonable. None of it was the problem.
So I put a live performance readout in the debug panel, held down a pour, and watched draw calls climb past 150,000 at two frames per second. That’s not “needs optimising,” that’s something is piling up. And it was: when I split the sand bed into chunks for performance, I forgot one line — the code that keeps track of the chunks it just made. So every sand update thought it had none, built a whole new set, and left the old ones lying around still rendering. A few seconds of pouring meant hundreds of stacked copies of the entire sand bed.
One line. The bitter irony is that the same missing line meant all my careful “only repaint what changed” logic had never run at all — the constant rebuilding was accidentally doing its job while quietly drowning the renderer. Fixed, and now the optimisations underneath it actually get to work.
Fish behaviour
Loop-de-loops actually loop now. Feed a fish a Loop Drop and it carves a proper circle with its body following the curve — fully upside down over the top, belly to the centre, like a rollercoaster. It used to travel in a circle while staying stubbornly level, which looked ridiculous.
I also fixed a jittering feeder. A fish going in for a bite would sometimes freeze edge-on and vibrate over its food. Turns out hovering at a pellet makes its drift wobble left and right, and it was flip-flopping which way to face several times a second, never finishing a turn. It commits now.
A director’s toolkit
With a Steam page coming, I built the thing I’ll need to shoot it. The debug panel has a Skins tab that saves full-tank snapshots — every fish, plant and prop, the substrate sculpt, water colours, lighting, background, all of it — under a name I choose. Click one and the whole tank becomes that design instantly.
And there’s a Capture mode: one click hides every scrap of UI and frames the water, with hotkeys to flip between saved tanks while recording. So the plan for trailer footage is to curate half a dozen gorgeous tanks, hit record, and cycle through them without ever touching the mouse.
Where things stand
The Steam page is next. Copy’s drafted, the capture tooling is ready, and I’m iterating on capsule art. Steamworks verification is in flight — I managed to submit the wrong photo the first time (turns out “a selfie” means “a selfie holding your ID”), so that’s a few days I get to spend on art instead. Fine trade.
If you’ve got a favourite background theme you want to see behind the glass, tell me. I’ve got marble and stone; I’m taking requests for what comes next.
— K.