Control your local Claude Code from a mobile-friendly browser UI, anywhere. Self-hosted, end-to-end encrypted, with multi-host multi-device support.
A three-piece system that lets you run Claude Code on your laptop and drive it from a browser on your phone, tablet, or any other machine. Kick off new prompts and watch output stream in real time — over the public internet, without exposing your machine.
flowchart LR
H["host<br/>(your laptop)<br/>runs Claude"]
S["server<br/>(relay)<br/>routes messages"]
C["client<br/>(browser on phone)<br/>Svelte SPA"]
H <-->|WebSocket| S
S <-->|WebSocket| C
Run the server anywhere reachable from the public internet (a $5/mo VPS works). Run the host on the machine where you want Claude to do real work. Open the client in any browser to drive it.
Server (run on a VPS or any internet-reachable machine):
cd server && npm install && node src/index.js
Host (run on the machine where Claude runs):
./install.sh # interactive setup, writes run.sh, optionally installs systemd service
./run.sh
Or manually:
cd host && npm install
CLIENT_USERNAME=you CLIENT_PASSWORD=pass HOST_KEY=secret SERVER_URL=wss://yourserver node index.js
Client — the server serves the pre-built client from client/dist/. To rebuild:
cd client && npm install && npm run build
The host generates an EC P-256 keypair on first run and sends the public key to the server. Clients log in with username + password via HMAC-based challenge-response; the host signs a JWT with its private key, the server verifies with the public key. The password never reaches the server.
When a password is set, the client and host independently derive AES-GCM-256 encryption keys from it. All message content is encrypted end-to-end — the server relays opaque ciphertext and cannot read session data, file contents, or git diffs. See doc/auth.spec.md for the full protocol.
Multiple clients can connect to the same host. Multiple hosts (different usernames) can connect to the same server; the server routes messages by JWT.
| Variable | Default | Description |
|---|---|---|
SERVER_URL |
ws://localhost:3000 |
Server WebSocket URL (host → server) |
CLIENT_USERNAME |
whoami |
Username for web login |
CLIENT_PASSWORD |
changeme |
Password for web login |
HOST_KEY |
host-key-change-me |
Shared secret between host and server |
PORT |
3000 |
Server listen port |
CODETTE_DATA_HOME |
platform default | Override data directory (host keys, session names) |
CODETTE_TRACE |
off | Set to 1 for protocol-level trace logging |
E2E |
on | Set to 0 to disable e2e encryption (debug only) |
Change every default before exposing the server to the public internet.