Silent by default.
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 — a run that needs you, a long run finishing, a failure, a Level 4 interruption. One material, eight events, never more than four a minute, and nothing that a visible state does not already say.
Nothing carries information by sound alone.
Every cue pairs with a row state, a toast or a pill. Turn sound off and nothing is lost; that is the test.
The material
A single struck object: short, dry, mid-pitched — a pencil on paper, a print block registering. No synth pads, no bells, no rising arpeggios. The prototype synthesises it (Web Audio, triangle through a bandpass, 40 ms); production records one sample at 48 kHz mono and uses it everywhere. Loudness −18 LUFS integrated, so it sits under speech.
Eight events. Four make a sound.
Play them. Each button fires the prototype cue and the haptic pattern the platform would use; the budget counter shows the four-a-minute rule working.
Cue table — event, sound, haptic, visible pair, default
| cue | event | sound | haptic | visible pair | default |
|---|---|---|---|---|---|
| needs-you | a run stops for approval or input | one tick, 40 ms | light | ◉ Needs you row + notification | on |
| done-long | a run longer than 2 minutes finishes | two ticks, 90 ms apart | medium | ✓ Done + toast | on |
| error | a run fails | one low tick, 60 ms | rigid | ✕ Failed row + toast | on |
| permission | Level 4 interruption opens | one tick | medium | confirmation | on |
| voice-open | voice pill appears | none | light | pill | on |
| voice-done | voice intent resolved | none | light | pill ✓ | on |
| quick-entry | quick entry submitted | none | selection | toast | on |
| routine | task completed by hand, reorder, tab change | none | none | state | never |
Same eight cues, three players.
macOS plays the bundled sample and uses NSHapticFeedbackManager; Omarchy plays it through PipeWire and has no haptics; the web prototype synthesises it.
Platform mapping and the open item
| macOS | NSSound with tick.wav; NSHapticFeedbackManager .levelChange for light, .alignment for medium; rigid is two .alignment pulses. |
|---|---|
| Omarchy | pw-play (or canberra-gtk-play) with the bundled wav; mako notification carries the sound flag; no haptics. |
| Web prototype | site/js/26-sound.js: Web Audio after a user gesture; navigator.vibrate where it exists. |
Open: the recorded sample (assets/sound/tick.wav) is not yet cut; V1 ships the synthesised prototype. Everything else on this page is specified in tokens/sound.json.