Deterministic Build and Execution Fabric
OBELISK is a production-grade build system designed for:
- Deterministic builds with reproducible outputs
- Hermetic action execution with sandboxing
- Content-addressed caching with local and remote backends
- Remote execution with coordinator and workers
- Time-travel debugging with build replay and divergence detection
- Audit-grade tracing of all build operations
OBELISK guarantees:
- Hermeticity: Actions cannot see undeclared inputs or write outside declared outputs
- Reproducibility: Same inputs + tools → same outputs (deterministic cache keys)
- No silent failures: Every cache miss/hit is logged and explainable
- Stable ordering: All operations are deterministic across platforms
- Versioned formats: All file formats and protocols are versioned
- Checksum protection: All data is integrity-checked
OBELISK does NOT guarantee:
- Compiler determinism unless explicitly pinned and declared
- Safety of user-provided tools
- Build optimality (it may not find the fastest build plan)
- Identical sandbox strength across all platforms
# Clone the repository
git clone https://github.com/obelisk-build/obelisk.build
cd obelisk.build
# Build with CMake and Ninja
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
# (Optional) Install
sudo cmake --install build# Initialize a new project
obelisk init myproject
cd myproject
# Build all targets
obelisk build
# Run tests
obelisk test
# Generate a build graph visualization
obelisk graph output.dotAn action is a sealed unit of work with:
- Declared inputs: files, directories, environment variables, toolchain references
- Declared outputs: file paths and directory paths
- Declared command: argv vector (no shell by default)
- Declared working directory
- Declared timeout and resource limits
- Declared sandbox profile
- Declared cache policy
The cache is content-addressed with keys including:
- Canonical action spec
- Hash of all inputs
- Hash of toolchain artifacts
- Declared environment
- Sandbox profile
- Platform fingerprint (explicit and versioned)
Sandbox profiles by platform:
| Platform | Profiles Available |
|---|---|
| Linux | namespaces, chroot+seccomp |
| macOS | sandbox-init profiles |
| Windows | job objects, restricted tokens |
- Coordinator: Assigns action nodes to workers
- Workers: Execute actions under sandbox, return outputs
- Protocol: Versioned binary protocol with gRPC
A build bundle is a reproducible capsule containing:
- Action graph
- Canonical specs
- Toolchain references and hashes
- Input manifests and optional blobs
- Trace log
- Platform fingerprint
Bundles enable:
- Offline replay of builds
- Divergence detection
- Time-travel debugging
obelisk.build/
├── cmd/ # Command-line tools
│ ├── obelisk/ # Main CLI
│ ├── obeliskd/ # Coordinator daemon
│ ├── obelisk-cache/ # Remote cache server
│ └── obelisk-worker/ # Remote execution worker
├── src/ # Source libraries
│ ├── core/ # Core types and utilities
│ ├── graph/ # Build graph and scheduler
│ ├── action/ # Action specification and execution
│ ├── sandbox/ # Sandbox adapters
│ ├── cache/ # Content-addressed cache
│ ├── remote/ # Remote cache/execution clients
│ ├── protocol/ # Protocol definitions
│ ├── bundle/ # Build bundles
│ ├── trace/ # Execution tracing
│ └── rules/ # Build rules
├── tests/
│ ├── unit/ # Unit tests
│ ├── integration/ # Integration tests
│ ├── golden/ # Golden file tests
│ ├── sim/ # Deterministic simulation tests
│ └── fuzz/ # Fuzz targets
├── docs/ # Documentation
├── spec/ # Formal specifications
└── examples/ # Example projects
obelisk init <name> Initialize a new project
obelisk build [targets] Build targets
obelisk test [targets] Run tests
obelisk run <target> Run a target
obelisk query deps <target> Query dependencies
obelisk graph [output] Generate graph visualization
obelisk explain <target> Explain why something rebuilt
obelisk bundle make Create a build bundle
obelisk bundle replay <bundle> Replay a build bundle
obelisk cache stats Show cache statistics
obelisk cache verify Verify cache integrity
obelisk daemon start Start the daemon
obelisk worker start Start a worker
OBELISK uses a simple configuration language (OBELISK file):
version = "1.0"
cc_library("mylib") {
srcs = ["foo.cpp", "bar.cpp"]
hdrs = ["foo.h", "bar.h"]
deps = [":otherlib"]
}
cc_binary("myapp") {
srcs = ["main.cpp"]
deps = [":mylib"]
}
See CONTRIBUTING.md for guidelines.
- Documentation: docs/
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- Security Policy: docs/SECURITY.md
- Issue Tracker: GitHub Issues
- Release Notes: RELEASE.md
Apache-2.0 OR MIT - See LICENSE for details.