Run OpenChamber on a remote server
The OpenCode workbench on an always-on VM, open from any browser or phone.
Shelley handles the setup. About 10 minutes.
Prefer a terminal?
curl -fsSL https://exe-staging.dev/deploy/openchamber/prompt.txt | ssh exe.dev new --prompt=/dev/stdinOpenChamber is an open-source workspace for OpenCode: a web, desktop and phone app where you start agent sessions, run them side by side in Git worktrees, review the diffs, and open the terminal. Its server mode is meant for a machine that stays on. Make that machine an exe.dev VM and the agents keep working when your laptop sleeps, while any browser reaches them over HTTPS behind exe.dev's login. No tunnel needed.
OpenCode comes preinstalled on exe.dev and uses its LLM integration for Claude, GPT and open-weight models: no API keys to paste, and model usage billed to your exe.dev account.
What you get#
- OpenChamber 2.6.1 running as a service on port 3000, back after a reboot
- OpenCode connected to Claude, GPT and open models through exe.dev's LLM integration, with no API key to paste
- A random UI password in
~/.config/openchamber/ui-password, readable only by you - A Git project at
~/projectand a setup-check session that answeredOK - OpenChamber's web app at port 3000, behind exe.dev login and the password
What's running, and where
https://my-openchamber.exe.xyz:3000/
OpenChamber in your laptop's or phone's browser, behind exe.dev login and OpenChamber's password
ssh my-openchamber.exe.xyz
your terminal, for the password and upkeep
Deploy with Shelley#
Click Deploy and Shelley will set up OpenChamber on a new VM, then check that it works. No config-file wrangling required.
Prefer a terminal?
curl -fsSL \
https://exe-staging.dev/deploy/openchamber/prompt.txt \
| ssh exe.dev new --prompt=/dev/stdinWhat Shelley is told
Set up OpenChamber on this VM by following the exe.dev recipe at https://exe-staging.dev/deploy/openchamber.md from top to bottom.
The recipe's example VM name is my-openchamber. This VM's name is the output of `hostname`: use it wherever the recipe writes my-openchamber. Skip the step that creates the VM; you are on it.
You are done when all of these are true. Check each one yourself:
- OpenChamber 2.6.1 running as a service on port 3000, back after a reboot
- OpenCode connected to Claude, GPT and open models through exe.dev's LLM integration, with no API key to paste
- A random UI password in `~/.config/openchamber/ui-password`, readable only by you
- A Git project at `~/project` and a setup-check session that answered `OK`
- OpenChamber's web app at port 3000, behind exe.dev login and the password
Run the VM-side commands in "Install by hand" only, from "Install
OpenChamber" on. If `~/.config/opencode/opencode.json` holds more than
exe.dev's placeholder (`$schema` and `autoupdate`), add the `model` and
`providers` settings to it instead of replacing it. Verify that
`systemctl --user is-active openchamber` says active, that `ss -ltn`
shows `0.0.0.0:3000`, that `curl -s -o /dev/null -w '%{http_code}'
localhost:3000/api/config` prints `401` (the password is on), and that
the setup check prints `OK`. Never print the UI 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 .config/openchamber/ui-password` command from "Open
OpenChamber", with this VM's name, and tell them to add `~/project` as
a project and then follow "Add your phone".
Finish with the URLs I should open.
Also at /deploy/openchamber/prompt.txt. The recipe it follows is /deploy/openchamber.md.
Install#
Deploy installs OpenChamber, runs it as a service with a password, and checks that a model 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-openchamber
ssh my-openchamber.exe.xyz
Install OpenChamber#
On the VM, update OpenCode, install Node.js 24 from NodeSource (OpenChamber
needs 24.14 or newer; the VM's own is older), and install OpenChamber from
npm. This is what OpenChamber's
install script
does, with the version pinned. Global npm packages go in ~/.local, so
openchamber update needs no sudo:
sudo exeuntu update opencode
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt-get install -y nodejs
npm config set prefix ~/.local
npm install -g @openchamber/web@2.6.1
export PATH="$HOME/.local/bin:$PATH"
openchamber --version
It prints 2.6.1. npm warns that node-pty has install scripts it didn't
run; that's fine, since the terminal uses the prebuilt copy that ships with
it.
Connect OpenCode to exe.dev's models#
Point OpenCode's Anthropic, OpenAI and Fireworks providers at exe.dev's LLM gateway, the same settings as on the OpenCode page. OpenChamber starts OpenCode itself, and OpenCode reads this file:
mkdir -p ~/.config/opencode
cat > ~/.config/opencode/opencode.json <<'EOF'
{
"$schema": "https://opencode.ai/config.json",
"model": "anthropic/claude-sonnet-5-5",
"providers": {
"anthropic": { "settings": { "baseURL": "https://llm.int.exe.xyz/anthropic/v1" } },
"openai": { "settings": { "baseURL": "https://llm.int.exe.xyz/openai/v1" } },
"fireworks-ai": { "settings": { "baseURL": "https://llm.int.exe.xyz/fireworks/inference/v1" } }
}
}
EOF
Run it as a service#
Give OpenChamber a random password, in a file only you can read. Then install its own startup service: a systemd user service that listens on port 3000, where exe.dev's HTTPS proxy can reach it, and starts on every boot:
mkdir -p ~/.config/openchamber
install -m 600 /dev/null ~/.config/openchamber/ui-password
openssl rand -hex 12 > ~/.config/openchamber/ui-password
OPENCHAMBER_UI_PASSWORD="$(cat ~/.config/openchamber/ui-password)" \
openchamber startup enable --port 3000 --host 0.0.0.0 --no-env-snapshot
exe.dev VMs keep user services running without a login, and
--no-env-snapshot keeps your shell's variables out of the service. The
service keeps its own copy of the password in
~/.config/openchamber/startup.env. Check it:
sleep 5
systemctl --user is-active openchamber
ss -ltn | grep ':3000'
curl -s -o /dev/null -w '%{http_code}\n' localhost:3000/api/config
Expect active, a line with 0.0.0.0:3000, and 401: the API won't
answer without the password.
Add a project and check#
Make a project folder. It's a Git repository, so you can review and undo whatever the agents change. Then run a one-line session through OpenChamber:
git init ~/project
id=$(openchamber session create --dir ~/project --title "Setup check" --json | jq -r .sessionId)
openchamber session send --session "$id" --dir ~/project \
--model anthropic/claude-haiku-5-5 --prompt "Reply with exactly: OK" \
--wait --last-assistant
The last line it prints is OK. The openchamber command on the VM talks
to the server directly, without the password.
Open OpenChamber#
Port 3000 is private: only people with access to the VM get past exe.dev's login, and OpenChamber asks for its password on top. On your computer, print the password:
ssh my-openchamber.exe.xyz cat .config/openchamber/ui-password
Open https://my-openchamber.exe.xyz:3000/ and log in to exe.dev.
OpenChamber shows Unlock OpenChamber. Enter the password, tick Trust
this device so it remembers this browser for a week, and unlock.
Add your project: choose the folder icon (Add project) at the top of
the sidebar, pick project, and Add. Then type a task into the box:
Create index.html: a one-page site for a bakery that sells only sourdough. Keep it short.
The answer streams in as the agent works in ~/project on the VM, and the
session panel shows the files it changed and what the turn cost. The
terminal button on the right opens a shell on the VM in the same tab.
Add your phone#
On your phone, open https://my-openchamber.exe.xyz:3000/, log in to
exe.dev with the same account, and unlock with the password. Use your
browser's Add to Home Screen to open it like an app.
Start a session, lock your phone, and check back later: the work carries on without you. A few things worth knowing:
- Pick a model under the message box. Claude, GPT and Fireworks' open
models (Kimi, GLM, DeepSeek) all run through exe.dev, and Multi-run
gives one task to up to five of them at once, each in its own worktree.
Models under
opencode/are OpenCode's own and don't go through exe.dev. - Run sessions side by side: choose New worktree… or Quick
worktree in the branch menu above the message box. Worktrees live under
~/.local/share/opencode/worktree/on the VM's persistent disk. See Worktree Sessions. - Let it keep going: Session Goals keep an agent working toward a finish line, and scheduled tasks run a prompt daily or on a cron schedule. Both run on the VM, so they don't need your laptop.
- Preview what it builds: ask the agent to serve the app on
0.0.0.0:8000, then openhttps://my-openchamber.exe.xyz/. It's private until you share it. OpenChamber's built-in browser panel only reaches the VM's dev servers from its desktop app.
Warning
Anyone with the password who gets past exe.dev's login can run any command on the VM. Keep port 3000 private, and only share the VM with people you'd give your SSH key to.
Bring your repositories#
Connect a GitHub repo to the VM, then clone it in OpenChamber's terminal, or over SSH:
git clone https://github.int.exe.xyz/you/your-repo.git ~/your-repo
Add the folder with Add project. Commits, pulls and pushes from OpenChamber's Git panel go through the integration, so no GitHub token sits on the VM. OpenChamber's issue and pull request board is the exception: it needs its own GitHub sign-in, under Settings → Integrations, which stores a token on the VM. Skip it if you don't need the board.
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-openchamber my-openchamber-backup
To keep OpenChamber's settings and OpenCode's sessions on their own, archive them on the VM. The archive holds the UI password and OpenChamber's signing keys, so keep it private:
mkdir -p ~/backups
systemctl --user stop openchamber
tar -C ~ -czf ~/backups/openchamber-$(date +%F).tar.gz \
.config/openchamber .config/opencode .local/share/opencode
chmod 600 ~/backups/openchamber-*.tar.gz
systemctl --user start openchamber
To restore one, on a VM with OpenChamber installed and its service set up
as above, replace 2026-11-07 with the archive's date:
systemctl --user stop openchamber
rm -rf ~/.config/openchamber ~/.local/share/opencode
tar -C ~ -xzf ~/backups/openchamber-2026-11-07.tar.gz
systemctl --user start openchamber
openchamber session list --dir ~/project
Your sessions are listed again, and trusted browsers stay signed in. On a
new VM, run the startup enable command again after restoring.
Update#
On the VM, update OpenChamber first, then OpenCode:
openchamber update
sudo exeuntu update opencode
systemctl --user restart openchamber
openchamber update installs the newest release with npm and restarts the
service with the same port and password. Restarting interrupts running
turns, so pick a quiet moment. To stay on a version you've tried, run
npm install -g @openchamber/web@<version> and restart instead. Read the
release notes first:
OpenChamber releases every few days.
Troubleshooting#
- The page doesn't load. On the VM, run
openchamber statusandss -ltn | grep 3000: it should listen on0.0.0.0:3000. If not,journalctl --user -u openchamber -n 80 --no-pagersays why, andopenchamber logsfollows the server's own log. refuses to bind to 0.0.0.0 without UI authentication. The service started without a password. Run thestartup enablecommand from "Run it as a service" again.- It stops after a reboot.
loginctl show-user $USER -p Lingershould sayLinger=yes; runsudo loginctl enable-linger "$USER"if not. - "OpenCode is restarting" never clears. Check that
opencode --versionis 2.2.4 or newer and that~/.config/opencode/opencode.jsonis valid JSON, then runsystemctl --user restart openchamber. - A model fails. On the VM,
cd ~/project && opencode run -m anthropic/claude-haiku-5-5 "Reply with exactly: OK"shows whether OpenCode reaches exe.dev's LLM gateway on its own. - Change the password. Write a new one to
~/.config/openchamber/ui-passwordand run thestartup enablecommand again. Every browser has to unlock again, and saved passkeys are cleared. openchamber: command not found. Open a new shell, or use~/.local/bin/openchamber.
For everything else, see OpenChamber's troubleshooting guide.
Frequently asked questions#
Why keep OpenChamber's password behind exe.dev's login?
They guard different things. exe.dev's login decides who reaches port 3000: you, and anyone you share the VM with. OpenChamber's password decides who gets an agent and a terminal on the VM. OpenChamber also refuses to listen beyond the VM itself without one, unless you set OPENCHAMBER_ALLOW_UNAUTHENTICATED_LAN=true. With Trust this device ticked you type it once a week per browser, and you can add a passkey under Settings → OpenChamber → Passkeys.
Do I need a Cloudflare tunnel, ngrok or the Private Relay?
Not for a browser. exe.dev's HTTPS proxy already gives the VM a private HTTPS address, so skip openchamber tunnel. The native desktop, iOS and Android apps can't sign in to exe.dev, though; for those, OpenChamber's own end-to-end encrypted Private Relay connects out from the VM, so nothing new is exposed. We tested the browser, not the native apps.
Can I use my own subscription or API key?
Yes. Remove that provider from the providers section of ~/.config/opencode/opencode.json, run systemctl --user restart openchamber, then connect it in Settings → Providers (ChatGPT, GitHub Copilot or an API key). OpenCode then talks to that provider directly instead of through exe.dev.
How much does it cost?
OpenChamber and OpenCode are 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; OpenChamber shows each session's cost as it goes.
OpenChamber, T3 Code or Paseo?
OpenChamber is built on OpenCode alone, so you get every model OpenCode can reach, plus multi-run, session goals and scheduled tasks. T3 Code and Paseo drive Claude Code and Codex as well. All three run one agent per Git worktree, and they can share a VM on different ports. Leaving Conductor Cloud? See moving from Conductor Cloud.
Something's not working. Where do I look?
On the VM, openchamber status and openchamber startup status say whether it's running, and journalctl --user -u openchamber -n 80 --no-pager shows why it stopped. Troubleshooting covers the usual problems.
Updated Nov 7, 2026 · tested end to end Nov 7, 2026 · Markdown · manifest.json · Something wrong? Tell us