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.