How to Get Claude Code Notifications on Your Phone

Claude Code has no built-in notification system. Here's how to get alerted when your session needs attention — from DIY webhooks to real-time approval gates on your phone.

Claude Code has no built-in push notification system. Output lives in the terminal and nowhere else — which means the moment you step away from your desk, you have no visibility into whether your session is running, waiting, or already done. Three approaches exist today for getting notified on your phone.

TL;DR

  • Claude Code has no native notification system — output stays in the terminal
  • Webhook scripts (ntfy.sh, Pushover, Telegram) can alert you on completion but can't surface individual approval gates
  • Grass streams live Claude Code output to your phone and surfaces each agent approval gate as a native modal the moment it arrives
  • Setup: npm install -g @grass-ai/ide, grass start, scan QR code
  • Grass is free for local use; no account required

Why Claude Code doesn't send notifications

Claude Code is a terminal process. It writes output to stdout and waits for stdin responses at approval gates. There's no daemon, no event bus, and no notification layer. The Claude Code architecture treats the terminal as the entire interface — which works fine when you're sitting in front of it.

The problem is that AI coding agent sessions are long. According to Anthropic's own research, the 99.9th percentile turn duration in Claude Code exceeded 45 minutes as of early 2026 — up from under 25 minutes in late 2025. Nobody sits and watches a terminal for 45 minutes. They walk away, and then they have no idea what happened.

Option 1: Terminal watching (not a real solution)

The naive approach is to leave a terminal open and watch the output. This breaks the moment you step away from your machine. If your laptop sleeps, the terminal session might time out depending on your SSH config. If you're on a remote server and your SSH connection drops, you've lost the view entirely.

Terminal watching works for short tasks where you'll stay nearby. For anything over 10 minutes, it's not a real solution.

Option 2: Webhook and script-based notifications

You can pipe Claude Code output to a custom script that sends push notifications via services like ntfy.sh (free, self-hostable), Pushover, or a Telegram bot. A basic implementation looks like this:

claude 2>&1 | tee >(grep -q "Task complete" && curl -d "Claude finished" ntfy.sh/your-topic)

This approach has real limits:

  • It only detects patterns you explicitly grep for — you have to know what to watch for
  • It notifies on completion or specific output matches, not on individual tool approval requests
  • If Claude Code hits a permission gate mid-session and waits, the script won't fire until it sees its trigger string
  • Approval gates stall silently — you get notified that Claude finished, not that it's been waiting on your input for the past 40 minutes

For lightweight completion alerts on simple tasks, this works. For sessions with multiple approval gates and mid-session redirects, it misses too much.

Option 3: Grass — real-time output streaming with mobile approval gates

Grass is a native iOS app (Android PWA) built specifically for this workflow. It connects to a running Claude Code session and streams live output to your phone via SSE. When Claude Code hits a permission request — before running a bash command, writing a file, or fetching a URL — a native modal appears on your phone immediately, regardless of which screen you're on.

This is not a notification that the session finished. It's a live view of the session with interactive approval gates.

How to set up Grass for Claude Code notifications

Step 1: Install the Grass CLI

npm install -g @grass-ai/ide

Requires Node.js 18+.

Step 2: Start the Grass server alongside Claude Code

In the same project directory where you're running Claude Code:

grass start

This starts a local HTTP server on a port in the 32100–32199 range and displays a QR code.

Step 3: Scan the QR code from the Grass app

Download Grass from the iOS App Store (or use the Android PWA at codeongrass.com). Open the app, tap the scan button, scan the QR code. The server is saved as a connection.

Step 4: Start your Claude Code session

In a terminal (or a second tmux window), run claude in the project directory. From this point, agent output streams live to the Grass app on your phone.

What you see in the Grass app

  • Live agent output as it's generated, with markdown rendering and syntax highlighting
  • A native permission modal the moment Claude Code hits an approval gate
  • One tap to approve or deny — the session continues immediately
  • File browser for the project directory
  • Diff viewer showing git diff HEAD output
  • Prompt input to send new instructions mid-session

The global permission manager in Grass aggregates approval gates across all connected servers. If you're running multiple agents in parallel, all their gates surface in sequence. You don't need to switch between sessions — the next gate appears automatically after you handle the current one.

How to keep Grass connected after you leave your desk

By default, Grass connects over local WiFi. If you're leaving the building and want to stay connected, you have two options:

Tailscale (recommended): Install Tailscale on both your machine and your phone. Then start Grass with:

grass start --network tailscale

Grass reads the machine's Tailscale IP automatically and encodes it in the QR code. Your phone connects over the private Tailscale network — no public ports exposed.

Remote IP: grass start --network remote-ip exposes the Grass port on the machine's public IP. Only use this on a trusted network or behind a firewall rule.

For remote coding sessions running on a VPS or Daytona workspace, use --network tailscale or --network remote-ip on the server, then scan the QR code once to save the connection.

Frequently asked questions

Does Claude Code have push notifications?

No. Claude Code has no built-in notification system. Output stays in the terminal. To get phone notifications, you need either a custom webhook script or a tool like Grass that streams output to your phone.

How do I get notified when Claude Code needs approval?

Grass is the direct answer to this. It surfaces each permission request as a native modal on your phone the moment Claude Code pauses for approval — not as a delayed notification, but as an immediate interactive prompt. Install with npm install -g @grass-ai/ide, run grass start, and scan the QR code.

How do I know when my Claude Code session is done?

Without tooling, you don't — you have to check the terminal manually. With a webhook script (ntfy.sh, Pushover), you can get a notification when Claude Code exits. With Grass, you see the session complete in the live output stream and can review the final state, diffs, and file changes from your phone.

How do I get alerts when Claude Code is waiting for input?

Only Grass handles this case. Webhook scripts don't fire on approval gates — they only fire when they detect a matching string in stdout. Claude Code's permission requests write a specific prompt to the terminal and wait; a webhook that doesn't know to watch for that specific string will never fire.

Can I receive Claude Code permission requests on my phone?

Yes, with Grass. Each permission request appears as a native modal on the phone screen. One tap to approve or deny. The session continues immediately without any additional interaction.

What is the difference between a webhook notification and Grass for Claude Code alerts?

A webhook fires on a pattern match in stdout — it tells you something happened. Grass streams the full session in real time and lets you interact with it. The practical difference: a webhook tells you Claude finished; Grass tells you Claude is asking whether it should run rm -rf ./dist right now and lets you tap deny before it does.

How do I monitor Claude Code output without watching a terminal?

Grass is the purpose-built answer. Install the CLI (npm install -g @grass-ai/ide), run grass start in the project directory, scan the QR code with the Grass app, and your phone becomes a live monitor for the session. No terminal required after initial setup.