---
id: "4.12"
title: "Sound and motion, Seeti"
dept: brand
status: draft
owner: Param
branded: true
direction: cooker
last_verified: '2026-10-26'
sources:
  - "brew origin/main a559de6: tools/sfx/cues.json; tools/sfx/build.sh; public/sfx/*.mp3; public/app.js:1468-1560, 2939"
  - "memory brew-sounds"
  - "brand-directions/cooker/brand.html b5"
  - "brand-directions/cooker/motion.html v0, v1, v2"
  - "brand-directions/cooker/character.html c6, c7"
  - "brand-directions/cooker/kit-skin.js motion"
  - "brand-directions/cooker/snd/sound-log.json; brand-directions/cooker/snd/voice.json"
  - "brand-directions/book/content/f.js:919-1000 section f-5"
---

# Sound and motion, Seeti

## Answer

Seeti sounds like three rising whistle toots and acts like a whistle weight that bounces, and this settles which cues play, when, how loud, and how Seeti's sounds replace today's product cues.

## Today

### Sound in the live product

| Part | Today |
|---|---|
| Cues | 29 designed cues rendered offline with earshot from tools/sfx/cues.json into public/sfx [src: brew/tools/sfx/cues.json; memory brew-sounds] |
| Levels | Set by loudness through a small speaker, from about minus 23 LUFS for live and win to minus 38 for ratchet. Never peak normalised [src: brew/tools/sfx/cues.json; memory brew-sounds] |
| Fallback | A synth version of each cue plays if its file is not loaded yet [src: brew/public/app.js:1481-1516] |
| Loading | Files load on the first tap or key, else 12 s after load [src: brew/public/app.js:1521] |
| Default | On, unless the person turned Sounds off in the account menu [src: brew/public/app.js:1470, 2939] |
| One tap, one sound | Background cues give way to any cue just played; screens that change by themselves stay silent [src: brew/public/app.js:1523-1530] |
| Haptics | A light vibration on phones 760 px wide or less [src: brew/public/app.js:1526] |
| Copy | Every clipboard write plays tick [src: brew/public/app.js:1532] |

| Cue | When it plays today |
|---|---|
| heart, unheart | Heart or unheart a card [src: brew/public/app.js:1548] |
| live | Ship in the jam, share to someone [src: brew/public/app.js:1536] |
| send | Share, pick, Build my feed and jam sends [src: brew/public/app.js:1537, 1558] |
| tick | Copy, save, hand off copy [src: brew/public/app.js:1538] |
| select | Opening a card, approve tops, onboarding tiles [src: brew/public/app.js:1539] |
| bubble | AI fix, variants, make [src: brew/public/app.js:1540] |
| approve | Approve, and turning sound on [src: brew/public/app.js:1544, 2939] |
| error, ready, reply, connected, keep, drop | Failures, long jobs ready, a jam reply, a tool connected, swipe keep or drop [src: brew/public/app.js:1505-1512] |

### Motion in the live product

- One loader on every wait, tied to the button that started it, shown after 140 ms and for at least 380 ms. [src: brew/public/loader.js:8; memory brew-loader]

### Seeti's sound files

| File | What it is |
|---|---|
| snd/logo.mp3 | Sonic logo, three toots pitched lower to higher, the third held, about 1.8 s [src: brand-directions/cooker/motion.html v0] |
| snd/cue-ready.mp3 | One bright whistle toot, 1.2 s [src: brand-directions/cooker/snd/sound-log.json] |
| snd/cue-heart.mp3 | A small happy steam chirp, 0.8 s [src: brand-directions/cooker/snd/sound-log.json] |
| snd/cue-handoff.mp3 | A ticket torn and slapped down, a little bell, 1.2 s [src: brand-directions/cooker/snd/sound-log.json] |
| snd/cue-caught.mp3 | A lid set down, a slow steam sigh, 1.6 s [src: brand-directions/cooker/snd/sound-log.json] |
| snd/cue-error.mp3 | A soft sputter, never an alarm, 1.4 s [src: brand-directions/cooker/snd/sound-log.json] |
| snd/line-*.mp3 | Seven moment lines and two taglines in Seeti's voice [src: brand-directions/cooker/snd listing] |
| snd/voice.json | ElevenLabs Seeti voice, option 2 of 3 [src: brand-directions/cooker/snd/voice.json] |

- The books level cues to about minus 16 LUFS, a different scale from the product's small speaker levels. [src: brand-directions/cooker/motion.html v0; brew/tools/sfx/cues.json]

## Tomorrow

### Sound

- v1, New: the sonic logo, three rising toots, plays only when the week is ready and on the brand's own films and reels. Never on errors. [src: brand-directions/cooker/motion.html v0]
- v1, New: the whistle is explained once, on the first read: in Indian kitchens cooks count the whistles, three and the dal is done. [src: brand-directions/cooker/brand.html b5]
- v1, Changes: sound is off on a first visit and one switch in Settings turns it on, and stays as set. Today it is on by default. [src: brand-directions/cooker/brand.html b5; brew/public/app.js:1470]
- v1, New: no sound on a page someone opened from a brief link. [src: brand-directions/book/content/f.js:974]
- v1, Stays: one cue per action, the later one wins, levelled for small speakers the way brew levels today.
- v1, Changes: Seeti's cues are re-levelled with the product's small speaker rule before they ship, not at the books' minus 16 LUFS.
- v1, Stays: the crisp kit cues for taps, toggles, sheets and steps stay as they are. Only the five moments and the logo take Seeti's sounds.
- v1, New: the voice speaks only on the stage, the home page, marketing and once in onboarding. In the product, lines are text and cues carry the feeling. [src: brand-directions/cooker/motion.html v0]
- v1, New: never a siren, a crash or a boom, never a looped whistle while waiting, never the whistle on a notification that does not mean ready, never a music bed. [src: brand-directions/cooker/brand.html b5]

### Mapping onto today's cues

| Seeti cue | Replaces today's | Moment | Tag |
|---|---|---|---|
| Sonic logo | live, win | The Monday drop lands | v1, New |
| Ready | ready | The read is done, a long job is ready | v1, Changes |
| Heart | heart | More like this | v1, Changes |
| Handoff | tick on hand off copy only | The brief is copied | v1, Changes |
| Caught up | No cue today | Kitchen's clean | v1, New |
| Error | error | Something failed | v1, Changes |

### Motion

| State | Motion | Timing | Tag |
|---|---|---|---|
| Idle | Whistle jiggle and a puff, blink, breathe 1 percent | 3.2 s, blink 5.5 s | v1, New |
| React | One toot, squash to 1.05 by 0.93, face swaps | 260 ms, holds 1.2 s | v1, New |
| Celebrate | Three toots with the logo, steam blast, once | 1.8 s | v1, New |
| Wait | Whistle pills fill, one per read stage | 180 ms per pill | v1, New |
| Error | Lid hops once, sheepish face | 320 ms | v1, New |
| Monday drop | Five picks pop up one by one | 80 ms apart | v1, New |

- v1, New: tickets slap down and specials pop up in 180 to 320 ms, never a slow fade. Overshoot on the whistle drop, never on the body. [src: brand-directions/cooker/brand.html b4; brand-directions/cooker/motion.html v1]
- v1, New: while you type, read or make, Seeti only blinks. No screen shake, no full body spin, no looped celebration. [src: brand-directions/cooker/motion.html v1]
- v1, New: every animation sits inside a reduced motion check; with it on, Seeti holds its pose and only the face changes. [src: brand-directions/cooker/character.html c7; brand-directions/cooker/kit-skin.js motion]
- v1, Stays: the one loader on every wait stays. Seeti's wait pose shows only on long waits in its slot.
- v2, New: a toot for Tray's ready when files are prepared and await a yes. Sound for a post going out plays only after the person said yes.
- v3, New: a plate checker cue for How it went, never a sound for a bad result or a missed week.
- v4, Stays: no new sound for ads within rules beyond the five cues and the logo.

### Reels

- v1, New: three templates: a six second sting, a fifteen second story, a thirty second reel, each ending on three whistles. [src: brand-directions/cooker/motion.html v2]
- v1, New: kitchen room tone at minus 30 LUFS, Seeti's voice on top, at most three toots per reel, captions in Bakbak One. [src: brand-directions/cooker/motion.html v2]

## How we do it

1. Re-render a product cue after a change to the cue list:

```
cd /Users/param/Documents/ChatGPT/brew && tools/sfx/build.sh
```

2. Level by loudness through a small speaker, 350 Hz to 9 kHz. The build fails a cue that loses more than 6 dB that way. Never peak normalise.
3. Test by recording every AudioBufferSourceNode start and fingerprinting each decoded mp3, then walking the real app.
4. Check one tap gives one sound and screens that change by themselves stay silent.
5. Check reduced motion holds every pose still.

## Numbers

| Metric | Definition | Where measured | Status |
|---|---|---|---|
| Sound on rate | Share of signed in people with Sounds on after their first week | Local setting, counted when Settings is opened | Proposed |
| Blind sound match | Share who pick Seeti's logo as meaning ready, with no pictures | Founder test sessions | Proposed |
| Cue loss | dB a cue loses through the small speaker band, must stay under 6 | tools/sfx build | Exists |

## Open

1. Should sound start off, as Seeti's book says, or on, as the product does today? Proposal: off on a first visit, with one line on the first read offering to turn the whistle on.
2. Should the Monday drop sonic logo play inside the product, or only in the Monday email and marketing? Proposal: in the product, once a week, only if sound is on.
3. Keep the crisp kit cues for small taps alongside Seeti's five? Proposal: yes, the whistle is for moments, the kit is for taps.
