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 92.6%
  • Shell 4.9%
  • TypeScript 2%
  • Dockerfile 0.2%
  • JavaScript 0.2%
Find a file
DevITWay | Pavel Volkov 013b0b25a6
refactor(storage): type StorageError::Io as #[from] std::io::Error (#793)
StorageError::Io carried a String, so every fs call erased the io::Error to
text via `.map_err(|e| StorageError::Io(e.to_string()))?`, losing ErrorKind
and the source chain (RI-19 error-erasure: storage was 20+ of 44, over the
budget of 40).

Type the variant as `Io(#[from] std::io::Error)`:
- ~23 `.map_err(|e| StorageError::Io(e.to_string()))?` collapse to `?`
  (auto-conversion via #[from]); the real io::Error is preserved.
- non-io constructions (hash-pin "record failed", JoinError "task panicked",
  one test mock) wrap their message via `std::io::Error::other(..)`.
- Network(String) is left untyped on purpose: it is matched on its payload
  (s3.rs `Network(msg) =>`), so #[from] would break that arm.

No StorageError::Io payload is pattern-matched anywhere, so the variant-shape
change is safe; Display is unchanged ("IO error: {0}"; io::Error: Display).

RI-19 erasure 44 -> 21 (under budget). cargo fmt + clippy -D warnings clean;
1434 tests pass. Net -44 lines (map_err boilerplate removed).
2026-06-29 23:13:31 +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 chore(clippy): lint test and bench targets under -D warnings (#791) 2026-06-28 09:20:09 +00:00
deploy ci: pin Docker Hub base images to digests (#764) 2026-06-21 15:11:38 +00:00
dist fix: storage metrics wiring + dashboard hardening (#443) 2026-05-22 22:46:01 +00:00
docs-ru Deduplicate OpenAPI schema types (#227) 2026-05-01 14:55:34 +03:00
docs-site refactor(registry): verified code-quality cleanups + metrics-label docs fix (#790) 2026-06-28 09:19:45 +00:00
fuzz test(fuzz): add URL-leak fuzz target + assertion for npm rewrite (#730) 2026-06-15 20:38:52 +00:00
nora-registry refactor(storage): type StorageError::Io as #[from] std::io::Error (#793) 2026-06-29 23:13:31 +00:00
scripts chore: release v0.9.6 (#784) 2026-06-27 12:38:52 +00:00
tests fix: v0.9.3 security patches — null byte rejection + Cargo User-Agent (#565) 2026-05-30 18:22:56 +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 docs: refresh ARCHITECTURE.md Code Map to match current src layout (#772) 2026-06-22 06:42:26 +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 v0.9.6 (#784) 2026-06-27 12:38:52 +00:00
Cargo.toml chore: release v0.9.6 (#784) 2026-06-27 12:38:52 +00:00
CHANGELOG.md chore: release v0.9.6 (#784) 2026-06-27 12:38:52 +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 feat(auth): anonymous Docker pull via docker_anon_pull (#778) (#780) 2026-06-23 20:34:47 +00:00
CONTRIBUTING.md fix(nuget): rewrite SearchAutocompleteService URLs in service index (#262) 2026-05-07 11:51:33 +03:00
deny.toml feat: OIDC Workload Identity authentication (#342) (#348) 2026-05-16 19:13:41 +03: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(llms): address GitHub Code Quality findings on llms.txt (#762) 2026-06-21 14:38:17 +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: refresh ROADMAP and README roadmap for v0.9.4-v0.9.5 (#775) 2026-06-22 12:10:32 +00: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: enforce the coverage fail-under floor (#677) 2026-06-10 21:41:38 +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.
  • 13 registries — Docker, Maven, npm, PyPI, Cargo, Go, Raw, RubyGems, Terraform, Ansible Galaxy, NuGet, Pub (Dart/Flutter), Conan (C/C++).
  • Secure by defaultOpenSSF Scorecard, signed releases, SBOM, fuzz testing, 1200+ tests.

Release License: MIT Artifact Hub Docker Pulls

< 27 MB binary | < 50 MB RAM idle | 3s startup | 13 registries

Supported Registries

Registry Mount Point Upstream Proxy Auth
Docker Registry v2 /v2/ Docker Hub, GHCR, any OCI, Helm OCI
Maven /maven2/ Maven Central, custom
npm /npm/ npmjs.org, custom
Cargo /cargo/ crates.io
PyPI /simple/ pypi.org, custom
Go Modules /go/ proxy.golang.org, custom
Raw files /raw/
RubyGems /gems/ rubygems.org
Terraform /terraform/ registry.terraform.io
Ansible Galaxy /ansible/ galaxy.ansible.com
NuGet /nuget/ api.nuget.org
Pub (Dart/Flutter) /pub/ pub.dev
Conan (C/C++) /conan/ ConanCenter

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

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 < 27 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