A clickable wooden-fish desktop pet for the DeepSeek Harness web GUI. Click to knock; counts per day with a calendar heatmap of your streaks in settings.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:ShenpingDD/wooden-fish-dsh
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 clickable wooden-fish desktop pet for the DeepSeek Harness web GUI. Not a cartoon mascot — a zen digital 木鱼 you can knock anytime. Every knock is counted per day, and the settings page shows your daily trend.
✨ Features
- Floating wooden fish on the page — drag it anywhere, click to knock
- Knock feedback: fish shake + mallet swing + ripple ring + floating "+1"
- Hover the fish to see 今天已敲 N 次 (today's count)
- Per-day counting (
YYYY-MM-DDbuckets), persisted to$DSH_HOME/wooden-fish-data.json— survives restarts - Calendar heatmap in settings (
设置 → 电子木鱼): 3 / 6 (default) / 12-month ranges on a 5-level wood ramp, month + weekday labels, hover for details, today outlined — above today / total / streak cards - Remembers your setup — fish position and show/hide state persist across reloads
- Follows your theme — chrome uses the harness theme tokens (
--dsw-alias-*), so it matches light/dark and custom themes (e.g. sakura); the fish and heat ramp keep their wood identity - Scrollbar-free responsive heatmap — cells share the panel width equally (larger for short ranges, compact for the 1-year view)
- Zen wood style, zero network calls, data stays local
⚠️ No knock sound yet — feedback is visual only.
📸 Preview

Interactive demo: docs/preview-heatmap.html (open in a browser — drag and knock the fish, switch the heatmap range)
📦 Install
The plugin is an installable web-profile bundle package. From the DeepSeek Harness checkout:
dsh plugin --profile web add --config.minimumReleaseAge=0 -w <this-repo-path>
# then restart dsh
Or install directly from GitHub:
dsh plugin --profile web add --config.minimumReleaseAge=0 -w github:<owner>/wooden-fish-dsh
# then restart dsh
After restart the fish appears at the bottom-right automatically. No re-activation needed on later restarts.
🎮 Usage
| Action | Effect |
|---|---|
| Click the fish | Knock: +1 to today's count, animation feedback |
| Drag the fish | Move it anywhere (the position is remembered) |
| Hover the fish | Show today's count bubble |
| 设置 → 电子木鱼 | Stats cards + calendar heatmap (3 / 6 / 12 months) |
| Toggle in settings | Show/hide the floating fish (a "restore" pill appears while hidden; the choice persists) |
💾 Data
Stored at $DSH_HOME/wooden-fish-data.json:
{ "version": 1, "days": { "2026-08-18": 10, "2026-08-19": 3 } }
$DSH_HOMEis the harness data home (default~/.dsh)- Local-only, plain JSON, easy to back up or reset
- See docs/sample-data.json for a fuller example
🧱 How it works
| Half | Mechanism |
|---|---|
Host (lib/index.js) |
Registers JSON routes on the harness webServer (POST /muyu/knock, GET /muyu/summary, POST /muyu/client-hello) and persists via node:fs. Must declare a non-empty inject (['webServer']) — an empty list applies before services are ready and ctx.get() returns undefined for everything. |
Client (lib/client.js) |
A web ModuleLoader bundle (window.__ModuleLoader__.load(...)) that renders the fish in the shell.overlay slot and the heatmap page in settings.section, talking to the host over same-origin fetch. On DSH 0.1.5 dsh.client.inject must name ids that actually exist (@deepseek-ai/dsh-client-ui-renderer provides slots); an unsatisfiable id leaves the entry waiting forever and the UI silently never mounts. |
More: ARCHITECTURE.md
📚 Docs
- docs/PRD.md — product requirements (zh)
- docs/UI-DESIGN.md — design spec: tokens, states, animations (zh)
- docs/wooden-fish-preview.html — interactive UI preview (open in a browser)
- docs/fish.svg — the fish artwork
- CHANGELOG.md · DEVELOPMENT.md · SECURITY.md · CONTRIBUTING.md
⚖️ License
Links
More in this category
PC2005-cloud/dsh-pet#dsh-pet★ 5347
Desktop pet for the DSH Web UI on Windows, macOS and Linux: 106 transparent animations in the browser overlay or a transparent always-on-top desktop window, throw-and-bounce drag physics with squash and particle scoring, a work-status bubble driven by live session events, self-talk and chat with persistent memory, balance display, meme-image bubbles, multiple pets on screen, and drop-in custom animations and pet packs.
Alterssss/dsh-bili-whale★ 862
A Bilibili companion that keeps its own schedule. A 60-second tick in the plugin host wakes a dedicated agent session at a random moment inside the configured time windows (opting out of a day is a configurable chance), then hands it a bundled CLI of 38 subcommands — feed, subtitles, danmaku, comments, ffmpeg frame grabs, and two diaries. Shares at most N items a day by commenting on them and @-mentioning the owner (default 3, enforced from a written quota log, and it stops on rate-limit or captcha signals). Also polls comment replies, direct messages and live-room danmaku; replies to anyone but the owner are queued for approval in Settings. Settings → 养鱼 writes ~/.dsh/bili-whale.config.json; cookies live separately in ~/.bili-ai/credentials.json and are never echoed back. The HTTP routes are loopback-only behind DSH's trust fence. Needs Node 18+ and ffmpeg on PATH for frame extraction.
Nagi-ovo/dsh-ads★ 707
Parody ads in 2005-Chinese-web style: sidebar banners, in-chat feeds, corner popups, and a close button whose hit area is smaller than it looks. All fictional.
yyh-001/dsh-meme★ 488
Chat meme stickers: text-only send, mood auto-send, QQ/WeChat-style picker, auto-learn, custom packs.
vlln/whale-girl★ 400
Desktop pet (QQ-pet style): floats in the corner, draggable, feedable, playable.
a86582751/dsh-nexttavern★ 218
NextTavern is a long-form roleplay plugin for DeepSeek Harness 0.1.7-rc.2 Web, with character-card import and creation, worldlines, worldbooks, layered long-term memory, keyword/semantic/hybrid retrieval, character agents, and card or novel export. SillyTavern character-card import is supported; v0.2.9 fixes distribution and installation.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.