Daftar Isi
- Hook mana untuk situasi mana
- Yang Anda butuhkan
- Langkah 1 — Buat dua kanal
- Langkah 2 — Tambahkan hooks
- Langkah 3 — Uji tanpa menunggu permintaan sungguhan
- Langkah 4 — Buat kanal blocked berdering
- Menghindari banjir notifikasi
- Menjalankan Claude Code secara remote atau di CI
- Pemecahan masalah
- Pertanyaan yang sering diajukan
- Bagaimana mendapat notifikasi saat Claude Code butuh izin?
- Bagaimana tahu Claude Code sudah selesai mengerjakan tugas?
- Bisakah notifikasinya menembus Jangan Ganggu?
- Apakah ini berfungsi di Claude Code versi web atau sesi remote?
- Amankah menaruh URL webhook di settings.json?
- Penutup
- Artikel terkait
Claude Code berhenti dalam dua situasi yang penting: ia tertahan menunggu Anda (permintaan izin, pertanyaan), atau ia sudah selesai. Kalau Anda tidak sedang menatap terminal, keduanya terlihat sama — tidak terjadi apa-apa, dan sesi diam menganggur sampai Anda kembali. Solusinya adalah sebuah hook: beberapa baris di settings.json yang mengirim webhook ke ponsel Anda begitu salah satunya terjadi.
Panduan ini memberi Anda konfigurasi untuk disalin, menjelaskan event hook mana yang dipakai untuk situasi mana, dan membahas detail yang membuatnya andal: membaca input hook, quoting di shell, dan menghindari banjir notifikasi.
Hook mana untuk situasi mana
Claude Code menjalankan hook pada event siklus hidupnya. Dua di antaranya menjawab masalah ini (referensi hooks):
| Anda ingin tahu saat… | Event hook | Matcher / filter |
|---|---|---|
| Claude menunggu keputusan izin | Notification | permission_prompt |
| Claude sedang diam dan menunggu input Anda | Notification | idle_prompt |
| Claude selesai merespons | Stop | tidak perlu |
matcher pada hook Notification menyaring berdasarkan tipe notifikasi, sehingga Anda bisa memilih persis notifikasi mana yang sampai ke ponsel. Inputnya datang sebagai JSON lewat stdin dan memuat notification_type, message, cwd, dan session_id. Hook Notification tidak bisa memblokir atau mengubah apa pun — ia hanya pengamat, dan itulah yang Anda butuhkan di sini.
Input Stop memuat last_assistant_message, teks terakhir yang dihasilkan Claude. Itu baris ringkasan gratis untuk notifikasi.
Yang Anda butuhkan
- Echobell di ponsel Anda (App Store / Google Play)
curldanjqdi mesin yang menjalankan Claude Code- Dua menit
Langkah 1 — Buat dua kanal
Jangan kirim semuanya ke satu kanal. Di Echobell, buat:
- Claude Blocked, tipe Sensitif Waktu (Time Sensitive) atau Panggilan — untuk permintaan izin, saat agen terhenti dan setiap menit terbuang percuma, baik untuk komputasi maupun waktu Anda
- Claude Done, tipe Normal — push biasa, dibaca kapan sempat
Salin URL webhook masing-masing kanal. Bentuknya seperti https://hook.echobell.one/t/<channel-token>. Perlakukan seperti kata sandi: siapa pun yang memilikinya bisa membuat ponsel Anda berdering.
Simpan keduanya sebagai variabel lingkungan agar tidak pernah masuk ke file konfigurasi yang di-commit:
export ECHOBELL_CLAUDE_BLOCKED_URL="https://hook.echobell.one/t/<blocked-token>"
export ECHOBELL_CLAUDE_DONE_URL="https://hook.echobell.one/t/<done-token>"
Taruh keduanya di profil shell Anda agar diwarisi Claude Code.
Langkah 2 — Tambahkan hooks
Tambahkan ini ke ~/.claude/settings.json agar berlaku di semua proyek, atau ke .claude/settings.local.json untuk satu repositori:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{
"type": "command",
"command": "jq -c '{title: \"Claude butuh izin\", body: .message, project: (.cwd | split(\"/\") | last)}' | curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- \"$ECHOBELL_CLAUDE_BLOCKED_URL\""
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "jq -c '{title: \"Claude selesai\", body: (.last_assistant_message // \"Selesai\" | .[0:200]), project: (.cwd | split(\"/\") | last)}' | curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- \"$ECHOBELL_CLAUDE_DONE_URL\""
}
]
}
]
}
}
Fungsi tiap bagian:
jq -c '{...}'membaca JSON hook dari stdin dan menyusun payload kecil, sehingga Echobell menerima persis field yang Anda inginkan, bukan seluruh dokumen hook..cwd | split("/") | lastmengubah/home/me/code/apimenjadiapi, sehingga notifikasi menyebutkan proyek mana yang meminta..[0:200]memotong pesan akhir. Isi notifikasi dibatasi 1500 byte oleh worker Echobell, dan layar kunci menampilkan jauh lebih sedikit lagi.-m 10membericurlbatas waktu 10 detik agar masalah jaringan tidak membuat Claude Code menunggu hook Anda.
Echobell merender kunci yang Anda kirim melalui template kanal, dan kanal baru tidak punya template yang membacanya — atur di pengaturan kanal: template judul {{title}}, template isi {{body}}. Tambahkan {{project}} ke salah satunya jika ingin nama proyek ikut tampil, misalnya {{title}} ({{project}}).
Langkah 3 — Uji tanpa menunggu permintaan sungguhan
Jalankan pipeline yang sama secara manual dengan payload hook palsu:
echo '{"message":"Claude needs your permission to use Bash","cwd":"/home/me/code/api","notification_type":"permission_prompt"}' \
| jq -c '{title: "Claude butuh izin", body: .message, project: (.cwd | split("/") | last)}' \
| curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- "$ECHOBELL_CLAUDE_BLOCKED_URL"
Kalau ponsel Anda menyala, sisi Echobell sudah beres dan masalah yang tersisa ada pada cara Claude Code membaca konfigurasi. Di Claude Code, jalankan /hooks untuk memastikan hook termuat; perubahan pengaturan saat sesi berjalan mungkin perlu menu hooks atau restart agar berlaku.
Langkah 4 — Buat kanal blocked berdering
Push notification kalah melawan Jangan Ganggu. Kanal Panggilan berperilaku seperti telepon masuk dan menembus Mode Fokus iOS, yang paling berguna saat Anda memulai tugas panjang lalu pergi malam itu. Kalau Anda hanya ingin diganggu untuk sebagian permintaan, saring dengan kondisi kanal Echobell pada variabel yang Anda kirim, misalnya project == "api", daripada mengubah hook. Daftar variabel lengkap ada di referensi kondisi.
Menghindari banjir notifikasi
Sesi yang sibuk bisa memicu banyak event Stop — setiap respons diakhiri dengan satu. Tiga cara menjaga sinyalnya:
- Jangan kirim
Stopke kanal yang berdering. Selesai bukan hal mendesak; biarkan di Normal. - Gunakan
idle_promptsebagai gantiStopkalau Anda hanya ingin tahu saat Claude berhenti dan menunggu Anda, bukan setelah setiap respons. - Persempit per proyek dengan kondisi, sehingga repositori coba-coba tidak memberi notifikasi sama sekali.
Menjalankan Claude Code secara remote atau di CI
Pendekatan yang sama berfungsi di lingkungan cloud atau remote, karena hook hanyalah permintaan HTTPS keluar. Tidak ada yang perlu bisa dijangkau dari internet. Setel kedua variabel lingkungan di secrets lingkungan tersebut, bukan di profil shell, dan notifikasi akan sampai ke ponsel Anda di mana pun sesinya berjalan.
Pemecahan masalah
Tidak ada yang datang, dan tes manual juga gagal. Periksa apakah variabel URL sudah disetel di shell yang meluncurkan Claude Code: echo "$ECHOBELL_CLAUDE_BLOCKED_URL". Variabel kosong membuat curl gagal tanpa suara.
Tes manual berhasil tetapi hook tidak terpicu. Pastikan matcher-nya: permission_prompt dan idle_prompt berbeda, dan matcher yang tidak cocok tidak akan pernah berjalan. Jalankan /hooks dan periksa JSON-nya valid — koma di akhir menonaktifkan semua hook di file pengaturan tersebut.
Isi notifikasi kosong. Filter jq merujuk field yang tidak ada untuk event itu. message ada pada input Notification; last_assistant_message ada pada input Stop. Gunakan // untuk memberi nilai bawaan, seperti pada konfigurasi di atas.
Terlalu sering terpicu. Lihat bagian di atas — pindah dari Stop ke idle_prompt, atau tambahkan kondisi.
Pertanyaan yang sering diajukan
Bagaimana mendapat notifikasi saat Claude Code butuh izin?
Tambahkan hook Notification dengan matcher permission_prompt yang mengirim webhook ke sebuah kanal. Echobell mengubah permintaan itu menjadi push atau alert bergaya panggilan di ponsel Anda.
Bagaimana tahu Claude Code sudah selesai mengerjakan tugas?
Tambahkan hook Stop. Hook ini berjalan saat Claude selesai merespons, dan inputnya memuat last_assistant_message yang bisa dipakai sebagai isi notifikasi.
Bisakah notifikasinya menembus Jangan Ganggu?
Bisa, kalau kanal penerimanya bertipe Panggilan. Ia berperilaku seperti telepon masuk, yang diloloskan Mode Fokus iOS. Push biasa dari aplikasi mana pun tidak.
Apakah ini berfungsi di Claude Code versi web atau sesi remote?
Ya. Hook hanya membuat permintaan HTTPS keluar, jadi berfungsi di mana pun sesi bisa menjangkau internet. Sediakan URL kanal lewat secrets lingkungan.
Amankah menaruh URL webhook di settings.json?
Lebih baik pakai variabel lingkungan seperti di atas agar token tidak ikut ter-commit ke repositori. Kalau bocor, buat kanal baru dan hapus yang lama.
Penutup
Dua kanal, dua hook, dan satu pipeline jq | curl: kanal Panggilan atau Sensitif Waktu untuk permission_prompt, kanal Normal untuk Stop. Setelah itu Anda bisa memulai tugas agen yang panjang, meninggalkan ruangan, dan baru ditarik kembali saat agen benar-benar membutuhkan Anda.
Unduh Echobell untuk iPhone atau dapatkan di Google Play, lalu jalankan tes manual di atas sebelum mempercayakan tugas panjang padanya.