Skip to content

feat(notifications): add a soft notification sound - #1536

Merged
joahg merged 1 commit into
block:mainfrom
joahg:joah/chime-notification-sound
Nov 4, 2026
Merged

joahg merged 1 commit into
block:mainfrom
joahg:joah/chime-notification-sound

Conversation

@joahg

@joahg joahg commented Oct 22, 2026 •

Copy link
Copy Markdown
Member

Summary

Adds soft, a quiet, gentle alert sound, to the bundled notification sounds. You can pick it per category in Settings → Notifications.

  • public/sounds/soft.mp3: an original two-note chime, A4 → E5. It has a rounded, felt-mallet tone: the 2nd–4th harmonics fade faster than the fundamental. Everything above about 2.4 kHz is rolled off, it ends in a smooth, dark room tail (convolution with a low-passed noise impulse, not comb filters), and it starts with a 25 ms raised-cosine fade-in. It's 0.95 s long, 48 kHz stereo at 192 kbps like the other clips, and mastered at about −32 LUFS (flutter is about −30, ping about −17).
  • public/sounds/soft.svg: a waveform glyph in the same 24-bar format as the other sounds.
  • SOUND_NAMES: adds soft in alphabetical order.

The sound was synthesized from scratch with a small stdlib-only Python script plus ffmpeg. It isn't sampled from or derived from any third-party asset. Joah chose it after several listening rounds.

Defaults and recommendations are unchanged.

Linear: AGNTOPS-663

Validation

  • vitest run src/features/notifications src/app/NotificationSettings.test.tsx at 322231b7e: 14 files and 156 tests passed.
  • Full vitest run, last run before the audio-only swap: 11,337 passed, 1 failed (browser-host/media-preparation.integration.test.mjs, the tiled HEIC dimensions test). That test is about image preparation, not sounds.
  • Not yet checked in the running app: picking soft in Settings and hearing the preview and a real alert.

🤖 Generated with Claude Code

Adds `soft`, an original two-note chime (A4 -> E5) with a rounded,
felt-mallet tone, everything above ~2.4 kHz rolled off, a smooth dark
room tail and a slow attack, mastered at about -32 LUFS, as a quiet,
gentle option alongside the bundled alert sounds.

Co-authored-by: Hertz <6dc34705e5eaffade9f039764bf81185f09d3e096c0dedc2fed3b7ba7a549620@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Joah Gerstenberg <[email protected]>
@joahg
joahg force-pushed the joah/chime-notification-sound branch from 04e8feb to 322231b Compare October 22, 2026 05:04
@joahg
joahg marked this pull request as ready for review October 22, 2026 05:05
@joahg
joahg requested a review from a team as a code owner October 22, 2026 05:05

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account: no actionable findings. The new sound reuses the existing picker, preference validation and playback paths without changing defaults. Reviewed head 322231b7e3e6f2ed1daee44778bf9cec6b6b5a52 against base 3d23acb496dd82dd17265927f748109f4a1c9a8b with Rocket, Mantis and Groot. Source-only: no tests or app/audio playback performed; preview, real-alert sound and loudness remain unverified, and the linked issue was inaccessible.

@kazemek21 kazemek21 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kyle reviewed this PR and the Nexus review-tracker notes and approved with no comments.

Posted by Codex (gpt-6.1-sol) on behalf of kylez

@joahg
joahg merged commit cc0e7df into block:main Nov 4, 2026
36 checks passed
gilgtm added a commit that referenced this pull request Nov 4, 2026
* origin/main: (52 commits)
  feat(agents): give plugin agent types the Buzz side of a turn (#2364)
  feat(plugins): pin buzz://plugin-install links to a path and commit (#2315)
  feat(plugins): tint currentColor SVG page icons like host icons (#2314)
  feat(notifications): add a soft notification sound (#1536)
  feat(agents): let agents propose a profile picture (#2267)
  fix(plugins): default reminders and workflows off for fresh installs (#2291)
  Show all reactors in compact, separate emoji capsules (#2179)
  fix(panels): remember page split widths per workspace (#2264)
  feat(search): browse open channels from a Channels tab in search (#2164)
  perf(relay): page combined replay filters after a reconnect (#2308)
  fix(composer): make native Mac text shortcuts work past link chips (#2390)
  perf(relay): read creator proofs for many channels per filter (#2312)
  fix(channels): let published leave and delete confirm through access loss (#2357)
  fix(media): save native context menu media downloads and hide loopback links on macOS (#2131)
  fix(links): say why a message preview is unavailable, and preview unjoined public channels (#2136)
  test(browser): serve emoji artwork in the reaction hit-area journey (#2138)
  test(browser): click a reply link only after its row settles (#2358)
  fix(agents): restore delegated workflow mentions (#2399)
  feat(identity): always back up keys in managed builds (#2398)
  test(threads): render before checking the reader across activity resizes (#2389)
  ...

Signed-off-by: Gil Birman <[email protected]>
Co-authored-by: Claude <[email protected]>

# Conflicts:
#	src/plugins/author.test.mjs
zandt-square added a commit to zandt-square/buzz-app that referenced this pull request Nov 4, 2026
Co-authored-by: Fizz <fbf1920f313ab37ffa4c517e2437e247fe1423378e077eccc4e29f15625b9918@buzz.block.builderlab.xyz>

* origin/main:
  fix(mermaid): cap diagram output size (block#2231)
  feat(agents): give plugin agent types the Buzz side of a turn (block#2364)
  feat(plugins): pin buzz://plugin-install links to a path and commit (block#2315)
  feat(plugins): tint currentColor SVG page icons like host icons (block#2314)
  feat(notifications): add a soft notification sound (block#1536)
  feat(agents): let agents propose a profile picture (block#2267)
  fix(plugins): default reminders and workflows off for fresh installs (block#2291)

Signed-off-by: Zandt <[email protected]>
wpfleger96 added a commit that referenced this pull request Nov 4, 2026
…w-tab

* origin/main: (41 commits)
  [3/5] Add protection to the Claude harness plugin (#1878)
  fix(settings): keep the bottom padding on long sections (#2361)
  fix(mermaid): cap diagram output size (#2231)
  feat(agents): give plugin agent types the Buzz side of a turn (#2364)
  feat(plugins): pin buzz://plugin-install links to a path and commit (#2315)
  feat(plugins): tint currentColor SVG page icons like host icons (#2314)
  feat(notifications): add a soft notification sound (#1536)
  feat(agents): let agents propose a profile picture (#2267)
  fix(plugins): default reminders and workflows off for fresh installs (#2291)
  Show all reactors in compact, separate emoji capsules (#2179)
  fix(panels): remember page split widths per workspace (#2264)
  feat(search): browse open channels from a Channels tab in search (#2164)
  perf(relay): page combined replay filters after a reconnect (#2308)
  fix(composer): make native Mac text shortcuts work past link chips (#2390)
  perf(relay): read creator proofs for many channels per filter (#2312)
  fix(channels): let published leave and delete confirm through access loss (#2357)
  fix(media): save native context menu media downloads and hide loopback links on macOS (#2131)
  fix(links): say why a message preview is unavailable, and preview unjoined public channels (#2136)
  test(browser): serve emoji artwork in the reaction hit-area journey (#2138)
  test(browser): click a reply link only after its row settles (#2358)
  ...

# Conflicts:
#	src/buzz-mcp/tools.ts
johnmatthewtennant added a commit that referenced this pull request Nov 4, 2026
Records main as a parent; 5560670 brought in its changes without one.

Signed-off-by: John Tennant <[email protected]>
Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <[email protected]>

* origin/main:
  feat(solo): let viewers join read-only spaces (#2301)
  [3/5] Add protection to the Claude harness plugin (#1878)
  fix(settings): keep the bottom padding on long sections (#2361)
  fix(mermaid): cap diagram output size (#2231)
  feat(agents): give plugin agent types the Buzz side of a turn (#2364)
  feat(plugins): pin buzz://plugin-install links to a path and commit (#2315)
  feat(plugins): tint currentColor SVG page icons like host icons (#2314)
  feat(notifications): add a soft notification sound (#1536)
  feat(agents): let agents propose a profile picture (#2267)
  fix(plugins): default reminders and workflows off for fresh installs (#2291)
  Show all reactors in compact, separate emoji capsules (#2179)
  fix(panels): remember page split widths per workspace (#2264)

# Conflicts:
#	src/bundled/claude-code/manifest.json
johnmatthewtennant added a commit that referenced this pull request Nov 4, 2026
Co-authored-by: Martha <73923046810b68ae182000e74ef7c444383a907df20f81f2ba1008870a6f45a1@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <[email protected]>

* origin/main: (96 commits)
  test(agents): refuse a real relay workflow mention in the harness kit (#2444)
  fix(agents): catch up every event watch on the kinds it watches (#1852)
  Keep local artifact collections current (#1507)
  feat(members): add several people to a chat in one write (#2010)
  feat(solo): let viewers join read-only spaces (#2301)
  [3/5] Add protection to the Claude harness plugin (#1878)
  fix(settings): keep the bottom padding on long sections (#2361)
  fix(mermaid): cap diagram output size (#2231)
  feat(agents): give plugin agent types the Buzz side of a turn (#2364)
  feat(plugins): pin buzz://plugin-install links to a path and commit (#2315)
  feat(plugins): tint currentColor SVG page icons like host icons (#2314)
  feat(notifications): add a soft notification sound (#1536)
  feat(agents): let agents propose a profile picture (#2267)
  fix(plugins): default reminders and workflows off for fresh installs (#2291)
  Show all reactors in compact, separate emoji capsules (#2179)
  fix(panels): remember page split widths per workspace (#2264)
  feat(search): browse open channels from a Channels tab in search (#2164)
  perf(relay): page combined replay filters after a reconnect (#2308)
  fix(composer): make native Mac text shortcuts work past link chips (#2390)
  perf(relay): read creator proofs for many channels per filter (#2312)
  ...

Signed-off-by: John Tennant <[email protected]>
ravarora2 added a commit that referenced this pull request Nov 4, 2026
…-mentions

* origin/main: (57 commits)
  Keep local artifact collections current (#1507)
  feat(members): add several people to a chat in one write (#2010)
  feat(solo): let viewers join read-only spaces (#2301)
  [3/5] Add protection to the Claude harness plugin (#1878)
  fix(settings): keep the bottom padding on long sections (#2361)
  fix(mermaid): cap diagram output size (#2231)
  feat(agents): give plugin agent types the Buzz side of a turn (#2364)
  feat(plugins): pin buzz://plugin-install links to a path and commit (#2315)
  feat(plugins): tint currentColor SVG page icons like host icons (#2314)
  feat(notifications): add a soft notification sound (#1536)
  feat(agents): let agents propose a profile picture (#2267)
  fix(plugins): default reminders and workflows off for fresh installs (#2291)
  Show all reactors in compact, separate emoji capsules (#2179)
  fix(panels): remember page split widths per workspace (#2264)
  feat(search): browse open channels from a Channels tab in search (#2164)
  perf(relay): page combined replay filters after a reconnect (#2308)
  fix(composer): make native Mac text shortcuts work past link chips (#2390)
  perf(relay): read creator proofs for many channels per filter (#2312)
  fix(channels): let published leave and delete confirm through access loss (#2357)
  fix(media): save native context menu media downloads and hide loopback links on macOS (#2131)
  ...

Signed-off-by: Ravneet Arora <[email protected]>
johnmatthewtennant added a commit that referenced this pull request Nov 4, 2026
…est-work-activity

* origin/main:
  test(agents): refuse a real relay workflow mention in the harness kit (#2444)
  fix(agents): catch up every event watch on the kinds it watches (#1852)
  Keep local artifact collections current (#1507)
  feat(members): add several people to a chat in one write (#2010)
  feat(solo): let viewers join read-only spaces (#2301)
  [3/5] Add protection to the Claude harness plugin (#1878)
  fix(settings): keep the bottom padding on long sections (#2361)
  fix(mermaid): cap diagram output size (#2231)
  feat(agents): give plugin agent types the Buzz side of a turn (#2364)
  feat(plugins): pin buzz://plugin-install links to a path and commit (#2315)
  feat(plugins): tint currentColor SVG page icons like host icons (#2314)
  feat(notifications): add a soft notification sound (#1536)
matt2e added a commit that referenced this pull request Nov 12, 2026
…#3103)

## Summary

A saved notification sound name this build does not bundle made
`parseSounds` throw during restore. Restore then switched Desktop alerts
off and Settings showed the "Notification choices weren't saved" toast.
Its **Retry saving choices** button persisted `enabled: false`, so after
a reload alerts stayed off with nothing explaining why.

This is reachable today: `soft` (added in #1536) saved on a newer build
and restored on an older one, and every downgrade from a build with
#2877, which writes `buzz` into all four categories.

The fix keeps the default sound for any category whose saved value is
not a known name (unknown string, number, null, missing) and leaves
storage untouched, so the saved name survives for a later upgrade until
a notification setting is changed on this build. A `sounds` value that
is not an object still throws, so genuinely corrupt data keeps the
existing paused state. Production change is 4 lines in
`src/features/notifications/preferences.ts`; `docs/notifications.md`
describes the fallback.

## Why before #2877

#2877 adds `buzz` to `SOUND_NAMES` and makes it the default. Once it
ships, any user who then runs an older build (rollback, a second machine
behind on updates, or a beta/stable pair) hits this dead end on first
launch. Landing this fallback first means the older builds in
circulation at that point tolerate the new name. The tests seed
`klaxon`, a name no build bundles, so they keep exercising the fallback
after #2877 makes `buzz` valid.

## Tests

Three new cases:

- `preferences.test.ts`: parser case seeding an unknown string, a
number, and null in different categories, asserting per-category
fallback to the default and a frozen result. The malformed-shape
rejection (`"ping"`, `null`, `[]` for `sounds`) moved into its own
`it.each`.
- `preferences.test.ts`: restore through `createNotificationPreferences`
with a fake host, asserting `enabled` stays true, `error` is null,
`setItem` is never called, and `update({})` writes `enabled: true`.
- `NotificationSettings.test.tsx` (jsdom): seeds the payload a #2877
build writes and asserts Desktop alerts is checked, no **Retry saving
choices** button exists, and Direct messages shows `DEFAULT_SOUND`.

Evidence:

- `vitest run src/features/notifications
src/app/NotificationSettings.test.tsx`: 15 files, 212 passed.
- Same tests with main's `preferences.ts` swapped in: exactly the 3 new
tests fail with the original dead end.
- `biome check --error-on-warnings` on changed files: clean.
- `tsc --noEmit`: exit 0.

## Before / After

Left: `main`, seeded with a sound name the build does not bundle.
Desktop alerts is off, the "Notification choices weren't saved" toast is
up, Retry saving choices rewrites storage to `enabled:false`, and after
a reload the switch is still off with nothing explaining why.
Right: this branch, same seed. Desktop alerts stays on, no toast, Direct
messages shows the default sound, and the storage readout at the bottom
keeps the saved name through the reload.


https://github.com/user-attachments/assets/ee85a5dc-2178-4cf5-a7c5-0b22f7969ace


🤖 Generated with [Claude Code](https://claude.com/claude-code)

Signed-off-by: mtoohey <[email protected]>
Signed-off-by: Matt Toohey <[email protected]>
Co-authored-by: Claude Fable 5.1 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants