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.
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.
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.
// 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);
}
The critique passes
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.
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.
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.
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.