Electronic wooden fish in the bottom-right corner of the DSH web UI, a whale-girl sprite by default: tap the head to earn merit; it knocks by itself while the model is busy; per-session merit is stored locally, and the sprite can be swapped for custom art.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-muyu
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:liuwenji007/dsh-muyu
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
中文 | English
Harness is still preview. Capacity feels tight, the API sometimes crawls, and a loop can die mid-turn. Waiting those minutes gets under your skin — so here is a sulky little blue whale in the corner. Knock her once for a merit while you wait. Hope the compute farms catch up and the prices come down. When she is busy she knocks herself; AFK merit, goof off a little.
Wooden-fish overlay in the lower-right of the Web client. Knock the head for merit; while the model is thinking or streaming she knocks on her own. Merit stays in this browser — never the session log, never an extra request. Swap the art if you want.
| Manual | Auto |
|---|---|
![]() |
![]() |
Play
- Click the head: +1 merit. Enough knocks in a row and she bumps.
- Use the lock chip to unlock, drag, then lock again; while unlocked, scroll or use −/+ to scale. Settings can hide the chip.
- While the current session is busy: auto-knocks also score (about 1 merit per second by default).
- Switch session: the plaque shows that session's count (0 if unseen); pose resets.
- Plaque is censer or board (default censer). Exact digits through 9999, then
Nk. prefers-reduced-motionskips the hop and the floating +1.
Tune feel and packs in Settings → Wooden fish. Library to import/switch; Edit to align; remote URL for hosted packs.
Community skins: dsh-muyu-skins (import zip → Library → Use).
Install
You need a working dsh web (DeepSeek Harness).
Requires dsh ≥ 0.1.0-rc.8 (recommend 0.1.1-rc.2). dsh-muyu 0.1.5+ needs @deepseek-ai/dsh-client-store in the host module table.
Upgrade in pairs — the market will not block a mismatched bump:
| Host | This plugin | Result |
|---|---|---|
new (has dsh-client-store) |
≥ 0.1.5 | OK |
| new | ≤ 0.1.4 | dsh-client-runtime/client missed the module table |
old (only dsh-client-runtime/client) |
≤ 0.1.4 | OK |
| old | ≥ 0.1.5 | dsh-client-store missed the module table |
| dsh ≥ 0.1.7 | ≤ 0.1.8 | Knocks, but records no merit and floats no +1 |
Do not bump only the fish to 0.1.5 on an old dsh — upgrade the host first, then the plugin; or pin dsh-muyu@0.1.4 until you can.
≤ 0.1.8 on dsh ≥ 0.1.7 records no merit and floats no +1. From 0.1.7 the open session is no longer current on the list; the main view holds that row (retainedBy.mainView). 0.1.9 reads that hold (older hosts still use current). Stored merit is left as it is.
Check the host first:
dsh --version
# if too old: npm i -g @deepseek-ai/dsh@latest
From npm (recommended)
dsh plugin --profile web add dsh-muyu
dsh --profile web
Already installed: update from Plugin Market, or dsh plugin --profile web add dsh-muyu@latest, then restart Web. The published tarball already contains lib/, so allowBuilds is usually unnecessary.
From GitHub
dsh plugin --profile web add github:liuwenji007/dsh-muyu
dsh --profile web
pnpm ≥10 may block a git dependency's prepare. After the first failure, add the package key pnpm printed to that profile's pnpm-workspace.yaml:
allowBuilds:
dsh-muyu: true
Then add again. Prefer pinning a commit: github:liuwenji007/dsh-muyu#<sha>.
Local link (development)
cd /abs/path/to/dsh-muyu
pnpm install
dsh plugin --profile web add link:/abs/path/to/dsh-muyu
dsh --profile web
Verify and remove
- Working: the fish is in the corner, or
dsh --profile web --dump-configlists this package. A page refresh is not enough — restartdsh web/dsh --profile web. - Remove:
dsh plugin --profile web remove dsh-muyu, then restart. Remove does not wipe browser merit or library packs; reinstall restores them. To erase everything, use Settings → Wooden fish → Data → Clear all wooden-fish data.
Troubleshooting
| If | Then |
|---|---|
dsh-client-runtime/client or dsh-client-store missed the module table |
Host/plugin mismatch: new host needs ≥ 0.1.5; on an old host upgrade dsh ≥ 0.1.0-rc.8 then the plugin (or pin dsh-muyu@0.1.4); Market update or add dsh-muyu@…, restart Web |
| Knocking records no merit and floats no +1 (dsh ≥ 0.1.7) | The plugin is ≤ 0.1.8. Upgrade to ≥ 0.1.9 and restart Web |
| two overlays | The Web bundle may already ship ui-muyu. In the profile cordis.patch.yml, set - id: ui-muyu / disabled: true |
git install hits allowBuilds |
See “From GitHub” above |
| prefer a tarball | pnpm pack, then dsh plugin add ./dsh-muyu-0.1.0.tgz |
Settings
| Field | Default | Meaning |
|---|---|---|
| Show overlay | on | Off hides the sprite; the settings page stays |
| Plaque | censer | Censer or wooden board |
| First auto-knock after busy | 1000 ms | |
| Auto-knock interval | 1000 ms | |
| Big-bump combo | 5 | Release at or above this plays big bump, then recover (or small bump if that sprite is missing) |
| Art source | built-in | Built-in / workshop / library / URL |
| Library | (empty) | Imported zips / packs saved from the workshop; switch, rename, delete |
| Local workshop | (empty) | Folder or PNGs to align; export an aligned pack or save into the library |
| Pack URL | (empty) | Hosted directory or .zip URL; optional layout.json |
| Export aligned pack | — | Under the workshop; bakes pose crops and writes layout.json so others can import and use it |
Files in that folder or zip: idle.png, auto-hit.png, manual-hit.png, bump.png, bump-big.png, stick.png, board.png, censer.png, add.png. Optional bump-recover.png and layout.json. Aligned packs bake pose crops into the PNGs; layout.json mainly carries hotzone / stick / float / plaque placement. Changes apply immediately — no reinstall.
Settings → Wooden fish → Export template downloads the official filenames zip; after aligning, use Export aligned pack under the workbench to share. A zip URL needs CORS on the host.
The workshop and library are separate: importing a zip adds a library entry and does not wipe files you are editing.
Bump hold and auto-hit pose length stay matched to the default art — edit ART_TUNABLES in src/config.ts and pnpm run build. Stick hotspot and hotzone are tunable in the workbench / layout.json.
Notes
- Merit lives in this browser's
localStorage(dsh.muyu.merit), capped at the 100 most recently knocked sessions. Workshop drafts and library packs live in IndexedDB (dsh.muyu.art), separate from the URL field. Deleting a chat in the Host does not prune it. Private mode or quota failure only disables persistence on this page. After reinstall, if meaningful old data is found (merit knocked, prefs changed, or a non-empty library), you get a one-time prompt; choosing Keep using storesdsh.muyu.dataPrompt. - No dragging, so it does not cover the side panel.
- You can also replace files under
src/client/assets/and rebuild to ship a new default skin.
This repo
pnpm install
pnpm test
pnpm run build
MIT
Links
More in this category
PC2005-cloud/dsh-pet#dsh-pet★ 1011
Desktop pet for the DSH Web UI with 25 transparent animations, screen wandering, click reactions and drag, plus a reproducible asset-generation pipeline.
Nagi-ovo/dsh-ads★ 647
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.
vlln/whale-girl★ 342
Desktop pet (QQ-pet style): floats in the corner, draggable, feedable, playable.
a86582751/dsh-nexttavern★ 140
Roleplay workspace for DeepSeek Harness: import SillyTavern/TauriTavern character cards or author one from scratch through an interactive flow; turn a long TXT novel into a playable card with either an intensive or a coarse reading pass; the main agent consults worldbooks on demand, and prose is read in a dedicated tavern reader tab; explore multiple worldlines inside one conversation (regenerate, edit-and-send, explicit clone); scoped style presets with 16 built-in styles, a character agent cluster, a standalone decision card, and card or novel export; long stories hold together through a frozen settings prefix, a hard-cut context window, traceable director notes and keyword/semantic/hybrid recall, with embeddings either online or fully local. Targets Harness 0.1.2-alpha.3 and applies its documented compatibility patches.
yyh-001/dsh-meme★ 133
Chat meme stickers: text-only send, mood auto-send, QQ/WeChat-style picker, auto-learn, custom packs.
Sutera-Diffusus/dsh-whale-musume★ 111
A whale-girl desktop pet for the DeepSeek Harness Web UI: pat-to-raise growth, work-state poses per tool type, 494 dialogue lines, 30 achievements, a growth diary, drag physics, theme sync and an accessibility mode. Chat-keyword sensing and API-balance care ship off and are opt-in; an optional weather mood calls Open-Meteo only after you name a city. No telemetry.


Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.