mrkeyoor.com_
Fri 04 Sept 17:59 UTC
Self-Hostedevaluationupdated 04 Sept 2026

zot review

Zot is a self-hosted registry for container images and other OCI artifacts. It stores content in the OCI image layout and speaks the OCI distribution protocol, giving teams a vendor-neutral place to push, pull, search, scan, sign, and mirror artifacts.

trackingstars / 7d
Verdict

Our Zot run built in 30 seconds, but 13 of 61 test packages failed after a 713-second run, so the source checkout did not clear a basic confidence gate. Zot remains attractive for operators who want an OCI-native registry with optional search, scanning, signing, and sync in one Go service. Trial the packaged release, then load-test the exact pull-through and metadata design before putting it under a Kubernetes fleet.

We ran it

Lab card: what happened when we ran zotScreenshot of zot (zotregistry.dev)
Install✓ · 177s1247 packages
Build✓ · 30s
Tests✗ · 713s48 passed · 13 failed of 61 (go test)
Repo761 files~248,073 lines of source · 11.7 MB · 28 CI workflows · tests dir

Answers from our run

Does zot build from source?

Dependencies installed in 177 seconds (1247 packages), and the build succeeded in 30 seconds. We cloned commit 2103147 into a clean Debian container with 3 CPUs and no project-specific setup.

Do zot's tests pass?

Not all of them: 48 of 61 passed and 13 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use zot?

Pull-through cache operators expecting uneventful concurrent first pulls: issue 4399 reports 93 of 131 parallel jobs failing against v2.1.20 during an on-demand sync burst.

What are the alternatives to zot?

CNCF Distribution, Harbor, Quay. Our Zot run built in 30 seconds, but 13 of 61 test packages failed after a 713-second run, so the source checkout did not clear a basic confidence gate.

Setup3/530-second build, but 13 test packages failed after 713 seconds
Docs3/5Detailed config reference sits behind an unusually sparse root README
Community4/52,698 stars with same-day code, issue, and pull request activity
Maturity3/5v2 release line is active; cache bugs and lab failures need checking

Who it’s for

Platform teams that want a small OCI-native registry rather than a broad developer portal.
Edge and Kubernetes operators who value full and minimal binary variants across Intel and ARM.
Organizations that need local or cloud-backed storage with deduplication, garbage collection, and retention controls.
Registry administrators willing to configure authentication, authorization, metadata, and synchronization explicitly.

Who it’s NOT for

Pull-through cache operators expecting uneventful concurrent first pulls: issue 4399 reports 93 of 131 parallel jobs failing against v2.1.20 during an on-demand sync burst.
Teams that require every upstream cache miss to stream immediately: issue 4323 says Zot waits for a whole image sync before returning the first manifest request.
Deployments where download-statistics storage may contend under burst traffic: issue 4390 reports valid manifest reads becoming HTTP 500 responses when a shared Redis metadata lock fails.
Windows server operators: the official build guide lists Linux and macOS on Intel and ARM as supported platforms.
Buyers who need the checked-out source suite to pass on a fresh Debian container: our run ended with 13 failed packages out of 61.

Setup reality

Our sandbox installed 1,247 Go packages in 177 seconds and built Zot in 30 seconds. Tests failed with exit code 1 after 713 seconds: 48 passed and 13 failed out of 61. The log tail named failures in TestCopyFiles, TestImageBuilder, and TestPredefinedImages, without showing a cause.

A packaged binary or image is the easier route. Zot starts with zot serve <config-file>; JSON or YAML selects the listener, filesystem or cloud storage, TLS, authentication, authorization, extensions, and background jobs. S3, Azure, GCS, LDAP, OIDC, Redis, and similar integrations need their own endpoints and credentials.

The commit 2103147 checkout had 761 files, roughly 248,073 source lines, and used 11.7 MB before dependencies. Our scan found 28 CI workflows, a tests directory, and no Dockerfile. High availability needs stateless Zot replicas behind a load balancer, shared remote storage, and shared metadata or session components where configured.

Zot stores OCI content without a proprietary layout

Zot is a registry for container images and other artifacts that follow the OCI image and distribution specifications. Content stays in the OCI image layout on disk, giving operators an escape hatch from a registry-specific format. The project ships full and minimal binaries for Linux and macOS on Intel and ARM.

The full build names 9 extensions: sync, search, scrub, metrics, lint, UI, management, user preferences, and image trust. Search can add GraphQL and Trivy-backed CVE data. Image trust checks Cosign keys and Notation certificates. Sync supports periodic and on-demand pulls from upstream registries. Each enabled extension adds configuration and background work.

What happened when we ran it

Our run used commit 2103147 in an unprivileged Go 1.24 Debian container with 3 CPUs, 8 GB of RAM, and no secrets. Dependency installation succeeded in 177 seconds and pulled 1,247 packages. The build succeeded in 30 seconds. The checkout itself contained 761 files, roughly 248,073 lines of source, and occupied 11.7 MB before installation.

Tests ran for 713 seconds and exited with code 1. The Go summary counted 48 passed packages and 13 failed out of 61. Its final lines named TestCopyFiles in pkg/test/common, then TestImageBuilder and TestPredefinedImages in pkg/test/image-utils. The supplied log tail contains no error explaining those failures, so we cannot assign a cause. This checkout built successfully and did not pass its full test command.

One service still needs explicit auth and storage decisions

Zot starts with a JSON or YAML file passed to zot serve. The binary emits a draft 7 JSON Schema and verifies a candidate configuration before launch. Authentication includes mutual TLS, htpasswd, LDAP, bearer tokens, and OpenID. Browser OpenID login does not work for normal image clients, so the configuration guide steers those users toward API keys.

Storage can be local or backed by S3, Azure Blob, and GCS. Local deduplication depends on hard links, while garbage collection and retention can delete unreferenced content. Multiple replicas require shared remote storage, a load balancer, and suitable shared metadata and session stores. A basic registry listens on port 5000.

Nine extensions make the full binary much more than a blob server

Search exposes image metadata and can attach vulnerability data from Trivy. Sync filters repositories and tags, checks signatures if configured, and supports multiple upstream URLs. Scrubbing checks stored content, metrics feed monitoring, and the UI gives humans a catalog. The minimal binary suits operators who value conformance and a smaller attack surface over those extras.

These jobs touch live storage. Garbage collection settings need to match push patterns, while retention uses ordered repository policies and tag expressions. Fast restart can skip a storage walk for a 1 TB or larger S3 backend. The source documentation warns that out-of-band storage changes may then leave metadata inconsistent, so the shortcut is disabled by default.

Issue 4399 reports 93 of 131 first pulls failing

Open issue 4399 describes v2.1.20 running as a per-node on-demand cache. During a concurrent first pull, 93 of 131 CI jobs failed because readers saw a repository directory before its index.json was available. Open issue 4390 reports another burst failure: a shared Redis lock error while updating download statistics turns an otherwise valid manifest read into HTTP 500.

Those reports target specific scale-out cache configurations. Issue 4323 explains that an uncached on-demand request waits while the full image is copied locally, sending no bytes to the first client until that work finishes. A distant upstream or large image can hit a client timeout, after which a retry succeeds from the populated cache.

The 2,223-character README sends operators elsewhere for detail

The root README establishes the OCI-only scope and links the documentation, but it contains no quick-start command or feature map. The repository's examples/README.md is more useful: it documents schema generation, configuration verification, storage, authentication, retention, cache drivers, sync, search, and CVE scanning. Example files cover local, cloud, Redis, LDAP, TLS, OIDC, metrics, and cluster cases.

Cross-check the documentation against the release you deploy. The separate administrator guide includes older examples and paths, while the source-tree reference carries newer settings such as fast restart and API keys. For v2.1.20, generate the schema from the same binary and run zot verify during deployment.

Version 2.1.20 is released, and September issue work is active

Zot v2.1.20 was published on 2026-08-04. GitHub showed 2,698 stars and 87 combined open issues and pull requests on 2026-09-04. The default branch was pushed that day, with recent work on authentication, configuration reloads, concurrent pulls, garbage collection, and ecosystem tests. Code and issue activity both show ongoing maintenance.

The 30-second build earns a trial, while cache behavior decides adoption

Zot's attraction is a narrow foundation with optional registry conveniences. The 30-second build and small checkout make source inspection approachable, though 13 failed test packages prevent a clean recommendation from our run. Start with a basic private registry. Add sync, Redis metadata, retention, and replicas one at a time with concurrent pull tests.

CNCF Distribution is a plainer core when separate services will handle policy and UI. Harbor suits teams that want a larger governance product, while Quay offers another full registry application. Choose Zot when OCI-native storage and selective extensions are more appealing, then prove first-pull behavior with the same clients and fan-out your cluster will use.

Alternatives

ProjectWhat it isPick it when
CNCF DistributionThe reference-style toolkit behind the familiar Docker Registry protocol and storage service.pick this instead when you want the conventional registry core and plan to add authentication, scanning, or UI separately.
HarborA larger registry platform with projects, policy, scanning, signing, replication, and administration features.pick this instead when enterprise registry governance and a broad operator interface matter more than Zot's smaller footprint.
QuayA full container registry application for storing and distributing images across teams.pick this instead when organization management and a mature registry application are worth a heavier deployment.

What people are saying

  1. [github-trending] project-zot/zot

Sources

  1. Zot README
  2. Zot GitHub repository
  3. Zot configuration examples
  4. Zot v2.1.20 release
  5. Concurrent first-pull issue 4399
  6. Manifest metadata-lock issue 4390
  7. On-demand first-pull timeout issue 4323
  8. Zot security policy

More self-hosted reviews

infra · consul · project-nomad · gpt-load · limusic · xbmc · the whole board →