The Durian Exchange
← back to the floor
Field Notes · Build № 15 · DAINER.AI

How the board was built.

One deadpan idea — price durian like a stock market — and one hard rule: every number on the floor must come from a single seeded simulation, not a pile of static markup. This is the brief it received, the technique that carries it, and what three passes of hostile self-critique caught and fixed.

01

The brief received

Concept
A deadpan-serious commodity exchange for durian — live board, variety indices, harvest futures — run with the gravity of a stock market. Fictional brand; real craft.
Palette
ledger cream ink husk green alarm red
Type
IBM Plex Serif for display, Space Mono for the board and figures. Serif carries the gravity; the mono carries the numbers.
Signature
A live data instrument: a ticking price board, sparkline charts and a season clock, where every figure derives from one seeded market simulation.
Interactions
Hover or key a row for its dossier · a market-open bell · sort and filter the board · one row is always suspiciously volatile.
Mood
Deadpan, precise, faintly absurd.
Voice
Financial wire copy about fruit. Museum-label metadata. No exclamation marks, no marketing adjectives.
02

The signature: one seeded market

The whole floor runs on a deterministic pseudo-random generator seeded once with the hex literal 0x0D24C0DE — "D24 code". From that single seed, eleven grades evolve as mean-reverting random walks: each tick pulls a price gently back toward a slowly-drifting seasonal mean, then adds a Gaussian shock scaled by that grade's own volatility. Kucing Tidur's volatility is set absurdly high, so it is the row that is always halted.

Nothing is hard-coded. The composite index, the three sub-indices, the sparklines, the ticker tape, the blotter, the futures curve and the aroma meter are all read off the same running numbers. The board is pre-warmed 40 steps before first paint, so the market opens mid-session — already alive.

Specimen · seeded walklive
A live walk from the same generator the floor uses — reload and it retraces exactly. Determinism is what makes a fiction feel like a real place.
// one generator seeds the whole exchange
var rnd = mulberry32(0x0D24C0DE);

// each grade: mean-revert toward a drifting seasonal mean, + a shock
var mean  = v.base * (1 + 0.04*Math.sin(STEP*0.017 + v.base));
v.price += theta*(mean - v.price) + v.vol*v.base*0.011*gauss();

// the composite is just the basket, read off the same prices
function dciValue(){
  return 1000 * sumPrices(V) / sumOpenRefs(V);
}
Excerpt from index.html — the mean-reversion step and the index derivation, verbatim.
03

The critique passes

Pass 01 · first draft, read cold

Flat lines and empty corners

  • The three sub-index sparklines were flat then spiked — their history had been primed with identical values. Fix: reconstruct real history from each member grade's own price series.
  • The hero left a large dead zone above the composite panel. Upgrade added: a live trade blotter printing timestamped fills, and a rotating Notice to Members plate beside the morning note.
Pass 02 · materiality and legibility

The grain only covered one corner

  • The paper-grain overlay had no explicit size, so it rendered at the default 300×150 and textured only the top-left — a faint ghost rectangle. Fix: size it to the full viewport, so the whole ledger reads as paper.
  • Upgrade added: an Aroma Index — a deadpan pungency meter in "parts per stall" that tracks the premium basket and sells the tagline the only exchange you can smell.
Pass 03 · push the instrument deeper

Make the chart answer back

  • Verified the fixes held at 1440, 768 and 390, plus a reduced-motion pass that renders a complete, static board.
  • Upgrade added: an interactive crosshair readout on the composite chart — hover or touch to read the index at any point. The signature is a data instrument, so it should reward being read.
Pass 04 · resumed build, read cold again

A dead corner and a broken column

  • The morning-note section left a large empty corner under the Notice to Members. Upgrade added: a live Session Summary — advancing / declining / unchanged / halted counts and the most-active grade, read off the same seeded state, with a breadth bar that splits green to red on the tick.
  • At 390px the note block stayed a two-column grid, cramping the note into three-word lines and colliding its label with the index stamp. Fix: collapse it to one column below 900px. Buttons given explicit types and the filter chips given aria-pressed state.
04

Craft floor — all cleared

Real copy only — financial wire voice, banned words respected
One easing var (expo-out) used for everything
Paper grain across the full page; accent-tinted ::selection
Emoji-free SVG durian favicon, distinct per site
prefers-reduced-motion leaves a complete, readable board
Keyboard path + visible focus on rows, headers, chips, bell
Verified at 390 / 768 / 1440; primary actions in thumb reach
Zero console errors in every harness run
Self-contained: no external images, no framework, no build step
Page weight printed on the floor as a live stat