adengou/dsh-chubby-whale: DSH Web-based Desktop Pet "Chubby Whale"

Foreword

When developers write plugins for DSH (DeepSeek Harness), they are faced with nothing but plain text logs and command line output when debugging interfaces—there’s absolutely no life to be found on the page. adengou/dsh-chubby-whale (“Chubby Whale”) plops a blue-haired maid whale girl in the bottom right corner of the harness page: permanent, draggable, blinking, capable of voice conversations, storytelling, reciting poetry, and meal reminders. It is maintained by community developer adengou. It falls under the “fun outfit” category and is a fun frontend plugin based on the “everything is a plugin” philosophy, not an official application.

Below, we introduce its capabilities, installation methods, and configuration highlights.

What is it

In one sentence: A DSH web plugin that places an interactive blue-haired maid whale girl in the bottom right corner of the harness page, blending companionship, chatting, voice, cultural content, and reminders.

  • Maintainer: adengou
  • Main Repo: Gitee (README states “Only releases on Gitee”)
  • License: MIT
  • Version: 1.1.51
  • Runtime requirements: Node.js >= 22.3, dsh >= 0.1.0

It does not solve an engineering problem, but an experience problem: “The DSH web page is too lonely.” The offline portions can be used without a Key.

Core Functions

The README divides capabilities into seven categories: Companionship, Chat, Voice, Culture, Music, Tools, and Interface. Here, we summarize them based on how they can be used.

  • Companionship. The standing illustration stays in the bottom right corner. Dragging has inertia and remembers position. Auto-blinking, mouth movement when speaking. Feeding emits hearts. Emotional expressions include idle, hungry, sleepy, excited, shy, angry, and food-protecting states.
  • Chat. Bubble dialogue uses DeepSeek. The persona is fixed (name, parents, birthday, birthplace). Supports Chinese and English bilingualism, with long-term memory summaries. Streaming and normal paths tally intimacy/experience/summaries equally. The chat box auto-focuses.
  • Voice. Text-to-speech offers 9 voices, can be turned off or paused. Voice standby acts as a constant listening mode. Voice chat has a toggle. Duration estimation is separated by language; Chinese by character, English by word.
  • Culture. Storytelling includes 17 ancient texts, recites original text, remembers progress, no repetition, and progress is isolated by data source. Poetry recitation of 737 poems. Allusions 261, idioms 834, folk tales 696, couplets 51 in 11 categories. Also includes “Select Book ▸ Book List”, “Quote of the Day”, and “Daily Brief”.
  • Music. 11 Web Audio synthesized tracks, supporting sharps/flats and bass range.
  • Tools. Reminders support colloquial time (“9 o’clock”, “tomorrow 9”, “half an hour later”, “8 o’clock daily”). In the management panel, typing numbers deletes, typing d delays by 10 minutes. Supports viewing images, dragging files (image recognition/text summary), growth and intimacy, fish food ledger, balance, clearing memory, data export/import, and usage statistics.
  • Interface. Interface language can be Chinese (default) or English. Right-click menu supports keyboard navigation (↑↓/Enter/Esc). “Make it swim around” is reversible; restore via “○” in the bottom right or Ctrl+Shift+W. Multi-tabs are independent.

Installation & Enablement

The README provides two sources; choose either.

Install from Gitee (Recommended):

dsh plugin --profile web add "git+https://gitee.com/adengou/dsh-chubby-whale.git"
dsh web

Local link (Development/Debugging):

dsh plugin --profile web add "link:C:\Users\<you>\.dsh\plugins\dsh-chubby-whale"
dsh web

After installation, refresh the page to see Chubby Whale. When opening the page for the first time, you need to click anywhere first, as browsers require user gestures to allow microphone access.

Uninstall:

dsh plugin --profile web remove dsh-chubby-whale

Note that the plugin package and runtime data are separate: runtime data is in ~/.dsh-chubby-whale/ (memory, intimacy, growth, fish food, reminders, cache). Uninstalling the plugin does not delete it.

Configuration

The Key is not distributed with the package and needs to be configured manually. Copy config.example.json to config.json (config.json is already gitignored), place it in ~/.dsh/plugins/dsh-chubby-whale/config.json or the package installation directory:

{
  "deepseekKey": "sk-...",
  "siliconflowKey": "sk-..."
}

You can also use environment variables CHUBBY_WHALE_DEEPSEEK_KEY, CHUBBY_WHALE_SILICONFLOW_KEY; priority is config.json → dedicated env var → generic names DEEPSEEK_API_KEY / SILICONFLOW_API_KEY (fallback only). The README specifically states this plugin deliberately does not read ~/.dsh/.credentials.yaml to avoid interference with other plugins.

Behavior without a Key has been tested: the plugin loads normally without errors. When no DeepSeek Key is configured, it prompts once “Key not configured” after the page loads, and chat replies explicitly state the missing Key without sending model requests. When no SiliconFlow Key is configured, after turning on voice, the first recognition prompts once and stops, no repeated retries spamming the screen. Voice synthesis uses edge_tts and requires no Key; if local Python dependencies are missing, it automatically falls back to browser reading.

Storytelling, poetry recitation, allusions, idioms, folk tales, piano playing, reminders, and growth are all fully usable offline and do not consume tokens.

The data source defaults to local, reading from data/ inside the plugin package (required, 33MB). After changing to cloud, it pulls on-demand from https://adengou.cn/culture/v1/. It downloads only when a specific book or cultural type is first used. It is cached in the process and invalidates only when version+generatedAt in manifest.json changes. Network failures automatically fall back to local and log CLOUD-DATA-FAIL, no retries within 60 seconds, and errors do not bubble up to the frontend. You can also use CHUBBY_WHALE_DATA_SOURCE=cloud as a fallback. Priority is cordis config → config.json → environment variable → local.

The master switch is config.enabled in cordis.patch.yml. Changing it to false and restarting dsh web stops the host from registering any /api/chubby-whale/* routes, and the startup log prints [chubby-whale] disabled by config. This stops the host; to disable the frontend bundle as well, use the disabled: true built into the entry.

Self-evolution consists of two switches, both enabled by default and can be turned off. personalityLearning defaults to true: every 20 real replies and ≥6 hours since last time, it extracts the main character’s catchphrases/preferences/notes from recent dialogue, with limits on count and length. Core settings like name, family, birthday, language rules are locked and immutable. personalityWriting defaults to true: every 20 real replies and ≥24 hours since last time, it writes a “recent mood” sentence ≤80 chars. If the output contains identity words like “I am / rename / dad / mom / birthday / AI”, the whole sentence is discarded and not written to disk.

Stored in ~/.dsh-chubby-whale/personality.json. Atomic writes. Bad files are isolated as .bad-<timestamp>, keeping only the last 20 change history. View via GET /api/chubby-whale/personality, revert via POST /api/chubby-whale/personality/revert (revert one at a time, can be pressed consecutively, supports reverting “recent mood”). When turned off, existing content is still injected, but it stops learning and writing new moods.

Regarding hot updates, data/story/*.json, data/culture/*.json, and data/poems.json invalidate based on file modification time. After saving changes, they are re-read on the next request, requiring no restart or cache clearing.

Typical Usage

After installing, configuring Keys, and starting dsh web: Click Chubby Whale in the bottom right corner of the page to enter the chat box. Select an ancient text for storytelling, and it will recite the original text and remember progress. Before mealtime, just say colloquially “Remind me tomorrow at 9” to create a reminder. To practice speaking, turn on voice chat; if you don’t want constant dictation, turn off voice standby.

When modifying content locally, directly edit the JSONs under data/; saving takes effect immediately. Modifying src/ requires following the development process in the README: npm install, npm run build, npm test. Host-side changes require restarting dsh web, while client-side changes can be done with Ctrl+F5.

Common issues are already in the README: No sound, check python -m edge_tts --help; Can’t understand speech, check siliconflowKey and browser microphone permissions; No content for storytelling/poetry under local, confirm data/ is complete (33MB); under cloud, check logs for CLOUD-DATA-FAIL.

Suitable Scenarios & Notes

Suitable for developers who want to add a sense of companionship to the DSH web page or want to verify frontend bundling interactions with the host routing. It is not a productivity tool; cultural content leans towards offline personal use.

Be aware that the plugin runs with the permissions of the current dsh web process. It can access the network, files, and Keys that this process can access. Before installing, read the src/ source code and confirm the MIT license, then decide whether to enable cloud data sources and self-evolution switches. All model calls consume quota from the corresponding services; offline cultural functions do not consume tokens.

Conclusion

The value of Chubby Whale lies in proving that DSH web plugins can achieve a complete closed loop of “Host Routing + Frontend Bundle + Local Data” while remaining light. If you just want to add a whale girl who recites poetry to the harness page, you can get it up and running in ten minutes using the Gitee installation method above.

Directory: https://www.skillhub.cn/plugins/adengou/dsh-chubby-whale
GitHub: https://github.com/adengou/dsh-chubby-whale
Main Repo: https://gitee.com/adengou/dsh-chubby-whale

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye