Skills cc-sticky-notify
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bucleliu/cc-sticky-notify" ~/.claude/skills/clawdbot-skills-cc-sticky-notify && rm -rf "$T"
skills/bucleliu/cc-sticky-notify/SKILL.mdcc-sticky-notify
A pinned sticky note notification system for Mac. Key Claude Code events appear as a yellow floating sticky note in the top-right corner, persisting until manually closed.
File Structure (fully self-contained)
~/.claude/skills/cc-sticky-notify/ ├── SKILL.md ├── install.sh ← one-time setup: chmod + settings.json guidance └── scripts/ ├── notify.sh ← main notification script (called directly by hooks) ├── sticky-window.swift ← Swift source (compiled by install.sh on first install) └── sticky-notify.app/ ← .app bundle (built automatically on first use) └── Contents/ ├── Info.plist └── MacOS/ └── sticky-notify-app
Two-layer notification mechanism:
— no permissions required, appears instantly in top-right cornerdisplay notification- Swift NSWindow (
level) — pinned sticky note, close manually with ✕.floating
Hook coverage (consistent with popo-notify):
| Hook | Trigger | Sticky note content |
|---|---|---|
| Task completed | ✅ Task completed + time/project/session |
| Permission approval needed | 🔐 Permission approval required |
| Waiting for user selection | 💬 Awaiting your input |
(on failure) | Command execution failed | ❌ Command failed, exit code |
Requirements
-
macOS 12 Monterey or later
-
Xcode Command Line Tools — required for compiling the Swift floating window, code signing, and JSON parsing
xcode-select --installAll dependencies (
,swiftc
) come from Xcode CLT.codesign
will check and exit early if CLT is missing.install.sh
Installation
When the user requests installation, follow these steps:
Step 1 — Run install.sh
bash ~/.claude/skills/cc-sticky-notify/install.sh
What this script does:
- Check Xcode CLT — exits early with instructions if
fails.xcode-select -p
— ensures the script is executable (git clone may strip the +x bit).chmod +x notify.sh- Build
— compiles.app bundle
, writessticky-window.swift
+ entitlements, signs withInfo.plist
. Skipped if the bundle already exists.codesign - Check hook configuration — inspects
for existing~/.claude/settings.json
entries and prints the required hook commands if none are found.cc-sticky-notify - Smoke test — fires a test notification via
.notify.sh
Step 2 — Configure settings.json hooks
Read
~/.claude/settings.json and append one sticky-notify entry to each of the following four locations in the hooks field (skip if already present).
Stop — append to
Stop[0].hooks:
{ "type": "command", "command": "$HOME/.claude/skills/cc-sticky-notify/scripts/notify.sh" }
Notification/permission_prompt — append:
{ "type": "command", "command": "$HOME/.claude/skills/cc-sticky-notify/scripts/notify.sh '🔐 Claude Code Permission approval required, check terminal'" }
Notification/idle_prompt — append:
{ "type": "command", "command": "$HOME/.claude/skills/cc-sticky-notify/scripts/notify.sh '💬 Claude Code Awaiting your input, check terminal'" }
PostToolUse/Bash — append (triggers only on failure):
{ "type": "command", "command": "bash -c 'INPUT=$(cat); STATUS=$(echo \"$INPUT\" | jq -r \".tool_response.exitCode // 0\"); [ \"$STATUS\" != \"0\" ] && $HOME/.claude/skills/cc-sticky-notify/scripts/notify.sh \"❌ Claude Code Command failed, exit code: $STATUS\" || true'" }
Step 3 — Verify
# Test arg mode (simulates Notification hook) $HOME/.claude/skills/cc-sticky-notify/scripts/notify.sh '✅ Installation verified' # Test stdin mode (simulates Stop hook) echo '{"session_id":"test12345678"}' | $HOME/.claude/skills/cc-sticky-notify/scripts/notify.sh
A yellow sticky note and system notification appearing in the top-right corner confirms successful installation.
Configuration
CC_STICKY_NOTIFY_CLOSE_TIMEOUT — Auto-close timeout
Sticky notes automatically close after 1 hour (3600 seconds) by default. Override with this environment variable:
export CC_STICKY_NOTIFY_CLOSE_TIMEOUT=300 # auto-close after 5 minutes
- Unit: seconds (decimals supported, e.g.
)30.5 - Must be greater than 0; otherwise falls back to the default 3600 seconds
- Set a large value (e.g.
) to keep the note visible for nearly a full day86400
To persist the setting, add it to your shell config (
~/.zshrc or ~/.bashrc):
echo 'export CC_STICKY_NOTIFY_CLOSE_TIMEOUT=300' >> ~/.zshrc
Troubleshooting
No system notification either
- Verify the hooks configuration is correctly written in
~/.claude/settings.json - Path should be
$HOME/.claude/skills/cc-sticky-notify/scripts/notify.sh
during compilationxcrun: error: invalid active developer path
- Xcode Command Line Tools path is broken (common after macOS upgrade or Xcode reinstall)
- Fix:
sudo xcode-select --reset - If that doesn't work, reinstall:
xcode-select --install - The floating sticky window will be disabled if swiftc can't compile, but system notifications still work
on notify.shPermission denied
- The script is missing execute permission — happens when files are cloned/copied without preserving permissions
- Fix:
chmod +x ~/.claude/skills/cc-sticky-notify/scripts/notify.sh - Re-run
after fixing (the latest version auto-runsinstall.sh
on startup)chmod +x