How it behaves
The web pet is hidden during initial configuration and onboarding. Once visible, it uses activity from the harness interface to change state:
| Event |
State |
| New session |
welcome |
| Session running or thinking |
think, occasionally working |
| Waiting for approval |
wait |
| Task, upgrade, title or round completion |
celebrate |
| Task failure or request error |
error, then disappointed |
No activity for at least 60000 ms |
sleep |
| Interaction while sleeping |
wake |
| Feeding or playing |
eat or play, then joy |
It also cycles through idle and walk, and shows random blinking or turning while idle. The state machine’s full priorities and transitions are documented in docs/state-machine.md.
Configuration
Settings are read from the host settings UI or the whale-girl: section in <dshHome>/settings.yaml. Changes take effect without a restart.
| Key |
Default |
Meaning |
enabled |
true |
Enables web rendering |
size |
110 |
Pet size in px; accepted range is 64–160 |
opacity |
1 |
Normal opacity; accepted range is 0.2–1 |
walk.enabled |
true |
Enables periodic walking |
sleepAfterMs |
60000 |
Idle time before sleeping |
The experience and title semantics are not configurable. The character can be changed from the character menu or through localStorage key whale-girl:character.
Commands and desktop companion
dsh plugin --profile web update whale-girl updates the installed plugin; a web restart is required for the bundle change to take effect. The separate desktop/ application is not installed by dsh plugin. From that directory, npm install prepares the application, while cd src-tauri && cargo run starts the recommended Tauri shell. npm run start:headless starts its headless mode.
The companion uses the plugin endpoints /state, /events, /presence, /interact, /config and /assets. When it is active, the web pet hides through the presence contract; after exit or a 45s presence TTL expiry, the web pet returns.
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