Changelog
The releases of electron-builder and electron-updater since 24.0.0. Pick two versions to list only the changes between them, grouped by major, minor and patch changes. Older releases are in CHANGELOG.md on GitHub.
BREAKING CHANGE: S3 publishing fails with an InvalidConfigurationError unless BREAKING CHANGE: when BREAKING CHANGE: S3 publishing fails with an InvalidConfigurationError unless The three file-copy lists live in a Flat Code that reads See https://www.electron.build/docs/migration/v27-breaking-changes#file-options-fileoptions The flatpak target now runs New options: BREAKING CHANGE: BREAKING CHANGE: BREAKING CHANGE: the default BREAKING CHANGE: a The desktop entry of every Linux target that writes one is checked before it is written, so a configuration can no longer produce a corrupt The three file-copy lists live in a Flat Code that reads See https://www.electron.build/docs/migration/v27-breaking-changes#file-options-fileoptions BREAKING CHANGE: signing auto-update manifests is now REQUIRED by default. A build with a publish policy
( Ed25519 signing of auto-update manifests ( Key rotation without a flag day: an install trusts a list of public keys ( Gating of the Linux package-manager signature-bypass flags landed separately as
v27 had stopped using a custom NSIS bundle set via Any custom toolset ( When NSIS installers now write a This is a default only: a value the app sets ( Note for apps already shipping Also fixes The NSIS Authenticode verification interface now returns an unambiguous result object instead of the BREAKING CHANGE: BREAKING CHANGE: the protected BREAKING CHANGE: the protected BREAKING CHANGE: A web-installer update is rejected with BREAKING CHANGE: signing auto-update manifests is now REQUIRED by default. A build with a publish policy
( Ed25519 signing of auto-update manifests ( Key rotation without a flag day: an install trusts a list of public keys ( Gating of the Linux package-manager signature-bypass flags landed separately as
NSIS installers now write a This is a default only: a value the app sets ( BREAKING: the Behaviour change: fix(msi): only emit The MSI template declares Optional Ed25519 signing of auto-update manifests ( Key rotation without a flag day: an install trusts a list of public keys ( Gating of the Linux package-manager signature-bypass flags landed separately as
It warns about BREAKING CHANGE: the promise returned by The same applies to the result of The underlying cache-consistency fix from #10098 already produced this object internally; this change stops converting it back to an array at the public API boundary. Optional Ed25519 signing of auto-update manifests ( Key rotation without a flag day: an install trusts a list of public keys ( Gating of the Linux package-manager signature-bypass flags landed separately as
With Breaking: a suffixed feat(linux): support the When a GitHub or Bitbucket publish configuration omits The build now logs the resolved Two guards around Windows update signature verification: Before: packaging an app that declares zero production dependencies (e.g. everything is bundled by a JS bundler) from inside a monorepo skipped the app's own empty After: an app with no production dependencies (neither in its Two guards around Windows update signature verification: BREAKING CHANGE: The default DMG volume filesystem changed from BREAKING CHANGE: The legacy top-level NSIS installers now write a This is a default only: an explicit Bitbucket Cloud is deprecating app passwords (https://www.atlassian.com/blog/bitbucket/bitbucket-cloud-transitions-to-api-tokens). The Bitbucket publisher now selects the auth scheme by whether a username is set: with a username it sends HTTP Basic auth (Bitbucket username + app password, or Atlassian account email + API token); without a username it sends the token as a repository/project/workspace access token via BREAKING CHANGE: v27 ships a one-major-version grace period so existing deployments are not broken without warning: If you intentionally publish and rely on an NSIS web installer, opt back in before v28 by setting BREAKING CHANGE: The legacy top-level BREAKING: BREAKING: the Installing an update while the app quits spawns a detached installer process; when the quit is caused by the OS session ending (shutdown/reboot/log off on Windows), the OS can kill that installer mid-install and leave the app uninstalled but not re-installed (#7807). Two mitigations, both implemented in The automatic install at startup is restricted to targets that install without an elevation prompt: NSIS (per-user installs) and AppImage only. deb/rpm/pacman always elevate via pkexec/sudo to install — an authentication dialog at app launch is not acceptable — so they keep the pending update and log why; per-machine NSIS installs (UAC) are skipped the same way. For those targets, call the new NSIS installers now write a This is a default only: an explicit Adds If you sign your Linux packages through your own pipeline and the target systems trust your keys, set The new The updater previously used a fuzzy heuristic (looking for Hex-encoded SHA-256 ( Node modules are now filtered by their Also add BREAKING CHANGE: Publishing no longer happens automatically based on CI environment, git tags, or npm lifecycle events. You must now explicitly request publishing using the This addresses security and usability concerns where unexpected auto-publishing could accidentally expose secrets or publish unfinished work. downloadArtifact() was ignoring electron_builder_binaries_mirror and falling back
to electron_mirror due to @electron/get behavior. This affected dmg-builder
(macOS) and appimage-tools (Linux) downloads. Replace hardcoded service-specific hostname checks with sophisticated cross-origin redirect detection that matches industry standards from Python requests library and Apache HttpClient. Key improvements: Fixes GitHub issue #9207: GitHub release asset downloads failing with 403 Forbidden when redirected from The implementation now handles all cross-origin redirect scenarios while maintaining compatibility with legitimate same-origin redirects and industry-standard HTTP→HTTPS upgrades. Replace hardcoded service-specific hostname checks with sophisticated cross-origin redirect detection that matches industry standards from Python requests library and Apache HttpClient. Key improvements: Fixes GitHub issue #9207: GitHub release asset downloads failing with 403 Forbidden when redirected from The implementation now handles all cross-origin redirect scenarios while maintaining compatibility with legitimate same-origin redirects and industry-standard HTTP→HTTPS upgrades. For For Deprecate legacy ( Test for Personally, I don't want apps running as myself or a privileged user in my system.
For this. I have a shell that is executed to drop permissions first, then execute the
selected software.
Electron apps don't conform to this since they link directly rather than using a linking
system. This change is to ensure that system is used before resorting to direct links. Simply update as normal and this package will switch to using update-alternatives.
This will allow middleware and end-users to better control the active executable.27.0.0-alpha.12
electron-builder 27.0.0-alpha.12
Major changes
fileOptions.excludedExts (root and per platform, a list or a single string such as -c.fileOptions.excludedExts=default) to configure the file extensions excluded from the app files and the copied node_modules — "default" is the built-in list, which now includes pdb, any other entry adds an extension, and "!ext" removes one (a list of removals only, such as ["!pdb"], is rejected: write ["default", "!pdb"]; an invalid list fails the build when the configuration is validated, at the root and in every platform section); a later layer's list replaces an earlier one instead of being merged with it (extends child, programmatic or -c configuration, platform section, mas / masDev); a files pattern that names an excluded extension (e.g. native/addon.pdb) re-includes only the files it matches. BREAKING: removed the includePdb option — electron-builder migrate-schema rewrites includePdb: true to "fileOptions": { "excludedExts": ["default", "!pdb"] } and includePdb: false to "fileOptions": { "excludedExts": ["default"] }.awsCredentials option (restores shared config / IAM Identity Center profiles, #10054)Details
awsCredentials.source is required to publish (no default, no implicit credentials).awsCredentials.source: "env" reads only AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN, or the variable names given in awsCredentials.env.awsCredentials.source: "profile" with profile (plus optional credentialsFile / configFile) reads a named profile from the shared config and credentials files: static keys, IAM Identity Center (SSO), credential_process and assume-role. The AWS SDK providers are loaded lazily, only for non-static profiles, and are given explicit paths. Assume-role hops use an explicitly configured STS client (named profile's region, no configured endpoint URLs). credential_source and web identity (web_identity_token_file) are rejected anywhere in the chain, before the SDK is loaded.awsCredentials.source: "sso-role-chain" with profile resolves an assume-role profile whose source_profile chain (up to 5 hops, no cycles) starts at an IAM Identity Center (SSO) profile: the SSO profile is resolved from the configured files, then STS AssumeRole is called per hop with explicit region, endpoint and credentials (never AWS_REGION, AWS_PROFILE or AWS_ENDPOINT_URL*). credential_source, mfa_serial, web identity and credential_process are rejected in the chain. source: "profile" keeps rejecting SSO-sourced role chains and points to this source.awsCredentials.source is set (add { "source": "env" } to keep using AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY). AWS_PROFILE, AWS_SDK_LOAD_CONFIG, AWS_CONFIG_FILE, AWS_SHARED_CREDENTIALS_FILE and an implicit ~/.aws/credentials are no longer read. Missing credentials now fail with a clear error instead of an unsigned or env-fallback signature. For dotted bucket names without region, the region is looked up only when publishing. awsCredentials is never written to app-update.yml.updateManifest.publicKeyDetails
updateManifest.publicKey is set explicitly and none of the keys the build signs update
manifests with is in it, a publishing build now fails at build start, before anything is packed or uploaded, with an
InvalidConfigurationError naming the key ids of the signing keys and of the listed keys (never key material). Such
a release embeds no key it is signed with, so its installs would reject manifests signed with the current key(s).
This was a warning before; a build without a publish policy still only warns. For a deliberate cutover release that
is signed with the old key but embeds only the new one, set the new updateManifest.allowSigningKeyOutsideTrustList: true (explicit config only) to keep the warning. Nothing changes when publicKey is not set, since the trust list is
then derived from the signing keys. See the v27 breaking changes guide.ELECTRON_BUILDER_UPDATE_SIGN_KEY takes the PEM file base64-encoded on one line, so CI systems such as GitLab can mask it (#10344) — encode it with base64 < update-private-key.pem | tr -d '\n', and for key rotation concatenate the PEM files and encode them once (cat old.pem new.pem | base64 | tr -d '\n'). BREAKING for the 27.0.0 alphas: a raw PEM, or any value that is not the standard base64 of complete PEM private keys (quoted, URL-safe, truncated, separately encoded keys joined together), now fails with an InvalidConfigurationError that never prints the value, and invalid or duplicate signing keys from any source are reported as an InvalidConfigurationError too; ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE and updateManifest.signingKey / signingKeyFile still take PEM, and electron-builder create-update-key prints the encode command for the key file it writes.Minor changes
MakerBase-compatible default export class, also exported by name, with the maker config applied as the target's options); calling the default export as an Electron Forge 5 maker function still worksAPPLE_API_KEY also accepts the App Store Connect API key's .p8 contents base64-encoded on one line, so masked CI variables can hold it (#10344) — electron-builder writes it to a new 0600 temporary file for each notarization and deletes it once notarytool is done; a path keeps working unchanged, and key text (PEM) or a damaged base64 value now fails before notarization with an InvalidConfigurationError that does not print the key. The notarization guide documented base64 content before it was supported.enableEmbeddedAsarIntegrityValidation fuse the ElectronAsarIntegrity hashes in Info.plist can't be changed to match a modified app.asar; on by default, mac.asarIntegrityDigest: false opts out (#9648)pkgDistributionCreated hook (#10355), mirroring appxManifestCreated and msiProjectCreated. It is called with the path to the PKG target's distribution.xml after electron-builder has written it and before productbuild builds the installer from it, so the distribution (for example, its <title>) can be edited in place or replaced.Patch changes
close instead of the deprecated aborted event, and report non-http(s) or unparseable S3 endpoints as configuration errorsCSC_LINK / WIN_CSC_LINK / CSC_INSTALLER_LINK / SNAP_CSC_LINK / cscLink value must be valid standard base64 (line breaks are ignored; encode it with base64 -w0 or openssl base64 -A) — a value with surrounding quotes, URL-safe characters or other stray characters fails with an InvalidConfigurationError that does not print the value; adds the strict decodeStrictBase64 helper to builder-util.NSAllowsArbitraryLoads from mac.extendInfo. Before, electron-builder always set NSAppTransportSecurity.NSAllowsArbitraryLoads to true on non-MAS builds, after extendInfo was merged, so an app could not turn it off. After, it is set to true only when the app has not set it; the local-networking and localhost/127.0.0.1 exceptions that electron-updater's proxy needs are still added.win.sign: false or null, no certificate is read from CSC_LINK / WIN_CSC_LINK, and app-update.yml carries no derived publisherNamepreparePowerShellExec, escapePowerShellSingleQuotes, parseAuthenticodeSignatureOutput, matchPublisherName), moved unchanged from electron-updater so electron-builder can check signed installers with the same codeaws login (login_session) profiles for awsCredentials.source: "profile".msi with SHA-256 by default. An MSI holds a single signature, and electron-builder picked SHA-1 for it unless signingHashAlgorithms explicitly left SHA-1 out, so the default configuration (["sha1", "sha256"]) produced SHA-1-only signed MSIs. Now an MSI is signed with SHA-256 unless SHA-1 is the only algorithm listed. To keep the previous behaviour, set signingHashAlgorithms: ["sha1"]. Executables are still dual-signed by default. Because an MSI now takes the SHA-256 path, signtool timestamps it via RFC 3161 (/tr rfc3161TimeStampServer /td sha256) instead of the legacy /t timeStampServer, and a custom win.sign hook now receives hash: "sha256" for .msi files. Signing with an empty signingHashAlgorithms list now fails with an InvalidConfigurationError instead of running no signing pass and reporting the file as signed.electron_wer.dll Windows Error Reporting helper together with the executable for Electron 45 and later, so fail-fast crashes are captured in packaged appswinCodeSign toolset to 1.3.1. The bundled macOS osslsigncode now ships its own OpenSSL, so signing Windows artifacts on macOS no longer needs Homebrew's openssl@3 (and no longer fails with Symbol not found: _OPENSSL_sk_set_thunks when Homebrew's version doesn't match), and PKCS#11 signing works without installing libp11 or setting OPENSSL_MODULESelectron-updater 7.0.0-alpha.11
Minor changes
awsCredentials option (restores shared config / IAM Identity Center profiles, #10054)Details
awsCredentials.source is required to publish (no default, no implicit credentials).awsCredentials.source: "env" reads only AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN, or the variable names given in awsCredentials.env.awsCredentials.source: "profile" with profile (plus optional credentialsFile / configFile) reads a named profile from the shared config and credentials files: static keys, IAM Identity Center (SSO), credential_process and assume-role. The AWS SDK providers are loaded lazily, only for non-static profiles, and are given explicit paths. Assume-role hops use an explicitly configured STS client (named profile's region, no configured endpoint URLs). credential_source and web identity (web_identity_token_file) are rejected anywhere in the chain, before the SDK is loaded.awsCredentials.source: "sso-role-chain" with profile resolves an assume-role profile whose source_profile chain (up to 5 hops, no cycles) starts at an IAM Identity Center (SSO) profile: the SSO profile is resolved from the configured files, then STS AssumeRole is called per hop with explicit region, endpoint and credentials (never AWS_REGION, AWS_PROFILE or AWS_ENDPOINT_URL*). credential_source, mfa_serial, web identity and credential_process are rejected in the chain. source: "profile" keeps rejecting SSO-sourced role chains and points to this source.awsCredentials.source is set (add { "source": "env" } to keep using AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY). AWS_PROFILE, AWS_SDK_LOAD_CONFIG, AWS_CONFIG_FILE, AWS_SHARED_CREDENTIALS_FILE and an implicit ~/.aws/credentials are no longer read. Missing credentials now fail with a clear error instead of an unsigned or env-fallback signature. For dotted bucket names without region, the region is looked up only when publishing. awsCredentials is never written to app-update.yml.Patch changes
GitHubProvider.getLatestVersion into helpers (internal refactor, no behavior change)net module, and close the partially written file when a download's response fails or is aborted mid-bodypreparePowerShellExec, escapePowerShellSingleQuotes, parseAuthenticodeSignatureOutput, matchPublisherName), moved unchanged from electron-updater so electron-builder can check signed installers with the same codemv through PATH; if mv failed (for example spawnSync mv ENOTCONN when a dead AppImage FUSE mount from an earlier launch was on PATH), the user was left with no app to launch. After, the new AppImage is staged next to the old one and atomically renamed over it without running any external command, so a failed install keeps the old AppImage.27.0.0-alpha.11
electron-builder 27.0.0-alpha.11
Major changes
files, extraResources and extraFiles under fileOptionsDetails
fileOptions?: FilesBuildOptions | null property at the configuration root and in every platform section (mac, mas, masDev, win, linux), the same way directories groups the build directories: fileOptions.files, mac.fileOptions.extraResources, and so on. PlatformSpecificBuildOptions does not extend FilesBuildOptions, and the TypeScript types and the JSON schema only have fileOptions.files / extraResources / extraFiles keys in a config file, an extends parent, a -c.files=… override or the config object passed to build() are applied as their fileOptions counterparts before the configuration is validated, logging one warning per process that names the keys found and where they belong. When a flat key and its fileOptions counterpart are set on the same object, fileOptions wins and the build warns about the conflict. A CLI override or a parent config's flat key is merged with fileOptions. A fileOptions that is not an object (for example a list of globs written directly under it) fails the build with a message showing the nested form.files, extraResources or extraFiles from the loaded configuration (for example a hook reading context.packager.config.files, or buildResult.configuration.extraResources) gets the fileOptions value, with a warning per key: the loaded configuration and its platform sections forward these reads through non-enumerable properties, which stay out of the effective config, JSON.stringify and Object.keys. Assigning them throws a configuration error naming the fileOptions property to set instead.deepAssign (builder-util-runtime) copies only enumerable own properties, so the forwarding properties are never copied into merged options.electron-builder migrate-schema (static and JS/TS configs) moves flat keys under fileOptions at the root and per platform. A flat key also set under fileOptions is removed with a warning, since the build ignores it.fileOptions.allowExternalLinks. A file of the app (packed into app.asar or copied with asar: false) that is a symlink, or is reached through one, is packaged only when its real path is inside the workspace root, the project or app directory, or the package-manager store (pnpm storeDir/virtualStoreDir from node_modules/.modules.yaml). Any other one, such as an npm link or a file: dependency outside the workspace, fails with InvalidConfigurationError (code ERR_ELECTRON_BUILDER_FILE_OUTSIDE_WORKSPACE), which names the file, its real path and the fileOptions.allowExternalLinks entry that allows it (true, or a list of directories, relative to the project directory or absolute, that linked files may resolve into; at the top level or per platform; default false, with a one-time warning when it allows a link). See https://www.electron.build/docs/contents#linked-files-must-resolve-inside-the-workspaceextraResources/extraFiles/extraDistFiles sources, node_modules) cannot make electron-builder write or package files elsewhere on the build machine; opt in to external links with fileOptions.allowExternalLinks. copyDir (extraResources/extraFiles) and the asar: false app copy refuse a destination whose directory resolves outside the app output directory, replace (never follow) a symlink at a destination file, and recreate a symlink only when it stays inside the output (or, for extraResources/extraFiles, leads into the workspace or the package-manager store, with a one-time warning). The fixed-name files written after the copies (app-update.yml, package-type, apparmor-profile, NSIS elevate.exe, the snap command.sh, Squirrel.exe and the Squirrel execution stub) replace a symlink at their name instead of writing through it. Windows zip/7z archives, the NSIS app package, AppX/MSIX and Squirrel.Windows packages, which store what a symlink points to, refuse a symlink that leaves the app. An intended symlink of this kind is allowed by the fileOptions.allowExternalLinks build option (true, or a list of directories its real target may be in; at the top level or per platform, a platform's value replacing the top-level one), with a one-time warning; a write through a symlink is always refused. Errors are InvalidConfigurationError with code ERR_ELECTRON_BUILDER_PATH_OUTSIDE_ROOT, suggest the fileOptions.allowExternalLinks entry and link to https://www.electron.build/docs/contents#symlinks-that-leave-the-app-are-refused. New builder-util helpers: assertWritableWithin, prepareFixedNameWrite, WriteContainment, resolvePhysicalPath, findEscapingSymlinks, assertNoSymlinkLeaves, ExternalLinkPolicy.flatpak and flatpak-builder directly, without @malept/flatpak-bundler, and build in unprivileged containersDetails
flatpak and flatpak-builder itself, and the @malept/flatpak-bundler dependency is removed. A failed command prints the tool's output in the build error, and five known failures (Failure spawning rofiles-fuse, a bwrap: failure in flatpak build-export, No remote refs found, Command 'electron-wrapper' not found when rofiles-fuse cannot mount the app directory, and execvp appstream-compose when a flatpak-builder older than 1.4 composes AppStream metadata with the freedesktop SDK 24.08 or newer) log how to fix them first. A build with flatpak.modules warns once when flatpak-builder is older than 1.4.4, which the 24.08 and newer SDKs recommend for meson and cmake modules. The scratch directory is removed when the build ends.
flatpak.additionalArgs passes extra arguments to the tools, by tool: flatpakBuilder, buildExport and buildBundle. With { flatpakBuilder: ["--disable-rofiles-fuse"], buildExport: ["--disable-sandbox"] } the target builds in CI containers that have neither FUSE nor user namespaces (#10306).flatpak.installOrUpdateRefs, "all" (the default) or a list of "runtime", "sdk" and "base": the refs that are left out are used as installed, without a flatpak install or flatpak update, and a missing one fails the build before anything is downloaded. [] builds with the refs of an image or an offline machine, and where the build user cannot update the base app (based on the options proposed in #10313).flatpak >= 1.12.4 and flatpak-builder >= 1.2.2 are required, and checked before a runtime is installed. The stock packages of Ubuntu 22.04, Debian 12, RHEL 8 and 9 and newer releases meet this; v26 accepted older tools. DEBUG=@malept/flatpak-bundler no longer has any effect, and a flatpak build warns once when DEBUG still names it: use DEBUG=electron-builder to log every command.flatpak.runtimeVersion and flatpak.baseVersion default to 26.08 instead of 20.08, which Flathub reports as end-of-life. A build that sets neither is built for the 26.08 runtime, and the build machine installs the 26.08 runtime, SDK and base app if they are missing (about 3.2 GB). A build that leaves either option unset warns once, naming electron-builder v27 and the migration guide. Set both to "20.08" to keep the previous ones.flatpak.finishArgs grant --filesystem=xdg-download instead of --filesystem=home: with read/write access to the home directory, code running in the app could write ~/.config/autostart or ~/.bashrc and so run outside the sandbox at the next login. App data under ~/.var/app and files picked in a dialog are not affected; paths the app opens on its own outside Downloads are. They also leave out --talk-name=org.freedesktop.Notifications unless the base is org.electronjs.Electron2.BaseApp older than 23.08, whose libnotify predates the notification portal; on desktops without a portal backend for notifications, notifications no longer appear. Builds that set flatpak.finishArgs are not affected, and a build that uses the defaults warns once, naming electron-builder v27 and the migration guide. To keep the v26 permissions, set finishArgs to the v26 list from the migration guide.flatpak.files destination or a flatpak.symlinks link that leaves the app prefix with .. fails the build with an InvalidConfigurationError, before anything is installed. It was written outside the app in the build directory, for example over the app's metadata. The pairs of flatpak.files are copied one after another, and a directory can no longer be copied onto a symlink to a directory: v26 copied through the link, and the build now fails with Cannot overwrite non-directory with directory (ERR_FS_CP_DIR_TO_NON_DIR). Symlinks inside a copied directory are kept as they are. The errors of the tool-version check and of the app-prefix check say that they are new in electron-builder v27 and link the migration guide.Minor changes
process.env variable removed in v26 → v27 is still setDetails
warnOnRemovedEnvVars() (registry in app-builder-lib/src/util/removedEnvVars.ts), invoked once per build from the Packager constructor so both the CLI and programmatic build() API surface the same guidance. When a removed variable is still present in the environment it is otherwise silently ignored — this logs a one-time deprecation warning naming the variable and its replacement.APPIMAGE_TOOLS_PATH, MKSQUASHFS_PATH, LINUX_TOOLS_MAC_PATH, CUSTOM_FPM_PATH, ELECTRON_BUILDER_NSIS_DIR, ELECTRON_BUILDER_NSIS_RESOURCES_DIR, CUSTOM_NSIS_RESOURCES, ELECTRON_BUILDER_WINE_TOOLSET_DIR, ELECTRON_BUILDER_7ZIP_PATH, ELECTRON_BUILDER_ICONS_TOOLSET_DIR, ELECTRON_BUILDER_OSSL_SIGNCODE_PATH, ELECTRON_BUILDER_RCEDIT_PATH, ELECTRON_BUILDER_WINDOWS_KITS_PATH, SIGNTOOL_PATH) → toolsets.* / win.sign; the USE_SYSTEM_* toggles; ELECTRON_BUILDER_BINARIES_ALLOW_HTTP → ELECTRON_BUILDER_DANGEROUSLY_ALLOW_HTTP; CI_BUILD_TAG → CI_COMMIT_TAG; and ALLOW_ELECTRON_BUILDER_AS_PRODUCTION_DEPENDENCY → ignoredProductionDependencies.JEST_WORKER_ID, TEST_SET_BABEL_PRESET) and npm_lifecycle_event (set by npm for every script) are intentionally excluded from the runtime scan.MKSQUASHFS_PATH), added a "Replace with" column, and documented the ELECTRON_BUILDER_BINARIES_ALLOW_HTTP rename and the removed npm run release implicit-publish behavior.log.limit({ key, max, scope }) / log.once(key, scope) emit a keyed message at most N times (per process, or per scope object), replacing hand-rolled "already warned" flags; electron-updater counts once-per-updater warnings internally without changing the injectable Logger interface. Both share one limiter (wrap() on any { info, warn, error, debug? } logger, including console), and its LogLevel, LogLimitOptions, LoggerLike and LimitedLogger types are now exported from builder-util-runtime (builder-util re-exports them)asar.ordering is now honored — the documented option was typed but never applied to the archive electron-builder packs (it packs through @electron/asar's stream API, which takes no ordering option). Listed files are packed first, in the order of the file (same line syntax as @electron/asar: optional leading / or <count>: prefix, blank lines ignored), directories keep their positions, everything else follows in its original order; coverage is logged."default" in snapcraft.core24.plugs now merges the remaining entries into the full default plug set (including browser-support and, without the gnome extension, the content-snap plugs), deduplicated by name, with descriptor objects overriding a default plug's attributes--no-sandbox and the flatpak id, and fix the wrapper, useWaylandFlags, MIME types and failed buildsDetails
--no-sandbox reaches the flatpak's electron-wrapper, naming linux.executableArgs and/or flatpak.executableArgs as its source: inside flatpak, Chromium's sandbox works through zypak, and the flag gives renderer processes every permission of the app. The flag is kept. linux.executableArgs are merged into the flatpak options, and an empty flatpak.executableArgs adds nothing: --no-sandbox for the AppImage alone belongs in appImage.executableArgs, and flatpak.executableArgs: null leaves all of linux.executableArgs out of the flatpak.linux.appId nor appId is set: the id names the app's ~/.var/app/<id> data directory, and another vendor's bundle with the same com.electron.<name> id installs over the app), and when desktopName is set but is not <flatpak id>.desktop (the bundle's desktop entry is named after the id, and Electron names the app's windows after desktopName, so desktops cannot match the two).electron-wrapper script replaces itself with the app (exec) instead of staying as its parent shell, and tests the session with the POSIX =: the == failed with "unexpected operator" where /bin/sh is dash, and dropped the Wayland flags.flatpak.useWaylandFlags picks its flags by Electron version: none from Electron 38, which chooses Wayland by itself in a Wayland session (the build logs that the option has no effect), --ozone-platform=wayland from Electron 16, and --enable-features=UseOzonePlatform --ozone-platform=wayland before that or for an unknown version. From Electron 16 the wrapper no longer adds a second --enable-features, which could replace one in executableArgs; a build with Electron 16 to 37 warns once about the change, naming electron-builder v27 and the migration guide.com.myapp or com.electron.3d_viewer from a package named 3d-viewer, fails the build before the runtime, SDK and base app are installed, with an InvalidConfigurationError naming the rule. It failed in flatpak-builder, after those were installed (about 3.2 GB for the default version).__flatpak-<arch> stage directory is removed from the output directory when preparing it fails, for example on an invalid desktop entry or a missing license file.fileAssociations (every mimeType that is set) are declared in the bundle's share/mime/packages/<id>.xml, which flatpak exports, as the AppImage and deb/rpm targets do: the desktop entry listed the types, but nothing defined a custom one. Set mimeType only for a type of your own: each is declared with the description <productName> document, which for a standard type such as text/markdown can change how the desktop describes every such file. List standard types in linux.mimeTypes, which only adds them to the desktop entry.asar.contentAlignment — align the start of every packed file's content inside app.asar to a multiple of N bytes (zero padding between files; order, sizes and per-file integrity unchanged). Meant for differential updates with nsis.differentialPackage: "store-asar": the asar header stores absolute content offsets, so without alignment a change that grows a file by one byte shifts every later offset and most of the header is re-downloaded; with 512 a small length-changing edit measured 414 KB → 139 KB of differential download for 2.2 % more asar size. Off by default.Patch changes
latesttoolsets.appimage version pin to exactly that release instead of letting any pin other than "1.0.3" float to the newest bundle, and reject unknown versions with an InvalidConfigurationError rather than downloading without a checksummksquashfs from toolsets.appimage instead of the hardwired legacy "0.0.0" bundle, whose mksquashfs supports only gzip/xz, so compression: "lzo" (and linux.compression: "store", which maps to lzo) builds again (#7013); a toolsets.appimage: "0.0.0" pin combined with lzo now fails early with an InvalidConfigurationError instead of inside mksquashfs%LOCALAPPDATA%\<app>-updater only when the app has an app-update.yml. Before, every install kept that copy, which only electron-updater reads (as the base for a differential download), so apps without an update configuration carried a second copy of their installer, and the uninstaller left it behind. After, those apps get no copy; apps with an update configuration keep it as before.resources/app-update.yml was not foundcustomNsisBinary / customNsisResources build error and migrate-schema warning at the custom NSIS migration guide and the toolsets.nsis bundle docs, and fix their stale breaking-changes anchorAbortSignal.timeout() shared by all attempts, so no attempt could follow it. After, each attempt gets its own 10 minute cap, and an attempt that hits it or undici's timeouts is retried once, with a warning in the log.SnapOptions24, SnapOptionsLegacy, SnapOptionsCustom and RemoteBuildOptions types from app-builder-lib so their API reference pages are generatedlog.once / log.limit (and the updater's per-instance counter) instead of hand-rolled flags and sets; a concurrently resolved NSIS ProgID notice can no longer print twiceasar.ordering file now fails with a configuration error naming the paths tried and the v27 migration notes, builds that apply an ordering file warn once that the option is now honored, ordering lines with \ separators match on macOS and Linux, and lines naming a directory no longer count as missing in the coverage logbrowser-support with allow-sandbox by default (the Snap Store rejects it for non-vetted publishers); default core24 snaps now launch with --no-sandbox and omit chrome-sandbox, and an explicitly configured allow-sandbox logs a store-review warning.desktop entry keys and values before writing them, for every Linux targetDetails
.desktop file. The build fails with an InvalidConfigurationError naming the group and the key for a value with \r or \n inside it (from linux.desktop.entry, desktopActions, linux.category, linux.mimeTypes, fileAssociations or protocols), whose second line would become a new key or group of the file; a key that GLib, which most desktops read the file with, rejects (empty, or with =, a line break, or brackets other than a trailing locale such as Name[de]), which makes it ignore the whole file; and a desktopActions name with [, ] or a control character. Write such a value on one line, with a newline in a string value as \n. Line breaks at the end of a value, as in a YAML block scalar, are dropped, and values are otherwise still written as given, so escapes such as \; keep working. Keys that the specification does not allow but desktop environments read, such as X_Foo, are kept.chrome-sandbox from the shared linux-unpacked dir when building a core18/core20/core22 template snap. The delete raced the other Linux targets, so a deb, rpm or AppImage built in the same run could ship without chrome-sandbox (no SUID sandbox fallback), and AppImage could fail with ENOENT. The snap still omits chrome-sandbox; the mksquashfs input list already filters it out.electron-updater 7.0.0-alpha.10
Patch changes
SnapOptions24, SnapOptionsLegacy, SnapOptionsCustom and RemoteBuildOptions types from app-builder-lib so their API reference pages are generatedlog.limit({ key, max, scope }) / log.once(key, scope) emit a keyed message at most N times (per process, or per scope object), replacing hand-rolled "already warned" flags; electron-updater counts once-per-updater warnings internally without changing the injectable Logger interface. Both share one limiter (wrap() on any { info, warn, error, debug? } logger, including console), and its LogLevel, LogLimitOptions, LoggerLike and LimitedLogger types are now exported from builder-util-runtime (builder-util re-exports them)log.once / log.limit (and the updater's per-instance counter) instead of hand-rolled flags and sets; a concurrently resolved NSIS ProgID notice can no longer print twicefiles[].isAdminRightsRequired as an intentionally unsigned launch hint in signed update manifests. It only selects how the hash-verified installer is launched (directly or via elevate.exe), so publishers can correct it in latest.yml without re-signing.files, extraResources and extraFiles under fileOptionsDetails
fileOptions?: FilesBuildOptions | null property at the configuration root and in every platform section (mac, mas, masDev, win, linux), the same way directories groups the build directories: fileOptions.files, mac.fileOptions.extraResources, and so on. PlatformSpecificBuildOptions does not extend FilesBuildOptions, and the TypeScript types and the JSON schema only have fileOptions.files / extraResources / extraFiles keys in a config file, an extends parent, a -c.files=… override or the config object passed to build() are applied as their fileOptions counterparts before the configuration is validated, logging one warning per process that names the keys found and where they belong. When a flat key and its fileOptions counterpart are set on the same object, fileOptions wins and the build warns about the conflict. A CLI override or a parent config's flat key is merged with fileOptions. A fileOptions that is not an object (for example a list of globs written directly under it) fails the build with a message showing the nested form.files, extraResources or extraFiles from the loaded configuration (for example a hook reading context.packager.config.files, or buildResult.configuration.extraResources) gets the fileOptions value, with a warning per key: the loaded configuration and its platform sections forward these reads through non-enumerable properties, which stay out of the effective config, JSON.stringify and Object.keys. Assigning them throws a configuration error naming the fileOptions property to set instead.deepAssign (builder-util-runtime) copies only enumerable own properties, so the forwarding properties are never copied into merged options.electron-builder migrate-schema (static and JS/TS configs) moves flat keys under fileOptions at the root and per platform. A flat key also set under fileOptions is removed with a warning, since the build ignores it.27.0.0-alpha.10
electron-builder 27.0.0-alpha.10
Major changes
Details
--publish) that includes a target writing auto-update metadata (latest*.yml: NSIS, AppImage, deb/rpm/pacman,
macOS zip/dmg, AppX with electronUpdaterAware) fails when no Ed25519 signing key resolves. The check runs at build
start, before anything is packed or uploaded, so no artifact of that build is published; a build of only targets
that write no update info (snap, flatpak, MSI/MSIX, portable, mas/pkg, plain archives) needs no key. Third-party
targets declare update info with the new Target.writesUpdateInfo getter; one that does not is still checked, but
only when its own artifact is created. The error names electron-builder create-update-key and the
ELECTRON_BUILDER_UPDATE_SIGN_KEY / ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE environment variables
(updateManifest.signingKey / signingKeyFile work too). A build without a publish policy only warns, so local
builds are unaffected. To keep publishing unsigned manifests, set updateManifest: false - the only opt-out; every
build that emits a manifest then logs a warning, and false also short-circuits the signing-key environment
variables, so a leftover CI secret cannot re-enable signing behind the opt-out. updateManifest: null is not an
opt-out. A platform block may be false on its own and shadows a root signing config for that platform, while a
platform null still falls back to the root. publishAutoUpdate: false waives the requirement only when every
publish provider sets it (no manifest is emitted then); a single provider that still emits a manifest keeps it
enforced. A publicKey with no private key does not satisfy it. Because installs that carry a public key are
fail-closed, do not switch to updateManifest: false after shipping signed manifests - those installs would refuse
every further update. getAppUpdatePublishConfiguration (exported for third-party targets) can now throw for this
reason. See the v27 breaking changes guide.latest*.yml). Each manifest is signed over its integrity-critical fields
with the keys from updateManifest.signingKey/signingKeyFile or the ELECTRON_BUILDER_UPDATE_SIGN_KEY/
ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE env vars, and the matching public keys are embedded into app-update.yml
(both resolved from the same keys on the platform packager, so signing and embedding cannot disagree).
electron-updater verifies the signature before downloading and refuses to update on tamper/missing-signature
(fail-closed). Installs built before a public key existed keep skipping verification with a one-time warning. New
CLI: electron-builder create-update-key (prints the public key and its key id).updateManifestPublicKey is a
string or an array; updateManifest.publicKey, signingKey and signingKeyFile accept arrays, a PEM value may
hold several concatenated keys, and ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE accepts several paths joined with
the OS path delimiter), and a manifest may carry several signatures (signatures: [{ keyId, signature }],
one per signing key, next to the legacy signature of the first key). A manifest is accepted when any trusted
key validates any of its signatures, so a release signed with [old, new] verifies on installs that trust
either. AppUpdater.updateManifestPublicKey accepts a string or an array. A build-time warning flags an
explicit publicKey list that contains none of the signing keys.app-update.yml (the embedded feed and trust list) now follows the targets that write update info: each packaged
app embeds the first manifest-receiving provider of the publish settings of its manifest-emitting targets
(NSIS/NSIS web, AppX with electronUpdaterAware, macOS dmg/zip, AppImage, deb/rpm/pacman), resolving target, then
platform, then top level, instead of the platform/top-level publish only. A build with only nsis.publish
therefore ships that feed and the key verifying its signed manifests, where it used to ship no app-update.yml
(or, with a GitHub repository, a GitHub feed while the manifests went elsewhere). With no such target (snap-only,
publish: null or publishAutoUpdate: false on the target) the platform/top-level settings apply as before,
including the GitHub fallback. AppImage and deb/rpm/pacman honor appImage.publish/deb.publish etc. for the file
they write. When two targets built from the same app (e.g. dmg and zip, or nsis and an updater-aware appx)
resolve different feeds (first providers that differ in more than upload-only options such as publishAutoUpdate
or timeout), a publishing build fails at build start with an InvalidConfigurationError; a build without a
publish policy warns that publishing will fail and writes no app-update.yml for that app. Configure publish
once at the platform level, or give those targets the same first provider. getAppUpdatePublishConfiguration now
honors the target-specific options passed to it. A provider with publishAutoUpdate: false is no longer embedded
as the feed when a later provider receives the manifest (e.g. [{ provider: "s3", publishAutoUpdate: false }, "github"] now embeds GitHub instead of an S3 feed that never gets a latest*.yml).AppUpdater.allowUnverifiedLinuxPackages (#9990).app-update.yml (an nsis, nsis-web or electronUpdaterAware appx target with a publish configuration, including one inferred from a GitHub repository) now fails with an InvalidConfigurationError when its publisher name cannot be determined: any custom win.sign.sign hook without win.sign.publisherName (its publisher name is never derived from a certificate, not even one in the config — certificateFile, certificateSubjectName, certificateSha1, cscLink — or from WIN_CSC_LINK / CSC_LINK, because the hook may sign with another one), or a certificate without a Common Name (including a certificate-store subject, which no longer yields an undefined publisher name). Set win.sign.publisherName to the subject of the signing certificate (copy it from a binary your hook already signed), or set win.verifyUpdateCodeSignature: false only if your updates are not Authenticode-signed or you don't use electron-updater. Error and warning messages now name win.sign.publisherName instead of the removed win.publisherName.isAdminRightsRequired in the update info of every per-machine nsis and nsis-web build (perMachine: true), including assisted installers (oneClick: false) that don't set packElevateHelper and builds with differentialPackage: false, and writes it into the file entry of the installer for nsis-web builds too, so their updates are started with elevate.exe directly and, like other per-machine updates, are not installed automatically at launch with autoInstallEvent: "onNextLaunch" (call installPendingUpdateIfAvailable())disableWebInstaller is false (the v27 grace period is removed; cached and install-on-next-launch web updates re-verify the web package), and the nsis-web installer verifies --package-file and versioned package downloads against its built-in SHA-512 hashes (opt out with nsisWeb.allowUnverifiedAppPackage). Set disableWebInstaller before the app is ready: a pending install-on-next-launch web update is checked against it at app ready--package-file (electron-updater does this for updates) or found next to the installer is first copied into the installer's own temporary directory; the checksum is computed on that copy and that copy is what is extracted. With nsisWeb.allowUnverifiedAppPackage a package passed via --package-file is still copied, but not verified. The local package file is now left in place (the installer's copy is moved into the app's update cache instead), and the installation is aborted (exit code 2) if a --package-file package cannot be copied; a package found next to the installer that cannot be copied is ignored and the package is downloaded, as when its checksum doesn't match. electron-updater removes the package it passed via --package-file from its pending cache directory at startup once the app runs the version of that update (update-info.json records the version of a web installer update for this); the package of an update that is not installed yet, or whose install failed, is kept.customNsisBinary / customNsisResources in favour of toolsets.nsis and installerDebugLogging; hint --config in migrate-schemaDetails
nsis.customNsisBinary (also on nsisWeb / portable) or customNsisResources and silently built with the default NSIS. Both keys and the exported CustomNsisBinary type are now removed, and a config that sets them fails the build with a message naming the replacement:
toolsets.nsis: { url, checksum, version }. The url and the v26 base64 SHA-512 checksum work as before (see https://www.electron.build/docs/toolsets#custom-toolset-checksum), but the bundle must contain the NSIS plugins (plugins/ or windows/Plugins/), which v26 read from a separate resources bundlecustomNsisBinary.debugLogging becomes nsis.installerDebugLogging (also on nsisWeb). It needs a log-enabled NSIS (makensis and stubs compiled with NSIS_CONFIG_LOG=yes), which the bundled toolsets.nsis versions are not, so setting it without a custom toolsets.nsis now fails with a configuration error instead of a LogSet error from makensiselectron-builder migrate-schema (static and JS/TS configs) moves debugLogging to installerDebugLogging (dropping it, with a warning, for portable, where it had no effect) and removes a customNsisBinary that sets nothing else. It leaves a custom bundle in place and warns, without printing its url or checksum, because the bundle itself has to change.toolsets.<name>: { url, checksum }) with a checksum that is neither a SHA-256 hex value nor a base64 SHA-512 (for example a sha256: prefixed value) now fails with a configuration error linking to https://www.electron.build/docs/toolsets#custom-toolset-checksum before anything is downloaded, instead of a generic checksum mismatch afterwards. An uppercase hex value is lowercased.migrate-schema finds no config, its error now lists every auto-detected file name (including electron-builder.mjs) and says that a config file with another name needs --config <path>.Minor changes
writeEffectiveConfig to control writing builder-effective-config.yaml. Before, the file was only written for local interactive builds, so CI steps could not read the resolved configuration (e.g. the detected electronVersion). Set true to always write it or false to never write it; the default is unchanged.resources/package-type so nsis-web installs default disableWebInstaller to falseDetails
resources/package-type marker (nsis or nsis-web) at install time, mirroring the existing Linux package-type mechanism. electron-updater's NsisUpdater reads this marker and, for nsis-web installs, pre-seeds disableWebInstaller = false so web-installer auto-updates keep working without the app wiring the flag by hand.autoUpdater.disableWebInstaller = …) still wins, and a plain nsis marker, or no marker, leaves the default (true), so web-installer updates are rejected with ERR_UPDATER_WEB_INSTALLER_DISABLED. The marker is written by the installer script — the only build artifact that differs between nsis and nsis-web (the app payload is byte-identical, since both targets share one app archive). Only go-forward installs carry the marker; existing deployments are unaffected.nativeModules.buildDependenciesFromSource no longer skips the native-dependency rebuild when the target platform differs from the host (which shipped the host's binary). Native modules cannot be cross-compiled from source, so such targets are now rebuilt with prebuilt binaries for the target and a warning is logged. feat: after packing (per slice for macOS universal, before the merge), every .node addon in app.asar, app.asar.unpacked or app is identified from its ELF / Mach-O / PE header and compared with the target platform/arch; a mismatch fails the build with the file, detected and expected target. Other mismatched native files (.so, .dylib, .dll, .exe) only warn, and files declared for another platform (package.json os/cpu, prebuilds/<platform>-<arch>/ paths) are skipped. New opt-out option nativeModules.verifyNativeBinaries?: boolean | "warn" | null ("warn" logs only, false skips).file:// archivesDetails
toolsets.<name>.checksum now accepts the base64-encoded SHA-512 of the archive (88 characters, e.g. openssl dgst -sha512 -binary <archive> | openssl base64 -A) as well as the SHA-256 hex. v26 used base64 SHA-512 for all toolset checksums, so a v26 value carries over unchanged. v27 defaults to SHA-256 hex because toolset downloads moved to the official @electron/get package, whose checksum verification (sumchecker) only supports SHA-256 hex, so a SHA-512 download is verified by electron-builder before it is cached or extracted, and a corrupted download is deleted. A local file:// archive is now verified against its checksum before it is extracted; on a mismatch the build fails with a configuration error naming the file and both checksums, and the file is left in place. Prefixed values (sha256:…, sha512-…) and a hex-encoded SHA-512 are still rejected before anything is downloaded. See https://www.electron.build/docs/toolsets#custom-toolset-checksumresources/app.asar region with finer content-defined blocks (4/8/16 KiB) than the rest of the artifact. With nsis.differentialPackage: "store-asar", the asar sits uncompressed in the package and in the signed installer, so its byte range is now chunked on its own parameters instead of the 8/16/32 KiB default used everywhere else — a one-line app-code change costs 5–17% fewer bytes on the wire (measured on a ~32 MB asar). The blockmap format is unchanged and every shipped electron-updater reads it exactly as before; when the asar bytes cannot be located in the package the build logs a warning and falls back to default chunking rather than failing.Details
"store-asar" (available since 26.x via #10201 and 27.0.0-alpha.9): the block boundaries inside the asar region change once. The first differential update from an installer built without this change to one built with it re-downloads close to the whole asar; updates between installers built with it get the smaller deltas.Patch changes
differentialPackage: "store-asar" finds no resources/app.asar (e.g. asar: false) instead of silently compressing the package normallyElectronTeamID automation workingDetails
codesign --sign was given the certificate's common name, which fails with ambiguous (matches "X" and "X" ...) when the keychain holds more than one valid certificate with that name. It is now given the certificate's SHA-1 hash, which is unique.@electron/osx-sign parses the Team ID out of the identity name to fill in ElectronTeamID for sandboxed (MAS) apps, so electron-builder now writes that key into the app's Info.plist itself before signing — the same value from the same source — instead of relying on the identity string carrying it. A custom signer replaces osx-sign entirely, so it keeps receiving the bare hash and its Info.plist is left untouched.savePlistFile destroying <data> and <date> values, which it rewrote as a <dict> of byte integers and an empty <dict> respectively.useZip is set (ignored with a warning for differential-aware builds and for nsis-web, which always use 7z), and only share an app package between targets (e.g. nsis + portable) whose packaging settings matchnsis.perMachine / nsisWeb.perMachine (per-machine NSIS updates) and a custom win.sign.sign hook without win.sign.publisherName (whatever certificate the config names); the nsis-web advisory now says that web-installer updates are rejected unless autoUpdater.disableWebInstaller is false and when to set nsisWeb.allowUnverifiedAppPackage, and target names with an :arch suffix (e.g. nsis-web:ia32) are detectedlatest*.yml with deepAssign--package-file package that cannot be copied, or a failed or cancelled download leaves the installed version in place. Because the download can take a while, a run that isn't an update (--updated) then checks again for the running app, with the same prompt as at the start (Cancel aborts with exit code 2), before the old uninstaller would close it without askingPUBLISH_FOR_PULL_REQUEST and CSC_FOR_PULL_REQUEST warnings at the current CircleCI page on secrets in forked pull request builds. The previous link returned 404.HttpExecutor.removeCrossOriginSensitiveHeaders copies the headers with deepAssign, which ignores __proto__, constructor and prototype keysgeneric publish url with a query string: electron-updater sends the feed query and the credential headers only to downloads on the feed's origin. The build prints the same warning once per feed (naming the query parameters, not their values) when it writes such a feed to app-update.yml, so it does not depend on migrate-schema having been runspawnAndWrite / spawnAndWriteWithOutput when the process exits before all input is writtenelectron-updater 7.0.0-alpha.9
Major changes
verifyUpdateFile to AppUpdater, and rename the NSIS Authenticode verification interfaceDetails
AppUpdater.verifyUpdateFile lets an app run its own verification of an update file before that file is allowed to become installable. The default implementation is a stub that immediately succeeds. It runs on every path that can lead to an install — right after a fresh download (while the file still sits under a temporary name, so an unverified file is never executable under its real name), when an update downloaded by an earlier session is reused from the cache, and before an install-on-next-launch spawns the cached installer. On failure the file is deleted and an ERR_UPDATER_INVALID_UPDATE_FILE error is emitted. Assigning null restores the default.null-means-success / string-means-error convention:type VerifyUpdateFileResult = { response: "success" } | { response: "failure"; message: string }
NsisUpdater.verifyUpdateCodeSignature is deprecated in favour of verifyUpdateFileAuthenticodeSignature, which differs in return type. The old name is kept as a compatibility shim that translates in both directions and shall be removed in electron-builder v28.// Before
autoUpdater.verifyUpdateCodeSignature = async (publisherNames, path) => (isValid ? null : "why it failed")
// After
autoUpdater.verifyUpdateFileAuthenticodeSignature = async (publisherNames, path) =>
isValid ? { response: "success" } : { response: "failure", message: "why it failed" }
NsisUpdater._verifyUpdateCodeSignature member is renamed to _verifyUpdateFileAuthenticodeSignature and takes the new return type. A deprecated accessor under the old name forwards to it, so a subclass that assigns this._verifyUpdateCodeSignature keeps working; a subclass that redeclares it as a class field shadows the accessor and must be migrated.BaseUpdater.verifyInstallerSignatureOnLaunch returns Promise<VerifyUpdateFileResult> instead of Promise<string | null>. An override that resolves null to mean "verified" now reports every install-on-next-launch as unsigned; return { response: "success" } instead. (This member was introduced earlier in the same v27 pre-release cycle, so only apps on a 7.0.0-alpha are affected.)disableWebInstaller to trueDetails
AppUpdater.disableWebInstaller now defaults to true. NSIS web-installer packages are no longer loaded unless you opt in, because their payload is fetched from a manifest-supplied URL that may not undergo signature verification.ERR_UPDATER_WEB_INSTALLER_DISABLED unless disableWebInstaller is false. Installs made by an nsis-web installer built with electron-builder v27+ opt in automatically through the resources/package-type marker. If you publish and rely on an NSIS web installer for other installs, set autoUpdater.disableWebInstaller = false in your main process.disableWebInstaller is false (the v27 grace period is removed; cached and install-on-next-launch web updates re-verify the web package), and the nsis-web installer verifies --package-file and versioned package downloads against its built-in SHA-512 hashes (opt out with nsisWeb.allowUnverifiedAppPackage). Set disableWebInstaller before the app is ready: a pending install-on-next-launch web update is checked against it at app readyfiles[].url or packages.<arch>.path in latest*.yml, a GitLab release asset link, and the blockmaps and differential range requests derived from them — is requested without the credential headers from requestHeaders / addAuthHeader (headers such as Authorization, the same set that is removed on a cross-origin redirect) and without the feed URL's query string. Such a URL keeps its own query string, so pre-signed URLs work. With every provider, including custom ones, a URL that electron-updater resolves against the feed URL (such as a files[].url or a blockmap) gets the feed query only on the feed's origin; as on redirects, an http → https upgrade of the feed host on the default ports keeps the headers and the query. Downloads on the feed origin are unchanged, and the old blockmap from an app-set previousBlockmapBaseUrlOverride keeps the credentials on that origin. If your latest*.yml points downloads at another origin that needs these credentials, serve the files from the feed origin or use pre-signed URLs. The NSIS web-package differential download now uses the same per-download headers as other downloads. A custom provider that does not extend a built-in one must declare Provider.feedBaseUrl — its feed URL (the credential headers then only go to that origin) or null (the request headers go to every download URL) — when the download headers include a credential header: if it does not, downloadUpdate() fails with ERR_UPDATER_FEED_BASE_URL_NOT_DECLARED before any download request. The first download that loses the credential headers, and the first that does not get the feed query, each log a warning once per updater, naming the headers, the query parameters and the origins (never their values), with a link to the migration guide; ERR_UPDATER_FEED_BASE_URL_NOT_DECLARED links it too. New APIs: Provider.feedBaseUrl (undefined, not declared, by default), HttpExecutor.sensitiveHeaderNames, HttpExecutor.removeCrossOriginSensitiveHeaders and HttpExecutor.isCrossOrigin.Minor changes
Details
--publish) that includes a target writing auto-update metadata (latest*.yml: NSIS, AppImage, deb/rpm/pacman,
macOS zip/dmg, AppX with electronUpdaterAware) fails when no Ed25519 signing key resolves. The check runs at build
start, before anything is packed or uploaded, so no artifact of that build is published; a build of only targets
that write no update info (snap, flatpak, MSI/MSIX, portable, mas/pkg, plain archives) needs no key. Third-party
targets declare update info with the new Target.writesUpdateInfo getter; one that does not is still checked, but
only when its own artifact is created. The error names electron-builder create-update-key and the
ELECTRON_BUILDER_UPDATE_SIGN_KEY / ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE environment variables
(updateManifest.signingKey / signingKeyFile work too). A build without a publish policy only warns, so local
builds are unaffected. To keep publishing unsigned manifests, set updateManifest: false - the only opt-out; every
build that emits a manifest then logs a warning, and false also short-circuits the signing-key environment
variables, so a leftover CI secret cannot re-enable signing behind the opt-out. updateManifest: null is not an
opt-out. A platform block may be false on its own and shadows a root signing config for that platform, while a
platform null still falls back to the root. publishAutoUpdate: false waives the requirement only when every
publish provider sets it (no manifest is emitted then); a single provider that still emits a manifest keeps it
enforced. A publicKey with no private key does not satisfy it. Because installs that carry a public key are
fail-closed, do not switch to updateManifest: false after shipping signed manifests - those installs would refuse
every further update. getAppUpdatePublishConfiguration (exported for third-party targets) can now throw for this
reason. See the v27 breaking changes guide.latest*.yml). Each manifest is signed over its integrity-critical fields
with the keys from updateManifest.signingKey/signingKeyFile or the ELECTRON_BUILDER_UPDATE_SIGN_KEY/
ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE env vars, and the matching public keys are embedded into app-update.yml
(both resolved from the same keys on the platform packager, so signing and embedding cannot disagree).
electron-updater verifies the signature before downloading and refuses to update on tamper/missing-signature
(fail-closed). Installs built before a public key existed keep skipping verification with a one-time warning. New
CLI: electron-builder create-update-key (prints the public key and its key id).updateManifestPublicKey is a
string or an array; updateManifest.publicKey, signingKey and signingKeyFile accept arrays, a PEM value may
hold several concatenated keys, and ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE accepts several paths joined with
the OS path delimiter), and a manifest may carry several signatures (signatures: [{ keyId, signature }],
one per signing key, next to the legacy signature of the first key). A manifest is accepted when any trusted
key validates any of its signatures, so a release signed with [old, new] verifies on installs that trust
either. AppUpdater.updateManifestPublicKey accepts a string or an array. A build-time warning flags an
explicit publicKey list that contains none of the signing keys.app-update.yml (the embedded feed and trust list) now follows the targets that write update info: each packaged
app embeds the first manifest-receiving provider of the publish settings of its manifest-emitting targets
(NSIS/NSIS web, AppX with electronUpdaterAware, macOS dmg/zip, AppImage, deb/rpm/pacman), resolving target, then
platform, then top level, instead of the platform/top-level publish only. A build with only nsis.publish
therefore ships that feed and the key verifying its signed manifests, where it used to ship no app-update.yml
(or, with a GitHub repository, a GitHub feed while the manifests went elsewhere). With no such target (snap-only,
publish: null or publishAutoUpdate: false on the target) the platform/top-level settings apply as before,
including the GitHub fallback. AppImage and deb/rpm/pacman honor appImage.publish/deb.publish etc. for the file
they write. When two targets built from the same app (e.g. dmg and zip, or nsis and an updater-aware appx)
resolve different feeds (first providers that differ in more than upload-only options such as publishAutoUpdate
or timeout), a publishing build fails at build start with an InvalidConfigurationError; a build without a
publish policy warns that publishing will fail and writes no app-update.yml for that app. Configure publish
once at the platform level, or give those targets the same first provider. getAppUpdatePublishConfiguration now
honors the target-specific options passed to it. A provider with publishAutoUpdate: false is no longer embedded
as the feed when a later provider receives the manifest (e.g. [{ provider: "s3", publishAutoUpdate: false }, "github"] now embeds GitHub instead of an S3 feed that never gets a latest*.yml).AppUpdater.allowUnverifiedLinuxPackages (#9990).resources/package-type so nsis-web installs default disableWebInstaller to falseDetails
resources/package-type marker (nsis or nsis-web) at install time, mirroring the existing Linux package-type mechanism. electron-updater's NsisUpdater reads this marker and, for nsis-web installs, pre-seeds disableWebInstaller = false so web-installer auto-updates keep working without the app wiring the flag by hand.autoUpdater.disableWebInstaller = …) still wins, and a plain nsis marker, or no marker, leaves the default (true), so web-installer updates are rejected with ERR_UPDATER_WEB_INSTALLER_DISABLED. The marker is written by the installer script — the only build artifact that differs between nsis and nsis-web (the app payload is byte-identical, since both targets share one app archive). Only go-forward installs carry the marker; existing deployments are unaffected.files[].blockMapUrl in latest*.yml names a file's blockmap URL (e.g. a separately pre-signed one) instead of ${url}.blockmap with the file URL's query string. A relative value resolves like url (against the feed URL); an absolute URL is used as-is, with its own host and query string. It gets the feed query and credential headers only on the feed's origin. With a blockMapUrl, the old blockmap is not derived from the new file's URL: it comes from the local cache, else from previousBlockmapBaseUrlOverride, else that update is downloaded in full (which caches the new blockmap). The manifest signature covers blockMapUrl when present, as an extra field on the file record, so manifests without it canonicalize and verify exactly as before; an electron-updater without this change refuses a signed manifest that has one. electron-builder does not write it. The private GitHub and GitLab providers, which resolve files from the release assets, ignore it.Patch changes
checkForUpdatesAndNotifyapp-update.yml (an nsis, nsis-web or electronUpdaterAware appx target with a publish configuration, including one inferred from a GitHub repository) now fails with an InvalidConfigurationError when its publisher name cannot be determined: any custom win.sign.sign hook without win.sign.publisherName (its publisher name is never derived from a certificate, not even one in the config — certificateFile, certificateSubjectName, certificateSha1, cscLink — or from WIN_CSC_LINK / CSC_LINK, because the hook may sign with another one), or a certificate without a Common Name (including a certificate-store subject, which no longer yields an undefined publisher name). Set win.sign.publisherName to the subject of the signing certificate (copy it from a binary your hook already signed), or set win.verifyUpdateCodeSignature: false only if your updates are not Authenticode-signed or you don't use electron-updater. Error and warning messages now name win.sign.publisherName instead of the removed win.publisherName.verifyUpdateFile as packageFilePath when a pending web update is installed on next launchinstallDirectory, /D=) as the last installer argument, after --package-filedisableWebInstaller set to false for a full-installer update is logged only when the app set it; for the default of an install made by an nsis-web installer an info line says that web-installer updates need disableWebInstaller = false after that update--package-file (electron-updater does this for updates) or found next to the installer is first copied into the installer's own temporary directory; the checksum is computed on that copy and that copy is what is extracted. With nsisWeb.allowUnverifiedAppPackage a package passed via --package-file is still copied, but not verified. The local package file is now left in place (the installer's copy is moved into the app's update cache instead), and the installation is aborted (exit code 2) if a --package-file package cannot be copied; a package found next to the installer that cannot be copied is ignored and the package is downloaded, as when its checksum doesn't match. electron-updater removes the package it passed via --package-file from its pending cache directory at startup once the app runs the version of that update (update-info.json records the version of a web installer update for this); the package of an update that is not installed yet, or whose install failed, is kept.HttpExecutor.removeCrossOriginSensitiveHeaders copies the headers with deepAssign, which ignores __proto__, constructor and prototype keys27.0.0-alpha.9
electron-builder 27.0.0-alpha.9
Major changes
Details
squirrelWindows.customSquirrelVendorDir option has been removed. Supply a custom Squirrel vendor bundle with the toolsets.squirrel config (a ToolsetCustom object) instead — it goes through the same rcedit/WiX provisioning as the default bundle.customInstallMode macro guard casing in multiUserUi.nsh. The guard previously checked !ifmacrodef customInstallmode (lowercase m) while the documentation and the adjacent !insertmacro customInstallMode call use customInstallMode; it now checks customInstallMode, matching the documented macro name. Applications that define the macro with the documented casing now have it reliably applied on the install-mode page of assisted multi-user installers. Applications that defined the macro under the exact lowercase name customInstallmode relied on undocumented behavior — rename the definition in your custom NSIS scripts (e.g. build/installer.nsh) to customInstallMode.com.apple.security.cs.allow-unsigned-executable-memory and com.apple.security.cs.disable-library-validation by default; nested binaries now use @electron/osx-sign's Chromium-derived per-file defaults, MAS builds fall back to its sandboxed defaults, ad-hoc builds get a dedicated entitlements file, and a post-sign check warns about foreign-signed binaries in app.asar.unpackedMinor changes
toolsets.wine: "system" and make it what "latest" resolves toDetails
"system" runs Windows tools with the host wine on PATH, restoring the capability of the USE_SYSTEM_WINE env var removed in v27. The host-wine branch already existed but was reachable only on Linux, so macOS had no way to opt out of the downloaded bundle: ToolsetCustom requires the directory to contain a prebuilt wine-home prefix, which a real Wine installation does not have."latest" — the default — now resolves to "system" rather than the "1.0.1" bundle, so building a Windows target on macOS requires Wine to be installed (brew install --cask wine-stable). The published wine@1.0.1 bundles ship no PE builtins (lib/wine/<arch>-windows is deleted at package time), so they cannot execute any Windows binary; toolsets.wine: "1.0.1" still resolves and downloads for anyone pinning it explicitly. Linux already defaulted to the host Wine.Icon="…" on shortcuts and ProgIds when the app has an icon<Icon Id="…"/> only when iconPath is set, but MsiTarget referenced that id unconditionally, so building an MSI for an app without an icon failed in light.exe with LGHT0094: The identifier 'Icon:<Product>Icon.exe' could not be found.Details
nsis.include (and nsisWeb.include) now also accepts an array of paths — every entry is resolved relative to the build resources directory first, then the project directory, and all scripts are included in order.!addincludedir, so custom scripts can !include sibling files by name even when the main include is auto-discovered.portable.include (string or array). It still does not auto-discover build/installer.nsh, so existing portable builds are unaffected.build/x86-unicode and build/x86-ansi user plugin directories are now registered (each when it exists) instead of only the one matching the unicode option, matching the documented behavior.!ifmacrodef customInstallmode case mismatch in multiUserUi.nsh to match the documented customInstallMode macro name (NSIS macro-name matching is case-insensitive, so this is a consistency fix).differentialPackage: "store-asar" — store resources/app.asar uncompressed (7-Zip Copy) in the differential-aware app package so a small app-code change costs a proportionally small differential download instead of re-downloading the entire recompressed asar (measured on a ~32 MB asar: 0.2% instead of 100% for a one-line change). nsis.differentialPackage is widened to boolean | "compressed" | "store-asar": false disables differential support as before, "store-asar" opts into the stored asar, and everything else (true, "compressed", unset) keeps today's fully compressed differential package. Backed by a generic ArchiveOptions.storedPaths in archive().Details
latest*.yml). When signing keys are configured
(updateManifest.signingKey/signingKeyFile in config, or ELECTRON_BUILDER_UPDATE_SIGN_KEY/ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE
env vars), each manifest is signed over its integrity-critical fields and the matching public keys are
embedded into app-update.yml (both resolved from the same keys on the platform packager, so signing and
embedding cannot disagree). electron-updater verifies the signature before downloading and refuses to
update on tamper/missing-signature (fail-closed). Opt-in: when no public key is configured, verification is
skipped with a one-time warning. New CLI: electron-builder create-update-key (prints the public key and its key id).updateManifestPublicKey is a
string or an array; updateManifest.publicKey, signingKey and signingKeyFile accept arrays, a PEM value may
hold several concatenated keys, and ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE accepts several paths joined with
the OS path delimiter), and a manifest may carry several signatures (signatures: [{ keyId, signature }],
one per signing key, next to the legacy signature of the first key). A manifest is accepted when any trusted
key validates any of its signatures, so a release signed with [old, new] verifies on installs that trust
either. AppUpdater.updateManifestPublicKey accepts a string or an array. A build-time warning flags an
explicit publicKey list that contains none of the signing keys.AppUpdater.allowUnverifiedLinuxPackages (#9990).Details
electron-builder migrate-schema (static and JS/TS configs) now also rewrites the v26 shapes it previously left behind, which failed v27 schema validation on the next build:
mac/mas/masDev/win/linux asarUnpack → <platform>.asar.unpack, merging the root ASAR options in because a platform-level asar replaces the root one in v27; root ASAR keys that have no effect under asar: false are removedtoolsets.*: null entries are removed and the retired toolsets.appimage: "1.0.2" pin becomes "1.0.3"nativeRebuilder: "legacy", electronDownload.force, and v26 null ("unset") values on mac.type / provisioningProfile / binaries / signIgnore / singleArchFiles / x64ArchFiles are dropped instead of carried into keys that reject them; a hand-renamed electronGet still in the v26 shape is reshapednsis.publish), a non-empty tagNamePrefix next to vPrefixedTagName is kept (it won in v26), and an empty tagNamePrefix — ignored by v26 — becomes "v" with a warning so existing tag names do not changewin.signAndEditExecutable: false also maps to win.sign: false (it skipped signing in v26), and win.signtoolOptions / win.azureSignOptions under disabled signing are dropped with a warning instead of producing an invalid configsnap options the snapcraft.core24 shape does not support are dropped with a warningsquirrelWindows.customSquirrelVendorDir (not mechanically migratable) and prints an advisory for mac/mas/masDev configs that rely on the tightened default entitlements. The build-time legacy-config guard now also names squirrelWindows.customSquirrelVendorDir and electronGet.force, and the USE_SYSTEM_WINE removal message points at toolsets.wine: "system".Patch changes
LICENSE.electron.txt and Chromium's LICENSES.chromium.html in the macOS .app bundle (Contents/Resources) instead of dropping them outside the bundle, matching the license files already shipped on Windows and Linux (#9407)link:ed package. A located package is now resolved to its real directory before its own dependencies are searched for — in an isolated pnpm store those are siblings inside .pnpm/<name>@<ver>/node_modules/, reachable only from the link target — and a package that cannot locate itself by name (a workspace directory such as packages/builder-util-runtime) now has its dependencies read straight from that directory instead of contributing none. Previously an app whose electron-updater came from a local checkout shipped an asar missing universalify, jsonfile and argparse, and died at startup with Cannot find module 'universalify'. Dependencies that cannot be resolved are now reported in the collector log summary rather than skipped silently.pnpm-workspace.yaml instead of running pnpm --workspace-root exec pwd. pwd is POSIX-only, so on Windows the root silently resolved to undefined, @electron/rebuild searched only the app directory, and cross-architecture builds (e.g. --x64 --arm64) shipped transitive native modules such as keytar for the wrong architecture. When a workspace root is located but the package manager cannot be re-detected there, the located root is now kept and a warning is logged instead of dropping it.pkg installers. macOS 26's Installer probes the current-user-home install domain while parsing the deprecated <domains> element — even when that domain is disabled — which makes Installer.app request kTCCServiceSystemPolicyAppData as soon as the user leaves the Introduction pane. rootVolumeOnly="true" is now added to <options> when both allowAnywhere and allowCurrentUserHome are false; the install domains reported by installer -volinfo / -dominfo are unchanged, and <domains> is still emitted verbatim.pnpm list --json output by their declared range. Since pnpm 10.29.3 a repeated subtree is printed once and every later occurrence is a childless entry flagged deduped: true; the node-module collector recovered such an entry's dependencies by package name only, so when two versions of one package were installed the nested, version-conflicted copy was wired to the wrong version and its whole closure vanished from the packaged node_modules (the #8493 regression, e.g. es5-ext@0.10.64 with esniff, event-emitter and next-tick@1.1.0 dropped while the app pins es5-ext@0.10.53). The collector now resolves an omitted dependency against the dependent's declared range from its real store directory and takes the exact name@version entry, keeping the name-only match only as a fallback for link: dependencies, so version-conflicted transitive dependencies are no longer dropped with pnpm >= 10.29.3, 11 and 12.afterPackTestHook packager option (test-only) that skips target builds once the app directory is assembled.APP_PACKAGE_URL define resolution into an internal configureWebInstallerAppPackageUrl helper (no behaviour change) so it can be unit-tested without packaging.lstat per file; await async onNodeModuleFile hook results instead of treating the pending Promise as truthy (#10169)snap/gui entry and its configured desktopName.linux.files corrupt the flatpak files option. FlatpakTarget's files option ([string, string][] copy tuples) is merged with the shared linux.files option (a string[] of glob include/exclude patterns for general app packaging) via getOptionsForTarget's deepAssign, which concatenates array properties instead of replacing them — so setting linux.files (the common case) silently corrupted the flatpak-specific files list. @malept/flatpak-bundler then destructured each entry as [src, dest]; for a plain glob string this iterates its characters instead, producing a bogus path and crashing the build with ENOENT: no such file or directory, stat '<project-root>/*'. The merged list is now filtered down to actual [string, string] tuples before being passed to flatpak-bundler.flatpak.files from the flatpak config directly so that a single-string or FileSet linux.files no longer throws in FlatpakTargetelectron/asar failurespnpm config list hoisted detection from the base collectornodeLinker: hoisted) workspace, instead of packaging an out-of-range hoisted copyelectron-updater 7.0.0-alpha.8
Major changes
downloadUpdate() and UpdateCheckResult.downloadPromise resolve with a DownloadExecutorResult object instead of a positional Array<string>Details
AppUpdater.downloadUpdate() (and UpdateCheckResult.downloadPromise when autoDownload is enabled) now resolves with { updateFile, packageFile? } instead of [updateFile] / [updateFile, packageFile]. The array shape depended on element order to tell the installer apart from the optional NSIS web-installer package; the new DownloadExecutorResult type (exported from electron-updater) names both files. UpdateDownloadedEvent additionally gains an optional packageFile field for web installers.// Before (v6)
const files = await autoUpdater.downloadUpdate()
const installer = files[0]
const webInstallerPackage = files[1] // only for NSIS web installers
// After (v7)
const { updateFile, packageFile } = await autoUpdater.downloadUpdate()
checkForUpdates():// Before (v6)
const result = await autoUpdater.checkForUpdates()
const [installer] = (await result?.downloadPromise) ?? []
// After (v7)
const result = await autoUpdater.checkForUpdates()
const download = await result?.downloadPromise
const installer = download?.updateFile
Minor changes
Details
latest*.yml). When signing keys are configured
(updateManifest.signingKey/signingKeyFile in config, or ELECTRON_BUILDER_UPDATE_SIGN_KEY/ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE
env vars), each manifest is signed over its integrity-critical fields and the matching public keys are
embedded into app-update.yml (both resolved from the same keys on the platform packager, so signing and
embedding cannot disagree). electron-updater verifies the signature before downloading and refuses to
update on tamper/missing-signature (fail-closed). Opt-in: when no public key is configured, verification is
skipped with a one-time warning. New CLI: electron-builder create-update-key (prints the public key and its key id).updateManifestPublicKey is a
string or an array; updateManifest.publicKey, signingKey and signingKeyFile accept arrays, a PEM value may
hold several concatenated keys, and ELECTRON_BUILDER_UPDATE_SIGN_KEY_FILE accepts several paths joined with
the OS path delimiter), and a manifest may carry several signatures (signatures: [{ keyId, signature }],
one per signing key, next to the legacy signature of the first key). A manifest is accepted when any trusted
key validates any of its signatures, so a release signed with [old, new] verifies on installs that trust
either. AppUpdater.updateManifestPublicKey accepts a string or an array. A build-time warning flags an
explicit publicKey list that contains none of the signing keys.AppUpdater.allowUnverifiedLinuxPackages (#9990).Patch changes
PSModulePath from the PowerShell child environment case-insensitively during Windows code-signature verification. Windows environment variable names are case-insensitive but JS object keys are not, so a differently-cased key (e.g. PSMODULEPATH) could previously survive into the spawned PowerShell process.current.blockmap instead of leaving a stale one next to the freshly cached file, which poisoned the next differential download and surfaced as a generic sha512 checksum mismatch before falling back to a full download (#10097). Leftover pending blockmaps from previous update rounds are also cleared before a fresh download. sha512-mismatch logging now distinguishes a differential download that failed against stale/corrupt cached inputs (including whether the old blockmap came from the local cache or the server) from a genuine checksum failure of a fully downloaded file.downloadUpdate fall back to a full download with Response ends without calling any handlers:Details
DataSplitter only recognised CRLF. Some CDNs answer multipart/byteranges with bare LF line endings, so no part was ever split and the whole response accumulated in memory. Header lists now end at whichever of \r\n\r\n / \n\n comes first, and the <EOL>--boundary separator size follows the line ending the server actually uses.27.0.0-alpha.8
electron-builder 27.0.0-alpha.8
Major changes
Details
generateUpdatesFilesForAllChannels enabled, the extra alpha/beta update files were only written when the channel was exactly alpha, beta, or latest. A per-arch feed configured as channel: "${channel}-${arch}" resolves to something like beta-arm64, which hit the default branch, so alpha-arm64.yml was never written and arm64 pre-release users stopped getting promoted. The base channel is now read off the front of the name and the suffix is reattached to the expanded channels, so beta-arm64 yields beta-arm64 and alpha-arm64, and latest-arm64 yields all three.beta-*/latest-* channel now publishes 2–3 update files instead of 1, so a latest-x64 publish overwrites beta-x64.yml/alpha-x64.yml in the same bucket. Turn off generateUpdatesFilesForAllChannels if you relied on suffixed channels staying single-file.http-parser from the default pacman depends list. The package no longer exists in the official Arch Linux repositories (it is AUR-only since Node.js switched to llhttp), so packages built with the default configuration failed to install on stock Arch Linux and Manjaro with an unresolvable dependency — while ldd shows Electron apps have no runtime dependency on it (#9429). Every remaining entry in the default pacman list was verified to still resolve from the official Arch repositories (libappindicator-gtk3 resolves via the provides of the official libappindicator package in extra), so no other entry was removed.Details
"default" keyword in depends for the fpm targets (deb, rpm, pacman), mirroring the snap target's plugs/stagePackages/buildPackages convention. "default" expands in place to the target's default depends list, so extras can be appended without repeating the defaults — e.g. ["default", "http-parser"] restores http-parser on top of the defaults. The final list is deduplicated.Minor changes
SigningResult ("signed" | "signed:custom" | "skipped:no-certificate" | "skipped:filtered" | "skipped:disabled" | "skipped:unsupported", failures are still thrown) is now what PlatformPackager.signApp and the Windows/macOS signing paths report; sign managers' single sign attempts resolve to the SignFileResult subset ("signed" | "signed:custom" | "skipped:no-certificate"), and WinPackager.signIf extends it with "skipped:filtered" (excluded via signExts) and "skipped:disabled" (sign: false/sign: null), so callers and logs can distinguish why a file was not signed. The isSignResultSigned type guard tells the signed variants apart from the skips. Follow-up to #10082:Details
Signing <file>... log line is removed — the sign managers already log signing with certificate details right before executing, so unsigned builds no longer look like they are signing.signing skipped reason=no code signing certificate configured) instead of a debug-level "no signing configuration found".win.sign hook is now logged as signed with custom `sign` hook instead of being misattributed to signtool.exe.MacPackager.sign reports the same type explicitly instead of a bare true/false ("skipped:unsupported" on non-mac hosts and pull-request CI guard, "skipped:disabled" for sign/identity: null, "skipped:no-certificate" when no identity is found, "signed:custom" for a custom mac.sign hook), and MacTargetHelper.handleNullIdentity returns "skipped:disabled" instead of false.WinPackager.signApp and MacPackager.signApp previously discarded the per-file results and returned true unconditionally, so the afterSign hook fired even for fully unsigned builds. signApp now reports the combined real result (a signed result wins) — for unsigned builds, afterSign is skipped and the standard skipping "afterSign" hook as no signing occurred, perhaps you intended "afterPack"? warning is logged, matching the documented gating in doSignAfterPack and the mas/mas-dev behavior (#10071). Builds that relied on afterSign firing without any signing should move that logic to afterPack.Patch changes
$INSTDIR, so a perMachine install over a running per-user installation no longer fails. The path match now also requires a trailing backslash so sibling directories with the same prefix are no longer matched, and a failure to uninstall the previous version now reports the real uninstaller error instead of the misleading "cannot be closed" dialog.afterSign hook for mas/mas-dev builds again. The MAS flow packs with sign: false and codesigns separately, which skipped the only emitAfterSign call site — the hook now fires after codesigning and before the installer .pkg is created, and the standard "skipping afterSign" warning is logged when signing does not occur (#9997)toolsets.*.url bundles from the configured URL as-is instead of appending the filename again (fixes #10084)MessageBox (and the other silent-mode-reachable MessageBoxes in the NSIS templates) now carry a /SD IDOK silent default, so in silent installs the dialog auto-selects OK and the installer exits with its failure exit code instead of blocking on a dialog nobody can see.HttpError and errors with a top-level code, but @electron/get v5 throws its own HTTPError (fetch Response on .response, no .code) and undici wraps socket errors in TypeError: fetch failed with the code on error.cause.code — so GitHub 503s and connection resets failed immediately with zero retries. Downloads now retry with backoff on HTTP 5xx/429 and on transient network codes (ECONNRESET, ETIMEDOUT, ECONNREFUSED, EAI_AGAIN, EPIPE, UND_ERR_SOCKET, UND_ERR_CONNECT_TIMEOUT)security set-key-partition-list -k instead of the certificate's import password. The import password is only valid for security import -P; set-key-partition-list authenticates against the keychain itself, so on macOS versions that verify the password, CSC_LINK-based signing failed with SecKeychainUnlock: The user name or passphrase you entered is not correct (see #10066).7zip@1.0.1, which ships correct per-arch Windows binaries. 7zip@1.0.0 bundled the 32-bit 7za.exe for every Windows arch, capping 7-Zip's memory at 1.75 GiB and breaking LZMA2 multithreading on win-x64/win-arm64 hosts (electron-userland/electron-builder-binaries#222). Checksums for all platform bundles are updated to the new release assets./docs/features/ locations, repair the electron.build./ domain typo, and replace anchors that no longer exist (#10107)app-update.yml at build timeDetails
owner/repo, electron-builder fills them in from the repository info (package.json repository, CI env vars, then .git/config) and writes the result into app-update.yml inside the packaged app, where it becomes the update feed for every installed copy. Until now nothing in the build output said which repository had been chosen - not even at DEBUG=electron-builder, which logged the pre-resolution owner=undefined project=undefined.provider/owner/repo (or slug for Bitbucket) once per build, together with the source the repository was detected from. A repository taken from the package.json repository field is deliberate configuration and is reported at info level; one picked up from CI environment variables or .git/config is reported at warn level. Nothing about what gets written to app-update.yml changes, and builds that already specify owner/repo explicitly are unaffected.electron-updater 7.0.0-alpha.7
Patch changes
/docs/features/ locations, repair the electron.build./ domain typo, and replace anchors that no longer exist (#10107)27.0.0-alpha.7
electron-builder 27.0.0-alpha.7
Major changes
cannot find path for dependency / dependency not found on disk), the build now fails with an error listing the complete set of missing dependencies, instead of logging warnings and producing a package that breaks at runtime with MODULE_NOT_FOUND. Configure via the new allowMissingDependencies?: boolean | string[] | null option: true restores the previous warn-only behavior, a string[] allows only the listed dependency names to be missing (bare package name, or exact name@version), and false/null/omitted (the default) fails on any missing production dependency. Missing optional dependencies (declared in optionalDependencies, e.g. fsevents on Linux/Windows, or platform-specific packages) are always allowed and never fail the build. Migration: builds that previously "succeeded" while logging dependency not found on disk / cannot find path for dependency warnings will now fail — fix the underlying installation issue, list the affected dependency names in allowMissingDependencies, or set allowMissingDependencies: true to keep the old behavior.Minor changes
publisherName against the signing certificate at build timeDetails
app-update.yml exists but contains no publisherName, the updater used to skip signature verification (including custom verifyUpdateCodeSignature hooks) completely silently. It now logs a warning explaining that verification was skipped, how to fix it (sign the build so publisherName is derived automatically, or set win.publisherName explicitly), and that this fail-open behavior is deprecated: electron-builder v28 will treat a missing publisherName as a verification failure (fail-closed). The no-app-update.yml path (unpackaged/dev mode) stays silent.publisherName is explicitly configured and the subject of the local code signing certificate is known, the build now fails with a clear error if none of the configured names match the certificate (same DN-subset/CN matching semantics as the updater's verifier; any one of multiple configured names matching passes, so certificate-rotation setups keep working). This catches signing with the wrong certificate at build time instead of at update time. The check is skipped whenever the actual signing certificate's subject is not genuinely known (custom sign hooks, Azure Trusted Signing, PKCS#11 without an extractable certificate, x509 files without a CN), and publisherName: null remains a pure opt-out.to destinations in extraFiles/extraResources file sets. An absolute to path (POSIX, Windows drive-letter, or UNC) or a relative to that escapes the build output directory now fails the build with a clear InvalidConfigurationError instead of silently copying files outside the package onto the build machine. Relative hops that stay inside the build output directory (e.g. to: "../Frameworks" from Contents/Resources on macOS) keep working. The error suggests the fpm file-mapping syntax ("deb": { "fpm": ["src=/abs/dest"] }) for users who want absolute in-package paths on deb/rpm.mac.sign.type (removed in #9889 without a working replacement). An explicit sign.type now selects development certificates (Mac Developer / Apple Development) and embeds matching development provisioning profiles on any mac build flavor; the default is still derived from the target (mas-dev → development, otherwise distribution). A mas build with sign.type: "development" also skips the MAS .pkg installer, matching v26 behavior. Docs and the migrate-schema type → sign.type move now match the implementation.Patch changes
Details
builder-util removePassword: redact single-letter/URI secret flags (security … -k <password>, osslsigncode -key <pkcs11-uri?pin-value=…>) and whitespace-containing secrets in debug logs, and make the /b … /c block-redaction regex ReDoS-safe.builder-util-runtime httpExecutor: fix the non-functional maxRedirects guard (the redirect counter was never advanced), so a redirect loop from a malicious feed/mirror no longer hangs the updater.electron-updater GitLabProvider: only forward the GitLab token to the channel-file request when its URL is same-origin as the API host, so an off-host/http:// direct_asset_url in the release JSON cannot exfiltrate the token.app-builder-lib: defense-in-depth hardening — validate executableName before interpolating it into the generated Flatpak launcher, contain custom-toolset extraction within the cache dir, and XML-escape MSI file-association ext/description.electron-builder migrate-schema: auto-remove the removed linux.syncDesktopName flag.SHASUMS256.txt-<version> at the Electron cache root and passing it to @electron/get as inline checksums, suppressing the mandatory network fetch of SHASUMS256.txt that failed air-gapped builds even with a fully seeded cache (#10039)Zoo Design Studio (Staging) failed AppImage builds with "productFilename contains characters that cannot be safely used in file paths" — a regression from the Go pipeline, which accepted them. After, names containing ( and ) build again; parentheses are legal in Linux filenames and inert inside the double-quoted bash strings of the generated AppRun launcher, while genuinely dangerous characters ($, backticks, quotes, slashes) remain rejected.catalog:/workspace: specifierslibsql@0.3.19 via @prisma/adapter-libsql -> @libsql/client), which caused npm-based builds to hang at searching for node modules and eventually crash with a JavaScript heap out-of-memory error (#10068)Details
node_modules, climbed to the workspace root, and copied the entire hoisted workspace node_modules into app.asar.package.json nor added via extraMetadata) bundles no node_modules at all — the collection step is skipped with an informational log message.fsevents on Linux/Windows) as missing optional dependencies in the pnpm collector, instead of warning dependency not found on disktar -J exporting only XZ_OPT=-<level>, so data.tar compressed single-threaded while rpm already defaults to multithreaded xzmt (measured on the same 6.4 GiB tree in one run: deb 1,059 s vs rpm 171 s). Export XZ_DEFAULTS=-T0 for the deb fpm invocation (xz parses it before XZ_OPT, keeping the compression level unchanged; an operator-provided XZ_DEFAULTS wins).electron-updater 7.0.0-alpha.6
Minor changes
publisherName against the signing certificate at build timeDetails
app-update.yml exists but contains no publisherName, the updater used to skip signature verification (including custom verifyUpdateCodeSignature hooks) completely silently. It now logs a warning explaining that verification was skipped, how to fix it (sign the build so publisherName is derived automatically, or set win.publisherName explicitly), and that this fail-open behavior is deprecated: electron-builder v28 will treat a missing publisherName as a verification failure (fail-closed). The no-app-update.yml path (unpackaged/dev mode) stays silent.publisherName is explicitly configured and the subject of the local code signing certificate is known, the build now fails with a clear error if none of the configured names match the certificate (same DN-subset/CN matching semantics as the updater's verifier; any one of multiple configured names matching passes, so certificate-rotation setups keep working). This catches signing with the wrong certificate at build time instead of at update time. The check is skipped whenever the actual signing certificate's subject is not genuinely known (custom sign hooks, Azure Trusted Signing, PKCS#11 without an extractable certificate, x509 files without a CN), and publisherName: null remains a pure opt-out.Patch changes
Details
builder-util removePassword: redact single-letter/URI secret flags (security … -k <password>, osslsigncode -key <pkcs11-uri?pin-value=…>) and whitespace-containing secrets in debug logs, and make the /b … /c block-redaction regex ReDoS-safe.builder-util-runtime httpExecutor: fix the non-functional maxRedirects guard (the redirect counter was never advanced), so a redirect loop from a malicious feed/mirror no longer hangs the updater.electron-updater GitLabProvider: only forward the GitLab token to the channel-file request when its URL is same-origin as the API host, so an off-host/http:// direct_asset_url in the release JSON cannot exfiltrate the token.app-builder-lib: defense-in-depth hardening — validate executableName before interpolating it into the generated Flatpak launcher, contain custom-toolset extraction within the cache dir, and XML-escape MSI file-association ext/description.electron-builder migrate-schema: auto-remove the removed linux.syncDesktopName flag../package.json in the exports map so tooling (including electron-builder's installed-version check) can resolve the installed version via require.resolve("electron-updater/package.json")27.0.0-alpha.6
electron-builder 27.0.0-alpha.6
Major changes
CFBundleName and helper app bundle names consistent so Electron resolves helper apps on modern macOSDetails
.app bundle, the helper bundles, and CFBundleName now all use the product name exactly as configured, which is required for Electron's helper-app lookup (${CFBundleName} Helper.app).productName and executableName to be usable as a bundle name without any filename sanitization. A name that would otherwise be silently altered (for example one containing /, \, :, *, control characters, or trailing dots/spaces) now fails with a clear configuration error so you can choose a valid name.filesystem to APFSDetails
HFS+ to APFS. APFS is the modern macOS filesystem and produces smaller, faster-to-mount images on current macOS. If you must support pre-10.13 (High Sierra) macOS, which cannot mount APFS volumes, set dmg.filesystem: "HFS+" explicitly.electron, electron-builder) listed in dependencies are now excluded from the packaged app (logged once) instead of failing the build, configurable via the new ignoredProductionDependencies option. BREAKING: removed the ALLOW_ELECTRON_BUILDER_AS_PRODUCTION_DEPENDENCY env var — electron-builder is excluded by default; drop a name from ignoredProductionDependencies to bundle it.path/sha512 behind electronUpdaterCompatibilityDetails
UpdateInfo.path / UpdateInfo.sha512 fields are now written to latest*.yml only when the declared electronUpdaterCompatibility semver range intersects electron-updater versions <2.16.0 (previously they were written unconditionally), mirroring how the Windows sha2 field is gated; the legacy latest-mac.json is likewise emitted only when the range intersects <2.0.0. The default electronUpdaterCompatibility is now >=2.16 (previously >=2.15), so none of the legacy fields are emitted by default. Both fields are now optional on the UpdateInfo type. Modern clients (electron-updater >=2.16) read the files[] array and are unaffected. If you still ship apps that embed electron-updater 1.x – 2.15, set electronUpdaterCompatibility to a range that includes them (e.g. >=1.0.0) so the legacy descriptor keeps being emitted.createTargets(..., arch: "all") now expands to x64 + arm64 on Windows and Linux instead of x64 + ia32. Electron 44 removed Windows ia32 builds, and Linux ia32 zips already ended at Electron 19, so the old expansion produced broken or impossible builds on current Electron. Request ia32 explicitly to keep building it on Electron <= 43.Minor changes
autoUpdater.disableWebInstaller when an nsis-web target is detectedDetails
electron-builder migrate-schema now prints an advisory when the config builds an nsis-web target, reminding you that AppUpdater.disableWebInstaller defaults to true as of v27 and that you must set autoUpdater.disableWebInstaller = false in your main process to keep downloading web installers. The advisory is informational only — it surfaces on the JSON/YAML and programmatic (JS/TS) paths and never rewrites the config (disableWebInstaller is an electron-updater runtime setting, not a build-config key).resources/package-type so nsis-web installs default disableWebInstaller to falseDetails
resources/package-type marker (nsis or nsis-web) at install time, mirroring the existing Linux package-type mechanism. electron-updater's NsisUpdater reads this marker and, for nsis-web installs, pre-seeds disableWebInstaller = false so web-installer auto-updates keep working without the app wiring the flag by hand.autoUpdater.disableWebInstaller = … set by the app still wins, and a plain nsis marker leaves the secure ?? true default (and the v27 grace-period warning) untouched. The marker is written by the installer script — the only build artifact that differs between nsis and nsis-web (the app payload is byte-identical, since both targets share one app archive). Only go-forward installs carry the marker; existing deployments are unaffected.ULMO (lzma-compressed) disk image format, macOS 10.15+Details
Authorization: Bearer. Previously a token was always sent as Basic auth using the repo owner as the username, so access tokens could not be used.electronDist or Electron mirror is configured, since it may still provide 32-bit builds. Use electronVersion <= 43.x to keep building 32-bit (supported until the v43 series reaches end-of-life in January 2027).Patch changes
snapcraft type declarations so SnapOptions.d.ts resolves for consumers.tar.7z snap template archives through both compression layers. Since 26.15.0, default-config snap builds packed the template's inner tar as a single file instead of its contents (desktop-init.sh etc.), producing snaps that built successfully but failed at launch. The toolset cache directory name for .tar.7z archives also changes, so caches poisoned by the broken extraction are automatically re-fetched after upgrading.electronLanguages uses bare language codes (e.g. en now keeps en-US.pak), refuse to delete every locale, and warn about entries that match nothingPublishManager so concurrent artifact uploads share one publisher instead of racing to create duplicate GitHub draft releaseselectron-updater 7.0.0-alpha.5
Major changes
disableWebInstaller to trueDetails
AppUpdater.disableWebInstaller now defaults to true. NSIS web-installer packages are no longer loaded unless you opt in, because their payload is fetched from a manifest-supplied URL that may not undergo signature verification.
disableWebInstaller (the default) and a web-installer update is received, the updater logs a deprecation warning and still downloads it. In v28 this becomes an error and the download is blocked (ERR_UPDATER_WEB_INSTALLER_DISABLED).disableWebInstaller = true, the download throws ERR_UPDATER_WEB_INSTALLER_DISABLED immediately.autoUpdater.disableWebInstaller = false in your main process.path/sha512 behind electronUpdaterCompatibilityDetails
UpdateInfo.path / UpdateInfo.sha512 fields are now written to latest*.yml only when the declared electronUpdaterCompatibility semver range intersects electron-updater versions <2.16.0 (previously they were written unconditionally), mirroring how the Windows sha2 field is gated; the legacy latest-mac.json is likewise emitted only when the range intersects <2.0.0. The default electronUpdaterCompatibility is now >=2.16 (previously >=2.15), so none of the legacy fields are emitted by default. Both fields are now optional on the UpdateInfo type. Modern clients (electron-updater >=2.16) read the files[] array and are unaffected. If you still ship apps that embed electron-updater 1.x – 2.15, set electronUpdaterCompatibility to a range that includes them (e.g. >=1.0.0) so the legacy descriptor keeps being emitted.quitAndInstall, and autoInstallEvent enumDetails
quitAndInstall now takes a single destructured options object instead of positional booleans, so v27 migrators discover the new deferred-install flag and can never swap arguments silently. Defaults are unchanged; there is no backward-compat shim.// Before (v26)
autoUpdater.quitAndInstall(true, false)
// After (v27)
autoUpdater.quitAndInstall({ isSilent: true, isForceRunAfter: false })
autoInstallOnAppQuit boolean is replaced by an autoInstallEvent: "manual" | "onQuit" | "onNextLaunch" enum (default "onQuit", which preserves prior behavior). There is no compat alias — a single boolean cannot express the three states.// Before (v26)
autoUpdater.autoInstallOnAppQuit = false
// After (v27)
autoUpdater.autoInstallEvent = "manual"
BaseUpdater so NSIS, AppImage, deb, rpm and pacman targets all inherit them:
powerMonitor shutdown on macOS/Linux, BrowserWindow session-end on Windows (windowless apps cannot be covered on Windows).autoInstallEvent: "onNextLaunch" (opt-in; default is "onQuit"): any app quit persists the downloaded update as pending instead of spawning the installer. On the next launch the updater re-validates the cached installer against freshly fetched update info (checksum, code signature on Windows, and an installable-change version check — newer, or a downgrade when allowDowngrade is set — as a loop guard) and installs it silently, restarting the app. A single quit can be deferred via the new quitAndInstall({ waitUntilNextLaunch: true }) option.installPendingUpdateIfAvailable() explicitly at a moment the app controls.autoInstallEvent: "onNextLaunch" is opt-in in v27 and is planned to become the DEFAULT in v28 to resolve this class of session-end corruption once and for all. macOS is unaffected: Squirrel.Mac natively stages downloaded updates and applies them on relaunch (there "onQuit" and "onNextLaunch" behave identically).Minor changes
resources/package-type so nsis-web installs default disableWebInstaller to falseDetails
resources/package-type marker (nsis or nsis-web) at install time, mirroring the existing Linux package-type mechanism. electron-updater's NsisUpdater reads this marker and, for nsis-web installs, pre-seeds disableWebInstaller = false so web-installer auto-updates keep working without the app wiring the flag by hand.autoUpdater.disableWebInstaller = … set by the app still wins, and a plain nsis marker leaves the secure ?? true default (and the v27 grace-period warning) untouched. The marker is written by the installer script — the only build artifact that differs between nsis and nsis-web (the app payload is byte-identical, since both targets share one app archive). Only go-forward installs carry the marker; existing deployments are unaffected.allowUnverifiedLinuxPackages to optionally enforce Linux package signature verificationDetails
AppUpdater.allowUnverifiedLinuxPackages. Because electron-builder does not sign Linux packages, this defaults to true, preserving the existing behavior: .deb/.rpm auto-updates install with the package manager's signature/GPG checks bypassed where a bypass flag exists (--allow-unauthenticated for the apt fallback, --allow-unsigned-rpm for zypper, --nogpgcheck for dnf/yum).autoUpdater.allowUnverifiedLinuxPackages = false. What this enforces depends on the package manager used on the target system:
.deb): no effect — dpkg performs no signature verification (a warning is logged); enforcing .deb signatures requires a debsig-verify/debsigs policy on the target system..deb fallback): --allow-unauthenticated is omitted.--setopt=localpkg_gpgcheck=1 (local package files are not GPG-checked by default).rpm -Uvh ... --nodeps fallback command is unchanged (--nodeps is a dependency-resolution bypass, not a signature bypass).allowUnverified parameter on DebUpdater.installWithCommandRunner / RpmUpdater.installWithCommandRunner is a trailing optional argument (default true), so existing callers remain source- and runtime-compatible.Patch changes
allowPrerelease=true but current version is stableDetails
allowPrerelease=true with no explicit channel and a stable current version now selects the newest valid semver release in the Atom feed (skipping unrelated non-semver tags such as other packages in a monorepo) instead of blindly taking the first feed entry (#9894).allowDowngrade) instead of throwing.allowPrerelease=false no longer throws ERR_UPDATER_NO_PUBLISHED_VERSIONS when the latest release tag (from /releases/latest) is absent from GitHub's truncated Atom feed; it proceeds with the resolved tag../.. path segments is rejected with ERR_UPDATER_INVALID_TAG.sha512 manifest values strictly and deprecate them for removal in v28Details
+, /, Z, or = characters) to decide whether a manifest sha512 was hex- or base64-encoded. It now uses a strict check: a value that is exactly 128 hexadecimal characters is treated as legacy hex; anything else is decoded as base64, which is what electron-builder has emitted since 19.x (2017). The two forms cannot collide — base64-encoded sha512 is always 88 characters ending in == — and a wrong pick can only fail closed with a checksum mismatch.sha512 values (from pre-19.x manifests or hand-rolled manifests built from raw sha512sum output) remain accepted in v27 but are deprecated: support will be removed in v28. Emit base64 instead, e.g. sha512sum file.ext | cut -d' ' -f1 | xxd -r -p | base64 -w0.sha2) update checksums are unchanged here — they remain accepted in v27 under the existing v28-removal grace period.27.0.0-alpha.5
electron-builder 27.0.0-alpha.5
Major changes
"latest" as the canonical "null"-state for every ToolsetConfig property, and make the toolset resolution logic resolve the unset state (undefined / null / "latest") to the newest available bundle for each toolset.name/ext ProgID must be updated)USE_SYSTEM_FPM env override; require an explicit custom toolset on WindowsDetails
USE_SYSTEM_FPM environment flag — the last of the USE_SYSTEM_* toolset overrides. To use a non-bundled fpm, configure toolsets.fpm with a custom toolset pointing at the directory containing the fpm executable, e.g. { url: "file:///opt/homebrew/bin" }.getFpmPath() and getOsslSigncodeBundle(), so an explicit override is respected on every platform (previously it was silently ignored on Windows).getFpmPath() now throws InvalidConfigurationError instead of resolving a bare fpm from $PATH, closing a binary-hijack vector (getOsslSigncodeBundle() throws as defense-in-depth on the same path)..obj) by adding an explicit files glob such as **/*.obj (fixes #6126). BREAKING: removed the disableDefaultIgnoredFiles option — electron-builder migrate-schema strips it automatically; re-include specific files via files globs instead.Minor changes
remote-build via buildFor: string[] — one Launchpad job now produces and registers multiple snap artifactsPatch changes
appOutDir mutation created elevate.exe race condition for concurrent builds that included Squirrel targetschemaValidator) and migrate-schema CLI output at itvPrefixedTagName from GitLab publish entries. The field is still supported on GitlabOptions (type, scheme, and runtime — gitlabPublisher honors it) and has no tagNamePrefix equivalent, so deleting it silently flipped GitLab release tags from 1.2.3 to v1.2.3. The migrator now leaves GitLab entries untouched and only converts GitHub vPrefixedTagName → tagNamePrefix.electron-updater 7.0.0-alpha.4
Patch changes
27.0.0-alpha.4
electron-builder 27.0.0-alpha.4
Major changes
linux.syncDesktopName — always sync the installed .desktop filenameMinor changes
executableArgs are applied consistently and the generated .desktop Exec key stays a plain commandmigrate-schema now auto-migrates programmatic JS/TS configsDetails
electron-builder migrate-schema previously printed manual steps for programmatic configs (.js/.cjs/.mjs/.ts). It now rewrites them in place via an AST-located text codemod that applies the same v26→v27 transforms as static configs while preserving comments, imports, functions, and formatting. Falls back to manual steps when typescript is not installed or the config cannot be statically reduced to a single object literal (dynamic function bodies, spreads, computed keys).Patch changes
$(...) LangString references in escaped NSIS define values (e.g. shortcutName: "$(customSN)")@esbuild/darwin-arm64)Details
package.json cpu/os constraints against the target arch/platform, so host-installed single-arch binaries are no longer copied into mismatched single-arch builds. For universal macOS builds, both slices are kept symmetric and any single-arch binary that can't be lipo-merged — including host binaries inside packages that declare no cpu/os (such as esbuild's bin/esbuild) — is automatically reported to @electron/universal via singleArchFiles (merged with mac.universal.singleArchFiles), with a warning listing them. This fixes builds aborting with Detected file "…" that's the same in both x64 and arm64 builds and not covered by the x64ArchFiles rule (#9865, #9399).Details
he_IL to bundledLanguages so Hebrew strings actually reach the built installer (fixes a pre-existing bug where Hebrew was never included in the default multi-language set).electron-updater 7.0.0-alpha.3
Minor changes
27.0.0-alpha.3
electron-builder 27.0.0-alpha.3
Major changes
electron/____ dep updateswin.sign key [HSM, PKCS#11, Azure Trusted Signing, Signtool] (BREAKING)USE_SYSTEM_WINE process.env override removed - use CustomToolset insteadMinor changes
ensureDir to address recurring flaky ENOENT … mkdir '<cache>/fpm@2.2.1/…' during concurrent toolset downloadsPatch changes
electron-publish dependency on electron-builder, and switch type-checking to nodenext module resolution so the compiler models Node's real ESM loaderlink: packagesexecutableArgs/forceX11 flags containing = or quotes build correctly, and the unused chrome-sandbox helper is removed automatically when launching with --no-sandboxzip and 7z archive targets on macOS and Linux via 7za -snl (Windows still dereferences). Restores pre-26.15 behavior after the bundled 7-Zip upgrade, which began dereferencing by default — corrupting macOS .framework bundles (codesign "bundle format is ambiguous", breaking Squirrel.Mac auto-update) and duplicating Linux symlink content.electron-updater 7.0.0-alpha.2
Patch changes
electron-publish dependency on electron-builder, and switch type-checking to nodenext module resolution so the compiler models Node's real ESM loader27.0.0-alpha.2
electron-builder 27.0.0-alpha.2
Patch changes
sax, which, mime)electron-updater 7.0.0-alpha.1
Patch changes
sax, which, mime)27.0.0-alpha.1
electron-builder 27.0.0-alpha.1
Patch changes
plist and chromium-pickle-js imports. Add additional messaging to migrate-schema stdout27.0.0-alpha.0
electron-builder 27.0.0-alpha.0
Major changes
downloadBuilderToolset.ToolsetCustom for user-supplied bundles; remove env-var toolset overrides; split toolset modules into single-purpose files; deprecate PlatformPackager.infonativeModules sub-key (BREAKING)snap config property and all remaining deprecated APIs. Hard-deletes 14 deprecated features accumulated across the codebase. No migration shims remain. (BREAKING)Details
--publish CLI flag (e.g., --publish always, --publish onTag) or by setting the publish option in your configuration.asar?: AsarOptions | false | null (BREAKING)Minor changes
migrate-schema command for v26 → v27 config migrationPatch changes
validateShellEmbeddable to builder-util/envUtil; consolidate all boolean env-var flags into flags.ts.electron-updater 7.0.0-alpha.0
Major changes
snap config property and all remaining deprecated APIs. Hard-deletes 14 deprecated features accumulated across the codebase. No migration shims remain. (BREAKING)Patch changes
26.17.0
electron-builder 26.17.0
Minor changes
differentialPackage: "store-asar" — store resources/app.asar uncompressed (7-Zip Copy) in the differential-aware app package so a small app-code change costs a proportionally small differential download instead of re-downloading the entire recompressed asar (measured on a ~32 MB asar: 0.2% instead of 100% for a one-line change). nsis.differentialPackage is widened to boolean | "compressed" | "store-asar": false disables differential support as before, "store-asar" opts into the stored asar, and everything else (true, "compressed", unset) keeps today's fully compressed differential package. Backed by a generic ArchiveOptions.storedPaths in archive().Patch changes
pnpm-workspace.yaml instead of running pnpm --workspace-root exec pwd. pwd is POSIX-only, so on Windows the root silently resolved to undefined, @electron/rebuild searched only the app directory, and cross-architecture builds (e.g. --x64 --arm64) shipped transitive native modules such as keytar for the wrong architecture. When a workspace root is located but the package manager cannot be re-detected there, the located root is now kept and a warning is logged instead of dropping it.pnpm list --json output by their declared range. Since pnpm 10.29.3 a repeated subtree is printed once and every later occurrence is a childless entry flagged deduped: true; the node-module collector recovered such an entry's dependencies by package name only, so when two versions of one package were installed the nested, version-conflicted copy was wired to the wrong version and its whole closure vanished from the packaged node_modules (the #8493 regression, e.g. es5-ext@0.10.64 with esniff, event-emitter and next-tick@1.1.0 dropped while the app pins es5-ext@0.10.53). The collector now resolves an omitted dependency against the dependent's declared range from its real store directory and takes the exact name@version entry, keeping the name-only match only as a fallback for link: dependencies, so version-conflicted transitive dependencies are no longer dropped with pnpm >= 10.29.3, 11 and 12.pkg installers. macOS 26's Installer probes the current-user-home install domain while parsing the deprecated <domains> element — even when that domain is disabled — which makes Installer.app request kTCCServiceSystemPolicyAppData as soon as the user leaves the Introduction pane. rootVolumeOnly="true" is now added to <options> when both allowAnywhere and allowCurrentUserHome are false; the install domains reported by installer -volinfo / -dominfo are unchanged, and <domains> is still emitted verbatim.linux.files globs from leaking into the flatpak files list. getOptionsForTarget's deepAssign concatenated linux.files onto flatpak.files, and @malept/flatpak-bundler then crashed destructuring each glob string as a [src, dest] tuple (ENOENT: no such file or directory, stat '<project-root>/*'); FlatpakTarget now takes files from the flatpak config only.flatpak.files from the flatpak config directly so that a single-string or FileSet linux.files no longer throws in FlatpakTargetnode-linker=hoisted by detecting the hoisted layout from disk and preferring an in-range copy over an out-of-range override, including when the app is a package in a hoisted pnpm workspace with no node_modules of its own (#10228)electron-updater 6.8.10
Patch changes
current.blockmap instead of leaving a stale one next to the freshly cached file, which poisoned the next differential download and surfaced as a generic sha512 checksum mismatch before falling back to a full download (#10097). Leftover pending blockmaps from previous update rounds are also cleared before a fresh download. sha512-mismatch logging now distinguishes a differential download that failed against stale/corrupt cached inputs (including whether the old blockmap came from the local cache or the server) from a genuine checksum failure of a fully downloaded file.downloadUpdate fall back to a full download with Response ends without calling any handlers:Details
DataSplitter only recognised CRLF. Some CDNs answer multipart/byteranges with bare LF line endings, so no part was ever split and the whole response accumulated in memory. Header lists now end at whichever of \r\n\r\n / \n\n comes first, and the <EOL>--boundary separator size follows the line ending the server actually uses.26.16.1
electron-builder 26.16.1
Patch changes
appOutDir mutation created elevate.exe race condition for concurrent builds that included Squirrel targetsecurity set-key-partition-list -k instead of the certificate's import password. The import password is only valid for security import -P; set-key-partition-list authenticates against the keychain itself, so on macOS versions that verify the password, CSC_LINK-based signing failed with SecKeychainUnlock: The user name or passphrase you entered is not correct (see #10066).LICENSE.electron.txt and Chromium's LICENSES.chromium.html in the macOS .app bundle (Contents/Resources) instead of dropping them outside the bundle, matching the license files already shipped on Windows and Linux (#9407)libsql@0.3.19 via @prisma/adapter-libsql -> @libsql/client), which caused npm-based builds to hang at searching for node modules and eventually crash with a JavaScript heap out-of-memory error (#10068)26.16.0
electron-builder 26.16.0
Minor changes
allowMissingDependencies?: boolean | string[] | null configuration (issue #10058). When node-module collection completes and a production dependency could not be resolved (cannot find path for dependency / dependency not found on disk), the option controls whether the build fails: true or omitted (the v26 default) keeps today's warn-only behavior, false/null fails the build with an error listing the complete set of missing dependencies, and a string[] allows only the listed dependency names to be missing (bare package name, or exact name@version) while any other missing production dependency fails. Missing optional dependencies (e.g. fsevents on Linux/Windows) are always allowed. Note: electron-builder 27+ flips the default to false (fail-closed); the stable 26.x line keeps warn-only by default to avoid breaking existing builds.Patch changes
SHASUMS256.txt-<version> at the Electron cache root and passing it to @electron/get as inline checksums, suppressing the mandatory network fetch of SHASUMS256.txt that failed air-gapped builds even with a fully seeded cache. Also recognise a user-provided electronDownload.checksums so it is forwarded instead of silently dropped (#10039)customNsisBinary/customNsisResources configs using the historically documented base64 SHA-512 checksums failed on 26.15.x with Could not parse checksum file at line 1 because the checksum was forwarded to @electron/get, whose sumchecker only understands SHA-256 hex. Base64 SHA-512 checksums are now verified by electron-builder itself after the download (and on archive-cache hits); SHA-256 hex checksums keep being verified by @electron/get. Unrecognized or mixed checksum formats now fail fast with a clear configuration error instead of a mid-download parse error.Zoo Design Studio (Staging) failed AppImage builds with "productFilename contains characters that cannot be safely used in file paths" — a regression from the Go pipeline, which accepted them. After, names containing ( and ) build again; parentheses are legal in Linux filenames and inert inside the double-quoted bash strings of the generated AppRun launcher, while genuinely dangerous characters ($, backticks, quotes, slashes) remain rejected.fsevents on Linux/Windows) as missing optional dependencies in the pnpm collector, instead of warning dependency not found on diskafterSign hook for mas/mas-dev builds again. The MAS flow packs with sign: false and codesigns separately, which skipped the only emitAfterSign call site — the hook now fires after codesigning and before the installer .pkg is created, and the standard "skipping afterSign" warning is logged when signing does not occur (#9997)ERR_REQUIRE_ESM when generating blockmaps on Node < 20.19 by pinning @noble/hashes to the dual CJS/ESM v1.8 and importing its blake2b.js entry.26.15.7
electron-builder 26.15.7
Patch changes
.tar.7z snap template archives through both compression layers. Since 26.15.0, default-config snap builds packed the template's inner tar as a single file instead of its contents (desktop-init.sh etc.), producing snaps that built successfully but failed at launch. The toolset cache directory name for .tar.7z archives also changes, so caches poisoned by the broken extraction are automatically re-fetched after upgrading.electronLanguages uses bare language codes (e.g. en now keeps en-US.pak), refuse to delete every locale, and warn about entries that match nothing26.15.6
electron-builder 26.15.6
Patch changes
26.15.5
electron-builder 26.15.5
Patch changes
executableArgs/forceX11 flags containing = or quotes build correctly, and the unused chrome-sandbox helper is removed automatically when launching with --no-sandbox26.15.4
electron-builder 26.15.4
Patch changes
$(...) LangString references in escaped NSIS define values (e.g. shortcutName: "$(customSN)")executableArgs verbatim into the .desktop Exec line so packaged apps (deb/rpm) still appear in the application menuzip and 7z archive targets on macOS and Linux via 7za -snl (Windows still dereferences). Restores pre-26.15 behavior after the bundled 7-Zip upgrade, which began dereferencing by default — corrupting macOS .framework bundles (codesign "bundle format is ambiguous", breaking Squirrel.Mac auto-update) and duplicating Linux symlink content.26.15.3
electron-builder 26.15.3
Patch changes
26.15.2
electron-builder 26.15.2
Patch changes
zip for macOS zip target to preserve .framework symlinks and fix Squirrel.Mac auto-update validation26.15.1
electron-builder 26.15.1
Patch changes
ci:validate lint fixes, ci:test:fetch-cache simplification, and code cleanup@electron/rebuild package to latest ^4.0.426.15.0
electron-builder 26.15.0
Minor changes
node-dep-tree and rebuild-node-modules with pure-TS equivalents; nativeRebuilder: "legacy" now routes to @electron/rebuild sequential mode-EncodedCommand on Windows to eliminate shell injection vectors and the Node DEP0190 deprecation warningproton-native command with pure-TS equivalents; Node.js and LaunchUI binaries are now downloaded via downloadBuilderToolset; config.launchUiVersion string is now respectedsnap and wine commands with pure-TS equivalents; executeAppBuilder and app-builder-bin package fully removed from codebase; snap templates now downloaded via downloadBuilderToolset with pinned checksums; Wine is downloaded automatically on macOS (legacy 4.0.1 bundle by default, Wine 11 bundle available via toolsets.wine: "1.0.1"); on Linux with legacy config and when USE_SYSTEM_WINE=true, system wine is used insteadlinux.syncDesktopName opt-in flag to align installed .desktop filename with desktopName and StartupWMClass; will become default in v27Patch changes
--version to pkgbuildelectron-updater 6.8.9
Minor changes
node-dep-tree and rebuild-node-modules with pure-TS equivalents; nativeRebuilder: "legacy" now routes to @electron/rebuild sequential modePatch changes
26.14.0
electron-builder 26.14.0
Minor changes
dmg-license post-processing with dmgbuild-native license embedding; removes deprecated hdiutil udifrez dependencyPatch changes
nodeLinker: hoistedspawnAndWriteWithOutput26.13.1
electron-builder 26.13.1
Patch changes
update-alternatives --remove path and unload AppArmor profile on removalgetToolPath() on WindowsSignToolManager and improve public APInpm list stderr from user-visible warnings when collecting dependencies for Yarn projects using resolutions26.13.0
electron-builder 26.13.0
Minor changes
disableAsarIntegrity config option to skip ASAR integrity computationcertificate-info, ksuid, get-bucket-location, publish-s3)Patch changes
electron/____ npm packages that are ESM-onlyappPackageUrl: stop appending arch macro to paths with explicit URLs@electron/get's non-atomic putFileInCache (remove + move) from racing with a concurrent reader.desktopName from package.json for StartupWMClass in Linux desktop entrieselectron-updater 6.8.8
Patch changes
26.12.1
electron-builder 26.12.1
Patch changes
mas configs to overwrite mac config when target is mas or mas-devnsisEscapeString incorrectly converting INSTDIR runtime var to double-$$electron-updater 6.8.7
Patch changes
26.12.0
electron-builder 26.12.0
Minor changes
linux-tools-mac toolset with v1.0.0 for macOS deb/tar builds for packaging or extracting Linux archivessnapcraft to maintain backward compatibilitynsis toolset configuration for makensisPatch changes
system OR path is system32electronLanguages option is not correctly applied for Mac platform26.11.1
electron-builder 26.11.1
Patch changes
electron/get to avoid env var overrideselectron/get's internal got downloader to respect http(s) proxies26.11.0
electron-builder 26.11.0
Minor changes
resedit npm package from app-builder-bin's usage of rcedit.exePatch changes
extraFiles to productFilename .app instead of Electron.appelectron-updater 6.8.6
Patch changes
26.10.0
electron-builder 26.10.0
Minor changes
electronDownload to use electron/get official package. provides much better support for mirrorsPatch changes
26.9.1
electron-builder 26.9.1
Patch changes
version --> path within pnpm virtual storeelectron-updater 6.8.5
Patch changes
26.9.0
electron-builder 26.9.0
Minor changes
releaseBody and releaseName optionsPatch changes
Details
electron-updater 6.8.4
Minor changes
releaseBody and releaseName options26.8.2
electron-builder 26.8.2
Patch changes
26.8.1
electron-builder 26.8.1
Patch changes
from to not mislabel package-version stringsnotice LogLevel26.8.0
electron-builder 26.8.0
Minor changes
electron-builder-binariesPatch changes
link: support for package detection to mirror current file: parsingelectron-updater 6.8.3
Patch changes
26.7.0
electron-builder 26.7.0
Minor changes
size and shrink options to DmgOptions for explicit DMG filesystem size controlcapabilities to AppxOptions (#9436)Patch changes
tar againstdio redirects in update-alternative invocation_dependencies property against any duplicated dependencies. (npm collector also covers yarn berry)electron-updater 6.8.2
Patch changes
26.6.0
electron-builder 26.6.0
Minor changes
executableArgsPatch changes
dmgbuild and migrate to portable dmgbuild python bundle. Fixes badge-icon property26.5.0
electron-builder 26.5.0
Minor changes
Patch changes
eslint --fix on more fileselectron-updater 6.8.1
Patch changes
eslint --fix on more files26.4.1
electron-builder 26.4.1
Patch changes
dmgbuild hex regex for backgroundColor to be case insensitiveelectron-updater 6.8.0
Minor changes
26.4.0
electron-builder 26.4.0
Minor changes
Patch changes
npm list to work on yarn berry and bun project setupsurl.URL26.3.6
electron-builder 26.3.6
Patch changes
26.3.5
electron-builder 26.3.5
Patch changes
electron-updater 6.7.3
Patch changes
26.3.4
electron-builder 26.3.4
Patch changes
projectRoot instead of workspaceRoot for yarn_berry package manager26.3.3
electron-builder 26.3.3
Patch changes
26.3.2
electron-builder 26.3.2
Patch changes
26.3.1
electron-builder 26.3.1
Patch changes
yarn config --json to parse yarn berry (output varies v2-4)command -v instead of which for pythoninstall-app-deps missing workspaceRoot for passing projectRootPath into electron/rebuild26.3.0
electron-builder 26.3.0
Minor changes
signExts as signing overridescorepack and packageManager field and add related unit testsPatch changes
undefined cert password with empty string fallbackelectron-updater 6.7.2
Patch changes
26.2.0
electron-builder 26.2.0
Minor changes
ELECTRON_BUILDER_NSIS_RESOURCES_DIRPatch changes
electron-updater 6.7.1
Patch changes
26.1.0
electron-builder 26.1.0
Minor changes
${arch} macro properly for mac.binaries in case of native node packages for unpacked files for macos universal targetPatch changes
await import and require that is then copied into the final npm packageelectron-updater 6.7.0
Minor changes
Patch changes
26.0.20
electron-builder 26.0.20
Minor changes
Details
api.github.com to release-assets.githubusercontent.com (Azure backend) or other cloud storage services that don't accept GitHub tokens.Patch changes
PublishPolicy in publish commandtagNamePrefix option and deprecate vPrefixedTagNamecustomCheckAppRunning is definedelectron-updater 6.6.8
Minor changes
Details
api.github.com to release-assets.githubusercontent.com (Azure backend) or other cloud storage services that don't accept GitHub tokens.Patch changes
tagNamePrefix option and deprecate vPrefixedTagName26.0.19
electron-builder 26.0.19
Patch changes
shell: true from node_modules collector so as to prevent shell console logging from malforming the json outputelectron-updater 6.6.7
Patch changes
shell: true from node_modules collector so as to prevent shell console logging from malforming the json output26.0.18
electron-builder 26.0.18
Patch changes
electron-updater 6.6.6
Patch changes
26.0.17
electron-builder 26.0.17
Patch changes
which packagegetBin to accept a different repo as a download source (useful for testing)26.0.16
electron-builder 26.0.16
Patch changes
is-ci with ci-infoelectron-updater 6.6.5
Patch changes
26.0.15
electron-builder 26.0.15
Patch changes
electron-updater 6.6.4
Patch changes
26.0.14
electron-builder 26.0.14
Patch changes
electron/asar for constructing asar package26.0.13
electron-builder 26.0.13
Patch changes
Files param when using Azure Trusted Signingconcurrency config propelectron-updater 6.6.3
Patch changes
26.0.12
electron-builder 26.0.12
Patch changes
mas packages for flipping fusesSquirrelWindowsOptions26.0.11
electron-builder 26.0.11
Patch changes
after-install.tpl: Detect if apparmor is enabled instead of just file-exists checkelectron-updater 6.6.2
Patch changes
CancellationToken, PackageFileInfo, ProgressInfo, UpdateFileInfo, UpdateInfo from electron-updater26.0.10
electron-builder 26.0.10
Patch changes
electron-updater 6.6.1
Patch changes
26.0.9
electron-builder 26.0.9
Patch changes
node-linker=hoisted fallback to utilize Npm module collector--frozen-lockfile (yarn, pnpm) and ci (npm)26.0.8
electron-builder 26.0.8
Patch changes
DependencyTree, update types to be generic and respective to npm list vs pnpm list dependency trees26.0.7
electron-builder 26.0.7
Patch changes
electron-updater 6.6.0
Minor changes
spawnSyncLog fails26.0.6
electron-builder 26.0.6
Patch changes
26.0.5
electron-builder 26.0.5
Patch changes
26.0.4
electron-builder 26.0.4
Patch changes
26.0.3
electron-builder 26.0.3
Patch changes
26.0.2
electron-builder 26.0.2
Patch changes
.pkg) for macos archiveselectron-updater 6.5.0
Minor changes
isUpdateAvailable property to checkForUpdates resultisUpdateSupported hook for validating UpdateInfo, with fallback to previous minimumSystemVersion logic26.0.1
electron-builder 26.0.1
Patch changes
undefined | null to reuse current (unexported) type Nullish. Expose FileMatcher instead of @internal flagObjectMap => Record for non-external properties (i.e. things that don't get processed for scheme.json)tiny-async-pool for setting concurrency limitelectron-updater 6.4.1
Patch changes
undefined | null to reuse current (unexported) type Nullish. Expose FileMatcher instead of @internal flagObjectMap => Record for non-external properties (i.e. things that don't get processed for scheme.json)26.0.0
electron-builder 26.0.0
Major changes
[Desktop Actions <actionName>]. Requires changing configuration desktop property to object to be more extensible in the futurewinOptions and macOptionsDetails
winOptions signing configuration, it has been moved to win.signtoolOptions in order to support azureOptions as a separate field and avoid bloating win configuration object
For macOptions, notarize options has been deprecated in favor of env vars for quite some time. Env vars are much more securefocal to jammy. This also forces upgrading python->python3 package and wine-stableMinor changes
electronDist to be an electron-builder Hookelectron/asar packaginghost property to support self-hosted Keygen instancesforcePathStyle option to S3Optionspwsh detection to enable azure trusted signing within docker imagePatch changes
publisherName field to Azure Trusted Signingextend-info in electronMac plist creationvmRequired variable to useVmIfNotOnWinelectron-updater 6.4.0
Minor changes
autoRunAppAfterInstall on mac updaterhost property to support self-hosted Keygen instancesforcePathStyle option to S3OptionsPatch changes
disableDifferentialDownload flag for AppImage26.0.0-alpha.11
electron-builder 26.0.0-alpha.11
Patch changes
electron-updater 6.4.0-alpha.4
Patch changes
26.0.0-alpha.10
electron-builder 26.0.0-alpha.10
Major changes
focal to jammy. This also forces upgrading python->python3 package and wine-stableMinor changes
pwsh detection to enable azure trusted signing within docker imagePatch changes
26.0.0-alpha.9
electron-builder 26.0.0-alpha.9
Major changes
winOptions and macOptionsDetails
winOptions signing configuration, it has been moved to win.signtoolOptions in order to support azureOptions as a separate field and avoid bloating win configuration object
For macOptions, notarize options has been deprecated in favor of env vars for quite some time. Env vars are much more secureMinor changes
Patch changes
electron-updater 6.4.0-alpha.3
Patch changes
disableDifferentialDownload flag for AppImage26.0.0-alpha.8
electron-builder 26.0.0-alpha.8
Minor changes
host property to support self-hosted Keygen instancesforcePathStyle option to S3OptionsPatch changes
extend-info in electronMac plist creationvmRequired variable to useVmIfNotOnWinelectron-updater 6.4.0-alpha.2
Minor changes
host property to support self-hosted Keygen instancesforcePathStyle option to S3Options26.0.0-alpha.7
electron-builder 26.0.0-alpha.7
Patch changes
26.0.0-alpha.6
electron-builder 26.0.0-alpha.6
Minor changes
Patch changes
26.0.0-alpha.5
electron-builder 26.0.0-alpha.5
Patch changes
publisherName field to Azure Trusted Signing26.0.0-alpha.4
electron-builder 26.0.0-alpha.4
Patch changes
electron-updater 6.4.0-alpha.1
Minor changes
autoRunAppAfterInstall on mac updaterPatch changes
26.0.0-alpha.3
electron-builder 26.0.0-alpha.3
Patch changes
26.0.0-alpha.2
electron-builder 26.0.0-alpha.2
Minor changes
electron/asar packaging26.0.0-alpha.1
electron-builder 26.0.0-alpha.1
Patch changes
26.0.0-alpha.0
electron-builder 26.0.0-alpha.0
Major changes
[Desktop Actions <actionName>]. Requires changing configuration desktop property to object to be more extensible in the futureMinor changes
electronDist to be an electron-builder HookPatch changes
electron-updater 6.4.0-alpha.0
Minor changes
25.1.8
electron-builder 25.1.8
Patch changes
25.1.7
electron-builder 25.1.7
Patch changes
electron-updater 6.3.9
Patch changes
25.1.6
electron-builder 25.1.6
Patch changes
CodeSigningAccountName as required prop in Azure Signing Options25.1.5
electron-builder 25.1.5
Patch changes
electron-updater 6.3.8
Patch changes
25.1.4
electron-builder 25.1.4
Patch changes
applicationId if provided before falling back to identityName or app name25.1.3
electron-builder 25.1.3
Patch changes
electron-updater 6.3.7
Patch changes
25.1.2
electron-builder 25.1.2
Patch changes
electron-updater 6.3.6
Patch changes
25.1.0
electron-builder 25.1.0
Minor changes
Patch changes
.mjs filter25.0.6
electron-builder 25.0.6
Patch changes
electron-updater 6.3.5
Patch changes
25.0.5
electron-builder 25.0.5
Minor changes
riscv64 support via custom electron distPatch changes
electron-updater 6.3.4
Patch changes
25.0.4
electron-builder 25.0.4
Patch changes
electron-updater 6.3.3
Patch changes
artifactName.25.0.3
electron-builder 25.0.3
Patch changes
electron-updater 6.3.2
Patch changes
25.0.2
electron-builder 25.0.2
Patch changes
electron-updater 6.3.1
Patch changes
25.0.1
electron-builder 25.0.1
Patch changes
disablePreGypCopy: true to handle mac universal builds (fixes #8347)25.0.0
electron-builder 25.0.0
Minor changes
nativeRebuilder default: legacy to support Yarn 3 (modes: parallel or sequential)additionalLightArgs for msi targetMinVersion and MaxVersionTested fields in appx manifestAPPLE_TEAM_ID env var when using notarizing with APPLE_ID.Details
altool) notarization API.afterExtract hook to build process with the same payload interface as beforePack and afterPackadditionalArguments parameterPatch changes
electron/osx-sign.minimumSystemVersion in electron updaterdisableSanityCheckPackage to within checkFileInPackage to not bypass non-asar usagepnpm publish cmd line arg to force next tagidentityName validation for windows 10electron-updater 6.3.0
Minor changes
Patch changes
minimumSystemVersion in electron updater24.13.3
electron-builder 24.13.3
Patch changes
electron-updater 6.2.0
Minor changes
24.13.2
electron-builder 24.13.2
Patch changes
notarize is explicitly falsepathToFileUrl for hooks for Windows ES module supportBundlePreInstallScriptPath and/or BundlePostInstallScriptPath when a pre/postinstall script is provided to pkg installer24.13.1
electron-builder 24.13.1
Patch changes
electron-updater 6.1.9
Patch changes
PSModulePath24.13.0
electron-builder 24.13.0
Minor changes
onNodeModuleFile to return a boolean to force include the package to be copiedPatch changes
fileAssociations with existing CFBundleDocumentTypes if defined in mac.extendInfotype=module, if fail, fallback to default require24.12.0
electron-builder 24.12.0
Minor changes
Patch changes
24.11.0
electron-builder 24.11.0
Minor changes
Patch changes
electron-updater 6.1.8
Patch changes
24.10.0
electron-builder 24.10.0
Minor changes
import() when package.json is set to type module.Patch changes
-debug to hdiutil detach for when it fails and attempts a force detach24.9.4
electron-builder 24.9.4
Patch changes
msi-wrapped targetresultOutputPath from CustomWindowsSignTaskConfiguration (fixes: #7910)test.js in compiled asar to allow testing mechanisms like Playwright7zip-bin to builder-util-runtime so as to execute chmod logic always24.9.3
electron-builder 24.9.3
Patch changes
24.9.2
electron-builder 24.9.2
Patch changes
24.9.1
electron-builder 24.9.1
Patch changes
24.9.0
electron-builder 24.9.0
Minor changes
Patch changes
24.8.1
electron-builder 24.8.1
Patch changes
electron-updater 6.1.7
Patch changes
24.8.0
electron-builder 24.8.0
Minor changes
Patch changes
& properlyelectron-updater 6.1.6
Patch changes
24.7.0
electron-builder 24.7.0
Minor changes
Patch changes
NotarizeNotaryOptions and NotarizeLegacyOptions to explicitly define required vars24.6.5
electron-builder 24.6.5
Patch changes
electron-updater 6.1.5
Patch changes
24.6.4
electron-builder 24.6.4
Patch changes
afterAllArtifactBuildIMAGE_VERSION arg for docker node image so that it force rebuilds when pnpm is updated on any date24.6.3
electron-builder 24.6.3
Patch changes
24.6.2
electron-builder 24.6.2
Patch changes
createLazyProductionDeps that was missed during revertelectron-updater 6.1.4
Patch changes
isCustomChannel in GitHubProvider.ts24.6.1
electron-builder 24.6.1
Patch changes
24.6.0
electron-builder 24.6.0
Minor changes
Patch changes
24.5.2
electron-builder 24.5.2
Patch changes
"pacman" and "rpm" targetelectron-updater 6.1.3
Patch changes
app.relaunch() if isForceRunAfter = true for (beta) deb and rpm updaters24.5.1
electron-builder 24.5.1
Patch changes
hash instead of name if it existselectron-updater 6.1.2
Patch changes
24.5.0
electron-builder 24.5.0
Minor changes
Patch changes
electron-updater 6.1.1
Patch changes
update.${fileExtension} for downloaded files in private repositories.24.4.0
electron-builder 24.4.0
Minor changes
Patch changes
24.3.0
electron-builder 24.3.0
Minor changes
Patch changes
@electron/rebuildelectron-updater 6.1.0
Minor changes
Patch changes
24.2.1
electron-builder 24.2.1
Patch changes
update-alternatives when available.Details
What is changing?
update-alternatives in DEB based installations and use this whenever possible.
In this way, middleware and downstream projects and users can specify binaries of their
own priority that would override this programs' configured executable.Why is this changing?
How should this be consumed?
@electron/rebuild to version ^3.2.11 and account for the new folder structure of the package.electron-updater 6.0.4
Patch changes
24.2.0
electron-builder 24.2.0
Minor changes
electronLanguages to global config to support win/linuxelectron-updater 6.0.3
Patch changes
24.1.3
electron-builder 24.1.3
Patch changes
disablePreGypCopy functionality in new electron/rebuild integration24.1.2
electron-builder 24.1.2
Patch changes
electron-updater 6.0.2
Patch changes
24.1.1
electron-builder 24.1.1
Patch changes
24.1.0
electron-builder 24.1.0
Minor changes
downloadAlternateFFmpeg option to download non-proprietary ffmpeg libraryPatch changes
aarch64 in nameoptionsForFile for entitlements24.0.0
electron-builder 24.0.0
Major changes
linux executableArgs option to be utilized for Snap targetafterSign hook only when signing is completed, otherwise skipafterSign hook only when signing is complete (i.e. if the signing step wasn't explicitly skipped) (BREAKING)Minor changes
Patch changes
pnpm audit with dependency overrides--identifier to mac pkg build to address issue #7348identity: null is explicitly passeddefaultArch configGYP_MSVS_VERSION for multi-arch builds before beforePackdoSign exits early from macPackager and winPackager. Updated function definition to return Promise<boolean> to properly flag intellisenseelectron-updater 6.0.0
Major changes
electron-updater cache directory on macOSMinor changes
Patch changes
pnpm audit with dependency overridesverifySignature function