Vibelet
AI Coding from Your Phone

Control Claude & Codex sessions remotely

Vibelet LogoVibelet Logo
📱

Mobile Remote

Send prompts, review diffs, and approve tool calls — Claude and Codex in your pocket.

🤖

Multi-Agent

One daemon hosts Claude and Codex side by side, each agent in its own workspace.

🖼️

Image Support

Send screenshots or photos to the agent from your phone, and tap any reply image to zoom or save.

📎

File Browse & Download

Browse the workspace tree, preview code, and download files to your phone without touching the laptop.

🌐

Remote Access

Remote access is on by default. Supports Cloudflare Tunnel, ngrok, and Tailscale — reach your machine from anywhere.

🔗

QR Pairing

Scan a QR code to connect instantly, with no account and an optional LAN-only mode via --local.

🔄

Session Resume

Resume the same Claude or Codex session from your phone later — context stays intact.

🛡️

Approval Flow

Review and approve file edits, shell commands, and API calls before they execute, even from a phone.

🔒

Local-first

Data stays on your own machine, no cloud account. Health checks and audit logs keep everything observable.

Screenshots

See it in action

Connect to your AI daemon, manage sessions, chat with agents — all from your phone.

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

Bring the remote onto your phone first

Install the mobile app, keep the daemon running locally, then pair everything with one QR scan.

iOS

Install Vibelet on iPhone

Join TestFlight for the newest build, or grab the App Store release if you prefer the stable channel.

Test

TestFlight beta

Early access to changes before they reach the App Store.

Join TestFlight
QR code for the iOS TestFlight download
Stable

App Store release

The official iPhone build for normal installation.

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

Install Vibelet on Android

Download the stable APK for daily use, or install the test build for the latest Android changes.

Stable

Release APK

The official Android APK for direct installation.

Download APK
QR code for the Android release APK download
Test

Test APK

The latest Android test build for early validation.

Download Test APK
QR code for the Android test APK download
Before You Pair

Make sure the setup path is ready

  • Start the daemon on your computer with npx vibelet
  • Keep your phone and computer on the same local network
  • Open Vibelet on your phone and tap Scan QR Code
Getting Started

Up and running in three steps

Install, connect, and start your first AI coding session.

Install

Start the Vibelet daemon

Run this command on your computer before pairing the phone.

npx vibelet
Connect Your Phone

Pair by scanning the QR code

  1. Install the Vibelet app via TestFlight (or the App Store)
  2. Open the app and tap Scan QR Code
  3. Scan the QR code displayed in your terminal
Start a Session

Send your first prompt

  1. Tap New Session in the app
  2. Choose your agent: Claude or Codex
  3. Type your prompt and send
What You Get

Core workflow, without extra setup

  • Approval flow for file edits, shell commands, and API calls
  • Multi-session support across different projects
  • Resume the same Claude or Codex session from your phone
  • Remote-ready by default, with --local for LAN-only pairing
Remote Access

Control your agents from anywhere

Vibelet starts with remote access enabled by default. If you prefer LAN-only pairing or your own network path, pick one of these options.

Cloudflare TunnelRecommended

Zero config, default on

Free, no account needed. Vibelet starts a Cloudflare Tunnel automatically and prints a remote-ready QR code.

npx vibelet

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

Custom Relay

Bring your own tunnel

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.

Tailscale

Peer-to-peer VPN, no tunnel needed

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.

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 host / fallback hosts.

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 daemon entry may still work.

When should I use --local?

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.

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

Why does Loon / Surge stop working when I enable Tailscale on Mac?

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.