Skip to main content
The boxd CLI lets you manage VMs from your local terminal without SSH keys. Recommended for automation and coding agents.

Install

curl -fsSL https://boxd.sh/downloads/cli/cli.sh | sh
Installs to ~/.local/bin/boxd. Supports macOS (arm64) and Linux (x86_64, arm64). The installer also adds a Claude Code skill to ~/.claude/skills/boxd-cli/ so Claude Code knows how to use the CLI on your behalf.

Authentication

boxd login                    # opens browser for OAuth login
boxd logout                   # remove stored credentials
boxd whoami                   # show your user ID and SSH keys
You can also authenticate via token:
boxd --token=<TOKEN> list              # pass token directly
BOXD_TOKEN=<TOKEN> boxd list           # or via env var

Managing machines

boxd new --name=myapp                  # create a machine
boxd list                              # list your machines
boxd fork myapp --name=myapp-v2        # fork with full disk copy
boxd reboot myapp                      # reboot
boxd destroy myapp -y                  # destroy (requires -y or --confirm)
All commands accept --json for structured output.

Running commands

boxd exec myapp -- uname -a                           # run a command
boxd exec myapp -- 'cd /app && npm start'              # shell constructs work
boxd exec myapp -e API_KEY=secret -e DEBUG=1 -- CMD    # env vars
boxd exec myapp --timeout 30 -- CMD                    # timeout
boxd exec myapp --json -- echo hello                   # JSON: {"output":"hello\n","exit_code":0}

Interactive access

boxd connect myapp             # open interactive SSH session

Copying files

Paths after : are relative to /home/boxd unless starting with /. Max 100 MB.
boxd cp ./local.txt myapp:/home/boxd/remote.txt    # upload
boxd cp myapp:/home/boxd/remote.txt ./local.txt     # download
boxd cp myapp:/path/file -                          # download to stdout
echo data | boxd cp - myapp:/path/file              # upload from stdin

Proxy management

Every machine gets https://name.boxd.sh forwarding to port 8000 by default.
boxd proxy list --vm=myapp                             # list proxies
boxd proxy new api --vm=myapp --port=3001              # create subdomain
boxd proxy set-port --vm=myapp --port=3000             # change port
boxd proxy set-port --vm=myapp --port=auto             # auto-detect
boxd proxy delete api --vm=myapp                       # remove

Shell completions

boxd completions bash >> ~/.bashrc
boxd completions zsh >> ~/.zshrc

Global flags

FlagDescription
--jsonOutput as JSON
--api-urlAPI server URL (default: https://boxd.sh)
--tokenAuth token (overrides stored credentials)