The Problem
Running coding agents (Claude Code, Codex, OpenCode) across multiple machines typically means juggling separate terminals, SSH sessions, and provider-specific CLIs. There is no unified way to start, monitor, and steer agents from a phone, desktop, or CI script without coupling yourself to one vendor's tooling.
What This Does
Paseo is a self-hosted orchestration layer. A local daemon (packages/server) manages agent processes. Clients—desktop (packages/desktop), mobile (packages/app, Expo/React Native), web, and CLI (packages/cli)—connect to it over WebSocket. The same agent can be controlled from any client, and multiple agents run in parallel on your own hardware.
The CLI (packages/cli/src) exposes run, ls, attach, and send commands for headless or scripted use. The app includes voice input (two-way audio via packages/expo-two-way-audio) and attachment handling (packages/app/src/attachments).
How It Is Wired
Execution starts in the mobile app at packages/app/src/app/_layout.tsx (init, reaches 76 functions) or packages/app/src/runtime/host-runtime.ts (bootstrap, reaches 70). The desktop host (packages/app/src/desktop/host.ts) bridges to Electron. The server's bootstrap in packages/server/src/server/bootstrap is the daemon's entry point.
The critical hub is packages/server/src/server/agent/agent-sdk-types.ts — 106 modules import it, making it the highest-blast-radius file in the repo. packages/server/src/server/messages.ts (38 importers) and packages/cli/src/output/index.ts (62 importers) are also central. All three participate in circular import cycles, which complicates refactoring.
The internal call graph shows set (108 call sites) and trimNonEmpty (55) as the most-touched functions. packages/app/src/runtime/host-runtime.ts is the app's workhorse: 95 functions, called from 49 files. Only one function makes an outbound network call; two touch the filesystem, so the daemon's side effects are concentrated and testable.
How To Use It
Setup:
npm install -g @getpaseo/cli
paseo
Configuration: Requires at least one agent CLI (Claude Code, Codex, or OpenCode) installed and authenticated. The daemon auto-starts with the desktop app; mobile connects via QR code from Settings.
Running: The daemon runs locally; clients connect to it. The CLI is the headless path:
paseo run --provider claude/opus-4.6 "implement user authentication"
paseo ls
paseo attach abc123
Real-World Use
A developer plans a feature with Claude on a workstation, then hands off implementation to Codex in a worktree via /paseo-handoff (an experimental skill in skills/). They check progress from their phone during commute and run the full test suite via paseo --host workstation.local:6767 run from a CI job. One daemon, multiple clients, no vendor lock-in.
Code Health & Issues
Static analysis (not opinion) found 232 issues: 84 high, 148 medium. Key findings:
- High – Import cycles:
agent-sdk-types.ts,messages.ts,agent-manager.tsparticipate in circular dependencies. Fix: extract shared types. - High – Oversized files:
agent-manager.tsis 2,571 lines. Fix: split by responsibility. - High – Hub modules:
agent-sdk-types.tshas 106 dependents; churn here is high-blast-radius. - Medium – High branching density in
packages/cli/src/utils/client.ts(68 branches / 239 lines).
SDLC observations: CI exists (GitHub Actions), tests are present (516 files), license and lockfile are committed. No secrets found. The repo lacks Dependabot, a dependency vulnerability scan, and pins GitHub Actions to tags (e.g., expo/expo-github-action@v8) instead of commit SHAs — a supply-chain risk. One 6.5MB binary (hero-bg.jpg) is in the repo.
The Bottom Line
Paseo is a serious, well-structured orchestration tool with a real architecture and good test coverage. The hub/cycle issues in the server are the main refactoring risk; pinning CI actions and adding dependency scanning should be done before production use. Best for teams already running multiple agent CLIs who want a unified control plane.