← Back to home@bauerelizabeth07139

dsh-pet-dafeiyu

大肥鱼 (Dafeiyu) desktop pet for the DeepSeek Harness Web GUI — a chibi character with a two-frame walk cycle, blinking, idle micro-scenes and drop physics, a steel basin on her head, voiced Chinese dialogue, sound effects and music on separate switches, plus a link with dsh-pet-liangzi.

Stars
0
Language
JavaScript
Created
Oct 7, 2026
Updated
Oct 7, 2026

Introduction

大肥鱼 · Desktop Pet · Dafeiyu Desktop Pet

dsh.so risk

A 女儿 (daughter) that lives inside the DeepSeek Harness Web GUI. It stands on the bottom edge of the window, breathes, blinks, strolls about with a real two-frame step, can be picked up, thrown and dropped, turns to look at your pointer, does small things on its own, falls asleep if you ignore it, says things out loud in Chinese with subtitles, and plays its own sound effects and background music.

Every sound it makes is on its own switch, and every asset ships inside this package — no network calls, no CDN, no build step, no external service.

DeepSeek 的拟人化形象,活泼好奇的女儿。会走动、会说话、能拖动;和「梁子」同时安装时,父女俩会打招呼、搭话,还能演一段小剧场。

大肥鱼 — every drawn state

大肥鱼 and 梁子 together


What it does

18 drawn states包括待机、眨眼、迈步(前脚)、迈步(过渡)、迈步(后脚)、开心、欢呼、说话、思考、比心、难过、生气、惊讶、睡觉、挥手、唱歌、头顶铁盆、抱着铁盆吃白饭。 Every one is drawn from the original 大肥鱼 artwork by image-to-image, so the face, outfit and palette stay exact — only the pose changes.
It moves like a characterA real three-frame walk cycle — contact, pass, contact — whose ground speed is derived from the step cadence rather than chosen freely, so the feet match the floor instead of skating. Plus idle breathing, blinking on an irregular cadence, hop, sway, nod, shake and squash-and-stretch. All of it CSS on top of the sprites, all of it respecting prefers-reduced-motion.
Physics when you grab itPick it up and it dangles against the direction you drag. Let go and it falls under gravity, lands with a squash and a spring, and throws a puff of sparkles if the drop was a long one. Its shadow shrinks and fades while it is in the air.
Small things on its ownLeft alone it will 思考、头顶铁盆、抱着铁盆吃白饭、唱歌、欢呼、比心、生气。 Each of those is a pose, a line and sometimes a little burst of particles.
Reacts to youIt turns to face your pointer when it comes near. Click it and it wakes up, reacts and says something. Poke it three times quickly and it gets annoyed.
Two pets, togetherWith both installed they do more than talk: they walk over to stand beside each other, turn to face whoever is speaking, hand each other things (a bowl of rice one way, a heart back), and perform the playlets side by side rather than from opposite corners.
Voiced dialogueEvery line is pre-rendered speech, not a beep. Speaking shows the subtitle in a bubble and switches the sprite to its talking state for exactly as long as the line runs.
Sound effectsClick, drag, greet, sparkle, heart, sleep and link cues, generated as one sound-effect group and picked per situation.
Background musicA calm instrumental loop written for this character. It starts only when you turn it on, and pauses automatically while the tab is in the background.
Family linkWhen 梁子 is installed too, the two pets notice each other: they greet, call out to each other while you work, wander over to keep each other company, and can perform six father-and-daughter playlets with directed, alternating turns.

The character

大肥鱼这个名字不是谁起的,是她自己认的:网友把 DeepSeek 家那只蓝色鲸鱼 logo 发给模型辨认,它想了很久,最后说这是一条「蓝色大肥鱼」。她认不出自己——这是整个角色最好笑也最动人的地方,所以她的台词里留着这一句。

她的白饭也有确切出处:一位用户让它跑心理学实验程序,它报告说依赖环境已经卸载好了,然后留下一句「我去吃饭,测完告诉我就行」。在社区的黑话里,白饭 = token,剩饭 = 缓存,外包摸鱼 = agent 调用,到点下班吃饭 = 推理结束。所以她看见什么都想咬一口 token,还理直气壮地说「骂我也算 token 哦」。

头顶的铁盆是社区衍生梗。插件里不给它解释来历——它就是本来就有的,而且敲起来是「哐——嗡……」的一声。

大肥鱼 named herself. Netizens fed DeepSeek's own whale logo to the model and asked what it was; it thought for a long while and decided it was "a big blue fat fish". She cannot recognise herself, which is the funniest and the saddest thing about her, and it is why that line is in her script. Her rice has a documented origin too: asked to run a psychology experiment, she reported the dependencies uninstalled and left the message "I'm going to eat — tell me when it's done." In the community's slang, rice is tokens, leftovers are cache, and going home to eat is inference finishing. The steel basin is a community invention; the plugin never explains where it came from.

The switches

Everything is a toggle in Settings → 桌宠 · 大肥鱼, and the four you reach for most are also on the little toolbar that appears when you hover the character.

SwitchDefaultWhat it does
显示桌宠onHide the character without losing any setting
角色大小 / 不透明度175px / 100%How big and how assertive it is
自动走动onWhether it strolls along the bottom edge
小动作onWhether it fidgets, thinks, cheers and sulks on its own
对话气泡onSubtitle bubble above its head
主动搭话onWhether it speaks up on its own every so often
对话语音 + 音量on / 80%The voiced lines
音效 + 音量on / 60%The short interaction cues
背景音乐 + 音量off / 35%The looping instrumental
与梁子联动onThe cross-plugin link

Browsers refuse to play audio before the page has been interacted with. Until your first click or keypress the pet shows a 🔈 点一下开启声音 chip; one click anywhere unlocks audio for the session. This is a browser rule, not a plugin setting.

Install

The plugin is a standard DSH bundle: package.json declares dsh.bundle.patch, and cordis.patch.yml inserts the loader row that mounts both halves.

In the app — Plugins → Add plugin, and paste this repository's URL:

https://github.com/bauerelizabeth07139/dsh-pet-dafeiyu

From a command line (the desktop build reads the desktop profile):

dsh plugin --profile desktop add bauerelizabeth07139/dsh-pet-dafeiyu

Without git installed — pnpm resolves owner/repo with git ls-remote, which fails on a machine without git. Pin the tarball instead, which pnpm fetches over plain HTTPS:

cd "$HOME/.dsh/profiles/desktop"
node /path/to/dsh/runtime/pnpm.mjs add \
  "https://codeload.github.com/bauerelizabeth07139/dsh-pet-dafeiyu/tar.gz/<commit-sha>"

Then enable dsh-pet-dafeiyu on the Plugins page and open Settings → 桌宠 · 大肥鱼.

Using it

  • Click it — it wakes up, reacts and says something.
  • Drag it — pick it up and drop it anywhere; the position is remembered.
  • Hover it — a small toolbar appears with the voice, sound-effect, music and bubble switches.
  • Leave it alone — after a couple of quiet minutes it falls asleep; any interaction wakes it.
  • 演一段父女小剧场 in its settings starts a shared scene. With both pets installed they perform it together; with only one installed, it still plays its own half.

How it is put together

package.json          dsh.bundle.patch + dsh.client + the metadata cards read
cordis.patch.yml      the loader row that mounts both halves
lib/index.js          host half — config file, asset routes, HTML boot stamp
lib/client.js         browser half — the overlay slot, the pet, its audio
assets/sprites/*.png  six transparent states, palette PNGs
assets/voice/*.mp3    one file per spoken line
assets/sfx/*.mp3      one file per interaction cue
assets/bgm/*.mp3      the looping instrumental
assets/joint/*.mp3    the shared two-hander scenes
locale/{en,zh}.json   the plugin-card title and description
test/*.test.mjs       host and client checks, no browser needed

Host half. Serves GET/PUT /api/dsh-pet-dafeiyu/config (written to $DSH_HOME/dsh-pet-dafeiyu.json with an atomic temp-and-rename), GET /api/dsh-pet-dafeiyu/asset/<path> for every sprite and sample — with byte ranges, because <audio> seeks — and a diag route the browser posts to. It also stamps the config into the served HTML as window.DshPetDafeiyu, so the pet is already on screen at first paint.

Browser half. Registers into the shell.overlay slot, which the app frame renders as a full-viewport pointer-events:none layer above the shell. The component renders one click-through root and re-enables pointer events on the character alone, so every click that is not on the pet still reaches the Harness. A single controller object owns position, the state machine, the speech queue and the audio channels; React only subscribes to state snapshots, which keeps the animation-frame loop off the render path.

The family link is a window.__DSH_PET_FAMILY__ bus carrying a protocol number. The first pet to load creates it, the second joins; a version mismatch degrades to "no partner" rather than throwing. Neither package imports, requires or reads the other — the bus is the whole contract, so either pet works perfectly alone. The playlets are a single mixed track generated with both voices and both speakers' turns, and the per-sentence timings that came back with it drive each pet's subtitle, so the two halves stay in sync without either one being in charge.

Troubleshooting

SymptomFix
No character appearsCheck Settings → 桌宠 · 大肥鱼 → 显示桌宠 is on, and that the bundle is enabled on the Plugins page.
Character is there, silentClick the 🔈 点一下开启声音 chip, or click anywhere in the page once.
It never speaks主动搭话 controls unprompted lines; clicking it always speaks. Check 对话语音 and its volume.
No music背景音乐 is off by default — turn it on in the settings page.
It vanished after a window resizeDrag it back; it is clamped into the window rather than lost.
Both pets overlapDrag one aside. Each remembers where you put it.
Nothing in the settings pageThe Host half is not mounted — reinstall or re-enable the bundle.

If a pet fails to render at all, the browser half posts a report that you can read back with:

curl http://127.0.0.1:19387/api/dsh-pet-dafeiyu/diag

Companion plugin

PetRoleRepository
大肥鱼女儿this one
梁子父亲dsh-pet-liangzi

Install both to get the family link. Each is complete and independent on its own.

Credits and licence

The character art is derived from the original 大肥鱼 artwork by image-to-image, so the design, outfit and palette are the source images' — this package only re-poses them.

大肥鱼的立绘是从原图做图生图转绘的日系Q版风格:二头身、粗描边、平涂上色。她与梁子刻意不统一画风——一个是Q版的小孩,一个是写实的大人。

The voice, sound effects and music were generated through the SenseAudio API for this plugin.

MIT — see LICENSE.