Themed Windows (WSL) Claude notification hooks, whatever theme you fancy, be it 🦄, 🌸, 🐉 or The Matrix, we've got you covered. Fully configurable.
yoink-unicorn.mp4
/plugin marketplace add itenium-be/Yoink
/plugin install yoink@yoink-marketplaceRunning from a checkout, point ~/.claude/settings.json at the hook scripts. If the repo lives at ~/.claude/yoink:
Note: Start a fresh session after installation. This will capture the window handle for correct screen display.
- Left click — activate the originating terminal.
- Right click — close the notification without activating the terminal.
| Command | Effect |
|---|---|
/yoink off [scope] [duration] [--allow …] |
Mute. Scope all (default), session, or project. Duration 30m/2h/1d, omit for indefinite. |
/yoink on [scope] |
Unmute. Bare on clears every scope that could be silencing you here. |
/yoink attach [--force] |
Bind the foreground window to this session — fixes a missed HWND capture. |
/yoink doctor |
Self-check: jq, powershell.exe, window binding, settings, sounds, active mutes. |
While muted the card never shows. off-behavior in settings.json picks what still does:
"off-behavior": ["bell"]bell is the ASCII BEL on the session's own tab — your terminal decides whether that flashes or dings.
sound plays the themed wav with no card. [] is fully dark.
Fully configurable by updating settings.json. Put your copy at
~/.claude/yoink/settings.json — it overrides the defaults bundled with the plugin and
survives plugin updates. Custom sounds go in ~/.claude/yoink/sounds/.
Use the editor if you want to test-drive the different themes and options. It writes
settings.json next to itself, so run it from a checkout and copy the result into
~/.claude/yoink/.
.\settings-editor.ps1Possible replacements for the notification body text.
| Token | Resolves to |
|---|---|
{{folder}} |
Basename of the working directory |
{{cwd}} |
Full working-directory path |
{{repo}} |
Git repository name (top-level dir), empty outside a repo |
{{branch}} |
Current git branch |
{{dirty}} |
● when the working tree has uncommitted changes, else empty |
{{message}} |
Claude Code's notification reason (needs-input only) |
{{last_prompt}} |
Your most recent prompt |
{{last_assistant}} |
Claude's last message |
{{last_assistant_clean}} |
Claude's last message, markdown stripped, first sentence only |
{{model}} |
Active model id |
{{agents}} |
Background agents still running (empty when none) |
{{pending_tool}} |
Name of the most recent tool call |
{{permission_mode}} |
auto / default / plan / acceptEdits |
{{event}} |
done or needs-input |
{{duration}} |
How long the turn took (2m13s) |
{{diff_stat}} |
Staged + unstaged changes (3 files +42 −7), empty when clean |
{{files_changed}} |
File count behind {{diff_stat}} |
{{errors}} |
Tool calls that failed this turn, empty when none |
{{tokens}} |
Output tokens Claude spent this turn (1.3k) |
A line or badge whose tokens all resolve empty is dropped, so {{errors}} ⚠ only shows
up on a turn that had a failure.
Events also take an errorAccent: a color the card switches to when {{errors}} is
non-empty, so a turn that hit a tool failure doesn't look like a clean done.
WSL with jq on PATH.
sudo apt install jqFrom a PowerShell prompt, in the repo directory:
.\show-notification.ps1 -Event done -Folder Notify
.\show-notification.ps1 -Event needs-input -Folder Notify| Switch | Effect |
|---|---|
-Event |
done (default) or needs-input |
-Seconds <n> |
Auto-close after n seconds (default: stay until focused/clicked) |
-Folder <s> |
Folder name shown in the card body |
-Hwnd <n> |
Terminal to flash + auto-close once it regains focus |
Flash and auto-close on this terminal:
.\show-notification.ps1 -Event done -Hwnd ([int64](Get-Process -Id $PID).MainWindowHandle)bash ~/.claude/yoink/tests/run.shThanks to Wale-Durojaye Ayotomiwa for the awesome Claude mascot animations