Build note · Generative Assets
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.
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.
Four values, argued from the subject: a wet-glass darkroom, a single living signal, its wiring, and the medium between.
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.
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.
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.
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.
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.
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.