---
title: "Notifikasi Claude Code di Ponsel Anda Lewat Hooks"
description: "Dapatkan alert di ponsel saat Claude Code butuh izin atau selesai mengerjakan tugas. Konfigurasi hook siap salin dengan hook Notification, Stop, dan webhook."
date: 2026-10-02
author: Nooc
authorAvatarLink: /images/avatars/nooc.webp
authorLink: https://nooc.me
tags:
  - Claude Code
  - agen coding AI
  - hooks
  - notifikasi telepon
  - webhook
  - produktivitas developer
---

# Notifikasi Claude Code di ponsel: tahu kapan ia butuh Anda atau sudah selesai

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](https://code.claude.com/docs/en/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](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-claude-code-phone-notifications-id&mt=8) / [Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid))
- `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:

```bash
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:

```json
{
  "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:

```bash
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](/id/docs/conditions).

## 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](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-claude-code-phone-notifications-id&mt=8) atau [dapatkan di Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid), lalu jalankan tes manual di atas sebelum mempercayakan tugas panjang padanya.

## Artikel terkait

- [Mengubah gerbang persetujuan agen menjadi panggilan telepon](/id/blog/ai-agent-human-in-the-loop-alerts)
- [Dapatkan notifikasi saat perintah terminal yang lama selesai](/id/blog/notify-when-terminal-command-finishes)
- [Panduan integrasi webhook](/id/docs/webhook)
- [Referensi kondisi kanal](/id/docs/conditions)
- [Menembus Mode Fokus iOS untuk alert kritis](/id/blog/how-to-bypass-ios-focus-mode-for-critical-alerts)
