There are no plant drawings in the code. There is only a rule for how a branch turns, a rule for when it splits, and a rule for how it dies. Everything you saw is those three rules arguing.
The garden is an agent system on a single 2D canvas. Each branch is a tiny object: position, heading, generation, and a life budget. Every frame it:
The canvas is never cleared. Old growth stays forever, like rings in a tree, so the page becomes a painting of its own history. Ten minutes on the page produces a garden nobody else will ever see.
const dx = pointerX - b.x, dy = pointerY - b.y;
const d = Math.hypot(dx, dy);
if (d > 40 && d < 520) {
const target = Math.atan2(dy, dx);
let diff = target - b.a; // shortest angular path
while (diff > Math.PI) diff -= 2 * Math.PI;
while (diff < -Math.PI) diff += 2 * Math.PI;
b.a += diff * 0.028; // gentle, not obedient
}
The 0.028 factor is the entire personality of the piece. At 0.2 the vines chase your cursor like eels and the magic dies. Growth should acknowledge you, not obey you.
A 90-second clock cycles four palettes (spring, summer, autumn, winter). Only new growth takes the current palette, so a mature garden shows its age in color strata. The season, day count, branch and bloom totals run in a small mono HUD, because giving a fiction instrumentation makes it feel observed rather than decorated.
prefers-reduced-motion, the garden pre-grows ~2,600 steps into a still botanical print and stops.