Installation
One binary, no server required. Linux and macOS; requires Go 1.25+ and cgo
only if you build from source, and the sqlite3 CLI only for running the
test suite. Pick whichever channel fits:
Homebrew
brew tap sricola/offshoot https://github.com/sricola/offshoot
brew trust sricola/offshoot
brew install offshoot
Recent Homebrew requires the explicit brew trust step for any
third-party tap. The formula lives in-repo at
Formula/offshoot.rb.
Prebuilt binaries
Tarballs (offshoot_<tag>_<os>_<arch>.tar.gz) publish to the
releases page for each
tagged release, each with a .sha256 checksum file alongside it. For
example, for a Linux amd64 machine (substitute the tag you're
downloading):
shasum -a 256 -c offshoot_v0.2.9_linux_amd64.tar.gz.sha256
tar xzf offshoot_v0.2.9_linux_amd64.tar.gz
./offshoot version
Docker
docker run --rm -v offshoot-data:/data ghcr.io/sricola/offshoot:latest init
Images publish to GHCR on every tagged release. The store lives in the
/data volume, so reuse -v offshoot-data:/data across commands
(... offshoot:latest create app, ... offshoot:latest serve, and so
on).
go install / from source
go install github.com/sricola/offshoot/cmd/offshoot@latest
Or from a clone:
git clone https://github.com/sricola/offshoot
cd offshoot
go build -o offshoot ./cmd/offshoot
Both need Go 1.25+ with cgo enabled (offshoot embeds SQLite via
mattn/go-sqlite3).
Platform support
Linux and macOS only. Windows: use WSL2 — the Linux binaries, Docker image, and build-from-source all work there as-is. Native Windows is unsupported: offshoot leans on POSIX file semantics (unix sockets, POSIX locks) that don't map cleanly to Windows (why).
Initialize a store
Every offshoot command runs against a store — a local directory or an
S3-compatible bucket. Create one with init before anything else:
offshoot -store ./.offshoot init # local directory (the default)
offshoot -store s3://my-bucket/offshoot init # S3-compatible bucket
-store can appear anywhere in the argument list. If omitted, offshoot
uses the OFFSHOOT_STORE environment variable, and falls back to
./.offshoot if that's unset too — so after offshoot init in a project
directory, bare commands just work. Running init against an
already-initialized store fails rather than silently succeeding, so don't
script it unconditionally before every command.
The fail-closed probe: offshoot's safety rests on compare-and-swap —
every branch ref update is a conditional write. At attach time, every
command probes the store and refuses to run if conditional writes are
not enforced, rather than silently degrading. The probe re-runs on every
CLI invocation (each command attaches fresh); a long-lived daemon
(offshoot serve) pays it once per process instead of once per command.
S3 configuration
Credentials come from the AWS SDK's default chain (environment, shared
config/credentials file, IAM role) — never from an offshoot-specific
variable. Three variables are consulted for s3:// specs:
| Variable | Meaning |
|---|---|
OFFSHOOT_S3_ENDPOINT |
Custom endpoint (MinIO, or any S3-compatible endpoint); unset means AWS's default endpoint |
OFFSHOOT_S3_REGION |
Region; defaults to auto when a custom endpoint is set |
OFFSHOOT_S3_PATH_STYLE |
1 for path-style addressing (needed for MinIO) |
For a remote (s3://) store, OFFSHOOT_CHECKOUTS controls where
checkouts are materialized locally (default: a per-store directory under
the user cache dir); local stores always keep checkouts under the store
directory itself.
Provider support
A provider is listed as supported only after the conformance suite and CAS probe pass against it for real:
| Provider | Status |
|---|---|
| MinIO | verified in CI — the conformance suite runs against real MinIO on every PR and push to main |
| AWS S3 | verified — probe + conformance + multipart passed against a real bucket (us-east-1, 2026-08-13) |
| Google Cloud Storage (S3 interop) | unsupported — no conditional writes on the S3 API; the probe refuses it (why) |
See Limitations for what "S3-compatible" concretely requires.
Next
- New to offshoot? The Quickstart is the five-minute fork/rollback tour.
- Every flag of every command: the CLI reference.