Run Paseo on a remote server
One app for your coding agents, on a VM you steer from your phone.
Shelley handles the setup. About 10 minutes.
Prefer a terminal?
curl -fsSL https://exe-staging.dev/deploy/paseo/prompt.txt | ssh exe.dev new --prompt=/dev/stdinPaseo is an open-source app for running coding agents: one interface for Claude Code, Codex, OpenCode and others, with a desktop app, native iOS and Android apps, a web app, and a CLI. The agents run in a daemon on one machine, and every app connects to it. Make that machine an exe.dev VM and they keep working when your laptop sleeps, while you check in from your phone.
Claude Code, Codex and OpenCode come preinstalled on exe.dev and use its LLM integration: no API keys to paste, and model usage billed to your exe.dev account.
What you get#
- The Paseo daemon running as a systemd service on port 6767 with its web app on, back after a reboot
- A random Paseo password in
~/.paseo/paseo.env, readable only by its owner - Claude Code and Codex ready in Paseo through exe.dev's LLM integration, with no API key to paste
- A Git project at
~/project, added to Paseo - Paseo's web app at port 6767, behind exe.dev login and Paseo's password
What's running, and where
https://my-paseo.exe.xyz:6767/
Paseo's web app in your phone's or laptop's browser, behind exe.dev login and Paseo's password
Paseo's iOS, Android and desktop apps
through Paseo's end-to-end encrypted relay, after pairing, with Paseo's password
ssh my-paseo.exe.xyz
your terminal, for the password, pairing and upkeep
Deploy with Shelley#
Click Deploy and Shelley will set up Paseo on a new VM, then check that it works. No config-file wrangling required.
Prefer a terminal?
curl -fsSL \
https://exe-staging.dev/deploy/paseo/prompt.txt \
| ssh exe.dev new --prompt=/dev/stdinWhat Shelley is told
Set up Paseo on this VM by following the exe.dev recipe at https://exe-staging.dev/deploy/paseo.md from top to bottom.
The recipe's example VM name is my-paseo. This VM's name is the output of `hostname`: use it wherever the recipe writes my-paseo. Skip the step that creates the VM; you are on it.
You are done when all of these are true. Check each one yourself:
- The Paseo daemon running as a systemd service on port 6767 with its web app on, back after a reboot
- A random Paseo password in `~/.paseo/paseo.env`, readable only by its owner
- Claude Code and Codex ready in Paseo through exe.dev's LLM integration, with no API key to paste
- A Git project at `~/project`, added to Paseo
- Paseo's web app at port 6767, behind exe.dev login and Paseo's password
Run the VM-side commands in "Install by hand" only, from "Install Paseo"
on. If `exeuntu configure` reports an existing user config, leave it
alone. Do not run `paseo daemon pair`: it turns on Paseo's relay, which
is the owner's choice. Verify that `systemctl is-active paseo` says
active, that `ss -ltn` shows `0.0.0.0:6767`, that the health check
prints `"status":"ok"`, and that the setup check prints `OK`. Never
print the password in your messages. Skip the backup, update and
troubleshooting sections and the FAQ. Finish by giving the owner the
browser URL and the `ssh ... cat .paseo/paseo.env` command from "Open
Paseo", with this VM's name, and tell them to follow "Add your phone"
next.
Finish with the URLs I should open.
Also at /deploy/paseo/prompt.txt. The recipe it follows is /deploy/paseo.md.
Install#
Deploy installs Paseo, runs it as a service with a password, and checks that an agent answers. To do it yourself:
Install by hand
On your computer, create a VM and connect. Pick any free name; if you already have a VM, skip the first command and use its name:
ssh exe.dev new --name=my-paseo
ssh my-paseo.exe.xyz
Install Paseo#
On the VM, connect Claude Code and Codex to the LLM integration, install Node.js 24 from NodeSource, and install the Paseo CLI, which includes the daemon:
exeuntu configure claude
exeuntu configure codex
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install -g @getpaseo/cli
paseo --version
Configure it#
Have the daemon listen on port 6767, where exe.dev's
HTTPS proxy can reach it, accept requests for *.exe.xyz,
and serve its web app. Then give it a random password, in a file only you
can read:
paseo daemon config set daemon.listen 0.0.0.0:6767
paseo daemon config set daemon.hostnames '[".exe.xyz"]'
paseo daemon config set features.webUi.enabled true
install -m 600 /dev/null ~/.paseo/paseo.env
echo "PASEO_PASSWORD=$(openssl rand -hex 16)" > ~/.paseo/paseo.env
Run it as a service#
Still on the VM, run the daemon with systemd, so it starts on every boot and restarts if it stops:
sudo tee /etc/systemd/system/paseo.service >/dev/null <<'EOF'
[Unit]
Description=Paseo daemon
After=network-online.target
Wants=network-online.target
[Service]
User=exedev
WorkingDirectory=/home/exedev
EnvironmentFile=/home/exedev/.paseo/paseo.env
Environment=PATH=/home/exedev/.local/bin:/usr/local/bin:/usr/bin:/bin
ExecStart=/usr/bin/paseo daemon run
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now paseo
sleep 5
curl -s localhost:6767/api/health
The health check prints "status":"ok". On its first start Paseo
downloads a local speech model (about 600 MB) for dictation, in the
background.
Add a project and check#
Give Paseo a project to work in. It's a Git repository, so you can review and undo whatever the agents change. Then run a one-line task through Paseo and archive it:
git init ~/project
paseo project create ~/project
id=$(paseo -q run --cwd ~/project --provider claude/haiku --title "Setup check" "Reply with exactly: OK")
paseo logs "$id" | tail -1
paseo archive "$id"
The paseo logs line prints OK. The paseo command on the VM talks to
the daemon directly, without the password.
Open Paseo#
Port 6767 is private: only people with access to the VM get past exe.dev's login, and Paseo asks for its password on top. On your computer, print the password:
ssh my-paseo.exe.xyz cat .paseo/paseo.env
Open https://my-paseo.exe.xyz:6767/ and log in to exe.dev. Paseo shows
Welcome to Paseo. Choose Direct connection and enter:
- Host:
my-paseo.exe.xyz - Port:
6767 - Use SSL: on
- Password: the part after
PASEO_PASSWORD=
Then Connect. Open the menu, choose New workspace, pick a model such as Haiku 5.5 under Select model, and type a task:
Write index.html: a one-page site for a very opinionated cat. Keep it short.
The agent works in ~/project on the VM and tells you what it changed.
Add your phone#
There are two ways in, and you can use both:
-
The browser. On your phone, open
https://my-paseo.exe.xyz:6767/, log in to exe.dev with the same account, and connect as above. Add the page to your home screen to open it like an app. -
The Paseo app, for iOS or Android. It can't sign in to exe.dev, so it goes through Paseo's relay instead: the daemon connects out to
relay.paseo.sh, and the app meets it there, end-to-end encrypted. On your computer, turn the relay on and print a pairing QR code:ssh -t my-paseo.exe.xyz paseo daemon pair --relayIn the app, choose Scan QR code, scan it, confirm the host, and enter your password when it asks. The pairing link below the QR code works too, under Paste pairing link.
The same pairing link connects the desktop app from any computer.
Start a task, lock your phone, and check back later: the work carries on without you. A few things worth knowing:
- Pick the agent and model under Select model. Claude and Codex models run through exe.dev's LLM integration, and OpenCode lists the integration's models next to its own free ones.
- Permissions: each agent has modes, from asking before every change
to acting on its own. Claude starts in Auto mode; change it under
Select model, or approve a waiting step on the VM with
paseo permit allow <agent> --all. - Talk instead of typing: the microphone in the message box dictates, using the speech model on the VM.
- Run agents side by side: choose New worktree under Isolation to give each one its own Git worktree. See Paseo's parallel development guide.
- Preview what it builds: ask the agent to serve the app on
0.0.0.0:8000, then openhttps://my-paseo.exe.xyz/. It's private until you share it. - Bring your code: connect a GitHub repo,
clone it on the VM, and add it with
paseo project create <folder>.
Warning
Anyone with the password, through the relay or past exe.dev's login, can run any command on the VM. Treat the password and pairing links like keys, and keep port 6767 private.
Back up and restore#
Commit and push your code; that's the copy that matters most. For a copy of the whole VM, run this on your computer (choose a free backup name):
ssh exe.dev cp my-paseo my-paseo-backup
Paseo keeps its agents, projects, settings, password and relay keys in
~/.paseo. To archive them on the VM, leaving out the speech model it can
download again, stop the daemon for a moment. The archive holds your
password and keys, so keep it private:
mkdir -p ~/backups
sudo systemctl stop paseo
tar -C ~ -czf ~/backups/paseo-$(date +%F).tar.gz --exclude=.paseo/models --exclude='.paseo/daemon.log*' .paseo
sudo systemctl start paseo
chmod 600 ~/backups/paseo-*.tar.gz
To restore one, on a VM with Paseo installed as above, replace
2026-10-31 with the archive's date:
sudo systemctl stop paseo
rm -rf ~/.paseo
tar -C ~ -xzf ~/backups/paseo-2026-10-31.tar.gz
sudo systemctl start paseo
paseo ls
Your agents are listed again, and paired phones reconnect with the same password.
Update#
On the VM, install the newest release and restart the daemon; running agent turns are interrupted, so pick a quiet moment:
sudo npm install -g @getpaseo/cli@latest
sudo systemctl restart paseo
paseo daemon status | grep daemonVersion
The web app comes with the daemon, so it updates too; the phone and desktop
apps update from their stores. Update the agents with
sudo exeuntu update claude, sudo exeuntu update codex and
sudo exeuntu update opencode, then restart Paseo.
Troubleshooting#
- The page doesn't load. On the VM,
systemctl status paseoandss -ltn | grep 6767: it should listen on0.0.0.0:6767. If not,journalctl -u paseo -n 50shows why, and~/.paseo/daemon.loghas the details. - The page loads but won't connect. Check Use SSL is on, the port
is
6767, and the password matches~/.paseo/paseo.env. Paseo's web app loads before you sign in, by design; agents stay behind the password. - The app says "Password required" after pairing. Remove the host in Settings → Connections (under your host) and pair again with Scan QR code or Paste pairing link, which ask for the password. Opening the pairing link straight in a browser skips that question.
- An agent is missing or unavailable.
paseo provider lslists what the daemon found. On the VM,claude -p "Reply with exactly: OK"andcodex exec "Reply with exactly: OK"show whether the agents work on their own; rerunexeuntu configure claudeorexeuntu configure codexif not, thensudo systemctl restart paseo. - An agent sits at
permission. It's waiting for you. Approve it in the app, or on the VM withpaseo permit lsandpaseo permit allow <agent> --all. - Changed the password? Edit
~/.paseo/paseo.env, runsudo systemctl restart paseo, and enter the new one on each device.
For everything else, see Paseo's docs and troubleshooting guide.
Frequently asked questions#
Does the Paseo phone app work with this?
Yes, through Paseo's relay: run paseo daemon pair --relay on the VM, scan the QR code with the app and enter your Paseo password. The app can't open the private address on port 6767 because it can't sign in to exe.dev; your phone's browser can, and gets the same app. See Add your phone.
Is the relay safe?
Paseo designed it to be untrusted: the daemon connects out to relay.paseo.sh, and traffic between it and your devices is end-to-end encrypted, so the relay sees only timing and sizes. The pairing link holds the daemon's public key, and the password travels inside the encrypted channel. The relay is open source, and Paseo's security page explains the design.
Can I use my own Claude or ChatGPT subscription?
Yes. On the VM, run claude auth login or codex login, after removing what exeuntu configure added: apiKeyHelper and env.ANTHROPIC_BASE_URL in ~/.claude/settings.json, and the exe-llm provider in ~/.codex/config.toml. Then run sudo systemctl restart paseo. Paseo uses whatever the agents' own command-line tools are signed in to.
How much does it cost?
Paseo is free and Apache-2.0 licensed, with no account. You pay for the VM as part of your exe.dev plan, and model usage through the LLM integration is billed to your exe.dev account. exe.dev keeps a list of models and prices.
Do the agents keep working when I close the app?
Yes. Agents run in the daemon on the VM, not on your phone, so you can lock it mid-task and open Paseo later to read the result, approve a step, or send the next message.
Paseo or T3 Code?
Both put coding agents on a server and give you web, desktop and phone apps for them. Paseo adds voice dictation, plugins, worktrees for parallel agents, and a relay that lets its phone app in without an account. T3 Code installs as one binary with a ready-made service. Both can run on one VM, on different ports.
Something's not working. Where do I look?
On the VM, systemctl status paseo and paseo daemon status say whether the daemon runs and which agents it found; its log is ~/.paseo/daemon.log. Troubleshooting covers the usual problems.
Updated Oct 31, 2026 · tested end to end Oct 31, 2026 · Markdown · manifest.json · Something wrong? Tell us