Motion
The sphere is a being; the two lobes are its intelligence, free to become whatever says what is happening. The living mark below is what the app runs. Further down, the older renderer that still carries a few one-shot moments.
Thinking and speaking, from scratch
The first pass's thinking and speaking were rejected as unnatural, so both were redone as eleven living prototypes on the same engine: lobes that bud, neck, let go, merge and splash like a liquid, with mass, drag and surface tension, and a voice drawn only from the measured level. They were judged on how natural they feel first, then on elegance, then on whether three fresh viewers read them from unlabelled frames, and each against what was live before the first pass: the bar is to be clearly better than that, or the earlier form returns. The shipped form, the earlier one and two runners-up of each are kept here; the voice is simulated.
To ship a runner-up instead, set thinkAs or speakAs in web/src/lib/living-mark.ts and make it pass check-living-mark.mjs, which holds whichever ships to the same laws; today the runners-up do not yet (mercury fails six, ripples two, bubble one). Leaping passes (made to on 2026-10-05), and so do the writing dots that replaced it on 2026-10-06.
Thinking
Speaking
The being and its intelligence
The sphere is the being: it keeps its place, its size and its light through everything. The two lobes are its intelligence, and they are free to become whatever says what is happening, so a person can tell what Sathi is doing without a caption. At rest they are the exact logo. Every change bends from wherever the lobes are, with their speed, into the next form; nothing waits on the logo between states and nothing finishes a lap.
Breadth first: the same trace in four grammars
One simulated sequence (a voice request, work, a search, a wait on your approval, a spoken answer, home), and a second one stopped while working, drawn at the same size by the same engine in four grammars. Three are comparisons; only the first is what the app runs. The events are scripted and the voices simulated.
- 1. at rest
- 2. hears a request (simulated voice)
- 3. works on it
- 4. looks through your things
- 5. waits on your approval
- 6. answers aloud (simulated voice)
- 7. home
The trace as stills
Every 1.2 s of the first trace, computed by stepping the engine at 60 Hz from the start: frames show what motion hides.
Why free forms
| Grammar | States apart (mean) | Closest two states | Thinking motion at 22 px | Ink flicker while thinking | Home after a cut |
|---|---|---|---|---|---|
| Free forms — chosen | 0.46 | 0.17 | 0.4 px/s | 0.02 | 0.32 s (at most 0.32 s) |
| Posture — comparison | 0.21 | 0.00 | 5.9 px/s | 0.03 | 0.63 s |
| Assembly — comparison | 0.39 | 0.08 | 21.6 px/s | 0.10 | 0.65 s |
| Beads — as shipped before | 0.37 | 0.00 (no waiting pose) | 20.7 px/s | 0.03 | 0.68 s |
States apart is one minus the overlap of two states' reduced-motion silhouettes, averaged over rest, listening, thinking, searching, waiting and speaking; 0 means two states look the same. Thinking motion is the mean speed of the lobes' samples and of the drops they let go of at a message-row size, flicker the variation of visible ink. Posture is the calmest but says the least: thinking and searching are one picture. Assembly and the beads say more but move far more where people read. Free forms say the most, move the least and come home fastest (home is the slowest of 80 cuts for the comparisons; for free forms, the median cut and, in brackets, the slowest). This is a geometric proxy; the thinking and speaking forms were also read from unlabelled frames by three model viewers (above), and a recognition test with people is still owed.
The older renderer
SathiMarkMotion, kept for single deliberate moments (the capsule's press, the mail sync glyph, the native welcome, the door chapters, the residence drawing, the sign-in invite). Every state here passes through the exact logo once a cycle. Its lens is where the living mark's searching form came from.
Geometry layer — the logo is redrawn
Each frame re-evaluates r = r₀·e^(θ·lnφ/(π/2)) with different numbers, so these are not the logo being pushed around — every in-between frame is a real golden spiral the generator would have shipped. Two of the three parameters are free under the 2% footprint law: the lobe is normalised to its reach, so the arm can coil and uncoil without the mark growing by a thousandth of a unit.
Capability layer — the lobes stop being lobes
The sphere is a sentient being and the spirals are its intelligence and its tools — that is the whole doctrine, and everything else is an add-on. The lobes become whatever the being needs (a tool may even root under the body: a wing, a tail), so long as the loop brings them home. Each of these leaves the logo, does a job, and returns to the exact path the favicon uses.
Examples, not the set. Every one of them is a SWEEP — an angular run, an outer radius, an inner radius — which is the engine that keeps the morphs fluid and correspondence-free. Since v8 the sweep is machinery, not aesthetics: a shape earns its place by being instantly nameable, and the best ones here ignore the spiral entirely. Mechanism in src/lib/capability-shapes.ts; adding one is a function, not a rebuild.
Attending — the sphere is an entity
The arm un-draws into its tail, tucks behind the pupil, and the almond eye is born hidden and scales out around it — the being draws its intelligence in and re-expresses it. Thin strokes, corners meeting on the midline, the pupil floating in the dark aperture; blinks squash only the aperture and ride the saccades. Rebuilt to the designer's frames, measured to the unit, after the first build was judged much worse — and was.
Transform layer — the logo is moved
The original nine, on the Web Animations API. Still the right tool for most states: a breath is a scale, and nothing is gained by re-cutting a curve to do it.
flappy — at the sizes it has to survive
flappy — the morph, as stills
One cycle, sixteen frames, evenly spaced. This is how the reference animation was read — frames show what motion hides. Look for the gather: the arms should draw in before they change and grow back out, rather than tweening across at full size.
The parameter space, held still
Every geometry state above is a walk through this box. Drag to see where the edges are — the point at which an arm stops reading as an arm is a design fact, and it is easier to find with the frames standing still.
{"k":0.45,"reach":450,"biteR":258}
The same mark, doing jobs
Continuity is not felt on a swatch card. It is felt when the thing that thinks in the header is the thing that waits in the button and the thing that listens in the composer — the same geometry, at 16 and 20 and 28px, never a second icon set.
No microphone glyph, no waveform. The mark opens.
Where every product in the world puts a spinner.
The two are the same path at rest — that is the contract.
Where a caret would blink: the arm sending its packets is the text arriving.
Reach is what the network takes; the self stays lit. No cloud with a slash through it.
Immediately obvious, which is the designer's argument in one tile: eyes need no caption.
The being wears its tools — a bird, at three sizes
The body IS the disc — the being itself, untouched. A membrane wing pinned at a shoulder inside the body heaves and tucks; a forked tail opens left; a beak points right; so the bird faces right, like the side-scroller the example always was. It arrives through the self: the arms melt into the dot, and the bird grows back out of it.
The bob is a CSS translate on the wrapper — the only motion on this page that is not the mark's own geometry, and it is outside the mark on purpose.
On dark, and inverted
Provenance. boot, retry, stream, offline, recurse, the look family and the rebuilt sync all arrived as suggestions in a designer's library of thirty-three (media/sathi-motion-library.html), translated into this geometry rather than copied. v6 records the first reading; v7 records the correction — the rules were a starting point, the sphere is an entity, and two of v6's declines were wrong — in brand/MOTION_v1.md.