chore: let Renovate keep dependencies current - #14
Merged
Conversation
Nothing was watching dependencies between manual refreshes. The web tree had drifted 39 packages, 28 of them majors, and carries a live moderate advisory (GHSA-cp6q-959q-f8rh, prototype pollution in @tiptap/core) whose only fix is in the 3.x line. Patch and minor updates merge themselves once CI is green — nextest, vitest, playwright, clippy and cargo-deny all gate the PR. Majors do not open a PR at all; they are listed on the Dependency Dashboard and raised one at a time when someone ticks the box, so a migration like tiptap 2 → 3 stays a deliberate choice instead of eight red PRs landing at once. Weekly lockFileMaintenance matters more than it looks: refreshing the lockfiles is the only route by which a patched *transitive* dependency arrives, since bumping a direct dependency cannot pull one in. The h2 and chacha20 advisories patched by hand in 0.3.0 were exactly that shape. Three versions live in more than one file and are grouped so they move atomically, because bumping one side alone either breaks the build or drifts silently past the comments telling humans to keep them in sync: - Rust: rust-toolchain.toml, dtolnay/rust-toolchain in ci.yml, and the Dockerfile's rust image - pnpm: packageManager in both package.json files and pnpm/action-setup - Node: the Dockerfile's node image and setup-node's node-version Custom managers cover the four of those Renovate has no manager for, plus the Dockerfile's ZIG_VERSION arg. Each regex was checked against the real files: they match all three setup-node and action-setup blocks, not just the first. Three things are deliberately excluded from automation. The prosemirror-* pins in web/pnpm-workspace.yaml are exact and load-bearing — they deduplicate the ProseMirror core that @tiptap/pm and y-prosemirror both pull, and the comment there records that prosemirror-view 1.42 broke history restore in a way only CI caught. Renovate would read that as an ordinary patch and merge it. The security floors in the same overrides block need a human to confirm the hard-pinning parent still resolves, and @playwright/test ships the browser the e2e suite runs against. Note this file is inert until the Renovate GitHub App is installed on the repository. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Nothing was watching dependencies between manual refreshes. Current state:
web/: 39 outdated, 28 of them majors — tiptap 2→3 (×20), tailwind 3→4, typescript 5.9→7.0, vite 7→8, vitest 4→5, jsdom 29→30,@vitejs/plugin-react4→6,@types/node24→26mergeAttributes()in@tiptap/coreturns an own__proto__key into inherited executable DOM attributes. Vulnerable<3.30.4; we are on2.27.2, so there is no fix inside the 2.x line — closing it means the tiptap 3 migration.cargo deny check advisoriesis clean, with the four documented ignores intact.e2e/: clean apart from@types/node.rust-toolchain.tomlwere unmanaged entirely.Policy
Patch and minor merge themselves once CI is green — nextest, vitest, playwright, clippy and cargo-deny all gate the PR.
Majors never open a PR on their own. They are listed on the Dependency Dashboard issue and raised one at a time when someone ticks the box, so tiptap 2→3 stays a deliberate piece of work rather than eight red PRs landing together.
Weekly
lockFileMaintenanceis the part that is easy to undervalue: refreshing the lockfiles is the only route by which a patched transitive dependency arrives, because bumping a direct dependency cannot pull one in. Theh2andchacha20advisories patched by hand for 0.3.0 were exactly that shape.Three versions that live in more than one file
Each is grouped into a single PR. Bumping one side alone either breaks the build or drifts silently past the comments that tell humans to keep them in sync:
rust-toolchain.toml,dtolnay/rust-toolchain@…,rust:…-alpinepackageManager×2,pnpm/action-setupversion:node:…-alpine,setup-nodenode-version:Custom managers cover the four Renovate has no built-in manager for, plus the Dockerfile's
ZIG_VERSION. Each regex was checked against the real files rather than assumed — they match all threesetup-nodeandaction-setupblocks inci.yml, not just the first, and resolve the rightcurrentValue:Config passes
renovate-config-validator.Deliberately not automated
prosemirror-model/-state/-view— pinned exactly inweb/pnpm-workspace.yamlto deduplicate the core that@tiptap/pmandy-prosemirrorboth pull. The comment there records that takingprosemirror-view1.42 changed how a remote replace-the-document update applies and broke history restore in a way only CI reproduced. Renovate would read1.41.8 → 1.41.9as an ordinary patch and merge it under the automerge policy. Dashboard-only.overridesblock (nanoid,lodash-es,dompurify) — they exist because a parent hard-pins a vulnerable version, so raising one needs a human to confirm the parent still resolves.@playwright/test— ships the browser binaries the e2e suite actually runs against.Two things to action
mainhas no branch protection — no required status checks. Automerge still waits for CI (Renovate checks the results itself), but nothing at the platform level enforces it. Worth adding required checks before this goes live.🤖 Generated with Claude Code