Skip to content

drop support for node 20#5937

Merged
matt-fidd merged 5 commits intoactualbudget:masterfrom
matt-fidd:node-24
Oct 18, 2025
Merged

drop support for node 20#5937
matt-fidd merged 5 commits intoactualbudget:masterfrom
matt-fidd:node-24

Conversation

@matt-fidd
Copy link
Copy Markdown
Member

@matt-fidd matt-fidd commented Oct 16, 2025

These releases will soon be dropped from active support. I've been running on 22 for a long time with no issues and not noticed anything different. To be clear, this change does not mean that Actual does not work with <22, just that we will no longer guarantee it does.

I believe we need 22 for electron, we've been running below their minimum version for a while.

All workflows in this PR have been updated, so the checks will be reflective.

When this is merged, I'll update the netlify configs.

image

Docs: actualbudget/docs#811

@actual-github-bot actual-github-bot bot changed the title drop support for node 20 and 22 [WIP] drop support for node 20 and 22 Oct 16, 2025
@netlify
Copy link
Copy Markdown

netlify bot commented Oct 16, 2025

Deploy Preview for actualbudget ready!

Name Link
🔨 Latest commit df2eecc
🔍 Latest deploy log https://app.netlify.com/projects/actualbudget/deploys/68f40a0b1c2c320009167b20
😎 Deploy Preview https://deploy-preview-5937.demo.actualbudget.org
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@matt-fidd matt-fidd mentioned this pull request Oct 16, 2025
3 tasks
@matt-fidd matt-fidd added the dependencies Pull requests that update a dependency file label Oct 16, 2025
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Oct 16, 2025

Bundle Stats — desktop-client

Hey there, this message comes from a GitHub action that helps you and reviewers to understand how these changes affect the size of this project's bundle.

As this PR is updated, I'll keep you updated on how the bundle size is impacted.

Total

Files count Total bundle size % Changed
25 11 MB 0%

Changeset

No files were changed

View detailed bundle breakdown

Added

No assets were added

Removed

No assets were removed

Bigger

No assets were bigger

Smaller

No assets were smaller

Unchanged

Asset File Size % Changed
static/js/index.js 7.41 MB 0%
static/js/da.js 79.82 kB 0%
static/js/de.js 144.63 kB 0%
static/js/en-GB.js 6.84 kB 0%
static/js/en.js 132.59 kB 0%
static/js/es.js 76.53 kB 0%
static/js/fr.js 153.77 kB 0%
static/js/it.js 145.53 kB 0%
static/js/nl.js 99.96 kB 0%
static/js/pl.js 86.68 kB 0%
static/js/pt-BR.js 146.01 kB 0%
static/js/ru.js 107.04 kB 0%
static/js/sv.js 69.03 kB 0%
static/js/th.js 187.53 kB 0%
static/js/uk.js 191.02 kB 0%
static/js/indexeddb-main-thread-worker-e59fee74.js 12.94 kB 0%
static/js/workbox-window.prod.es5.js 5.64 kB 0%
static/js/resize-observer.js 18.37 kB 0%
static/js/BackgroundImage.js 120.48 kB 0%
static/js/ReportRouter.js 1.01 MB 0%
static/js/narrow.js 653.15 kB 0%
static/js/TransactionList.js 13.87 kB 0%
static/js/wide.js 168.68 kB 0%
static/js/usePayeeRuleCounts.js 9.04 kB 0%
static/js/useTransactionBatchActions.js 13.09 kB 0%

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Oct 16, 2025

Bundle Stats — loot-core

Hey there, this message comes from a GitHub action that helps you and reviewers to understand how these changes affect the size of this project's bundle.

As this PR is updated, I'll keep you updated on how the bundle size is impacted.

Total

Files count Total bundle size % Changed
1 4.31 MB 0%

Changeset

No files were changed

View detailed bundle breakdown

Added

No assets were added

Removed

No assets were removed

Bigger

No assets were bigger

Smaller

No assets were smaller

Unchanged

Asset File Size % Changed
kcab.worker.JFe6DcIY.js 4.31 MB 0%

@matt-fidd matt-fidd changed the title [WIP] drop support for node 20 and 22 drop support for node 20 and 22 Oct 16, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Oct 16, 2025

Walkthrough

This pull request upgrades Node.js from v20 to v22 across the repository. Changes update GitHub Actions workflows and a custom setup action to use Node 22, bump .nvmrc and root/package engines.node to >=22, update devDependency @types/node to ^22.18.11 in multiple package.json files, and switch Dockerfile base images to node:22-bookworm variants. No application logic, control-flow, or public API declarations were changed.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested reviewers

  • MatissJanis
  • MikesGlitch

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed The title "drop support for node 20" directly and clearly summarizes the primary change in the pull request. The changeset systematically updates Node.js versions from 20 to 22 across all configuration files, GitHub Actions workflows, Dockerfiles, and package.json files. The title accurately captures this main objective in concise, specific language that would be immediately understood by someone reviewing the project history.
Description Check ✅ Passed The pull request description is directly related to the changeset and provides meaningful context for the Node.js version upgrade. It explains the rationale (releases dropping from active support, Node 22 requirement for Electron), the author's testing experience, clarifies that the change doesn't prevent older versions from working, and notes that workflows have been updated. The description is focused and relevant to the technical changes being made.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a1f013e and df2eecc.

⛔ Files ignored due to path filters (3)
  • packages/sync-server/README.md is excluded by !**/*.md
  • upcoming-release-notes/5937.md is excluded by !**/*.md
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (13)
  • .github/actions/setup/action.yml (1 hunks)
  • .github/workflows/check.yml (1 hunks)
  • .github/workflows/issues-feature-implemented.yml (1 hunks)
  • .github/workflows/publish-nightly-npm-packages.yml (1 hunks)
  • .github/workflows/publish-npm-packages.yml (1 hunks)
  • .nvmrc (1 hunks)
  • Dockerfile (1 hunks)
  • package.json (2 hunks)
  • packages/loot-core/package.json (1 hunks)
  • packages/plugins-service/package.json (1 hunks)
  • packages/sync-server/docker/ubuntu.Dockerfile (2 hunks)
  • packages/sync-server/package.json (1 hunks)
  • sync-server.Dockerfile (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (7)
  • .github/workflows/publish-nightly-npm-packages.yml
  • .github/actions/setup/action.yml
  • package.json
  • Dockerfile
  • sync-server.Dockerfile
  • .nvmrc
  • .github/workflows/check.yml
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: matt-fidd
PR: actualbudget/actual#5936
File: packages/desktop-electron/package.json:95-102
Timestamp: 2025-10-16T14:46:13.941Z
Learning: In the actualbudget/actual repository, PR #5936 (Electron bump to 38.3.0 and electron/notarize to 3.1.0) is coordinated with PR #5937, which handles the Node.js version migration (dropping Node 20 support, requiring Node 22+ for Electron compatibility).
📚 Learning: 2025-10-12T04:07:06.002Z
Learnt from: lelemm
PR: actualbudget/actual#5786
File: packages/api/tsconfig.dist.json:14-14
Timestamp: 2025-10-12T04:07:06.002Z
Learning: In the Actual Budget codebase, when rootDir is removed from packages/loot-core/tsconfig.api.json to allow referencing files outside the loot-core directory, the declaration output structure changes. The path alias for loot-core in packages/api/tsconfig.dist.json must be updated from "./types/loot-core/src/*" to "./types/loot-core/loot-core/src/*" to match the new emitted declaration paths, as TypeScript preserves the full directory structure from the project root when rootDir is not specified.

Applied to files:

  • packages/loot-core/package.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (15)
  • GitHub Check: build (ubuntu-22.04)
  • GitHub Check: validate-cli
  • GitHub Check: lint
  • GitHub Check: build (macos-latest)
  • GitHub Check: Generate VRT Updates
  • GitHub Check: build (windows-latest)
  • GitHub Check: Wait for Netlify build to finish
  • GitHub Check: Functional Desktop App
  • GitHub Check: server
  • GitHub Check: api
  • GitHub Check: web
  • GitHub Check: Analyze
  • GitHub Check: crdt
  • GitHub Check: autofix
  • GitHub Check: compare
🔇 Additional comments (6)
packages/plugins-service/package.json (1)

17-17: Version bump aligns with Node 22 migration.

The patch version update for @types/node from ^22.18.8 to ^22.18.11 is consistent with the Node 22 adoption across the repository and should remain backward compatible within the ^22 semver range.

packages/loot-core/package.json (1)

50-50: LGTM. Minor patch bump of @types/node aligned with the Node.js 22 migration. Low-risk update.

packages/sync-server/package.json (1)

60-60: Patch version bump is safe and consistent with Node 22 migration.

The @types/node bump from ^22.18.8 to ^22.18.11 is a minor patch-level update that aligns with the repository-wide Node 22 migration. Patch updates to type definitions are backward compatible and carry minimal risk.

packages/sync-server/docker/ubuntu.Dockerfile (1)

1-1: Base image tags updated consistently to Node 22.

The multi-stage Dockerfile correctly updates both stages from Node 20 to Node 22 variants (bookworm and bookworm-slim). The selection of image variants is appropriate for each stage's purpose.

Please verify that the Node 22 Docker images (node:22-bookworm and node:22-bookworm-slim) are available and stable on Docker Hub, and confirm that other Dockerfiles in the repository (e.g., root Dockerfile, sync-server.Dockerfile mentioned in the AI summary) have been updated consistently.

Also applies to: 40-40

.github/workflows/issues-feature-implemented.yml (1)

30-30: Node version updated to 22 for feature request handler.

The node-version bump is consistent with the PR objective and aligns with other workflow updates mentioned in the summary.

.github/workflows/publish-npm-packages.yml (1)

59-59: Node version updated to 22 for npm package publishing.

The node-version bump is consistent with the PR objective. The publish job will now run against Node 22, ensuring compatibility with the new minimum version requirement.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
.github/workflows/issues-feature-implemented.yml (1)

29-31: Same verification needed for Node 24

See my comment on .github/workflows/publish-npm-packages.yml; this workflow has the identical risk and needs the same confirmation.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 86c1c30 and 031c36e.

⛔ Files ignored due to path filters (2)
  • upcoming-release-notes/5937.md is excluded by !**/*.md
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (10)
  • .github/actions/setup/action.yml (1 hunks)
  • .github/workflows/check.yml (1 hunks)
  • .github/workflows/issues-feature-implemented.yml (1 hunks)
  • .github/workflows/publish-nightly-npm-packages.yml (1 hunks)
  • .github/workflows/publish-npm-packages.yml (1 hunks)
  • .nvmrc (1 hunks)
  • package.json (2 hunks)
  • packages/loot-core/package.json (1 hunks)
  • packages/plugins-service/package.json (1 hunks)
  • packages/sync-server/package.json (1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: matt-fidd
PR: actualbudget/actual#5936
File: packages/desktop-electron/package.json:95-102
Timestamp: 2025-10-16T14:46:13.941Z
Learning: In the actualbudget/actual repository, PR #5936 (Electron bump to 38.3.0 and electron/notarize to 3.1.0) is coordinated with PR #5937, which handles the Node.js version migration (dropping Node 20 support, requiring Node 22+ for Electron compatibility).
📚 Learning: 2025-10-12T04:07:06.002Z
Learnt from: lelemm
PR: actualbudget/actual#5786
File: packages/api/tsconfig.dist.json:14-14
Timestamp: 2025-10-12T04:07:06.002Z
Learning: In the Actual Budget codebase, when rootDir is removed from packages/loot-core/tsconfig.api.json to allow referencing files outside the loot-core directory, the declaration output structure changes. The path alias for loot-core in packages/api/tsconfig.dist.json must be updated from "./types/loot-core/src/*" to "./types/loot-core/loot-core/src/*" to match the new emitted declaration paths, as TypeScript preserves the full directory structure from the project root when rootDir is not specified.

Applied to files:

  • packages/loot-core/package.json
🔇 Additional comments (1)
.github/workflows/publish-npm-packages.yml (1)

59-60: No action needed: Node 24 is available
actions/setup-node@v4 supports Node.js v24.x (e.g., v24.2.0+ as listed in https://nodejs.org/dist).

Copy link
Copy Markdown
Member

@MikesGlitch MikesGlitch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you're missing the sync-server readme. If you search for this you'll find it: Node.js v18.

I think the idea of keeping the node version as low as possible was to support more systems with older version of node.

I get updating to 22, but if we don't need to go higher I'd personally keep it there since it's in active support till 2027.

Open to thoughts tho, I'm just conscious we may be forcing people to upgrade for no reason.

@matt-fidd
Copy link
Copy Markdown
Member Author

matt-fidd commented Oct 16, 2025

I think you're missing the sync-server readme. If you search for this you'll find it: Node.js v18.

I think the idea of keeping the node version as low as possible was to support more systems with older version of node.

I get updating to 22, but if we don't need to go higher I'd personally keep it there since it's in active support till 2027.

Open to thoughts tho, I'm just conscious we may be forcing people to upgrade for no reason.

If I'm right, I don't think the node version affects all that many people. Just those that run from source or use the CLI. Docker will sort it out for the majority of self hosts and people using managed services like Pikapods aren't affected.

I'd probably be happy either way, I was just thinking that it gives even longer until we have to change again and means we have to think a bit less when deps start dropping node 22 support. You're right that might be a while off though

Will let some other people have a vote too and I'll go with the majority.

@matt-fidd matt-fidd changed the title drop support for node 20 and 22 drop support for node 20 Oct 18, 2025
github-actions bot added a commit to matt-fidd/actual that referenced this pull request Oct 18, 2025
Auto-generated by VRT workflow

PR: actualbudget#5937
@github-actions
Copy link
Copy Markdown
Contributor

✅ VRT screenshots have been automatically updated.

Copy link
Copy Markdown
Member

@MikesGlitch MikesGlitch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice

@matt-fidd matt-fidd merged commit 155558e into actualbudget:master Oct 18, 2025
25 checks passed
@matt-fidd matt-fidd deleted the node-24 branch October 18, 2025 22:58
matt-fidd added a commit to actualbudget/docs that referenced this pull request Oct 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file ✨ merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants