macOS · Claude Code · menu bar

Claude Code is waiting. Nudge won't let you miss it.

Run several Claude Code windows at once and one of them quietly blocks — a permission prompt, a question, an idle finish — while you're heads-down in another. Nudge fires a native macOS banner the instant it happens, names which project, shows the real prompt, and a click jumps you straight to that window in VS Code.

Notarized Mac download coming soon — the one-line installer further down is the fastest way in for now.

1 window waiting
Claude Code windows
truss-backend idle
Focused in VS Code
reclaim the window you're in
Focused in VS Code
lendtrack idle
Focused in VS Code
Menu bar

The actual problem

A window blocks quietly. Nudge is the only thing watching all of them.

Claude Code emits hook events at exactly the moments a window needs you. Nudge doesn't poll or guess — it wires two of those hooks straight through to a native, clickable banner. The hooks are notify-only: they never block or change what Claude does.

claude-stuck-notifier: get pinged the moment any Claude Code window is waiting on you — permission prompts, question popups, idle finished
claude-stuck-notifier — the hook layer Nudge builds its clickable banners on top of.
1

Window blocks

A permission prompt, an AskUserQuestion popup, or Claude goes idle waiting for you.

2

Hook fires

Notification for permission/idle, PreToolUse (matcher AskUserQuestion) for a question.

3

Script routes it

A ~20-line shell script reads the JSON on stdin with jq and opens nudge://notify?…&cwd=….

4

Nudge posts, clickably

A UNUserNotificationCenter banner — click it and it focuses that project's VS Code window.

hooks/notify-stuck.sh
# stdin: the hook's event JSON, piped in by Claude Code cwd=$(jq -r '.cwd') msg=$(jq -r '.message // .question') open "nudge://notify?title=Claude%20Code&subtitle=$(basename $cwd)&message=$msg&cwd=$cwd" # notify-only — never blocks, never changes what Claude does

Every state that leaves you waiting

Same banner shape. The body is always the real thing.

Title is always Claude Code. Subtitle is always which project. The body is never generic — it's the actual permission message or the actual question text.

01
Permission / tool-approval prompt Claude's own permission message, verbatim.
"Needs permission to run Bash"
02
AskUserQuestion popup The actual question text Claude is asking.
"Which DB — Postgres or DynamoDB?"
03
Idle / finished, waiting Claude wrapped up and is waiting on your next prompt.
"Waiting for your answer"
Three example banners: a permission prompt for todo-app, a question popup for lendtrack, and an idle/finished banner for reclaim — each titled Claude Code with the project as subtitle
Straight from the README — same banner shape, three different projects.
Everything it does

One menu bar app. One job: don't let you miss it.

Small surface, on purpose — it has to stay alive to catch the click, and nothing else.

Live waiting count

The menu bar ✱ shows exactly how many Claude Code windows are waiting on you, updated the instant a hook fires.

The real prompt, not a ping

Every banner names the project and shows the actual message — Claude's permission text, or the real question — never a generic "something happened."

Click banner → focus VS Code

Nudge resolves com.microsoft.VSCode and runs the bundled code CLI to bring that project's window to the front.

De-dupes by project

Multiple hook events from the same window collapse into a single waiting entry instead of stacking banners.

Clear all

One click empties the list once you've caught up — no need to dismiss each banner one at a time.

Quit anytime

A normal menu bar app — ⌘Q or "Quit," nothing hidden running beyond the LaunchAgent that brings it back at login.

Fixes itself

If macOS notifications are off for Nudge, the menu offers a direct shortcut into System Settings instead of silently doing nothing.

Starts at login, stays alive

A LaunchAgent brings Nudge up at login and keeps it running — it has to stay alive to catch the click.

Nudge's menu bar dropdown: the sparkle icon showing a count of 2, listing claude-stuck-notifier and lendtrack as waiting, with Clear all and Quit Nudge below
The real menu bar dropdown — same shape as the demo above.
Honesty, sold hard

What "focus" actually means, and what it doesn't.

This is a small tool sitting on top of macOS APIs that have real limits. The candid version is more useful than a marketing one — here's exactly what Nudge can and can't do.

Focus is window-level, not exact-tab. macOS exposes no API to select a specific editor tab — Nudge brings the right VS Code window to the front. If two Claude sessions are running inside that same window, Nudge can't tell them apart either.

Folderless / home-dir sessions still get the full ping. Run Claude Code without a project folder and Nudge still fires the banner with the complete question text — but click-to-focus is only as precise as that session's cwd. It focuses a VS Code window open at that directory (often just your home folder) rather than a distinct project, and two folderless sessions sharing a cwd can't be told apart.

Verified working on macOS 26.3.1, where terminal-notifier's click callback is dead. Nudge's own README
Window-level focus Correct project window, not a specific tab — macOS doesn't expose that.
Known limit
Folderless / home-dir sessions Full ping, fuzzier focus — it lands on a VS Code window at that cwd, not a distinct project.
Best effort
macOS-only, for now Linux notify-send could be added — nothing about the hook contract is macOS-specific.
Today
Notify-only, always Hooks only ever report state. Nothing Nudge does can block a tool call or change what Claude does.
Guaranteed
manual test
# fire a notification by hand, no Claude Code required $ open "nudge://notify?title=Claude%20Code&subtitle=lendtrack&message=Which%20DB%3F&cwd=$HOME/dev/lendtrack" ✓ banner delivered — click focused lendtrack in VS Code
Get it

Never miss a waiting window again.

Free, open source, and honest about what it can't do.

install
# 1. wire up the hooks $ curl -fsSL https://raw.githubusercontent.com/gokulmc/claude-stuck-notifier/main/install.sh | bash # then reload your open Claude Code windows # 2. install the clickable menu bar app $ cd app && ./install.sh

Notarized Mac download coming soon — the installer above is the fastest way in for now.

macOS 13+ requires jq Xcode CLT to build

Two separate one-line steps: the hook installer wires up ~/.claude/settings.json (backed up first, merged idempotently — safe to re-run), then the app installer builds and signs Nudge.app and registers the LaunchAgent. Requires macOS 13+, jq (brew install jq), and Xcode command-line tools to build from source.