Skip to content

Run OpenChamber on a remote server

The OpenCode workbench on an always-on VM, open from any browser or phone.

Deploy on exe.dev

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/stdin

OpenChamber 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 ~/project and a setup-check session that answered OK
  • OpenChamber's web app at port 3000, behind exe.dev login and the password
What's running, and where
Private https://my-openchamber.exe.xyz:3000/ OpenChamber in your laptop's or phone's browser, behind exe.dev login and OpenChamber's password
Private ssh my-openchamber.exe.xyz your terminal, for the password and upkeep
my-openchamber.exe.xyz exe.dev VM
OpenChamber 2.6 @openchamber/web from npm on Node.js 24, as a systemd user service :3000~/.config/openchamber
OpenCode 2 started and managed by OpenChamber; connected to exe.dev's LLM integration ~/.local/share/opencode (sessions, and worktrees under worktree/)
Your project ~/project

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/stdin
What 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.

OpenChamber on a phone: a finished session that edited index.html, +7 lines, with the agent's summary
A finished session on a phone. The agent ran on the VM; the phone only steered it.

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 open https://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 status and ss -ltn | grep 3000: it should listen on 0.0.0.0:3000. If not, journalctl --user -u openchamber -n 80 --no-pager says why, and openchamber logs follows the server's own log.
  • refuses to bind to 0.0.0.0 without UI authentication. The service started without a password. Run the startup enable command from "Run it as a service" again.
  • It stops after a reboot. loginctl show-user $USER -p Linger should say Linger=yes; run sudo loginctl enable-linger "$USER" if not.
  • "OpenCode is restarting" never clears. Check that opencode --version is 2.2.4 or newer and that ~/.config/opencode/opencode.json is valid JSON, then run systemctl --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-password and run the startup enable command 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