Skip to main content

What's New in v27

electron-builder v27 is a major release: it moves the entire ecosystem to native ES modules, raises the minimum runtime to Node.js 22.12.0, adds several new capabilities, and quietly changes a handful of defaults. This page is the front door — a short tour of what's new, plus the silent behavior changes most likely to trip you up.

Upgrading an existing project?

Run electron-builder migrate-schema to auto-apply the config-key changes; the table below is what it does not do for you. For the ordered upgrade steps, follow the v26 → v27 walkthrough; for the full catalogue of everything that changed, see v27 Breaking Changes.

New in v27

  • MSIX target (beta) — a win.target: "msix" alongside AppX, producing .msix / .msixbundle / .msixupload artifacts with modern manifest features (Package Integrity, Windows Services). Purely additive; the default winCodeSign toolset is MSIX-capable.
  • Cloudflare R2 publish provider — an opt-in, S3-compatible provider: "r2" target with matching electron-updater support. Credentials come from CF_R2_ACCESS_KEY_ID / CF_R2_SECRET_ACCESS_KEY.
  • Windows PKCS#11 & HSM code signing — two new win.sign modes (beta): pkcs11 (cross-platform via osslsigncode — sign Windows apps from macOS/Linux CI with no Windows VM) and hsm (Windows CSP / FIPS token).
  • DMG ULMO / LZMA format — a new dmg.format: "ULMO" for LZMA-compressed images (macOS 10.15+), typically ~30% smaller than the default UDZO. Additive; the default format is unchanged.
  • electron-updater allowUnverifiedLinuxPackages — a new AppUpdater flag to enforce GPG signature checks when installing .deb / .rpm auto-updates. Additive; defaults to true (historical behavior).
  • migrate-schema CLI — a new command that rewrites your v26 config to v27 form in place, covering both static (json/json5/yaml/package.json) and programmatic (.js/.ts/.cjs/.mjs) configs.
  • Native ESM + Node.js >=22.12 — every package now ships as native ES modules. On Node.js 22.12.0+ both import and CJS require() continue to work with no code changes.

New defaults and behavior changes you may trip over

These are the runtime and default changes that migrate-schema does not rewrite for you — no config key changed, so the migrator can't see them. Skim the list; each row deep-links to the full explanation.

ChangeOne-line impactDetails
Node.js >=22.12.0 requiredThe build fails on older Node — bump your local runtime, CI, and Docker images.
Toolsets resolve to "latest"Unset / null / "latest" now fetch the newest bundle (Wine 11, winCodeSign 1.3.0, FUSE3 AppImage, NSIS 3.12); pin "0.0.0" to restore a legacy bundle.
node_modules arch/os-filtered every buildDependencies whose cpu / os mismatch the target are now excluded from the app (was effectively universal-macOS only).
arch: "all" -> x64 + arm64"all" no longer includes ia32 — request ia32 explicitly. Windows ia32 / Linux armv7l fail fast on Electron 44+.
electron / electron-builder excluded from node_modulesListing them in dependencies no longer errors — they're dropped from the copied node_modules; tune the set via ignoredProductionDependencies.
DMG filesystem defaults to APFSNew images use APFS (was HFS+); set dmg.filesystem: "HFS+" only for pre-10.13 macOS compatibility.
disableWebInstaller defaults to trueelectron-updater warns now (v27) and blocks in v28 for NSIS web-installer updates unless you opt in with disableWebInstaller: false.
latest*.yml drops top-level path/sha512Update metadata now carries only files[]; read info.files[0] and set electronUpdaterCompatibility if you still ship pre-2.16 updaters.
Bitbucket token without username -> Bearer authA BITBUCKET_TOKEN with no username is now sent as Bearer; set BITBUCKET_USERNAME if it's an app password / API token needing Basic auth.
macOS productName / executableName validatedA name that would need filename sanitization now throws at build start instead of being silently rewritten.
NSIS file-association ProgID format changedAssociations now register under a unique generated ProgID; update custom NSIS scripts that hard-code the old name/extension.
Linux .desktop runs a *-launcher scriptEvery Linux target launches via a generated <executableName>-launcher; the .desktop Exec points at it. Update custom .desktop / AppArmor / MIME tooling.
AppImage --no-sandbox only for legacy FUSE2With the default FUSE3 runtime, --no-sandbox is no longer auto-added; set executableArgs: ["--no-sandbox"] if you need it unconditionally.
Azure Trusted Signing uses signtool /dlibThe default winCodeSign 1.3.0 ships the ATS dlib payload, so ATS uses the faster path automatically; pin below 1.3.0 to force the legacy PowerShell path.
note

This is the short list of high-traffic surprises. For the complete, authoritative catalogue — including config-key renames the migrator does handle — see v27 Breaking Changes.