- Floating transparent desktop pet window
- Draggable mascot with idle motion and random quirks
- Always-on-top toggle (default on)
- Global hotkey to trigger listening
- Voice input via Web Speech API when available
- Text input fallback
- Configurable OpenClaw gateway client with mock mode
- TTS playback via system voices
- Basic mouth animation synced from lightweight speech amplitude heuristics
- Settings panel backed by
config.json - Wake-word fallback mode using continuous speech recognition when supported
- Optional click-through when idle
- Status polling with lightweight in-app notifications
- Optional WebSocket live-event stream support
- Native desktop notifications
- Voice selection from available system TTS voices
- Cursor-proximity reaction for a more alive idle feel
- System tray menu for quick pet actions
src/
main/
app-controller.js App orchestration + IPC
config-store.js Persisted config lifecycle
main.js Electron entrypoint
openclaw-client.js OpenClaw/mock HTTP client
preload.js Safe renderer bridge
shortcut-manager.js Global hotkey registration
ui-shell.js Window creation + shell controls
renderer/
animation_engine.js Animation state + mouth/quirks
index.html Floating pet UI
openclaw_client.js Renderer-side gateway adapter
renderer.js Composition root for pet behavior
styles.css Pet visuals + animation states
tts_engine.js System TTS wrapper
ui_shell.js Bubble/settings helpers
voice_input.js Speech capture wrapper
wake_word.js Wake word fallback watcher
shared/
config.js Config load/save
assets/
sprites/
openclaw_pet.svg
animations.json
config.json Runtime configuration
cd /zfs/source-code/desktopclaw
npm install
npm startEdit config.json or use the settings panel.
When running the packaged app, DesktopClaw persists runtime settings in the Electron user data folder (%APPDATA%/DesktopClaw/config.json) so updates like gateway.mode = "http" are writable and survive restarts.
gateway.mode = "mock"keeps everything local for UI testing.gateway.mode = "http"sends requests to:baseUrl + chatPathfor chatbaseUrl + statusPathfor status
- Authentication options for
gateway.mode = "http":gateway.tokensendsAuthorization: Bearer <token>gateway.passwordsendsX-OpenClaw-Password: <password>- If both are set, both auth headers are sent
- Current request payload is:
{ "message": "...", "input": "...", "query": "..." }The client accepts a reply from any of these response fields:
replytextmessageoutputresponse
If your OpenClaw gateway uses a different schema, adapt src/main/openclaw-client.js.
A lightweight polling monitor is included for the MVP.
Config keys:
status.pollEnabledstatus.pollIntervalMsstatus.showNotificationsstatus.speakNotificationsstatus.nativeNotificationsgateway.eventsEnabledgateway.eventsUrl
Current behavior:
- polls the configured status endpoint
- updates the pet's status pill
- raises a small in-app notification when status payload changes
- can optionally speak those updates
- can subscribe to a WebSocket event feed for live OpenClaw notifications
- can mirror notifications to native desktop toasts
Default hotkeys live in config.json:
- Listen:
Ctrl+Shift+Space - Mute:
Ctrl+Shift+M - Show/hide:
Ctrl+Shift+H - Settings:
Ctrl+Shift+S
For a fast unpacked Windows prototype:
npm run dist:dirThat targets dist/win-unpacked/DesktopClaw.exe.
For installer + portable packaging:
This repo is set up for electron-builder:
npm run distThat produces a Windows installer/portable app when run in a Windows-capable packaging environment.
I prepared the project for Windows packaging, but if you are building from Linux you may still need one of:
- a Windows machine
- Wine + NSIS toolchain
- CI that targets Windows
So the codebase is ready for .exe output, but final packaging depends on the host build environment.
- Wake word is config-backed but not yet true offline wake-word detection
- Speech recognition depends on platform/browser support in Electron
- Mouth sync is amplitude/heuristic-based, not phoneme-based
- Asset pack is intentionally minimal and code-driven for the MVP
- Add native STT (Whisper/Vosk) for reliable speech capture
- Add Porcupine/openWakeWord for true wake word support
- Replace CSS pet with full PNG sprite atlas from the approved art pack
- Add WebSocket/live OpenClaw events and notification badges
- Add click-through-on-idle behavior tuning and cursor reactions


