LICHTENBERG

Generative Assets · Field notes

How it was made

Lichtenberg renders dielectric breakdown — the branching path a trapped charge takes to find ground through a block of acrylic. The figure is grown live on a canvas, not drawn from an image. This page documents the palette, the type, the growth model, and the three craft passes.

The concept

A slab of acrylic is charged until the field inside exceeds what the material can hold. The discharge that follows does not travel in a straight line to ground — it branches, splitting again and again, choosing its path by chance weighted toward the steepest local field. When it arrives it freezes, leaving a fractal fossil of the strike. The page's single job: let a visitor trigger that discharge anywhere and watch the invisible field made briefly, brilliantly legible.

Palette — argued from trapped acrylic

Cast acrylic under a captured discharge is nearly black with a violet cast; the filaments burn cold white-blue. Every colour here is that scene, and the bright discharge blue is reserved for lines and marks only — body copy runs on a derived light ink that clears 4.5:1 on the dark ground.

Acrylic dark
#0A0B12
Ground — the trapped block
Discharge
#B9C6FF
LINE / MARK — filaments, rules, accents
Hot core
#EEF2FF
Leader tips, injection point, headline
Field ember
#8C79E4
Violet field bloom around the origin
Block ink
#C3CADD
Body copy — derived, 11.8:1 on ground
Dim ink
#787E93
Micro-labels — 4.8:1 on ground

Type

Lichtenberg
Bricolage Grotesque · display
A humanist grotesque with an optical-size axis, run heavy and tight for the headline. Its slight irregularity mirrors the discharge — ordered, but never mechanical. Optical size pinned high for the big cuts.
42.0 kV · ∇²φ=0
Space Mono · readouts
Every number, unit and equation is set in Space Mono — instrument type for an instrument page. Tabular figures keep the live readouts from twitching as they count.

Technique — the signature

The figure is a dielectric-breakdown / DLA branching growth on a 2D canvas. From an injection point, six-to-nine leader tips push outward. Each frame every tip advances one step, its heading perturbed by noise and gently biased along the radial field toward ground (∇²φ = 0). At each step a tip may branch — spawning a child at an angle with reduced life — so the tree multiplies as it races out, an avalanche that accelerates then dies at the block's edge.

Every segment is stored with its radius and branch order. Rendering layers three strokes — a wide dim halo, a mid discharge thread, and a hot white core near the origin — onto an offscreen buffer, which is then composited with an additive blurred copy for the glow. At rest the figure faintly pulses, and every few seconds a re-ignition ripple of brightness sweeps outward along the branches — the block quietly recharging. Live readouts report filament count, reach, branch order, and the 1/r potential under the cursor; a mini-histogram plots branch density against radius.

Reduced-motion visitors get the full figure grown synchronously and held static — no loop, no pulse — so the page is never blank and never moving.

Iteration log

Pass 1 · Craft

Spacing, contrast, colour balance

Re-read the render top to bottom and drove a discharge to check the figure actually grew.

  • The bright #B9C6FF read fine on lines but I confirmed it fails as small text on the dark ground — demoted it to lines/marks and set all body copy in a derived #C3CADD (11.8:1), micro-labels in #787E93 (4.8:1).
  • Tuned the type scale — headline optical size pinned to 96, editorial to 48 — so Bricolage's heavier cuts stayed crisp rather than muddy.
  • Balanced the readout bar rhythm and gave the acrylic stage an inset bevel so the block reads as a physical object, not a flat panel.
Pass 2 · Depth

Enrich the signature, add a second read

Drove repeated discharges and watched the resting state settle.

  • Added the re-ignition ripple — a band of brightness that sweeps outward along the frozen branches every few seconds, the second-read detail: the block looks recharged and ghosts the strike.
  • Split rendering into halo / thread / hot-core passes with an additive blur bloom, so the discharge glows like it's lit from within rather than being a flat stroke.
  • Made the cursor readout a live 1/r potential in kV — the micro-interaction that rewards moving near the injection point.
Pass 3 · Hardening

375px, reduced motion, performance

Tested the layout at 375 / 768 / 1440 and drove the reduced-motion path.

  • Confirmed the canvas sizes to its container, DPR is capped at 2, resize regrows a fitted figure, and the rAF loop pauses on document.hidden.
  • Reduced-motion renders a complete figure statically — verified it draws, not blanks — and interaction regrows synchronously.
  • Removed a redundant second glow ornament (the Chanel rule) and did a final copy read; capped the filament count so growth stays smooth on modest hardware.
Designed & built by Sapience Analytics — part of the Generative Assets collection.
Named for Georg Christoph Lichtenberg, who mapped these figures in dust in 1777.