A macOS menu-bar desktop pet โ Clawd reacts in real time to what your AI coding assistant is doing. It integrates with Claude Code, Codex CLI, Cursor, Gemini CLI, GitHub Copilot CLI, CodeBuddy and Pi, and plays different animations for idle / thinking / working / error / sleep states. For Claude Code and CodeBuddy it can also surface tool-use permission prompts as floating bubbles so you never have to return to the terminal just to click "allow".
- Reacts to 7 AI coding tools โ Claude Code, CodeBuddy, Cursor, Gemini CLI, Copilot CLI via hooks; Pi via extension; Codex CLI via JSONL log monitoring.
- Permission bubbles โ approve or deny tool use for Claude Code / CodeBuddy without leaving your editor; passthrough tools (
TaskCreate,TaskUpdate, โฆ) auto-allow. - Custom Core Animation SVG pipeline โ no WebView. 50+ hand-drawn states on a 15ร16 pixel grid, cached via LRU.
- Lightweight & native โ Swift 6 + AppKit/Core Animation. No WebView, no embedded JS runtime. Low CPU and memory footprint.
- Menu-bar only (
LSUIElement) with mini edge-hugging mode, eye tracking that follows your cursor, and a Do-Not-Disturb toggle. - Auto-updating via Sparkle (EdDSA-signed appcast).
- Single external dependency: Sparkle. Everything else is Swift 6 + stdlib.
- macOS 12 (Monterey) or newer
- Node.js (for bundled installers to register hooks/extensions into Claude Code / Cursor / Gemini / CodeBuddy / Pi on first launch)
Grab the latest .dmg from GitHub Releases, drag hey-clawd.app into /Applications, and launch. The app lives in the menu bar โ right-click the Clawd icon to open the tray menu.
If macOS Gatekeeper blocks launch, first try right-click โ Open once. If you see messages like โapp is damagedโ, โApple could not verifyโ, or the app simply refuses to open, remove the quarantine flag manually:
xattr -dr com.apple.quarantine /Applications/hey-clawd.appThen launch the app again.
On first launch it starts a local HTTP server on 127.0.0.1:23333 (falls back to 23334โ23337) and runs the bundled installers to register hooks/extensions into any detected AI tools. Tools that aren't installed are skipped. You can re-run registration anytime from the tray menu โ Register Hooks.
# Swift Package Manager (debug)
swift build
.build/debug/hey-clawd
# Release build
swift build -c release
# Xcode (matches CI)
xcodebuild -project hey-clawd.xcodeproj -scheme hey-clawd -configuration Release archive| Tool | Method | Direction | Permission bubble | Terminal focus |
|---|---|---|---|---|
| Claude Code | hook | bidirectional | โ | โ |
| CodeBuddy | hook | bidirectional | โ | โ |
| Gemini CLI | hook | one-way | โ | โ |
| Cursor | hook | one-way | โ | โ |
| Copilot CLI | hook | one-way | โ | โ |
| Codex CLI | JSONL monitor | read-only | โ | โ |
| Pi | extension | one-way | โ | โ |
See docs/integrations/platform-comparison.md for the full event-coverage matrix and per-tool deep dives in docs/integrations/.
IDE hooks / Pi extension / CodexMonitor โ HTTP POST /state โ HTTPServer โ StateMachine โ PetView (Core Animation)
IDE hooks โ HTTP POST /permission โ HTTPServer โ BubbleStack โ allow/deny
- StateMachine โ priority-based aggregator (priority 0โ8) across concurrent sessions. Higher-priority states override lower ones; one-shot states (attention, error, notification) play once then revert.
- SVG pipeline โ
SVGParserโSVGDocument(LRU cache) โCALayerRendererโCAAnimationBuilder(CSS keyframes โ Core Animation). See docs/rendering-system.md. - Integration bridge (
hooks/) โ CommonJS hook handlers (clawd-hook.js,cursor-hook.js,gemini-hook.js,codebuddy-hook.js,copilot-hook.js), the Codex JSONL monitor (codex-remote-monitor.js), plus the Pi extension/installer pair (pi-extension.ts,pi-install.js). Each integration ultimately maps tool lifecycle events to pet states and POSTs to the local HTTP server. Port discovery:~/.clawd/runtime.jsonfirst, then scans 23333โ23337. - HTTP endpoints โ
/state,/permission,/status,/quit, plus/debug/svgand/debug/resetfor development.
A peek at the raw SVG states. These are CSS-animated and rendered natively by the Core Animation pipeline at runtime โ what you see in GitHub is the exact same source file the app consumes.
| Idle | Typing | Thinking | Wizard | Happy |
|---|---|---|---|---|
idle-living |
working-typing |
working-thinking |
working-wizard |
happy |
| Smoking | Reading | Music | Dozing | Sleeping |
|---|---|---|---|---|
idle-smoking |
idle-reading |
idle-music |
idle-doze |
sleeping |
Full catalog of 50+ states: docs/svg-catalog.md.
# Swift test target (SVG parsing/rendering, HTTP server, Codex monitor, state machine)
swift test
# Permission-bubble integration tests (hits a running app)
./test-bubble.sh all # or: single | stack | passthrough | disconnect | dnd
# SVG animation visual smoke test (hits /debug/svg on a running app)
./test-animations.sh
# Hook-side Node tests
cd hooks && node test/pi-install.test.js && node test/codex-remote-monitor.test.js && node test/hook-cleanup.test.jsFurther docs:
- docs/svg-catalog.md โ every
PetStateโ SVG mapping. - docs/svg-animation-spec.md โ SVG animation, pixel-grid, and palette spec.
MIT โ retains the original copyright from clawd-on-desk.
- Form and architecture derived from @rullerzhou-afk's clawd-on-desk.
- Some art direction and animation inspiration was also referenced from @marciogranzotto's clawd-tank. Thank you for the lovely Clawd worldbuilding and pixel-art ideas.
- Shared with the LINUX DO community.




