All Means Works · Landscape in time · Prototype · v3

Grove v3

Wilding and Hatchling, fused — and now honest about uncertainty. A real stand of individual trees grows in continuous ground, competes, evolves and draws itself — but a single run is one roll of the dice, so Grove v3 runs many futures from the same planting and shows the spread: canopy closure as an uncertainty band, each tree tagged with the share of futures in which it dies, species growth and lifespan as cited ranges not made-up constants, and species viability re-flagged as the hardiness zone drifts with warming. Plot it as clean vector linework.

Prototype · standalone · a stand that draws itself, evolves and shows its uncertainty
💾 Autosaves as you work

Painting the ground — click and drag to lay conditions. Switch to Layers or Time to watch it draw.

View Colour
Projection
Year 0
16
Not a prediction. A single run is one roll of the dice. Grove v3 rolls it many times from the same planted stand and shows the spread: the band is where canopy cover lands in 8 of 10 futures, the histogram is when the grove closes across them, and each planted tree carries the share of futures in which it dies (hover it). Where a species’ growth or lifespan is only illustrative, its futures spread wider — honestly. Still a stylized didactic model, not certified ecology.

▦ Sequence plate — lay a run of years out on a page
Years

Page
Margins
Captions

🎹 MIDI control

Plug in your controller (e.g. an Akai MPD24) and hit Enable MIDI. Then hit Learn, click any slider on this page to arm it, and move a knob or fader to bind it — after that the control drives that slider hands-free. Bindings are saved on this device.

The stand — which colour is which plant
Read this as a convention, not a truth. The map from ground → mark is a graphic argument you author — two designers will draw the same site differently and both can be right. The stand under the drawing is an individual-based succession model: real trees competing for light, dying and seeding in. v2 adds within-species evolution: a seedling inherits its parent's realized traits with a little mutation, and because only well-matched stems survive to seed, lineages slowly adapt to their microsite — plus species now act on one another (self-thinning by conspecific check, chemical allelopathy, and niche partitioning). This is a genuine selection-plus-inheritance loop, but still a stylized teaching model with a small illustrative species pool and hand-tuned strengths — the numbers are plausible, not calibrated. Every parameter is editable, so you author the model — you don't read data. The "moisture bleed", "mycelium web" and materials are graphic devices you paint and choose, not simulations of hydrology or fungal growth. Grove teaches representation and stylized ecology; it certifies neither.
Data source: there is none external — the site and mix are what you set, the stand is the model above, and water/soil/mycelium/marks are drawn. See Method, algorithms & sources below for exactly how every stem and mark is made.

Lay the ground

Test starters

Load a ready-made scene to watch the reactivity — Simple (two species, plain ground) · Medium (a mix, with water & wetland and varied soils) · Dense (every species, every ground condition, all layers on). Then scrub the year or hit Play.

Or paint your own: pick a brush below, then draw the plan. The faint underlay shows the conditions you've laid; the drawing reads them.

Community
Soil
Overlay
Scenes

Plant the stand

Under the drawing is a real stand of individual trees — competing for light, dying, seeding in. Set the site, sow a mix, and edit any species' traits; the hatch re-inks from whatever you grow. No wager, no reveal — it just grows.

Plot & scale

How big a piece of ground this is, in metres. Pick a garden, a yard, or a whole landscape — the same painted plan and mix are read at that physical scale.

Site pressure

The climate the whole stand reads. (Painted water & soil still shape the drawing on top.)

Seed mix — who you sow

Check the species you sow and how heavily. The site decides who actually wins.

Species traits — author the ecology

Every parameter of every plant is editable — growth, mature size, shade & drought tolerance, longevity, seeding. Edits re-grow the stand live. You author the model; you don't read data.

Add a plant

System — how the layers act on each other

The stand is a coupled ecosystem: shade, water, dead matter, fungi and the herb layer each feed the others and feed back on the trees. Dial any interaction and watch the cascade re-grow. Read each field's area of influence with the Overlays in the Sheet tab.

Layers — how the stand becomes ink

Ink & boldness

Push the whole drawing from delicate to full graphic boldness. These scale every mark at once; each rule still has its own controls below.

The layer stack

Like layers in a drawing app: the eye shows/hides a layer, ▲▼ reorder it, opens its settings (rename, driver, sliders), deletes it. Each layer turns one signal — the crowns, or a derived field — into marks or a Material (an image you pick or import). The legend under the drawing follows this stack.

Time & disturbance

Horizon & drought
Drought window

A drought drops moisture site-wide for a spell — the hatch thins and gaps open, then it recovers.

Ink

Sheet & tiles

Page shape

Presets set the aspect; type exact pixels for a specific sheet. The drawing re-fits and every mark redraws to the new page — the sheet is exactly the pixels you type (240–2400), never rounded to a whole number of tiles.

Print plate (export size)

A print is a scale, not a bigger sheet. Compose at a screen-sized sheet; the plate renders that same drawing at exact print pixels, so every mark keeps its physical size on paper. (A literal 3900 × 5700 working sheet would put ~40× more stipple on screen and crawl.) Picking a plate re-shapes the sheet to its aspect, so what you compose is what prints.

Tile density

How fine the conditions grid (and every mask edge) is: smaller cells = denser, more detailed tiling; larger = coarser and faster. The stand itself lives in metres, so this only changes how finely it's sampled — resizing re-derives, it never re-grows or breaks. A Material’s tile SIZE is set per layer in Layers.

Underlay overlay

Tint the sheet by which layer dominates each cell, or by moisture, to read the growth — a diagnostic wash under the ink.

Method, algorithms & data sources

The pipeline. A stand of individual trees (the Plant tab — Wilding's model) grows in continuous world metres: each year every stem competes for light, grows its crown, may die, and seeds in. That stand is the single source of truth. To draw a given year, each stem's crown is splatted onto whatever grid the Sheet asks for (page shape × grid resolution), producing per-cell driver values — bare, pioneer, thicket (mid), canopy, cover — with moisture, water and mycelium painted on top as authorable overlays. Each layer maps a signal to a mark family (vector marks or a Material — an image fill you pick or import). One geometry pass emits abstract primitives (dots · segments · paths · masked textures); two backends draw them — Canvas2D for the live scrub, SVG on export — so the plot always matches the screen. Because the stand lives in metres and the grid only samples it, the simulation and the drawing line up at any resolution and a resize re-derives without re-growing.

The algorithms.

  • The stand — individual-based succession (Wilding's model) — real stems live at continuous (x, y) in metres, each with a crown radius that grows toward a species ceiling. Each year, within a fixed ~5 m competition bucket the tallest stems shade the shorter (light = e−k·crown-above, Beer's law); growth is scaled by that light raised to (1−shade tolerance), a Gaussian moisture match, and local fertility; stems die from age, suppression, crowding and windthrow; mature stems seed in by dispersal (with mast-year pulses for heavy seeds), and sown species keep a low seed rain, with establishment gated by ground light, moisture, seed mass, and the feedbacks below. Deterministic (seeded mulberry32); Reseed draws a different possible future. Every species parameter is editable in the Plant tab. To draw a year, each crown is splatted as a smooth radial kernel onto the current grid (cover = 1−e−β·occupancy, mass-conserving so it reads the same at any resolution), then split into pioneer / thicket / canopy by the stems' successional roles. v2: seedlings inherit their parent's realized shade/drought/growth traits (regressed toward the species mean by a heritability knob) plus a mutation draw, so under selection each lineage adapts to its microsite over the decades (watch the Evolution strip); establishment also carries a Janzen–Connell conspecific penalty, allelopathy from interfering species, and niche partitioning that eases interspecific crowding. Life-forms beyond trees — shrubs, grasses, wildflowers, ferns — are the same individual-based stems with small crowns and low height, so tall trees overtop them through the ordinary competition; a form tag only changes how each is drawn (a grass tuft, a fern's fronds, a shrub clump) and labelled. Add or delete plants and recolour any of them in the Plant tab. Your whole scene autosaves to this browser and reloads with you (plus named saves). A stylized teaching model over a small, illustrative plant pool — a real selection-plus-inheritance loop, but hand-tuned and not certified ecology.
  • The coupled ecosystem (the System tab) — alongside the trees, a stack of cell fields is stepped each year and they act on one another: canopy crowns cast shade (ground light = e−shade·crown-density); light + moisture + fertility set the undergrowth ceiling (so the herb layer thins under canopy and floods the gaps); canopy and undergrowth drop litter, and dying trees leave deadwood (nurse logs); decomposition of that dead matter — faster where it is wet, shaded and colonised — releases fertility back into the soil (the nutrient cycle); mycelium grows on shade × wet × dead-matter, spreads by diffusion, then retains moisture and helps seedlings (mycorrhizal feedback); moisture = soil + water-proximity + canopy/mycelium retention − tree transpiration − drought. Painting the ground now steers the stand (trees grow where it is wet, not on a global dial), and every arrow above is a strength you set in the System tab; the Sheet-tab Overlays read each field's area of influence. Also stylized — grounded feedbacks, illustrative numbers.
  • Crowns (per-tree ink) — the default mark, and the tightest tie between the plants and the drawing: every living stem's crown is inked in place — pioneers stippled, thickets single-hatched, canopy cross-hatched — clipped to the crown circle and thickening as it grows. Deterministic per stem (seeded from its fixed world position, so a crown's texture is stable while its radius expands). Because it reads the same stems the fields are splatted from, a cluster of trees makes a cluster of ink — the hatch is the stand. The field marks below (stipple/hatch/cross on the derived bare/pioneer/mid/canopy fields) remain available as looser, cartographic alternatives.
  • Materials — a layer can tile a chosen image (the built-in Graphic Textures library, or your own imports kept in a persistent Mine group), keyed so its black marks become ink and its white ground goes transparent, then masked to where its driver is present so it grows in with the years. One primitive per rule; the SVG export embeds the tile as a data-URI <pattern> + a per-cell <mask>, so the plate matches the screen.
  • Water distance — a multi-source breadth-first flood-fill (BFS) from painted water cells; near-water ground is wetted by an exponential decay of that distance.
  • Stipple / poché — points on a fixed jittered lattice, kept when the driver exceeds each point's stored random threshold (a Poisson-disk-like fill that grows as the driver rises, never re-scatters). Poché uses big overlapping filled disks above a threshold → a solid mass with an organic edge.
  • Line hatch & cross-hatch — parallel lines swept across the sheet, each clipped to the canvas (Liang–Barsky) and broken into segments where the driver is present, with per-line angle jitter + a sine wobble so it reads hand-drawn, not like graph paper. Cross-hatch is two passes at ~78°.
  • Flicks & crossed dashes — short oriented strokes on the lattice; riparian band = shore-parallel ticks whose direction is the gradient of the water-distance field.
  • Mycelium web — the space-colonisation algorithm (Runions et al. 2007): filaments grow from wherever the mycelium field is rich (that field is itself grown by the coupled ecosystem — shaded, damp, dead-matter-rich soil — plus any seed you paint) toward vegetated attractors, branching and thickening with the years.
  • Randomness — a seeded mulberry32 PRNG + hash-based value jitter, so every drawing is deterministic and reproducible.

Data sources. None external — this is a designer-authored, stylized model: the site and seed mix are what you set in the Plant tab, the succession is the individual-based model above (illustrative, editable trait values, not cited ecology), and water/soil/mycelium/marks are drawn, not sensed. Nothing here should be read as certified ecology or hydrology.

engine self-tests: …

Grove — prototype · standalone · zero dependencies. Wilding × Hatchling, unified: Wilding's individual-based stand (what grows) inks itself through Hatchling's mark grammar (how we draw what grows) — one live drawing, no wager, no reveal. Its parents stay live at /wilding and /hatchling for comparison. Engine written as pure modules (grove-engine · grammar · render · verify) that map 1:1 to a platform port.