Nothing stopped it
Either no check found a reason to stop it, or a person allowed it. Kurra serves the package as normal.
Point your package managers at Kurra, a caching gateway for 14 ecosystems. It checks each package for known advisories, disallowed licenses, and look-alike names, then records the decision and its reason.
Your package managers work the way they do today. You change the address they use, and Kurra serves what the upstream has once it passes the checks.
-registry=https://registry.npmjs.org/+registry=https://kurra.example.com/npm/npmjs/+//kurra.example.com/npm/npmjs/:_authToken=${KURRA_TOKEN}Every package version is Allowed or Blocked. Kurra records the reason for each decision, so the person whose build stopped can see which rule stopped it.
Either no check found a reason to stop it, or a person allowed it. Kurra serves the package as normal.
Clients get an error that names the rule and says what to do next. The reason names the cause, such as an advisory, a license, or an administrator.
The message your package manager prints leads with the outcome, names the rule, and says what to do next.
People can also allow or block a package by hand. A manual decision never expires, and only a person can clear it.
$ npm install lodash@4.17.20
Access is denied: lodash 4.17.20 is blocked by Kurra policy because of advisory GHSA-35jh-r3h4-6jhm (critical).
Use 4.17.21 or later, or ask an administrator to review this decision.Tokens, roles, and activity work the same way in every ecosystem. Policy checks run wherever the ecosystem provides the data they need.
Advisories, package licenses, software bills of materials, provenance, and an audit log are part of the cache itself, not a separate tool you add.
Each version is checked against published advisories from npm and OSV the first time it is pulled. Cached versions are checked again later.
Set an SPDX allow list or deny list. If Kurra can’t read a package’s license, it allows the package.
Flags package names that look like typosquats of popular packages, before anything is fetched.
Refuses a version until it has been published for the number of days you set. This covers every ecosystem except Docker and OCI Helm charts, which state no publish time.
Kurra generates a CycloneDX bill of materials the first time a Docker or Helm image is cached.
Kurra checks the signatures, checksums, and attestations that upstream registries publish, and records the result. A file that doesn’t match a published checksum is never cached or served.
For packages you host, Kurra verifies SLSA provenance from a Sigstore bundle you supply. It stores public keys and never signs anything.
Activity records each decision with its reason and the time it was made. The audit log behind it is tamper-evident.
A token can hold fewer permissions than its owner, but never more, and can reach only the registries you choose. It expires after 90 days unless you set another lifetime.
| Name | Permissions | Registries | Last used | Expires |
|---|---|---|---|---|
| release-publisher | npm:publish | acme-npm | 2 hours ago | in 61 days |
| ci-build | registries:read | All registries | 1 hour ago | in 88 days |
| audit-export | audit:read | All registries | 27 hours ago | in 5 days |
Either way, your packages are stored in a bucket you own, and each tenant is kept separate from the others.
Each tenant connects its own S3-compatible bucket. Kurra doesn’t keep a bucket of its own.
Run Kurra with Docker Compose or a Helm chart, inside your own network.
A tenant is a team or business unit in your organization. Its registries, tokens, roles, usage, and activity belong to it alone.
Find the code, the documentation, and the latest changes on GitHub.
View Kurra on GitHub