Lightweight multi-format artifact registry. 13 formats: Docker, Maven, npm, PyPI, Cargo, Go, NuGet, RubyGems, Terraform, Conan, Ansible Galaxy, Dart Pub, and Raw. Single binary, zero dependencies, <100MB RAM. https://getnora.dev
  • Rust 93.8%
  • Shell 3.9%
  • TypeScript 1.5%
  • Python 0.5%
  • Dockerfile 0.2%
Find a file
DevITWay | Pavel Volkov 40eb5da4ae
security(ui): redact proxy_upstreams for anonymous callers (#935)
* chore: release v1.2.1

* security(ui): redact proxy_upstreams for anonymous dashboard callers (#934)

Extract `build_dashboard_response(state, authenticated)` from
`api_dashboard` — when the caller is not authenticated,
`proxy_upstreams` is an empty vec for every mount point, preventing
upstream registry topology disclosure in air-gap deployments.

Add opportunistic auth on the middleware's open web-surface path:
if the request carries credentials on a publicly-browsable page
(anonymous_read=true), validate them and insert the real identity
so downstream handlers can distinguish authenticated from anonymous.

* test(auth): cover opportunistic auth on open web surfaces (#934)

Add tests for try_basic_auth unit function and opportunistic
authentication middleware path exercised when anonymous_read=true.
Fixes diff-coverage threshold by covering lines 255-274, 621-629
in auth/mod.rs.
2026-08-29 17:55:18 +00:00
.clusterfuzzlite fix: pin ClusterFuzzLite base image by SHA, fix Docker tag double-suffix 2026-03-18 13:20:35 +00:00
.config security: add cancel-safety annotations, fuzz targets, nextest config (#360) 2026-05-17 21:16:24 +03:00
.github ci(release): publish to crates.io on tag push (#930) 2026-08-29 11:04:12 +00:00
deploy chore(release): v1.0.0 (#844) 2026-07-13 13:33:34 +00:00
dist fix(docker): fail closed on transient storage errors in manifest reads (#911) 2026-08-20 07:53:09 +00:00
docs-ru feat: native Google Cloud Storage backend (storage.mode = gcs) (#842) 2026-07-13 15:00:09 +00:00
fuzz test(fuzz): exercise namespace_match in fuzz_validation target (#862) 2026-07-18 07:38:26 +00:00
nora-registry security(ui): redact proxy_upstreams for anonymous callers (#935) 2026-08-29 17:55:18 +00:00
scripts fix(ci): diff-coverage follows renames so a moved file isn't re-scored as new (#843) 2026-07-12 20:47:05 +00:00
tests feat: Debian/APT registry — hosted flat repos with server-generated indexes (#128) (#833) 2026-07-11 17:39:17 +00:00
.dockerignore fix(docker): keep deploy/config.docker.toml in the build context (#749) 2026-06-19 18:17:44 +00:00
.git-blame-ignore-revs chore: DX improvements — typos, blame-ignore, PR template, registry checklist (#120) 2026-04-09 18:49:20 +03:00
.gitignore docs: complete CHANGELOG for 0.9.4 and fix factual doc errors (#707) 2026-06-13 07:32:52 +00:00
.gitleaks.toml fix: restore .gitleaks.toml lost during merge (#58) 2026-03-27 21:01:45 +03:00
.trivyignore feat: OIDC Workload Identity authentication (#342) (#348) 2026-05-16 19:13:41 +03:00
_typos.toml fix(security): reject invalid quarantine/curation/audit mode values (#524) (#548) 2026-05-28 14:06:25 +00:00
ARCHITECTURE.md feat: pull-through proxy and offline mirror for rpm and deb (#864) 2026-07-22 06:06:33 +00:00
artifacthub-repo.yml chore: SLSA L3 provenance, cosign .sig, Artifact Hub (#106) 2026-04-06 02:53:22 +03:00
BENCHMARKS.md docs: limit benchmark claims to what CI measures; mark load tests as planned (#694) 2026-06-12 11:26:02 +00:00
Cargo.lock chore: release v1.2.1 (#933) 2026-08-29 11:48:25 +00:00
Cargo.toml chore: release v1.2.1 (#933) 2026-08-29 11:48:25 +00:00
CHANGELOG.md chore: release v1.2.0 (#922) 2026-08-23 10:53:53 +00:00
cliff.toml ci: add git-cliff changelog automation and conventional commit enforcement (#239) 2026-05-02 17:42:23 -04:00
clippy.toml chore: add guardrails — semver checks, clippy rules, Renovate, pre-commit hook (#225) 2026-05-01 10:28:32 +03:00
CODE_OF_CONDUCT.md community: add issue/PR templates, code of conduct, update contributing guide 2026-03-18 12:22:10 +00:00
COMPAT.md fix(docker): fail closed on transient storage errors in manifest reads (#911) 2026-08-20 07:53:09 +00:00
CONTRIBUTING.md chore(release): v1.0.0 (#844) 2026-07-13 13:33:34 +00:00
deny.toml feat: GPG-signed rpm/deb repository indexes (#128) (#841) 2026-07-13 05:51:57 +00:00
docker-compose.yml docs: fix env vars, ports, remove stale docs/, unify with getnora.dev 2026-04-12 17:30:06 +00:00
Dockerfile ci: pin Docker Hub base images to digests (#764) 2026-06-21 15:11:38 +00:00
GOVERNANCE.md docs: add GOVERNANCE.md and ROADMAP.md (#228) 2026-05-01 19:07:06 +03:00
LICENSE chore: update copyright to The NORA Authors 2026-04-27 12:26:53 +03:00
llms.txt docs: document docker_anon_pull in env example and llms.txt (#899) 2026-08-08 10:47:21 +00:00
Makefile chore(clippy): lint test and bench targets under -D warnings (#791) 2026-06-28 09:20:09 +00:00
MONITORING.md feat(storage): operator re-pin recovery for integrity-failed artifacts (#620) 2026-06-03 12:13:46 +00:00
README.md docs(readme): expand supported registries table and fix legend link (#900) 2026-08-09 08:27:44 +03:00
renovate.json chore: repository health — dependency review, SECURITY update (#240) 2026-05-02 17:42:29 -04:00
ROADMAP.md docs: refresh ROADMAP and README roadmap for v0.9.4-v0.9.5 (#775) 2026-06-22 12:10:32 +00:00
rust-toolchain.toml chore: pin Rust toolchain to 1.96.0 (#555) 2026-05-28 20:57:06 +00:00
SECURITY.md security: document RUSTSEC-2023-0071 and RUSTSEC-2025-0119 exclusions (#461) 2026-05-24 10:06:22 +00:00
tarpaulin.toml ci: add diff-scoped coverage gate on pull requests (#836) 2026-07-11 19:54:29 +00:00

NORA

The artifact registry that grows with you. Starts with docker run, scales with your needs.

docker run -d -p 4000:4000 -v nora-data:/data getnora/nora:latest

Open http://localhost:4000/ui/ — your registry is ready.

NORA Dashboard

Why NORA

  • Zero-config — single binary, no database, no dependencies. docker run and it works.
  • 15 registries — Docker, Maven, npm, PyPI, Cargo, Go, Raw, RubyGems, Terraform, Ansible Galaxy, NuGet, Pub (Dart/Flutter), Conan (C/C++), RPM (yum/dnf), Debian/APT.
  • Secure by defaultOpenSSF Scorecard, signed releases, SBOM, fuzz testing, 1200+ tests.

Release License: MIT Artifact Hub Docker Pulls

< 30 MB binary | < 50 MB RAM idle | 3s startup | 15 registries

Supported Registries

All endpoints require authentication. Anonymous read is opt-in via anonymous_read: true.

Format Pull (proxy/cache) Push/Publish Default Upstream Notes
Docker Registry v2 registry-1.docker.io hosted + proxy; cache on when docker.upstreams non-empty (Docker Hub by default)
Maven repo1.maven.org/maven2 hosted + proxy
npm registry.npmjs.org hosted + proxy
Cargo crates.io (sparse index) hosted + proxy (sparse index)
PyPI pypi.org/simple/ hosted + proxy
Go Modules proxy.golang.org proxy only (modules immutable, push not in protocol)
Raw files — (no upstream) hosted only; conditional PUT (ETag/If-Match — local backend only; If-None-Match: * works on any backend)
RubyGems rubygems.org proxy only — gem push not implemented in NORA v1.1.0
Terraform registry.terraform.io proxy only; client configuration notes in COMPAT.md
Ansible Galaxy galaxy.ansible.com proxy only — ansible-galaxy collection publish not implemented
NuGet api.nuget.org proxy only — dotnet nuget push not implemented
Pub (Dart/Flutter) pub.dev proxy only — dart pub publish not implemented
Conan (C/C++) ⚠️ center2.conan.io proxy only; Conan client compatibility tracked in COMPAT.md
RPM (yum/dnf) ⚠️ — (none by default) hosted; pull-through via config.registries.rpm.proxies (off by default); auto-generates repodata/
Debian/APT ⚠️ — (none by default) hosted; pull-through via config.registries.deb.proxies (off by default); flat & structured layouts; auto-generates Packages/Release/InRelease

Helm charts work via the Docker/OCI endpoint — helm push/pull with --plain-http or behind TLS reverse proxy.

Pull/Push legend: supported · ⚠️ partial (pull-through available but off by default, or client compatibility issue) · not implemented in NORA v1.1.0 · — not applicable (protocol has no push). Per-format details and cache strategy in COMPAT.md.

Quick Start

docker run -d -p 4000:4000 -v nora-data:/data getnora/nora:latest

Binary

# x86_64
curl -fsSL https://github.com/getnora-io/nora/releases/latest/download/nora-linux-amd64 -o nora

# ARM64 (Raspberry Pi, Graviton, Apple Silicon VMs)
curl -fsSL https://github.com/getnora-io/nora/releases/latest/download/nora-linux-arm64 -o nora

chmod +x nora && ./nora

./nora listens on 127.0.0.1:4000. To expose it on a network, set the bind address and the public URL clients should use for download links:

NORA_HOST=0.0.0.0 NORA_PUBLIC_URL=https://registry.example.com ./nora

Kubernetes (Helm)

helm repo add nora https://getnora-io.github.io/helm-charts
helm install nora nora/nora

From Source

cargo install nora-registry
nora

Usage

# Docker
docker tag myapp:latest localhost:4000/myapp:latest
docker push localhost:4000/myapp:latest

# npm
npm config set registry http://localhost:4000/npm/
npm publish

# Go
GOPROXY=http://localhost:4000/go go get golang.org/x/text@latest

See full documentation for all registries.

Features

  • Web UI — dashboard with search, browse, i18n (EN/RU)
  • Proxy & Cache — transparent proxy to upstream registries with local cache
  • Curation — blocklist, allowlist, namespace isolation, integrity verification, min-release-age filter, digest quarantine
  • Token RBAC — read/write/admin roles, expiry tracking, deferred last_used flush
  • Mirror CLI — offline sync for air-gapped environments (nora mirror)
  • Backup & Restorenora backup / nora restore
  • S3 Storage — AWS S3, Ceph RGW, any S3-compatible backend
  • Prometheus Metrics/metrics endpoint, Grafana dashboard
  • Rate Limiting — configurable per-endpoint rate limits

Configuration

NORA works out of the box. For advanced setup — auth, S3, retention, curation — see getnora.dev/configuration.

# Auth
docker run -d -p 4000:4000 \
  -v nora-data:/data \
  -v ./users.htpasswd:/data/users.htpasswd \
  -e NORA_AUTH_ENABLED=true \
  getnora/nora:latest
# Curation — block packages younger than 7 days
docker run -d -p 4000:4000 \
  -v nora-data:/data \
  -e NORA_CURATION_MODE=enforce \
  -e NORA_CURATION_MIN_RELEASE_AGE=7d \
  -e NORA_CURATION_ALLOWLIST_PATH=/data/allowlist.json \
  getnora/nora:latest

Performance

Metric NORA Nexus JFrog
Startup < 3s 30-60s 30-60s
Memory < 50 MB idle 2-4 GB 2-4 GB
Binary < 30 MB 600+ MB 1+ GB

Roadmap

  • Mirror CLI v0.4.0
  • Garbage Collection & Retention v0.6.0
  • Helm Chart v0.6.1
  • Signed releases & SBOM v0.6.4
  • Curation layer & 13 registry formats v0.7.0
  • Min Release Age v0.7.1
  • Hash Pin Store, auth rate limiting, Cache-Control v0.8.0
  • Outbound proxy, structured audit log v0.8.3
  • Circuit breaker, OIDC, hot reload, arm64, streaming uploads v0.9.0
  • NuGet V3 stabilization, Cargo ETag, 1049 tests v0.9.1
  • Prometheus metrics, Ansible Galaxy v3, security fixes, 1086 tests v0.9.2
  • Security hardening, null byte protection, config refactor, 1204 tests v0.9.3
  • Multi-upstream PyPI, conditional-request revalidation, single-flight coalescing, per-registry metrics v0.9.4
  • Digest quarantine across all registries, trusted upstream dates, token access-control hardening v0.9.5
  • Image Signing Policy — cosign verification on upstream pulls
  • Semver contract — stable API, configuration format, and storage layout

See ROADMAP.md for the full roadmap and CHANGELOG.md for release history.

Security & Trust

OpenSSF Scorecard CII Best Practices Coverage CI

See SECURITY.md for vulnerability reporting.

Documentation

Full documentation: https://getnora.dev

Author

Created and maintained by Pavel Volkov

Docs Telegram GitHub Stars

Contributing

NORA welcomes contributions! See CONTRIBUTING.md for guidelines.

License

MIT License — see LICENSE

Copyright (c) 2026 The NORA Authors