Draggable floating cat-or-dog companion for the dsh web GUI that changes expression with the session and is configured on a Companion settings page.
Install
# from npm (prebuilt)
dsh plugin --profile web add @falser101/mascot
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:falser101/dsh-mascot
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

A floating companion for the DeepSeek Harness web GUI (dsh web). A draggable cartoon cat or dog sits on the UI, changes expression with the current session, and chats in short lines. Drag it, click it, or double-click to tuck it away. Skins live on their own Companion settings page, picked from a thumbnail grid.
https://github.com/user-attachments/assets/3e2c4737-ffda-43fd-96af-e79537123468
Looks
Open Settings → Companion and tap a breed. The choice is remembered locally.
Cats
| Orange | Ragdoll | Maine Coon | Golden shaded | Silver shaded |
|---|---|---|---|---|
Dogs
| Cream | Poodle | Border Collie | Corgi | Shiba |
|---|---|---|---|---|
Expressions
Same character, same pose — only the face changes. The orange cat as an example:
| Neutral | Working | Writing | Happy | Thinking | Sad |
|---|---|---|---|---|---|
It blinks while idle. Whole-body motion kicks in for thinking, tool calls, streaming, done, and errors.
Features
- Session-aware. Queued, waiting for you, thinking, calling a tool, writing, done, or errored — each has its own face and line. Display-only: it never emits session events.
- Draggable. It stays where you drop it. A resize clamps it back into the viewport.
- Shrinks while you type. Focus in the composer while it is idle tucks it into a mini face in the same corner; it expands again after you send.
- Status bubble. Busy lines are companion copy (“Still busy, hang on”). Tool names stay off unless you hover or turn them on in settings. While idle it can pop on a quiet / standard / lively cadence. The first appearance says “Drag me — hover for buttons” once.
- AI vignettes (off by default). When on, idle lines may come from the current default model (and use that model’s quota). Missing keys or a failed call fall back to the built-in pool.
- Hover comfort. The bubble switches to a softer line, e.g. “Hold on, I am thinking hard.”
- Parallel work. A badge appears when several sessions or sub-agents are running. Hover for the list; click a row to jump there.
- Show / hide. Settings → General, or Settings → Companion, has a “Show floating pet” switch. Off removes it from the UI. Right-click → Hide does the same.
- Entries on the pet. Click for a playful line (cats meow, dogs woof). Double-click collapses to a mini face. Hover shows a small dock: next look, jump to the current task, hide, open Settings. Right-click pins the dock. On the bottom edge the dock opens above the pet; on the left it opens to the right, so it stays on screen.
- Working and writing have their own faces. Tool calls squint; streaming opens a small speaking mouth — not the same neutral face with a CSS wobble.
- The longer the wait, the bigger the pose. A yawn, then a stretch, while the model is working. Ambient clips still play while idle. Cadence follows Quiet / Standard / Lively.
- Copy follows the UI language (Chinese / English). Motion stops when the system asks for reduced motion.
Moods
| Mood | When | What you see |
|---|---|---|
| Idle | Nothing running | Breathe + blink, “Here whenever you need me~” |
| Queued | Message sent, not started | A hop, “Got it! Joining the queue” |
| Confirming | Approval or a question waiting | Head tilt, “Waiting for your approval~” |
| Thinking | Running, no output yet | Thoughtful, “Let me think…” |
| Working | A tool is running | A sway, “Still busy, hang on~” |
| Streaming | Answer tokens arriving | “Writing the answer…” |
| Done | Turn just finished (~4 s) | A cheer, “Done! 🎉” |
| Error | Turn failed | A shake, “Oops, something went wrong…” |
| Greeting | You just switched sessions (~4 s) | “Hi there!” |
Install
You need a DeepSeek Harness that can run dsh --profile web (@deepseek-ai/dsh-client-* ≥ 0.1.0-rc.5).
Add it to the web profile with the official command:
dsh plugin --profile web add @falser101/mascot
Restart dsh --profile web. The companion appears in the lower-right corner; Settings gains a Companion page. Without npm: dsh plugin --profile web add github:falser101/dsh-mascot.
For a local checkout:
dsh plugin --profile web add /path/to/dsh-mascot
Remove it with:
dsh plugin --profile web remove @falser101/mascot
Develop
pnpm build # emit lib/ (host half + browser bundle)
pnpm watch # hot-reload the client half
pnpm test
lib/ is committed, so git and npm installs need no extra build step.
To swap art: overwrite the same-named jpgs under docs/<breed>/ → node scripts/build-art-assets.mjs → rebuild. Prompt pack: docs/character-art-prompts.md.
License
MIT
Links
More in this category
PC2005-cloud/dsh-pet#dsh-pet★ 960
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★ 643
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★ 339
Desktop pet (QQ-pet style): floats in the corner, draggable, feedable, playable.
a86582751/dsh-nexttavern★ 128
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★ 120
Chat meme stickers: text-only send, mood auto-send, QQ/WeChat-style picker, auto-learn, custom packs.
Sutera-Diffusus/dsh-whale-musume★ 106
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.