لتلقّي إشعارات push من Claude Code عبر ntfy، ثبّت تطبيق ntfy على هاتفك، واشترك في topic باسم يصعب تخمينه، ثم أضف hook إلى Claude Code ينفّذ 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. يمكن أن تحتوي أسماء الـ topics على أحرف وأرقام وشرطات سفلية وشرطات، بحد أقصى 64 حرفًا.
ثبّت تطبيق ntfy (من App Store أو Google Play أو F-Droid)، واضغط +، ثم اشترك في الـ topic الخاص بك على ntfy.sh.
تحقّق من عمله من الـ terminal:
curl -H "Title: Test" -d "Hello from my computer" https://ntfy.sh/claude-7f3k9q2xw4mz
يُفترض أن يهتز الهاتف خلال ثانية أو ثانيتين. على Windows، يأتي curl.exe مضمّنًا في Windows 10 و11 ويقبل السطر نفسه.
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 بدلًا من ذلك؛ فـ WSL يُعدّ Linux من منظور الـ hook.
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، وأنشئ token بـntfy token add. - استضف خادمك الخاص. يمكن استضافة ntfy ذاتيًا. ولضمان التسليم الفوري إلى تطبيق iPhone، توصي وثائق ntfy بضبط
upstream-base-url: "https://ntfy.sh"، الذي لا يمرّر إلى ntfy.sh سوى معرّف الرسالة وhash للـ topic كي يوقظ الهاتف؛ ثم يجلب التطبيق الرسالة من خادمك.
إذا كان Claude Code يعمل على خادم بعيد، فإن الـ hook نفسه يعمل هناك دون تعديل، ما يجعل ntfy خيارًا مناسبًا لـ الإشعارات عبر SSH.
06أين يأتي دور Claude Code Notifier
للتنبيهات أحادية الاتجاه، يُعدّ الإعداد أعلاه حلًا متكاملًا ولن نحاول إقناعك بالعدول عنه. لكنه يقتصر على إعلامك. فعندما يخبرك الإشعار بأن Claude يحتاج إلى إذن، تظل الجلسة منتظرة حتى تعود إلى لوحة المفاتيح.
يدعم ntfy أزرار إجراءات ترسل طلب HTTP، لذا يمكنك بناء مسار للرد بنفسك: hook من نوع PermissionRequest ينشر الطلب، وينتظر الرد على topic ثانٍ، ثم يعيد قرارًا. وبعض المشاريع مفتوحة المصدر تفعل ذلك تمامًا (راجع المقارنة).
يقدّم Claude Code Notifier هذا المسار جاهزًا. بعد إقران هاتفك، يمكنك السماح لمرة واحدة، أو السماح طوال الجلسة، أو رفض الإذن، واختيار إجابة عندما يطرح Claude سؤالًا، وإرسال التعليمة التالية بعد انتهاء Claude، وكل ذلك من الهاتف. كما يتحقق من وجودك: إذا كتبت شيئًا خلال آخر 30 ثانية، يسألك الـ terminal كالمعتاد ولا ينتظر شيء على الهاتف. وإذا كنت بعيدًا، ينتظر الـ terminal إجابتك حتى حدّ أقصى تحدده، ويتوقف عن الانتظار لحظة لمسك لوحة المفاتيح. يعمل ccn على Mac وWindows وLinux؛ راجع صفحة ccn والأسعار لتطبيقات الهاتف.
07الأسئلة الشائعة
هل ntfy مجاني لإشعارات Claude Code؟
لا يحتاج النشر والاشتراك على ntfy.sh إلى حساب، والخادم متاح للجميع. كما يوفّر ntfy فئة مدفوعة ويمكن استضافته ذاتيًا. راجع موقع ntfy نفسه لمعرفة الحدود الحالية.
لماذا لا يُطلَق hook ntfy لديّ؟
ابدأ جلسة Claude Code جديدة بعد تعديل settings.json، لأن الـ hooks تُحمَّل عند بدء التشغيل. ثم نفّذ سطر اختبار curl يدويًا، ومرّر JSON تجريبيًا إلى السكربت، مثل echo '{"hook_event_name":"Stop","cwd":"/tmp/x"}' | ~/.claude/ntfy-notify.sh. وتغطي قائمة استكشاف الأخطاء بقية الحالات.
هل يمكنني الرد على Claude Code من إشعار ntfy؟
ليس بمجرد النشر العادي. يمكن لأزرار إجراءات HTTP في ntfy إرسال طلب، لكنك تحتاج إلى hook ينتظر الإجابة ويحوّلها إلى قرار يفهمه Claude Code.
هل أتلقى إشعار push لكل أنواع الإشعارات؟
فقط للـ matchers التي تحددها. احذف matcher من مُدخل Notification لتلقّي جميع الأنواع، بما فيها مربعات حوار المصادقة وMCP.