Answer
Fetch sounds like a dog toy and a yard: a squeak, a ruff and two ball bounces as the sonic logo, five short cues and seven voice lines, mapped onto the 29 cues the product already plays, with sound off until you turn it on.
Today
Sound in the live product
| Part | What it does | Source |
|---|---|---|
| Cues | 29 designed cues rendered offline with earshot from cues.json into public/sfx | brew/tools/sfx/cues.json; memory brew-sounds |
| Levels | Set by loudness through a small speaker, from minus 23 for live, win and ready down to minus 38 for ratchet. Never peak normalised | brew/tools/sfx/cues.json; memory brew-sounds |
| Engine | CUES and sound in app.js. A synth version of every cue plays if its file has not loaded | brew/public/app.js:1481, 1517-1524 |
| Loading | Files load after the first tap or key, or 12 s after load | brew/public/app.js:1521 |
| Default | On, unless the person switched Sounds off in the account menu | brew/public/app.js:1470, 2936-2939 |
| One tap, one sound | Background cues give way to a cue just played. Screens that change by themselves stay silent | brew/public/app.js:1523-1530 |
| Haptics | A light vibration with some cues on screens 760 px or narrower | brew/public/app.js:1524 |
| Copy | Every clipboard copy plays tick | brew/public/app.js:1532 |
| Heart | heart, and unheart when undone | brew/public/app.js:1548 |
| Share and ship | live on ship and share, send on pick and share, tick on copy and hand off | brew/public/app.js:1536-1545 |
| Error | Two soft boops | brew/tools/sfx/cues.json |
| Waiting | One loader on every wait over 140 ms, shown at least 380 ms | brew/public/loader.js:7; memory brew-loader |
Fetch's sound, in the direction files
| Sound | What it is | Length | Plays when | File | Source |
|---|---|---|---|---|---|
| Sonic logo | Two rubber toy squeaks, one happy ruff, a tennis ball bouncing twice on wood | 2.2 s | Start of every reel and the home page, nothing else | dog/snd/logo.mp3 | brand-directions/dog/motion.html v0 |
| Heart | One bright toy squeak | 0.7 s | You heart a pick | dog/snd/cue-heart.mp3 | brand-directions/dog/motion.html v0 |
| Ready | A ball bouncing twice, a tag jingle | 1.3 s | The read finishes | dog/snd/cue-ready.mp3 | brand-directions/dog/motion.html v0 |
| Hand off | A card dropped on wood, two tail thumps | 1.1 s | A brief is copied, or our team gets it | dog/snd/cue-handoff.mp3 | brand-directions/dog/motion.html v0 |
| Error | One small puzzled boof | 1.0 s | Something did not work | dog/snd/cue-error.mp3 | brand-directions/dog/motion.html v0 |
| Caught up | A tag jingle settling into quiet | 1.6 s | The week is done | dog/snd/cue-caught.mp3 | brand-directions/dog/motion.html v0 |
- All six sounds were made with ElevenLabs sound effects from written prompts on 25 October brand-directions/dog/snd/sound-log.json
- The book says every file is levelled to about minus 16 loudness units. We have not measured it against the product's small speaker rule brand-directions/book/content/f.js f-5.cues
Fetch's voice
| Moment | Line | File | Source |
|---|---|---|---|
| Paste | Ooh. Is that your store? Throw it. I'll be right back with this week's ideas. | dog/snd/line-paste.mp3 | brand-directions/dog/snd/sound-log.json |
| Reading | Sniffing round your store, your reviews, your ads, and what the AI answers say about you. About three to four minutes. Good smells so far. | dog/snd/line-read.mp3 | brand-directions/dog/snd/sound-log.json |
| The drop | Monday. Five picks, dropped right at your feet, most with a first draft. Also my ball. Ignore the ball. | dog/snd/line-drop.mp3 | brand-directions/dog/snd/sound-log.json |
| Heart | You liked that one? Say no more. I'll fetch more like it. | dog/snd/line-heart.mp3 | brand-directions/dog/snd/sound-log.json |
| Hand it off | Drop it. Brief copied, link ready. You pass it on, and I go fetch the next one. | dog/snd/line-handoff.mp3 | brand-directions/dog/snd/sound-log.json |
| Caught up | That's the week. Every pick seen. I'm keeping the ball now. See you Monday. | dog/snd/line-caught.mp3 | brand-directions/dog/snd/sound-log.json |
| Error | Oops. Lost the scent on that one. Your work is safe. Throw it again? | dog/snd/line-error.mp3 | brand-directions/dog/snd/sound-log.json |
| Tagline | This week's ideas, fetched. | dog/snd/line-tagline.mp3 | brand-directions/dog/snd/sound-log.json |
- The voice is an adult in their late twenties, bright and bouncy, kept from three options and saved as Fetch voice brand-directions/dog/snd/voice.json
Fetch's motion
| State | Motion | Timing | Source |
|---|---|---|---|
| Idle | Bob 4 px, tilt 1 degree, tail wags minus 10 to 8 degrees | Bob 2.8 s ease in out, tail 0.45 s alternate | brand-directions/dog/system.md s1 |
| React | One head tilt and back, ears follow by 60 ms | 280 ms in, 400 ms hold, 280 ms out | brand-directions/dog/character.html c7 |
| Celebrate | One hop up 14 px with a stretch, a squash on landing | 1 s, once in the product | brand-directions/dog/kit-skin.js motion |
| Wait | The sniff, a small nose dip while the read runs | 1.4 s loop in the kit | brand-directions/dog/kit-skin.js motion |
| Error | Three small beats of head shake, then still | 2.4 s, once | brand-directions/dog/kit-skin.js motion |
| Caught up | Breathing, 2.5 percent rise and fall | 4 s | brand-directions/dog/motion.html v1 |
| Reduced motion | Every animation sits inside a prefers reduced motion check | Always | brand-directions/dog/kit-skin.js motion |
Tomorrow
| Item | Version | Tag |
|---|---|---|
| Sound starts off. It plays only after a person turns it on in Settings, and never on a page opened from a brief link | v1 | Changes |
| The 29 product cues stay as the base layer for taps, sheets and switches | v1 | Stays |
| Fetch's heart squeak replaces today's heart cue | v1 | Changes |
| Fetch's ready cue plays when the read finishes, in place of today's ready ding | v1 | Changes |
| Fetch's hand off cue plays when a brief is copied, in place of tick for that one copy | v1 | Changes |
| Fetch's puzzled boof replaces today's error boops | v1 | Changes |
| Caught up gets its first sound, the tag jingle, with the caught up screen | v1 | New |
| The sonic logo plays only on reels and the home page, never in the product | v1 | New |
| One cue per moment, never stacked, never looped. The later moment wins | v1 | Stays |
| No growls, whimpers, yelps or any sad dog sound. No sound for a missed week | v1 | New |
| The voice reads only the seven lines and the tagline, in onboarding once, the stage and marketing. Never numbers | v1 | New |
| Fetch's cues are levelled by the same small speaker loudness rule as the product cues before they ship | v1 | Changes |
| Motion: one motion at a time, then rest. Nothing moves while you tap, type, scroll or read. Celebrations are a hop, never confetti | v1 | New |
| A sound for work carried to a channel after your yes | v2 | New |
| A sound for a result coming back, never for a loss | v3 | New |
Reel timing
| Reel | Beats | Source |
|---|---|---|
| 6 s post | 0 to 1 sonic logo and head tilt, 1 to 4 one line and one pose, 4 to 6 wordmark slot and tagline | brand-directions/dog/motion.html v2 |
| 15 s tip | 0 to 2 hook with Fetch distracted, 2 to 10 the sample finding with one source chip, 10 to 13 the drop and hand off cue, 13 to 15 ask for a read | brand-directions/dog/motion.html v2 |
| 30 s story | 0 to 2 sonic logo, 2 to 8 throw it, 8 to 16 sniffing round and ready, 16 to 24 the drop with the ball, 24 to 30 tagline and voice | brand-directions/dog/motion.html v2 |
Cut on the two ball bounces. One voice line per reel at most.
How we do it
- Add a Fetch cue as a file in brew public/sfx and a name in CUES, keeping the synth fallback.
- Level it by small speaker loudness, never by peak. The build fails a cue that loses more than 6 dB that way.
cd /Users/param/Documents/ChatGPT/brew
tools/sfx/build.sh heart ready error
- Test by tapping through the real app: feed, heart, read, Make it, hand off, errors. Confirm one tap gives one sound.
- Put every animation inside the reduced motion check and check the screen still reads with motion off.
- The kit skin holds the product keyframes. stage.js holds the bigger stage animation.
Numbers
| Metric | Definition | Where measured | Status |
|---|---|---|---|
| Sound on rate | Share of signed in people who turn sound on | Settings switch event | Proposed |
| Small speaker loss | dB lost per cue through the 350 Hz to 9 kHz band | tools/sfx build | Exists for product cues, proposed for Fetch's |
| Blind sound test | Share of founders who pick the ready cue as your week is ready, with no picture | Founder sessions | Proposed |
Open
- Should sound stay on by default as it is today, or start off as the Fetch books say? Proposal: off by default, on with one switch in Settings.
- Do Fetch's cues replace today's heart, ready and error cues, or play beside them? Proposal: replace, so one tap is still one sound.
- Is the voice used in the product at all? Proposal: only the paste line during onboarding, once, and never again in the product.