Community plugin for DeepSeek Harness Β· MIT

Customizable bell notifications for your Agent

Configurable, unobtrusive sound cues for key lifecycle moments. No audio files β€” every bell is synthesized in real time with the Web Audio API, with custom sounds managed from Plugin configuration.

What it does

A small, focused plugin for high-value cues that you can tune to your own workflow.

🎡 Ten events, three on by default

Agent start, waiting for input, and turn complete are enabled first. Process-level events stay opt-in, so signals communicate progress instead of becoming noise.

πŸŽ›οΈ Swap in your own sounds

Use Plugin configuration to preview, upload your own audio file, or reset to default. Replacements persist across reloads without taking space in the workspace.

🎼 Sounds that are "alive"

All bells are synthesized on the fly β€” zero audio assets, a negligible footprint, and fully offline. Replace an event with your own audio when you need a different sound.

🎧 Hear the ten configurable events

This preview uses the current built-in recipes and Web Audio rendering approach, with no audio files. Preview volume is 0.7, the default masterVolume.

πŸ”Š Click any bell once to unlock audio (browser autoplay policy).

Install

From a DeepSeek Harness source checkout:

pnpm dsh plugin --profile bell add dsh-bell-notify

If dsh is already on your PATH:

dsh plugin --profile bell add dsh-bell-notify

Start it:

pnpm dsh --profile bell

Open the page, click anywhere once (browser autoplay policy unlocks audio), then run any task to hear notification sounds.

Remove it:

pnpm dsh plugin --profile bell remove dsh-bell-notify

🎡 Ten configurable events

Each event has a built-in bell and an independent toggle. New installs enable only the three cues that need your attention or mark a milestone; preview all ten configurable built-in recipes above.

EventDefault bellInitial stateFeels like
Session startstartupOffA soft upward sweep, like powering on
Agent startclickOnA short "ding", we're off
ThinkingnotifyOffA gentle single note, settling in
Tool calltickOffA crisp metallic "ta-ta"
Tool donedropOffA low settle, wrapping up
Command runbeepOffA short beep, terminal-flavored
Command doneriseOffA rising two-note "done"
Waiting for inputalertOnA high triple-chirp, look here
Turn completesuccessOnA rising major chord, satisfying
Back to idleconfirmOffA single note drifting down, quiet again

Configuration

All visible controls live in Settings β†’ Plugins β†’ Plugin configuration β†’ Bell notifications. Enable notification sounds is the only global switch, and turning it off mutes everything; there is no corner status dot or floating settings panel. These are the profile's regular runtime parameters:

OptionDefaultDescription
maxQueue8Wait-queue capacity
maxConcurrent3Simultaneous sounds (1 = serial)
defaultCooldown1000Global cooldown fallback (ms)

Enablement and volume are durable profile settings. Per-event toggles, custom sounds, and file names stay browser-local (localStorage + IndexedDB) and survive reloads.

The card shows the running version. Update is enabled only for confirmed npm profile dependencies; link: / file: installs display as development versions and keep Update disabled.

FAQ

Is this an official DeepSeek plugin?

No. It's a community plugin for DeepSeek Harness (dsh), MIT-licensed, not part of the official distribution.

Why is there no sound?

Most likely the browser autoplay policy β€” after the plugin loads you need to click the page once to unlock audio.

Where do I configure notification sounds and update the plugin?

Open Settings β†’ Plugins β†’ Plugin configuration β†’ Bell notifications. It manages enablement, volume, event toggles, custom sounds, and updates for npm-installed versions.

Why is there no corner status dot or floating panel?

They were removed to keep the conversation workspace unobstructed. Enablement, volume, event toggles, version, and updates are all consolidated in the plugin configuration card.

Where are custom sounds stored?

Bytes in browser IndexedDB, event-to-file mapping in localStorage. All local β€” nothing is uploaded anywhere.