Blog · August 19, 2026 · 6 min read · by Vilva Athiban P B
terminal-notifier + Claude Code: Native macOS Alerts When Your Agent Finishes
If you want a real, native macOS notification — banner, sound, badge, the works — when Claude Code finishes a task, there are exactly two tools worth knowing. One ships with every Mac (osascript), and one is a twelve-year-old open-source classic that does the job better: terminal-notifier. This guide wires both into Claude Code, so your agent taps you on the shoulder instead of sitting silently finished — or silently stuck — behind your other windows.
What terminal-notifier is
terminal-notifier is a small command-line tool that posts genuine macOS User Notifications from scripts and terminals. It has been around since OS X Mountain Lion, it is a one-line Homebrew install, and unlike AppleScript one-liners it gives you proper options: titles, subtitles, custom sounds, notification groups, and — the killer feature for agent workflows — a flag that makes clicking the notification jump straight back to your terminal.
brew install terminal-notifierTest it immediately:
terminal-notifier -title "Claude Code" -message "All done" -sound GlassIf a banner slides in from the top-right, you are in business. If nothing appears, jump to the permissions section below — macOS treats terminal-notifier as its own app and it needs notification permission once.
The one-liner version (no config at all)
The simplest pattern needs no setup inside Claude Code whatsoever: chain the notifier after any long command, exactly as you would with a build:
claude -p "run the test suite and fix failures" && terminal-notifier -title "Claude Code" -message "Task finished" -sound GlassThat works for one-shot, non-interactive runs. But most Claude Code sessions are interactive — and the moment you care about most is not just "done", it is "waiting for your permission". For that you want hooks.
Wiring terminal-notifier into Claude Code hooks
Claude Code fires hook events at exactly the two moments that matter: Stop (the agent finished responding) and Notification (it needs your input or permission). Add this to ~/.claude/settings.json:
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "terminal-notifier -title 'Claude Code' -message 'Finished — come take a look' -sound Glass -group claude-code"
}
]
}
],
"Notification": [
{
"hooks": [
{
"type": "command",
"command": "terminal-notifier -title 'Claude Code' -message 'Waiting for your input' -sound Sosumi -group claude-code"
}
]
}
]
}
}Restart your Claude Code session so the hooks load. Two details doing quiet work here: different sounds for the two events (so you know from the next room whether it is done or blocked), and -group claude-code, which makes each new alert replace the previous one instead of piling up a stack of stale notifications. If hooks are new to you, our Claude Code hooks guide covers the format, and there is a deeper dive into the Notification event specifically.
Click to jump back to your terminal
The flag that makes terminal-notifier nicer than any AppleScript alternative: -activate takes an app bundle ID and brings that app forward when you click the notification.
# Terminal.app
terminal-notifier -title "Claude Code" -message "Done" -activate com.apple.Terminal
# iTerm2
terminal-notifier -title "Claude Code" -message "Done" -activate com.googlecode.iterm2Notification arrives, you click it, and you are looking at the session that needs you. No dock hunting.
The zero-install alternative: osascript
Every Mac can post a notification without installing anything, via AppleScript:
osascript -e 'display notification "Task finished" with title "Claude Code" sound name "Glass"'It works in the same hooks, and it is fine for a quick start. The trade-offs: since macOS Big Sur the notification is attributed to whatever app ran the script (your terminal), macOS will ask for notification permission on first use, and you get none of the grouping, activation, or click behaviour above. Start with osascript if you like; most people graduate to terminal-notifier within a week.
When the notification never shows up
Three culprits cover nearly every silent failure:
- Permission was never granted. Open System Settings → Notifications, find terminal-notifier (or your terminal app, for osascript) and allow alerts. If you are seeing the infamous "notifications are turned off for Claude" message instead, that one has its own step-by-step fix.
- Focus mode is eating it. Do Not Disturb and Focus silently swallow banners. Either allow the app in your Focus settings or check Notification Center — the alerts are usually sitting there.
- The hook command is not on PATH. Hooks run in a minimal shell. If
terminal-notifierworks in your terminal but not from a hook, use the absolute path —/opt/homebrew/bin/terminal-notifieron Apple Silicon.
The honest limits of the DIY route
This setup is good, and for a single tool it may be all you need. Its ceiling: the config lives per machine, the two events are only as granular as your hook commands, and if you also run Cursor, Codex CLI or Gemini CLI you get to repeat the wiring in three other formats — our notification scripts roundup shows quite how varied that zoo is.
Either way, stop watching the terminal scroll. Your agent can wait for you — you should not have to wait for it.
Keep reading
Desk Exercises for Programmers: 15 Moves to Do While Your AI Agent Codes
7 min read
Exercise While Coding: Turn Claude Code Wait Time Into Micro-Workouts
7 min read
Claude Code Notch Notifications on Mac: See When Claude Is Done Without Watching the Terminal
7 min read
Claude Code Tips and Tricks: 12 Ways to Use Claude Code Effectively
8 min read
Claude Code Multiple Sessions: How to Run Agents in Parallel Without Losing Track
6 min read
A Claude Code Workflow That Doesn't Involve Watching the Terminal
5 min read
Claude Code Hooks: A Practical Guide to Automating Your Agent Workflow
7 min read
Claude Code Auto Mode: Fewer Permission Prompts Without Living Dangerously
7 min read
Claude Code Subagents: How to Delegate Work to Specialized Agents
7 min read
Claude Code Context Management: Treat the Context Window Like a Budget
6 min read
Per-Subagent Model Selection: Route the Grunt Work Down, Keep the Judgment Up Top
7 min read
Skills and Plugins: How to Teach Claude Code Your Way of Working
7 min read
Claude Code Background Tasks: Run Long Commands Without Blocking Your Session
6 min read
Codex CLI Notifications: How to Get a Ding When Codex Is Done or Needs Input
7 min read
Cursor Notification When Done: Every Way to Get Notified When Cursor Finishes
6 min read
Claude Code Notifications: How to Get Notified When Claude Code Finishes or Needs Your Input
6 min read
Want to Be Notified When Claude Responds? How Claude Notifications Work on Web, Desktop, and Mobile
5 min read
Claude Code Notification Scripts: Copy-Paste Recipes for Every Platform
6 min read
Get a Ding the Moment Codex Needs Your Response
6 min read
Get Notified the Moment Claude Code Is Waiting for Your Input
6 min read
“Notifications Are Turned Off for Claude” — Here Is the Fix
6 min read
Codex Sound When Done: Make Codex CLI Play a Sound When It Finishes
6 min read
Gemini CLI Notifications: How to Get a Sound or Alert When Gemini Finishes
6 min read
Get Claude Code Notifications on Your Phone
6 min read
Claude Code Remote Control, Explained
7 min read
preferredNotifChannel: Claude Code's Built-In Notification Setting
6 min read
Claude Code Notifications in tmux and Over SSH
7 min read
Claude Code Effort Levels: Why Your Setting Keeps Getting Ignored
8 min read
Codex vs Claude Code Notifications: How Each One Tells You It Is Done
8 min read
Claude Code Notifications Not Working: A Diagnostic Checklist
10 min read
Claude Code Notifications Inside Your Editor's Terminal
7 min read
CLAUDE_CODE_DISABLE_BACKGROUND_TASKS Explained
7 min read
CLAUDE_CODE_DISABLE_BG_SHELL_PRESSURE_REAP Explained
8 min read
Cursor Alerts Explained: Every Alert Cursor Raises, and How to Control Them
7 min read
Claude Code Environment Variables: The Groups That Actually Matter
10 min read
Claude Code Notifications on WSL and Windows
9 min read
Claude Code Checkpoints and /rewind
8 min read
Claude Remote Control: How It Works, Turning It Off, and Auto Mode
7 min read
Claude Code /loop: Poll a Deploy, Babysit a PR, and Get Told When It's Done
8 min read
Setting Up NotchFit With OpenAI Codex CLI: Hooks, $notchfit-plan, and the Daily Flow
7 min read
Claude Mods Explained: What the New Plugin Layer Can Do, and How to Turn On 'You Should Know'
9 min read
NotchFit vs Mac Break Reminder Apps: A Clock or a Signal From Your Coding Agent?
8 min read
Claude Code Headless Mode: Running claude -p in Scripts and CI, and the Three Signals That It Finished
10 min read
Building a Movement Habit at a Desk: Use the Agent Run as the Cue, One Set as the Unit, and Streaks Carefully
8 min read
Claude Code MCP Servers Explained: Adding Servers, Choosing a Scope, Handling Secrets, and Why Long Tool Calls Go to the Background
10 min read
/notchfit:plan Explained: How Claude Code or Codex Writes a Weekly Workout Plan the Notch Can Actually Run
8 min read
Claude Code Spinner Verbs Explained: What “Pondering” and “Brewing” Mean, How to Change Them, and Why You Should Stop Watching the Spinner
7 min read
Why NotchFit's Done and Permission Alerts Wait Until Your Set Ends, When That Costs You, and How to Turn the Workout Off
7 min read
How to Resume a Claude Code Session: --continue vs --resume, Naming Sessions, the Session Picker, Branching, and What Comes Back
9 min read
NotchFit on a Mac Without a Notch: How Pill Mode Works on Mac mini, iMac, Mac Studio and a MacBook With the Lid Closed
6 min read
How to Run a Claude Code Session in the Background: /background, claude --bg, Agent View, and Getting Back to It
9 min read
What a Notch App Can See: NotchFit's Local-First Design, What the Claude Code and Codex Hooks Send, and What Stays on Your Mac
7 min read
Why Codex CLI Asks for Permission Every Time, and How to Tune the Sandbox and Approval Policy Without Going Full Access
8 min read
What to Do While Claude Code or Codex Works: A Simple Protocol for the Two-to-Twenty-Minute Gap in Every Agent Run
7 min read
Is It Possible to Get a Notification When Claude Code or Codex Hits a Reset? Yes for Claude Code: the quota_auto_resume Hooks, Explained
8 min read
What a MacBook Notch App Can Actually Do: The Five Kinds of Notch Utility, Their Trade-offs, and Where NotchFit Fits
7 min read