Чтобы получать push-уведомления Claude Code через ntfy, установите приложение ntfy на телефон, подпишитесь на topic с трудноугадываемым именем и добавьте в Claude Code hook, который выполняет curl -d "message" https://ntfy.sh/your-topic. Hook Notification сообщит, когда Claude нужно разрешение или он ждёт Вас, а hook Stop — сразу по завершении хода. Это бесплатно, занимает около десяти минут и работает на Mac, Windows и Linux.
01Шаг 1: выберите topic и подпишитесь
В ntfy не нужна регистрация. Topic создаётся, когда кто-то впервые публикует в него или подписывается, и прочитать его может любой, кто знает имя. Документация ntfy прямо говорит, что topic по сути является паролем, поэтому сделайте его длинным и случайным, например claude-7f3k9q2xw4mz. В имени допустимы буквы, цифры, подчёркивания и дефисы, длиной до 64 символов.
Установите приложение ntfy (App Store, Google Play или F-Droid), нажмите + и подпишитесь на свой topic на ntfy.sh.
Проверьте работу из терминала:
curl -H "Title: Test" -d "Hello from my computer" https://ntfy.sh/claude-7f3k9q2xw4mz
Телефон должен завибрировать через секунду-другую. В Windows 10 и 11 уже есть curl.exe, и он принимает ту же команду.
02Шаг 2: скрипт hook (Mac и Linux)
Claude Code передаёт каждому hook JSON-объект через стандартный ввод. У обоих событий есть общие поля, например cwd и hook_event_name. Notification добавляет message и notification_type, а Stop — last_assistant_message, текст последнего ответа Claude. Этот скрипт превращает любое из них в понятный push. Ему нужен jq (brew install jq или apt install jq в Debian и Ubuntu).
Сохраните его как ~/.claude/ntfy-notify.sh и выполните 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
Приоритет — от 1 (минимальный) до 5 (срочный). Tags добавляет к уведомлению эмодзи; robot показывает робота.
03Шаг 3: подключите его в settings.json
Добавьте hooks в ~/.claude/settings.json. Если в файле уже есть объект hooks, добавьте эти события внутрь него, а не заменяйте его.
{
"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 позволяет hook Stop отправлять уведомление в фоне, так что медленная сеть никогда не задержит Claude. Запустите новую сессию Claude Code: hooks загружаются при её старте.
Stop или idle_prompt?
Stop срабатывает сразу, как только Claude заканчивает, даже если Вы сидите за клавиатурой. Если это слишком часто, уберите блок Stop и используйте matcher permission_prompt|idle_prompt. Согласно документации Anthropic, idle_prompt срабатывает примерно через 60 секунд после завершения работы Claude, только если Вы с тех пор ничего не вводили, а permission_prompt — когда запрос разрешения ждёт около шести секунд без нажатий клавиш. Так Вы бесплатно получаете примерный фильтр «только когда меня нет». Все поля и тайминги описаны в руководстве по Notification hook и руководстве по Stop hook.
04Windows (PowerShell)
В Windows сохраните это как %USERPROFILE%\.claude\ntfy-notify.ps1. Ничего дополнительно устанавливать не нужно:
$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
Затем используйте эту запись hook вместо строк command выше:
{
"type": "command",
"shell": "powershell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File \"$HOME\\.claude\\ntfy-notify.ps1\""
}
Если Вы запускаете Claude Code в WSL, используйте скрипт для Mac и Linux: для hook WSL — это Linux.
05Конфиденциальность
Всё содержимое push проходит через сервер ntfy, а на ntfy.sh его может прочитать любой, кто знает имя topic. Сообщение Stop выше включает начало ответа Claude, где могут быть код или имена файлов. Три способа усилить защиту:
- Отправляйте меньше. Замените тело
Stopфиксированной строкой, например"Done", и оставьте в заголовке только имя проекта. - Используйте access token. ntfy принимает
-H "Authorization: Bearer tk_..."при любой публикации. На своём сервере задайтеauth-default-access: "deny-all", создайте пользователя черезntfy user addи токен черезntfy token add. - Разверните свой сервер. ntfy можно хостить самостоятельно. Для мгновенной доставки в приложение на iPhone документация ntfy советует задать
upstream-base-url: "https://ntfy.sh": на ntfy.sh пересылаются только ID сообщения и хеш topic, чтобы разбудить телефон, а затем приложение забирает сообщение с Вашего сервера.
Если Claude Code работает на удалённом сервере, тот же hook работает там без изменений, поэтому ntfy хорошо подходит для уведомлений через SSH.
06Место Claude Code Notifier
Для односторонних оповещений описанная настройка — полноценное решение, и мы не станем Вас от него отговаривать. Но она лишь сообщает. Когда push говорит, что Claude нужно разрешение, сессия всё равно ждёт, пока Вы не вернётесь к клавиатуре.
ntfy поддерживает кнопки действий, отправляющие HTTP-запрос, так что обратный канал можно собрать самому: hook PermissionRequest, который публикует запрос, ждёт ответа во втором topic и возвращает решение. Некоторые open source проекты делают именно это (см. сравнение).
Claude Code Notifier предлагает это в готовом виде. С подключённым телефоном Вы можете разрешить один раз, разрешить на всю сессию или отклонить запрос, выбрать ответ, когда Claude задаёт вопрос, и отправить следующую инструкцию после завершения работы Claude — всё с телефона. Он также проверяет присутствие: если Вы печатали в последние 30 секунд, терминал спрашивает как обычно, и на телефоне ничего не ждёт. Если Вас нет, терминал ждёт ответа до заданного Вами предела и перестаёт ждать, как только Вы касаетесь клавиатуры. ccn работает на Mac, Windows и Linux; подробнее на странице ccn и в разделе цены на мобильные приложения.
07FAQ
Бесплатен ли ntfy для уведомлений Claude Code?
Для публикации и подписки на ntfy.sh аккаунт не нужен, сервер открыт для всех. Также у ntfy есть платный тариф и возможность self-hosting. Актуальные лимиты смотрите на сайте ntfy.
Почему мой hook ntfy не срабатывает?
После изменения settings.json запустите новую сессию Claude Code, так как hooks загружаются при старте. Затем выполните тестовую команду curl вручную и передайте в скрипт пример JSON, например echo '{"hook_event_name":"Stop","cwd":"/tmp/x"}' | ~/.claude/ntfy-notify.sh. Остальное описано в чек-листе по устранению неполадок.
Можно ли ответить Claude Code из уведомления ntfy?
Простой публикацией — нет. HTTP-кнопки ntfy могут отправить запрос, но нужен hook, который дождётся ответа и превратит его в решение, понятное Claude Code.
Приходит ли push для каждого типа уведомлений?
Только для указанных matcher. Уберите matcher из записи Notification, чтобы получать все типы, включая диалоги аутентификации и MCP.