[VSCode Extension] Add native system/toast notifications when Claude needs attention

Status Open
Maintainer reply None cached
Activity 12 comments · opened May 8, 2026

Summary

The VSCode native extension currently has no way to notify the user when Claude needs attention (permission approval, task completion, waiting for input). The only indicators are:

  • A colored dot on the editor tab (🔵 pending / 🟠 done)
  • "✱ Claude Code" text in the status bar

Both are easy to miss when focus is on another window or monitor.

Request

Add a setting to emit VSCode/system-level notifications on key events, e.g.:

  • claude-code.notifications.enabled: boolean
  • claude-code.notifications.events: array of permissionRequest | taskComplete | waitingForInput | error

Ideally using vscode.window.showInformationMessage so users can rely on VSCode's built-in notification filter / Do Not Disturb.

Why not hooks?

Hooks (Notification / Stop) + external tools (BurntToast, msg, terminal-notifier) work, but:

  • Require platform-specific scripting
  • Not discoverable for new users
  • Duplicate work every user has to redo

A first-class setting would be much more ergonomic.

Environment

  • OS: Windows 11
  • VSCode native extension

View original on GitHub ↗

12 Comments

mlidbom · 4 months ago

Please!
I constantly work on other things while Claude Code is working in the background.
Not knowing when the agent is done causes great inefficiencies. I have to check back constantly, or accept that work goes far slower than it should.

jacobsvante · 4 months ago

It's rather surprising to find that this is not included today. Any known workarounds?

cveld · 3 months ago

@jacobsvante OP suggested:

Hooks (Notification / Stop) + external tools (BurntToast, msg, terminal-notifier) work, but [...]

I am a Windows 11 user, and I am exploring BurntToast at this moment. Would love to see unread markers in the sessions list though. I am heavily using parallel sessions.

tredondo · 3 months ago

I'm just giving Claude Code in VS Code a try after using Claude BYOK in Zed. Notifications are such an obvious feature, and their lack is so glaring; it boggled my mind that this FR was only fired SEVEN MONTHS after the VSCode extension was released.

@jacobsvante

It's ridiculous that there at least THREE extensions for Claude notifications.

Using competing tools is really an eye-opener.

ataldev · 3 months ago

How do they still not have this! I am so pissed trying to get a workaround here.

jmuheim · 3 months ago

I just tried for 2h to get this (or a workaround) working... didn't succeed. what a shame.

Sammmmm · 2 months ago

Please god yes

JosephLovato · 2 months ago

This would be a great native addition to the VSCode extension, providing more parity with the Desktop App Claude Code experience. I love being able to give permission for commands directly in the notification as long as there is enough context in the notification text.

So strong +1 to this

Sebastienlejeune · 2 months ago

that would be nice if the CLI and the extension could be aligned constantly, it's a pity to have behaviour differences regarding fine tuning

tbassettvera · 1 month ago

Agree this is desperately needed!

dandv · 1 month ago

Curious about the nature of the blocker here @bcherny

rahbari · 24 days ago

I added a stop hook to send a telegram message; it may be helpful:

		"Stop": [
			{
				"hooks": [
					{
						"type": "command",
						"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/tg-notify.sh",
						"timeout": 10
					}
				]
			}
		]
#!/bin/sh
# Stop: Telegram ping with the last reply. Needs TG_BOT_TOKEN and TG_CHAT_ID from .claude/settings.local.json env.
[ -n "$TG_BOT_TOKEN" ] && [ -n "$TG_CHAT_ID" ] || exit 0
in=$(cat)
dir=${CLAUDE_PROJECT_DIR:-$PWD}
branch=$(git -C "$dir" branch --show-current 2>/dev/null)
msg=$(printf '%s' "$in" | jq -r '.last_assistant_message // empty')
[ -n "$msg" ] || msg=$(jq -rs '[.[] | select(.type=="assistant") | .message.content[]? | select(.type=="text") | .text] | last // empty' "$(printf '%s' "$in" | jq -r '.transcript_path // empty')" 2>/dev/null)
curl -s -m 5 -o /dev/null "https://api.telegram.org/bot$TG_BOT_TOKEN/sendMessage" \
	--data-urlencode "chat_id=$TG_CHAT_ID" \
	--data-urlencode "text=✅ ${dir##*/} ($branch)
$(printf '%s' "$msg" | head -c 1500)"
exit 0