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.