by ssssssanjiu
Full-lifecycle wiring between Claude Code and the Clawd on Desk pet — all 15 hook events, with permission prompts answered straight from the desktop
# Add to your Claude Code skills
git clone https://github.com/ssssssanjiu/clawd-conduitGuides for using ai agents skills like clawd-conduit.
See how clawd-conduit compares with popular alternatives.
clawd-conduit is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by ssssssanjiu. Full-lifecycle wiring between Claude Code and the Clawd on Desk pet — all 15 hook events, with permission prompts answered straight from the desktop. It has 51 GitHub stars.
clawd-conduit's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/ssssssanjiu/clawd-conduit" and add it to your Claude Code skills directory (see the Installation section above).
clawd-conduit is primarily written in Shell. It is open-source under ssssssanjiu on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh clawd-conduit against similar tools.
No comments yet. Be the first to share your thoughts!
Unlocks once the catalog security scan passes (runs nightly).
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Wire a desktop pet into what your Claude Code session is actually doing — all 15 hook events.
中文 · macOS · MIT
Clawd on Desk is a desktop pet that watches AI coding agents. It ships with Claude Code integration and works out of the box.
This repo is a complete wiring layer on top of it: all 15 Claude Code lifecycle hook events, plus a notification script, an idempotent install/uninstall toolchain, and the parameter trade-offs I settled on after three months of daily use.
The difference is granularity. With fewer events the pet roughly knows whether you're busy or idle. With all 15 it can tell you're running a tool, that a tool just failed, that subagents are running in parallel, that context is being compacted — or that it's blocked on a confirmation waiting for you.
That last one is the whole point.
During long runs you leave the terminal — docs, messages, coffee. You come back and find it stopped three minutes ago waiting for you to click "allow."
This config cuts those three minutes to zero:
Cmd+Shift+Y to allow,
Cmd+Shift+N to deny — no window switchingpermissionBubbleAutoCloseSeconds: 0).
Auto-dismiss is the worst default here: you think you denied it, but it just
timed out and fell back to the terminal promptClaude Code fires hooks at key points in a session's lifecycle. This config
forwards 14 of them as command hooks to Clawd's bundled clawd-hook.js,
and routes one more — the permission request — as an http hook straight to
Clawd's local port.
Claude Code Clawd on Desk
│
├─ SessionStart ─┐
├─ PreToolUse ──┤ command hook
├─ Stop ──┼─→ clawd-hook.js ──→ POST 127.0.0.1:23333/state ──→ pet changes state
├─ … (14 total) ─┘ (async, 5s timeout, never blocks the session)
│
└─ PermissionRequest ─→ HTTP hook ──→ POST 127.0.0.1:23333/permission
(blocking, 600s timeout)
│
card pops ┴─→ you click Allow / Deny
└─→ decision returns, session continues
The two channels differ in whether they wait for you. State events are one-way broadcasts — fire and forget. A permission request has to stop and wait for a human decision, which is why it is the only blocking one.
Taken from Clawd's clawd-hook.js (EVENT_TO_STATE) — not guesswork:
| Event | Pet state | When it fires |
|---|---|---|
SessionStart |
idle |
Session begins. This config also attaches open -ga to launch the app |
UserPromptSubmit |
thinking |
You hit enter |
PreToolUse |
working |
Before every tool call |
PostToolUse |
working |
Tool returned successfully |
PostToolUseFailure |
error |
Tool errored |
SubagentStart |
juggling |
A subagent starts — literally starts juggling |
SubagentStop |
working |
Subagent finished |
PreCompact |
sweeping |
Before context compaction, the pet starts sweeping |
PostCompact |
thinking |
Compaction done. Deliberately not attention — compacting isn't completion |
Stop |
attention |
Turn finished normally; it comes to get you |
StopFailure |
error |
Turn ended abnormally |
Notification |
notification |
Claude needs your attention |
Elicitation |
notification |
Claude asks you a question (the card in the hero shot) |
SessionEnd |
sleeping |
Session over, pet goes to sleep |
PermissionRequest |
— | Goes through the HTTP channel and pops a card directly |
One detail worth knowing: on some builds Claude Code reports subagent launches
only as PreToolUse(Task) without a native SubagentStart. Clawd handles this
by switching to juggling on the Task / Agent tool name — so parallel work
never goes unreported.
"command": "\"/opt/homebrew/bin/node\" \"/Applications/Clawd on Desk.app/…/clawd-hook.js\" Stop"
Hooks run in a non-login shell, where PATH may not include Homebrew. A bare
node becomes command-not-found — and because these are async: true, you never
see the error. The symptom is just a pet that quietly stops moving. install.sh
detects and fills both paths for you.
The path contains a space (Clawd on Desk.app), so every segment must be quoted.
# 1. Install Clawd on Desk itself (not bundled or redistributed here)
# https://github.com/rullerzhou-afk/clawd-on-desk/releases
# 2. Apply this config
git clone https://github.com/ssssssanjiu/clawd-conduit.git
cd clawd-conduit
bash install.sh
Start a new Claude Code session to pick it up.
/Applications, then ~/Applications, then falls
back to mdfind on bundle id com.clawd.on-desk. Fails loudly with a
download link if it can't find it./opt/homebrew/bin/node, /usr/local/bin/node,
then command -v node.settings.json to settings.json.bak.<timestamp>.~/.claude/hooks/ and
attaches it to Notification (skippable).python3 -c "json.load(...)" to confirm the JSON it wrote
is still parseable.Safe to re-run. A second run replaces rather than appends; the occurrence
count of clawd-hook.js stays at exactly 14.
# 1. Are all 15 events wired?
python3 -c "import json;h=json.load(open('$HOME/.claude/settings.json'))['hooks'];\
print(len([k for k,v in h.items() if 'clawd' in json.dumps(v).lower() or '23333' in json.dumps(v)]),'events')"
# 2. Is Clawd's local service listening?
lsof -nP -iTCP:23333 -sTCP:LISTEN
# 3. Does the hook script path actually exist?
ls -l "/Applications/Clawd on Desk.app/Contents/Resources/app.asar.unpacked/hooks/clawd-hook.js"
The first should print 15 events; the second should show a Clawd on Desk
process. Once both check out, start a session and send any message — the pet
should go from idle to thinking.
Check three things, in order:
async, so
failures are completely silent. Run one by hand to see the error:
echo '{"session_id":"t","hook_event_name":"Stop"}' | \
/opt/homebrew/bin/node "/Applications/Clawd on Desk.app/Contents/Resources/app.asar.unpacked/hooks/clawd-hook.js" Stop
pgrep -f "Clawd on Desk" should print a PID.permissionBubblesEnabled must be true in Clawd's settingshideBubbles must be false--dangerously-skip-permissions, or the action is
already allowlisted, no permission request is generated at all — that's not a bugYou probably set notificationBubbleAutoCloseSeconds to 0.
The two bubble kinds treat 0 in opposite ways. For permission bubbles 0
means "never auto-clos