Na macOS Claude Code sam wysyła powiadomienie systemowe w Ghostty, Kitty i iTerm2 (w iTerm2 trzeba włączyć ustawienia alertów), ale Apple Terminal i większość innych terminali nie dostaje nic. Żeby mieć powiadomienie w dowolnym terminalu, dodaj do ~/.claude/settings.json hook Notification, który uruchamia osascript -e 'display notification ...', oraz hook Stop, jeśli chcesz też wiedzieć, kiedy dokładnie Claude kończy. Zezwól na powiadomienia dla Edytora skryptów w Ustawieniach systemowych, inaczej polecenie osascript po cichu się nie powiedzie.
01Co Claude Code robi sam z siebie
Claude Code wysyła zdarzenie powiadomienia, gdy kończy zadanie albo czeka na zgodę, a ty wyglądasz na nieobecnego przy terminalu. To, co zobaczysz, zależy od terminala, zgodnie z przewodnikiem po terminalach od Anthropic:
W iTerm2 otwórz Settings > Profiles > Terminal, zaznacz Notification Center Alerts, potem kliknij Filter Alerts i włącz Send escape sequence-generated alerts. Sprawdź też, czy iTerm2 może wysyłać powiadomienia w Ustawieniach systemowych > Powiadomienia.
W Apple Terminal możesz mieć przynajmniej dźwięk. Ustaw "preferredNotifChannel": "terminal_bell" w ~/.claude/settings.json i włącz Audible bell w Settings > Profiles > Advanced. Szczegóły znajdziesz w przewodniku o dzwonku terminala.
Wbudowany alert ma ograniczenia. Odpala się tylko, gdy Claude Code uzna, że cię nie ma, mówi jedynie, że coś się stało, i nigdy nie wychodzi poza komputer.
02Hook powiadomień z osascript
Hook działa w każdym terminalu, także w terminalach IDE. To przykład dla macOS z przewodnika po hookach od Anthropic. Dodaj go do ~/.claude/settings.json, zostawiając pozostałe klucze:
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
}
]
}
]
}
}
Wpisz /hooks w Claude Code, żeby sprawdzić, czy jest na liście pod Notification.
Uprawnienie dla Edytora skryptów
osascript wysyła powiadomienia jako Edytor skryptów. Jeśli Edytor skryptów nie ma uprawnień do powiadomień, polecenie po cichu się nie udaje, a macOS o nic nie pyta. Uruchom raz w Terminalu:
osascript -e 'display notification "test"'
Za pierwszym razem nic się nie pojawi. Otwórz Ustawienia systemowe > Powiadomienia, znajdź Edytor skryptów i włącz Zezwalaj na powiadomienia. Uruchom polecenie ponownie i powinno pojawić się testowe powiadomienie.
Kiedy się odpala
Pusty matcher łapie każdy typ powiadomienia. Najważniejsze są dwa: permission_prompt (Claude czeka około sześciu sekund na zgodę, a ty nic nie wpisałeś) i idle_prompt (Claude skończył około 60 sekund temu i od tamtej pory nic nie wpisałeś). Przewodnik po Notification hook opisuje wszystkie typy i ich czasy.
03Dowiedz się od razu, gdy Claude skończy
idle_prompt czeka minutę. Żeby dostać informację natychmiast, dodaj hook Stop, który uruchamia się, gdy Claude kończy swoją turę. Stop nie przyjmuje matchera:
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude has finished\" with title \"Claude Code\" sound name \"Glass\"'"
}
]
}
]
}
}
sound name przyjmuje dowolny dźwięk z /System/Library/Sounds, np. Glass, Ping czy Hero. Jeśli chcesz tylko dźwięk, jako polecenie wystarczy afplay /System/Library/Sounds/Glass.aiff. Więcej o tym zdarzeniu w przewodniku po Stop hook.
04Pokaż prawdziwą treść komunikatu
Hooki dostają JSON na standardowym wejściu. Wejście Notification ma pole message, np. "Claude needs your permission". Mały skrypt może wstawić ten tekst do powiadomienia. Zapisz to jako ~/.claude/hooks/notify-mac.sh:
#!/bin/bash
msg=$(jq -r '.message // "Claude Code needs your attention"')
osascript -e 'on run argv' \
-e 'display notification (item 1 of argv) with title "Claude Code"' \
-e 'end run' "$msg"
Przekazanie tekstu jako argumentu, a nie wewnątrz stringa AppleScript, sprawia, że cudzysłowy w komunikacie nie zepsują polecenia. Nadaj prawa wykonywania przez chmod +x ~/.claude/hooks/notify-mac.sh i ustaw polecenie hooka na ~/.claude/hooks/notify-mac.sh. Skrypt wymaga jq (brew install jq, jeśli jq --version zwraca błąd).
05terminal-notifier: kliknij, by wrócić do terminala
Kliknięcie powiadomienia z osascript otwiera Edytor skryptów, a to nie jest miejsce, do którego chcesz trafić. terminal-notifier pozwala wybrać aplikację, która wyskoczy na wierzch:
brew install terminal-notifier
terminal-notifier -title "Claude Code" -message "Claude has finished" -sound default -activate com.googlecode.iterm2
Użyj com.apple.Terminal dla Apple Terminal albo bundle ID swojego edytora. To samo polecenie wpisz w pole command hooka. Za pierwszym razem zezwól na powiadomienia dla terminal-notifier w Ustawieniach systemowych.
06Skupienie i Nie przeszkadzać
Wszystko to są zwykłe powiadomienia macOS, więc tryb Skupienia może je ukryć. Jeśli znikają w określonych porach, sprawdź Ustawienia systemowe > Skupienie i zezwól aplikacji, która je wysyła (Edytor skryptów, terminal-notifier lub twój terminal). Jeśli wolisz powiadomienia respektujące twoje własne godziny, zobacz godziny ciszy i Nie przeszkadzać.
07Gdzie pasuje Claude Code Notifier
Powyższe hooki dobrze się sprawdzają, jeśli siedzisz przy Macu i chcesz tylko szturchnięcia. Przestają wystarczać, gdy odejdziesz, bo powiadomienie na Macu nie dosięgnie cię w kuchni i nie pozwoli odpowiedzieć Claude.
Claude Code Notifier to niezależne narzędzie (od TouchTap, nie od Anthropic) oparte na tych samych hookach. Jego darmowe narzędzie CLI, ccn, działa na Macu, Windows i Linux. Zainstaluj je na Macu poleceniem:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
albo przez Homebrew: brew trust --formula touch-tap/tap/ccn && brew install touch-tap/tap/ccn. Dodaje swoje wpisy hooków do ~/.claude/settings.json, resztę pliku zostawia w spokoju i robi kopię zapasową. Od tej pory pokazuje powiadomienie macOS, gdy Claude skończy, potrzebuje zgody lub zadaje pytanie — bez sieci i bez telefonu.
Jeśli sparujesz telefon z iPhone lub Android, te same zdarzenia przychodzą jako powiadomienia push, a z telefonu możesz zezwolić lub odmówić, wybrać odpowiedź na pytanie Claude albo wysłać kolejne polecenie. Jeśli pisałeś coś w ciągu ostatnich 30 sekund, terminal pyta jak zwykle i nic nie czeka na telefonie. Zobacz parowanie telefonu i stronę ccn. Aplikacje mobilne wymagają subskrypcji lub zakupu dożywotniego; zobacz cennik.
Jeśli dodajesz ccn, usuń własne hooki z osascript, inaczej zobaczysz dwa powiadomienia na każde zdarzenie. Jest też starsza aplikacja w pasku menu Maca; nie uruchamiaj jej razem z ccn na tym samym Macu.
08FAQ
Dlaczego mój hook z osascript nic nie pokazuje?
Najczęściej Script Editor nie ma uprawnień do powiadomień, więc macOS po cichu odrzuca powiadomienie, bez żadnego błędu. Uruchom raz osascript -e 'display notification "test"', a potem zezwól na Script Editor w Ustawieniach systemowych > Powiadomienia. Jeśli dalej nie działa, sprawdź, czy nie jest włączony tryb skupienia i czy /hooks pokazuje twój hook.
Czy Claude Code wysyła powiadomienia w macOS bez żadnej konfiguracji?
Tak, w Ghostty i Kitty, a w iTerm2 po włączeniu alertów Centrum powiadomień. Apple Terminal i terminale w IDE domyślnie nie pokazują powiadomień na pulpicie, więc tam użyj hooka albo ccn.
Jak dostać powiadomienie od razu, gdy Claude skończy, a nie minutę później?
Użyj hooka Stop. Powiadomienie idle_prompt pojawia się dopiero ok. 60 sekund po tym, jak Claude skończy, i tylko wtedy, gdy nic nie wpisałeś, a Stop odpala się na końcu każdej tury.
Czy mogę usłyszeć dźwięk zamiast banera?
Tak. Ustaw afplay /System/Library/Sounds/Glass.aiff jako komendę hooka albo dodaj sound name "Glass" do komendy osascript, żeby mieć jedno i drugie.
Czy mogę zatwierdzić uprawnienie z powiadomienia w macOS?
Nie przez osascript ani terminal-notifier: one tylko wyświetlają tekst. Do odpowiadania na prośby o uprawnienia z hooka potrzebujesz zdarzenia PermissionRequest; zobacz odpowiadanie na prośby o uprawnienia z hooka albo zatwierdzaj z telefonu przez Claude Code Notifier.