IN VITRO

Build note · Generative Assets

How the culture
was cultured

IN VITRO is a fictional lab studying a dish of cortical neurons grown on a multi-electrode array. The page has one job: let a visitor poke a living network and watch — and hear — a spike cascade across it. Everything is computed live from a small neural model on a single canvas; nothing is recorded or scripted.

01 Concept

A cultured network sits poised at criticality — the branching point where one spike triggers, on average, one more. Below it, activity dies; above it, the dish seizes. Held right at the edge, avalanches of every size coexist and their sizes fall on a power law. The dish self-tunes to that edge, crackles like light rain as it idles, and answers a poke with a burst that sweeps the glass.

02 Palette

Four values, argued from the subject: a wet-glass darkroom, a single living signal, its wiring, and the medium between.

Dish black
#0A0D10
The unlit medium. Near-black so a single spike reads as light, not colour.
Neuron cyan
#5AD1E0
The firing signal — calcium-indicator glow. Reserved for marks and the big display, never small body text.
Synapse violet
#B07FE8
The wiring and the travelling charge — a second hue so the pulse crossing a gap is legible against the flash.
Membrane
#161B20
Panels, rules and the dish rim. Cool grey-teal, one step off black.

Body text runs on a dedicated light ink (#E7F0F2) with dimmer tiers for labels, so nothing small ever leans on the bright cyan and drops below 4.5:1.

03 Type

A dish that fires.
σ → 1.00   ·   last avalanche 66 spk   ·   CH-19
Archivo at width 125 / weight 900 for the wordmark; IBM Plex Mono for every number, channel and readout.

Archivo is a grotesque built for signage — at expanded width and black weight it reads like a lab stencil, clinical but alive, which is the whole tension of the subject. The one act of typographic bravery is the hero set solid at line-height .86 with the verb "fires." glowing cyan, so the wordmark itself looks lit. IBM Plex Mono does the instrument work: tabular figures for the live σ, firing rate and avalanche counters, and the electrode-channel table.

04 Techniques

The signature — one poke, one cascade

The hard part was measuring the avalanche honestly. Because the idle dish never falls fully silent, a naïve "wait for quiet" detector treats the whole session as one endless burst. So every spike instead carries the id of the cascade that caused it: a spontaneous spike opens a new id; a spike triggered by a pulse inherits that pulse's id; a burst is booked only once all of its pulses have landed. A poke tags a whole disc of cells around the tap with one shared id, drops them supra-threshold, and briefly raises excitability — so the front fires together, propagates outward through the synapses, reverberates as adaptation and refractoriness chase it across the glass, and is recorded as a single event of a few hundred spikes. That number feeds the live σ readout and the log–log histogram, and the same spikes drive the clicks. Seen and heard at once, from one model.

05 Iteration log

Pass 1 · Craft

Make the idle dish alive and legible

The first build sat nearly silent at rest — the readout showed 0 Hz and the dish looked dead until poked, which undersells "crackles like rain." Raised the spontaneous drive to a steady drizzle and made seed injections reliably cross threshold, so the culture idles at a gentle few hertz. Lifted the resting neuron brightness (base 0.22 → 0.28) and hub tint so cells read as a network even between spikes, and confirmed body copy runs on light ink rather than the cyan accent to hold contrast.

Pass 2 · Depth

A real avalanche engine, plus second-read details

Enriched the centrepiece where it mattered most: replaced the broken quiescence detector with causal, id-tagged avalanche tracking so the σ readout and the live log–log histogram reflect the actual simulation, and switched the histogram to contiguous octave bins so the power-law falloff reads cleanly. Added a rhythmic pacemaker hub that beats every couple of seconds — the same cell the electrode table calls CH-19 "pacemaker", a detail you only notice on a second watch. Added a poke shockwave ring and a cursor-proximity shimmer as micro-interactions, and tuned the pulse trails so charge visibly crosses each synapse.

Pass 3 · Hardening

No seizures, no clipped focus, no overflow

Pushing the network toward σ = 1 exposed a runaway: a strong poke could ignite sustained firing that never calmed (hundreds of hertz). Added spike-frequency adaptation and a conservative gain ceiling so every burst self-terminates back to baseline. Removed one ornament — the redundant "Recording live" dish label, since the firing-rate readout already says as much (Chanel rule). Fixed the keyboard focus ring being clipped by the round dish (switched to an inset outline), added scroll-margin so the sticky masthead never crowds a heading, and gave the pulse buffer a hard cap with honest bookkeeping. Verified at 375 / 768 / 1440 with no horizontal overflow and the wordmark and nav fully inside the viewport; the reduced-motion path renders a settled network with the audio muted.