Field notes · floodplain reach 7
OXBOW is a working meander model. A river's centreline erodes its outer banks and builds its inner ones, so every bend migrates; when a loop swings back on itself and the neck closes, the meander is cut off and left as a crescent lake. This page is the survey — palette, type, technique, and the three passes that took it from working to premium.
01 · The concept
A single quiet instrument for anyone who has stared at a satellite image of a lowland river and wondered why it wriggles. Its one job: make meander migration — normally invisible, a metre or two a year — legible, by compressing a hundred years into minutes. You watch bends fatten, banks erode, point bars build, and every so often a neck pinch off and strand an oxbow lake. The plain keeps the record: faint scroll-bar scars mark every channel the river has already abandoned. The register is cartographic and calm — a survey sheet that happens to be alive.
02 · Palette
Read as an aerial map at noon: a green floodplain, silt-laden water, pale sand where the current drops its load, and a dark levee ink for every word. The bright accents stay on marks — the channel, the trace line — while text runs in darker ink tokens so nothing sits below 4.5:1, even over the animated map.
03 · Type
Display · Fraunces · opsz 40–120 · 500–600
A neck pinches off
Fraunces has the warm, slightly literary voice of an old geographical survey — soft terminals, a real italic for emphasis, and optical sizing so the giant "OXBOW" tightens while section heads stay open. The typographic bravery is the italic stranded and lake — the words that name the whole event set apart in the water colour.
Labels · Work Sans · 400–600
YEAR 74 · 2.83× · 4.3 m/yr
Every measured thing — the year count, sinuosity, migration rate, channel length — is set in Work Sans. It reads as instrument output: neutral, tabular, honest against the soft serif, and legible at label sizes over the map.
04 · Technique
No libraries. The river is a polyline of ~300 nodes rendered on a <canvas>, migrating under a simplified Ikeda–Parker–Sawai meander model. Each step computes the signed curvature at every node, then moves the centreline along its normal by an amount weighted by an exponential kernel of upstream curvature — the same physics that makes real bends both grow and lean downstream. Crucially the migration erodes the outer bank (the sign matters: get it wrong and the river relaxes straight instead of meandering). After each step the line is re-sampled to even spacing and lightly smoothed to suppress grid-scale kinks.
The cutoff is the payoff. Every step scans for two non-adjacent nodes that have drifted within a neck's width of each other; when they touch, the loop between them is spliced out of the channel and pushed onto a list of oxbow lakes, drawn forever after as a still crescent that greens and shrinks as it silts in. That's why nothing is scripted — a lake is stranded only when, and where, a neck actually closes. The sinuosity trace on the panel is the honest fingerprint: it climbs as bends fatten, then drops one step the instant a cutoff shortens the channel.
The floodplain is a second, never-cleared canvas. Every year and a half the live channel is stamped onto it at low alpha, so the plain slowly accumulates the ridge-and-swale scars of every position the river has held — the second-read detail, a map building underneath the map. Point bars are drawn from each node's acceleration vector, which points into the concave bank exactly where sand deposits. DPR is capped at 2, the loop pauses when the tab is hidden, and holding the pointer over the map freezes the century so you can study a single moment.
05 · Iteration log
16.5 m per virtual unit so the stated "valley is 15 km" matches the sinuosity maths exactly (channel ÷ valley).scrollWidth ≤ 375.visibilitychange, and a clamped delta stops the century lurching after a tab-away. Removed the redundant valley-fabric strokes (Chanel rule) — the meander scars already carry the texture.