Sound is the last signal, not the first. Milo speaks with type, state and motion; a cue is added only where the eye may be elsewhere. Six signature events survive, each one designed as a single composition of motion, sound, haptic, colour and language — and most of what Milo does makes no sound at all.
Each one is a single composition — visual, motion, sound, haptic, colour and language designed together, never as separate tracks. The sound is derived: Milo is named after a golden lion tamarin who had one leg and was the fastest of the tamarins, so the arrival cue is fast and deliberately uneven. Nothing here imitates an animal, and nothing is loud: the whole set sits between −26 and −20 dBFS.
VermilionMilo the intervention. Short, fast attack, dry, precise, a small organic tail.
MossOffline the environment. Lower, softer, rounded — felt rather than announced.
DitherTranslation. Granular texture resolving toward clarity and toward silence.
SilenceOrdinary progress, every subtask, every keystroke. The larger half of the system.
Interruption level decides the volume, not the difficulty of the work
SILENTOrdinary progress. Milo understands, Milo acts, work hands off between machines.no sound · no haptic
AMBIENTState available when the person looks. Milo recedes, a local resource is ready.−26 to −23 dBFS
NOTICEA state change to register now: an invocation answered, or a meaningful completion.−24 to −20.5 dBFS
INTERRUPTA human decision is required before work continues.−20 dBFS · two events
CRITICALDestructive, security, or high cost. Lower and longer — never louder.−20 dBFS · three events
Budget: four cues a minute, shared between sound and haptics. The fifth is suppressed in both channels and the visible state still shows. Approval is never suppressed. Source: tokens/sound.json.
The set26.2
Play them. Then turn them off and check nothing is lost.
Each button plays the real file from assets/sound/ and fires the haptic pattern where the device has one. Nothing plays on load. The waveform is drawn peak-normalised on a common 0–600 ms axis, so lengths are comparable by eye; the level is in the numbers beside it.
Ready. Nothing plays until you press a button.
01 · Signature
Milo arrives
NOTICEVermilion
Milo is invoked — voice, quick entry, command palette — and becomes present. The primary signature: the one moment Milo must be recognisable with the screen hidden.
pixels → the mark resolves → one vermilion element lands · 180 ms · --ease-enter
Stays silent when
Milo is already present
the person is speaking
the invocation was itself silent — a scheduled run starting
0 ms100200300400500600
Measured
file 178.0 ms · audible 97.8 ms · peak −20.5 dBFS · RMS −37.1 · centroid 2041 Hz · −20 dB in 19 ms
Character
three uneven grains inside the ~50 ms fusion window, so they read as one textured attack, then the mark landing, then a small organic tail
Haptic
3 steps · 68 ms · sharpness 0.90 — uneven, resolving, lands on the third
Language
no words; the pill appears already labelled Listening
Visible
the voice pill or quick-entry surface — that, not the sound, is what tells you
Haptic pattern
0 ms100200300400
02 · Signature
Milo recedes
AMBIENTMoss remains
The intervention ends and the environment is what is left. Arrival without departure would imply Milo is always present; the brand's position is the opposite.
structure discretises → pixels separate → vermilion recedes → the Moss field remains · 240 ms · --ease-exit
Stays silent when
the person navigated away
another cue played in the last two seconds
the session is ending anyway
0 ms100200300400500600
Measured
file 258.0 ms · audible 137.0 ms · peak −23.0 dBFS · RMS −45.9 · centroid 1253 Hz
Descends
centroid 1282 Hz in the first half, 546 Hz in the second — it measurably recedes into the low Moss register
Character
the mark first, already decaying, then grains at widening gaps and falling amplitude, ending on the Moss floor. Not a reversed file: a reversed envelope swells, and a swell asks for attention.
Haptic
3 steps · 82 ms · sharpness 0.55 — gaps widen where arrival's narrowed
Language
none
Visible
the pill dismisses; the run row stays
Haptic pattern
0 ms100200300400
03 · Signature
Offline ready
AMBIENTSignal Moss
A local resource becomes available — a machine wakes, a model loads, a volume mounts. The only Moss voice in the system. Without it, sound has no Offline half.
Motion: the machine row's Moss glyph fades up over --dur-base. Nothing translates — readiness is a state, not an arrival.
Stays silent when
the person asked for it and is watching
more than one resource becomes ready inside five seconds — one cue for the group, not one each
the resource is remote; remote is not local capability
0 ms100200300400500600
Measured
file 126.0 ms · audible 48.6 ms · peak −26.0 dBFS — the quietest in the system · RMS −40.2
Register
centroid 259 Hz, rolloff 844 Hz, spread 186 Hz — the lowest and narrowest sound here; attack 8.7 ms, the softest
Character
abstracted from setting a wooden thing down on a wooden bench. An environment does not announce itself.
Haptic
1 step · 30 ms · sharpness 0.15 — the only single, blunt, low-sharpness pattern
Language
“Local. Ready.” Never “Success”.
Visible
the machine or resource row
Haptic pattern
0 ms100200300400
04 · Signature
Artifact born
NOTICEInk · Vermilion mark only
A meaningful new thing exists — a file, a document, a dataset, a build. A new thing existing is what the product is for.
Motion: emerge — the artifact row translates 8 px up into place over --dur-slow, --ease-enter.
Stays silent when
the artifact is an intermediate — a temp file, a cache, a checkpoint
a batch produces several: one cue for the batch
the person created it by hand
0 ms100200300400500600
Measured
file 93.3 ms · audible 43.3 ms — the shortest sound in the system · peak −22.0 dBFS · RMS −35.4 · centroid 1115 Hz
Character
two layers 9 ms apart — a broadband contact and a mid woody register — fusing into one press closing. A press does not ring, so there is almost no resonance.
Haptic
1 step · 8 ms · sharpness 1.00 — the crispest and shortest pattern
Language
the artifact's name and path. Nothing else.
Visible
the artifact row and its path
Haptic pattern
0 ms100200300400
05 · Signature
Resolved
NOTICEDither
An unknown or a problem becomes a completed resolution. The event most at risk of turning into a reward sound, so it is designed rather than avoided: it never rises, and it ends on its smallest grain.
Motion: the run row settles into its done state; the progress bar completes and stops. No flourish.
Stays silent when
the run took under two minutes and the person is looking at it
it is one of several resolutions in the same minute
the person resolved it themselves
0 ms100200300400500600
Measured
file 324.0 ms · audible 272.8 ms · peak −24.0 dBFS · RMS −44.6 · centroid 1738 Hz
Resolves
spectral spread collapses 1325 Hz → 368 Hz between first and second half; centroid falls 1741 → 1248 Hz. The texture genuinely narrows onto one band.
Character
fourteen grains; centre frequencies converge, bandwidth narrows, gaps widen so it settles instead of accelerating, amplitude decays to nothing
Haptic
3 steps · 56 ms · sharpness 0.35 — intensity descends and the last step is longer and softer, so peak force never rises. That is the anti-reward test in the haptic channel.
Language
“Resolved.” or the plain result. Never “Done!”.
Visible
the row state and the toast
Haptic pattern
0 ms100200300400
06 · Signature
Approval required
INTERRUPT · CRITICALVermilion edge
Human agency becomes necessary: nothing proceeds until a person acts. The only event the four-a-minute budget cannot suppress, and the only one that reaches the system's loudest permitted level.
Motion: the permission surface arrives at elevation 3 with its vermilion edge; the critical variant is elevation 4 with a 2 px border and a scrim.
Stays silent when
never — this is the one event that always plays when sound is on
0 ms1002003004005006000 ms100200300400500600
Interrupt
file 196.0 ms · audible 164.2 ms · peak −20.0 dBFS · RMS −34.3 · centroid 754 Hz
Critical
file 381.1 ms · audible 332.3 ms · peak −20.0 dBFS — identical · centroid 693 Hz — lower
Why
cost is weight and length, never volume. A system that gets louder as the stakes rise teaches the person to fear the speaker instead of reading the screen.
Character
a small relay throwing. The 130 ms separation is the design: it sits outside the ~50 ms fusion window that arrival sits inside, so the ear counts two events. Countability, not loudness, is what makes it unambiguous.
Haptic
2 steps · 160 ms (critical: 3 steps · 314 ms) — the 120 ms pause is far longer than any other gap in the set, so the pattern is countable through the wrist alone
Language
the question in one line, with the cost named; the critical variant states the consequence first
Visible
the permission surface, or a role="alertdialog" confirmation
Haptic pattern · interrupt
Haptic pattern · critical
0 ms100200300400
Silent by design26.3
Three candidates were cut. That is the design, not an omission.
Eight events were considered. The silent set is larger than the sounded set, and it has to be: a system that marks every completed subtask has stopped meaning anything by the third one.
Milo understands SILENT
Intent resolving is a sub-state of arrival. It happens within a second of the arrival cue, while the person is still looking at the pill they summoned — two cues that close together stop being two events and become a chime pair. Intent resolution is also the step most likely to need correcting, so sounding it would confirm something that is not yet true. Carried by the pill's state word changing to Understanding, then the transcript.
Milo acts SILENT
Starting work is ordinary progress, which is the definition of SILENT. If every run start sounded, the four-a-minute budget would be spent before anything finished. The commitment is already in the tail of the arrival cue and in the vermilion mark landing. Carried by the run row appearing, the active pulse, the progress bar.
Handoff SILENT
A handoff between executor, machine or context is an implementation detail of a run. The person asked for an outcome, not for a particular machine to be busy; sounding it trains them to care about the wrong layer. A handoff that fails is not a handoff — it is Approval required, or a failed Resolved. Carried by the executor mark in the run detail.
Everything else SILENT
A task completed by hand, a row reordered, a tab changed, a keystroke, a hover, a save, a scroll. The person did it; they already know. Carried by the state itself.
+Every measurement, and how it was taken7 files
event
file ms
audible ms
peak dBFS
RMS dBFS
centroid Hz
−20 dB in
wav
milo-arrives
178.0
97.8
−20.5
−37.11
2041
19 ms
17 KB
milo-recedes
258.0
137.0
−23.0
−45.87
1253
8 ms
25 KB
offline-ready
126.0
48.6
−26.0
−40.23
259
33 ms
12 KB
artifact-born
93.3
43.3
−22.0
−35.37
1115
21 ms
9 KB
resolved
324.0
272.8
−24.0
−44.58
1738
21 ms
31 KB
approval-required
196.0
164.2
−20.0
−34.26
754
23 ms
19 KB
approval-required-critical
381.1
332.3
−20.0
−34.82
693
23 ms
37 KB
All seven are synthesised by tools/make_sounds.py from the standard library — no recorded samples, so no provenance or licence question; the parameters in that file are the sound. Every write is gated: nothing over 600 ms, nothing above −19.9 dBFS peak, no spectral centroid above 3000 Hz, no decay to −20 dB slower than 260 ms, and in-band spectral flatness at or above 0.15 so a tone cannot pass as a material. Re-verify the shipped files with python3 tools/make_sounds.py --measure. Full derivation in docs/MILO_SOUND_SYSTEM_V1.md.
+Haptics: patterns, not a light / medium / heavy scale7 patterns
A scale describes force, and force is not meaning. Each pattern is a sequence of {duration, intensity, gap} steps with a sharpness value in tokens/haptics.json, and each carries the same shape as the sound and the motion it belongs to. Nothing crescendos, nothing runs past 400 ms, nothing repeats while it waits for you, and no haptic carries information the screen does not.
macOS
Core Haptics preferred: each step becomes a .hapticTransient with hapticIntensity from the step and hapticSharpness from the pattern, scheduled at the running sum of duration + gap. Gate on CHHapticEngine.capabilitiesForHardware().supportsHaptics. Fallback is NSHapticFeedbackManager, which offers three named patterns and no duration or intensity control at all — rhythm survives, nothing else does. Haptics reach the trackpad only; a Mac on a mouse has no haptic channel.
Omarchy
No haptic output exists and none is faked. Wayland and libinput expose no haptic actuator API for trackpads, and kernel force feedback covers game controllers. The sound and the visible state carry the event; the timeline above is the pattern's only representation here, which is sufficient because nothing in this system depends on touch.
Web prototype
navigator.vibrate takes milliseconds only, so intensity and sharpness are dropped and only rhythm and duration survive. Desktop Safari and desktop Chrome implement nothing; the buttons above say so rather than failing silently.
Accessibility: every event has a visible carrier, named on each card. Sound and haptics are supplementary — turn both off and nothing is lost, which is the test. Nothing plays without a press. Reduce Sound leaves haptics only; Do Not Disturb leaves nothing; Reduce Motion leaves sound and haptics unchanged, because they are not motion.
The tonal family26.4
What the product plays now.
James, 2026-09-25: "The sound design needs to sound soft, tonal and like the future." Every interface sound is now a few notes of one key, D major — a small bell, never a buzz — and the launch film's score is in the same key (48.2).
A rises to D: the signature.
Milo's own notification is a rising fourth. The same two notes, reversed or joined, run through the whole set, so the ear learns one voice. The six signature events of 26.1 keep their names and their silence rules; only the material changed — from a struck material to tuned glass.
Each note is a sine with a quiet octave and a faint inharmonic "glass" partial that fades first. Notes open with a raised-cosine attack (no click), decay exponentially, and pass through a short shimmer of two tuned delays — air without noise. Every sound peaks between −21 and −34 dBFS, under speech. Three takes of each differ by a hair of tuning and timing so repeats never sound mechanical; take 1 is below.
Sound
What it says
Brand cue it plays
Length · peak
Listen
open
a surface opens: D rises to A, soft
milo-arrives
520 ms · −28 dBFS
close
a surface closes: A settles to D
milo-recedes
460 ms · −30 dBFS
press
a button: one quiet round note
—
180 ms · −32 dBFS
tick
a switch: a tiny high note
—
110 ms · −34 dBFS
page
a new page: a third breathes in
—
480 ms · −30 dBFS
slide
going back: a note glides down a third
—
380 ms · −30 dBFS
land
arrival: a low warm fifth
offline-ready
500 ms · −26 dBFS
confirm
done: D, F♯, A, unhurried
resolved
740 ms · −26 dBFS
error
not done: a gentle fall of a fourth, never harsh
—
520 ms · −28 dBFS
notify
Milo's notification: A rises to D, the signature
—
950 ms · −22 dBFS
needs
Milo needs your yes: F♯, A, D, rising
approval-required · approval-required-critical
1050 ms · −21 dBFS
made
something was made: one glass note
artifact-born
620 ms · −26 dBFS
Nothing plays by itself: each sound starts only when you press its control. Files: assets/sound/tonal/, copied from offline-os assets/sounds/ (take 1), made by Tools/sound/tonal.py. The V1.2 prototypes in 26.1 are kept as the record. REF: https://m2.material.io/design/sound/applying-sound-to-ui.html