Why:\n- daemon-client-transport.ts had multiple unrelated concerns (runtime WebSocket adaptation, relay/e2ee orchestration, and message/ID utility helpers) in one dense file.\n- This made control flow harder to follow and increased coupling for future edits in server transport code.\n\nWhat changed:\n- Added transport type contracts in packages/server/src/client/daemon-client-transport-types.ts.\n- Moved websocket-specific factory/binding logic to packages/server/src/client/daemon-client-websocket-transport.ts.\n- Moved relay/e2ee handshake + encrypted transport orchestration to packages/server/src/client/daemon-client-relay-e2ee-transport.ts.\n- Moved payload normalization, close/error description, id generation, and encode/decode helpers to packages/server/src/client/daemon-client-transport-utils.ts.\n- Converted packages/server/src/client/daemon-client-transport.ts into a compatibility barrel that re-exports the existing API so daemon-client callsites remain unchanged.\n- Reduced nested payload conversion logic by introducing shared normalization helpers used by relay/e2ee paths.\n\nVerification:\n- npm run -w packages/server test -- src/client/daemon-client-transport.test.ts\n- npm run -w packages/server test -- src/client/daemon-client.test.ts\n- npm run typecheck\n\nNext-agent notes (accomplishments/challenges):\n- Accomplishment: transport responsibilities are now separated by concern, with no consumer API break in daemon-client.ts.\n- Accomplishment: existing transport and daemon-client tests pass unchanged after the split.\n- Challenge to watch: createEncryptedTransport remains stateful by design (opened/closed/channel lifecycle); future changes should keep this sequencing behavior identical and covered by deterministic tests.
Paseo
Manage coding agents from your phone and desktop.
Warning
Early development — Features may break or change without notice. Use at your own risk.
Paseo is a self-hosted daemon for Claude Code, Codex, and OpenCode. Agents run on your machine with your full dev environment. Connect from phone, desktop, or web.
Features
- Self-hosted: The daemon runs on your laptop, home server, or VPS
- Multi-provider: Works with Claude Code, Codex, and OpenCode from one interface
- Multi-host: Connect to multiple daemons and see all your agents in one place
- Voice input: Dictate prompts when you're away from your keyboard
- Optional relay: Use the hosted end-to-end encrypted relay, or connect directly
- Cross-device: iOS, Android, desktop, web, and CLI
- Git integration: Manage agents in isolated worktrees, review diffs, ship from the app
- Open source: Free and open source under MIT license
Quick Start
npm install -g @getpaseo/cli && paseo
Then open the app and connect to your daemon.
Local speech (STT/TTS)
Paseo can run dictation + voice mode STT/TTS fully locally via sherpa-onnx.
When the daemon starts with a local speech provider selected, it will download any missing model files automatically (unless PASEO_SHERPA_ONNX_AUTO_DOWNLOAD=0).
npm run speech:download --workspace=@getpaseo/server
Optional configuration:
PASEO_SHERPA_ONNX_MODELS_DIR(defaults to~/.paseo/models/sherpa-onnx)PASEO_SHERPA_ONNX_AUTO_DOWNLOAD(1by default; set0to disable automatic downloads on daemon start)PASEO_SHERPA_STT_PRESET(zipformer,paraformer, orparakeetfor NVIDIA Parakeet TDT v3)PASEO_SHERPA_TTS_PRESET(pocket-tts(Kyutai Pocket TTS),kitten, orkokoro)PASEO_DICTATION_STT_PROVIDER,PASEO_VOICE_STT_PROVIDER,PASEO_VOICE_TTS_PROVIDER(sherpaoropenai)
To see all supported local model IDs:
npm run speech:models --workspace=@getpaseo/server
Optional: run an end-to-end test that downloads real models and exercises streaming STT + streaming TTS:
PASEO_SPEECH_E2E_DOWNLOAD=1 PASEO_SPEECH_E2E_MODEL_SET=parakeet-pocket \
npx vitest run --workspace=@getpaseo/server src/server/speech/sherpa/speech-download.e2e.test.ts
Documentation
See paseo.sh/docs for full documentation.
Desktop releases
Desktop app binaries are built and attached to a GitHub Release when you push a version tag (for example v0.1.0 or desktop-v0.1.0).
npm run version:all:patch
npm run release:push
For the full package release flow, use:
npm run release:patch
This triggers the Desktop Release workflow (.github/workflows/desktop-release.yml).
License
MIT
