installsource
guide / coding agents

Claude Code notifications on Mac, from the notch.

Run drip setup claude and Claude Code's hooks show a card from your Mac's notch naming the project and what it needs, whenever it wants permission or finishes. Same for Codex and Gemini CLI: drip setup codex, drip setup gemini.

brew install jrnxf/tap/drip
drip setup claude   # Claude Code, in ~/.claude/settings.json
drip setup codex    # Codex, in ~/.codex/hooks.json
drip setup gemini   # Gemini CLI, in ~/.gemini/settings.json

drip is a free, open-source command-line tool for macOS 13 or newer. It is not Notification Center: it draws its own card, so it needs no Notifications, Accessibility or Automation permission.

How it works

  1. Hooks, not polling. drip setup claude adds hooks for Claude Code's PermissionRequest (Claude wants to run something), Notification (a question), Stop (the turn is done) and StopFailure (a rate limit, an outage or another API error) events, and for the events that show it moved on. It keeps the rest of the file, backs the old one up next to it, and changes nothing when run again.
  2. One card per event. Each hook runs drip hook claude, which reads the hook's JSON and shows my-app needs you with what Claude wants, such as Claude wants to run npm install, my-app is done with the last thing Claude wrote, or my-app stopped with the error.
  3. Gone once you answer. Approve in the terminal, or send Claude a prompt, and the card that said it needs you goes.
  4. Or answer on the card. With approve = true in drip's config, or DRIP_APPROVE=1, the permission card has Allow and Deny, and a click is Claude's answer. Off by default.
  5. Named by project. The title is the project, from the session's working directory, so several sessions at once stay apart; two folders of the same name read 1/drip and 2/drip.
  6. Replaced in place. Each session's cards share an id, so the waiting card turns into the done card instead of queueing behind it. While you watch the terminal, the done card is quiet and short.
  7. Back to the terminal, or out of the way. A click on the card brings forward the terminal the agent runs in, and its tmux pane. The × on hover, or a right-click, takes the card away and brings nothing forward.

Codex runs a new hook only once you trust it: run /hooks in Codex after drip setup codex. To see the hooks without changing anything, run drip setup claude --print.

FAQ

Does drip use macOS Notification Center?

No. drip draws its own card out of the camera notch, or out of the top edge of a screen without one, so it needs no Notifications permission. Cards also show during Do Not Disturb; run drip pause 30m to hold them for a while.

Do I have to change Claude Code's own notification setting?

No. Hooks run alongside it: drip setup claude only adds hooks, and whatever Claude Code did before on a prompt, it still does. If each card comes with a second notification from your terminal, set Local notifications to disabled in its /config.

My settings.json is managed by home-manager or a dotfile manager. What then?

drip never writes a settings file that is a symlink, read-only, or not plain JSON. It says why, prints the hooks to add where the file comes from, and exits 1. drip setup claude --print prints them without trying.

What if I am away when Claude Code needs me?

A card that comes up while the screen is locked waits for the unlock, and drip history --missed lists what came up while you were away.

Can I allow or deny from the card?

Yes, once you turn it on with approve = true in ~/.config/drip/config.toml, or DRIP_APPROVE=1: Claude Code's and Codex's permission cards get Allow and Deny, and a click is the agent's answer. With nothing clicked in 9 minutes, the terminal asks as usual. Answer in the terminal instead and the card goes. Codex asks in its terminal only once the hook returns, so its card has the buttons only while you are not watching that terminal. Cards from an agent on another machine, and Gemini CLI's, only tell.

How do I get a card out of the way without going to the terminal?

Click the × that takes the icon's place when the pointer is on the card, or right-click, Control-click or Option-click anywhere on it: the card goes back into the notch and nothing comes forward. drip dismiss does the same from the keyboard, and VoiceOver offers Dismiss on every card.

How do I remove the hooks?

Delete the entries whose command is drip hook claude from ~/.claude/settings.json, or restore the backup drip setup left next to it.