Notificações nativas do Windows para o Claude Code rodando no WSL.
Quando você sai para fazer outra coisa e fica na dúvida se o Claude ainda está trabalhando ou já terminou, esta ferramenta resolve: quando o Claude termina de responder (ou fica aguardando você), um toast do Windows aparece com o título da sessão, um trecho da resposta e a logo do mascote.
- Toast nativo do Windows disparado a partir do WSL, sem aplicativos extras.
- Título: título da sessão (o mesmo da aba do terminal).
- Corpo: trecho da última resposta do Claude (ou a mensagem do prompt).
- Rodapé: projeto, branch git e hora.
- Mascote do Claude no corpo e logo da Anthropic no cabeçalho.
- Som padrão
Cloudem todos os eventos (só muda se você trocar). Som de alerta distinto ao aguardar você é opcional (CCN_ALERT=1). - Tempo da resposta no rodapé (ex.:
2m30s). - Filtro por duração: opcionalmente só notifica respostas que demoraram.
- Clicar na notificação foca a aba/janela da sessão (Windows Terminal via UI Automation, pelo título; fallback para outras janelas).
- Comando
/ccnpara configurar tudo sem editar arquivo.
Dispara em dois momentos:
| Evento | Quando | Corpo |
|---|---|---|
Stop |
Claude termina de responder | trecho da última resposta |
Notification |
Claude fica aguardando você (ex.: pedido de permissão) | mensagem do Claude |
- Windows 10/11 com WSL2
powershell.exeacessível no PATH do WSL (padrão)jq(sudo apt install jq)
No próprio Claude Code:
/plugin marketplace add blpsoares/claude-code-notifications
/plugin install claude-code-notifications@blpsoares
O hook é registrado automaticamente, sem mexer no settings.json. Na primeira
execução o script se auto-configura no lado Windows (copia os assets e registra
o AppID).
git clone https://github.com/blpsoares/claude-code-notifications.git
cd claude-code-notifications
bash install.shDepois abra o menu /hooks (ou reinicie) para recarregar. O instalador é
idempotente e faz backup do settings.json.
Não use as duas formas ao mesmo tempo. Se instalou pelo install.sh e depois
quer o plugin, rode bash uninstall.sh antes, para evitar notificação
duplicada.
Notificações nativas do macOS (Notification Center) para o Claude Code — o
mesmo hook Stop/Notification usado no Windows/WSL, com um backend
próprio para o macOS.
- macOS
jq(brew install jq)terminal-notifier(opcional, mas recomendado):brew install terminal-notifier. Sem ele, a notificação cai paraosascript/display notification— ainda aparece, mas sem ícone próprio, imagem de conteúdo (mascote), clique-para-focar nem som customizado.
No próprio Claude Code:
/plugin marketplace add blpsoares/claude-code-notifications
/plugin install claude-code-notifications@blpsoares
O hook é registrado automaticamente (hooks/hooks.json), sem mexer no
settings.json. Na primeira execução o script se auto-configura no lado
macOS (copia mascote, logo e sons para ~/Library/Application Support/claude-code-notifications).
O instalador manual (install.sh na raiz do repo) hoje é específico para
WSL; no macOS use a instalação via plugin acima.
A primeira iteração do macOS cobre toast, som, mascote/ícone e
clique-para-focar. Ainda não tem os botões de resposta (Sim / Sim sempre /
Não) do prompt de permissão que existem no Windows — /ccn buttons não tem
efeito no macOS por enquanto.
A notificação em si funciona com qualquer terminal que hospede a sessão. O clique-para-focar ativa o terminal dono da sessão (Wave Terminal, iTerm2, VS Code, Ghostty, etc.) por ativação genérica via bundle id. Seleção precisa de aba/janela pelo título da sessão só existe para Terminal.app e iTerm2 — os únicos cujos dicionários AppleScript expõem endereçamento por aba; nos demais terminais o clique traz a janela/app para frente, sem escolher a aba.
| Peça | Onde fica | Papel |
|---|---|---|
scripts/notify.sh |
plugin (ou ~/.claude/hooks/) |
Hook Stop/Notification; lê o JSON do evento, extrai os dados e dispara o toast via powershell.exe. Auto-configura o Windows na primeira execução. |
claude-logo.png / anthropic.png |
%LOCALAPPDATA%\claude-code-notifications\ |
Mascote (corpo do toast) e logo Anthropic (ícone do cabeçalho). |
Cloud.wav / Alert.wav |
%LOCALAPPDATA%\claude-code-notifications\ |
Sons padrão: Cloud ao terminar, Alert ao aguardar você. |
scripts/ccn-config.sh + commands/ccn.md |
plugin | Implementam o comando /ccn. |
AppID Claude.Code.Notifications |
registro HKCU |
AUMID registrado (nome "Claude Code" + ícone Anthropic). Sem isso o Windows descarta o toast. |
focus.ps1 / focus.vbs + protocolo claudecodenotify:// |
%LOCALAPPDATA%\... e HKCU |
Clique na notificação foca a aba/janela da sessão. |
hooks/hooks.json |
plugin | Registra Stop + Notification automaticamente. No modo manual, vão para ~/.claude/settings.json. |
Com o plugin instalado, configure sem editar arquivo:
/ccn status mostra a configuração atual
/ccn on | off liga/desliga as notificações
/ccn test dispara um toast de teste
/ccn threshold 30 só notifica no Stop se a resposta demorou >= 30s
/ccn duration on|off mostra/oculta a duração no rodapé
/ccn buttons on|off botões Sim / Sim sempre / Não no prompt de permissão
/ccn click on|off clicar na notificação foca a aba/janela da sessão
/ccn sound <nome> default | silent | im | mail | reminder | alarm | call
/ccn sound-file <path> usa um .wav próprio
Alternativa ao /ccn: as variáveis no ~/.claude/hooks/ccn.config.
CCN_ENABLED=0desliga as notificações.CCN_MIN_SECONDS=30noStop, só notifica se a resposta demorou >= 30s (padrão0, sempre). Não afeta oNotification.CCN_SHOW_DURATION=0oculta a duração no rodapé.CCN_CLICK=0desativa o clique-para-focar.CCN_BUTTONS=0desativa os botões de resposta no prompt de permissão.CCN_ALERT=1usa um som de alerta distinto (Alert.wav) noNotification(aguardando você). Sem isso, o som é sempre oCloud.
O som padrão é o Cloud.wav (empacotado, um toque suave). Para trocar:
Sons prontos do Windows, via CCN_SOUND:
CCN_SOUND='ms-winsoundevent:Notification.IM'
CCN_SOUND='ms-winsoundevent:Notification.Mail'
CCN_SOUND='ms-winsoundevent:Notification.Reminder'
CCN_SOUND='ms-winsoundevent:Notification.Looping.Alarm'
CCN_SOUND=silentSom customizado (qualquer .wav), via CCN_SOUND_FILE (caminho Windows ou WSL):
CCN_SOUND_FILE='C:\Windows\Media\tada.wav'
CCN_SOUND_FILE='/home/voce/sons/ping.wav'CCN_SOUND_FILE tem prioridade sobre CCN_SOUND. O Windows só toca arquivos
próprios via <audio>, então o .wav customizado é tocado à parte com o
SoundPlayer.
- Tamanho do trecho:
CCN_MAX_LEN=120(padrão220).
Na ordem mais comum:
- Notificações silenciadas ou Não Perturbe (Assistente de Foco). É a causa mais comum. Vá em Configurações, Sistema, Notificações, garanta que estão ligadas e desative o Não Perturbe, inclusive as regras de ativar automaticamente (ao jogar, app em tela cheia, duplicar a tela), que silenciam tudo sem avisar.
- Config não recarregada. Se acabou de instalar, abra o menu
/hooks(ou reinicie). - AppID. O instalador registra o AUMID
Claude.Code.Notificationspara que o Windows aceite o toast; toasts de AppID não registrado são descartados.
Clicar no toast foca a aba/janela da sessão que disparou a notificação. Como funciona:
- No Windows Terminal, a aba certa é localizada pelo título (o Claude escreve o nome da sessão no título da aba) via UI Automation e selecionada por API, independente da posição da aba. Depois a janela é trazida para frente.
- Fora do Windows Terminal (ex.: terminal integrado do VS Code), há um fallback que foca a janela cujo título contém o nome da sessão.
O clique usa apenas APIs seguras (UI Automation e ativação de janela), sem manipulação de foco de baixo nível.
Para desativar o clique, defina CCN_CLICK=0 no ccn.config.
No evento Notification (o Claude pedindo permissão), a notificação traz os
botões Sim, Sim, sempre e Não. Ao clicar, o handler primeiro
seleciona a aba certa (mesma UI Automation do clique) e só então envia a tecla —
por isso a resposta vai para a sessão correta, não para a aba que estiver ativa.
- Sim envia
1(a 1ª opção é sempre "sim"). - Não envia
Esc(cancela em prompts de 2 ou 3 opções). - Sim, sempre decide no clique: lê o texto do prompt e, se existir a opção
"não perguntar de novo", usa ela (
2); se o prompt só tiver Sim/Não, cai num Sim (1). Assim nunca seleciona a opção errada.
É best-effort: depende do prompt ainda estar aberto. Desative com
CCN_BUTTONS=0.
bash uninstall.shRemove os hooks (com backup) e o AppID registrado.
MIT. Veja LICENSE.
