Skip to main content
This is where boxd machines are ideal for. A boxd machine is a real computer you can develop on every day. One command gives you a full Ubuntu 24.04 VM with a persistent 100 GB disk, 2 vCPU, 8 GiB of RAM, and a public HTTPS URL. That is the default shape, and bigger/different machines are available on request via contact@boxd.sh. You work in it from wherever you already work: the web terminal in the console, your own terminal (Ghostty, iTerm, anything), or your favorite IDE like Cursor or VS Code. Leave it running, and an idle machine hibernates on its own and costs effectively nothing to keep around.

boxd new boots a fresh machine in milliseconds.

Create one and get in

You get a shell on the machine straight away. Type exit or Ctrl-D to come back to your local shell.

Work in your editor

The SSH alias is real SSH config, so any Remote-SSH editor sees your machines in its picker. In VS Code, Cursor, or Antigravity, run Remote-SSH: Connect to Host and pick myapp.boxd. JetBrains Gateway and Zed work the same way. From the console you can also hit Open in Editor on any machine and land straight in it.

Open in Editor drops you into the machine over SSH.

Everything is already installed

Each machine ships developer-ready:
  • Languages: Python 3 with uv and pipx, Go, build-essential, Node.js 24 via nvm
  • Agents: Claude Code, Codex, and OpenCode, already configured for the environment (Coding agents)
  • Containers: Docker, Compose, and Buildx with the daemon running (Run Docker)
  • Tools: git, gh, jq, ripgrep, sqlite3, rsync, ffmpeg, ImageMagick, headless Chrome
  • Editors: vim and neovim on the machine, plus full SSH for everything remote
You land as the boxd user with passwordless sudo, so anything you would install on a laptop installs here too.

Your app is live while you build it

This is a mental model shift, namely that you don’t have a deployment target anymore. Every machine serves https://myapp.boxd.sh the moment something listens on port 8000. TLS, HTTP to HTTPS redirects, and WebSockets are handled for you. Start your dev server and paste the URL into a DM. If your app uses a different port, repoint the proxy:
Add subdomain proxies for extra services on the same machine, like api.myapp.boxd.sh. See Proxies.

Your laptop and boxd machines

With the client utilities enabled on your Mac, a boxd machine can reach back to your laptop. You can paste screenshots from your Mac’s clipboard straight into Claude Code running over SSH, read local files with boxd local read, and drive a real Chrome on your Mac from inside the VM (Launch a Browser).

Persistence by default

The disk persists across reboots, suspends, and resumes, so your checkouts, dependencies, and dotfiles stay put. On top of that:
  • Snapshots turn a configured workspace into a named image. Create a fresh machine from it whenever you, a teammate, or an agent needs one.
  • Checkpoints are an undo button. Save one before a risky change and rewind the same machine if it goes wrong.
  • Env vars and secrets are set once at the account level and injected into every machine you own, so there are never .env files to copy around.
  • Integrations connect GitHub, Linear, and Slack once, and every personal machine can use them.

Work together

Open a machine to your whole team with one command:
Every org member can now connect to the same machine. Sharing wipes your personal agent logins first, so a teammate can never read your tokens. To do private, authenticated work on a copy of a shared machine, fork it. The fork is private to you by default. See VM sharing.

What it costs when you step away

A machine with no inbound traffic hibernates after four hours by default. Its state is written to disk and it costs effectively nothing while asleep. The next SSH connection or HTTP request wakes it in milliseconds, exactly where you left it.
The idle timers watch network traffic, not CPU. A long build or training run with no inbound traffic looks idle and gets hibernated mid-job. Disable the timer on machines that work quietly: boxd machine config set myapp auto-hibernate.timeout 0. See Suspend, resume, and hibernate.