Skip to main content
Every machine has the boxd command pre-installed. Authentication is automatic — no SSH keys or tokens needed. This lets agents and scripts running inside a machine manage other machines directly. Like the laptop CLI, the surface is a nested tree: machine (alias m), snapshots (alias snap), manage, env, local, plus info for the current machine and top-level new / connect shortcuts. There’s no auth or config group — auth is automatic, and CLI settings live on the laptop. remove is the canonical delete verb (alias rm).
State-changing and destructive verbs require an explicit other machine — you can’t stop, reboot, or destroy the machine you’re currently inside.

Commands

Aliases: list/ls, remove/rm, connect/ssh, get/info. All commands accept --json for structured output.

pause vs reboot

  • pause / resume: warm. Freezes the VMM process, keeps memory, running processes, and open sockets intact. Resume is sub-millisecond. Same mechanism as auto-suspend, but user-triggered. Status becomes standby.
  • reboot: cold. Kills the VMM process and spawns a new one. Memory lost, takes ~2s.

Organizations & sharing

If you belong to an organization, boxd machine share NAME makes a machine reachable by every member; boxd machine unshare NAME makes it private to you again. When a user asks to “make this machine public,” they mean share it with the org — the *.boxd.sh URL is already public. In-VM you’re always in the owner’s active org context; switching orgs is a laptop-side action (boxd auth switch).
Sharing wipes the machine’s in-VM agent credentials (~/.claude/.credentials.json, ~/.codex/auth.json, ~/.local/share/opencode/auth.json) the instant it goes shared — so do not boxd machine share the machine you’re working in, or you’ll be logged out mid-task. Share a different idle machine, or make it the last step and re-authenticate afterward. Unsharing restores the Claude login automatically; forking a shared machine gives a private fork with logins intact. See Share a VM.

Connected integrations

boxd manage integrations (no subcommand) is the live source of truth for which external accounts the owner has wired into this machine, how to use each, and what else can still be connected. Run it rather than guessing; new integrations appear automatically.
Each connected integration lists its access methods tagged by kind — an env var + API endpoint (graphql/api), a CLI (cli), an MCP server (mcp), or git credentials (git). For example, a connected Linear exposes LINEAR_ACCESS_TOKEN for its GraphQL API, and Slack exposes SLACK_BOT_TOKEN / SLACK_USER_TOKEN / SLACK_TEAM_ID. The output also lists anything available to connect with the exact connect command. Connecting acts on the owner’s personal + private machines; a human does the browser approval. See Integrations.

Env vars & secrets

Set environment variables and secrets that boxd injects into every machine you own. Env vars and secrets share one command — --secret selects the sealed, write-only store. See Env vars & secrets for scopes, naming, and how they’re injected.

Running commands in other machines

The remote command’s stdout and stderr are merged into a single output stream on this CLI. If you need to filter them separately (e.g. 2>/dev/null to drop warnings), either redirect inside the command ('cmd 2>/dev/null') or use the external CLI / SDK from outside the machine, which preserve the split.

Copying files between machines

Paths after : are relative to /home/boxd unless they start with /. Uploads stream automatically — no inherent file-size cap.

Proxy management

Defaults to the current machine when --vm is omitted.

Exposing raw TCP/UDP ports

Subdomain proxies route HTTPS only. To expose a database, an SSH daemon, or any non-HTTP service, boxd machine expose opens a raw TCP/UDP port on the machine’s public proxy, forwarded straight to a port inside. The public port is allocated from the 40000–60000 range; connect on name.boxd.sh at that port. See Port forwarding. In-VM, expose PORT defaults to the current machine; pass a name to expose another.
Up to 3 forwarded ports per machine; owner-only.

Local machine access

When client utilities are enabled on the user’s laptop (boxd config set client-utils.enable true), the internal CLI can access files and a browser on the user’s local machine:
These commands need the BOXD_PROXY_ENDPOINT and BOXD_DEVICE_ID environment variables, which boxd injects into the session automatically when the device you connect from has client utilities enabled.

How it works

The internal CLI is authenticated automatically — the machine you’re inside identifies you, so there is nothing to configure and no token to manage. It acts as the account that owns the machine.
Do NOT try to ssh name.boxd.sh from inside a machine — machines don’t have your SSH keys. Use the boxd CLI to run commands and move files between machines.

Reaching another machine’s services

To hit a running service on another of your machines directly over the private network, resolve it by name: inside any machine, <vmname>.boxd resolves to that machine’s private IP.
Resolution is owner-scoped (only your own machines resolve) and works across workers. Only the bare <vmname>.boxd form resolves; everything else falls through to normal upstream DNS. See VM-to-VM networking.

Delegating work to agents

Claude Code is pre-installed in every machine. Start it non-interactively and capture the session ID for follow-ups:
The session ID is the handoff mechanism between orchestrator, in-machine agent, and human user.