Quick answer
For a desktop signal with no extra app, hook Claude Code's Stop event to a native macOS banner with osascript (display notification) or terminal-notifier, or ring the terminal bell. Those only fire while you're at that Mac. For a live, updating indicator, macOS Tahoe 26 mirrors your iPhone's Live Activities into the Mac menu bar via iPhone Mirroring — so a Claude Code Live Activity running on your phone shows up as a pill in your Mac's menu bar automatically.
You want your Mac to tell you when Claude Code is done, not to keep checking a terminal tab. There are two very different ways to get there: native banners that live on that one Mac, and — new in macOS Tahoe 26 — your iPhone's Live Activity mirrored straight into the Mac menu bar. The second is the interesting one, so we'll build up to it.
Option 1: Native macOS banners (no app, no account)
Claude Code's hook system can run any command when the agent finishes, so the simplest desktop notification is a one-liner that macOS already ships.
osascript (built in)
Hook the Stop event to osascript and macOS shows a banner:
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "/usr/bin/osascript -e 'display notification \"Claude Code finished — your move.\" with title \"Claude Code\" sound name \"Glass\"'"
}
]
}
]
}
}
That posts a banner in the top-right corner, drops it into Notification Center, and plays the Glass chime. No install required.
terminal-notifier (more control)
If you want to set the sound, subtitle, or click action more precisely, install terminal-notifier with Homebrew and call it instead:
brew install terminal-notifier
/opt/homebrew/bin/terminal-notifier -title "Claude Code" -message "Finished — your move." -sound Glass
Just a beep
If all you want is a sound, have the hook print a bell character and let your terminal handle it:
printf '\a'
Use absolute paths in every hook command (/usr/bin/osascript, /opt/homebrew/bin/terminal-notifier). Hooks run in a non-interactive shell that doesn't load your ~/.zshrc, so a bare terminal-notifier often won't be found even though it works in your terminal. This is the most common reason a desktop hook silently does nothing — see notifications not working.
The honest limit of all three: they fire on that Mac. Perfect when you're at the keyboard with the window buried; useless the moment you walk away.
Option 2: Your iPhone's Live Activity in the Mac menu bar
Here's the part most people don't know about. As of macOS Tahoe 26, your iPhone's notifications and Live Activities mirror to your Mac through iPhone Mirroring — and a Live Activity shows up as a pill-shaped indicator right in the Mac menu bar. So if you already run a Claude Code Live Activity on your phone, you can watch its status from the top of your Mac screen without picking the phone up.
What you need
- macOS Tahoe 26 on the Mac. (iPhone Mirroring and iPhone notifications shipped earlier in macOS Sequoia, but Live Activities on the Mac arrived in Tahoe 26.)
- An iPhone on iOS 18 or iOS 26, signed into the same Apple Account as the Mac.
- Wi-Fi and Bluetooth on, and Handoff enabled.
- iPhone Mirroring set up on the Mac.
Turn it on
- Set up iPhone Mirroring on the Mac (open the iPhone Mirroring app and follow the prompts). Once connected, your iPhone's notifications and Live Activities flow to the Mac automatically — even when you're not actively mirroring the screen.
- On the Mac: System Settings → Notifications → Allow notifications from iPhone, and confirm Allow Live Activities from iPhone is on (it defaults on after updating).
- On the iPhone: Settings → General → AirPlay & Continuity → Handoff on.
Using it
Start a Claude Code session that runs a Live Activity on your phone. A pill appears in your Mac's menu bar — a small icon or a compact view depending on how much menu-bar room you have. Click it to expand and read the current state (running, needs you, done); double-click to open the app in an iPhone Mirroring window. Your phone can stay in your bag.
This is the cleanest desktop story for Claude Code: you set up the Live Activity once on your phone, and it rides along to the Mac menu bar for free. The same card also shows on your iPhone Lock Screen and Dynamic Island — one status, three places.
Stop babysitting your terminal
Agentfy pushes Claude Code status to your iPhone — Live Activities, Dynamic Island, and instant alerts.
Which should you use?
| You want... | Use | |---|---| | A one-off ping while you're at the Mac | osascript / terminal-notifier banner | | Just a sound when it finishes | Terminal bell or a notification sound | | A live, updating status in the menu bar | iPhone Mirroring Live Activity (Tahoe 26) | | To be told when you've left the Mac | A push notification to your phone |
Native banners and the menu-bar Live Activity both depend on being near an awake Mac. The moment you leave the desk entirely, only a phone push reaches you — that's the gap Agentfy fills. It installs the Claude Code hooks via an open-source plugin, pushes each session's status to your iPhone, and runs the Live Activity that then mirrors into your Mac's menu bar — so you're covered both at the desk and away from it. For the full picture of what "done" even means, see how to know when Claude Code is done.