Cache usually makes CI faster
Once a version has passed policy once, subsequent installs serve from Chainsaw's content-addressed blob store. The round trip to npmjs.org or pypi.org goes away. For teams with big CI matrices this is a noticeable win.
For developers
Chainsaw is a registry proxy, not a plugin and not an agent. You install packages the same way you always have. When something passes policy, nothing looks different. When something fails, the error tells you what rule fired and who can unblock it. That's the whole developer-facing surface area.
$ npm install react@18.3.1
added 1 package in 220ms
$ npm install left-paid
npm ERR! code EBLOCKED
npm ERR! chainsaw: left-paid@1.0.3 blocked
npm ERR! rule: typosquat/left-pad
npm ERR! score: 98 (word-reorder match)
npm ERR! exception contact: security-platform@acme.example
npm ERR! request exception: https://chainsaw.acme.example/exceptions/new?pkg=left-paid Common worries
What's actually true
Once a version has passed policy once, subsequent installs serve from Chainsaw's content-addressed blob store. The round trip to npmjs.org or pypi.org goes away. For teams with big CI matrices this is a noticeable win.
The error names the rule, the reason, and the exception reviewer. A blocked log4j install doesn't say "denied" — it tells you which CVE and which policy, with a link to request an exception if you need to.
Chainsaw proxies the registry, not the package manager. Yarn workspaces, pnpm workspaces, Nx, Turborepo, Lerna — no changes needed. Lockfiles stay the same.
One client credential in .npmrc, pip.conf, ~/.docker/config.json, or settings.xml. The CLI install-hook command will drop it in the right place for the ecosystems you use.
Config snippets
Drop one of these into your existing config file. The chainsaw install-hook
CLI command can do it for you across every ecosystem your project uses.
registry=https://your-chainsaw.example.com/npm/
//your-chainsaw.example.com/npm/:_authToken=${CHAINSAW_TOKEN}
always-auth=true [global]
index-url = https://${CHAINSAW_TOKEN}@your-chainsaw.example.com/pypi/simple/
trusted-host = your-chainsaw.example.com <mirrors>
<mirror>
<id>chainsaw</id>
<url>https://your-chainsaw.example.com/maven/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors> {
"auths": {
"your-chainsaw.example.com": {
"auth": "${BASE64_TOKEN}"
}
}
} [source.crates-io]
replace-with = "chainsaw"
[source.chainsaw]
registry = "https://your-chainsaw.example.com/crates/"
token = "${CHAINSAW_TOKEN}" export GOPROXY=https://${CHAINSAW_TOKEN}@your-chainsaw.example.com/go/,direct
export GOSUMDB=off Performance
On a cache miss, Chainsaw adds the cost of the policy evaluation — low single-digit milliseconds for most rules. On a cache hit, Chainsaw is often faster than the public registry because the blob store is on your network. CI pipelines that install the same 200 packages on every run almost always see an end-to-end speedup.
Local dev
Ask your platform team to keep new rules in monitor for a week. Your installs succeed as they always did; the audit log captures what would have been blocked. By the time a rule flips to enforce, you've already been warned about the handful of legitimate dependencies that need exceptions.
Monorepos
Chainsaw proxies the registry, so anything that resolves dependencies through npm, pip, Maven, Go modules, Cargo, Composer, or Docker works unmodified. Turbo, Nx, Lerna, Yarn workspaces, and pnpm workspaces all run without changes. Lockfiles don't need to be regenerated.
Agents
If you use an AI coding agent, it can query Chainsaw's MCP server to check whether a package would be allowed before suggesting it. The same RBAC applies — agents get exactly the scope the admin gives them. See /for-agents/ for setup.
Evaluating for your team?
Point a single .npmrc at Chainsaw, install a package that's on a CVE list, and see the error for yourself. If it's not faster or safer than what you run today, that's a clean signal.