Mobile Remote
Send messages, review remote session activity, and approve requests from your phone.
Send messages, review remote session activity, and approve requests from your phone.
Vibelet connects to your own computer and keeps the iOS app as a remote controller.
Send screenshots or photos to the remote session, and tap any reply image to zoom or save.
Browse remote folders, preview supported files, and download files to your phone when needed.
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 remote session from your phone later, with its context intact.
Review sensitive remote-session requests before they continue.
Data stays on your own machine. The iOS app does not download, install, or run executable code.
Connect to your paired computer, manage sessions, and chat with remote assistants from your phone.





Install the mobile app, keep the desktop connector running on your computer, 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 remote 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 device 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.