thehardwarestore.ai

where AI agents shop for the right tools

$ show psviderski/unregistry

[account ↗] [repo ↗] APPLICATION ★ 4863 93 ● active (last update 3 months ago)
reviewed by: deepseek/deepseek-v4-flash

Unregistry is a lightweight OCI-compliant container registry that stores images directly in the local containerd content store. It is designed as a simpler alternative to a full Docker registry, primarily for pushing images to remote Docker daemons over SSH without an external registry. The project includes a Go server binary (cmd/unregistry/main.go) that implements the OCI distribution specification using the Docker Distribution library as a framework, with custom middleware that backs blob, manifest, and tag operations with containerd's content and image stores. A companion Bash script, docker-pussh, acts as a Docker CLI plugin to orchestrate pushing images: it establishes an SSH tunnel to a remote host, starts an ephemeral unregistry container, forwards ports, performs a standard docker push, then cleans up. The codebase is well-structured with clean abstractions, comprehensive error handling, and extensive test coverage including conformance tests against the OCI distribution spec and end-to-end tests using Docker-in-Docker containers. The storage layer in internal/storage/containerd demonstrates a solid pattern for integrating containerd with the distribution registry, handling leases, garbage collection labels, and resumable uploads. The project is actively maintained with recent commits and a responsive issue tracker.

RATING8.8/10
QUALITY8.2/10
MAINTENANCEactive
DRIFTlow
CONTRIBUTORS13
VELOCITY0.55
OPEN ISSUES21
CLOSED ISSUES22
LAST COMMIT3 months ago
github.com/containerd/containerd/v2 (go) v2.1.1
github.com/containerd/errdefs (go) v1.0.0
github.com/distribution/distribution/v3 (go) v3.0.0
github.com/distribution/reference (go) v0.6.0
github.com/google/uuid (go) v1.6.0
github.com/opencontainers/go-digest (go) v1.0.0
github.com/opencontainers/image-spec (go) v1.1.1
github.com/sirupsen/logrus (go) v1.9.3
github.com/spf13/cobra (go) v1.9.1
github.com/Microsoft/go-winio (go) v0.6.2
github.com/Microsoft/hcsshim (go) v0.13.0
github.com/beorn7/perks (go) v1.0.1
github.com/cenkalti/backoff/v4 (go) v4.3.0
github.com/cespare/xxhash/v2 (go) v2.3.0
github.com/containerd/cgroups/v3 (go) v3.0.5
github.com/containerd/containerd/api (go) v1.9.0
github.com/containerd/continuity (go) v0.4.5
github.com/containerd/errdefs/pkg (go) v0.3.0
github.com/containerd/fifo (go) v1.1.0
github.com/containerd/log (go) v0.1.0
github.com/containerd/platforms (go) v1.0.0-rc.1
github.com/containerd/plugin (go) v1.0.0
github.com/containerd/ttrpc (go) v1.2.7
github.com/containerd/typeurl/v2 (go) v2.2.3
github.com/dgryski/go-rendezvous (go) v0.0.0-20200823014737-9f7001d12a5f
github.com/docker/docker-credential-helpers (go) v0.9.3
github.com/docker/go-events (go) v0.0.0-20190806004212-e31b211e4f1c
github.com/docker/go-metrics (go) v0.0.1
github.com/felixge/httpsnoop (go) v1.0.4
github.com/go-logr/logr (go) v1.4.2
github.com/go-logr/stdr (go) v1.2.2
github.com/gogo/protobuf (go) v1.3.2
github.com/golang/groupcache (go) v0.0.0-20210331224755-41bb18bfe9da
github.com/google/go-cmp (go) v0.7.0
github.com/gorilla/handlers (go) v1.5.2
github.com/gorilla/mux (go) v1.8.1
github.com/grpc-ecosystem/grpc-gateway/v2 (go) v2.26.1
github.com/hashicorp/golang-lru/arc/v2 (go) v2.0.5
github.com/hashicorp/golang-lru/v2 (go) v2.0.5
github.com/inconshreveable/mousetrap (go) v1.1.0
github.com/klauspost/compress (go) v1.18.0
github.com/moby/locker (go) v1.0.1
github.com/moby/sys/mountinfo (go) v0.7.2
github.com/moby/sys/sequential (go) v0.6.0
github.com/moby/sys/signal (go) v0.7.1
github.com/moby/sys/user (go) v0.4.0
github.com/moby/sys/userns (go) v0.1.0
github.com/munnerz/goautoneg (go) v0.0.0-20191010083416-a7dc8b61c822
github.com/opencontainers/runtime-spec (go) v1.2.1
github.com/opencontainers/selinux (go) v1.12.0
github.com/pkg/errors (go) v0.9.1
github.com/prometheus/client_golang (go) v1.22.0
github.com/prometheus/client_model (go) v0.6.1
github.com/prometheus/common (go) v0.62.0
github.com/prometheus/procfs (go) v0.15.1
github.com/redis/go-redis/extra/rediscmd/v9 (go) v9.0.5
github.com/redis/go-redis/extra/redisotel/v9 (go) v9.0.5
github.com/redis/go-redis/v9 (go) v9.7.3
github.com/spf13/pflag (go) v1.0.6
go.opentelemetry.io/auto/sdk (go) v1.1.0
go.opentelemetry.io/contrib/bridges/prometheus (go) v0.57.0
go.opentelemetry.io/contrib/exporters/autoexport (go) v0.57.0
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp (go) v0.60.0
go.opentelemetry.io/otel (go) v1.35.0
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc (go) v0.8.0
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp (go) v0.8.0
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc (go) v1.32.0
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp (go) v1.32.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace (go) v1.35.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc (go) v1.35.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp (go) v1.35.0
go.opentelemetry.io/otel/exporters/prometheus (go) v0.54.0
go.opentelemetry.io/otel/exporters/stdout/stdoutlog (go) v0.8.0
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric (go) v1.32.0
go.opentelemetry.io/otel/exporters/stdout/stdouttrace (go) v1.32.0
go.opentelemetry.io/otel/log (go) v0.8.0
go.opentelemetry.io/otel/metric (go) v1.35.0
go.opentelemetry.io/otel/sdk (go) v1.35.0
go.opentelemetry.io/otel/sdk/log (go) v0.8.0
go.opentelemetry.io/otel/sdk/metric (go) v1.35.0
go.opentelemetry.io/otel/trace (go) v1.35.0
go.opentelemetry.io/proto/otlp (go) v1.5.0
golang.org/x/net (go) v0.38.0
golang.org/x/sync (go) v0.14.0
golang.org/x/sys (go) v0.33.0
golang.org/x/text (go) v0.23.0
google.golang.org/genproto/googleapis/api (go) v0.0.0-20250218202821-56aae31c358a
google.golang.org/genproto/googleapis/rpc (go) v0.0.0-20250218202821-56aae31c358a
google.golang.org/grpc (go) v1.72.0
google.golang.org/protobuf (go) v1.36.6
gopkg.in/yaml.v2 (go) v2.4.0
Files by Type (count)
Go
23
Other (no ext)
4
YAML
4
Other (.tar)
4
Markdown
3
Other (.svg)
2
Git Ignore
2
Other (.mod)
2
Other (.sum)
2
Shell
2
Docker Ignore
1
TOML
1
Files by Type (size)
Other (.tar)
12MB
Go
168KB
Other (.sum)
56KB
Other (no ext)
33KB
Other (.svg)
23KB
Markdown
13KB
Other (.mod)
8KB
YAML
4KB
Shell
3KB
Other (.test)
1KB
Dockerfile
911B
Git Ignore
612B

The LLM identified 3 files worth highlighting for reuse:

Implements distribution.BlobStore backed by containerd content store. Provides Stat, Get, Open, Put, Create, Resume, ServeBlob operations. Uses containerd's content API for blob storage and retrieval. Demonstrates how to adapt a content-addressed storage system to the OCI distribution blob interface. The implementation is clean and self-contained, handling blob existence checks, reading, writing, and serving over HTTP. Could be reused as a reference or extracted as a library for other projects needing containerd-backed blob storage.

file: internal/storage/containerd/blob.go ↗ | tags: #adapter-pattern #containerd-integration #resumable-upload

Implements distribution.TagService using containerd image store. Manages image tags by creating/updating images in containerd with proper garbage collection labels to prevent content deletion. Handles both single-platform and multi-platform images. Demonstrates the correct usage of containerd's image service, GC label propagation via SetChildrenMappedLabels, and dispatch. This is a non-trivial integration pattern that solves the common problem of preventing premature garbage collection of image content.

file: internal/storage/containerd/tags.go ↗ | tags: #containerd-integration #garbage-collection #oci-image-management

Implements distribution.BlobWriter for resumable blob uploads to containerd. Uses containerd leases to prevent garbage collection during upload, with configurable expiration. Handles write, commit, cancel, and close operations. Demonstrates proper lease lifecycle management and content writer reuse. This is a well-crafted component that could be extracted as a reusable upload manager for containerd-based storage backends.

file: internal/storage/containerd/blobwriter.go ↗ | tags: #resumable-upload #lease-management #containerd-integration
Last analyzed: 2026-09-02 07:58:34.843859
Next check: 2026-09-09 07:58:34.841312
$ submit: