Desktop, mobile, and web
Available on Windows, macOS, Linux, iOS, Android, and the web.
Keep your AI sessions moving. Follow progress, send a message, and approve the next step — from your desktop, phone, or browser.
One conversation. Across your devices.
Available on Windows, macOS, Linux, iOS, Android, and the web.
Pick up a session from your computer on your phone, with your conversation history intact.
Use Claude Code and Codex in one app, and switch between sessions.
Send screenshots to the AI, view images in replies, and browse files on your computer.
Review permission requests from the AI on your phone, then allow or deny them.
Classic or Minimal, light or dark. Pick your own accent color in Minimal.
Manage assistant sessions at your desk, or keep the conversation going from your phone.
Your sessions and conversations in a full desktop workspace. Select a screenshot to view it at full size.
Use the free desktop app at your desk, and pair with the phone app to continue when you step away.
Free desktop app for Apple Silicon. Beta download, signed and notarized by Apple.
Download for MacThe free x64 Windows beta is being prepared for release.
The free x64 Linux beta is being prepared for release.
Install the official App Store release for everyday phone control.
The normal iPhone install path for controlling paired sessions.
Open App StoreDownload the official Android APK for everyday phone control.
Start the connector, scan once, and keep the session moving when you are away from the computer.
Run this before you leave the desk so the phone has something to pair with.
npx vibeletRemote Direct is enabled by default. You can also use your local network or an existing network path.
Vibelet automatically establishes an encrypted connection between your phone and computer. No separate networking app or account is needed.
npx vibeletRun npx vibelet, then scan the pairing QR with the current app. LAN remains available.
Open the remote connection guideAlready 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 --access=https://<your-tunnel-url>The relay URL is persisted in ~/.vibelet/relay.json and reused on restart.
Recommended on iPhone when you need a proxy VPN and Tailscale at the same time. Use Stash or another proxy app that can run Tailscale as an internal node and route Tailnet traffic to it.
npx vibelet --access=<computer-tailscale-ip>Route 100.64.0.0/10 and *.ts.net to the Tailscale node. Do not leave 100.64.0.0/10 in Stash Skip Route.
Open the Stash example setupShort 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 --access host list.
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 device entry may still work.
Use `npx vibelet --access=local` when your phone and computer are already on the same LAN and you do not want Vibelet to use the default Remote Direct connections 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 `--access=https://...`.
Tailscale is different: there is no public relay URL in Vibelet. Instead, you tell Vibelet the machine Tailscale IP with `--access=<tailscale-ip>`, and your phone must also be logged into the same tailnet.
iOS allows only one system VPN tunnel at a time, so two independent VPN apps cannot both own the tunnel. Use Stash or another proxy app that can run Tailscale as an internal routable node inside the same tunnel.
The app must support both a built-in Tailscale node and rule-based routing; ordinary Tailscale protocol recognition is not enough. Stash exposes this capability as a `type: tailscale` node, so the guide uses Stash as the concrete example.
Send `100.64.0.0/10` and `*.ts.net` to that node, while normal internet traffic keeps using your existing Stash proxy groups. Vibelet can then use the computer Tailscale IP without turning off the proxy VPN.
Do not put `100.64.0.0/10` in Stash Skip Route. Skipped traffic never reaches the Tailscale node and the Vibelet health check will time out.
See the Stash example guide for the complete configuration and authentication steps. Other compatible apps may use different configuration syntax.