Registry UI is a self-contained browser for Docker Registry HTTP API V2 and OCI images. It ships as one static Go binary with an embedded frontend, an integrated same-origin registry proxy, and no runtime dependency on Node.js or Nginx.
The frontend keeps Registry UI's original page structure and navigation while adopting S3 Browser's visual system: colors, typography, spacing, radii, local Material Design SVG icons, menus, notifications, and responsive finish.
- Browse repositories and tags with server-side metadata enrichment.
- Open a repository's only tag directly, without an intermediate tag page.
- Inspect full image/config digests, type-aware colorized runtime settings and labels, colorized build arguments/environment values, exposed ports, and every ordered history entry.
- Switch platform details in place, with per-platform size, creation time, and author directly in the selector.
- Read a merged numbered Dockerfile/history view with sticky line numbers and cumulative size, signed layer change, and date kept outside selectable source.
- See the all-platform content
Sizeand tag digest directly below the tag title. - Download a tag as a streamed OCI archive or the selected platform as a Docker archive accepted by
docker image load. - Optionally delete manifest references when deletion is enabled and supported upstream.
- Proxy Docker Registry V2 requests through the same origin at
/v2/. - Run behind one reverse-proxy path prefix.
- Expose
/health,/healthz, and/ready, plus a binary health command suitable forscratch. - Build static Linux
amd64andarm64release archives with GoReleaser.
All frontend assets are embedded and served locally. The application uses no CDN, external font, HCL file, generated dist directory, or frontend build step.
cd src
REGISTRY_URL=http://127.0.0.1:5000 go run .Open:
http://127.0.0.1:8080/
REGISTRY_URL is the only supported upstream URL variable.
The repository includes an isolated test environment equivalent in structure to S3 Browser:
cd test
docker compose up --build -d
./smoke.shOpen http://localhost:8080/. The stack starts:
- the production Registry UI
scratchimage; - a private Docker Distribution registry;
- a one-shot publisher that loads deterministic OCI single-platform and multi-platform fixtures.
Remove it completely with:
docker compose down -vNo external registry, Docker socket, production credential, or HCL configuration is required. See test/README.md.
Configuration is environment-only.
| Variable | Default | Description |
|---|---|---|
REGISTRY_URL |
http://registry:5000 |
Docker Registry upstream used by backend APIs and the /v2/* proxy. |
PORT |
8080 |
HTTP port when LISTEN_ADDR is unset. |
LISTEN_ADDR |
:$PORT |
Complete HTTP listen address. |
REGISTRY_USERNAME |
empty | Optional upstream Basic Auth username. |
REGISTRY_PASSWORD |
empty | Optional upstream Basic Auth password. |
REGISTRY_BASIC_AUTH |
empty | Optional complete Basic authorization value. |
REGISTRY_TOKEN |
empty | Optional upstream Bearer token. |
DELETE_IMAGES |
false |
Enables deletion when the upstream also supports it. |
HEALTH_URL |
local /healthz |
URL used by registry-ui health. |
HEALTH_TIMEOUT |
2s |
Timeout used by the health command. |
REGISTRY_URL accepts HTTP, HTTPS, custom ports, and an upstream path prefix:
REGISTRY_URL=https://registry.example.com:5443/internal go run .See docs/CONFIGURATION.md for authentication precedence and all runtime details.
Build the scratch image:
docker build \
-f test/browser/Dockerfile \
--target runtime \
--build-arg VERSION=v1.0.0 \
-t registry-ui:v1.0.0 \
.Run it:
docker run --rm \
--name registry-ui \
--read-only \
-p 8080:8080 \
-e REGISTRY_URL=http://registry:5000 \
registry-ui:v1.0.0The final container runs as UID/GID 65532, includes CA certificates for HTTPS registries, and uses the binary itself for health checks.
| Endpoint | Purpose |
|---|---|
/ |
Registry browser. |
/config.json, /api/config |
Public frontend configuration. |
/api/catalog |
Enriched repository catalog. |
/api/tags |
Enriched tags for one repository. |
/api/tag |
Detailed image metadata. |
/api/download |
OCI image archive download. |
/api/download/docker |
Docker image archive download for one selected platform. |
/api/delete |
Manifest reference deletion. |
/v2/ |
Same-origin Docker Registry proxy. |
/health, /healthz, /ready |
Process health endpoints. |
Frontend and API URLs are relative, so the application supports a reverse-proxy prefix such as:
https://example.com/registry-ui/
registry-ui health
registry-ui health --quiet
registry-ui health --url http://127.0.0.1:8080/healthz --timeout 3sregistry-ui/
├── .github/
│ └── workflows/
│ ├── ci.yaml
│ └── release.yaml
├── docs/
│ ├── ARCHITECTURE.md
│ ├── CONFIGURATION.md
│ ├── DEVELOPMENT.md
│ ├── IMAGE_SUPPORT.md
│ └── SECURITY.md
├── src/
│ ├── public/
│ │ ├── assets/
│ │ │ ├── css/
│ │ │ ├── icons/mdi/
│ │ │ └── js/
│ │ ├── favicon.svg
│ │ └── index.html
│ ├── go.mod
│ ├── main.go
│ └── main_test.go
├── test/
│ ├── browser/Dockerfile
│ ├── seed/
│ ├── docker-compose.yaml
│ ├── frontend-contract.mjs
│ ├── tag-detail-format.mjs
│ ├── README.md
│ └── smoke.sh
├── LICENSE
└── README.md
Run the complete local verification:
cd src
test -z "$(gofmt -l *.go)"
go test -race ./...
go vet ./...
node --check public/assets/js/api.js
node --check public/assets/js/app.js
node --check ../test/tag-detail-format.mjs
node ../test/frontend-contract.mjs
node ../test/tag-detail-format.mjs
CGO_ENABLED=0 go build -tags=netgo,osusergo -trimpath .See docs/DEVELOPMENT.md for fixture, integration, and release validation.
Create and push a semantic version tag:
git tag -a v1.0.0 -m "registry-ui v1.0.0"
git push origin v1.0.0The release workflow runs formatting, tests, vetting, frontend contracts, static compilation, and GoReleaser. It publishes Linux archives for amd64 and arm64 with a checksum file.
AGPL-3.0.