Pixel-art whale desktop companion with 29 frame-audited states — taps the glass and flashes the tab title when an approval waits, speaks a completion report when a turn ends, and adds a slash-command palette to the web client.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:cookiesheep/whale-on-desk
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. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
English | 中文 | 🏠 Landing site
A pixel-art whale companion for DeepSeek Harness — one that actually knows what your agents are doing.
Start a long task, walk away, and come back when the whale tells you it's done. It reports finished turns with real numbers, taps the glass (and flashes your tab title) when an approval is waiting, and counts your tool calls as a school of fish.

Why it's not just a sticker
| Agent activity | Whale reaction |
|---|---|
| Turn starts | waves hello, then gets to work 👋 |
| Model streaming | thinks along / swims laps 💭 |
| Tool call | blows a labeled bubble (敲命令 / 读文件 / …) |
| Turn finishes | speaks up: "搞定! 3 分 12 秒,跑了 8 个工具,改了 5 个文件" |
| Approval waiting | taps the glass; the browser tab title flashes 🔔 |
| Context filling | eats at 62%/82%, sinks past 84% 📉 |
| Compaction | curls into a ball to digest |
| Idle 5 min | asks for work ("我闲着呢,有活吗?") |
| 10 min idle / late night | sleeps, or wears a nightcap 🌙 |
| You click / pet / poke it | quips, purrs, startled flail (synth sounds, zero assets) |
Every sprite ships only after a frame-by-frame pixel audit — exact 8-color palette, zero debris, seamless loops.
Install (30 seconds)
dsh plugin --profile web add whale-on-desk
Open (or restart) the DSH web UI — that's it, no API key, no config. Works in the community DSH Desktop app too: tray → Open DSH Terminal → dsh plugin add whale-on-desk → restart the app.
Two more tricks
- ⌘ Command palette (right-click the whale): DSH ships a full command registry but the web UI never got a launcher — the whale brought one. Filter, run, no model turn spent.
- 🐠 Aquarium mode (right-click): a painted water skin over your working UI — keep coding inside the tank while the whale mirrors your agent, token fish count tool calls, a coral grows with your progress, and a depth gauge reads the context window.
Uninstall / configure
dsh plugin --profile web remove whale-on-desk
Sleep timeout is configurable in cordis.patch.yml (sleepAfterMinutes, default 10). Right-click the whale for a small menu (mute sounds / reset position / switch pet / hide — double-click the corner 🐳 to restore). Setting allowPreview: true additionally exposes POST /whale/preview {"state":"glass-tap"} (clear with {"state":null}) — handy for demos and screenshots; off by default.
Managing the plugin (GUI)
dsh plugin add whale-on-desk is the official install path, and the ecosystem provides GUI managers on top of it:
- dsh-plugin-toggle adds a Settings → Plugins switchboard: every loaded plugin (including this whale) gets a card with a start/stop toggle — no config rewrites.
- dsh-market adds an in-harness plugin market: browse and one-click install community plugins from the curated lists.
Install either once (dsh plugin --profile web add dsh-plugin-toggle), and day-to-day management stays in the UI. The whale's own right-click menu also has hide/show, and enabled: false in its config unmounts it entirely.
Aquarium mode

Right-click the whale → 🐠 水族馆 for a fullscreen tank: painted water plates (auto light/dark), seaweed, a progress coral that grows with your tool calls, token fish counting the turn's tools — and the whale itself mirrors the agent state, tapping the glass (buoy blinking) when an approval waits. The water layer stays translucent and click-through: you keep coding inside it. Esc (or the ✕ button) brings back the companion.
Pet forge (AI-crafted pets)
The plugin registers a pet-forge skill in your harness: ask your agent "给我做一只粉色章鱼桌宠" and it will design the sprite sheet, run it through the same pixel audit the bundled whale passes, cut the GIF, install it as a pet pack, and switch to it live — no restart. (Requires ffmpeg on PATH.)
Custom pets
Drop a sprite pack into ~/.dsh/whale-on-desk/pets/<name>/ — a manifest.json mapping states to GIF files, plus the GIFs:
{ "idle": "idle.gif", "glass-tap": "tap.gif" }
States you don't provide fall back to your idle sprite, and any file you don't ship falls back to the bundled whale. Right-click the whale to switch pets; the change applies instantly (no reload). Related config: pet (pet name to activate at boot), petsDir, and enabled: false to unmount the overlay entirely.
How it works
- Host half (
lib/index.js): a Cordis plugin listening tosession/event(turns, chunks, tool calls, approvals — all durable session events) and folding them into a small state machine (lib/pet-machine.mjs). Exposes/whale/state,/whale/poke,/whale/assets/*on the DSH web server. Read-only: it never touches your sessions or files. - Browser half (
lib/client.js): registers via the DSH shell module loader, mounts into theshell.overlayslot, renders the current state's sprite (500 ms poll), plays synthesized sounds, and persists its position. - Art pipeline (
tools/process-sprites.mjs): AI-generated sprite sheets in, clean looping GIFs out — slicing, exact 8-color palette snapping (pure nearest-color math), magenta chroma-key, decoration removal.
Making your own states
See docs/GPT_PROMPT_PLAYBOOK.md — the full workflow for generating new whale animations with an AI image tool, and the one-line pipeline command that turns a sheet into a live state.
Project layout
art/ source sprite sheets from the AI workflow (repo only)
assets/ shipped runtime: state GIFs + manifest.json
docs/ art spec, prompt playbook, canonical character reference
lib/ plugin host half + browser half + state machine
test/ state machine unit tests
tools/ sprite processing pipeline + test grid generator
Credits & disclaimer
Animation grammar and pixel discipline inspired by clawd-on-desk (style reference only — no assets or code shared; clawd art is Anthropic's). Whale art generated with AI assistance. Not affiliated with DeepSeek. MIT licensed.
Links
More in this category
zhu1090093659/dsh-web-ui#packages/dsh-web-ui-all★ 4254
Plugin and skin collection for the DSH Web UI: task board, Git graph, right-side panel, remote mobile UI, pet, live token stats, and a skin center.
omdsh-dev/DSH-better-sidebar★ 2026
Full sidebar workbench with file rendering and editing, terminal, Git, and subagents; third-party plugins can register new tabs.
ccch1mneyyy/dsh-TUI★ 1866
Claude Code-style full-screen terminal UI: pixel-whale header, live status line, and streaming thought expansion.
omdsh-dev/dsh-at-file★ 347
Codex-style `@file` mentions: search workspace files in the composer and attach their contents to prompts.
huiliyi37/dsh-tianshu-tui★ 209
A terminal UI (TUI) for DeepSeek Harness.
omdsh-dev/dsh-genui★ 196
Interactive UI components rendered inline in replies: layout, charts, forms, quizzes, mermaid, 3D scenes, and an action event loop back to the model.