Just for Fun

whale-girl

vlln/whale-girl · ★ 400

vllnCurated

Desktop pet (QQ-pet style): floats in the corner, draggable, feedable, playable.

License
MIT
Added
2026-08-13
Maintenance
active
Install kind
github
npm
whale-girl
Manifest status
Declared
Manifest path
package.json#dsh
Manifest checked
2026-08-19
Lifecycle scripts
None found

Static manifest checks report declarations only; they are not compatibility or security review.

安装

dsh plugin --profile web add github:vlln/whale-girl

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

For install and environment setup, plus plugin development tutorials, see DSH community docs ↗

README

Source README · body: en · Read Chinese README

Table of contents
  1. Installation
  2. Usage
  3. Desktop Companion (Optional)
  4. State Preview
  5. Configuration
  6. Characters
  7. Reference Implementation
  8. Contributing
  9. Acknowledgements
  10. License

Installation

Official bundle plugin (dsh.bundle + dsh.client in root package.json), managed via the official profile:

dsh plugin --profile web add whale-girl                        # npm source (build artifacts ship in the package)
# to track the latest commit instead: dsh plugin --profile web add "github:vlln/whale-girl#main"
# or local directory: dsh plugin --profile web add <path-to-whale-girl>

Restart web after installing (bundle layers compose at startup); the pet appears bottom-right: click for its menu (🍗 feed / 🎾 play), drag to move, hover for the status bar (seniority level / task count / recent shared memories). Hidden on onboarding pages.

Update via dsh plugin --profile web update whale-girl (or switch the git ref), then restart.

Usage

You / event Pet behavior
Drag the pet Stretched diagonally (drag)
Menu 🍗 feed / 🎾 play Chomping / ball toss (eat/play) → joy (joy)
Idle ≥60s Naps (sleep); wakes on interaction (wake)
Task done / level-up / title / round done Cheers (celebrate)
Task failed / request error Startled (error) → disappointed (disappointed)
New session Waves welcome (welcome)
Session running / thinking Pensive company (think, occasional working)
Awaiting approval Expectant waiting (wait)
Periodic wandering Walking (walk)
Default Idle standby (idle, random blinks / turns)

Full state machine (priorities / transitions / triggers): docs/state-machine.md.

Desktop Companion (Optional)

desktop/ is a standalone companion app (Node engine + Tauri shell, zero runtime deps) that keeps the whale girl resident on your OS desktop. Not installed via dsh plugin — enable it yourself:

# Prereqs: Node ≥18; the rendering shell needs Rust (cargo)
npm install -g whale-girl-desktop   # npm install (engine + Tauri shell source included)
whale-girl-desktop --headless       # headless: presence heartbeat + state polling + SSE
cd "$(npm root -g)/whale-girl-desktop/src-tauri" && cargo build --release  # first build ~5-15 min; artifact target/release/whale-girl-desktop (~12MB)
./target/release/whale-girl-desktop   # transparent always-on-top desktop pet (defaults to local DSH on 3080)
# WHALE_GIRL_BASE_URL=http://IP:PORT points at a non-local DSH
# or from source: cd desktop && npm install && cd src-tauri && cargo build --release
  • Uses whale-girl's public endpoints (/state, /events, /presence, /interact, /config, /assets) without touching the plugin; the in-page pet hides while it runs (presence contract) and returns after exit/crash (TTL 45s).
  • Shell: Tauri v2 (recommended, ~12MB); legacy Electron shell kept (npm i -D electron).
  • Design & contracts: desktop/DESIGN.md, desktop/BUILD-RUN.md.

State Preview

State Trigger Preview
idle Default standby idle
working Random work spell while session thinks working
celebrate Task done / level-up / title / round done celebrate
error Task failed / request error error
disappointed Brief dejection after failure disappointed
joy Happy after feeding / playing joy
eat Click to feed eat
play Click to play play
drag While dragging drag
walk Periodic wandering walk
sleep Idle ≥60s sleep
wake Wake-up transition wake
welcome New session welcome
think Company while session thinks think
wait Awaiting approval wait

Configuration

Plugins → Installed → whale-girl bundle page (config card): the high-frequency subset — show on page, session memory, size, opacity, wandering, sleep delay, and the feed/play reply pools (one per line). Session memory (off by default) records completed-task milestones to a local file and greets you with last time's progress on resume/fork — local only, never model context, never uploaded; off stops all reads/writes (file kept). Changes apply immediately, no restart (a switch writes on click; numbers and reply pools write on blur or Enter). The card's first row is an update row: it checks the source once on mount (git installs by commit, registry installs by version) and shows the verdict plus the installed short commit; a newer revision turns the button into "Update to …", and updating reinstalls through DSH's profile package manager without touching your settings. Full contract (endpoints, payloads, two-step reinstall, failure reasons, host version requirement): docs/update-row.md.

The full option list lives in the plugin entry's config in the profile patch (<dshHome>/profiles/<profile>/cordis.patch.yml); a whale-girl: section in <dshHome>/settings.yaml is imported into that entry once:

whale-girl:
  enabled: true      # web render toggle (false disables the in-page pet while a desktop companion runs)
  sessionMemory: false # session memory (local file; see the config card)
  size: 110          # pet size px (64–160)
  opacity: 1         # default opacity (0.2–1)
  walk:
    enabled: true    # wandering toggle
  sleepAfterMs: 60000

Full option list and why the semantic layer (XP / titles) is sealed: lib/src/config.mjs. Not configurable (changing XP / title thresholds would break the accumulation ledger).

Characters

🎭 "Switch Character" cycles characters (or set whale-girl:character in localStorage); the button is greyed out when the manifest has a single character ("No other characters available"). Every character ships all 15 states (full contract: docs/sprites-spec.md); new characters: docs/adding-a-character.md.

Reference Implementation

whale-girl is a complete bundle plugin format exemplar (dsh.bundle + cordis.patch.yml + lib/, evolving with the official mechanism) — model new plugins on it:

  • Structure: lib/ (entry / logic / client / assets) separate from docs, decisions, scripts — root AGENTS.md
  • Conventions: gates (scripts/gates/run.mjs) + decision records + full asset contracts; guidance: plugin-registry's make-dsh-plugin skill, cookbook, gotchas

Contributing

Issues and suggestions welcome — your feedback shapes the pet's next steps:

  • 🐛 Bug: file an issue with repro steps, browser & dsh versions; console errors for client issues
  • 💡 Feature ideas: see docs/state-machine.md and docs/growth-system.md, describe the expected effect
  • 🎨 New characters: docs/adding-a-character.md §quick guide — read-only contract, 15 sheets + manifest entries, validated by verify-assets
  • 🔧 Code: every non-trivial change needs a decision record (decisions/), gate self-checks, single-purpose commits (docs/AGENTS.md, root AGENTS.md)

Acknowledgements

Character by ZipZipPipe (the "Whale Girl" sticker character); sprites generated from their design.

License

MIT License