Notificações e aprovações do Claude Code no celular
O Claude Code tem hooks: pontos em que ele roda um comando seu. Isso basta para montar um aviso de quando ele pede permissão ou termina, e até para responder pelo celular. Veja como funciona por baixo e como o Wendo usa isso.
O que é um hook do Claude Code
Um hook é um comando que o Claude Code roda quando algo acontece: uma sessão começa, você envia um prompt, ele precisa de uma permissão, ele termina uma resposta. Você os declara em ~/.claude/settings.json, um evento por chave, cada um apontando para um comando:
{
"hooks": {
"Stop": [
{ "hooks": [{ "type": "command", "command": "~/.wendo/wendo-hook.sh" }] }
]
}
}
O Claude Code roda esse comando e passa um documento JSON na entrada padrão com os dados do evento: o nome do evento, o diretório de trabalho, o id da sessão e, conforme o caso, a ferramenta que ele quer usar. O comando faz o que quiser com isso. Para alguns eventos ele também pode escrever uma resposta na saída padrão, e é assim que o Claude Code fica sabendo da decisão.
Os eventos que o hook do Wendo registra
O instalador adiciona o mesmo script a seis eventos:
PermissionRequest: o Claude Code está prestes a pedir a sua permissão.Notification: um aviso do Claude Code que precisa de atenção.Stop: ele terminou de responder.UserPromptSubmit: você enviou um prompt, então ele está trabalhando.SessionStarteSessionEnd: uma sessão começa ou termina.
Cada evento é guardado como uma linha em ~/.wendo/events.jsonl no computador. O app lê esse arquivo por SSH com a sua chave, então não há servidor intermediário nem conta. O que você vê na Caixa de entrada vem dali.
Para instalar, um comando:
curl -fsSL https://wendo.lirafy.dev/install.sh | sh
Antes de mexer em settings.json ele salva uma cópia como settings.json.bak-wendo, e você pode rodá-lo várias vezes sem duplicar entradas. Os hooks que você já tem são deixados em paz. As opções e a configuração manual estão na página de avisos e aprovações; o passo a passo mais amplo para montar todo o ambiente está em como usar o Claude Code pelo celular.
Como funciona uma aprovação
PermissionRequest é o único evento em que o hook fica e espera. Quando o Claude Code pede permissão, o script registra o pedido como pendente e a Caixa de entrada do app mostra a linha com botões para aprovar ou negar. Ao tocar em um, o app deixa a resposta em um arquivo no computador, o hook a pega e devolve a decisão ao Claude Code.
A espera dura 90 segundos. Se você não respondeu até lá, o hook não imprime nada e o Claude Code mostra o prompt normal no terminal, como se o Wendo não existisse. Isso importa: se o celular morre ou você fica sem sinal, nada fica bloqueado, você só volta ao jeito de sempre.
Se você responder no terminal antes do celular, isso também fica registrado, como resolvido localmente.
Algumas variáveis de ambiente ajustam o comportamento, definidas antes do comando do hook:
WENDO_APPROVAL_TIMEOUT: segundos de espera. Otimeoutdo hook emsettings.json(120 na configuração instalada) precisa ser maior.WENDO_BLOCKING=0: só avisa, sem esperar resposta.WENDO_HOST: o nome pelo qual o app conhece o computador, se for diferente dehostname -s.
As perguntas do Claude (AskUserQuestion) e as aprovações de plano (ExitPlanMode) não bloqueiam. Elas pedem uma escolha em vez de um sim ou não, então você as responde pela Visualização de chat.
Avisos com o app fechado: ntfy
Enquanto o Wendo está aberto, o app lê a caixa de entrada a cada poucos segundos. Com o app fechado, algo precisa empurrar o aviso até o seu celular, e esse algo é o ntfy: um serviço simples de notificações push no qual você publica com uma requisição HTTP.
- Coloque
NTFY_TOPICantes do comando do hook emsettings.json:
NTFY_TOPIC=a-long-random-topic ~/.wendo/wendo-hook.sh
- Instale o app do ntfy no celular e assine esse mesmo tópico.
- Digite o tópico também no Wendo, em Ajustes › Agentes › Notificações.
Para gerar um tópico que ninguém vai adivinhar:
openssl rand -hex 16
O tópico funciona como senha. No servidor público do ntfy, qualquer pessoa que saiba o nome de um tópico pode ler o que é publicado nele e publicar mensagens próprias, então não use algo como claude-john. Os avisos incluem o projeto e um trecho da mensagem ou do comando, o suficiente para decidir, e não algo que você queira que estranhos leiam.
Se prefere não depender do servidor público, NTFY_URL aponta o hook para o seu próprio servidor ntfy. O padrão é https://ntfy.sh. Tocar em um aviso abre o painel do tmux, zellij ou herdr onde o agente roda, desde que você o rode dentro de um deles (veja a página do tmux).
No Android há também uma verificação em segundo plano pelo menos a cada 15 minutos. Só avisos de permissão, de notificação e de tarefa concluída vão para o ntfy; o hook não envia início de sessão, fim de sessão nem cada prompt.
Limites
- Por enquanto só o Claude Code. O hook não é registrado em outros agentes.
- Precisa de
jqno computador. Ocurlsó é necessário para o ntfy. - Sem um multiplexador, o app não sabe em qual painel o Claude está e não consegue levar você direto a ele.
- O plano grátis inclui 5 aprovações de teste pela Caixa de entrada; com o Pro não há limite.
- O Wendo ainda não está nas lojas: chega em breve à App Store e ao Google Play.