Python and npm, direct and transitive
Your dependencies have known holes. Rivet closes them.
It reads the advisories, upgrades the packages, fixes the code the upgrade breaks, and runs your own tests until they pass, then opens one draft pull request. Start by scanning a repository. No install, no account.
Public repositories only. Try
- Transitive too
- Most vulnerable packages are in nobody's manifest. On a real Next.js app, 13 of 14 were transitive, Rivet moves those as well.
- Held to your tests
- It upgrades, fixes the calling code, and reruns your suite until it is green. Your tests are frozen: they are the thing being satisfied.
- One draft PR
- One pull request per repository, not per advisory, and always a draft. Nothing green means no pull request at all.
Reachability
Sixty-eight advisories. One touches code you call.
A flat list of every vulnerable version installed anywhere in your tree is why people stop reading these. Rivet reads the repository's own source and says which findings reach it, so the list gets shorter to read instead of longer.
Reaches your code
Your own source imports the package, cited by file and line, so you can go and look. On that repository, exactly one package did.
No import found
Transitive or build-time: named by no manifest this repository owns, and nothing in the checkout imports it. Still listed, still fixed.
Unknown
A declared dependency with no visible import, or a checkout we could not read whole. Unknown is the default, because guessing here is the dangerous direction.
What it will not say
It never says “you are not affected”. Claiming somebody is safe is a far stronger claim than claiming they are at risk, and being wrong that way gets a real vulnerability ignored. So there are three verdicts, not two, and every uncertainty lands on unknown.
What it changes
Ordering and emphasis, never inclusion. Every finding stays on the report, every fixable package stays fixable, and no upgrade is skipped because of a reachability verdict. It decides what you read first, not what gets fixed.
Verdicts come from your manifests, your source and the advisory's own text. No model is asked, nothing is uploaded to a sandbox, and the whole check is free.
What it does
One pull request per repository, not one per advisory.
A bump bot opens a pull request per advisory and lets your CI go red. Rivet takes the whole repository at once: one checkpoint, one upgrade pass, one test run, one review, one draft pull request.
- 31
- packages upgraded
- 153
- advisories cleared
- 1
- pull request
- $0.69
- total cost
One measured run on one repository. A single-package run is about $0.13.
Transitive, not just direct
The packages with advisories are usually in nobody's manifest. On a real Next.js app, 13 of 14 were transitive. Rivet moves them the cheapest way that works, a direct bump, a lockfile refresh, or an overrides entry the pull request announces in a warning block.
Verified with your tests
Your suite is the oracle, and it is frozen: neither the tests nor the command that runs them can be edited to go green. If a repository has no tests, Rivet falls back to a typecheck, a build, or an import check, and the pull request says plainly which rung answered.
Python and npm
pip, uv and requirements files; npm, pnpm, yarn and bun. Installed versions are read from the lockfile, because that is what your repository actually ships. Detection covers more ecosystems than fixing does, and says so rather than staying quiet.
Watch mode, per repository
Opt in one repository at a time, with a policy. Patch and minor upgrades go on their own; a major waits and asks. A repository you have not opted in is still scanned and still reported, access to read is not permission to act.
An honest no
No published fix, an abandoned package, a suite that was already red, a test job that needs a database nothing here can start: Rivet says which, and opens nothing. A wrong pull request is worse than a question.
Draft, never merged
Commits land as the bot, on its own branch, in a draft pull request carrying the advisory, the diff, the tests that now pass and the sources it read. Rivet has no path that merges anything. That stays yours.
Fleet view
Hundreds of repositories, one page.
Every repository you have connected, rolled up into the one question that matters at that size: which are at risk right now. Select the ones you want fixed and start them together, each still gets its own run and its own pull request, because that is the unit a reviewer works in. Only the asking is shared, and twenty-five repositories at a time is the cap.
A repository nobody scanned is never counted as clean.
It reads unscanned, which is the truth. The one thing this product must never do is report an all-clear it cannot back up.
How it works
Four phases, each one bounded.
Nothing runs against your repository directly. Every phase runs against one sandbox checkpoint, and a run that gets nowhere restores it and tries again, up to three attempts before it stops and says why.
- 01OSV.dev · GitHub Advisory DB
Detect
Installed versions come out of your lockfiles; the advisories and the fixed releases come from OSV.dev, the GitHub Advisory Database, and your own Dependabot alerts. No model invents a version, ever.
- 02Tavily Search + Extract
Research
For an upgrade that breaks things, the changelog and the migration guide are found and read, and every page is stored and cited on the pull request.
- 03Token Factory Sandboxes
Upgrade and iterate
Your repository is checkpointed in a sandbox and its tests are run untouched first. Then the packages move, and the agent edits the calling code and reruns until the suite is green, restoring the checkpoint and retrying if an attempt dead-ends.
- 04NVIDIA Nemotron on Nebius Token Factory
Re-audit and review
The new lockfile is audited again, so "fixed" comes from the advisory database rather than from a model. A second model then reviews only the winning diff and the advisory. No match, no pull request.
Scan first
Comment @rivetbot check for the report. It starts no run and costs nothing.
Fix it
Comment @rivetbot fix this, or name a package. Several vulnerable packages get a checklist instead of a guess.
Automatically
On a repository you have put in watch mode, a wave of Dependabot alerts starts one run for the whole wave.
Your code is checked out and run inside a Token Factory Sandbox on Nebius, and the planning, editing and review are done by NVIDIA Nemotron models served from Nebius Token Factory. Your repository secrets are never put into the sandbox, and nothing is written to GitHub except a branch and a draft pull request.
Start with one repository.
Scan it first, that needs nothing from you. Install Rivet when you want the advisories fixed, pick the repositories it may act on, and read the draft pull request it hands back.
Draft pull requests only. Rivet never merges anything.