Warpdrive Alpha

CLI guide

Alpha is the engine underneath Warpdrive: it builds an isolated container per project and runs your coding agents inside it. This page is the terminal way in — install it, start it, get an instance running, and pair it to a gateway so the desktop and phone apps can drive it. Same engine either way.

Version 0.10.0. Everything below works on a machine with nothing else installed and no account. Once the engine is running, warpdrive --help is the authoritative command list for the build you actually have.

What the engine is#

One warpdrive process on your machine manages instances. An instance is a Docker container with your project folder bind-mounted at /ws, a tmux server for the agents to live in, whichever coding CLIs you enabled, and its own MCP servers. Your code never leaves the machine.

Nothing about that requires a GUI, an account, or an internet connection. The TUI, the desktop app, and the phone app are three front ends over that same engine, and the terminal is the one that needs the least installed.

Console or app?#

They are two front ends over one engine, so this is not a fork in the road you have to commit to. Most people run the app for daily work and reach for the console when they want to automate something or when the machine doing the work has no screen.

Console — the CLI

Reach for it when

  • The machine is headless. A server, an old laptop in a closet, a box you only ever SSH into.
  • You want it scripted. warpdrive build and warpdrive attach are enough to drive an instance from CI, cron, or a Makefile.
  • You live in the terminal. warpdrive attach drops you straight into the agent's tmux session with your own config and keybindings.
  • Nothing hosted is involved. No account, no gateway, no network — the engine on its own is enough.
Console — the trade

What you give up

  • No Store. Marketplace apps, creator installs, and one-tap starting points live in the app.
  • No chat surface. Basic mode's assistant, conversations, and previews are app features.
  • No phone. The console is where you are sitting; the app follows you to another room.
  • You wire your own workflow. Fleet views, queues, and diffs are things the app gives you and the terminal does not.
  • One machine at a time. Making several machines feel like one fleet is what pairing to a gateway is for.
App — desktop, web, mobile

Reach for it when

  • You want the whole deck. Instances, workspaces, orchestrators, snapshots, and diffs in one view.
  • You want the Store. Install an app or an orchestrator without writing a manifest first.
  • You move around. Pair by QR and pick the same run up on your phone.
  • You want identity and notifications. Accounts, sign-in, and push come from the gateway side.
  • Someone else has to use it. Handing a teammate a URL beats handing them a terminal.
App — the trade

What you give up

  • A gateway has to exist. The gateway app bundles one; the mobile app is a client only and never hosts one.
  • Automation is indirect. The app is for driving work by hand; scripted work belongs in the console.
  • More moving parts. More to install, sign in to, and keep running than one tarball.

The gateway app already contains this engine — installing it is not an alternative to Alpha, it is Alpha plus a GUI and a gateway.

The usual shape. Install the gateway app on the machine you sit at. Install the Alpha tarball on every other machine you want doing work, and warpdrive remote pair each one to your gateway. The app becomes the console for all of them, and every machine still runs its own containers on its own disk.

Install#

RequirementNeeded for
Node.js 20+Everything. The bundle is JavaScript plus launcher scripts, not a native binary.
A container runtimeInstances. Pairing, the relay, and remote status work without one. Docker, Podman, nerdctl, and Apple Container are picked up automatically; point WARPDRIVE_CONTAINER_CLI at anything else that speaks the docker CLI.
tmux (host)Only for warpdrive attach. Instances run their own tmux inside the container regardless.

Runs on macOS, Windows, and Linux. Pick the archive for your machine — macos-arm64, macos-x64, linux-x64, linux-arm64, or the Windows zip. They differ only in the bundled TUI binary, which is native code. Optional native accelerators fall back to pure JS off their build architecture.

tar -xzf warpdrive-alpha-macos-arm64.tar.gz -C ~/
cd ~/warpdrive-alpha-*
./install.sh          # or double-click "Install Warpdrive.command"
warpdrive -h

The installer puts warpdrive on your PATH and nothing else — /usr/local/bin when it can write there, ~/.local/bin otherwise. It checks for Node and a container runtime and tells you what is missing rather than installing either behind your back, and it never touches an engine it did not start.

Extract somewhere permanent and keep the folder intact — the launcher resolves the engine and the TUI binary next to itself. Moving the whole folder later is fine; copying warpdrive out of it is not, which is why the line above symlinks. On Windows the entry point is warpdrive.cmd.

To upgrade, unpack the new archive beside the old one and repoint the symlink. State lives in ~/.warpdrive/, not in the bundle, so instances, pairings, and config survive.

Quickstart#

Same four steps on macOS, Linux, and Windows. Docker (or Podman) has to be running before the first one.

  1. Point it at your projects

    warpdrive set-workspace-root ~/code   # the folder your repos live in

    Saved to ~/.warpdrive/config.json. Skip this if you only ever work in one folder — every command below defaults to the directory you are standing in.

  2. Build an instance for a project

    cd ~/code/my-project
    warpdrive build      # builds the container for this folder and starts it

    The first build pulls and builds the image, so give it a few minutes. Your folder is mounted at /ws inside the container — it is the real folder, so edits inside the box are edits on disk.

  3. Sit down inside it

    warpdrive attach
    # Created tmux session "warpdrive-my-project". Press <prefix>+s to switch.

    Ordinary tmux from there — start Claude Code, Codex, or whatever you enabled, and <prefix>+d detaches and leaves every agent running.

  4. Or drive it from the TUI

    warpdrive            # the full-screen console: create, start, stop, attach

    The TUI does everything build and attach do, plus instance management, and it is the easier way in if you are just looking around.

Want the apps too? Pair this machine to a hosted gateway with warpdrive remote pair and the desktop and phone apps can drive these same instances. The containers and the code stay here.

Concepts#

TermWhat it means
InstanceOne Docker container plus its state. Owns a workspace, a tmux server, its agents, and its MCP servers.
WorkspaceThe host folder bind-mounted at /ws. Survives stop, start, and rebuild; captured by snapshots; deleted only when you delete the folder yourself.
ProviderA coding agent CLI available inside the box — claude-code, codex, copilot, opencode — or a raw API credential. You sign in to it inside the instance; keys stay on your machine.
OrchestratorA Git repo with a manifest that declares the sessions, background processes, and actions an instance should have. It turns an instance from a box into a workflow.
MCP serverA tool server wired into the agents. Per-instance ones follow the instance lifecycle; global ones are shared across instances.
SnapshotA point-in-time copy of the workspace. Previewable before you restore it.
RelayOne outbound authenticated WebSocket from your machine to a hosted gateway. The gateway never dials in; nothing has to be port-forwarded.

Command reference#

CommandWhat it does
warpdriveLaunch the TUI. Starts the engine first if it is not already running, and stops it again on exit — an engine you started yourself is left alone.
warpdrive tuiThe same thing, explicitly.
warpdrive serveRun the engine headless, logging to stdout. This is what you put behind systemd or a LaunchAgent.
warpdrive attachAttach to the tmux session of the instance owning the current directory.
warpdrive buildBuild an instance from the saved config without the TUI.
warpdrive set-workspace-root <path>Set the default project root in ~/.warpdrive/config.json.
warpdrive remote …Pair with a hosted gateway, run the relay, and approve what it may touch. Details below.
warpdrive local-ai …Install a model that runs on this machine and point the sandbox agents at it, so no API key is needed. Local AI guide.
warpdrive --helpThe full list, straight from the binary you have.

warpdrive attach#

attach resolves the instance from your current directory and opens its first session in your own terminal. Run it again later and it reports the existing session instead of creating a second one. The TUI's attach and this command are the same mechanism, so they cannot drift apart.

Exit codeMeaning
0Attached, or reported an existing session.
2No instance matched the current directory.
3An instance matched but is not attachable — usually stopped.

Pair with a gateway#

This is the free, private path: your code and your containers stay on your machine while a hosted gateway provides identity, notifications, and the Store. Your machine opens one outbound authenticated WebSocket — the gateway never dials into you, so there is nothing to port-forward and nothing to expose.

# mint a pairing code in the desktop or mobile app first (they expire in 10 minutes)
warpdrive remote pair --gateway=https://your-gateway --code=XXXX-XXXX-XXXX
warpdrive remote relay

# keep it up across reboots (macOS)
warpdrive remote install-agent
SubcommandWhat it does
pair --gateway=<url> --code=<code> [--device-name=<name>]Redeem a pairing code and save the device credential locally.
relay [--once]Hold the outbound device WebSocket open, reconnecting as needed. --once runs a single session.
status [--json]Show the saved pairing — device, realm, gateway, config path — with the credential redacted.
bind-workspace --workspace-id=<id> --path=<abs-path> [--display-name=<name>]Approve one local folder for one backend workspace ID.
bind-provider --provider-id=<id> --provider=<codex|claude-code|opencode|copilot>Approve a backend provider ID for a local provider.
list-workspace-bindings [--json]Show approved workspace bindings and where they are stored.
list-provider-bindings [--json]Show approved provider bindings.
install-agent [--no-load]Install and load the macOS LaunchAgent for the relay.
uninstall-agentRemove that LaunchAgent.

Pairing alone grants nothing. The hosted side can only reach a workspace or provider you have explicitly bound. Unbound IDs are refused. An approved path is the security boundary, so keep it as narrow as the work needs — bind the project folder, not your home directory.

--json is available on every read command and always redacts the device credential, which makes these safe to pipe into jq in a script or a log.

Configuration#

Precedence is project .warpdrive/config.json → global ~/.warpdrive/config.json → built-in defaults. Drop a project file in a repo and it wins for that repo only; everything else falls back to the global one.

Extra mounts#

{
  "sandbox": {
    "sshPort": 2222,
    "mounts": [
      { "hostPath": "/Users/you/shared-data", "containerPath": "/data", "readOnly": false },
      { "hostPath": "/Users/you/secrets",     "containerPath": "/secrets", "readOnly": true }
    ]
  }
}

hostPath must be absolute. readOnly defaults to false. The workspace folder is always mounted at /ws and does not need an entry here.

Environment variables#

VariableDefaultEffect
WARPDRIVE_WORKSPACE_ROOTfrom configDefault project root when creating instances. Same thing set-workspace-root writes, for when you would rather set it per shell.
WARPDRIVE_API_PORT7777Port the engine listens on locally. Change it if something else already owns 7777.
WARPDRIVE_HOST_HOMEyour home dirRoot for ~/.warpdrive/ state — instances, pairings, config.
WARPDRIVE_TMUX_SOCKETWarpdrive's owntmux socket name, so Warpdrive never collides with your personal tmux server.

A scratch engine that cannot disturb your real instances is those first three together:

WARPDRIVE_API_PORT=7788 WARPDRIVE_HOST_HOME=/tmp/wd-scratch warpdrive

Security model#

The short version: the engine listens on your machine only, and pairing a gateway to it grants that gateway nothing until you name what it may touch.

Troubleshooting#

SymptomWhat is happening
warpdrive-tui binary not foundThe archive was extracted partially, or the launcher was copied out of its folder instead of symlinked. Re-extract, then symlink.
Port 7777 already in useAn engine is already running, which is fine — the TUI connects to it. Set WARPDRIVE_API_PORT to run a second one.
no sandbox found for "<dir>"attach matches on workspace path. cd to the workspace root, or create an instance for it.
build fails at the Docker checkNo reachable Docker or Podman daemon. Start it and retry; pairing, relay, and status work without one, but instances do not.
Instance fails to boot after 15sIts tmux server never came up, which is a hard boot gate. warpdrive build --rebuild is the usual fix; an init script in the workspace racing the boot is the usual cause.
Relay will not reconnectwarpdrive remote status to confirm the pairing survived, then relay --once in the foreground to read the failure.

Known limits#