Vibelet
Keep remote sessions moving when you leave the computer

Let the computer keep working while your phone sends messages, checks status, and approves sensitive steps.

Vibelet LogoVibelet Logo
📱

Take Over From Your Phone

Step away for a meeting, commute, or break while you still send messages, check progress, and confirm next steps.

🤖

Pair Your Own Computer

Sessions still run on your machine. The phone is the controller, not a required cloud workspace.

🖼️

Screenshots Can Follow You

Send phone screenshots or photos into the remote session, then zoom or save images that come back in replies.

📎

Fetch Files Only When Needed

Browse remote folders, preview supported files, and download only the files you actually need on the phone.

🌐

Remote Access by Default

Use the default Cloudflare Tunnel, or choose Tailcat Direct, ngrok, or Tailscale when your network calls for it.

🔗

Pair Without Account Setup

Scan one QR code to connect. Use --access=local only when you want LAN-only pairing.

🔄

Come Back Without Losing Context

Resume the same session from your phone later, with its context still intact.

🛡️

Approve Sensitive Steps First

Review sensitive remote-session requests on your phone before they continue.

🔒

Local-first by Design

Data stays on your own machine. The mobile app does not download, install, or run executable code from sessions.

Screenshots

See it in action

Connect to your paired computer, manage sessions, and chat with remote assistants from your phone.

Connect
Connect
Sessions
Sessions
New Session
New Session
Chat
Chat
Settings
Settings
Get App

Install the phone controller before you step away

Once the app is installed, keep the desktop connector running and pair with a QR code when you need to leave the computer.

iOS

Install Vibelet on iPhone

Install the official App Store release for everyday phone control.

Stable

App Store release

The normal iPhone install path for controlling paired sessions.

Open App Store
QR code for the iOS App Store download
Android

Install Vibelet on Android

Download the official Android APK for everyday phone control.

Stable

Release APK

Primary Feishu download for controlling paired sessions on Android.

Download APK
QR code for the Android release APK download
Before You Pair

Make sure the setup path is ready

  • Start the desktop connector on the computer that should keep working
  • Use the default Cloudflare Tunnel QR, or pass --access=local when you only want LAN pairing
  • Open Vibelet on your phone and scan the QR before stepping away
Getting Started

Three steps from desk-bound to phone-controlled

Start the connector, scan once, and keep the session moving when you are away from the computer.

Install

Start the connector on the computer that will do the work

Run this before you leave the desk so the phone has something to pair with.

npx vibelet
Connect Your Phone

Scan once from the phone

  1. Install the Vibelet app from the App Store or release APK
  2. Open the app and tap Scan QR Code
  3. Scan the QR code displayed on your computer
Start a Session

Send the next instruction from anywhere

  1. Tap New Session in the app
  2. Choose the remote assistant configured on your computer
  3. Type your prompt and send
What You Get

What changes after pairing

  • Leave the computer running while you approve or reply from the phone
  • Keep separate sessions for different folders or projects
  • Come back later without losing the session context
  • Use the default remote tunnel, or --access=local when you only want LAN pairing
Remote Access

Use remote access only as much as you need

Use the default tunnel when you are away; choose LAN-only or your own network path when you want tighter control.

Tailcat DirectAccount-free P2P

Connect directly without joining a tailnet

Vibelet embeds Tailcat on the computer and phone. It bootstraps through DERP, then upgrades to an end-to-end encrypted peer-to-peer path when NAT traversal succeeds.

npx vibelet --tailcat

The setting is saved for later starts. LAN, Tailscale, and Cloudflare remain available as fallback paths; use --no-tailcat to turn it off.

Open the Tailcat setup guide
Cloudflare TunnelRecommended

Ready when the phone leaves the LAN

Free, no account needed. Vibelet starts a Cloudflare Tunnel automatically and prints a QR code that works remotely.

npx vibelet

Use --access=local to skip the default tunnel for this run. Pass --access=remote --force to get a fresh URL.

Custom Relay

Use the network path you already trust

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 --access=https://<your-tunnel-url>

The relay URL is persisted in ~/.vibelet/relay.json and reused on restart.

Built-in TailscaleVPN + Tailnet

Keep your proxy VPN and reach Vibelet over Tailscale

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 setup
FAQ

A few networking notes

Short answers for the pairing and relay edge cases that come up most often.

Why do some proxy apps mention *.argotunnel.com?

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.

I scanned the QR code and saw "Network request failed". What does that usually mean?

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.

Why did the QR code expire?

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.

When should I use --access=local?

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 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.

What is the difference between a custom relay and Tailscale?

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.

How can I use a proxy VPN and Tailscale for Vibelet at the same time on iPhone?

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.