How it works
The plugin is split between a host component and a browser component:
lib/index.js provides the /pet video route.
lib/client.js runs the animation chain in the browser.
assets/thumb/ contains the packaged 640×360 WebM playback variants.
The client chooses another animation when the current one finishes. It supports idle, turning, action and movement states, with documented probabilities of 30%, 10%, 40% and 20% respectively. Animations can be mirrored to face either direction. Double buffering cross-fades between clips, while shared foot alignment keeps the pet positioned on the floor line.
Interaction and movement
The pet appears in the DSH Web UI and starts at the lower-right area. It can wander across the screen, checks available space before moving, and avoids leaving the screen. Clicking triggers a response animation, and dragging allows the pet to be repositioned.
The README describes this as a visual-only plugin. It does not add weather lookup, system monitoring or agent-state awareness, and runtime does not require an LLM or API call.
Asset-generation pipeline
The repository includes a reproducible pipeline for creating replacement assets. Place 51 source .mp4 files in video/, then run these commands from scripts/:
python watermark_step01.py
python chroma_step02.py
python normalize_step03.py
python encode_thumbs.py
The stages produce intermediate step01/ through step04/ output. The process masks watermark areas, removes the green screen using HSV hue processing, normalises clips to 2160×1215, and creates 640×360 playback variants. Copy generated .webm files into dsh-pet/assets/thumb/ to use them in the plugin package.
Requirements and scope
The asset scripts require Python 3, ffmpeg, numpy and scipy; the scripts use workspace .tools/ for ffmpeg according to the README. Source videos are not stored in Git and can be obtained from the assets-videos GitHub release. The documented runtime target is the DeepSeek Harness Web UI. No plugin configuration keys or environment variables are documented.
Written from the project's own documentation and kept in sync with it. Where the two disagree, the source is authoritative — read the README on GitHub