SUBSTRATE // BUILD GUIDE // DOCUMENT 09-G

How this
was built.

One WebGL dot-grid terrain, two typefaces, three colors, zero photographs. Everything below is the real system — same shaders, same tokens, same code that runs the site one route up.

[ 01 ] Concept

CREATIVE DIRECTION

Substrate is a fictional infrastructure company selling "compute, sedimented" — deterministic compute strata for machine cognition. The metaphor drives every decision: deploys are geological events, rollbacks go down through layers, events propagate like seismic waves.

The site takes the dev-tool aesthetic to its logical extreme: terminal-native, decoration-free precision. Carbon black ground, ash annotations, one violent accent — electric lime — used only where data is alive.

The single organizing idea is the dot-grid terrain: ~31,000 GPU-instanced points forming a landscape that is literally the data made topographic. It ripples away from the cursor, and it re-forms itself as you scroll — mountains for the hero, sedimented terraces behind the terminal, a bar-chart ridge under the benchmarks, a dead-calm plane at the footer.

Motion grammar is enforced sitewide: 0.2-second snaps, scramble-decodes, damped mechanical interpolation. Nothing floats. Nothing eases longer than 0.4 s. Zero marketing softness.

[ 02 ] Palette & type

DESIGN SYSTEM · TOKENS

Carbon#07090A · ground
Ash#9AA3A0 · annotation
Signal#E9EDEA · headline
Electric lime#C8FF00 · live data only

Archivo — variable width axis, 62 → 125

Compute, sedimented.

Compute, sedimented.

Compute, sedimented.

Martian Mono — every annotation, readout and terminal glyph

0123456789 · σ Δ ▸ ● ▚ — cold start 41 ms · p99 8.3 ms

Headlines run at width 125 (fully expanded), weight 800, uppercase. Body copy condenses Martian-adjacent Archivo to width 87.5 for density. The lime is rationed: status dots, index numerals, wavefronts, nothing else.

[ 03 ] The terrain

SIGNATURE TECHNIQUE · LIVE

Live — move your cursor across it. Switch topography:

One mesh, zero CPU deformation

The field is a single THREE.Points mesh — a flat grid of ~31k vertices uploaded once. Every frame, the CPU sends only a handful of uniforms: time, a 4-component state weight vector, a 12-slot ripple ring-buffer, and the cursor's world position. All displacement happens in the vertex shader.

Each topography is a pure height function of the point's XZ position: ridged fBm for mountains, quantized fBm for sediment terraces, hashed gap-separated columns for the bar ridge, low-amplitude interference for the calm plane. The visible terrain is their weighted blend — so morphing between sections is just damping four floats toward a new target.

Ripples as a ring buffer

A cursor move (throttled to ~8 Hz) or click writes (x, z, birthTime, amplitude) into the next of 12 ripple slots. The shader evaluates every live ripple per vertex: an expanding ring with a Gaussian wavefront, exponential decay in both time and distance. Ripple energy also feeds point color and size — the wavefront literally glows lime and swells as it passes through the grid.

Scroll position never scrubs the terrain directly. Each section sets a target state; a damped exponential (settles in ~0.35 s) chases it. That is what makes the morphs feel mechanical instead of floaty.

src/shaders/terrain.vert.glsl — the actual blend + ripple field
float h = 0.0;
if (uWeights.x > 0.001) h += uWeights.x * hMountains(p);
if (uWeights.y > 0.001) h += uWeights.y * hTerraces(p);
if (uWeights.z > 0.001) h += uWeights.z * hBars(p);
if (uWeights.w > 0.001) h += uWeights.w * hCalm(p);
h *= uAmp;

// ripple field: damped expanding rings
float glow = 0.0;
for (int i = 0; i < 12; i++) {
  float dt = uTime - uRipples[i].z;
  if (dt <= 0.0 || dt >= 5.0) continue;
  float r = distance(p, uRipples[i].xy);
  float d = r - dt * 4.2;              // wavefront radius
  float env = exp(-d * d * 0.55)       // ring thickness
            * exp(-dt * 1.1)           // time decay
            * exp(-r * 0.05)           // distance decay
            * uRipples[i].w;
  h    += env * sin(d * 2.6) * 1.35;
  glow += env;
}
src/terrain.js — states are four floats; morphing is damping
const STATES = {
  mountains: { w: [1, 0, 0, 0], cam: { y: 6.9, z: 15.6 } },
  terraces:  { w: [0, 1, 0, 0], cam: { y: 6.1, z: 14.6 } },
  bars:      { w: [0, 0, 1, 0], cam: { y: 7.8, z: 16.2 } },
  calm:      { w: [0, 0, 0, 1], cam: { y: 3.4, z: 13.2 } },
}
// per frame — settles in ~0.35s, mechanical not floaty
const k = 1 - Math.exp(-dt * 9)
uniforms.uWeights.value.lerp(targetW, k)

[ 04 ] Asset pipeline

ZERO AI IMAGES · BY DESIGN

This site ships no generated imagery at all — the brief demanded pure WebGL and typography, and the constraint is the point: every pixel of atmosphere is computed, not composited.

  • Terrain — procedural, in-shader, this page and the home page.
  • Grain — inline SVG feTurbulence, data-URI, ~300 bytes.
  • Favicon — hand-written SVG: dot grid, one lime displaced point.
  • Fonts — Archivo (variable wdth 62–125, wght 100–900) and Martian Mono (wght 100–800), self-hosted woff2 via the repo's getfont tool.
  • OG image — a rendered frame of the hero terrain, captured from the build's own QA screenshot harness and cropped to 1200×630. The share card is the product.
  • Terminal session — scripted DOM typing, no video, no gif.

[ 05 ] Iteration diary

THREE PASSES · LOGGED

PASS 1

Structure

Full build stood up, then the screenshots argued back: the headline overflowed at every width, the terrain was rendering at near-invisible additive brightness, and the benchmark bars were animating a zero-width flex box. Retuned the type scale, the point colors and alpha floor, and rebuilt the bars as absolute fills. Kept the mobile guide under the 8k-pixel capture ceiling.

PASS 2

Craft

Art direction pass. The mountains got flank-weighting — calm behind the headline, towering at the edges — and the camera dropped so ridgelines climb into the hero's negative space. Killed a ghost artifact: the grid column at x = 0 aligned with the camera axis and 150 additive points stacked into a fake vertical line — fixed by baking yaw into the geometry. Stitched the grain tile seams, unstretched the install box, rendered the OG frame from the site's own hero.

PASS 3

Complexify & refine

Hostile-critic pass. The terrain's state machine was doing its best work invisibly — so it got a TOPOLOGY readout that scramble-decodes to the new height function on every morph. The primitives sector's flat plateau became a visible interference field. Terminal replay was rewritten with token cancellation so it can never race an in-flight session, and the small annotation text got a contrast bump.

[ 06 ] Credit

COLOPHON

Designed & built autonomously by Claude Fable 5 (Anthropic) — one of fifteen sites in a single autonomous build run.