workshop private

← all creations

Sputter

sprites · created 2026-09-14

64×92 pixel moka pot in section with four loops — the water never boils, it gets pushed by the air you sealed in, and the gurgle is the first and only boiling you ever hear.

pixel-artcanvassimulationphysics

A moka pot cut in half on a gas ring, drawn the way a parts diagram draws one: the near side of the casting taken off so the water, the funnel, the puck and the column are all visible at once.

The thing worth knowing, and the reason the piece exists:

The water in a moka pot does not boil.

It cannot. Boiling means water’s own vapour pressure has caught up with the pressure pushing down on it, and the pressure pushing down on it is the vapour plus the air you sealed into the boiler when you screwed the top on. While any of that air is still in there, total pressure is strictly greater than vapour pressure, there is no bulk boiling anywhere in the vessel, and the water simply sits there — quiet, above 100 °C, and getting pushed up a funnel it is not boiling into.

The demo puts that on screen as a number called to boiling, in kelvin. It starts at 80 and it is still positive four minutes later with the boiler at 116 °C and coffee coming out of the spout. It reaches zero exactly once.

The gurgle

It reaches zero when the funnel’s foot clears the surface.

Up to that moment the tube has been drinking from a depth. After it, the tube is drinking from a headspace, and steam is about twenty times less viscous than water — so through the same puck it moves about twenty times the volume for the same pressure drop, and it takes the sealed air out with it. The air is what was holding total pressure above vapour pressure. Within a few seconds there is none left, the margin closes, and the last twenty millilitres in the bottom of the boiler flash all at once.

That is the noise. It is the first and only boiling in the whole brew, it arrives about ten seconds before the pot is dry, and everything after it is steam stripping a spent puck. Take it off when it starts to gurgle is not lore — it is the moment the machine stops being one kind of machine and starts being another.

The first drop is not hot

Air expands long before water evaporates. On the canonical run — a cold fill to the valve, a middling ring — the sealed air alone clears the delivery threshold while the boiler is still in the forties, and the first thing that reaches the collector does so at 60 °C, a hundred seconds in, with thirty-eight degrees still to go before the water could boil even at atmospheric pressure.

That is not a rounding error at the start of the pour. It is 78 mL of the 232 mL the pot delivers: a third of the cup, extracted under 92 °C, sour, and already in there before the pot is up to temperature.

It speeds up, and that is worse

Heat input is roughly constant and the water being heated keeps leaving, so the same watts warm less and less mass. Temperature accelerates, vapour pressure accelerates harder, and the pot runs hardest in its last fifteen seconds — at the highest temperature of the entire brew, through a puck that has already given up everything worth having. The pressure trace in the demo is the shape of that: a long shallow climb, a spike, and a crash at the gurgle.

So the cup arrives in four layers, and the demo’s bottom bar draws them:

ringunder 92 °C92–100 °Cover 100 °Cafter the gurgle
cold fill, 520 W78 mL40 mL100 mL14 mL
cold fill, 300 W104 mL55 mL59 mL15 mL
cold fill, 900 W55 mL29 mL133 mL14 mL
hot fill, 520 W0 mL0 mL218 mL14 mL

There is no setting of the ring that fills the pot and keeps the pour inside the window. A hot fill buys away the whole sour band and pays for it in the scorched one. A low flame trades scorched for sour. Turning it up does both, faster. The only control that actually works is the one that is not on the pot: take it off at the first drop and you get 45 mL that is almost entirely in the window — and 45 mL is a fifth of a pot. Yield against temperature, and the moka pot gives you no way to have both. That is the whole argument, and it is why moka coffee tastes the way it does.

The valve, and why the fill line is where it is

The safety valve in this drawing lifts at 3 bar absolute. A normal brew peaks around 2.1 and never troubles it; tamp the puck fine and open the ring and the pressure walks straight up to it, because a puck that will not pass water is a puck the boiler has to out-push.

The valve is drawn on the side away from the handle and, deliberately, above the fill line. A valve with water over it vents water — same orifice, about two thousand times the mass per unit volume — and it barely drops the pressure at all. The line stamped inside the boiler is not advice about how much coffee you want. It is there to leave the valve something compressible to blow off.

Honest about the geometry

The vessel’s volume is not quoted anywhere, it is integrated out of the silhouette this file draws (ROW_VOL), so the water level in the picture is the water volume in the model and neither can drift from the other. At 2.8 mm per pixel that gives a boiler of 352 mL, a fill line at 259 mL, a collector of 287 mL and a 100 mm base — a pot between a four-cup and a six-cup, and within a few millimetres of a real one on every outside dimension.

The number the pixel grid handles worst is the funnel’s clearance. One pixel is 2.8 mm and the foot cannot sit closer than one, so the dead volume beneath it — the water that is physically unreachable and stays in the pot — comes out at 17.7 mL where a real six-cup loses about half that to clearance and makes up the rest in puck retention. The model charges 18 mL to retention separately, so the total loss is right even though the split is coarse.

Everything else is a relation rather than a constant: Tetens for vapour pressure, ideal gas for the sealed air, Darcy through the puck with viscosity doing the work at the transition to steam, and an energy balance that pays latent heat for every millilitre of headspace the departing water opens up. The casting’s own 230 J/K is in there too, which is why taking the pot off the heat does not stop it: the metal has nowhere to put that heat except into the water it is standing in.

The loops

Reuse

Source

No .aseprite — the canonical source is source/sputter.mjs, which is both the thermodynamics and the pixel drawing. Nothing is keyframed: the section is composed per pixel by a materialAt(x, y, state) that is a pure function, and every loop’s slow state (level, pressure, phase) is a real instant sampled out of a real run. Only the fast state — bubbles, droplets, flame, the steam plume — cycles, because a loop whose water level fell would jump on the wrap.

node source/render.mjs             # export/, media/ loops, thumb, demo copy
node scripts/screenshot-demo.mjs   # media/ demo shots

(needs site/node_modules installed — the scripts resolve Chromium through site/scripts/lib/chromium.mjs.)

validateGeometry() is the cheap guard, and both scripts run it. It checks that the walls are still walls, that level → volume → level round-trips, that the pot is still a plausible pot, that the collector can hold what the boiler gives up — and then that the model still behaves: that the first drop arrives under 92 °C, that the boiler passes 100 without running away past 125, that a normal brew never lifts the valve, that a tamped one always does, and that the gurgle is an event rather than a phase. Change a row constant and it will tell you the picture and the physics have come apart.