Inspiration

A bottega was a Renaissance master's workshop — the studio where a painter, his apprentices, and his commissions all sat under one roof. What drew me to it as a management game is that the economics were brutal and legible: ultramarine was ground from lapis lazuli and cost more than gold, so a patron didn't just commission a painting, they commissioned a quantity of blue. That's a resource decision with four hundred years of history behind it.

What it does

You run the workshop. Each round offers two commissions. You buy pigment, accept one, and paint it before the deadline — every tap is one brushstroke and one unit of pigment consumed, so paint is a resource you must buy in advance. A fifty-unit panel needs fifty units stocked before the first stroke.

You can deliberately start under-stocked. Run dry mid-panel and you either buy the rest or deliver incomplete for a fee that falls away sharply with how short you are. Reputation is the goal axis: at eighty it unlocks the Cathedral Altarpiece, which ends the run either way.

How I built it

Prompt-first with Claude Code, but the structural decision that made everything else possible was made in session one: state.js holds one serialisable state object and pure reducers, balance.js holds every tunable number, and the renderer only ever reads state. No gameplay value lives in the scene graph.

That let me build a headless harness that plays thousands of full sessions in seconds, which is where the game was actually designed. The build ships as a single self-contained index.html with three.js vendored locally and zero network requests, assembled by esbuild.

Challenges

The game had no decision in it, and measuring the wrong thing hid that. The harness tracked which offer a strategy took. It never asked whether a choice existed. When I finally classified every round, the answer was that either the bold commission was unaffordable, or it strictly dominated. There was no round where the choice was open.

A wall that looked like difficulty. Runs died at round 5 with total consistency — median loss round 6, peak reputation 33, in every seed. The pigment ladder is geometric (1/4/12 florins) while income is roughly linear, so no multiplier could fix it: any value that cleared round 5 trivialised rounds 1–4. The fix was structural, not numerical — partial provisioning turned a cliff into a slope.

The finale was a thumb-speed test and I'd measured it wrong. Failure-cause analysis said 0% money, 100% time. Any player under ~2.2 taps/sec could not win at any skill level. Lengthening the deadline dropped that floor to 0.90.

The harness was blind to the interface. Four separate bugs — a card that accepted without stocking, a label that priced a different quantity than it charged, a rendering layer that ate every tap — were all invisible to a million simulated sessions and obvious within thirty seconds of holding a phone.

What I learned

Measure what you actually care about, not what's easy to instrument. And a simulation can tell you whether a game is balanced; only a person can tell you whether it's legible.

Built With

Share this project:

Updates

Submission history