Built for modern registry workflows
Blobber makes OCI registries behave like a file store while keeping the full benefits of existing auth, caching, and immutability.
Stream Without Downloading
List and read individual files from OCI images without downloading the entire layer. Powered by eStargz.
Standard OCI
Works with any OCI-compliant registry (GHCR, Docker Hub, ECR, GCR). No special server-side software required.
Go Library & CLI
Use it as a standalone CLI tool for scripts or embed it directly into your Go applications as a library.
List, inspect, and stream with eStargz
eStargz keeps a table of contents inside the image so Blobber can list files instantly and stream a single path on demand.
- Inspect large images without pulling layers.
- Stream a single file for config or secrets.
- Pin by digest for immutable, reproducible builds.
Works with the registries you already use
Blobber relies on standard OCI APIs, so there is no server-side setup or special infrastructure to deploy.
Simple and powerful
Use Blobber as a CLI for scripts or as a Go library in your services. The API is tiny, the behavior is predictable, and it works anywhere an OCI registry does.
- CLI
- Go Library
# Push a directory to a registry
blobber push ./config ghcr.io/myorg/config:v1
# List files without downloading
blobber list ghcr.io/myorg/config:v1
# Stream a single file to stdout
blobber cat ghcr.io/myorg/config:v1 app.yaml
package main
import (
"context"
"os"
"github.com/meigma/blobber"
)
func main() {
ctx := context.Background()
client, _ := blobber.NewClient()
// Push a directory
client.Push(ctx, "ghcr.io/myorg/config:v1", os.DirFS("./config"))
// List files without downloading
img, _ := client.OpenImage(ctx, "ghcr.io/myorg/config:v1")
entries, _ := img.List()
}
Ship files like images.
Start with the CLI or embed the Go client. Blobber stays small and predictable while giving you registry-native storage.