macOS Dock badge and bubble chime: shows an unread badge on the Dock (dot while running, count when done) and plays a chime while the app is hidden; clears on return, built on the Badging API.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:Bing-Bryan/dsh-unread-dot
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
A DeepSeek Harness (DSH) plugin: while the app is hidden or unfocused, show an unread red dot on the macOS Dock icon and play a bubble chime when a session finishes or needs you. Clears automatically when you return.
Built entirely on the Chrome Badging API (navigator.setAppBadge / navigator.clearAppBadge) — no macOS system settings, no notification permission, no banners.
⚠️ Prerequisite: open DSH Web in Chrome and install it as an app via More → Cast, save and share → Install… so it runs in its own macOS window (PWA).
setAppBadgeonly works inside an installed web app.
Behavior
| Scenario | Dock icon | Sound |
|---|---|---|
| Session running while you're away | 🔴 plain red dot (no number) = still working | silent |
| Session finished while you're away | 🔴 red number +1 = results waiting | 🔊 bubble chime |
| Session needs your input | 🔴 red number +1 | 🔊 bubble chime (once per away period) |
| You return to the app | auto-cleared | — |
Why the Badging API
The plugin encodes "is there new info, and what kind" with the three states the Badging API supports:
navigator.setAppBadge(3) // red numbered badge: 3 unread results
navigator.setAppBadge() // plain red dot: a session is running
navigator.clearAppBadge() // clear: you're back, everything is read
- No permission, no banner, no system settings: the badge is a system-level persistent marker the page calls directly
- Dot vs number: number = unread result count, plain dot = running (the clearest distinction the API can express)
- Compatibility: DSH Web must be installed as a PWA (Chrome "Install page as app"); the API is supported from Chrome 81; from Chrome 152 the badge/notifications are attributed to the web app itself
Install
Add the plugin package to your DSH profile (e.g.
web):dsh plugin --profile web add github:Bing-Bryan/dsh-unread-dotAppend it to
dsh.profile.bundlesin the profile'spackage.json:"dsh": { "profile": { "bundles": [ "...", "dsh-unread-dot" ] } }Restart
dsh web, then configure it in Settings → Dock 角标与通知.
Settings
| Setting | Default | Description |
|---|---|---|
| Dock badge | on | Master switch: number badge when finished/waiting, cleared on return |
| Activity dot while running | on | Plain red dot while a session is generating a reply during minimize |
| Chime (bubble pop) | on | Plays the built-in bubble sound (bubble.mp3, 0.4s) on completion / needs-you |
| Test chime | button | Plays the bubble pop once to verify the sound |
How it works
- The plugin subscribes to the DSH session list (
sessions.list) and tracks read/unread state: when the window regains focus, all current attention states are marked as read - While minimized/unfocused, only newly occurring completion/waiting events light up the badge and chime (old events don't accumulate)
- Running sessions only show the activity dot (plain red), never counted into the number
- The chime plays an embedded base64 MP3 via
Audio, with a cross-window lock so multiple open windows only sound once
Compatibility
- macOS Chrome (installed as PWA / "Install page as app")
- Badge:
setAppBadgerequires an installed web app context - No server-side dependency — pure client plugin, HMR hot-reload with zero restarts
License
MIT © 2026 Bing-Bryan
The built-in sound effect bubble.mp3 is an edited clip based on Pixabay audio: Nature bubble in water (Pixabay license: free for commercial use, no attribution required).
Links
More in this category
xmanrui/dsh-im★ 1525
Connect IM bots to DeepSeek Harness via QR codes or bot credentials (9 channels: Feishu, WeChat, DingTalk, WeCom, QQ, Slack, Telegram, Discord, and WhatsApp).
shaobeichen/dsh-pocket★ 1396
Remote phone access to the DSH Web UI: scan a QR code for LAN or public (cloudflared tunnel) access with real-time sync, a mobile-adaptive layout, and a settings tab.
inclusionAI/Avernet#deepseek-harness-channel-bcn★ 572
Connects DeepSeek Harness to Avernet's Bot Collaboration Network over WebSocket V2, with automatic onboarding, isolated agent sessions, tool-call events, and multi-bot routing tools.
omdsh-dev/dsh-notification★ 85
Desktop notifications for turn completions, with per-outcome controls and keyword rules.
whyihaveyou/dsh-suite#plugin-notify★ 57
IM webhook and local notifications on turn completion, errors, or approval (Feishu/WeCom/DingTalk/Slack/Discord/custom).
omdsh-dev/dsh-lark★ 55
Lark/Feishu bot channel for DeepSeek Harness: each chat drives its own agent, and tool approvals, model questions, and plan reviews return as cards answered by a button or a reply. Switch workspace and model from the chat (`/cd`, `/model`, `/new`), and run several bots that keep separate sessions and can hand turns to each other in one group.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.