{
 "id": "4.12",
 "title": "Sound and motion",
 "department": "Brand",
 "department_slug": "brand",
 "direction": {
  "id": "octopus",
  "name": "Ocho"
 },
 "branded": true,
 "status": "draft",
 "owner": "Param",
 "last_verified": "2026-10-26",
 "holds": "Cues, levels, when they play, motion slots",
 "urls": {
  "html": "https://handbook.joinsquareup.com/brand/sound-and-motion/octopus",
  "markdown": "https://handbook.joinsquareup.com/brand/sound-and-motion/octopus.md",
  "json": "https://handbook.joinsquareup.com/brand/sound-and-motion/octopus.json"
 },
 "other_directions": [
  {
   "id": "dog",
   "name": "Fetch",
   "json": "https://handbook.joinsquareup.com/brand/sound-and-motion/dog.json"
  },
  {
   "id": "bee",
   "name": "Buzz",
   "json": "https://handbook.joinsquareup.com/brand/sound-and-motion/bee.json"
  },
  {
   "id": "raccoon",
   "name": "Scoop",
   "json": "https://handbook.joinsquareup.com/brand/sound-and-motion/raccoon.json"
  },
  {
   "id": "cooker",
   "name": "Seeti",
   "json": "https://handbook.joinsquareup.com/brand/sound-and-motion/cooker.json"
  }
 ],
 "tldr": {
  "headline": "Ocho sounds wet and bubbly, with a suction cup letting go",
  "points": [
   {
    "icon": "spark",
    "text": "Sonic logo: a suction cup lets go of glass, a pop, a few bubbles."
   },
   {
    "icon": "gear",
    "text": "Five wet cues map onto today's moments, and the voice is rare."
   },
   {
    "icon": "lock",
    "text": "Sound starts off, offered once after the first heart."
   },
   {
    "icon": "check",
    "text": "One body bobs, squashes and hops in fixed slots, all off for reduced motion."
   },
   {
    "icon": "warn",
    "text": "Describe sound only: wet, rubbery, bubbly or paper, under two seconds."
   }
  ],
  "stat": {
   "value": "29",
   "label": "cues in the live product"
  },
  "decide": "Should sound start off and be offered once after the first heart?",
  "mood": "building"
 },
 "sources": [
  "brew origin/main a559de6: tools/sfx/cues.json:1-32; tools/sfx/build.sh; public/sfx listing; public/app.js:1468-1560, 889, 2939, 4684, 4974",
  "brand-directions/octopus/motion.html v0, v1, v2",
  "brand-directions/octopus/brand.html b4 motion principles, b5",
  "brand-directions/octopus/character.html c6 voice, c7",
  "brand-directions/octopus/kit-skin.js motion",
  "brand-directions/octopus/snd/sound-log.json, snd/voice.json",
  "brand-directions/octopus/system.md s1, s4, s7",
  "brand-directions/book/content/f.js:919-1100 f-5",
  "memory brew-sounds, brew-loader"
 ],
 "open_questions": [
  "Should sound start off, as Ocho's books say, or stay on as the product does today? Proposal: start off, and offer it once after the first heart.",
  "Do Ocho's five cues replace today's heart, ready, tick, error and win, or play alongside them? Proposal: replace them on those five moments only and keep the crisp set for everything else.",
  "Should the voice ever play inside the product? Proposal: once, on the first read, then text only."
 ],
 "parts": {
  "Answer": "What the product plays and how it moves today, and the sound and motion Ocho brings tomorrow: a sonic logo of a suction cup letting go, five wet and bubbly cues mapped onto today's moments, a rare voice, and one body that bobs, squashes and hops in fixed slots, all off for reduced motion.",
  "Today": "### What the product plays\n- 29 designed cues rendered offline with earshot from tools/sfx/cues.json into public/sfx, one mp3 each. [src: brew/tools/sfx/cues.json:1-32; memory brew-sounds]\n- Each cue is levelled by loudness through a small speaker, from minus 38 for ratchet to minus 23 for live and win, never peak normalised. [src: brew/tools/sfx/cues.json:2,6,23,24; memory brew-sounds]\n- A synthesised version of every cue stays as the fallback when a file is missing. [src: brew/public/app.js:1481-1513,1524]\n- Sound is on unless someone turns it off with the Sounds switch in the account menu, saved per brand in the browser. [src: brew/public/app.js:1470,2939]\n- The files load on the first tap or key, or 12 seconds after the page loads. [src: brew/public/app.js:1522]\n- One tap is one sound. Background cues give way to any cue played in the last 150 ms, and screens that change by themselves stay silent. [src: brew/public/app.js:1523-1524,1528-1529; memory brew-sounds]\n- Repeats get a small pitch drift so they never sound stamped. [src: brew/public/app.js:1525]\n- Phones up to 760 pixels wide get a light vibration with some cues. [src: brew/public/app.js:1526]\n- Nothing plays while the tab is hidden. [src: brew/public/app.js:1524]\n\n### When the main cues play\n| Cue | Moment today | |\n|---|---|---|\n| heart, unheart | Heart a card, and undo it | [src: brew/public/app.js:1548] |\n| tick | Anything copied to the clipboard, including a brief | [src: brew/public/app.js:1532] |\n| send | Sharing, a jam pick, the store link form | [src: brew/public/app.js:1536-1537,1558] |\n| live | Shipping from the jam, share targets | [src: brew/public/app.js:1536] |\n| ready | A creative or a long job is ready | [src: brew/public/app.js:4684,4974] |\n| error | A make that failed | [src: brew/public/app.js:4684,4995] |\n| win | Onboarding finished | [src: brew/public/app.js:889] |\n| approve | An approval, and turning sound back on | [src: brew/public/app.js:1544,2939] |\n| boop | Tapping an agent face, which squishes | [src: brew/public/app.js:1551] |\n\n### Motion today\n- Every tap that waits on the server shows one loader on the button, after 140 ms and for at least 380 ms. [src: brew/public/loader.js:1-8; memory brew-loader]\n- No character moves in the product. [src: brand-directions/BRIEF.md section 3.8]\n\n### Ocho's sound, as made\n| File | Name | Moment | Length | What you hear | |\n|---|---|---|---|---|---|\n| snd/logo.mp3 | Sonic logo | End cards, the stage, first open | 1.8 s | A suction cup lets go of glass, a soft round pop, a few bubbles. An arm coming free | [src: brand-directions/octopus/motion.html v0; brand-directions/octopus/snd/sound-log.json logo] |\n| snd/cue-heart.mp3 | Stick it | Heart, More like this | 0.8 s | A squishy suction pop and one bright rising bubble | [src: brand-directions/octopus/motion.html v0] |\n| snd/cue-ready.mp3 | Arms full | Read finished, Monday drop | 1.2 s | Three wet blips rising in pitch | [src: brand-directions/octopus/motion.html v0] |\n| snd/cue-handoff.mp3 | Free an arm | Brief copied | 1.2 s | A paper slide, then a soft suction release | [src: brand-directions/octopus/motion.html v0] |\n| snd/cue-error.mp3 | Knot | Error, read cap | 1.0 s | A comic rubbery squeak and a small blub. Never an alarm | [src: brand-directions/octopus/motion.html v0] |\n| snd/cue-caught.mp3 | Arms free | Caught up | 1.8 s | A slow calm stream of bubbles ending in one low blip | [src: brand-directions/octopus/motion.html v0] |\n\n- All made in ElevenLabs as sound effects, no music beds, no words, levelled to about minus 16 LUFS. [src: brand-directions/octopus/motion.html v0; brand-directions/octopus/brand.html b5]\n- The voice, Ocho voice, was designed in ElevenLabs: an adult in its thirties, bright and quick, slightly too fast, warm, a little breathless, mid pitch, never shrill. Option one of three was kept, the quickest read. [src: brand-directions/octopus/snd/voice.json; brand-directions/octopus/character.html c6]\n- Eight voice files exist: the tagline and seven moment lines, paste, read, drop, heart, handoff, caught and error. [src: brand-directions/octopus/system.md s4; brand-directions/octopus/snd listing]\n- The heart line was recorded again without a fixed number of new ideas, and the read line again to say about three to four minutes. [src: brand-directions/octopus/snd/sound-log.json line-heart 02:57:51, line-read 09:05:52; brand-directions/book/content/f.js:1024]\n\n### Ocho's motion, as made\n| State | Motion | Loops | |\n|---|---|---|---|\n| Idle | Bob 5 pixels, lean 1.2 degrees, 3.2 s, pivot low on the body | Yes | [src: brand-directions/octopus/kit-skin.js motion; brand-directions/octopus/motion.html v1] |\n| React | Squash to 107 by 91, spring back in 280 ms, overshoot 1.06 | No | [src: brand-directions/octopus/character.html c7] |\n| Celebrate | Celebration pose, hop 12 pixels, 950 ms | Once | [src: brand-directions/octopus/kit-skin.js motion] |\n| Wait | Reading pose, sway 2.5 degrees, 1.2 s | Until done | [src: brand-directions/octopus/kit-skin.js motion] |\n| Free an arm | Hand off pose drifts toward the person taking the brief, 3 s | Once | [src: brand-directions/octopus/motion.html v1] |\n| Knot | Knot pose wobbles twice, 2.4 s | Once | [src: brand-directions/octopus/kit-skin.js motion] |\n| Frantic | 0.32 s jitter, 3 degrees | Marketing and the stage only | [src: brand-directions/octopus/character.html c7] |\n\nEvery animation sits behind the reduced motion check, which holds Ocho still and swaps poses only. [src: brand-directions/octopus/kit-skin.js motion; brand-directions/octopus/character.html c7]",
  "Tomorrow": "### Sound\n- v1 Changes: sound starts off, and plays only after someone turns it on in Settings. Today it starts on. [src: brand-directions/octopus/brand.html b5]\n- v1 Stays: the 29 crisp cues for ordinary taps, the loudness levelling, the synth fallback and one tap one sound.\n- v1 Changes: five moments take Ocho's cues instead of today's: heart takes Stick it, a finished read takes Arms full, a copied brief takes Free an arm, an error or the read cap takes Knot, caught up takes Arms free.\n- v1 New: Ocho's cues are levelled to the same small speaker loudness as today's set before they ship, since the books level them to about minus 16 LUFS on a different rule.\n- v1 New: no sound on a page opened from a brief link, ever.\n- v1 Stays: no sound for loss. There is no sound for a missed week.\n- v1 New: the voice plays only in marketing, the stage and onboarding once. The product speaks in text, and the voice never reads numbers.\n- v2 New: a cue for a post that goes out after a yes, made by the new cue checklist below, never an alarm.\n- v3 New: a cue for How it went, if a moment needs one. Reuse first.\n\n### Motion\n- v1 New: Ocho moves only in its slots, one action at a time, and never travels between slots to point at a button.\n- v1 New, by slot:\n  - Today corner, 40 to 56 pixels: fades in, idles, a tap reacts.\n  - Reading your store, 120 to 180: rises 12 units over 400 ms, then waits.\n  - The reveal, 160: squash in over 280 ms.\n  - Empty states, 96: a slower 4 s sway.\n  - Celebrations, 120: pops in over 300 ms and leaves after 2.5 s or any tap.\n  - Errors and cap, 96: knot once, stays until the way out is tapped.\n  - Brief page, 32: still.\n- v1 Stays: today's button loader stays for every server wait.\n- v4 Stays: frantic motion never enters the product.",
  "How we do it": "1. Add a cue only for a new moment, and reuse an old cue first.\n2. Describe sound only, wet, rubbery, bubbly or paper, with no music and no voice, under two seconds, the sonic logo under three.\n3. Never an alarm, a buzzer or a loss sound. Test on a phone speaker at half volume.\n4. For the product, add the cue to cues.json and render it with the team's build, then check it loses no more than 6 dB through a small speaker:\n   ```\n   cd /Users/param/Documents/ChatGPT/brew && tools/sfx/build.sh\n   ```\n5. New voice lines use Ocho voice, stay under eight seconds, read aloud first, and level to the same loudness as the rest.\n6. Log every generated file in brand-directions/octopus/snd/sound-log.json.\n7. Every animation goes inside the reduced motion media query.",
  "Numbers": "| Metric | Definition | Where measured | Status |\n|---|---|---|---|\n| Cue loudness spread | Gap between the quietest and loudest cue through a small speaker | The earshot build check in tools/sfx | Today minus 38 to minus 23 for the 29 cues |\n| Sound on rate | Share of active brands with sound switched on | The Sounds switch state | Proposed, not tracked |\n| Blind sound match | Founders who pick Arms full as your week is ready with no picture | The blind sound test | Proposed, not run |",
  "Open": "1. Should sound start off, as Ocho's books say, or stay on as the product does today? Proposal: start off, and offer it once after the first heart.\n2. Do Ocho's five cues replace today's heart, ready, tick, error and win, or play alongside them? Proposal: replace them on those five moments only and keep the crisp set for everything else.\n3. Should the voice ever play inside the product? Proposal: once, on the first read, then text only."
 }
}