raft is an independent, self-hosted open-source alternative to
boat.dev. it gives you persistent Linux boxes on machines you
control, with command execution, Docker, file transfer, snapshots, forks and a
private desktop. boxes are unprivileged Incus containers that share the host kernel.
use trusted workloads only: your SSH identity controls the host. Raft is not affiliated with Boat.
raft-intro.mp4
setup | feature parity | verification | agent skill | sandbox sdk provider | docs site
follow the setup guide to install the CLI, configure SSH, set up Incus and download or build an image.
install the CLI on Linux with Python 3.11.8+:
npm install -g @microck/raft
raft --version| requirement | minimum |
|---|---|
| host | dedicated ARM64 or AMD64 Ubuntu host, 2 CPUs, 8 GiB RAM, 80 GiB free disk, plus the pool size if you enable own box disks |
| host access | SSH and passwordless sudo |
| controller | Linux, Python 3.11.8+, SSH and SCP; npm or uv for installation |
then onboard a dedicated Ubuntu host over key-based SSH. raft host add checks
the host, shows its plan, provisions Incus, imports a verified image and runs a
smoke test:
raft host add lab --ssh ubuntu@192.0.2.10once your host and image are configured, run the commands below. replace lab
with a location from your configuration:
box=$(raft new --location lab --ttl 600 --persistent --purpose "Explore Raft" --owner "local operator" --next "Destroy after exploring")
raft exec "$box" -- node --version
raft ssh "$box"
raft stop "$box"the image builder starts with Debian 13 and installs language runtimes, build tools, Docker, Chromium, FFmpeg and a Voxl desktop with optional noVNC. build your own image or download an image for your host architecture from versioned releases. pin its fingerprint in your configuration. see image builds and boot measurements for checks and timings.
see the task guides for background jobs, file transfer, snapshots and forks, private services and desktops, backup and recovery and Docker.
See project setup and templates, persistent services, scripting and CI, disposable CI jobs, and upgrades for complete operator workflows.
stop the source box before taking a snapshot, restoring one or making a fork. stopping a box ends its jobs without saving process memory.
backups include the box's files and credentials. keep them private and import only trusted exports. a long backup can delay expiration checks on its host.
median startup times from five runs per architecture on native Ubuntu 24 CI hosts. each box had one CPU, 2 GiB RAM and a cached image:
| measurement | ARM64 | AMD64 |
|---|---|---|
| command ready after create | 0.87 s | 1.38 s |
| Docker ready after create | 2.28 s | 3.04 s |
| desktop, after its separate start request | 1.12 s | 1.59 s |
| compressed development image | 1.79 GiB | 1.86 GiB |
times depend on hardware, installed software and services, storage, image cache and SSH latency. the measurements include CLI and SSH overhead. they exclude image downloads and host reboots.
the first image unpack can take longer. the runners used different hardware, so these results do not show that ARM64 is faster.
both native images passed the lifecycle tests and all 31 development-tool checks. see measurements and methodology for raw samples, resume timings and the measured image-size and desktop-startup improvements.
✅ supported · ❌ unavailable · ❓ not established in Boat's docs. matching checks do not imply identical behavior. the full comparison records differences, sources and test coverage.
| Capability | Boat | Raft | Raft limits / differences |
|---|---|---|---|
| Self-hosting on operator hardware | ❌ | ✅ | Incus on your hosts |
| Native ARM64 workspaces | ❌ | ✅ | Boat documents x86_64 machines only |
| Create/list/inspect/delete | ✅ | ✅ | Single operator |
| Persistent stop/resume | ✅ | ✅ | Shared host kernel |
| TTL and lifetime extension | ✅ | ✅ | Persistent boxes retain disk; disposable boxes delete |
| CPU/memory sizing and usage | ✅ | ✅ | Any whole CPU count and GiB size up to the host. Usage covers the shared pool or the box's own disk |
| Host capacity estimates | ❌ | ✅ | Advisory only; Raft has no box count limit. Boat reports plan limits |
| Root terminal and command execution | ✅ | ✅ | Host SSH transport |
| Disposable foreground CI jobs | ✅ | ✅ | raft run provides a fixed timeout, Git-aware upload, artifact collection and guarded cleanup |
| Background jobs, logs and cancellation | ✅ | ✅ | No process checkpoints |
| File upload/download | ✅ | ✅ | Files and recursive trees; new directory destinations only |
| Snapshots and same-host forks | ✅ | ✅ | Stopped source, checked under the lifecycle lock |
| Deploy/delete named snapshots | ✅ | ✅ | Same-host templates and named snapshot deletion |
| Portable backup/recovery | ❓ | ✅ | Raft native archives; Boat whole-instance archive import is not established |
| Docker and development tools | ✅ | ✅ | Native ARM64 and AMD64 images. See image tests |
| Private port forwarding | ✅ | ✅ | Local SSH tunnel |
| Desktop access | ✅ | ✅ | Voxl by default; optional noVNC; see verification limits |
| Reverse forwarding | ✅ | ❌ | Not implemented |
| Public workspace hosting and browser-only streaming | ✅ | ❌ | Not implemented |
| Resize on resume/fork | ✅ | ✅ | Optional CPU/RAM overrides; disks keep their size |
| CLI-wide JSON mode | ✅ | ❌ | Boat JSON/JSONL; Raft list/info/usage/capacity/config plus prune JSONL |
| Snapshot file browsing/download | ✅ | ❌ | Whole-box backup only |
| Strict per-box disk quotas | ✅ | ✅ | On hosts deployed with --disk-pool, new --disk SIZE gives a box its own fixed-size, copy-on-write disk; the default shared pool has none |
| Separate-kernel VM isolation | ✅ | ❌ | Container runtime |
| Named environments and managed secrets | ✅ | ❌ | Manual configuration |
| Organizations and webhooks | ✅ | ❌ | Raft is single-operator; no event API |
| Dashboard and remote API | ✅ | ❌ | CLI and Sandbox SDK provider; no dashboard or remote API |
| Managed agent conversations | ✅ | ❌ | Not implemented |
| Automatic deletion and retention | ✅ | ✅ | Disposable deletion, optionally by default; per-host retention deletes boxes stopped for N hours; age-based prune with preview |
| CLI self-update | ✅ | ✅ | Explicit raft self-update for npm and uv installs plus a daily stderr notice. Boat also updates itself after commands; Raft only notifies |
run uv sync --locked to install dependencies and uv run raft --help to check
the CLI. verification lists the real-host test suites.
they create disposable boxes and remove only their own fixtures.
the optional --restart-incus check restarts the host's Incus daemon. run it on
dedicated test infrastructure.
the tests cover Raft's behavior. they do not compare it against the live Boat service. Raft has not had a security audit.
read the contract, architecture and references and the optional agent skill.
MIT. third-party tools retain their own licenses.
