Skip to content

deps: consolidate the open dependency PRs into one toolchain upgrade - #489

Merged
jnnngs merged 20 commits into
mainfrom
claude/pr-consolidation-fixes-jfmb7o
Sep 8, 2026
Merged

jnnngs merged 20 commits into
mainfrom
claude/pr-consolidation-fixes-jfmb7o

Conversation

@jnnngs

@jnnngs jnnngs commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

What and why

Sixteen Dependabot PRs were open against main, several of which could not land
on their own: Vitest 5 needs Vite 6+, ESLint 10 needs a react-hooks plugin that
does not exist below v7, and the Go and Node bumps left the Dockerfiles building
against toolchains older than the manifests now require. This branch takes all
sixteen together, resolves the interlocks, and fixes what the newer versions
broke, so there is one thing to review and one lockfile to regenerate.

Landed here — #486, #487 (Go), #485 (Actions), #438, #441, #471 (base images),
#442, #444 (e2e), #446, #447, #448, #450, #451, #452, #472 and the compatible
half of #488. They should auto-close when this merges.

Held back deliberately, both from #488 and #446:

  • Tailwind 4. It redefines utilities the design system already leans on —
    shadow-sm, rounded-sm, ring, outline-none — and there are 191 uses of
    those across the app, so the upgrade is a silent visual change everywhere
    rather than a version bump. It needs its own PR with someone actually looking
    at the pages. Tailwind moves to 3.4.19 here instead.
  • TypeScript 7. No typescript-eslint release supports it (8.70 still pins
    typescript <6.1.0), so taking it means an unsupported parser or
    --legacy-peer-deps. TypeScript 6 is the highest version inside that range and
    is what landed, in both frontend/ and e2e/.

Fixes the upgrades themselves required:

  • Go 1.26 / Node 26. backend/Dockerfile still built on golang:1.25-alpine,
    which cannot compile a go 1.26.0 directive, and every workflow installed
    Node 20 (EOL since April 2026) while the frontend image moved to
    node:26-alpine — so CI was testing a tree the image did not build. Both are
    aligned, and the Go directive is pinned to 1.26.8 rather than 1.26.0,
    following the note in backend/go.mod about the directive being the stdlib
    floor.
  • React 19. Needs react-leaflet 5 (react-leaflet 4 pins react ^18). Its
    useRef typings now return RefObject<T | null>, so the two hooks that take a
    ref widened their parameters, and EventScorecard uses ReactElement in place
    of the global JSX namespace React 19 removed.
  • jsdom 30 makes window.location a live Location setter that coerces its
    argument to a URL string, so the two suites that swapped it with
    Object.assign now redefine the property. That was 14 failing tests.
  • ESLint 10 forces eslint-plugin-react-hooks 7, which folds the React
    Compiler diagnostics into its recommended set — ~70 findings, each a
    behavioural refactor. Those six rules are switched off with a note naming them
    as follow-up work; rules-of-hooks and exhaustive-deps stay on, so the gate
    enforces exactly what it enforced before (verified against a probe file).
    react-refresh 0.5 flags all 85 exports of the route manifest, which is exempted
    per-file.
  • lucide-react 1 drops every brand icon, so the Facebook share button gets an
    inline mark next to the X one already drawn there.
  • TypeScript 6 no longer auto-includes @types/node, which the suites reading
    fixtures off disk relied on transitively; it is now an explicit devDependency
    with a types entry.
  • e2e: ESLint 10 removed .eslintrc support entirely, so that suite moves to
    a flat config, and baseUrl is dropped (deprecated in TS 6; paths resolves
    from the tsconfig directory without it). The three findings the newer rules
    surfaced are fixed, not silenced.

npm audit on frontend/ goes from 8 findings to 2 — the runtime half
(--omit=dev, the hard gate) is clean, and what remains is the @capacitor/cli
tar advisory already written up in SECURITY.md. e2e/ is clean.

How you tested it

Everything below ran from a wiped node_modules and a regenerated lockfile
(npm ci), so the tree is the one a container build resolves:

  • backend: make migrate-lint, make lint, make test (-race), make build
    — all pass on Go 1.26.8. govulncheck ./... reports no vulnerabilities.
  • frontend: npm run check, npm run lint, npm test (59 files, 364 tests,
    all passing), npm run build.
  • e2e: npm run typecheck, npm run lint.
  • Checked the rebuilt service worker still carries the /demos/ navigation
    denylist and still precaches no .webm, since vite-plugin-pwa went 0.20 → 1.3.
  • Verified each new base image tag resolves in its registry (golang:1.26-alpine,
    alpine:3.24, node:26-alpine, nginx-unprivileged:1.31-alpine). The image
    builds themselves are CI's docker job — there is no daemon in this environment.
  • Confirmed rules-of-hooks and exhaustive-deps still fire under the new
    ESLint config by linting a deliberately broken component.

Not run: the Playwright suite (needs a live stack) and any on-device mobile
build.

Checklist

  • cd backend && make lint && make test passes
  • cd frontend && npm run check && npm run lint && npm test && npm run build passes
  • Backend tests ran against a database (make dev first) — DB-backed tests skip silently without DB_HOST
  • I read the relevant section of CLAUDE.md and followed its conventions
  • No unrelated refactoring, renames or comment additions in this diff

If it applies

  • Native change — the Android and iOS projects wrap a bundle built by a
    new Vite and a new React, and neither was run on a device or emulator here.
    Worth a real install before this ships.

Notes for reviewers

  • The two deferrals above (Tailwind 4, TypeScript 7) are the parts of this that
    are a judgement call rather than a fact. Both are one-line reverts to take
    anyway if you would rather.
  • The six disabled react-hooks/* compiler rules are the other judgement call.
    The findings are real — 47 set-state-in-effect and 19 refs — and worth
    working through, but not inside a dependency bump. frontend/eslint.config.js
    lists them so the follow-up has a starting point.
  • docs, CLAUDE.md, README.md and CHANGELOG.md are updated for the new
    versions.
  • Node 26 rather than 24 follows Dependabot's own proposal for the build image;
    if you would rather sit on the current LTS, changing it is one value in the
    Dockerfile and five in the workflows.

🤖 Generated with Claude Code

https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK


Generated by Claude Code

dependabot Bot and others added 20 commits August 17, 2026 08:36
Bumps alpine from 3.20 to 3.24.

---
updated-dependencies:
- dependency-name: alpine
  dependency-version: '3.24'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps node from 22-alpine to 26-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 26-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps nginxinc/nginx-unprivileged from 1.27-alpine to 1.31-alpine.

---
updated-dependencies:
- dependency-name: nginxinc/nginx-unprivileged
  dependency-version: 1.31-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps the actions group with 14 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [actions/checkout](https://github.com/actions/checkout) | `4` | `7` |
| [actions/setup-node](https://github.com/actions/setup-node) | `4` | `7` |
| [actions/setup-java](https://github.com/actions/setup-java) | `4` | `6` |
| [android-actions/setup-android](https://github.com/android-actions/setup-android) | `3` | `4` |
| [actions/cache](https://github.com/actions/cache) | `4` | `6` |
| [actions/upload-artifact](https://github.com/actions/upload-artifact) | `4` | `7` |
| [softprops/action-gh-release](https://github.com/softprops/action-gh-release) | `2` | `3` |
| [actions/setup-go](https://github.com/actions/setup-go) | `5` | `7` |
| [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | `3` | `4` |
| [docker/build-push-action](https://github.com/docker/build-push-action) | `5` | `7` |
| [docker/login-action](https://github.com/docker/login-action) | `3` | `4` |
| [docker/metadata-action](https://github.com/docker/metadata-action) | `5` | `6` |
| [github/codeql-action](https://github.com/github/codeql-action) | `3` | `4` |
| [actions/dependency-review-action](https://github.com/actions/dependency-review-action) | `4` | `5` |



Updates `actions/checkout` from 4 to 7
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v7)

Updates `actions/setup-node` from 4 to 7
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](actions/setup-node@v4...v7)

Updates `actions/setup-java` from 4 to 6
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](actions/setup-java@v4...v6)

Updates `android-actions/setup-android` from 3 to 4
- [Release notes](https://github.com/android-actions/setup-android/releases)
- [Commits](android-actions/setup-android@v3...v4)

Updates `actions/cache` from 4 to 6
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](actions/cache@v4...v6)

Updates `actions/upload-artifact` from 4 to 7
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@v4...v7)

Updates `softprops/action-gh-release` from 2 to 3
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](softprops/action-gh-release@v2...v3)

Updates `actions/setup-go` from 5 to 7
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](actions/setup-go@v5...v7)

Updates `docker/setup-buildx-action` from 3 to 4
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](docker/setup-buildx-action@v3...v4)

Updates `docker/build-push-action` from 5 to 7
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](docker/build-push-action@v5...v7)

Updates `docker/login-action` from 3 to 4
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](docker/login-action@v3...v4)

Updates `docker/metadata-action` from 5 to 6
- [Release notes](https://github.com/docker/metadata-action/releases)
- [Commits](docker/metadata-action@v5...v6)

Updates `github/codeql-action` from 3 to 4
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@v3...v4)

Updates `actions/dependency-review-action` from 4 to 5
- [Release notes](https://github.com/actions/dependency-review-action/releases)
- [Commits](actions/dependency-review-action@v4...v5)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/dependency-review-action
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/setup-go
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/setup-java
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: actions/upload-artifact
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: android-actions/setup-android
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: docker/build-push-action
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: docker/login-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: docker/metadata-action
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: docker/setup-buildx-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: github/codeql-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
…3 updates

Bumps the go-minor-patch group with 3 updates in the /backend directory: [github.com/alicebob/miniredis/v2](https://github.com/alicebob/miniredis), [github.com/go-chi/chi/v5](https://github.com/go-chi/chi) and [github.com/stretchr/testify](https://github.com/stretchr/testify).


Updates `github.com/alicebob/miniredis/v2` from 2.38.0 to 2.39.0
- [Release notes](https://github.com/alicebob/miniredis/releases)
- [Changelog](https://github.com/alicebob/miniredis/blob/master/CHANGELOG.md)
- [Commits](alicebob/miniredis@v2.38.0...v2.39.0)

Updates `github.com/go-chi/chi/v5` from 5.3.1 to 5.3.2
- [Release notes](https://github.com/go-chi/chi/releases)
- [Changelog](https://github.com/go-chi/chi/blob/master/CHANGELOG.md)
- [Commits](go-chi/chi@v5.3.1...v5.3.2)

Updates `github.com/stretchr/testify` from 1.11.1 to 1.12.1
- [Release notes](https://github.com/stretchr/testify/releases)
- [Commits](stretchr/testify@v1.11.1...v1.12.1)

---
updated-dependencies:
- dependency-name: github.com/alicebob/miniredis/v2
  dependency-version: 2.39.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go-minor-patch
- dependency-name: github.com/go-chi/chi/v5
  dependency-version: 5.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: go-minor-patch
- dependency-name: github.com/stretchr/testify
  dependency-version: 1.12.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: go-minor-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps the golang-x group in /backend with 1 update: [golang.org/x/crypto](https://github.com/golang/crypto).


Updates `golang.org/x/crypto` from 0.55.0 to 0.56.0
- [Commits](golang/crypto@v0.55.0...v0.56.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-version: 0.56.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: golang-x
...

Signed-off-by: dependabot[bot] <support@github.com>
…lang-x-6e77fb2019' into claude/pr-consolidation-fixes-jfmb7o

# Conflicts:
#	backend/go.mod
…-3.24' into claude/pr-consolidation-fixes-jfmb7o
…inc/nginx-unprivileged-1.31-alpine' into claude/pr-consolidation-fixes-jfmb7o
…26-alpine' into claude/pr-consolidation-fixes-jfmb7o
…s-ad3d4cf4ac' into claude/pr-consolidation-fixes-jfmb7o
The golang-x bump raised the go directive to 1.26.0, which the 1.25-alpine
builder cannot compile; the frontend build image moved to node:26-alpine
while every workflow still installed Node 20 (EOL since April 2026), so the
tree CI tested was not the tree the image shipped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK
…nd testing-library

Consolidates dependabot PRs #448 and #450 plus the compatible half of #472
and #488.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK
Consolidates dependabot PR #447. React 19 also requires react-leaflet 5
(react-leaflet 4 pins react ^18), and its useRef typings now return
RefObject<T | null>, so the two hooks that accept a ref widen their
parameter types and EventScorecard uses ReactElement rather than the
global JSX namespace React 19 removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK
Consolidates the compatible half of dependabot #488 (Tailwind is held back,
see the PR description) and #472. Vitest 5 requires Vite 6 or newer, so the
two land together. jsdom 30 makes window.location a live Location setter
that coerces its argument to a URL string, so the two suites that swapped it
with Object.assign now redefine the property instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK
Consolidates dependabot PR #452. lucide-react 1.x drops every brand icon, so
the Facebook share button gets an inline mark alongside the X one already
drawn there.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK
Consolidates dependabot PRs #446 and #451. ESLint 10 needs
eslint-plugin-react-hooks 7 (5 and 6 both cap at ESLint 9), which folds the
React Compiler diagnostics into its recommended set; those are switched off
with a note, so the gate enforces what it enforced before rather than
demanding ~70 behavioural refactors inside a dependency bump. react-refresh
0.5 counts every export in the route manifest, which is exempted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK
Dependabot #446 proposed TypeScript 7; no typescript-eslint release supports
it yet (8.70 still pins typescript <6.1.0), so taking 7 would mean an
unsupported parser or --legacy-peer-deps. TypeScript 6 is the highest version
inside that range. It no longer auto-includes @types/node, so the suites that
read fixtures off disk need it declared: an explicit devDependency and a
types entry, rather than the transitive copy they were resolving before.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK
Consolidates dependabot PRs #442 and #444. ESLint 10 removed .eslintrc
support, so the suite moves to a flat config; TypeScript 6 rather than the
proposed 7 for the same typescript-eslint reason as the frontend, and its
deprecation of baseUrl is dropped (paths resolve from the tsconfig directory
without it). The three findings the newer rules surfaced are fixed rather
than silenced.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Pji5g7ypeYALnrrcauLYK
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants