Żeby dostawać powiadomienia push z Claude Code przez ntfy, zainstaluj aplikację ntfy na telefonie, zasubskrybuj topic o trudnej do odgadnięcia nazwie i dodaj w Claude Code hook, który uruchamia curl -d "message" https://ntfy.sh/your-topic. Hook Notification da ci znać, gdy Claude potrzebuje uprawnienia albo czeka na ciebie, a hook Stop – w chwili, gdy kończy się tura. To nic nie kosztuje, zajmuje jakieś dziesięć minut i działa na Macu, Windows i Linux.
01Krok 1: wybierz topic i go zasubskrybuj
ntfy nie wymaga rejestracji. Topic powstaje w momencie, gdy ktoś pierwszy raz coś do niego opublikuje albo go zasubskrybuje, a każdy, kto zna nazwę, może go czytać. Dokumentacja ntfy mówi wprost, że topic to w praktyce hasło, więc niech będzie długi i losowy, np. claude-7f3k9q2xw4mz. Nazwa może zawierać litery, cyfry, podkreślenia i myślniki, maksymalnie 64 znaki.
Zainstaluj aplikację ntfy (App Store, Google Play albo F-Droid), stuknij + i zasubskrybuj swój topic na ntfy.sh.
Sprawdź z terminala, czy działa:
curl -H "Title: Test" -d "Hello from my computer" https://ntfy.sh/claude-7f3k9q2xw4mz
Telefon powinien zawibrować w ciągu sekundy, dwóch. Na Windows curl.exe jest wbudowany w Windows 10 i 11 i przyjmuje tę samą linię.
02Krok 2: skrypt hooka (Mac i Linux)
Claude Code przekazuje każdemu hookowi obiekt JSON na standardowe wejście. Oba eventy mają wspólne pola, takie jak cwd i hook_event_name. Notification dodaje message i notification_type, a Stop dodaje last_assistant_message, czyli treść ostatniej odpowiedzi Claude. Ten skrypt zamienia jedno i drugie w czytelny push. Potrzebuje jq (brew install jq albo apt install jq na Debianie i Ubuntu).
Zapisz go jako ~/.claude/ntfy-notify.sh i uruchom chmod +x ~/.claude/ntfy-notify.sh:
#!/bin/sh
TOPIC_URL="https://ntfy.sh/claude-7f3k9q2xw4mz"
input=$(cat)
event=$(printf '%s' "$input" | jq -r '.hook_event_name')
project=$(basename "$(printf '%s' "$input" | jq -r '.cwd')")
if [ "$event" = "Stop" ]; then
title="Claude finished: $project"
body=$(printf '%s' "$input" | jq -r '(.last_assistant_message // "Done") | .[0:300]')
priority=3
else
title="Claude needs you: $project"
body=$(printf '%s' "$input" | jq -r '.message // "Needs your attention"')
priority=4
fi
curl -s -H "Title: $title" -H "Priority: $priority" -H "Tags: robot" \
-d "$body" "$TOPIC_URL" > /dev/null
exit 0
Priorytet ma zakres od 1 (min) do 5 (urgent). Tags dodaje emoji do powiadomienia; robot pokazuje buźkę robota.
03Krok 3: podepnij to w settings.json
Dodaj hooki do ~/.claude/settings.json. Jeśli plik ma już obiekt hooks, dopisz te eventy do niego, zamiast go zastępować.
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{ "type": "command", "command": "~/.claude/ntfy-notify.sh" }
]
}
],
"Stop": [
{
"hooks": [
{ "type": "command", "command": "~/.claude/ntfy-notify.sh", "async": true }
]
}
]
}
}
"async": true sprawia, że hook Stop wysyła w tle, więc wolna sieć nigdy nie spowolni Claude. Uruchom nową sesję Claude Code, bo hooki ładują się przy starcie sesji.
Stop czy idle_prompt?
Stop odpala się w chwili, gdy Claude skończy, nawet jeśli siedzisz przy klawiaturze. Jeśli to za dużo, usuń blok Stop i zamiast tego użyj matchera permission_prompt|idle_prompt. Według dokumentacji Anthropic idle_prompt odpala się ok. 60 sekund po tym, jak Claude skończy, i tylko jeśli od tego czasu nic nie wpisałeś, a permission_prompt – gdy prośba o uprawnienie czeka ok. sześciu sekund bez naciśnięcia klawisza. Dostajesz więc za darmo zgrubny filtr „tylko gdy mnie nie ma”. Wszystkie pola i timingi opisują poradnik o Notification hook i poradnik o Stop hook.
04Windows (PowerShell)
Na Windows zapisz to jako %USERPROFILE%\.claude\ntfy-notify.ps1. Nie trzeba nic doinstalowywać:
$in = [Console]::In.ReadToEnd() | ConvertFrom-Json
$project = Split-Path $in.cwd -Leaf
if ($in.hook_event_name -eq 'Stop') {
$title = "Claude finished: $project"
$body = [string]$in.last_assistant_message
if ($body.Length -gt 300) { $body = $body.Substring(0, 300) }
$priority = '3'
} else {
$title = "Claude needs you: $project"
$body = [string]$in.message
$priority = '4'
}
Invoke-RestMethod -Method Post -Uri 'https://ntfy.sh/claude-7f3k9q2xw4mz' `
-Headers @{ Title = $title; Priority = $priority } `
-Body ([Text.Encoding]::UTF8.GetBytes($body)) | Out-Null
Potem użyj tego wpisu hooka zamiast powyższych linii command:
{
"type": "command",
"shell": "powershell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File \"$HOME\\.claude\\ntfy-notify.ps1\""
}
Jeśli odpalasz Claude Code w WSL, użyj skryptu dla Maca i Linux; z punktu widzenia hooka WSL to po prostu Linux.
05Prywatność
Cała treść pusha przechodzi przez serwer ntfy, a na ntfy.sh może ją przeczytać każdy, kto zna nazwę topicu. Powyższa wiadomość Stop zawiera początek odpowiedzi Claude, w której mogą być kod albo nazwy plików. Trzy sposoby, żeby to uszczelnić:
- Wysyłaj mniej. Zastąp treść
Stopstałym tekstem, np."Done", a w tytule zostaw tylko nazwę projektu. - Użyj tokena dostępu. ntfy przyjmuje
-H "Authorization: Bearer tk_..."przy każdej publikacji. Na własnym serwerze ustawauth-default-access: "deny-all", utwórz użytkownika przezntfy user addi token przezntfy token add. - Postaw własny serwer. ntfy można hostować samemu. Żeby powiadomienia docierały natychmiast do aplikacji na iPhone, dokumentacja ntfy zaleca ustawienie
upstream-base-url: "https://ntfy.sh"– wtedy do ntfy.sh trafia tylko ID wiadomości i hash topicu, żeby obudzić telefon, a aplikacja pobiera wiadomość z twojego serwera.
Jeśli Claude Code działa na zdalnym serwerze, ten sam hook zadziała tam bez zmian, więc ntfy świetnie nadaje się do powiadomień przez SSH.
06Gdzie pasuje Claude Code Notifier
Jeśli chodzi o jednokierunkowe alerty, powyższa konfiguracja w zupełności wystarczy i nie będziemy cię od niej odwodzić. Kończy się jednak na samym powiadomieniu. Gdy push mówi, że Claude potrzebuje uprawnienia, sesja i tak czeka, aż wrócisz do klawiatury.
ntfy obsługuje przyciski akcji wysyłające żądanie HTTP, więc ścieżkę odpowiedzi możesz zbudować sam: hook PermissionRequest, który publikuje prośbę, czeka na odpowiedź na drugim topicu i zwraca decyzję. Niektóre projekty open source robią dokładnie to (zobacz porównanie).
Claude Code Notifier daje ci to w gotowym pakiecie. Po sparowaniu telefonu możesz zezwolić jednorazowo, zezwolić na całą sesję albo odmówić uprawnienia, wybrać odpowiedź, gdy Claude zadaje pytanie, i wysłać kolejne polecenie, gdy Claude skończy – wszystko z telefonu. Sprawdza też, czy jesteś przy komputerze: jeśli pisałeś w ciągu ostatnich 30 sekund, terminal pyta jak zwykle i nic nie czeka na telefon. Jeśli cię nie ma, terminal czeka na twoją odpowiedź do ustawionego limitu i przestaje czekać, gdy tylko dotkniesz klawiatury. ccn działa na Macu, Windows i Linux; zajrzyj na stronę ccn i do cennika aplikacji mobilnych.
07FAQ
Czy ntfy jest darmowe dla powiadomień z Claude Code?
Publikowanie i subskrybowanie na ntfy.sh nie wymaga konta, a serwer jest otwarty dla wszystkich. ntfy ma też płatny plan i można go hostować samemu. Aktualne limity sprawdź na stronie ntfy.
Dlaczego mój hook ntfy się nie odpala?
Po edycji settings.json uruchom nową sesję Claude Code, bo hooki ładują się przy starcie. Potem odpal ręcznie testową linię curl i przepuść przykładowy JSON przez skrypt, np. echo '{"hook_event_name":"Stop","cwd":"/tmp/x"}' | ~/.claude/ntfy-notify.sh. Resztę omawia checklista rozwiązywania problemów.
Czy mogę odpowiedzieć Claude Code z powiadomienia ntfy?
Nie przy zwykłej publikacji. Przyciski akcji HTTP w ntfy mogą wysłać żądanie, ale potrzebujesz hooka, który poczeka na odpowiedź i zamieni ją na decyzję zrozumiałą dla Claude Code.
Czy dostanę push dla każdego typu powiadomienia?
Tylko dla matcherów, które podasz. Pomiń matcher we wpisie Notification, żeby dostawać wszystkie typy, łącznie z oknami uwierzytelniania i MCP.