Run T3 Code on a remote server
Your coding agents on an always-on VM, steered from your phone.
Shelley handles the setup. About 5 minutes.
Prefer a terminal?
curl -fsSL https://exe.dev/deploy/t3code/prompt.txt | ssh exe.dev new --prompt=/dev/stdinT3 Code is an open-source control panel for coding agents: a web, desktop and phone app for Claude Code, Codex and others that run on one machine. Make that machine an exe.dev VM and the agents keep working when your laptop sleeps, while your phone reaches them over HTTPS behind exe.dev's login.
Claude Code and Codex 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#
- T3 Code running as a background service on port 3773, back after a reboot
- Claude Code and Codex ready in T3 Code through exe.dev's LLM integration, with no API key to paste
- A Git project at
~/project, added to T3 Code - T3 Code's web app at port 3773, behind exe.dev login and T3 Code's own pairing
What's running, and where
https://my-t3code.exe.xyz:3773/
T3 Code in your phone's or laptop's browser, after a one-time pairing link
ssh my-t3code.exe.xyz
your terminal, for pairing links and upkeep
Deploy with Shelley#
Click Deploy and Shelley will set up T3 Code on a new VM, then check that it works. No config-file wrangling required.
Prefer a terminal?
curl -fsSL \
https://exe.dev/deploy/t3code/prompt.txt \
| ssh exe.dev new --prompt=/dev/stdinWhat Shelley is told
Set up T3 Code on this VM by following the exe.dev recipe at https://exe.dev/deploy/t3code.md from top to bottom.
The recipe's example VM name is my-t3code. This VM's name is the output of `hostname`: use it wherever the recipe writes my-t3code. Skip the step that creates the VM; you are on it.
You are done when all of these are true. Check each one yourself:
- T3 Code running as a background service on port 3773, back after a reboot
- Claude Code and Codex ready in T3 Code through exe.dev's LLM integration, with no API key to paste
- A Git project at `~/project`, added to T3 Code
- T3 Code's web app at port 3773, behind exe.dev login and T3 Code's own pairing
Run the VM-side commands in "Set up T3 Code" only. If `exeuntu configure`
reports an existing user config, leave it alone. Do not create a pairing
link: they expire in five minutes and work once. Verify that
`t3 service status` says installed, that `ss -ltn` shows `0.0.0.0:3773`,
and that the setup-check thread prints `OK`. Skip "Prefer Paseo?", the
backup, update and troubleshooting sections, and the FAQ. Finish by
giving the owner the browser URL and the `ssh ... t3 pair` command from
"Pair your browser", with this VM's name, and tell them to follow "Add
your phone" next.
Finish with the URLs I should open.
Also at /deploy/t3code/prompt.txt. The recipe it follows is /deploy/t3code.md.
Set up T3 Code#
On your computer, create a VM and connect. Pick any free name; if you've already clicked Deploy or have a VM, skip the first command and use its name:
ssh exe.dev new --name=my-t3code
ssh my-t3code.exe.xyz
On the VM, connect Claude Code and Codex to the LLM integration and install
T3 Code with its official installer, which puts the t3 command in
~/.local/bin:
exeuntu configure claude
exeuntu configure codex
curl -fsSL https://t3.codes/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
Still on the VM, run T3 Code as a background service on port 3773, where exe.dev's HTTPS proxy can reach it, and give it a project. The project is a Git repository, so you can review and undo whatever the agents change:
mkdir -p ~/.t3
printf 'T3CODE_HOST=0.0.0.0\nT3CODE_PORT=3773\n' > ~/.t3/service.env
t3 service install
git init ~/project
t3 project add ~/project
Check it. The status says installed, and a one-line task through T3 Code
prints OK:
t3 service status
cd ~/project && t3 thread start --provider claudeAgent --model haiku \
--title "Setup check" --wait . "Reply with exactly: OK"
The service starts on every boot (exe.dev VMs keep user services running
without a login). Your threads and settings live in ~/.t3/userdata.
Pair your browser#
Port 3773 is private: only people with access to the VM get past exe.dev's login. T3 Code adds its own lock on top, so each browser pairs once with a one-time link. On your computer, make one:
ssh my-t3code.exe.xyz 'echo "https://$(hostname).exe.xyz:3773/pair#token=$(~/.local/bin/t3 pair --label laptop | sed -n "s/^Token: //p")"'
Open the link it prints within five minutes. exe.dev asks you to log in, then T3 Code pairs the browser and walks you through setup: Codex and Claude show as Ready, and there's nothing to import yet.
Tip
If T3 Code shows Pair with this environment instead, the token got lost on the way through exe.dev's login. Paste the 12 characters after
token=into the box, or run the command again for a fresh link.
Type a task into the box, such as:
Write index.html: a one-page site for a very opinionated cat. Keep it short.
The agent works in ~/project on the VM, and the thread shows the files it
changed.
Add your phone#
On your phone, open https://my-t3code.exe.xyz:3773/ and log in to exe.dev
with the same account. T3 Code asks for a pairing token.
On your laptop, in T3 Code, open Settings → Sharing & access, choose Create link, then Create link again, and Share next to the new link. Scan the QR code with your phone's camera, or type the code that Copy code only copies into the phone's Pairing token box. Add the page to your home screen to open it like an app.
Start a thread, lock your phone, and check back later: the work carries on without you. A few things worth knowing:
- Pick the agent and model in the box where you type. Codex and Claude both run through exe.dev; their usage and prices are on the LLM integration page.
- Permissions: new threads run with Full access, so agents act without asking. Change it under the message box, or read T3's permission modes.
- Preview what it builds: ask the agent to serve the app on
0.0.0.0:8000, then openhttps://my-t3code.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
t3 project add <folder>. - Revoke a device in Settings → Sharing & access, or on the VM
with
t3 auth session listandt3 auth session revoke <id>.
Warning
A paired device can run any command on the VM. Keep port 3773 private and treat pairing links like passwords.
Prefer Paseo?#
Paseo (Apache-2.0) does the same job with a different design: one app for Claude Code, Codex, OpenCode, Pi and more, with voice control, plugins, and native phone apps that reach the VM through an end-to-end encrypted relay, no account needed. It can run beside T3 Code on the same VM.
On the VM, install Node.js 24 and the Paseo CLI, have the daemon listen on port 6767 with its web app on, and protect it with a password:
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 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
Still on the VM, run it as a service that starts on boot:
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
curl -s localhost:6767/api/health
cat ~/.paseo/paseo.env
The health check prints "status":"ok", and the last line is your
password. On first start Paseo downloads local speech models (about 600 MB)
for dictation.
- In a browser, on your phone or laptop: open
https://my-t3code.exe.xyz:6767/, log in to exe.dev, choose Direct connection, and enter hostmy-t3code.exe.xyz, port6767, Use SSL on, and the password. - In the Paseo phone app: on the VM, run
paseo daemon pair --relayand scan the QR code it prints (or open the pairing link) with the app, then enter the password when it asks. This path skips exe.dev's login, so the password and pairing key are what keep others out.
Agents in Paseo ask before writing files unless you change their mode;
approve from the app, or with paseo permit allow <agent> --all on the VM.
Paseo keeps its data, keys and config in ~/.paseo, so include that
folder in your backups. See Paseo's docs for the
rest.
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-t3code my-t3code-backup
To keep T3 Code's threads and settings on their own, archive them on the VM. The archive includes the server's signing keys, so keep it private:
mkdir -p ~/backups
systemctl --user stop t3code
tar -C ~/.t3 -czf ~/backups/t3-userdata-$(date +%F).tar.gz userdata service.env
chmod 600 ~/backups/t3-userdata-*.tar.gz
systemctl --user start t3code
To restore one, on the VM (with T3 Code installed as above), replace
2026-10-30 with the archive's date:
systemctl --user stop t3code
rm -rf ~/.t3/userdata
tar -C ~/.t3 -xzf ~/backups/t3-userdata-2026-10-30.tar.gz
systemctl --user start t3code
cd ~/project && t3 thread list
Your threads are listed again, and paired devices stay paired.
Update#
On the VM, t3 update --yes installs the newest stable release and
restarts the service; running agent turns are interrupted, so pick a quiet
moment. Update the agents with sudo exeuntu update claude and
sudo exeuntu update codex, then t3 service restart. If an agent's
version doesn't work with T3 Code, a warning banner says so in the chat.
Troubleshooting#
- The page doesn't load. On the VM, run
t3 service status, thenss -ltn | grep 3773: it should listen on0.0.0.0:3773. If not, check~/.t3/service.envand runt3 service restart. The log is in~/.t3/userdata/logs/boot-service.log, andjournalctl --user -u t3codeshows the service starting and stopping. - The pairing link doesn't work. Links expire after five minutes and
work once. Make a new one. If the page asks for a token, paste the part
after
token=. - An agent isn't ready. Open Settings → Providers. 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. t3: command not found. Open a new shell, or use~/.local/bin/t3.Provider instance "claude" is disabledfromt3 thread start: T3 Code calls ClaudeclaudeAgentand Codexcodex.
For everything else, see T3 Code's docs.
Frequently asked questions#
Does the T3 Code phone app work with this?
Not through the private address above: the iOS and Android apps can't sign in to exe.dev, so use your phone's browser, which gets the same app. For the native app, run t3 connect on the VM and sign in to T3 Connect, T3's own tunnel service (free for up to 3 machines). See T3's remote access docs.
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 t3 service restart. T3 Code can also sign in to ChatGPT itself, from Settings → Providers.
How much does it cost?
T3 Code is free and MIT-licensed. 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 tab?
Yes. Threads run on the VM, not in your browser, so you can lock your phone mid-task and open the page later to read the result, answer a question, or send the next message.
T3 Code or Paseo?
Both put coding agents on a server and give you desktop, web and phone apps for them. T3 Code installs as one binary with a ready-made service; Paseo needs Node.js and adds voice control, plugins, and an end-to-end encrypted relay for its phone app that needs no account. They can run side by side on one VM; see Prefer Paseo?.
Something's not working. Where do I look?
On the VM, t3 service status says whether the service is running and where its log is (~/.t3/userdata/logs/boot-service.log). Troubleshooting covers the usual problems.
Updated Oct 30, 2026 · tested end to end Oct 30, 2026 · Markdown · manifest.json · Something wrong? Tell us