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.
| MeshHold | Paseo | Happy Coder | CloudCLI | VibeTunnel | |
|---|---|---|---|---|---|
| Product & licensing | |||||
| License | AGPL-3.0 | AGPL-3.0 | MIT | AGPL-3.0 | MIT |
| Source available | ✓ | ✓ | ✓ client + server | ✓ | ✓ |
| Cost | Free | Free | Free | Free self-hosted1 | Free |
| Paid tier | None | None | None | CloudCLI Cloud, €7/mo1 | None |
| Vendor account required | No | No | No — device keys2 | No | No |
| Backing | Single maintainer, no VC | getpaseo | slopus | siteboon | amantus-ai |
| What sits between your phone and the agent | |||||
| What is in the path | The mesh — nothing else3 | Your choice: direct or relay | A relay, always2 | Nothing — you supply it4 | Nothing — you supply it4 |
| You must set up a tunnel or VPN | No | No — unless direct mode | No | Yes4 | Yes4 |
| Port forwarding / open ports | None | None via relay | None | LAN IP + port, or a tunnel | LAN IP + port, or a tunnel |
| NAT traversal / hole punching | ✓ built in | Via the relay or Tailscale | Via the relay | — | — |
| Operator in the middle can read it | n/a — no operator | No — E2E relay | No — zero-knowledge2 | n/a | n/a |
| Middle box is self-hostable | n/a | ✓ | ✓ Docker2 | n/a | n/a |
| Reuses transport you already run | ✓ the same mesh as your files | Tailscale, if you have it | — | Tailscale, if you have it | Tailscale, if you have it |
| Agents it can drive | |||||
| Claude Code | ✓ | ✓ | ✓ | ✓ | ✓5 |
| OpenAI Codex | — | ✓ | ✓ | ✓ | ✓5 |
| Gemini CLI | ✓ over ACP6 | — | — | — | ✓5 |
| OpenCode | ✓ | ✓ | — | ✓ | ✓5 |
| Cursor CLI | — | — | — | ✓ | ✓5 |
| GitHub Copilot CLI | — | ✓ | — | — | ✓5 |
| Anything else in a terminal | — | — | — | Built-in shell tab | ✓ the entire point5 |
| Several accounts of one agent, one box | ✓ isolated per instance6 | Not documented | Not documented | Not 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 | ✓ permits | ✓ | Tools off by default8 | — type y into the TTY |
| Answer the model's questions | ✓ single / multi / free text | Not documented | Not documented | Not documented | n/a — raw TTY |
| Voice input | — | ✓ on-device by default | ✓ realtime | — | — |
| Attach a screenshot from the phone | ✓ claude only9 | Not documented | Not documented | Not documented | — |
| Queue messages while it is busy | ✓ claude only9 | Not documented | Not documented | Not documented | — |
| Auto-continue loop until a phrase | ✓ claude only9 | ✓ loops | — | — | — |
| Scheduled / cron runs | ✓ per instance10 | ✓ interval or cron | — | — | — |
| One agent delegating to another | Can spawn its own sessions11 | ✓ orchestration, handoff | — | — | — |
| Manage the agent's MCP servers | ✓ add, test, OAuth, tools12 | Not documented | Not documented | Not documented | — |
| Full-text search across transcripts | ✓ claude only9 | Not documented | Not documented | Not documented | — |
| Reviewing the work — where MeshHold is thin | |||||
| Per-edit diff in the transcript | ✓ | ✓ | Not documented | ✓ | — |
| Repo-level diff review | — | ✓ | Not documented | ✓ | — |
| Stage & commit from the phone | —13 | ✓ | Not documented | ✓ | — |
| Open a PR / merge | — | ✓ | — | Not documented | — |
| Run each agent in a git worktree | — | ✓ | — | — | — |
| Branch the session ran on | ✓ shown as a chip | ✓ | Not documented | ✓ | — |
| Browse / edit workspace files | Download only13 | Not documented | Not documented | ✓ editor + highlighting | n/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 QR14 | Not documented | Not documented | — share the whole UI | — share the whole shell |
| Revoke that access | ✓ reset the key14 | Not documented | Not documented | — | — |
| Access is scoped to one agent | ✓ per instance14 | Not documented | Not documented | — the whole machine | — a shell is a shell |
| When things go wrong | |||||
| Read transcripts with the host offline | ✓ cached, read-only15 | — | Local encrypted store | — | — |
| Sessions survive a daemon restart | ✓ restored on start | ✓ | ✓ | ✓ | ✓ tmux-style |
| Notified when it needs you | Browser + tray toast16 | ✓ | ✓ push | Not documented | — |
| Agent's own rate-limit surfaced | ✓ 5-hour / weekly chip | Not documented | Not documented | Not 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 | ✓ native | Responsive web | Responsive web |
| iOS client | —17 | ✓ native | ✓ native | Responsive web | Experimental app19 |
| Web UI | ✓ | ✓ | ✓ | ✓ the product | ✓ the product |
| Desktop app | ✓ tray + WebView2 | ✓ | Web app | ✓ macOS, Windows | ✓ macOS menu bar |
| CLI | ✓ meshhold agent | ✓ | ✓ happy | Server only | ✓ vt |
| Installed with one command | — a whole daemon20 | ✓ npm | ✓ npm | ✓ npx | ✓ npm / brew |
| Maturity — where MeshHold loses | |||||
| Community size | Small | ~12k stars | Large | Large | Large |
| Agent coverage | Three, no Codex | Five plus providers | Two | Three | Any |
| Feature parity across drivers | Uneven9 | Uniform | Uniform | Uniform | n/a |
| Focus of the project | One feature of many | This, entirely | This, entirely | This, entirely | This, entirely |
| Independent security audit | — | — | — | — | — |
| Beyond the agent | |||||
| Encrypted P2P file storage | ✓ | — | — | — | — |
| Mesh VPN & exit nodes | ✓ | — | — | — | — |
| Encrypted chat & calls | ✓11 | — | — | — | — |
| S3-compatible storage server | ✓ | — | — | — | — |
| TCP / UDP port forwarding | ✓ | — | — | — | — |
Notes
- 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.
- 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.
- 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. - 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".
- 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.
- Every driver is fully isolated per instance: Claude gets its own
CLAUDE_CONFIG_DIR, Gemini its ownHOMEand 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. - Approvals are uniform across all three drivers: Claude's MCP
--permission-prompt-tool, OpenCode's/permissionreplies and Gemini's ACPsession/request_permissionall 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 "typeyinto the TTY" is marked as a loss for VibeTunnel rather than a shrug. - 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.
- 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.
- 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. - 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.
- 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".
- 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.
- 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 — andreset-keyrevokes 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. - 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.
- 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.
- MeshHold ships no macOS build at all — not an app, not a daemon, not a
tarball — and no iOS client. The tree carries
darwinbuild 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. - 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.
- 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.
- This is the fair objection to MeshHold's whole position on this page.
Happy is
npm install -g happy-coder, CloudCLI is onenpx, 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.