Reference

MeshHold vs Paseo, Happy Coder, CloudCLI & VibeTunnel

Driving an AI coding agent at home from your phone — ordered by what sits in the middle, and where the dedicated tools win.

The question this page answers is narrow: an AI coding agent runs on the machine at home, and you are not at home. Claude Code, Codex, Gemini CLI and the rest are terminal programs on somebody's desktop; getting at one from a phone is a separate problem from running it, and a small industry has grown up around solving it.

None of these projects publishes a comparison table, so unlike the ownCloud page there is no competitor's row set to answer. The rows below are ours, which is the weaker position to argue from — and it shows in the result, because on the rows that describe the agent experience MeshHold is not the strongest column here. Paseo is, by a distance.

The table is ordered by the one thing that actually separates them: what sits between the phone and the agent. VibeTunnel shares a terminal and leaves the transport entirely to you. CloudCLI serves a web UI on the machine and also leaves the transport to you. Happy Coder puts a relay in the middle that cannot read what passes through it. Paseo will do either — a direct connection, or its own end-to-end encrypted relay. MeshHold has nothing in the middle because the transport is the mesh it was already running for your files. Read down a column and you are reading one answer to how does the phone reach the machine at all.

The asymmetry worth stating before the table rather than discovering halfway down it. For the other four, driving an agent remotely is the product. For MeshHold it is one service of a storage daemon — the agent inherited a transport that already existed, which is why there is no relay, no tunnel, no account and no port to open. It is also why the agent surface is narrower: MeshHold cannot drive Codex, has no iOS client, no voice input, and no worktrees. If you want the best mobile agent client, it is in one of the other columns and this page will not talk you out of it. If you are already running MeshHold, the agent is there and costs you nothing extra to reach.

Two conventions in the cells below. Where a project's documentation simply does not say, the cell reads not documented rather than "—" — we may be wrong about those, and would rather be corrected than overstate. And all five require you to bring your own agent subscription; none of them is an LLM, all of them drive a CLI you already pay for.

MeshHoldPaseoHappy CoderCloudCLIVibeTunnel
Product & licensing
LicenseAGPL-3.0AGPL-3.0MITAGPL-3.0MIT
Source available client + server
CostFreeFreeFreeFree self-hosted1Free
Paid tierNoneNoneNoneCloudCLI Cloud, €7/mo1None
Vendor account requiredNoNoNo — device keys2NoNo
BackingSingle maintainer, no VCgetpaseoslopussiteboonamantus-ai
What sits between your phone and the agent
What is in the pathThe mesh — nothing else3Your choice: direct or relayA relay, always2Nothing — you supply it4Nothing — you supply it4
You must set up a tunnel or VPNNoNo — unless direct modeNoYes4Yes4
Port forwarding / open portsNoneNone via relayNoneLAN IP + port, or a tunnelLAN IP + port, or a tunnel
NAT traversal / hole punching built inVia the relay or TailscaleVia the relay
Operator in the middle can read itn/a — no operatorNo — E2E relayNo — zero-knowledge2n/an/a
Middle box is self-hostablen/a Docker2n/an/a
Reuses transport you already run the same mesh as your filesTailscale, if you have itTailscale, if you have itTailscale, if you have it
Agents it can drive
Claude Code5
OpenAI Codex5
Gemini CLI over ACP65
OpenCode5
Cursor CLI5
GitHub Copilot CLI5
Anything else in a terminalBuilt-in shell tab the entire point5
Several accounts of one agent, one box isolated per instance6Not documentedNot documentedNot documented it's just shells
Driving a session from the phone
Live streaming output SSE raw PTY
Structured chat, not a terminal— a terminal is what it is
Approve / deny tool calls cards, all drivers7 permitsTools off by default8— type y into the TTY
Answer the model's questions single / multi / free textNot documentedNot documentedNot documentedn/a — raw TTY
Voice input on-device by default realtime
Attach a screenshot from the phone claude only9Not documentedNot documentedNot documented
Queue messages while it is busy claude only9Not documentedNot documentedNot documented
Auto-continue loop until a phrase claude only9 loops
Scheduled / cron runs per instance10 interval or cron
One agent delegating to anotherCan spawn its own sessions11 orchestration, handoff
Manage the agent's MCP servers add, test, OAuth, tools12Not documentedNot documentedNot documented
Full-text search across transcripts claude only9Not documentedNot documentedNot documented
Reviewing the work — where MeshHold is thin
Per-edit diff in the transcriptNot documented
Repo-level diff reviewNot documented
Stage & commit from the phone13Not documented
Open a PR / mergeNot documented
Run each agent in a git worktree
Branch the session ran on shown as a chipNot documented
Browse / edit workspace filesDownload only13Not documentedNot documented editor + highlightingn/a — you have a shell
Sharing & multi-user
Same session on all your devices every node in the mesh one keypress handover it's one web app it's one terminal
Hand an instance to another person key or QR14Not documentedNot documented— share the whole UI— share the whole shell
Revoke that access reset the key14Not documentedNot documented
Access is scoped to one agent per instance14Not documentedNot documented— the whole machine— a shell is a shell
When things go wrong
Read transcripts with the host offline cached, read-only15Local encrypted store
Sessions survive a daemon restart restored on start tmux-style
Notified when it needs youBrowser + tray toast16 pushNot documented
Agent's own rate-limit surfaced 5-hour / weekly chipNot documentedNot documentedNot documented
Sandboxed / isolated execution— runs as the daemon user Docker, worktrees Docker sandbox
Platforms
Host: Windows— not supported
Host: Linux via npm
Host: macOS— no build published17 native app
Android client first-party app18 native nativeResponsive webResponsive web
iOS client17 native nativeResponsive webExperimental app19
Web UI the product the product
Desktop app tray + WebView2Web app macOS, Windows macOS menu bar
CLI meshhold agent happyServer only vt
Installed with one command— a whole daemon20 npm npm npx npm / brew
Maturity — where MeshHold loses
Community sizeSmall~12k starsLargeLargeLarge
Agent coverageThree, no CodexFive plus providersTwoThreeAny
Feature parity across driversUneven9UniformUniformUniformn/a
Focus of the projectOne feature of manyThis, entirelyThis, entirelyThis, entirelyThis, entirely
Independent security audit
Beyond the agent
Encrypted P2P file storage
Mesh VPN & exit nodes
Encrypted chat & calls11
S3-compatible storage server
TCP / UDP port forwarding

Notes

  1. CloudCLI is free to self-host and stays free; the €7/month tier is CloudCLI Cloud, a managed environment that runs the agent for you so your own machine does not have to be awake. Self-hosted, the machine has to stay powered on and reachable — which is true of MeshHold, Paseo, Happy and VibeTunnel too. Only the paid tier removes that requirement, and it removes it by moving your code onto somebody else's computer.
  2. Happy's server is a zero-knowledge relay: clients authenticate by public-key signature rather than a password, payloads are AES-256-GCM encrypted before they leave the machine, and the server stores blobs it cannot decrypt. Their self-hosting guide ships a single-container build with no Postgres, Redis or S3 dependency, so "run your own relay" is a genuinely small job. The relay is still a component you or someone else must operate — that is the whole content of the row, not a claim that it reads your code.
  3. The phone does not reach a server; it dials the host node over libp2p and speaks HTTP/1.1 inside that stream (/meshhold/plugin/agent/1.0). That is the same swarm already carrying your vaults, so there is nothing extra to install, register or pay for — and it inherits the swarm's transports, including the ones that share port 443 with a real TLS site or port 22 with a real sshd, so reaching the agent costs no extra open port on a machine that already serves something. See obfs-https front site.
  4. Neither CloudCLI nor VibeTunnel tries to solve reachability, and both are honest about it: you put them behind Tailscale, ngrok, a Cloudflare tunnel, or you stay on the LAN. That is a perfectly good answer if you already run Tailscale — it is one less moving part than a relay, and Tailscale is a better VPN than either of them would have written. It is a worse answer if you do not, because then "control my agent from my phone" has become "first deploy a VPN".
  5. VibeTunnel is not agent-aware in the sense the other four are; it shares the terminal, so it drives every CLI ever written, including ones released tomorrow. It does detect a spawned Claude session and shows its status and token count. What you give up is everything structured: approvals are you typing into a TTY, there is no diff view, no transcript search, and a phone keyboard against a full-screen TUI is exactly as pleasant as it sounds.
  6. Every driver is fully isolated per instance: Claude gets its own CLAUDE_CONFIG_DIR, Gemini its own HOME and its own API key in that instance's .env. So two Anthropic accounts, or a work key and a personal key, coexist on one machine without seeing each other. Gemini is driven over ACP — newline-delimited JSON-RPC over stdio — which means the same backend would host any other ACP agent.
  7. Approvals are uniform across all three drivers: Claude's MCP --permission-prompt-tool, OpenCode's /permission replies and Gemini's ACP session/request_permission all arrive as the same Allow / Deny card in the same UI. This is the piece that makes remote driving safe rather than just possible, and it is why "type y into the TTY" is marked as a loss for VibeTunnel rather than a shrug.
  8. CloudCLI's README is emphatic that every Claude Code tool is disabled by default and you must switch them on yourself. That is a defensible default for a web UI that might end up exposed, and it is not the same thing as a per-call approval prompt: it is a policy set once, not a decision made per action.
  9. The honest asterisk on MeshHold's agent surface. Attachments, transcript search, the message queue and the auto-continue loop are implemented on the Claude driver and return 501 or an empty result on OpenCode and Gemini. MCP management works for Claude and OpenCode but is hidden for Gemini, because gemini-cli's ACP mode hangs session creation whenever any MCP server is configured. The four alternatives do not have this problem, because they wrap each CLI the same way. If you plan to use Gemini or OpenCode as your main agent, assume the Claude column of our own feature list does not apply.
  10. A schedule is a persisted cron or one-shot trigger that opens a fresh session on its instance and delivers a prompt as the first message — the daemon is already running, so nothing needs your phone to be awake. Paseo has the same feature (paseo schedule create, interval or cron); an earlier draft of this page claimed the capability was unique to MeshHold and it is not.
  11. MeshHold's agent gets a small MCP server of the daemon's own: it can list your chats, post into one, and open new agent sessions. So a scheduled run that finds something can message you in MeshHold chat rather than waiting to be noticed. It is narrower than Paseo's orchestration — Paseo has handoff, looping, advisor and committee modes between providers, which MeshHold has no equivalent of. Note the deliberate limit: the agent gets chat and session tools, not vault or file tools.
  12. Add, edit, enable, delete and OAuth-authorise MCP servers per instance, and list the tools each one exposes — from the same phone UI. None of the other four documents an MCP admin surface, which is the kind of row that usually means "we looked and did not find it", not "it does not exist".
  13. There is a diff for each individual edit tool call, a chip showing the branch the session ran on, and a download for any file the session touched. There is no repo-level review: no staging, no commit, no PR. If reviewing and landing the change from your phone is the point of the exercise, Paseo and CloudCLI both do it and MeshHold does not.
  14. An instance issues a meshhold://join?agent_key=… URL, which the other person's node takes by paste or QR scan, and their node then proxies to yours over libp2p. The grant is per instance — that agent, not the machine — and reset-key revokes every holder at once. This is the row where the mesh model pays off: the alternatives are single-user tools that assume the devices belong to you, so "let a colleague drive this agent" means handing over the web UI or the shell.
  15. The dialing node writes through a cache of the session list and each transcript it fetches. When the host is unreachable the phone still opens the history, marked as cached with the time it was taken. Live sending obviously fails — the agent is on a machine that is off. The gate is deliberate: a rejected handshake never falls back to cache, so an access failure surfaces as an access failure rather than as stale content.
  16. Weaker than it sounds, and worth reading before relying on it. Notifications fire in the browser (or the Windows tray) when a session needs approval or finishes a turn — so the page has to be open, or the desktop app running. There is no push service, so a phone with the app closed learns nothing until you open it. Happy has real push; MeshHold does not.
  17. MeshHold ships no macOS build at all — not an app, not a daemon, not a tarball — and no iOS client. The tree carries darwin build tags so the source would compile, but nothing is published. Paseo, Happy, CloudCLI and VibeTunnel all run on a Mac; Paseo and Happy both ship native iOS apps. On an all-Apple household MeshHold's agent is simply not available.
  18. The Android app is the same web UI in a WebView rather than a native client, so it is a first-party app in the sense that we publish and support it, not in the sense that it was written twice. Paseo's and Happy's mobile clients are proper apps, and on a phone that difference is felt.
  19. VibeTunnel's own README calls its iOS app work-in-progress and "not recommended for production"; the responsive web interface is the supported path on a phone. Windows is not supported as a host at all.
  20. This is the fair objection to MeshHold's whole position on this page. Happy is npm install -g happy-coder, CloudCLI is one npx, VibeTunnel is a brew formula. MeshHold is a storage daemon with a mesh, a web UI, a password and a swarm key — a great deal of machinery to install if all you wanted was to see what Claude is doing while you are on the train. The argument for it is only good if you were going to run that daemon anyway.

Which one to pick

Paseo if the mobile agent client is the thing you actually want. It is the strongest column here: five agents, native iOS and Android, voice, worktrees, inline diff review with commit and merge, orchestration between agents, cron schedules, and a choice between a direct connection and an end-to-end encrypted relay. Same AGPL-3.0 licence as MeshHold, no telemetry, no account. Start there.

Happy Coder if you want the smallest honest step from where you are: install one npm package, run happy instead of claude, scan a QR code, and your phone has the session — with a relay that cannot read it, and the option to run that relay yourself in a single container. Two agents only, but the security story is the cleanest of the five and it is genuinely a five-minute setup.

CloudCLI if you want a full web IDE around the agent — file editor, git, shell, plugins — and you are content to reach it over the LAN or a tunnel you already run. Also the only one with a managed option if you would rather not keep a machine awake.

VibeTunnel if you distrust the whole category and just want your terminal on your phone. It drives every CLI that exists, has no agent-specific opinions to get in your way, and there is nothing to be wrong about. Mac and Linux only.

MeshHold when the agent is not the reason you are here. If a mesh is already carrying your vaults between a laptop, a NAS and a VPS, then the agent is already reachable from every one of them with no relay, no tunnel, no account and nothing new to install, over the same port your files already use. Add the parts the single-user tools have no reason to build: handing one agent to another person by QR with a revocable key, reading yesterday's transcripts while the host is switched off, and letting a scheduled run report into your chat. Everything else on this page, someone else does better.

Start with The Developer Platform for the agent surface, or Core Concepts for the vocabulary.