DEV Community

Koren Gast
Koren Gast

Posted on Originally published at useangelia.com

Claude Code from WhatsApp, on my Mac, no server in between

My wife and I have a WhatsApp group with one more member: a personal assistant that runs on my Mac. Either of us can ask it to look something up, to keep a note, or to chase a refund on a faulty order, and the risky steps wait for a yes in the chat. It answers both of us, it remembers what we told it last month, and it is Claude Code underneath, with my files and my MCP servers. That is the thing I wanted and could not get from Remote Control, which mirrors one session for one person. Angelia is the gateway I wrote for it. I maintain it; this is my setup.

Before you start

You need a Mac, git, Node 22 (the installer refuses a Node that is still open to Node2Shell), and Claude Code 2.1.270 or newer signed in with a claude.ai plan.

For the chat side, Telegram is ten seconds: @botfather, /newbot, copy the token. WhatsApp needs a second number. Do not use your own. In March I ran an OpenClaw bot on my personal number; my wife texted me, the bot answered as me, and she called to ask what was wrong with me. Also, a fresh number that starts automating on day one gets banned. I got a cheap eSIM with a small prepaid budget and used it like a normal number for a while before I pointed Angelia at it.

Install

curl -fsSL https://useangelia.com/install | sh
Enter fullscreen mode Exit fullscreen mode

The script checks the release signature and then runs a wizard. Telegram or WhatsApp, quick or advanced, which CLI, and then "send your bot a message". You send anything from the phone, the wizard shows it, you confirm, the chat is paired.

Then try "what is in this folder?". Claude Code answers from the profile folder on the Mac.

angelia service install
Enter fullscreen mode Exit fullscreen mode

That makes it start at login and restart after a crash. The Mac has to stay awake. There is a separate page on sleep settings and reboots. Read it before you blame the gateway.

Point it at a repo

A chat is a profile: a folder, its own CLAUDE.md, its own session. Quick setup calls it main. Add your repo to it in routing.yaml:

profiles:
  main: { cwd: ~/.angelia/workspace/profiles/main, permission_mode: acceptEdits, add_dirs: [~/code/my-app] }
Enter fullscreen mode Exit fullscreen mode

angelia accept, angelia compile main --write, /restart in the chat.

The family group is one profile: its own CLAUDE.md, its own memory files, both of us as owners. You can do the same with friends or parents, each group a profile with its own rules. My health log is another profile, this project's marketing chat is a third. Sessions come and go; the folder stays. None of this touches my terminal sessions.

Approvals

With acceptEdits, edits go through and anything else asks first. The question arrives in the chat:

🔐 Bash: npm test
Reply "yes 6b480a6f" or "no 6b480a6f".
Enter fullscreen mode Exit fullscreen mode

You type yes 6b480a6f. Ten minutes of silence means no. Only the owners of that chat can answer, so a friend in the group cannot approve rm -rf for you.

Things that turned out to matter

Progress lines come to the chat while it works, so I close the app. /stop, /new, /status are handled by the router itself, no tokens. Voice notes work once you brew install openai-whisper ffmpeg, and Whisper runs on the Mac. Photos and PDFs you send land as files. /status ends with a claude --resume <id> line; paste that in a terminal and you are back at the desk in the same session.

What is missing

macOS only, Linux is next. Each chat keeps a warm Claude Code process and they all share one plan's limits. It needs the claude.ai login, not a Console key. And prompt injection is not solved, by me or anyone: a message in a group is input to your agent, so keep risky commands behind the approval and read the security doc before adding people. v0.3, one person.

Versus the other routes

If you just want to keep a coding session going from your phone, use Remote Control. It is built in and you are done in a minute, but it is one session inside the Claude app, nothing scheduled and no memory per chat. Anthropic's official channels (research preview) give you Telegram, Discord and iMessage, still the one open session, and anyone on the allowlist can approve. Rich627's WhatsApp plugin puts WhatsApp on that same channel model, locally, Apache-2.0. Angelia is for a group that several people consult, with memory that stays with that group, approvals only from its owners, and a service that survives reboots. It does the same for Codex, Grok Build and pi.

I keep a table of all four, with the date I last checked each one: https://useangelia.com/guides/claude-code-whatsapp-telegram/
Code: https://github.com/korengast/angelia

If something in the install breaks for you, say so in the comments. I fix those first.

Top comments (0)