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.ts participate in circular dependencies. Fix: extract shared types.
  • High – Oversized files: agent-manager.ts is 2,571 lines. Fix: split by responsibility.
  • High – Hub modules: agent-sdk-types.ts has 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.