$ claude · on your phone

Your local claude CLI,
on your phone.

Not a remote desktop, not a reimplementation. It drives your logged-in local CLI: same agent, same CLAUDE.md, same session. The goal is terminal equivalence: typing to claude on your phone behaves like typing at your terminal.

Approvals, tool output, and resumed sessions stay on the same local Claude path.

Approving a git push from the phone
Typical flow

You leave the desk. The session keeps running.

22:30You send: "merge the duplicate date helpers in utils into one function, make the tests pass."

22:30Claude streams back, threaded with Read · Edit · Bash(npm test) tool cards.

22:39You unlock. The page has reconnected and replayed the missed output: tests passed, and one approval is waiting with the full git commit command and working directory. You tap Allow.

22:40"Now add a line to the CHANGELOG." It remembers what it just changed, and picks up right where it left off.

Stream a reply, watch tool cards, then approve a git push from your phone

A phone UI for the local CLI

Streaming output with Markdown rendering

Streaming

Markdown · syntax highlight · status line

Tool-call cards

Visible process

tool calls render as collapsible cards

Dangerous actions approved from the phone

Approve on phone

dangerous actions push full command + cwd

Multi-repository workspace session switcher

Workspace switcher

Watch and switch multiple repositories

Fine-grained settings control

Settings Panel

Permission modes and thinking effort

Direct log viewing

Real-time Logs

Inspect process logs and SDK errors

What it changes

Your local CLI, reachable from the phone

01

Your real CLI, not a clone

It ships no Claude of its own. It drives your local CLI through the Claude Agent SDK, so it uses the same agent, CLAUDE.md, MCP servers, skills, hooks, logged-in session, and provider setup you use at your desk.

02

Terminal equivalence

Edit code, run commands, and resume an earlier conversation. Typing on your phone follows the same local Claude path as typing at your computer.

03

Approve risky actions from your phone

Off-allowlist actions are suspended and pushed to your phone with the full command and working directory. Nothing runs until you allow it.

04

Handles flaky mobile networks

The task lives server-side, decoupled from the socket. After a dropped mobile connection, the page reconnects and replays missed events.

5 permission modes Per-message model switching Multi-repo · multi-session tabs File & image upload Web Push PWA-installable Zero-CDN, self-hosted Official or gateway
Security model

A code-execution channel into your shell

1

Single-user per instance

You run your own instance for yourself. There are no accounts or multi-user controls; anyone who passes auth has the same power as you at the terminal.

2

No token, no exit

With no AUTH_TOKEN set, the server binds to 127.0.0.1 only. There is no "empty = open to the world" path. Reaching the internet requires a token.

3

CLI permissions are inherited

The auto-approve set is your existing CLI allowlist. Anything off-list is suspended and sent to your phone for approval.

4

Device trust (TOFU)

A connection that is neither local nor Access-verified must be authorized once on your computer before it can do anything. A valid token alone is not enough.

No AUTH_TOKEN ⇒ binds 127.0.0.1 only. It cannot reach the public internet until you deliberately open it.

Scope

When it's worth it

This is not "open a remote desktop back to your computer." A remote desktop mirrors a screen. This gives your local claude session a phone UI: approvals, one session picked up across devices, several repos in parallel tabs, photo upload, and long-press copy.

If you only glance in remotely now and then, a remote desktop is enough. This project is for using the phone often as a terminal companion.

Run it on your own machine

It is self-hosted. There is no shared demo because it drives your own authenticated claude CLI.

Prerequisites: Node.js ≥ 20 on macOS or Linux, and a working claude CLI on the host. Official subscription works out of the box; third-party gateways work by exporting the required ANTHROPIC_* variables in the shell that starts the server.

# clone, install runtime deps, configure, run git clone https://github.com/Ike-li/claude-chat-mobile.git cd claude-chat-mobile npm install --omit=dev npm run setup # generate AUTH_TOKEN + ask WORK_DIR # Optional gateway: export ANTHROPIC_* in this shell before starting npm start # http://localhost:3000
Read the full guide on GitHub