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 79%
  • JavaScript 17.6%
  • Shell 2.3%
  • TypeScript 0.7%
  • Python 0.2%
Find a file
DevITWay | Pavel Volkov aa4de65fe1
docs(storage): a GCS emulator needs a disable_oauth key file; fake-gcs-server is not one (#1187)
The GCS doc comments named fake-gcs-server as a supported emulator. It is
not: it has no XML API object PUT and does not handle x-goog-copy-source,
so NORA cannot write to it on any version.

They also implied an http:// base_url is enough. It skips request signing,
but object_store's GCS client still asks the credential provider for a
token on writes, so without key material every PUT fails with "Error
getting token response body". A service-account file with
"disable_oauth": true (private_key, private_key_id and client_email
present but unused) makes writes work against an XML API emulator.
2026-10-27 16:05:48 +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 security: 1.4.2 — request-path edge check, Ed25519-only signing key, TLS roots, tokio (#1174) 2026-10-25 12:03:14 +00:00
changelog.d chore(release): v1.4.3 (#1178) 2026-10-26 18:08:33 +00:00
deploy chore(release): v1.4.3 (#1178) 2026-10-26 18:08:33 +00:00
dist fix(proxy): a circuit breaker per configured upstream, and no URL credentials in logs (#1059) 2026-10-10 17:52:11 +00:00
docs/design feat(cpan): add CPAN proxy registry (#1004) 2026-09-19 12:13:53 +00:00
docs-ru fix: 1.4.3 — provenance of hosted names, OIDC audience, token lifetimes, connection deadlines, panics (#1176) 2026-10-26 12:40:34 +00:00
fuzz fix: 1.4.3 — provenance of hosted names, OIDC audience, token lifetimes, connection deadlines, panics (#1176) 2026-10-26 12:40:34 +00:00
nora-registry docs(storage): a GCS emulator needs a disable_oauth key file; fake-gcs-server is not one (#1187) 2026-10-27 16:05:48 +00:00
scripts fix: 1.4.3 — provenance of hosted names, OIDC audience, token lifetimes, connection deadlines, panics (#1176) 2026-10-26 12:40:34 +00:00
tests chore: comments and scripts name public references only (#1131) 2026-10-17 14:23:28 +00:00
.dockerignore chore(build): reproducible builds (--locked, vendored Swagger UI) (#1104) 2026-10-16 04:50:32 +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 chore(build): serve Swagger UI from files in the repository, without utoipa-swagger-ui (#1125) 2026-10-16 09:53:32 +00:00
ARCHITECTURE.md docs(hf): changelog, COMPAT, README, OpenAPI and an e2e spec for the Hugging Face proxy (#1113) 2026-10-16 13:50:12 +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: a shorter README, and its details where they belong (#1170) 2026-10-20 12:07:49 +00:00
Cargo.lock chore(release): v1.4.3 (#1178) 2026-10-26 18:08:33 +00:00
Cargo.toml chore(release): v1.4.3 (#1178) 2026-10-26 18:08:33 +00:00
CHANGELOG.md chore(release): v1.4.3 (#1178) 2026-10-26 18:08:33 +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 fix: 1.4.3 — provenance of hosted names, OIDC audience, token lifetimes, connection deadlines, panics (#1176) 2026-10-26 12:40:34 +00: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: 1.4.3 — provenance of hosted names, OIDC audience, token lifetimes, connection deadlines, panics (#1176) 2026-10-26 12:40:34 +00:00
CONTRIBUTING.md docs(contributing): write down scope, assignment and incentive rules (#1037) 2026-10-03 07:56:52 +00:00
deny.toml security: 1.4.2 — request-path edge check, Ed25519-only signing key, TLS roots, tokio (#1174) 2026-10-25 12:03:14 +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 fix: 1.4.3 — provenance of hosted names, OIDC audience, token lifetimes, connection deadlines, panics (#1176) 2026-10-26 12:40:34 +00:00
GOVERNANCE.md docs: a shorter README, and its details where they belong (#1170) 2026-10-20 12:07:49 +00:00
LICENSE chore: update copyright to The NORA Authors 2026-04-27 12:26:53 +03:00
llms.txt docs(hf): changelog, COMPAT, README, OpenAPI and an e2e spec for the Hugging Face proxy (#1113) 2026-10-16 13:50:12 +00:00
Makefile fix: 1.4.3 — provenance of hosted names, OIDC audience, token lifetimes, connection deadlines, panics (#1176) 2026-10-26 12:40:34 +00:00
MONITORING.md fix: 1.4.3 — provenance of hosted names, OIDC audience, token lifetimes, connection deadlines, panics (#1176) 2026-10-26 12:40:34 +00:00
README.md docs: a shorter README, and its details where they belong (#1170) 2026-10-20 12:07:49 +00:00
renovate.json chore: repository health — dependency review, SECURITY update (#240) 2026-05-02 17:42:29 -04:00
ROADMAP.md docs: a shorter README, and its details where they belong (#1170) 2026-10-20 12:07:49 +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: 1.4.2 — request-path edge check, Ed25519-only signing key, TLS roots, tokio (#1174) 2026-10-25 12:03:14 +00:00
tarpaulin.toml ci: add diff-scoped coverage gate on pull requests (#836) 2026-07-11 19:54:29 +00:00

NORA

One binary, seventeen package formats, no database. NORA is a self-hosted artifact registry and pull-through cache for Docker, Maven, npm, PyPI, Cargo, Go and more, with supply-chain controls built in.

Release License: MIT Docker Pulls Artifact Hub CI OpenSSF Scorecard CII Best Practices Docs Telegram

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

Open http://localhost:4000/ui/: the registry is ready.

NORA dashboard

Why NORA

  • Small and quick to start. A static binary of about 23 MB with no database and no runtime to install; it answers in under a second and idles at about 15 MB of memory (BENCHMARKS.md).
  • Seventeen formats, hosted and proxied. One registry for containers, language packages, OS packages and Hugging Face models, on local disk, S3-compatible storage or Google Cloud Storage.
  • What you publish stays yours. A package, crate or image published to NORA is never replaced by an upstream package of the same name. Curation — allowlist, blocklist, minimum release age, quarantine of new versions, internal namespaces — decides what reaches your builds.
  • Ready to operate. A web UI in English, Russian and Chinese, API tokens with read, write and admin roles, keyless publishing from GitHub Actions and GitLab CI with OIDC, rate limits, an audit log and Prometheus metrics.
  • Works without the internet. nora mirror prefetches what your lockfiles name for air-gapped networks, nora import moves an Artifactory or Nexus repository in, and nora backup / nora restore keep a copy.

Supported formats

Format Proxy & cache Hosted
Docker / OCI ✅ ✅
Maven ✅ ✅
npm ✅ ✅
PyPI ✅ ✅
Cargo ✅ ✅
Go modules ✅ —
Raw files — ✅
RubyGems ✅ —
Terraform ✅ —
Ansible Galaxy ✅ —
NuGet ✅ —
Pub (Dart, Flutter) ✅ —
Conan (C, C++) ✅ —
CPAN ✅ —
RPM (yum, dnf) opt-in ✅
Debian / APT opt-in ✅
Hugging Face Hub opt-in —

Opt-in: the Hugging Face proxy (NORA_HF_ENABLED=true) and RPM/Debian pull-through ([rpm.proxies], [deb.proxies]). Default upstreams, protocol coverage and client notes for each format: COMPAT.md.

Install

  • Docker: getnora/nora on Docker Hub and ghcr.io/getnora-io/nora (amd64, arm64), with RED OS and Astra Linux SE variants (<version>-redos, <version>-astra).
  • Kubernetes: helm repo add nora https://getnora-io.github.io/helm-charts && helm install nora nora/nora (Helm guide).
  • Binary, .deb / .rpm packages, from source: installation guide.

Upgrading: upgrade guide.

Use

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

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

# pip
pip install --index-url http://localhost:4000/simple/ requests

Every format has its own page with client setup, publishing and proxy options: registries.

Configure

NORA reads environment variables or a config.toml. A registry that proxies upstream packages should say how they are checked:

NORA_CURATION_MODE=enforce NORA_CURATION_MIN_RELEASE_AGE=7d \
NORA_CURATION_QUARANTINE=enforce \
  docker run -d -p 4000:4000 -v nora-data:/data getnora/nora:latest

All settings: configuration reference, curation, authentication, S3 storage. Metrics and dashboards: MONITORING.md.

Security

Releases are signed with cosign and ship SBOMs (SPDX, CycloneDX) and SLSA provenance. Advisories are published on GitHub; report a vulnerability as described in SECURITY.md.

Roadmap

Next is 1.5.0: an explicit curation.mode whenever a proxy registry is enabled, and one definition of an artifact count across the dashboard, the API and the metrics. See ROADMAP.md and CHANGELOG.md.

Ecosystem

  • Dozor compiles the OSV advisory feed and an inventory of your registry into a curation blocklist that NORA enforces.
  • Helm chart for Kubernetes.

Community

Questions and ideas: Telegram and issues. Contributions are welcome — see CONTRIBUTING.md, CODE_OF_CONDUCT.md and GOVERNANCE.md.

License

MIT — see LICENSE. Copyright (c) 2026 The NORA Authors.