Mobile Remote
Send prompts, review diffs, and approve tool calls — Claude and Codex in your pocket.
Send prompts, review diffs, and approve tool calls — Claude and Codex in your pocket.
One daemon hosts Claude and Codex side by side, each agent in its own workspace.
Send screenshots or photos to the agent from your phone, and tap any reply image to zoom or save.
Browse the workspace tree, preview code, and download files to your phone without touching the laptop.
Remote access is on by default. Supports Cloudflare Tunnel, ngrok, and Tailscale — reach your machine from anywhere.
Scan a QR code to connect instantly, with no account and an optional LAN-only mode via --local.
Resume the same Claude or Codex session from your phone later — context stays intact.
Review and approve file edits, shell commands, and API calls before they execute, even from a phone.
Data stays on your own machine, no cloud account. Health checks and audit logs keep everything observable.
Connect to your AI daemon, manage sessions, chat with agents — all from your phone.





Install the mobile app, keep the daemon running locally, then pair everything with one QR scan.
Join TestFlight for the newest build, or grab the App Store release if you prefer the stable channel.
Download the stable APK for daily use, or install the test build for the latest Android changes.
Install, connect, and start your first AI coding session.
Run this command on your computer before pairing the phone.
npx vibeletVibelet starts with remote access enabled by default. If you prefer LAN-only pairing or your own network path, pick one of these options.
Free, no account needed. Vibelet starts a Cloudflare Tunnel automatically and prints a remote-ready QR code.
npx vibeletUse --local to skip the default tunnel for this run. Pass --remote --force to get a fresh URL.
Already running cloudflared, ngrok, or another tunnel? Pass its public URL directly.
# Cloudflare (manual)
npx cloudflared tunnel --protocol http2 --url http://localhost:9876
# ngrok
ngrok http 9876
# Then tell Vibelet to use it:
npx vibelet --relay=https://<your-tunnel-url>The relay URL is persisted in ~/.vibelet/relay.json and reused on restart.
Just tell Vibelet your device's Tailscale IP. Your phone must also be on the same Tailscale network.
npx vibelet --host=<tailscale-ip>Install the Tailscale app on your phone and join the same tailnet.
Short answers for the pairing and relay edge cases that come up most often.
When Cloudflare Tunnel or Argo Tunnel is in the path, some rule-based proxy apps need *.argotunnel.com treated as a real IP target and excluded from the proxy chain.
In Loon-style configs, that usually means putting *.argotunnel.com in real-ip and skip-proxy. The goal is simple: resolve the tunnel hostname normally and connect to it directly instead of bouncing that tunnel traffic through another proxy layer.
For example, in Loon you may need this in `[General]`: `real-ip = *.argotunnel.com` `skip-proxy = *.argotunnel.com`
If your current network cannot reach *.argotunnel.com directly, do not keep it in skip-proxy. Route it through a stable proxy policy instead, or use a custom relay / Tailscale path.
That error usually means the phone could not reach the host inside the QR payload at all, before Vibelet received any HTTP response.
Common causes are: the phone and computer are not on the same reachable network, the QR points to a LAN or .local address that the phone cannot resolve, Local Network permission was denied on iPhone, or a proxy app intercepted the tunnel / relay domain incorrectly.
If you are using a remote tunnel, make sure the relay hostname itself is reachable. If you are using LAN-only pairing, try the computer LAN IP directly or rerun Vibelet with the right host / fallback hosts.
The pairing QR is intentionally short-lived and one-time-use. That keeps the pairing flow simple without leaving a reusable open window behind.
If it expires, just run `npx vibelet` again on your computer and scan the fresh QR code. If this phone was already paired before, reconnecting from the saved daemon entry may still work.
Use `npx vibelet --local` when your phone and computer are already on the same LAN and you do not want Vibelet to use the default remote tunnel for that run.
Use plain `npx vibelet` when you want the QR code to be remote-ready by default. That is the better default when you are not sure whether the phone will stay on the same local network.
A custom relay means you already have a public tunnel URL, such as Cloudflare Tunnel or ngrok, and pass it to Vibelet with `--relay=https://...`.
Tailscale is different: there is no public relay URL in Vibelet. Instead, you tell Vibelet the machine Tailscale IP with `--host=<tailscale-ip>`, and your phone must also be logged into the same tailnet.
The official Tailscale GUI (the macsys build) uses macOS NetworkExtension and grabs the default route. Loon / Surge are also NetworkExtension-based, so the two fight over routing — once Tailscale is on, the proxy tool's TUN effectively stops and outbound traffic-shaping breaks.
Fix: switch to the open-source standalone `tailscaled`, which uses a plain `utun` interface instead of NetworkExtension and coexists with Loon cleanly.
Steps: quit `Tailscale.app`, drag it to Trash from Finder (this triggers the system-extension uninstall prompt — `rm` does not), then run: `brew install tailscale` `sudo tailscaled install-system-daemon` `sudo tailscale up --advertise-exit-node`
On the Loon / Surge side, keep Tailscale traffic out of the proxy by adding `100.64.0.0/10` to `skip-proxy` and `bypass-tun`, plus direct rules for `*.ts.net` and `IP-CIDR,100.64.0.0/10,DIRECT,no-resolve` near the top of the rule list.
On iOS, Tailscale and Loon are mutually exclusive (system-level NE limit, only one tunnel at a time). The usual workaround is to run the Mac as a Tailscale exit node and have the phone select it — outbound traffic from the phone then flows through the Mac's Loon.