Automatic dependency updates
Your dependencies ship a new release every few days, and any one of them can break your code, fix a
bug you work around, or add an API that lets you delete code. Your project ships a
Renovate configuration, .github/renovate.json5, that turns each
release into a pull request with the release notes in its body. You judge the change next to the
notes that explain it.
The configuration does nothing until you install the Renovate app on your repository. That's the main step on this page.
flowchart LR
R["A dependency<br/>releases"] --> A{"A day old?"}
A -- "not yet" --> W["Waits"]
A -- "yes" --> S["Monday"]
S --> P["Opens a pull request<br/>with the release notes"]
P --> Y["You review<br/>and merge"]
What it does
- One pull request per package. Packages released together from one repository, such as
nuxtand@nuxt/kit, share a pull request, because they share one changelog. - Nothing merges itself. Every update, however small, waits for you to read it and merge it.
- Once a week. New pull requests open on Monday, UTC. A fix for a known security advisory skips the wait and opens straight away.
- Never on release day. pnpm refuses to install a release younger than the
minimumReleaseAgeinpnpm-workspace.yaml, so Renovate waits at least as long. - No
vitestpull requests. vite-plus pins thevitestyour tests run on, and any other version installed beside it stops every test file from loading. When a vite-plus pull request moves that pin, setvitestin thepnpm-workspace.yamlcatalog to match.
Turn it on
Install the Renovate app
Open the Renovate app on GitHub and select Install, or Configure if your account already has it. Pick the account that owns your repository, choose Only select repositories, select your repository, then Install.
Choose Only select repositories because Renovate opens an onboarding pull request in every repository it can reach that has dependencies and no Renovate configuration. Yours has one, so Renovate skips onboarding and starts working. Installing Renovate is the fallback if a screen has moved.
GitHub then hands you to Mend's Onboard Organization wizard, since Mend hosts the app:
| Screen | Choose | Why |
|---|---|---|
| Select Product | Renovate Only | Mend Application Security needs a paid Mend license |
| Select Mode | Scan and Alert | The default, Scan Only, runs Renovate silently: no pull requests and no dashboard issue |
mode: 'full' in .github/renovate.json5 overrides Scan Only for your repository, so a wrong
pick here still gets you pull requests. "Alert" means Renovate's pull requests, issues, and checks,
not security alerts. Those come from the next step.
Turn on security alerts
Renovate raises a security fix only for an advisory GitHub has already flagged in your repository. Turn on Dependabot alerts, which also turns on the dependency graph they need:
gh api --method PUT repos/<owner>/<repo>/vulnerability-alerts
Then open the Renovate app, select Configure, and confirm the Permissions section includes read access to Dependabot alerts.
Skip this step and a security fix waits for Monday like any other update. Leave Dependabot's own security updates off: Renovate raises the fix, and Dependabot would open a second pull request for the same advisory.
Find the Dependency Dashboard
Renovate's first run opens an issue in your repository titled Dependency Dashboard. It lists every update Renovate has found, including the ones it hasn't opened yet, and marks any package with no release in over a year as abandoned.
The first run finds everything your project has fallen behind on at once. Renovate caps how many pull requests are open at the same time, and the rest wait in the dashboard. Select an update's checkbox there to open its pull request now, rather than on Monday.
Review a pull request
Renovate opens every pull request as a draft, and CI skips drafts, so an update spends no Actions minutes until you look at it. Select Ready for review to run CI on it. If you've added pull request previews, it also gets a preview you can click through.
Read the release notes in its body for three things:
- A breaking change that your code has to adopt
- A fix for a bug that your code works around, so the workaround can go
- A new API that does what your code does by hand
Your AI coding agent can do this pass for you: point it at the pull request and ask the same three questions of your code.
Merge it when you're satisfied. Close a major update you aren't ready for, and Renovate won't
propose that major again, only the next one. Some are held on purpose: comments in the catalog of
pnpm-workspace.yaml say which versions are held back and what they're waiting for.
A pull request that changes .github/renovate.json5 itself is Renovate renaming one of its own
options. Merge it like any other.
Merge one without CI
Some updates need no preview, because their release notes promise nothing you'd see in one. The
pr:skip-ci label merges such a pull request with no CI run. The push to the target branch still
runs CI on the merged result.
- Create the label, once per repository:
gh label create pr:skip-ci --description "Merge with no CI run or preview" - While the pull request is still a draft, label it, mark it ready, and merge it:
gh pr edit <n> --add-label pr:skip-ci && gh pr ready <n> && gh pr merge <n> --squash - Watch the run on the target branch. If it fails, revert the merge.
Add the label before you mark the pull request ready. Each run reads the labels the pull request had when the run started.
Change what it does
- Wait longer after a release: raise
minimumReleaseAgein.github/renovate.json5first, then inpnpm-workspace.yaml. While Renovate's value is the lower of the two, it proposes releases pnpm refuses to install. - Anything else: Renovate's configuration options.
When it does not work
| What you see | What to fix |
|---|---|
| No pull requests and no Dependency Dashboard | The app isn't installed on this repository, Mend runs it in Scan Only mode (switch the repository to Scan and Alert in the Mend Developer Platform), or the repository has Issues turned off, and the dashboard is an issue |
| Renovate comments Artifact update problem on a pull request | Renovate proposed a release pnpm refuses as too new, so its minimumReleaseAge is below pnpm's. See Change what it does |
An update to a package patches/ patches fails at install | The patch targets the old version. Check out the branch, run pnpm patches:build, or pnpm patches:remove <number> when the release already carries that pull request, and commit what it writes |
A polar update fails the polar models test | The schemas that check Polar data come from the previous SDK. Check out the branch, run pnpm --filter @app/layer-payments polar:models, and commit what it writes |
| No security fix pull requests | Dependabot alerts are off, or the app can't read them. See Turn on security alerts |
Next steps
- Getting updates — pull NuxtStart's own later changes into your project, which Renovate doesn't do
- Deploy pipeline — what CI runs on every pull request, Renovate's included
Set up sign-in and payments
Create the Google, GitHub, and Polar credentials your project needs, and put each half in the right place.
Project board sync
Keep a GitHub Project board holding the issues that have a milestone and the pull requests Renovate opens, or remove the workflow if you don't track work that way.
