Documentation

How it works

Basecamp resolves an environment lock, synchronizes its inputs, and leaves build/test/run to the native project tools.

The basic flow

native project files
  → Basecamp detects the stack
  → fingerprint native inputs locally
  → resolve basecamp.lock
  → synchronize only missing environment inputs
  → materialize a shared local environment
  → activate it
  → use cargo / pnpm / go / uv normally

The lock sits above ecosystem locks

Cargo.lock, pnpm-lock.yaml, go.sum, and uv.lock remain authoritative for their ecosystems. Basecamp records their digests and locks the wider environment: runtime, tools, native libraries, sources, and materialization rules.

Large bytes take the shortest trusted path

basecamp.lock
  ├─ Rust toolchain → official Rust CDN
  ├─ Cargo packages → configured Cargo registries / Git
  ├─ explicitly published layers → Basecamp CAS
  └─ future generated inputs → isolated producer → CAS

Shared local store

Immutable toolchains and package layers are shared across projects under~/.basecamp/store. Project-local .basecamp only contains activation state and generated native configuration.

Air-gapped environments

basecamp bundle pack exports the lock and all materialized layers.bundle unpack restores them into an empty store without network access.

CAS is optional; remote execution is not part of v0.5

Basecamp can serve explicitly published content-addressed layers. The current Rust path does not send the Rust toolchain or Cargo sources through Basecamp, and the control plane does not schedule execution jobs.