Vitrine

No.005 Soul Particles

Open the panel

Soul Particles is a canvas specimen in this vitrine: a line of type broken onto a grid of dots, each springing back to its place, parting as the pointer passes. It exposes 21 parameters, runs continuously, and was added on 15 September 2026.

Anatomy

KindCanvas
Lifecycleambient
Motioncontinuous:spring+pointer
Stage rolesubject
Themeslight · dark
Parameters21
Added2026-09-15

Every parameter, and why it is set where it is

Each of the 21 parameters below is a real control in the panel. The reasoning is first-hand: where a bound comes from a measured property of the work, that measurement is named.

Mark

Wordmark text

default SOUL PARTICLES

The mark is the subject, so it has to be editable — a specimen whose subject is fixed is a picture, not an instrument. It is uppercased on the way in rather than by the caller: the grid is uniform, and lowercase letters put descenders below a baseline the framing knows nothing about.

Ink ink

colour, default #e9e9ee (dark) / #16161a (light)

Ours, not inherited. Every dot takes the colour found at the pixel it sampled, so this is the only colour in the work — the reference reads mid-grey because that is the colour of its own logo, which is not ours to ship. Split per theme because a single ink cannot sit on both grounds.

Lettering

Weight fontWeight

100–800, default 700

Weight is the density lever that costs nothing: a heavier stroke covers more grid cells, so the same gap yields more dots. Reaching for a smaller gap instead multiplies particle count quadratically for the same apparent density.

Tracking tracking

-0.05–0.3 em, default 0.02

A wordmark set to fill its box gets tighter as the text grows longer, and at this size the counters of a mono face start to close up. A little positive tracking holds them open. The default is small because the reference mark is a single tight run of letters and widening it would stop reading as one word.

Sampling

Grid gap gap

2–16 px, default 4

Read from the source: the sampling stride is four device pixels in both axes. It is the single strongest lever here — particle count falls with its square, so doubling it quarters the work. Below three the dots begin to touch at the default size and the mark stops reading as dots.

Dot size dotSize

1–10 px, default 2

Read from the source, where it is a diameter: the dot is drawn with half of it as the arc radius. Half the grid gap is the value at which dots meet edge to edge, so the default sits at exactly half — dense enough to read, open enough that the grid is visible as a grid.

Alpha floor alphaFloor

0–200, default 0

Read from the source, where the test is strictly greater than zero — any cell the glyph so much as grazed earns a dot, and it keeps the faint alpha it was grazed with. That is where the soft edge comes from: no dot is anti-aliased, the entire edge lives in the opacity of individual dots. Raising this carves the mark back to a hard silhouette.

Frame

Room across widthFactor

1–3 ×, default 1.5

Read from the source, where the canvas is made this much wider than the box the mark is fitted into. The margin is not decoration — it is the room dots fly into when shoved, and at 1 they pile against the edge instead of scattering.

Room above heightFactor

1–5 ×, default 3

Read from the source, and it is double the horizontal figure. A wordmark is wide and short, so the same absolute margin is a larger multiple of its height; the asymmetry keeps the escape room roughly square around the mark.

Mark scale fitScale

0.3–1.2 ×, default 1

Read from the source at the call site, which overrides the component default of 0.8 with 1 for the footer mark. Both numbers exist in that bundle and only one of them is in force — the call site cannot be read without the defaults, nor the defaults without the call site.

Spring

Return rate easeBase

0.005–0.3, default 0.04

Read from the source. Each dot moves a fraction of the remaining distance home every frame, so this is a rate, not a duration — the approach is exponential and never formally arrives. Low values give the long, unhurried gather that makes the opening scatter legible.

Return spread easeRange

0–0.2, default 0.04

Read from the source, where it is drawn per dot on top of the base. At zero every dot arrives on the same frame and the mark snaps into being as one object; the spread is what makes it assemble rather than appear.

Roused rate targetEaseBase

0.02–0.6, default 0.2

Read from the source. A dot the pointer has touched switches to this faster rate and — this is the part worth knowing — never switches back. A mark that has been disturbed stays springier than one that never was, permanently, which is why sweeping across it twice does not feel the same as sweeping once.

Roused spread targetEaseRange

0–0.4, default 0.2

Read from the source, drawn per dot like the base. It is as large as the base itself, so the roused rate varies by a factor of three across the field — the disturbed dots return raggedly rather than as a sheet.

Friction frictionBase

0.5–0.98, default 0.8

Read from the source, applied to velocity every frame. It is what makes the system dissipative, and therefore what makes the mark at rest an attractor rather than one state among many — which in turn is what makes a still of this work reproducible at all.

Friction spread frictionRange

0–0.19, default 0.15

Read from the source. The ceiling here is 0.19 rather than a round 0.2 because base plus spread must stay below 1: at 1 a dot never loses the velocity it was given and orbits its origin forever.

Repel

Reach radiusSq

200–20000, default 3000

Read from the source, and it is a squared length — it is compared against a squared distance, and the linear radius is its square root. Nothing in the original names says so. A consequence the source carries and this port keeps: the reach grows with the square root of device pixel ratio, so it is about 55 device pixels on a 1× display and 78 on a 2×, not 110.

Shove push

0–400, default 150

Read from the source. The impulse falls off linearly from the centre of reach to its edge, so this is the strength at zero distance. At zero the pointer is inert and the work becomes a still mark — worth having as the bottom of the range, since it isolates the assembly from the interaction.

Shove floor pushRandomBase

0–1, default 0.5

Read from the source, where the impulse is multiplied by this plus a fresh random number — so the shove any one dot receives lands somewhere between half and one and a half of the nominal strength. Equal shoves would move the field as a sheet; this is what makes it spray.

Jitter jitter

0–3, default 0.5

Read from the source, added to velocity as noise of this amplitude either way. It is tiny next to the shove and does nothing visible during one, but it is also unconditional: dots under the pointer never come perfectly to rest, which keeps the disturbed region alive while the cursor hovers.

Idle after idleMs

30–1000 ms, default 100

Read from the source. A pointer that has stopped moving stops pushing after this long, which is what lets the mark reassemble under a resting cursor — without it the dots would be held away for as long as the pointer sat there, and that reads as a stuck animation rather than as a held pose.

Where it comes from

United Carriers — footer wordmark technique · confirmed

The mechanism is a verbatim port: grid stride, dot diameter, per-particle spring and friction, the pointer impulse and its squared reach, the oversized canvas, and the alpha test were all read out of that site's production bundle. What is sampled is not inherited — that site samples its own logo, this work samples type it renders itself.

JetBrains Mono font · confirmed

Already carried by this cabinet for No.001, where the glyphs must be exactly as tall as one another. Here the reason is different: a mono face gives the fitted wordmark an advance width that is linear in type size, so filling the box is a search over one well-behaved number.

Take it with you

Open the panel to change any parameter above and watch it apply immediately. From there the work leaves as a link, as source, as a PNG, or as a video.

Open No.005 in the panel