Notifikasi Claude Code di Ponsel Anda Lewat Hooks

Dapatkan alert di ponsel saat Claude Code butuh izin atau selesai mengerjakan tugas. Konfigurasi hook siap salin dengan hook Notification, Stop, dan webhook.

Diperbarui

Daftar Isi

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 hookMatcher / filter
Claude menunggu keputusan izinNotificationpermission_prompt
Claude sedang diam dan menunggu input AndaNotificationidle_prompt
Claude selesai meresponsStoptidak 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)
  • curl dan jq di 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("/") | last mengubah /home/me/code/api menjadi api, 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 10 memberi curl batas 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 Stop ke kanal yang berdering. Selesai bukan hal mendesak; biarkan di Normal.
  • Gunakan idle_prompt sebagai ganti Stop kalau 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.

Artikel terkait