OCI-native file artifacts
Every file, provably authentic.
Sign and attest file archives in OCI registries. Carry cryptographic provenance wherever they go.
sig-2f9asha256:9d2f...c8e1idx:3c91file:7b1eThe gap
You sign your container images. What about everything else?
Config files. ML models. Deployment artifacts. Certificates. They move between systems with no provenance, no integrity, and full downloads every time.
1f8c...b91aTrust, end-to-end
Make provenance visible, then prove it.
Blob turns file archives into verifiable, browsable artifacts that behave like container images.
Prove origin
Attach signatures and attestations to file archives in OCI registries—then verify every file on read.
Verify on read
Tamper with a single byte and verification fails instantly.
Only fetch what you use
Browse and stream without downloading a 1GB archive.
Flow
Provenance Flow
Same guarantees as container images, for any file.
Build
GitHub Actions
Sign
Sigstore
Attest
SLSA provenance
Push
OCI registry
Pull
Consumer system
Verify + Extract
Policy checks on read
Performance
Built for speed at file granularity.
Why download 1GB to read a 64KB config? Blob uses HTTP Range Requests to fetch exactly what you need, when you need it.
- Overview
- Detailed Benchmarks
- vs eStargz
Bandwidth efficiency
<- 99.99% never downloaded
Index is tiny
per file - 10K files = 1 MB index
Instant lookups
constant time - any archive size
Batch efficiency
directories fetch as a single contiguous read
Network Reality
Read latency (64 KiB file, 5ms RTT) - cache effect
Index Cache
Open once, instant forever
Proven Scaling
Performance remains constant as archive grows
(constant lookup time)
Blob Performance Impact
Relative speedup vs eStargz (remote HTTP)
API
Simple Go API
// Push a directory to registry
c, _ := blob.NewClient(blob.WithDockerConfig())
c.Push(ctx, "ghcr.io/org/configs:v1", "./src")
// Pull with verification policies
sigPolicy, _ := sigstore.GitHubActionsPolicy("myorg/myrepo")
slsaPolicy, _ := slsa.GitHubActionsWorkflow("myorg/myrepo")
c, _ := blob.NewClient(
blob.WithDockerConfig(),
blob.WithPolicy(policy.RequireAll(sigPolicy, slsaPolicy)),
)
// Lazy load - only downloads what you read
archive, _ := c.Pull(ctx, "ghcr.io/org/configs:v1")
stats, _ := archive.CopyDir("./output", "configs/")
fmt.Printf("Extracted %d files
", stats.FileCount)