Push vague or rich, user-configurable DSH interaction states to the local Discord client as Rich Presence — real-time, content-free, with a user-editable status list and an optional rich-mode toggle in Settings.
Install
# from a prebuilt release tarball
dsh plugin --profile web add "https://github.com/0QwQ0/dsh-discord-richpresence/releases/latest/download/dsh-discord-richpresence.tgz"
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:0QwQ0/dsh-discord-richpresence
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
中文: README.md
A DeepSeek Harness plugin that mirrors your interaction state with dsh onto the local Discord client as Rich Presence — in real time, with vague, user-configurable status lines only.
It is a host-side background plugin: no tray icon, no UI, no window. Once installed it is injected into the harness startup flow and keeps running alongside dsh.
What it does
The plugin watches coarse activity signals from the running harness:
| dsh signal | Example status (default) |
|---|---|
| A user message entered the agent's inbox | 正在指挥大肥鱼干活 / 正在给大肥鱼喂 token |
| The agent is running (thinking / streaming) | 正在与大肥鱼一起 Brainstorming / 正在听大肥鱼讲解 Project |
| A model tool is dispatching | 正在提交改动意见 |
| A new session / fork (branch conversation) was created | 正在创建大肥鱼记忆切片 |
| No activity | 大肥鱼待命 |
Every one of these lines is a plain list you can edit in the plugin config (statuses). The plugin only ever sends those exact strings to Discord.
Rich mode (optional)
By default the plugin pushes the vague status lines above. In Settings → General → Rich presence detail you can switch on rich mode. When enabled, the plugin pushes smarter, data-driven status lines instead:
| Live fact | Example status |
|---|---|
| You just sent a message | 正在指导大肥鱼 |
| The agent is thinking | 大肥鱼正在思考 6/195 |
| Total input tokens | 大肥鱼正在记笔记 38.7M |
| Elapsed LLM thinking time | 大肥鱼已经思考了 30m46s |
Rich-mode statuses are picked intelligently and randomly from the current live facts — they are not bound to a specific moment — and each status stays on screen for at least 8 seconds.
The data is always tied to the conversation you are currently interacting with: the plugin tracks the session of your last real input (source.kind === 'user') and collects thinking steps, token counts, and elapsed thinking time from that session only — subagents, background sessions, and other workspaces never leak in. When you switch sessions, the pushed data follows automatically. The toggle is persisted at runtime in the discord-richpresence settings namespace; there is nothing to configure in the patch for it.
Privacy
The plugin never reads your workspace content. It does not look at session titles, message text, file paths, tool input/output, or any other content. It only reacts to coarse lifecycle signals (agent/inbox/inserted, agent/status, agent/pre-step, tools/pre-execute, session/created, workflow/start) and pushes the configurable status strings (or the rich-mode templates above, filled with scalar facts only — no content). If you keep the default lists, Discord can only ever see lines like "正在指挥大肥鱼干活".
Requirements
- A Discord desktop client running locally on the same machine (Rich Presence goes through the local Discord IPC endpoint — a named pipe on Windows, a unix socket on macOS/Linux, or loopback TCP).
- DeepSeek Harness 0.1.1-rc.1 or newer (adapted to the current npm
lateststable release0.1.5-rc.2and the0.1.6-alpha.2preview, while remaining compatible with the earlier0.1.1-rc.2).
Supported harness generations
The plugin probes what the running harness offers at startup — no per-version switch is needed:
| Harness version | Settings registration | Client store |
|---|---|---|
0.1.5+ (including latest 0.1.5-rc.2 and 0.1.6-alpha.2) |
ctx.settings.installSection(...) |
@deepseek-ai/dsh-client-store |
0.1.1-rc.1 – 0.1.4 |
ctx.settings.register(...) |
@deepseek-ai/dsh-client-runtime/client |
| Neither package reachable | falls back to the composition entry | inlined minimal store |
The plugin probes the running harness at startup, so upgrading the harness needs no plugin configuration change. If you are still on an older harness (e.g. 0.1.1-rc.2) the plugin keeps working; after upgrading the harness, restart dsh and refresh the page as described under Upgrading.
The Discord Application ID is pre-configured in the plugin, so there is nothing to set up — install and restart, and the status lines appear on your Discord profile automatically.
Install
Repository: https://github.com/0QwQ0/dsh-discord-richpresence Release tarball: https://github.com/0QwQ0/dsh-discord-richpresence/releases/latest/download/dsh-discord-richpresence.tgz
From your dsh checkout / profile:
dsh plugin --profile web add https://github.com/0QwQ0/dsh-discord-richpresence/releases/latest/download/dsh-discord-richpresence.tgz
or, if the package is already on disk (e.g. this repository):
dsh plugin --profile web add link:/absolute/path/to/dsh-discord-richpresence
Configure
All configuration lives in the bundle patch (cordis.patch.yml) under config:
config:
clientId: '1540732930127691807' # pre-configured; normally unchanged
details: 'DeepSeek Harness' # optional second line
largeImage: '' # optional Discord asset key
statuses: # user-editable lists, grouped by phase
userInput:
- 正在指挥大肥鱼干活
- 正在给大肥鱼喂 token
agentWorking:
- 正在与大肥鱼一起 Brainstorming
- 正在听大肥鱼讲解 Project
tools:
- 正在提交改动意见
forking:
- 正在创建大肥鱼记忆切片
idle:
- 大肥鱼待命
randomize: false # random instead of rotating
minIntervalMs: 5000 # min gap between pushes
reconnectMs: 15000 # Discord reconnect poll interval
statuses— each phase is a list; the plugin rotates through it (or picks randomly whenrandomize: true). Add, remove, or reword freely.- Discord may take a few seconds to reflect a status change;
minIntervalMsthrottles how often the plugin pushes. - The rich-mode toggle is not part of the patch — it lives in Settings → General and is persisted at runtime.
Uninstall
dsh plugin --profile web remove dsh-discord-richpresence
Does uninstall restore the pre-install state?
Almost — with one known leftover:
| Item | After uninstall |
|---|---|
dsh.profile.bundles entry |
✅ Removed automatically |
dependencies (package.json) |
✅ Removed automatically |
| Host plugin (event listeners, Discord RPC) | ✅ Stopped (fully gone after restarting dsh) |
| Browser settings toggle (client bundle) | ✅ Removed (disappears after a page refresh) |
node_modules link |
⚠️ A stale empty junction may remain (pnpm link: install physical file; harmless, removable manually) |
discord-richpresence: section in settings.yaml |
⚠️ Left behind (the settings service only unregisters the namespace; it does not delete the user settings document) |
The only manual step is settings.yaml. If you want a fully clean pre-install state, edit $DSH_HOME/settings.yaml and remove this block:
discord-richpresence:
richMode: true
The leftover is harmless (no consumer reads it once the plugin is gone) and is re-read if you reinstall.
Upgrading (old version → new version)
Same-package-name installs overwrite — no uninstall needed:
Upgrade from a Release tarball install
dsh plugin --profile web add https://github.com/0QwQ0/dsh-discord-richpresence/releases/latest/download/dsh-discord-richpresence.tgz
dsh overwrites the old package with the new tarball and keeps the dsh.profile.bundles entry.
Upgrade from a link: (source directory) install
If you installed with a link: spec (pointing at the plugin source directory):
dsh plugin --profile web add link:/absolute/path/to/dsh-discord-richpresence
After updating the source, restart dsh to pick up the new host code.
After upgrading
- Restart dsh (the host plugin loads at startup).
- Refresh the browser page (the client bundle is cached;
/plugins/dsh-discord-richpresence/client.jsis re-fetched, which is how the new settings toggle appears). - Settings are preserved: the
discord-richpresence: richMode: <true/false>value insettings.yamlsurvives upgrades — if rich mode was on before, it stays on after, no reconfiguration needed.
Upgrading the harness itself (e.g. 0.1.1 → 0.1.5)
The plugin adapts automatically to the newer settings API and client store package; no plugin configuration change is needed:
- Upgrade dsh the usual way (a
dsh plugin-managed profile updates its harness packages with the release). - Restart dsh: the host half probes whether
ctx.settingsexposesinstallSection(0.1.5+) orregister(0.1.1) and takes the matching path. - Refresh the browser page: the client half is re-fetched and resolves the store package for the new generation.
If the settings toggle disappears after a harness upgrade, the browser is usually still running the old client bundle — refresh once more, and restart dsh if it persists.
Upgrade problems?
If the toggle misbehaves after an upgrade, do a full uninstall first (including the manual settings.yaml cleanup above), then install the latest version fresh.
How it works
lib/discord-rpc.js— dependency-free Discord Rich Presence client over the local IPC frame protocol (handshake withclient_id, thenSET_ACTIVITYframes; ping/pong keepalive; automatic reconnect).lib/index.js— the Cordis host plugin. It registers global listeners for the coarse harness events, maps them to the configured status lists (or rich-mode templates), and pushes through the RPC client. Settings registration probes the running harness and usesinstallSection(0.1.5+) orregister(0.1.1); rich mode reads thediscord-richpresencesettings namespace; all timers and the socket are torn down when the plugin fiber unloads.lib/client.js— the browser half. Registers the Settings → General toggle row that writes therichModefield of thediscord-richpresencesettings namespace. Its store resolves in order:@deepseek-ai/dsh-client-store(0.1.5+) →@deepseek-ai/dsh-client-runtime/client(0.1.1) → an inlined implementation.
License
MIT
Links
More in this category
xmanrui/dsh-im★ 1710
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★ 1576
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★ 677
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★ 87
Desktop notifications for turn completions, with per-outcome controls and keyword rules.
THEWOLFWALKER/dsh-notifier★ 56
DSH notification & remote-control plane: one `notify()` API across 28 outbound channels, six inbound control channels, phone approvals/questions/task control, a Native DSH Notify & Control UI, live outbound hot-apply, multi-agent routing, and zero runtime dependencies.
whyihaveyou/dsh-suite#plugin-notify★ 56
IM webhook and local notifications on turn completion, errors, or approval (Feishu/WeCom/DingTalk/Slack/Discord/custom).
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.