Yet another docker registry UI
  • Go 53.2%
  • Vue 29.7%
  • TypeScript 7.8%
  • CSS 7.6%
  • HTML 0.6%
  • Other 1.1%
Find a file
2026-06-14 14:22:51 +04:00
.github fix: use eslint to clean up vue files (#79) 2026-05-24 22:51:16 +04:00
charts/docker-registry-ui feat: add registry public host display override (#86) 2026-06-14 14:22:51 +04:00
cmd/container-hub refactor: replace reflection-based config flag overrides 2026-06-05 15:04:22 +04:00
docs feat: add registry public host display override (#86) 2026-06-14 14:22:51 +04:00
internal feat: add registry public host display override (#86) 2026-06-14 14:22:51 +04:00
public fix: use eslint to clean up vue files (#79) 2026-05-24 22:51:16 +04:00
resources feat: add registry public host display override (#86) 2026-06-14 14:22:51 +04:00
.air.toml feat: rewrite docker registry ui in go (#69) 2026-05-23 18:59:11 +04:00
.dockerignore feat: rewrite docker registry ui in go (#69) 2026-05-23 18:59:11 +04:00
.env.example feat: add registry public host display override (#86) 2026-06-14 14:22:51 +04:00
.gitignore chore: ignore public hot file 2026-05-23 19:30:56 +04:00
.go-version feat: rewrite docker registry ui in go (#69) 2026-05-23 18:59:11 +04:00
.golangci.yml feat: add registry public host display override (#86) 2026-06-14 14:22:51 +04:00
.pre-commit-config.yaml feat: add registry public host display override (#86) 2026-06-14 14:22:51 +04:00
assets.go feat: rewrite docker registry ui in go (#69) 2026-05-23 18:59:11 +04:00
bun.lock feat: add code viewer with syntax highlighting 2026-06-05 15:09:27 +04:00
compose.yaml feat: rewrite docker registry ui in go (#69) 2026-05-23 18:59:11 +04:00
Dockerfile fix: make SERVER_HOST 0.0.0.0 inside the container (#81) 2026-05-30 22:43:29 +04:00
eslint.config.js fix: use eslint to clean up vue files (#79) 2026-05-24 22:51:16 +04:00
go.mod feat: add optional oidc auth support (#83) 2026-06-10 13:04:11 +04:00
go.sum feat: add optional oidc auth support (#83) 2026-06-10 13:04:11 +04:00
knip.json feat: add registry public host display override (#86) 2026-06-14 14:22:51 +04:00
LICENSE feat: rewrite docker registry ui in go (#69) 2026-05-23 18:59:11 +04:00
mise.toml chore: add tools uing mise + update docs (#84) 2026-06-10 13:04:22 +04:00
package.json feat: add code viewer with syntax highlighting 2026-06-05 15:09:27 +04:00
README.md feat: add registry public host display override (#86) 2026-06-14 14:22:51 +04:00
Taskfile.yml feat: wire image tag version 2026-05-24 12:20:06 +04:00
tsconfig.json feat: rewrite docker registry ui in go (#69) 2026-05-23 18:59:11 +04:00
vite.config.ts feat: rewrite docker registry ui in go (#69) 2026-05-23 18:59:11 +04:00

Container Hub Docker Registry UI

A simple, lightweight UI for exploring and managing Docker/OCI registries.

Demo

Note

v0.x is available on the 0.x branch.

What you get ?

  • Multi-registry support (including Github Registry for Personal and Organization)
  • Optional OIDC authentication using Keycloak, PocketID, Authelia and more (as from v1.3.0)
  • Search and filters
  • Helm OCI support
  • Storage insights

Quick Start

The UI can be deployed in minutes with Docker Compose:

services:
  registry-ui:
    image: ghcr.io/eznix86/docker-registry-ui:latest
    ports:
      - "8011:3000"
    environment:
      - REGISTRY_URL=http://your-registry.com:5000
      - REGISTRY_AUTH=base64basicauthhere

Then open the UI at: http://localhost:8011

For extensive environment customization, see .env.example.

Deployment

Docker Compose / Swarm

services:
  registry-ui:
    image: ghcr.io/eznix86/docker-registry-ui:latest
    ports:
      - "8011:3000"
    environment:
      - REGISTRY_URL=http://your-registry.com:5000
      - REGISTRY_AUTH=base64basicauthhere

Kubernetes (Helm)

helm repo add docker-registry-ui https://eznix86.github.io/docker-registry-ui
helm repo update

helm install docker-registry-ui docker-registry-ui/docker-registry-ui \
  -n docker-registry-ui \
  --create-namespace

Creating Registry Secrets

kubectl create secret generic registry-ui-secret \
  -n docker-registry-ui \
  --from-literal=REGISTRY_URL="http://your-registry.com:5000" \
  --from-literal=REGISTRY_AUTH="$(echo -n 'username:password' | base64)"

Reference the secret in your Helm values:

secretEnv:
  name: registry-ui-secret

For all available configuration options, see charts/docker-registry-ui/values.yaml.

Registry Authentication

For registries with authentication, you must add the auth environment variable as a base64 encoded value of username:password

echo -n "username:password" | base64
# dXNlcm5hbWU6cGFzc3dvcmQ=

Afterwards, use this value through the following environment variables:

REGISTRY_URL=https://registry.test
REGISTRY_AUTH=dXNlcm5hbWU6cGFzc3dvcmQ=

User Authentication

Docker Registry UI do not have its own user management, but Docker Registry UI supports OIDC Authentication , use the OIDC_* and SESSION_SECRET env. See more in the .env.example

You have many options like

  • Keycloak
  • PocketID
  • Authelia
  • Google
  • Authentik
  • and many more which support OIDC Protocol.

You can further limit access to the hub by using OIDC_ALLOWED_*, this is optional.

If you want to login via Github (or any Oauth2-like), it would be recommended that you use proxy it via an OIDC supported IdP Provider.

Multiple Registry Support

The UI supports connections to multiple registries. Configure them via environment variables with suffixes:

# Default registry
REGISTRY_URL=https://repository.a.com
REGISTRY_AUTH=...

# Additional registries
REGISTRY_URL_PERSONAL=https://repository.b.com
REGISTRY_AUTH_PERSONAL=...

REGISTRY_URL_BUSINESS=https://repository.business.com
REGISTRY_AUTH_BUSINESS=...

REGISTRY_URL_CUSTOM=https://repository.whatever.com
REGISTRY_AUTH_CUSTOM=...

Public Hostname Override

If your registry is only reachable via an internal URL (e.g. http://registry:5000 in Docker Compose), you can set a different hostname for display in the UI (docker pull commands, breadcrumbs, sidebar, etc.):

REGISTRY_URL=http://registry:5000
REGISTRY_SETTINGS_PUBLIC_HOST=registry.domain.xyz

For named registries:

REGISTRY_URL_GH=https://ghcr.io
REGISTRY_SETTINGS_GH_PUBLIC_HOST=ghcr.io

When REGISTRY_SETTINGS_PUBLIC_HOST is not set, the hostname extracted from REGISTRY_URL is used as before.

Notes:

  • From v0.3.2, REGISTRY_AUTH (or its suffixed variants) can be omitted for unauthenticated registries.

  • From v0.5.0, GitHub Container Registry is supported:

    REGISTRY_URL_GHCR=https://ghcr.io
    REGISTRY_AUTH_GHCR=base64(github-username:PAT)
    

    The PAT requires delete:packages, repo, write:packages permissions. Generate a PAT.


Development

To contribute, set up a local development environment:

# Prepare environment variables
cp .env.example .env
# Example: echo -n "USERNAME:PASSWORD" | base64 > .env

bun install
bun run dev         # start local dev server
bun run lint        # run linter
bun run lint:fix    # auto-fix linting issues where possible

Pull requests are welcome. Please ensure code is linted and tested before submission.

Storage Reclamation

When deleting images, Docker Registry v2/v3 only marks them as deleted. Disk space is not automatically reclaimed.

Use the Docker Registry Cleaner for automated cleanup, or run garbage collection manually, see here

How to Contribute

Contributions are welcome. Whether you want to fix a bug, improve performance, or add a new feature, heres how to get started.

1. Fork and Clone

git clone https://github.com/<your-username>/docker-registry-ui.git
cd docker-registry-ui

2. Create a Branch

git checkout -b feature/your-feature-name

Use a descriptive branch name, for example fix/tag-pagination or feature/multi-registry-auth.

3. Set Up the Environment

cp .env.example .env
mise install
go mod download
bun install
bun run dev

4. Lint and Test Before Submitting

bun run lint
bun run lint:fix

Ensure your code passes all checks before committing.

5. Commit and Push

git commit -m "feat: add registry pagination support"
git push origin feature/your-feature-name

6. Open a Pull Request

Open a pull request to the main branch

Please include:

  • A clear description of what your change does.
  • Screenshots or examples if relevant.
  • Links to related issues, for example Fixes #28.

Contribution Guidelines

  • Follow the existing code style and linting rules.
  • Keep commits small and descriptive.
  • Document any new features or configuration options.
  • Pick any issue listed.
  • Open an issue before contributing

License

This project is licensed under the GNU Affero General Public License v3.0. See the LICENSE file for details.