Skip to main contentSkip to footer

Yoink: Fancy Claude Code Notification Hooks
WSL notifications with animated Claude mascots and 9 themes

While working on the next itenium AI session ā€œExtending Your Harnessā€, I was working on the slides of the plugin primitives and hooks are definitely a very important one. You don’t ask the model nicely to run the tests or to adhere to your linting conventions and pray that it actually does…

No! For that kind of backpressure you want to be fully deterministic – with hooks!

Category:

ai

Tags:

Share this article on:

Cute Claude AI mascot celebrating with confetti explosion next to a colorful notification card popup, vibrant gradient background, joyful celebrating pose, modern UI design

The Marketplace

For the session, I turned the slidev deck into it’s own tutorial marketplace + plugin. Not very useful for actual installation, but useful as a teaching mecanism: the powerpoint repository IS a Claude Plugin!

It contains super handy skills like the /greeter which really is more involved as you’d expect, as it teaches about $ARGUMENTS, running commands (! whoami), and it even incorporates a dependency from an external marketplace (to render a fancy ASCII greeting).

The Hook

For the hooks primitive I first added a PostToolUse for linting. Because the repository doesn’t really contain much code, this turned out to be a json validator.

"PostToolUse": [{
  "matcher": "Write|Edit",
  "hooks": [{
    "type": "command",
    "command": "${CLAUDE_PLUGIN_ROOT}/hooks/validate-json.sh"
  }]
}]

But… That is pretty boring…

Notifications

Since I need to burn as many tokens as possible, as quickly as possible, I’m typically running several Claude Code sessions at the same time and back in the olden days when I was still starting Claude from my trusted PowerShell I had added some quick & dirty notification hooks to inform me when my input was needed somewhere.

Because of PowerShell vs Bash friction, I have since switched to WSL (maybe CLAUDE_CODE_USE_POWERSHELL_TOOL=1 could have elevated that pain but I only recently learned of this Claude env variable) and I haven’t had notifications since.

Yoink

So I quickly started Claude-Notify, later renamed to Yoink to have super fancy notifications. The usual scope explosion happened again of course – I mean these days I just know it’s going to happen, resistance is futile.

Some interesting features:

  • The notification appears on the screen where the Claude Terminal is located at
  • Clicking the notification activates that Terminal window
  • Displays interesting context like the current branch, the last model output etc

And then the scope explosion:

  • 9 different themes: šŸ¦„, šŸ‰, šŸ’Š, 🌸, šŸš€, 🐳, 🌓, šŸ¤– and šŸ‘»
  • Animated Claude mascot!!
  • 75 carefully selected sounds (sound is optional of course)
  • Fully configurable: the themes, the sounds, the colors, gradients, different scenes per theme, the texts (with replacements)
  • A settings-editor.ps1 so you can edit Yoinks settings.json and see the result right away
  • A marketing website!

The Demo

Check the marketing website for all 9 themes and the different Claude mascot animations in action!

The Installation

After all that sidetracking, this was still supposed to be part of the AI session, so actually packaging it as a plugin and exposing it as a marketplace was mandatory :D

/plugin marketplace add itenium-be/Yoink
/plugin install yoink@yoink-marketplace

Or if you’re running from a clone, edit your ~/.claude/settings.json:

"hooks": {
  "SessionStart": [{ "hooks": [{ "type": "command", "command": "bash ~/.claude/yoink/hooks/notify-capture.sh" }] }],
  "Stop": [{ "hooks": [{ "type": "command", "command": "bash ~/.claude/yoink/hooks/notify-fire.sh done" }] }],
  "Notification": [{ "hooks": [{ "type": "command", "command": "bash ~/.claude/yoink/hooks/notify-fire.sh needs-input" }] }]
}

Extras

Other interesting reads