dsh-pet
PC2005-cloud/dsh-petDSH Web UI 桌面宠物,Windows / macOS / Linux 三端可用:浏览器浮层或透明置顶桌面窗口,106 个透明动画、带挤压与粒子的甩抛反弹物理、随会话事件实时联动的工作状态气泡、碎碎念与带持久记忆的对话、余额展示、表情包配图、多开同屏,并支持直接放入的自定义动画与宠物种类(pet pack)。
为 DeepSeek Harness Web 界面打造的电子木鱼桌宠。点击敲击、按天计数,设置页以日历热力图展示每日敲击与连续天数。
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.
YYYY-MM-DD buckets), persisted to $DSH_HOME/wooden-fish-data.json — survives restarts设置 → 电子木鱼): 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--dsw-alias-*), so it matches light/dark and custom themes (e.g. sakura); the fish and heat ramp keep their wood identity⚠️ No knock sound yet — feedback is visual only.
Interactive demo: docs/preview-heatmap.html (open in a browser — drag and knock the fish, switch the heatmap range)
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.
| 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) |
Stored at $DSH_HOME/wooden-fish-data.json:
{ "version": 1, "days": { "2026-08-18": 10, "2026-08-19": 3 } }
$DSH_HOME is the harness data home (default ~/.dsh)| 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