Generative Assets · No. 77 The siteIndex

How it was made

Umbra

A valley printed on the dark, legible only where your lantern rakes across it.

The concept

Umbra is a piece for one reader, in the second person: the page is pitch black and you are the only light. A soft lantern rides your cursor and a relief landscape — hills, a raking ridgeline, a lost house with one ember window — exists only where you shine, throwing long shadows that swing as you move. The story is printed on the terrain itself, so reading is an act of searching. Its single job is to make you feel that the valley is not something you look at, but something your attention keeps in existence.

Palette — argued from a valley at night

Void
#070609
Not black — a hair of violet in it, the colour of a moonless field. Everything unlit falls to this.
Lamplight
#F4E3B0
Warm tallow-candle cream. Carries the printed story wherever the light reaches it.
Warm shadow
#2A2118
The ground half-lit at the pool's edge — brown, never grey. Keeps shadow from reading as absence.
Ember
#C8552E
The one lit window and the hearth sparks. Reserved for marks and rules, never body text.

Following the collection's contrast rule, the bright accent stays on lines and marks — the window, the hearth embers, link underlines — while text uses lamplight or a dimmed lamplight ink, so nothing small ever sits on ember.

Type

Display · Cormorant
Umbra
A high-contrast Garamond descendant with long, searching serifs. Set large, it looks like something carved and then half-forgotten — right for a word you find rather than read.
Text · Spline Sans Mono
you are
the only light
A humane monospace for the whispered directions and labels. Its even rhythm reads like an instrument's engraving against the serif's romance.

Technique

Everything is drawn on a single 2D <canvas> — no images, no WebGL. A deterministic value-noise height-field (rolling hills + a ridged ridgeline + a carved basin, with a little house block and triangular roof stamped into it) is built once at a low working resolution, and its surface normals are precomputed from the height gradient.

The signature is the lighting. Each frame, only the pixels inside the lantern's pool are touched: for each one the code computes a Lambert term (surface normal against the 3-D direction to the lamp, so slopes that face you brighten and slopes that turn away fall dark) times a soft radial falloff, times a horizon self-shadow — a short ray marched across the height-field toward the light; if the terrain rises above the line of sight, the pixel is occluded. That is why the ridge and the house cast long shadows that lengthen and swing as the lamp moves. The result is written as an alpha mask and used to reveal a crisp, full-resolution albedo layer (the terrain material plus the printed story) via a single destination-in composite — so text and ground are only ever as visible as the light on them. A warm additive bloom, a living flame flicker, and embers rising from the window finish the lantern.

If JavaScript fails or the visitor asks for reduced motion, none of this runs: a fully-lit, fully-typeset reader holds the entire story in plain HTML, scrollable and legible. The dark is the enhancement, never the gate.

Iteration log

Designed & built by Sapience Analytics — part of the Generative Assets collection.
Enter Umbra · Index