Receba um aviso quando seu treinamento ou build terminar

Rode seu job com o LidRun e ele te avisa no instante em que o processo termina — com o código de saída e quanto tempo levou — assim você recebe um aviso quando o job no Mac termina, em vez de ficar de olho na janela do terminal. O push no celular (ntfy.sh ou Pushover) é gratuito; Telegram, Discord, Slack e um webhook personalizado fazem parte do Pro. Se preferir não instalar nada, o macOS já tem alguns comandos capazes de avisar quando um comando do shell termina — este guia cobre os dois caminhos: o jeito nativo e gratuito, e exatamente como funcionam os canais do LidRun, de ponta a ponta.
Por que você fica checando o terminal
O macOS não tem um jeito nativo de dizer "me avise quando isso terminar". O Terminal.app pode piscar o ícone no Dock quando um comando do shell em segundo plano termina (Preferences → Profiles → Shell → "Notify when process completes"), mas isso só ajuda se você estiver sentado na frente do Mac para ver — não chega ao seu celular, e não diz nada sobre se o comando realmente teve sucesso. Fora isso, um ollama pull, um cargo build, um loop de treinamento ou uma sessão do Claude Code / Codex rodando sem supervisão termina em silêncio total.
Então você fica sentado checando de novo, ou sai e tenta adivinhar: volta cedo demais e ainda está esperando, volta tarde demais e perdeu um tempo que poderia ter usado em outra coisa. Apps genéricos de keep-awake — Amphetamine, Caffeine, KeepingYouAwake, Lungo — resolvem bem a primeira metade do problema, impedindo que o Mac durma, mas nenhum deles observa um comando específico nem avisa quando ele termina. Isso é um trabalho diferente de um interruptor na barra de menu.
A solução é uma única mensagem no instante em que o processo termina, dizendo se ele realmente teve sucesso. O resto deste guia cobre duas formas de conseguir isso: montar você mesmo com o que já existe no seu Mac, ou deixar o LidRun fazer isso por você.
O jeito nativo e gratuito de receber um aviso
O macOS já vem com o suficiente para montar uma versão simples disso sem instalar nada. say "build finished" fala uma frase em voz alta — funciona bem se você estiver no cômodo ao lado. osascript -e 'display notification "Build finished, exit 0" with title "Terminal"' posta um banner de verdade no Notification Center, do mesmo tipo que qualquer app produz. Encadeie qualquer um dos dois a um comando com ; (roda independente do sucesso) ou && (roda só se tiver dado certo): npm run build && osascript -e 'display notification "Build finished" with title "npm"'.
Para algo um pouco mais polido, terminal-notifier (brew install terminal-notifier) é a ferramenta gratuita padrão para isso — terminal-notifier -title "Build" -message "Finished" posta o mesmo tipo de banner, com uma API de linha de comando mais agradável. Nenhuma dessas três, porém, chega ao seu celular; são só Notification Center, no Mac em que você está sentado.
A parte que costuma passar despercebida: nem say, nem osascript, nem terminal-notifier mantêm o Mac acordado. Se a tela dorme e o sleep por inatividade entra em ação antes do job terminar, o macOS pode pausar o processo inteiro — o build trava, e o comando de notificação no fim da cadeia nunca roda. caffeinate -i na frente de um comando segura o sleep por inatividade exatamente pelo tempo que esse comando roda, que é a parte que as ferramentas de notificação não oferecem sozinhas.
Juntando tudo, essa é a receita completa, gratuita e nativa — ficar acordado durante o job, depois avisar quando terminar:
caffeinate -i npm run build; osascript -e 'display notification "Build finished" with title "npm"'
Onde a cadeia caseira falha
Na prática, três coisas dão errado com caffeinate mais um comando de notificação. Primeiro, caffeinate é um wake lock cego — ele não tem ideia de qual é o estado da bateria ou da temperatura, e vai manter um MacBook acordado em qualquer nível de carga ou temperatura pelo tempo que o comando envolvido rodar. Isso é tranquilo para um build de cinco minutos na mesa; numa execução mais longa e sem supervisão, é um jeito real de acabar com a bateria zerada ou um desligamento por superaquecimento, especialmente com as saídas de ar bloqueadas num suporte de notebook ou dentro de uma mochila. Manter o Mac ventilado continua sendo responsabilidade sua de qualquer forma — nenhuma notificação, de nenhuma ferramenta, resfria o chassi.
Segundo, osascript, terminal-notifier e say só chegam ao Mac em que você está. Se você se afastou, só vai ver o banner quando por acaso olhar para a tela de novo — que é exatamente o problema que você estava tentando resolver.
Terceiro, fechar a tampa interrompe a cadeia inteira. A menos que você tenha rodado separadamente pmset disablesleep 1 — que exige autenticação de admin e é um interruptor mais pesado e permanente, que você precisa lembrar de desligar de volta com 0, não algo restrito a um único comando — fechar a tampa suspende o Mac, o job, e o comando de notificação junto.
A versão gratuita do LidRun: um comando encapsulado mais uma chamada de notify
Essa é a lacuna que o LidRun preenche, e o plano gratuito já cobre a versão básica disso. A regra é simples: agente ou comando rodando → ficar acordado; comando concluído, ou algo se tornar inseguro → liberar e deixar o Mac dormir. A receita gratuita via CLI:
lidrun -- npm run build; lidrun notify "Build finished" "exit $?"
lidrun -- <command> envolve o comando numa asserção keep-awake durante toda a sua execução — é autocontido, e nenhum app LidRun precisa estar rodando para essa parte. Vale ser preciso aqui: sozinho, esse wrap é um wake lock simples, como o caffeinate, sem consciência de bateria ou temperatura embutida, liberado no instante em que o processo filho termina. lidrun notify "<title>" "<body>" é a parte que adiciona uma notificação de verdade, e essa sim precisa do app LidRun rodando na barra de menu — ela posta um banner local e, se você tiver ativado o push no celular em Notifications & Alerts, envia para o seu celular via ntfy.sh (gratuito, baseado em tópicos — instale o app ntfy, assine um tópico que você escolher, e o LidRun posta nele) ou Pushover (um app pago de compra única, não uma assinatura). Os dois comandos são gratuitos — nenhum plano Pro é necessário.
O piso de segurança padrão do LidRun — parar automaticamente quando a bateria cai para cerca de 4%, recuando sob pressão térmica sustentada — pertence aos próprios modos do app: Keep Awake, Timer e Run & Watch a Command, todos rodando dentro da máquina de estados do LidRun, e não como uma simples asserção IOKit. Se você quer que o próprio job seja observado com essa rede de segurança, e não apenas envolvido, é isso que o Keep Awake/Timer gratuitos ou o Run & Watch Pro oferecem a mais que o wrap puro via CLI — não é um wake lock cego rodando não importa o que esteja acontecendo com o Mac.
Telegram, Discord, Slack e webhook — a camada Pro
Se você quer que os alertas saiam completamente do Mac — caiam num canal que sua equipe já acompanha, ou cheguem a um app que você não precisa instalar — são essas as integrações Pro do LidRun: Telegram, Discord, Slack e um webhook genérico, todos configurados na janela Notifications & Alerts da barra de menu. O push no celular mencionado acima continua gratuito de qualquer forma; esses quatro fazem parte do mesmo plano que libera Run & Watch a Command, o modo Closed-Lid e Smart Rules.
No Telegram, sem precisar criar seu próprio bot: abra o bot compartilhado do LidRun (@Libruntest_bot, ou o botão "Open the LidRun bot" dentro do app) e toque em Start, depois abra o @userinfobot para pegar o seu Chat ID numérico, e cole esse Chat ID no LidRun. É só isso — sem token de bot, sem BotFather. Um campo avançado permite usar seu próprio bot em vez disso; deixe em branco para usar o compartilhado.
Discord e Slack funcionam do mesmo jeito do lado do LidRun: crie uma URL de webhook de entrada nas configurações de integração do canal (Discord: configurações do canal → Integrations → Webhooks → New Webhook; Slack: o app Incoming Webhooks do seu workspace) e cole a URL. As mensagens do Discord são postadas como {"content": "..."}; as do Slack, como {"text": "..."} — o mesmo JSON que a própria documentação de webhook de cada serviço descreve, então não há nada específico do LidRun para aprender.
O webhook genérico serve para todo o resto — Zapier, IFTTT, Home Assistant, seu próprio endpoint. O LidRun envia um POST com isto para a URL que você fornecer:
{"title": "Task finished ✅", "body": "npm run build (exit 0) after 2m 14s", "event": "session_finished", "app": "LidRun"}
event é uma chave curta, pensada para máquina, que você pode usar para rotear — session_finished e all_tasks_finished para trabalho concluído, thermal_critical e sleep_failed para o lado de segurança.
O envio é do tipo fire-and-forget com uma tentativa extra: se um canal rejeitar a mensagem, o LidRun espera 5 segundos e tenta mais uma vez, depois registra a falha em vez de tentar indefinidamente. Cada requisição expira depois de 15 segundos. Use "Send test" ao lado de cada canal antes de uma execução real, para que um Chat ID ou URL de webhook incorreto não engula silenciosamente seu primeiro alerta.
O que realmente dispara um alerta
Vale conhecer dois grandes tipos de evento. O primeiro é um comando concluído. O Run & Watch a Command (Pro, dentro do app) roda seu comando, mantém o keep-awake durante toda a execução e, ao sair, dispara um alerta já com o código de saída e a duração — "Task finished" ou "Task failed", não apenas "parou". O Auto Mode (Pro) faz o mesmo para uma lista inteira de processos monitorados e avisa quando tudo nela tiver terminado, mas só enquanto você realmente está ausente — tampa fechada, ou alguns minutos de inatividade — para não empilhar banners toda vez que você está sentado na mesa.
O segundo é um evento de segurança, e ele tem duas camadas. O piso de segurança padrão do LidRun — liberar o keep-awake porque o Mac ficou criticamente quente ou a bateria atingiu o limite de emergência, ou o LidRun falhar em restaurar o sleep normal depois do modo Closed-Lid — envia push para o seu celular pelo toggle gratuito "Critical safety alerts", independente da licença. O Watchdog (Pro) acrescenta detecção mais específica em cima disso: um agente que parece travado esperando você, uma conexão de rede caída, e as mesmas condições críticas de temperatura/bateria, só que detectadas mais cedo e relatadas com mais detalhes.
Uma regra amarra tudo isso: o push no celular — um banner local mais ntfy ou Pushover — é gratuito para todo evento que o LidRun pode disparar. Telegram, Discord, Slack e o webhook são a camada Pro por cima, distribuindo os mesmos eventos para mais lugares.
Se você também ativar "Away notifications" (gratuito), fechar a tampa com algo rodando envia uma mensagem curta dizendo o que está em execução e o que o LidRun vai fazer em relação a bateria e temperatura, e depois um resumo curto quando você abrir a tampa de novo — uma mensagem por momento, não um fluxo constante de atualizações.
O LidRun mantém seu trabalho rodando com a tampa fechada, com proteção de bateria e temperatura embutida.
Já tem o LidRun? Leia o guia de configuração →
Novo no LidRun? Veja os preços →
Perguntas frequentes
Não. Abra o bot compartilhado do LidRun (@Libruntest_bot) no Telegram, toque em Start, e depois cole o Chat ID numérico que o @userinfobot te dá na janela Notifications & Alerts do LidRun. Não há token de bot para gerar nem nada para registrar no BotFather. Um campo avançado permite usar seu próprio bot em vez disso — deixe em branco para usar o compartilhado.
O push no celular — um banner local mais ntfy.sh ou Pushover — é gratuito, e cobre avisos de tarefa concluída, o piso de segurança padrão do LidRun (bateria baixa, superaquecimento) e as away notifications. Telegram, Discord, Slack e o webhook personalizado são Pro, junto com Run & Watch a Command (o modo que monta automaticamente o alerta com código de saída e duração), Auto Mode e Watchdog.
O webhook genérico envia um POST em JSON: {"title": "...", "body": "...", "event": "...", "app": "LidRun"}, onde event é uma chave curta, pensada para máquina, como session_finished, que você pode usar para rotear. O Discord recebe {"content": "..."} e o Slack recebe {"text": "..."} — o formato padrão que a própria documentação de incoming webhook de cada serviço descreve.
Sim, para o Run & Watch a Command (Pro): o título mostra "Task finished" ou "Task failed", e o corpo inclui o código de saída e quanto tempo levou. O wrap gratuito via CLI lidrun -- <command> não monta essa mensagem automaticamente — encadeie com lidrun notify "title" "exit $?" para obter a mesma informação de graça.
Para envios via Telegram/Discord/Slack/webhook: sim, uma vez. Se um canal rejeitar a mensagem, o LidRun espera 5 segundos e tenta de novo, depois registra a falha em vez de tentar indefinidamente. Banners locais e o push via ntfy/Pushover são uma única requisição fire-and-forget, sem esse tipo de nova tentativa.
Sim. caffeinate -i your-command; osascript -e 'display notification "Done" with title "Job"' impede o Mac de entrar em sleep por inatividade enquanto o comando roda, e depois posta um banner do Notification Center quando termina. É só local — não chega ao seu celular se você tiver se afastado, e não tem nenhuma consciência sobre se sua bateria ou temperatura estão seguras para continuar empurrando.
Sim. Quando o piso de segurança padrão do LidRun libera o keep-awake — criticamente quente, ou bateria perto do limite de emergência — isso envia push para o seu celular pelo toggle gratuito "Critical safety alerts", independente dos avisos de tarefa concluída. O Watchdog (Pro) acrescenta alertas mais específicos em cima disso, como um agente que parece travado esperando você ou uma conexão de rede caída.