Back to home

2h0n

dsh-web-notification

Desktop notifications when the model finishes a reply in DeepSeek Harness

Stars
1
Language
JavaScript
Created
Aug 14, 2026
Updated
Aug 14, 2026

Introduction

dsh-web-notification

English | 简体中文

Show a system-level Web Notification when the model finishes a reply in the DeepSeek Harness Web UI — whether or not the page is focused.

Features

  • Fires a system notification on every completed reply: title 🐳 Model Replied, body = the user message of this turn
    • Falls back to the session title when no user message is available
  • Requests notification permission automatically at boot and on the first user gesture (Safari requires a gesture)
  • Deduplicates per turn, so a reply never notifies twice
  • No UI injection: mounts no visible elements

Screenshots

notification example

How It Works

  • Detection: the client watches every open session's snapshot turnEnds (Map<turn, endSeq>); a turn count increase means one reply completed — multi-session replies each fire their own notification. The triggering user message text is read from the chat nodes.
  • Display: every notification uses a unique tag (dsh-reply-done-<sessionId>-<turn>) with renotify: true. Same-tag notifications have replace semantics — while the previous one is still visible, the replacement does not re-show a banner on macOS/Chrome.
  • Packaging: build.mjs wraps src/client/index.js in the window.__ModuleLoader__.load({ id, factory }) handshake, which the browser module table executes.

Installation (Users)

Prerequisites: dsh installed (npx @deepseek-ai/dsh) and the web profile initialized.

# 1. Install the bundle
npx @deepseek-ai/dsh plugin --profile web add https://github.com/2h0n/dsh-web-notification/archive/refs/tags/v0.1.0.tar.gz

# 2. Restart
npx @deepseek-ai/dsh web

Verify: no dsh-web-notification errors in the browser console; send two messages in the same session and confirm each reply fires a notification; restart once more and confirm the plugin is still there.

  • npx @deepseek-ai/dsh plugin --profile web add forwards its arguments to pnpm inside the profile directory, and because the package declares dsh.bundle, it automatically appends the package to dsh.profile.bundles. If you install with a bare pnpm add instead, add the bundles entry manually.
  • If installation fails with ERR_PNPM_TARBALL_INTEGRITY (stale lockfile checksums from other moving-branch dependencies in the profile), run pnpm install --update-checksums first and retry.

Development (Developers)

Requirements

  • Node.js 22.19+ or 24+ (matching the DeepSeek Harness supported range; the build is dependency-free — no npm packages to install)

Directory Structure

dsh-web-notification/
├── package.json          # Manifest: exports + dsh.bundle.patch + dsh.client
├── cordis.patch.yml      # Patch entry (plugin rows), referenced by dsh.bundle.patch
├── dsh.plugin.json       # Plugin manifest
├── build.mjs             # Build script (zero dependencies)
├── src/
│   ├── index.js          # Plugin entry (Node side): no-op (no host logic)
│   └── client/index.js   # Client plugin (browser side): all logic (the only file you edit)
└── lib/                  # Build output (do not edit; generated by build.mjs)
    ├── index.js
    └── client.js         # Browser bundle in __ModuleLoader__ handshake format

Local Development

The official way: install the local checkout into the profile (npx @deepseek-ai/dsh plugin add links the directory and registers the bundle automatically):

# 1. Build
node build.mjs

# 2. Install the local checkout
npx @deepseek-ai/dsh plugin --profile web add "$PWD"

# 3. Restart
npx @deepseek-ai/dsh web

If pnpm is not available, link it manually (equivalent result):

ln -s "$PWD" ~/.dsh/profiles/web/node_modules/dsh-web-notification
# And edit ~/.dsh/profiles/web/package.json by hand:
#   dependencies:        "dsh-web-notification": "file:$PWD"
#   dsh.profile.bundles: append "dsh-web-notification"

Iteration loop after editing code (symlinked, no reinstall needed):

node build.mjs            # regenerate lib/
npx @deepseek-ai/dsh web  # restart (file: symlink — no reinstall needed)

Removing

The official way (removes the dependency and its bundle layer together):

npx @deepseek-ai/dsh plugin --profile web remove dsh-web-notification

For a manually linked install, undo the steps:

rm ~/.dsh/profiles/web/node_modules/dsh-web-notification
# And edit ~/.dsh/profiles/web/package.json:
#   remove "dsh-web-notification" from dependencies and dsh.profile.bundles

Restart npx @deepseek-ai/dsh web afterwards.

License

MIT