Claude Code Connect
Message your AI agent from WhatsApp. It drives Claude Code on your laptop. You get progress updates in real time and the final result back in the same thread.
You don't open your laptop. You don't sit at a terminal. You just ask: "fix the TS error in my sandbox repo", "run the tests and commit if green", "what's different between this branch and main?" Your coding agent does it.
What you can ask it to do
Anything Claude Code can do on your laptop, you can trigger from WhatsApp:
- Fix bugs: "there's a type error in
src/index.tsline 42, fix it" - Run code: "run
npm testand tell me if anything fails" - Commit and push: "commit my changes with message 'wire up the retry loop' and push"
- Inspect: "what files changed in the last 3 commits?", "what's in my
package.json?" - Refactor: "rename
handleErrortologAndRethrowacross the repo" - Search: "find every TODO comment in this repo and summarize"
If Claude Code could do it at your desk, you can ask your agent to do it from anywhere.
How it works
Three moving parts:
- Your cloud agent (Jarvis): runs on Ajeris infrastructure, reads your WhatsApp/SMS/Telegram messages, picks the right tool for the task.
ajerisddaemon: a small background process on your Mac or Linux box, paired to your cloud agent via secure WebSocket.- Claude Code on your laptop: your own
claudeCLI, signed in with your Pro/Max subscription or API key. The daemon spawns it via the ACP protocol for each task.
When you text "fix the TS error in index.ts":
You (WhatsApp) ──→ Ajeris cloud agent
│ picks run_on_laptop tool
▼
Gateway WebSocket
│
▼
ajerisd on your Mac
│ spawns
▼
claude-code-acp subprocess
│ reads files, runs bash,
│ edits code, commits. The
│ same thing it'd do in your
│ terminal.
▼
progress events stream back ──→ You (WhatsApp)
final result ────────────────→ You (WhatsApp)
Total round-trip: 60 seconds for a typical fix, including progress updates along the way.
The chef / waiter / diner experience
Jarvis is the waiter. Claude Code is the chef. You are the diner.
You send your order:
fix the TS error in my sandbox repo at
/Users/you/project
The waiter immediately acknowledges:
Working on it. Your laptop is on it. I'll keep you posted.
Progress comes back as the chef cooks:
Running find…
Reading a file…
The final dish arrives:
Done! Found and fixed it:
File:
index.ts, line 1 Problem:xwas typed asnumberbut assigned the string'wrong'Fix: Changed the value to0Want me to run
tsc --noEmitagain to confirm it's clean?
You can interrupt mid-cook. Text "stop" or "cancel" and Claude Code halts immediately. Text "also add a test for it" while the session is running and your note gets folded into the next turn.
Install
1. Pair your laptop from WhatsApp
Text your Ajeris agent:
pair my laptop
Your agent replies with a one-time code like AGENT-7A4F and install instructions.
2. Install the CLI
One command, any shell:
npm install -g @ajeris-ai/cliNo login, no keychain prompt from us, no browser redirect. The install takes about 10 seconds.
3. Connect
From any directory (use a project directory if you want the agent to default to that repo):
cd ~/Projects/your-repo
ajeris connect claude-codeWhen it asks for the pair code, paste the AGENT-XXXX your agent sent you. Approve the macOS keychain prompt when it appears. Always Allow is the right click: the daemon needs to read the device token silently on restart.
You'll see:
✓ Paired as "yourname's Mac"
✓ ajerisd started. Claude Code is now reachable from your agent.
That's it. Text your agent from WhatsApp and it can now drive your laptop.
Requirements
- Operating system: macOS or Linux (systemd-based distros). Windows is not supported today.
- Node.js: v20 or newer.
- Claude Code:
claudeCLI installed and signed in. We use your own Claude auth: either a Pro/Max subscription (runclaude loginonce) or your personalANTHROPIC_API_KEYenv var. Ajeris does not supply or cache Claude API credentials. - Network: a persistent internet connection. The daemon holds a WebSocket to our gateway; it survives network blips and laptop sleep via heartbeat + auto-reconnect.
Permissions and trust
Ajeris maps every tool call Claude Code wants to run into one of seven categories and resolves each against an approval stance stored on your device row. Defaults:
| Category | Default | What it means |
|---|---|---|
bash_in_repo | auto | Shell commands inside your paired repoRoot run without asking. |
bash_outside_repo | ask | Shell commands outside your repoRoot SMS you for confirmation. |
write_file_in_repo | auto | File writes under your repoRoot run without asking. |
write_file_outside_repo | ask | File writes outside your repoRoot require your SMS approval. |
git_push | ask | Every git push SMS you a "do you want to push this?" prompt. |
network_mutation | ask | Any tool that hits the network for a mutation asks first. |
delete | ask | File deletes always ask. |
You can flip any of these per device in your /manage dashboard. Strict security posture: set everything to ask. Fast developer posture: leave the defaults.
The device token minted at pair time is stored in your macOS keychain (or Linux libsecret) with a permissive ACL so the daemon can read it silently on restart. Only processes running as your user can read it, the same trust boundary as your ~/.ssh keys or shell history.
Commands
ajeris connect claude-code
Pair this machine to your cloud agent. Prompts for the one-time code.
ajeris status
Show whether the daemon is running and connected to the gateway.
$ ajeris status
ajerisd: running (pid 45332)
bridge: online (last seen 3s ago)
repoRoot: /Users/you/projectajeris uninstall
Revoke this device, stop and remove the daemon, delete the config and keychain entry. One command, full cleanup.
ajeris --version
Print the CLI version. Update with npm install -g @ajeris-ai/cli@latest.
Architecture details
Per-device auth
Each paired laptop gets its own rotating device token. Revoke a device from /manage and its WebSocket drops within one second; subsequent connection attempts with the revoked token are rejected.
Heartbeat + reconnect
The daemon sends a WebSocket ping every 30s. If no pong arrives within 10s, it treats the connection as half-open (this is the state Mac sleep + network churn leaves behind), forcibly closes the TCP socket, and reconnects with exponential backoff. You close your laptop lid mid-conversation; you open it 30 minutes later and your agent still reaches you.
Progress relay
Claude Code emits events over ACP (agent_message_chunk, tool_call, tool_call_update). We pick milestone events (starting, running bash, reading/editing a file, committing, running tests) and relay them to your channel throttled to one message every 15 seconds. You get awareness without spam.
Interrupt semantics
While a session is running, your channel handler checks for an active-session registry entry. Words that read as a cancel intent (stop, cancel, kill it, nevermind) fire ACP session/cancel. Any other message queues as a follow-up prompt the same session will pick up on its next turn.
The daemon doesn't ship credentials
Ajeris does not bundle or cache Anthropic API keys. Your ajerisd spawns @zed-industries/claude-code-acp, which spawns your local claude CLI, which reads your own ~/.claude/ login or ANTHROPIC_API_KEY. The tokens billing your Claude Code work stay on your Anthropic account. Ajeris pays only for the thin orchestration layer (Jarvis picking tools and composing replies).
Troubleshooting
"Your laptop isn't reachable"
The daemon is running locally but the WebSocket to our gateway is dead. Usually a recent sleep/wake cycle left a half-open connection.
launchctl kickstart -k gui/$(id -u)/com.ajeris.ajerisd
ajeris statusThe heartbeat logic added in CLI 0.2.2 makes this much rarer. If it persists, check ~/Library/Logs/ajeris/ajerisd.err.log for network errors.
"Claude Code auth not detected" warning at pair time
You have the claude CLI installed but not signed in, and ANTHROPIC_API_KEY isn't set. Fix with:
claude login…and re-run ajeris status to confirm.
macOS keychain prompts every restart
Your first pair showed a dialog like "ajerisd wants to access the device token in your keychain." You declined Always Allow (or clicked Allow instead). Fix:
ajeris uninstall
ajeris connect claude-codeWhen the dialog appears this time, click Always Allow. CLI 0.2.3+ also sets a permissive keychain ACL at write time so post-restart reads are silent.
Pair code expired
Codes live for 5 minutes. Ask your agent for a fresh one:
pair my laptop
Re-pairing without uninstalling first
Safe as of CLI 0.2.3+. Run ajeris connect claude-code again; the installer unloads the previous launchd entry, writes the fresh plist, and reloads. Older versions required ajeris uninstall first.
Pricing
Nothing extra for Claude Code Connect itself. It's included with every Ajeris account.
You pay your existing Anthropic bill (Pro/Max sub or API usage) for the tokens Claude Code burns on your laptop. Ajeris pays the orchestration LLM that Jarvis uses to pick tools and compose replies. Two clean lanes.
Roadmap
Honest about what's next:
- Terminal + phone, one session. Today each
run_on_laptopcall spawns a fresh Claude Code session. Next:ajeris claudeas a terminal TUI that attaches to the daemon's persistent session, so you can drive the same conversation from your desk AND your phone and the state stays in sync. - Connector-first fallback. When a structured tool exists (Gmail API, Slack API, Shopify), Jarvis prefers that over the laptop. Today it works when Jarvis picks; we're making it the default.
- Windows support. Not today. WSL2 only path for now.
Questions?
Text your Ajeris agent, or email hi@ajeris.com. We read every one. If you're shipping something interesting on top of this, we want to hear it.