Để nhận thông báo khi Claude Code chạy xong, hãy thêm một hook Stop vào ~/.claude/settings.json để chạy lệnh thông báo của hệ thống. Stop được kích hoạt ngay khi Claude trả lời xong. Với trường hợp "Claude cần bạn nhập", hãy thêm cả hook Notification: nó chạy khi một permission prompt đã chờ khoảng sáu giây, hoặc khi Claude rảnh khoảng một phút. Cả hai đều hoạt động trên Mac, Windows và Linux, và một công cụ như Claude Code Notifier có thể gửi các cảnh báo tương tự đến điện thoại của bạn.
01Claude Code tự làm được gì
Claude Code vốn đã cố gắng báo cho bạn khi có vẻ bạn không ở terminal. Mặc định, nó gửi thông báo desktop trong iTerm2, Ghostty và Kitty, có thể gửi ký tự bell trong Apple Terminal, còn ở các terminal khác thì không làm gì. iTerm2 cũng cần bật cài đặt cảnh báo thì mới hiện được.
Vì vậy, nếu bạn dùng terminal của VS Code, Warp, Windows Terminal hay phần lớn terminal trên Linux, thường bạn sẽ không nhận được gì. Bạn có thể bắt buộc dùng terminal bell bằng cài đặt preferredNotifChannel, xem trong hướng dẫn về terminal bell. Muốn có thông báo desktop thực sự ở mọi terminal, bạn cần dùng hook.
02Hai hook bạn cần
Hook là các lệnh mà Claude Code chạy tại những thời điểm cố định trong một phiên. Ở đây có hai hook quan trọng:
StopKhi Claude trả lời xong (không tính khi bạn ngắt giữa chừng)"Claude đã xong"Notification với matcher permission_promptMột permission prompt đã chờ khoảng sáu giây mà bạn chưa gõ gì"Claude cần duyệt"Notification với matcher idle_promptKhoảng 60 giây sau khi Claude xong, nếu từ đó bạn chưa gõ gìNhắc rằng đến lượt bạnStop là hook nhanh nhất. Nó chạy ngay lập tức vào cuối mỗi lượt. Các loại Notification thì chỉ chạy khi bạn không để ý: mỗi lần gõ phím sẽ hoãn chúng lại, nên bạn không bị làm phiền khi đang theo dõi. Nếu muốn có tín hiệu ngay khi Claude xin quyền, hãy dùng hook PermissionRequest, được mô tả trong hướng dẫn PermissionRequest.
Để hiểu hook hoạt động chung như thế nào (event, matcher, file settings, exit code), xem Giải thích về hook trong Claude Code.
03Cấu hình chạy được trên macOS
Mở ~/.claude/settings.json (tạo mới nếu chưa có) và thêm đoạn này. Nếu file đã có object hooks, hãy thêm Stop và Notification làm key bên trong nó thay vì ghi đè.
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude has finished\" with title \"Claude Code\"'"
}
]
}
],
"Notification": [
{
"matcher": "permission_prompt|idle_prompt",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
}
]
}
]
}
}
Stop không có matcher nên chạy ở mọi lượt. Matcher của Notification giới hạn nó ở hai loại mang nghĩa "quay lại đi".
Nếu không thấy gì hiện lên, có thể macOS đang chặn Script Editor, thứ mà osascript dùng để hiển thị thông báo. Chạy osascript -e 'display notification "test"' một lần trong Terminal, rồi mở System Settings > Notifications, tìm Script Editor và bật Allow Notifications.
04Cách thiết lập tương tự trên Linux và Windows
Giữ nguyên cấu trúc JSON ở trên và chỉ thay chuỗi command.
Linux (cần có daemon thông báo desktop, nên không dùng được trên server headless):
"command": "notify-send 'Claude Code' 'Claude has finished'"
Nếu thiếu notify-send, hãy cài libnotify-bin trên Debian và Ubuntu, hoặc gói tương đương trên bản phân phối của bạn. Với SSH và server, xem thông báo qua SSH.
Windows (PowerShell). Ví dụ của chính Anthropic mở một hộp thoại thay vì toast ở góc màn hình:
"command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude has finished', 'Claude Code')\""
Hộp thoại có thể hiện phía sau cửa sổ terminal, nên hãy thử lệnh trong PowerShell trước. Trong WSL, powershell.exe phải gọi được qua interop của Windows. Hướng dẫn cho Windows có thêm các lựa chọn khác.
05Kiểm tra xem đã chạy chưa
- Gõ
/hookstrong Claude Code. Các hook của bạn sẽ hiện dướiStopvàNotification. - Hỏi Claude một câu ngắn. Khi nó trả lời xong, thông báo
Stopsẽ hiện ra. - Yêu cầu một việc cần cấp quyền, chuyển sang cửa sổ khác và chờ. Thông báo
permission_promptsẽ đến sau khoảng sáu giây.
Thay đổi trong settings.json thường được áp dụng ngay. Nếu hook không hiện trong /hooks, hãy kiểm tra file có phải JSON hợp lệ không (không có dấu phẩy thừa ở cuối, không có comment). Chạy Claude Code bằng claude --debug để xem từng hook đã làm gì. Xem thêm cách khắc phục trong checklist xử lý sự cố.
06Nhận thông báo trên điện thoại
Thông báo desktop chỉ có ích khi bạn ngồi ở bàn. Khi đã rời đi, bạn cần nhận thông báo ở chỗ khác. Có ba cách phổ biến:
- Một dịch vụ push tự vận hành, như ntfy, gọi bằng
curltừ chính các hook đó. Rẻ và linh hoạt. Xem hướng dẫn ntfy. - Webhook chat cho Telegram, Slack hoặc Discord. Phù hợp nếu bạn vốn dùng chat suốt ngày. Xem hướng dẫn webhook chat.
- Claude Code Notifier, công cụ tự thiết lập hook cho bạn và cho phép bạn trả lời ngay từ điện thoại.
Các cách tự làm là đủ nếu bạn chỉ cần một tín hiệu báo. Hạn chế của chúng là chỉ một chiều: bạn biết Claude đang chờ, nhưng vẫn phải quay lại bàn phím để phê duyệt.
Claude Code Notifier là công cụ độc lập (không do Anthropic phát triển) gồm hai phần: ccn, công cụ dòng lệnh miễn phí cho Mac, Windows và Linux, cùng ứng dụng cho iPhone và Android. Cài đặt chỉ với một dòng lệnh:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
Trên Windows, chạy irm https://claudecodenotifier.com/install.ps1 | iex trong PowerShell (hỗ trợ Windows đang ở bản beta). Các lựa chọn khác, gồm Homebrew, npx @touchtap/ccn và plugin Claude Code, có trên trang ccn.
Khi cài, công cụ thêm bảy hook, mỗi hook chạy ccn hook, giữ nguyên phần còn lại của settings.json và lưu một bản sao lưu một lần ngay cạnh file. Kể cả không có điện thoại, ccn vẫn hiện thông báo desktop trên máy khi Claude xong việc, cần cấp quyền hoặc đặt câu hỏi. Phần này miễn phí và chạy không cần mạng.
Ghép nối điện thoại bằng ccn pair và bạn có thêm:
- push "Claude đã xong" ngay khi một lượt kết thúc;
- yêu cầu cấp quyền mà bạn có thể cho phép một lần, cho phép trong cả phiên, hoặc từ chối;
- trả lời câu hỏi trắc nghiệm của Claude ngay từ điện thoại;
- ô nhập tiếp theo để gửi chỉ dẫn mới cho Claude ngay sau khi nó xong.
Nếu bạn vừa gõ phím trong 30 giây gần nhất, sẽ không có gì chờ điện thoại và terminal hỏi như bình thường. Ứng dụng cần gói đăng ký hoặc mua trọn đời; xem bảng giá. Ghép nối điện thoại hướng dẫn chi tiết cách thiết lập.
07Câu hỏi thường gặp
Vì sao Notification hook của tôi chạy chậm vậy?
Loại permission_prompt chờ đến khi prompt hiện trên màn hình khoảng sáu giây mà bạn không gõ gì, còn idle_prompt chờ khoảng 60 giây sau khi Claude xong. Độ trễ này là có chủ ý, để bạn không bị làm phiền khi đang theo dõi. Dùng hook Stop để nhận ngay thông báo "đã xong", và hook PermissionRequest để nhận ngay thông báo "cần phê duyệt".
Stop hook có chạy khi tôi nhấn Esc để ngắt Claude không?
Không. Stop không chạy khi lượt kết thúc do bạn ngắt. Nó cũng không chạy khi lượt kết thúc vì lỗi API, chẳng hạn bị rate limit. Khi đó Claude Code phát một sự kiện riêng là StopFailure, bạn có thể gắn hook theo cách tương tự.
Stop hook chạy sau mỗi tin nhắn hay chỉ khi cả task hoàn tất?
Sau mỗi lượt. Claude Code không biết khi nào task tổng thể của bạn xong, chỉ biết khi nào nó ngừng trả lời. Nếu bạn trao đổi qua lại nhiều, mỗi câu trả lời sẽ có một thông báo. Nếu thấy quá nhiều, hãy dùng thông báo idle_prompt, chỉ chạy khi bạn đã rời đi khoảng một phút.
Cách này có chạy trong terminal của VS Code hoặc JetBrains không?
Có. Hook được chạy bởi chính Claude Code, không phải bởi terminal, nên chạy được trong mọi terminal, kể cả terminal của IDE. Chỉ có thông báo tích hợp sẵn là phụ thuộc vào terminal. Xem hướng dẫn cho terminal IDE.
Tôi có thể nhận thông báo trên điện thoại mà không cần cài gì lên đó không?
Được một phần. Hook gửi đến ntfy hoặc webhook chat có thể đến ứng dụng bạn đã có sẵn. Nhưng nó chỉ báo cho bạn biết có chuyện xảy ra. Để phê duyệt hay trả lời từ điện thoại, bạn cần thứ gì đó gửi phản hồi ngược về hook, và đó chính là việc ứng dụng của Claude Code Notifier làm.