Skip to main content

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.

27.0.0-alpha.12​

electron-builder 27.0.0-alpha.12

Major changes

  • Feat!: add 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"] }.
  • Feat(s3)!: explicit AWS credential sources for S3 publishing via the new 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.
    • Resolved credentials are reused for every file of a publish instead of being resolved again per upload.

    BREAKING CHANGE: S3 publishing fails with an InvalidConfigurationError unless 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.

  • Feat(signing)!: fail the build when the signing key isn't in updateManifest.publicKey
    Details

    BREAKING CHANGE: when 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.

  • Feat(signing)!: 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

  • Fix(forge): make the electron-forge-maker-* packages loadable by Electron Forge 6+ (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 works
  • Feat(mac): APPLE_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.
  • Feat(mac): embed the Electron 41+ ASAR integrity digest into the Electron Framework (signed again ad hoc afterwards), so with the 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)
  • Feat(mac): add a 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

  • Fix: deduplicate publish tasks by value
  • Fix: enforce the configured API redirect limit without an extra hop
  • Fix(publish): detect aborted S3 responses via close instead of the deprecated aborted event, and report non-http(s) or unparseable S3 endpoints as configuration errors
  • Fix(signing): a base64 CSC_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.
  • Fix: cancel GitHub upload retry delays
  • Fix: only replace terminal platform icon extensions
  • Fix: cancel original async tasks in AsyncTaskManager
  • Fix(mac): keep an explicit 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.
  • Fix(nsis): pin the LZMA2 block size of differential-aware packages so their bytes no longer depend on the build host's thread count. On hosts with fewer than 4 threads (such as 2-CPU GitHub runners), 7-Zip wrote one solid stream, so most of the package changed every release and differential updates downloaded nearly the whole package. Output on 4+ thread hosts is unchanged.
  • Fix(win): with win.sign: false or null, no certificate is read from CSC_LINK / WIN_CSC_LINK, and app-update.yml carries no derived publisherName
  • Refactor(win): export the Windows Authenticode helpers electron-updater verifies update signatures with (preparePowerShellExec, escapePowerShellSingleQuotes, parseAuthenticodeSignatureOutput, matchPublisherName), moved unchanged from electron-updater so electron-builder can check signed installers with the same code
  • Fix(win): fail the build when the signed NSIS installer (or nsis-web stub) is not signed by a certificate matching the publisherName that electron-updater verifies updates against
  • Fix(deps): bump the @aws-sdk credential providers to drop the vulnerable fast-xml-parser 5.2.5, and reject aws login (login_session) profiles for awsCredentials.source: "profile"
  • Fix(win): sign .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.
  • Fix(nsis): pressing Tab while a one-click installer shows its progress banner no longer makes the installer stop responding; keyboard focus now moves from the hidden install page to the banner's status text, which screen readers also announce
  • Fix: preserve complete XML text and reject incomplete documents
  • Fix: report finite transfer rates for immediate downloads
  • Fix(win): rename Electron's electron_wer.dll Windows Error Reporting helper together with the executable for Electron 45 and later, so fail-fast crashes are captured in packaged apps
  • Fix(win): update the default winCodeSign 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_MODULES

electron-updater 7.0.0-alpha.11

Minor changes

  • Feat(s3)!: explicit AWS credential sources for S3 publishing via the new 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.
    • Resolved credentials are reused for every file of a publish instead of being resolved again per upload.

    BREAKING CHANGE: S3 publishing fails with an InvalidConfigurationError unless 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

  • Fix: enforce the configured API redirect limit without an extra hop
  • Refactor(updater): split GitHubProvider.getLatestVersion into helpers (internal refactor, no behavior change)
  • Fix: close embedded blockmap files exactly once on parse failures
  • Fix(nsis): don't plan a differential download against a cached block map of another release. The cached block map is replaced when a download finishes, but the cached installer only when the update is installed, so a release found before the previous one was installed was planned against the wrong base: every differential byte was downloaded, the sha512 check failed, and the full installer was downloaded too. A cached block map that does not end at the cached installer's size is now ignored and the installed version's block map is fetched from the server.
  • Fix(updater): treat channel "latest" as stable-only when allowPrerelease is enabled
  • Fix(updater): download differentially when the update manifest has a hex-encoded sha512, never let a throwing logger stop a differential download or its fallback to a full download, time out stalled requests made with Electron's net module, and close the partially written file when a download's response fails or is aborted mid-body
  • Refactor(win): export the Windows Authenticode helpers electron-updater verifies update signatures with (preparePowerShellExec, escapePowerShellSingleQuotes, parseAuthenticodeSignatureOutput, matchPublisherName), moved unchanged from electron-updater so electron-builder can check signed installers with the same code
  • Refactor(win): verify update signatures with the Authenticode helpers moved unchanged to builder-util-runtime (no behavior change)
  • Fix: preserve complete XML text and reject incomplete documents
  • Fix: report finite transfer rates for immediate downloads
  • Fix: when a server rejects multi-range requests (GitHub release assets answer 501, Google Cloud Storage 400, S3 the whole file with 200), retry the differential download with one range per request instead of downloading the full update. Every range response must now be a 206 for exactly the requested range: a host that ignores ranges used to stream the whole file once per range before the checksum failed, and now fails on its first request and falls back to a full download.
  • Fix: installing an AppImage update no longer deletes the installed app before the new one is in place. Before, the updater deleted the running AppImage and then ran mv 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

  • Feat!: nest files, extraResources and extraFiles under fileOptions
    Details

    The three file-copy lists live in a 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.

    Flat 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.

    Code that reads 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.

    See https://www.electron.build/docs/migration/v27-breaking-changes#file-options-fileoptions

  • Fix: confine linked files to the workspace and package-manager store by real path; opt in to external links with 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-workspace
  • Fix: confine copies to the app output directory by real path, so that a symlink among copied files (app directory, extraResources/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.
  • Feat(flatpak): build bundles with flatpak and flatpak-builder directly, without @malept/flatpak-bundler, and build in unprivileged containers
    Details

    The flatpak target now runs 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.

    New options:

    • 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).

    BREAKING CHANGE: 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.

    BREAKING CHANGE: 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.

    BREAKING CHANGE: the default 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.

    BREAKING CHANGE: a 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

  • Feat(app-builder-lib): warn at build start when a process.env variable removed in v26 → v27 is still set
    Details
    • Added 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.
    • Covers the removed toolset-path overrides (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.
    • Internal/test-only variables (JEST_WORKER_ID, TEST_SET_BABEL_PRESET) and npm_lifecycle_event (set by npm for every script) are intentionally excluded from the runtime scan.
    • Migration docs: filled the previously undocumented removed vars in the v27 breaking-changes catalogue (the toolset-path family plus 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.
  • Feat(builder-util): 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)
  • Fix(asar): 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.
  • Feat(snap): "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
  • Feat(flatpak): warn about --no-sandbox and the flatpak id, and fix the wrapper, useWaylandFlags, MIME types and failed builds
    Details
    • Warns once per build when --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.
    • Warns once per build when the flatpak id is derived from the package name (neither 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).
    • The 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.
    • An invalid flatpak id (fewer than three elements, an empty element or one starting with a digit, more than 255 characters), such as 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).
    • The __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.
    • The MIME types of 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.
  • Feat(asar): 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

  • Chore(deps): update @electron/___ dependencies to latest
  • Fix: encode GitLab publisher package path segments
  • Fix: escape Squirrel project URLs in nuspec XML
  • Fix: stop retry backoff immediately when cancelled
  • Fix(appimage): resolve a toolsets.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 checksum
  • Fix(snap): pack legacy-base (core18/core20/core22) template snaps with the mksquashfs 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
  • Fix(nsis): the installer copies itself into %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.
  • Fix(nsis): log once when the installer skips keeping its copy for electron-updater's differential download cache because resources/app-update.yml was not found
  • Fix(nsis): point the removed customNsisBinary / 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 anchor
  • Fix: retry an Electron/toolset download that times out instead of failing the build. Before, a silent connection ended in undici's 300s headers/body timeout, which was not treated as retryable, and the 10 minute cap on a download was one AbortSignal.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.
  • Fix(docs): repair broken links and anchors across the docs site and JSDoc, and export the SnapOptions24, SnapOptionsLegacy, SnapOptionsCustom and RemoteBuildOptions types from app-builder-lib so their API reference pages are generated
  • Refactor: once-only build and updater warnings use 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 twice
  • Fix: reject shell line-break characters
  • Fix: honor uppercase http(s) proxy environment variables
  • Fix: reject aborted S3 upload responses
  • Fix: enforce workspace path boundaries for asar
  • Fix: accept forward slashes in isOutsidePath on Windows
  • Fix: bump @electron/rebuild to 4.2.1 so cross-platform builds from one node_modules no longer reuse a native module built for another platform (#10031)
  • Fix(asar): a missing asar.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 log
  • Fix: contain mapped app file destinations
  • Fix(snap): core24 no longer requests browser-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
  • Docs(blockmap): state the regions size/sha512 guarantee for file-output mode only
  • Fix(linux): validate .desktop entry keys and values before writing them, for every Linux target
    Details

    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 .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.

  • Fix(snap): stop deleting 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

  • Fix(updater): make GitHubProvider pick the highest eligible release for alpha/beta channel clients instead of the first feed entry, so a stable hotfix published after a pre-release no longer hides that newer pre-release (or offers a downgrade) (#10287)
  • Fix: handle a deferred native macOS update download only once
  • Fix: stop retry backoff immediately when cancelled
  • Fix: reject missing and path-valued cached update file names
  • Fix: handle multipart headers split across download chunks
  • Fix: validate the initial update channel and allow resetting a configured channel to the default
  • Fix(docs): repair broken links and anchors across the docs site and JSDoc, and export the SnapOptions24, SnapOptionsLegacy, SnapOptionsCustom and RemoteBuildOptions types from app-builder-lib so their API reference pages are generated
  • Feat(builder-util): 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)
  • Refactor: once-only build and updater warnings use 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 twice
  • Docs: document files[].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.
  • Feat!: nest files, extraResources and extraFiles under fileOptions
    Details

    The three file-copy lists live in a 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.

    Flat 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.

    Code that reads 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.

    See https://www.electron.build/docs/migration/v27-breaking-changes#file-options-fileoptions

27.0.0-alpha.10​

electron-builder 27.0.0-alpha.10

Major changes

  • Feat(security)!: signed update manifests (Ed25519) are required by default, with trust lists and multi-signature manifests
    #9877updated in #10255
    Details

    BREAKING CHANGE: signing auto-update manifests is now REQUIRED by default. A build with a publish policy (--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.

    Ed25519 signing of auto-update manifests (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).

    Key rotation without a flag day: an install trusts a list of public keys (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).

    Gating of the Linux package-manager signature-bypass flags landed separately as AppUpdater.allowUnverifiedLinuxPackages (#9990).

  • Feat!: a code-signed Windows build that writes 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.
  • Feat!: electron-builder sets 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())
  • Feat!: NSIS web-installer updates are rejected unless 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
  • Feat!: the nsis-web installer verifies and installs its own copy of a local app package. A package passed via --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.
  • Feat!: remove customNsisBinary / customNsisResources in favour of toolsets.nsis and installerDebugLogging; hint --config in migrate-schema
    Details

    v27 had stopped using a custom NSIS bundle set via 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:

    • a custom NSIS build moves to 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 bundle
    • customNsisBinary.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 makensis

    electron-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.

    Any custom toolset (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.

    When 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

  • Feat: add 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.
  • Feat(nsis): self-identify install method via resources/package-type so nsis-web installs default disableWebInstaller to false
    #9979updated in #10264
    Details

    NSIS installers now write a 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.

    This is a default only: a value the app sets (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.

  • Fix: 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).
  • Feat(toolsets): accept a base64 SHA-512 checksum for custom toolsets and verify local file:// archives
    Details

    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-checksum

  • Feat(blockmap): chunk the stored resources/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

    Note for apps already shipping "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

  • Chore: replace ESLint and Prettier with oxlint and oxfmt
  • Fix: preserve sibling paths in diagnostic path logging
  • Perf: make module downward search linear
  • Fix: resolve retina backgrounds by terminal extension
  • Fix(nsis): warn when differentialPackage: "store-asar" finds no resources/app.asar (e.g. asar: false) instead of silently compressing the package normally
  • Fix(mac): sign with the unique certificate hash, and keep MAS ElectronTeamID automation working
    Details

    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.

    Also fixes savePlistFile destroying <data> and <date> values, which it rewrote as a <dict> of byte integers and an empty <dict> respectively.

  • Fix(nsis): keep installer extraction in sync with the payload format when 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 match
  • Fix: encode Bitbucket delete filenames
  • Refactor: replace deprecated recursive rmdir
  • Fix: preserve repeated debug logger key segments
  • Chore(deps): update dependency undici to v7.29.1 [security]
  • Fix(migrate-schema): print advisories, for JS/TS configs as well as JSON, YAML, TOML and package.json ones, for nsis.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 detected
  • Fix(nsis): a silent nsis-web installer run exits with code 2 when the app package cannot be downloaded, instead of waiting on the retry prompt. A cancelled package download, an app package that cannot be extracted, and a running app that cannot be closed (or that the user chose not to close) now also end an NSIS installer with exit code 2 explicitly, like its other aborts
  • Fix: merge the update info of a target into latest*.yml with deepAssign
  • Fix(nsis): the nsis-web installer copies, verifies and, if needed, downloads its app package before it removes the installed version, so a refused package, a --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 asking
  • Fix: point the PUBLISH_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.
  • Fix: HttpExecutor.removeCrossOriginSensitiveHeaders copies the headers with deepAssign, which ignores __proto__, constructor and prototype keys
  • Fix(migrate-schema): print an advisory, for JS/TS configs as well as JSON, YAML, TOML and package.json ones, for a generic 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 run
  • Fix: handle EPIPE on child stdin in spawnAndWrite / spawnAndWriteWithOutput when the process exits before all input is written
  • Fix(nsis): apply the uninstaller icon patch when extracting the uninstaller without running the installer, verify the NSIS integrity check before shipping it, and use this extraction on every host (running the installer is now only a fallback)
  • Fix(pnpm-collector): read the app's own package.json from its directory so an app named like one of its dependencies no longer loses production dependencies from the asar
  • Fix: reject a collected node_modules tree unless every declared production dependency is present or reported as legitimately absent, so a partial tree falls back to traversal
  • Fix: encode GitHub upload artifact names

electron-updater 7.0.0-alpha.9

Major changes

  • Feat(updater): add verifyUpdateFile to AppUpdater, and rename the NSIS Authenticode verification interface
    Details

    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.

    The NSIS Authenticode verification interface now returns an unambiguous result object instead of the null-means-success / string-means-error convention:

    type VerifyUpdateFileResult = { response: "success" } | { response: "failure"; message: string }
    

    BREAKING CHANGE: 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" }
    

    BREAKING CHANGE: the protected 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.

    BREAKING CHANGE: the protected 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.)

  • Feat(updater): default disableWebInstaller to true
    #9979updated in #10264
    Details

    BREAKING CHANGE: 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.

    A web-installer update is rejected with 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.

  • Feat!: NSIS web-installer updates are rejected unless 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
  • Feat!: electron-updater sends update-feed credentials only to downloads on the feed's origin. With the generic, s3, spaces, r2, keygen, bitbucket, github and gitlab providers, a download on another origin than the feed (scheme, host or port) — an absolute files[].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

  • Feat(security)!: signed update manifests (Ed25519) are required by default, with trust lists and multi-signature manifests
    #9877updated in #10255
    Details

    BREAKING CHANGE: signing auto-update manifests is now REQUIRED by default. A build with a publish policy (--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.

    Ed25519 signing of auto-update manifests (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).

    Key rotation without a flag day: an install trusts a list of public keys (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).

    Gating of the Linux package-manager signature-bypass flags landed separately as AppUpdater.allowUnverifiedLinuxPackages (#9990).

  • Feat(nsis): self-identify install method via resources/package-type so nsis-web installs default disableWebInstaller to false
    #9979updated in #10264
    Details

    NSIS installers now write a 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.

    This is a default only: a value the app sets (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.

  • Feat(updater): optional 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

  • Chore: replace ESLint and Prettier with oxlint and oxfmt
  • Fix: report accurate differential download progress deltas
  • Fix: reject traversal segments as update cache filenames
  • Fix: handle background download rejections from checkForUpdatesAndNotify
  • Feat!: a code-signed Windows build that writes 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.
  • Fix(updater): pass the web installer package to verifyUpdateFile as packageFilePath when a pending web update is installed on next launch
  • Fix(updater): pass the NSIS install directory (installDirectory, /D=) as the last installer argument, after --package-file
  • Fix(updater): the warning about disableWebInstaller 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
  • Feat!: the nsis-web installer verifies and installs its own copy of a local app package. A package passed via --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.
  • Fix: HttpExecutor.removeCrossOriginSensitiveHeaders copies the headers with deepAssign, which ignores __proto__, constructor and prototype keys

27.0.0-alpha.9​

electron-builder 27.0.0-alpha.9

Major changes

  • Feat(squirrel-windows)!: inline installer logic; remove electron-winstaller dependency and its vendored binaries
    Details

    BREAKING: the 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.

  • Fix(nsis): correct the 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.
  • Feat(mac)!: stop granting 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.unpacked

Minor changes

  • Feat(toolsets)!: add toolsets.wine: "system" and make it what "latest" resolves to
    Details

    "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.

    Behaviour change: "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.

    fix(msi): only emit Icon="…" on shortcuts and ProgIds when the app has an icon

    The MSI template declares <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.

  • Feat: v27 upgrade guardrails: make every breaking change self-announcing
  • Feat(nsis): more flexible custom script includes (#9112)
    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.
    • The build resources directory is now always registered via !addincludedir, so custom scripts can !include sibling files by name even when the main include is auto-discovered.
    • The portable target now honors an explicitly set portable.include (string or array). It still does not auto-discover build/installer.nsh, so existing portable builds are unaffected.
    • Both 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.
    • Fixed the !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).
  • Feat(nsis): 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().
  • Feat(dmg): allow "position" as a dmg.contents type3
  • Feat(security): signed update manifests (Ed25519) with trust lists and multi-signature manifests
    Details

    Optional Ed25519 signing of auto-update manifests (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).

    Key rotation without a flag day: an install trusts a list of public keys (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.

    Gating of the Linux package-manager signature-bypass flags landed separately as AppUpdater.allowUnverifiedLinuxPackages (#9990).

  • Feat(migrate-schema): cover every v27 breaking config change
    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:

    • platform-level 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 removed
    • toolsets.*: 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 reshaped
    • GitHub publish entries are migrated in every section (e.g. nsis.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 change
    • win.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 config
    • snap options the snapcraft.core24 shape does not support are dropped with a warning

    It warns about squirrelWindows.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

  • Fix(mac): retain Electron's 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)
  • Fix: normalize Snap Store channels
  • Fix: log dynamic import failures
  • Fix: parse GitHub repo shorthand correctly
  • Fix: stop oversized in-memory downloads at the configured limit
  • Fix(pnpm): bundle the transitive dependencies of a 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.
  • Ensure arch is passed to blockmap path macro expansion
  • Fix: resolve the pnpm workspace root by walking up for 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.
  • Fix: suppress the macOS 26 "Installer would like to access data from other apps" prompt when building 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.
  • Fix: clean up publish SIGINT listeners
  • Fix: detach DMGs after mount parsing failures
  • Fix: resolve pnpm dependencies omitted from the 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.
  • Fix: select the ARM64 application package in Windows ARM64 web installers, including ARM64-only and combined x64/ARM64 builds. Keep download and adjacent-package selection consistent.
  • Add internal afterPackTestHook packager option (test-only) that skips target builds once the app directory is assembled.
  • Extract the nsis-web APP_PACKAGE_URL define resolution into an internal configureWebInstallerAppPackageUrl helper (no behaviour change) so it can be unit-tested without packaging.
  • Fix(node-module-collector): report empty package-manager output clearly and fall back to node_modules traversal when a collector throws (#10208)
  • Chore(deps): update dependency toml to v4 [security]
  • Fix: evaluate the node_modules directory filter lazily and only once per directory instead of a synchronous lstat per file; await async onNodeModuleFile hook results instead of treating the pending Promise as truthy (#10169)
  • Fix(snap): stop generating duplicate desktop entries for core24 snaps. Keep the generated snap/gui entry and its configured desktopName.
  • Fix(flatpak): don't let 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.
  • Fix(flatpak): read flatpak.files from the flatpak config directly so that a single-string or FileSet linux.files no longer throws in FlatpakTarget
  • Fix: restore console logger after electron/asar failures
  • Perf: deduplicate concurrent module cache lookups
  • Chore(deps): update form-data to 4.0.6
  • Chore(node-module-collector): remove unused pnpm config list hoisted detection from the base collector
  • Chore(deps): update resedit to v3
  • Fix(pnpm-collector): find nested dependencies under the workspace root when the app is a package in a pnpm hoisted (nodeLinker: hoisted) workspace, instead of packaging an out-of-range hoisted copy

electron-updater 7.0.0-alpha.8

Major changes

  • Refactor(updater): downloadUpdate() and UpdateCheckResult.downloadPromise resolve with a DownloadExecutorResult object instead of a positional Array<string>
    Details

    BREAKING CHANGE: the promise returned by 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()
    

    The same applies to the result of 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
    

    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.

Minor changes

  • Feat(updater): improve PowerShell invocation reliability for Windows code-signature verification
  • Feat: v27 upgrade guardrails: make every breaking change self-announcing
  • Feat(security): signed update manifests (Ed25519) with trust lists and multi-signature manifests
    Details

    Optional Ed25519 signing of auto-update manifests (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).

    Key rotation without a flag day: an install trusts a list of public keys (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.

    Gating of the Linux package-manager signature-bypass flags landed separately as AppUpdater.allowUnverifiedLinuxPackages (#9990).

Patch changes

  • Fix: strip 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.
  • Fix: keep the cached blockmap consistent with the cached installer. A download round that did not produce a new blockmap (e.g. the differential download was skipped because the cached installer was evicted) now removes the cached 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.
  • Fix: stop oversized in-memory downloads at the configured limit
  • Fix: preserve fractional staged rollout percentages
  • Fix: make multi-range differential downloads work on real servers. Three independent defects made 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.
    • A header-list terminator split across two chunks was never found: only the new chunk was searched, the buffered bytes never were, so the parser locked onto the next part's header instead. Only the last few bytes of an unfinished header list are now carried over and searched together with the next chunk, instead of accumulating the whole list.
    • The 10s watchdog armed when a batch response ends was never disarmed after that batch succeeded. With more than 1000 operations (several range requests) it failed the whole download whenever a later batch took longer than the grace period.

27.0.0-alpha.8​

electron-builder 27.0.0-alpha.8

Major changes

  • Fix(app-builder-lib): expand lower channels when the channel name has a suffix
    Details

    With 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.

    Breaking: a suffixed 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.

  • Fix(linux): remove 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

    feat(linux): support the "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

  • Fix: return a descriptive result instead of a bare boolean from the signing chain, unified across the platform packagers as a single exported type. 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
    • The unconditional 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.
    • The skip message now states the actual reason at info level (signing skipped reason=no code signing certificate configured) instead of a debug-level "no signing configuration found".
    • A file signed by a custom 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.
    • Behavior change: 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

  • Fix NSIS installer hang when the user's PowerShell profile contains interactive commands: run powershell.exe with -NoProfile -NonInteractive in allowOnlyOneInstallerInstance checks
  • Fix(nsis): detect and close app instances running from the previous per-user/per-machine install location, not only the new $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.
  • Fix: emit 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)
  • Fix(mac): bump linux-tools-mac toolset to 1.0.1, rebuilt on macOS 15 runners so its gtar/lzip/ar binaries run on macOS 15+ instead of requiring macOS 26; also download custom toolsets.*.url bundles from the configured URL as-is instead of appending the filename again (fixes #10084)
  • Only log a file as 'signed' when signing actually succeeded
  • Fix(nsis): a silent auto-update no longer hangs forever on an invisible dialog when the old version's uninstall fails. The uninstall-failure 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.
  • Added slnx to default file exclusions
  • Fix: actually retry transient Electron/toolset download failures. The download retry predicate only matched builder-util-runtime's 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)
  • Fix(mac): pass the temporary keychain's own password to 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).
  • Fix: update the 7-Zip toolset to 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.
  • Fix: preserve Yarn Berry registry credentials
  • Docs: fix broken electron.build documentation links in readmes, TSDoc comments, and error messages — point auto-update, code-signing, and multi-platform-build references at their new /docs/features/ locations, repair the electron.build./ domain typo, and replace anchors that no longer exist (#10107)
  • Chore(deps): update dotenv and dotenv-expand
  • Fix: report the repository detected for app-update.yml at build time
    Details

    When a GitHub or Bitbucket publish configuration omits 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.

    The build now logs the resolved 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: fix broken electron.build documentation links in readmes, TSDoc comments, and error messages — point auto-update, code-signing, and multi-platform-build references at their new /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

  • Feat: fail builds on missing production dependencies by default. When node-module collection completes and a production dependency could not be resolved (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

  • Feat: warn on silently skipped update signature verification and validate publisherName against the signing certificate at build time
    Details

    Two guards around Windows update signature verification:

    • electron-updater: when 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.
    • app-builder-lib: when 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.
  • Feat: validate 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.
  • Feat: restore 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

  • Security hardening and a migrate-schema fix:
    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.
  • Feat: support fully offline (air-gapped) Electron downloads by picking up a locally seeded 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)
  • Fix: don't mutate shared UpdateInfo.files when applying GitHub safeArtifactName, which leaked the GitHub-safe file name into other publish providers' update metadata
  • Fix: allow parentheses in AppImage executable, product, and license file names. Before, product names like 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.
  • Fix: validate the resolved installed electron-updater version instead of the declared specifier, fixing false "At least electron-updater 4.0.0" errors for pnpm catalog:/workspace: specifiers
  • Fix: prevent infinite recursion in node module collection when a package depends on itself (e.g. 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)
  • Fix: don't bundle workspace node_modules when the app has no production dependencies
    Details

    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 node_modules, climbed to the workspace root, and copied the entire hoisted workspace node_modules into app.asar.

    After: an app with no production dependencies (neither in its package.json nor added via extraMetadata) bundles no node_modules at all — the collection step is skipped with an informational log message.

  • Fix: classify missing declared-optional dependencies (e.g. fsevents on Linux/Windows) as missing optional dependencies in the pnpm collector, instead of warning dependency not found on disk
  • Fix: classic-confinement core24 snaps no longer get default plugs or a generated layout, which the snap store review rejects
  • Fix(mac): bump icons toolset to 1.2.3 so small ICNS sizes are written as ic04/ic05 ARGB instead of PNG-in-icp4/icp5/icp6, which macOS renders as noise at 16/32px (fixes corrupted Finder/DMG icons)
  • Fix: multithread the deb payload compression. fpm's deb path pipes GNU tar -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

  • Feat: warn on silently skipped update signature verification and validate publisherName against the signing certificate at build time
    Details

    Two guards around Windows update signature verification:

    • electron-updater: when 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.
    • app-builder-lib: when 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

  • Security hardening and a migrate-schema fix:
    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.
  • Fix: expose ./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

  • Fix(mac): keep CFBundleName and helper app bundle names consistent so Electron resolves helper apps on modern macOS
    Details
    • macOS product and executable names are no longer normalized to NFD. The .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).
    • macOS builds now require 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.
  • Feat(dmg): default DMG filesystem to APFS
    Details

    BREAKING CHANGE: The default DMG volume filesystem changed from 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.

  • Feat: build-time packages (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.
  • Feat(updater): gate legacy top-level manifest path/sha512 behind electronUpdaterCompatibility
    Details

    BREAKING CHANGE: The legacy top-level 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.

  • Feat!: 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

  • Feat(win): add msix target with .msixbundle and .msixupload support, MSIX-specific manifest features (Package Integrity, Windows Services), and shared winAppUtil helper module
  • Feat(migrate-schema): advise on autoUpdater.disableWebInstaller when an nsis-web target is detected
    Details

    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).

  • Feat(nsis): self-identify install method via resources/package-type so nsis-web installs default disableWebInstaller to false
    Details

    NSIS installers now write a 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.

    This is a default only: an explicit 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.

  • Feat(dmg): support ULMO (lzma-compressed) disk image format, macOS 10.15+
  • Fix(publish): authenticate Bitbucket Cloud uploads with access tokens (Bearer auth)
    Details

    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 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.

  • Feat: fail fast with a clear configuration error when building Windows ia32 or Linux armv7l against Electron >= 44, which removed those builds (electron/electron#51816). Previously such builds died with an opaque 404 while downloading the Electron zip. Downgraded to a warning when a custom 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).
  • Feat: add Cloudflare R2 publish provider

Patch changes

  • Fix: ship snapcraft type declarations so SnapOptions.d.ts resolves for consumers
  • Fix(nsis): pack the app archive with a filter the install-time extractor can decode so the main executable and native binaries are reliably installed on x64 and arm64 (#9983)
  • Fix: extract .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.
  • Fix: don't empty the locales dir when electronLanguages uses bare language codes (e.g. en now keeps en-US.pak), refuse to delete every locale, and warn about entries that match nothing
  • Fix: cache the pending publisher promise in PublishManager so concurrent artifact uploads share one publisher instead of racing to create duplicate GitHub draft releases
  • Fix: don't warn about missing com.apple.security.cs.disable-library-validation entitlement when the effective entitlements file already grants it (ad-hoc + hardened runtime builds)

electron-updater 7.0.0-alpha.5

Major changes

  • Feat(updater): default disableWebInstaller to true
    Details

    BREAKING CHANGE: 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.

    v27 ships a one-major-version grace period so existing deployments are not broken without warning:

    • If you never set 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).
    • If you explicitly set disableWebInstaller = true, the download throws ERR_UPDATER_WEB_INSTALLER_DISABLED immediately.

    If you intentionally publish and rely on an NSIS web installer, opt back in before v28 by setting autoUpdater.disableWebInstaller = false in your main process.

  • Feat(updater): gate legacy top-level manifest path/sha512 behind electronUpdaterCompatibility
    Details

    BREAKING CHANGE: The legacy top-level 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.

  • Feat(updater)!: install-on-next-launch mode, OS session-end guard, object-form quitAndInstall, and autoInstallEvent enum
    Details

    BREAKING: 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 })
    

    BREAKING: the 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"
    

    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 BaseUpdater so NSIS, AppImage, deb, rpm and pacman targets all inherit them:

    • Session-end guard (always on): when the OS session is ending, the on-quit install is skipped with a warning and the downloaded update stays cached for the next quit. Detection is best-effort: 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.

    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 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

  • Feat(nsis): self-identify install method via resources/package-type so nsis-web installs default disableWebInstaller to false
    Details

    NSIS installers now write a 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.

    This is a default only: an explicit 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.

  • Feat(updater): add allowUnverifiedLinuxPackages to optionally enforce Linux package signature verification
    Details

    Adds 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).

    If you sign your Linux packages through your own pipeline and the target systems trust your keys, set autoUpdater.allowUnverifiedLinuxPackages = false. What this enforces depends on the package manager used on the target system:

    • dpkg (the default for .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.
    • apt (.deb fallback): --allow-unauthenticated is omitted.
    • zypper: enforced — unsigned/untrusted packages fail to install.
    • dnf/yum: enforced via --setopt=localpkg_gpgcheck=1 (local package files are not GPG-checked by default).
    • bare rpm (fallback): cannot be enforced via the CLI (a warning is logged) — rpm verifies signatures when present but by default does not fail the install on unsigned/untrusted packages; the rpm -Uvh ... --nodeps fallback command is unchanged (--nodeps is a dependency-resolution bypass, not a signature bypass).

    The new allowUnverified parameter on DebUpdater.installWithCommandRunner / RpmUpdater.installWithCommandRunner is a trailing optional argument (default true), so existing callers remain source- and runtime-compatible.

  • Feat: add Cloudflare R2 publish provider

Patch changes

  • Fix(updater): make GitHubProvider pick the newest available release if allowPrerelease=true but current version is stable
    Details
    • 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).
    • When every published release is older than the installed version, the updater now reports "update not available" gracefully (and honors 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.
    • Harden the release download path against path traversal: a tag containing ./.. path segments is rejected with ERR_UPDATER_INVALID_TAG.
  • Fix(updater): detect legacy hex sha512 manifest values strictly and deprecate them for removal in v28
    Details

    The updater previously used a fuzzy heuristic (looking for +, /, 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.

    Hex-encoded 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.

    SHA-256 (sha2) update checksums are unchanged here — they remain accepted in v27 under the existing v28-removal grace period.

  • Fix: Reject the differential download promise instead of crashing with an uncaughtException when the multipart range response emits a network error

27.0.0-alpha.5​

electron-builder 27.0.0-alpha.5

Major changes

  • Feat(toolsets): Adopt "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.
  • Fix(nsis): Generate Windows file-association ProgIDs in a unique, Microsoft-compliant format derived from the product filename and app GUID (BREAKING: custom NSIS scripts hard-coding the previous name/ext ProgID must be updated)
  • Feat(toolsets)!: remove USE_SYSTEM_FPM env override; require an explicit custom toolset on Windows
    Details
    • Remove the 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" }.
    • A custom toolset is now honored before the platform fallback in getFpmPath() and getOsslSigncodeBundle(), so an explicit override is respected on every platform (previously it was silently ignored on Windows).
    • On Windows with no custom toolset configured, 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).
  • Feat: allow including default-excluded files (e.g. Wavefront .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

  • Feat(snap): support multi-arch remote-build via buildFor: string[] — one Launchpad job now produces and registers multiple snap artifacts
  • Feat: promote Azure Trusted Signing and Snap Core24 out of Beta

Patch changes

  • Docs(win): expand JSDoc for all Windows code signing options (regenerating scheme.json) and modernize the code-signing docs — correct osslsigncode vs Wine, HSM dual-signing, and the "latest" winCodeSign toolset model
  • Chore(refactor): reducing duplicate code and extracting helper functions
  • Fix: bundle a workspace sub-package's production dependencies into app.asar when the package manager resolves to the workspace root
  • Fix(win): flaky appOutDir mutation created elevate.exe race condition for concurrent builds that included Squirrel target
  • Docs: add a dedicated v27 breaking-changes reference page and point the invalid-config error (schemaValidator) and migrate-schema CLI output at it
  • Fix(migrate-schema): stop stripping vPrefixedTagName 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

  • Chore(refactor): reducing duplicate code and extracting helper functions

27.0.0-alpha.4​

electron-builder 27.0.0-alpha.4

Major changes

  • Feat: Remove linux.syncDesktopName — always sync the installed .desktop filename

Minor changes

  • Feat(linux): launch every Linux target (deb/rpm, AppImage, snap, flatpak) through a unified launcher entrypoint so executableArgs are applied consistently and the generated .desktop Exec key stays a plain command
  • Feat(cli): migrate-schema now auto-migrates programmatic JS/TS configs
    Details

    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).

  • Introduce xml escaping for publisher, publisherDisplayName, displayName, description in appxmanifest.xml to avoid issues with xml preserverd characters

Patch changes

  • Chore: migrate usages of mkdtemp to utilize TmpDir to unify temp directory usage
  • Fix(win): serialize concurrent signtool invocations to avoid intermittent "An error occurred while attempting to load the signing certificate"
  • Fix(win): retry the spurious "The batch file cannot be found." cmd.exe race during dependency install (idempotent, win32-guarded — real install failures still fail fast)
  • Fix(nsis): preserve $(...) LangString references in escaped NSIS define values (e.g. shortcutName: "$(customSN)")
  • Fix: resolve failure modes surfaced on the Windows test shards (corepack log noise, icon-conversion memory exhaustion, and an associated signtool failure), plus a small structural cleanup of the install/collector code
  • Fix(mac): resolve universal build failure with platform-specific single-arch dependencies (e.g. esbuild, @esbuild/darwin-arm64)
    Details

    Node modules are now filtered by their 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).

  • Feat(nsis): add Hebrew (he) translations for one-click and assisted installer messages
    Details

    Also add 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

  • Introduce xml escaping for publisher, publisherDisplayName, displayName, description in appxmanifest.xml to avoid issues with xml preserverd characters

27.0.0-alpha.3​

electron-builder 27.0.0-alpha.3

Major changes

  • Chore: modernize macOS build config API and upgrade all electron/____ dep updates
  • Feat(win): Multi-mode Windows code signing under a unified win.sign key [HSM, PKCS#11, Azure Trusted Signing, Signtool] (BREAKING)
  • Feat: add updated wine 11.0 to toolsets config; USE_SYSTEM_WINE process.env override removed - use CustomToolset instead

Minor changes

  • Fix: add retry-tolerant ensureDir to address recurring flaky ENOENT … mkdir '<cache>/fpm@2.2.1/…' during concurrent toolset downloads

Patch changes

  • Fix: declare the missing electron-publish dependency on electron-builder, and switch type-checking to nodenext module resolution so the compiler models Node's real ESM loader
  • Fix(pnpm-collector): bundle transitive deps of link: packages
  • Chore: harden Windows Azure signing PowerShell invocation and add Windows signing migration notes
  • Fix: resolve ENOENT on electron zip extraction in Windows Docker
  • Chore(test): generate ephemeral self-signed macOS code-signing for CI tests
  • Fix(snap): core24 now runs the app through a generated launcher script, so executableArgs/forceX11 flags containing = or quotes build correctly, and the unused chrome-sandbox helper is removed automatically when launching with --no-sandbox
  • Fix: Resolves open CodeQL code-scanning alerts (8 of 14) by fixing two real ReDoS vulnerabilities and clearing path-injection taint
  • Chore(test): disable sourcemaps during Vitest runs
  • Fix: preserve symlinks in zip 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

  • Fix: declare the missing electron-publish dependency on electron-builder, and switch type-checking to nodenext module resolution so the compiler models Node's real ESM loader

27.0.0-alpha.2​

electron-builder 27.0.0-alpha.2

Patch changes

  • Fix: resolve runtime ESM/CJS interop for namespace imports of CJS-only packages (sax, which, mime)

electron-updater 7.0.0-alpha.1

Patch changes

  • Fix: resolve runtime ESM/CJS interop for namespace imports of CJS-only packages (sax, which, mime)

27.0.0-alpha.1​

electron-builder 27.0.0-alpha.1

Patch changes

  • Fix: resolve plist and chromium-pickle-js imports. Add additional messaging to migrate-schema stdout

27.0.0-alpha.0​

electron-builder 27.0.0-alpha.0

Major changes

  • Feat!: migrate to native ESM, require Node.js >=22.12.0, remove electron-compile
  • Chore(refactor): delete ProtonFramework, LibUiFramework, and binDownload.ts; consolidate all binary downloads into downloadBuilderToolset.
  • Feat(toolsets)!: introduce ToolsetCustom for user-supplied bundles; remove env-var toolset overrides; split toolset modules into single-purpose files; deprecate PlatformPackager.info
  • Chore(refactor): group native-module rebuild options under nativeModules sub-key (BREAKING)
  • Chore(refactor): remove deprecated snap config property and all remaining deprecated APIs. Hard-deletes 14 deprecated features accumulated across the codebase. No migration shims remain. (BREAKING)
  • Fix: disable implicit publishing by default
    Details

    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 --publish CLI flag (e.g., --publish always, --publish onTag) or by setting the publish option in your configuration.

    This addresses security and usability concerns where unexpected auto-publishing could accidentally expose secrets or publish unfinished work.

  • Chore(refactor): consolidate ASAR config under asar?: AsarOptions | false | null (BREAKING)

Minor changes

  • Refactor(targets,vm,codeSign,electron,util): reorganize platform-specific files into subdirectories
  • Feat(cli): add migrate-schema command for v26 → v27 config migration

Patch changes

  • Chore: Code quality modernization: adopt native Node.js APIs and modern TypeScript patterns across the codebase.
  • Chore(refactor): Extract validateShellEmbeddable to builder-util/envUtil; consolidate all boolean env-var flags into flags.ts.

electron-updater 7.0.0-alpha.0

Major changes

  • Feat!: migrate to native ESM, require Node.js >=22.12.0, remove electron-compile
  • Chore(refactor): remove deprecated snap config property and all remaining deprecated APIs. Hard-deletes 14 deprecated features accumulated across the codebase. No migration shims remain. (BREAKING)

Patch changes

  • Chore: Code quality modernization: adopt native Node.js APIs and modern TypeScript patterns across the codebase.

26.17.0​

electron-builder 26.17.0

Minor changes

  • Feat(nsis): 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

  • Fix: resolve the pnpm workspace root by walking up for 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.
  • Fix: resolve pnpm dependencies omitted from the 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.
  • Fix: suppress the macOS 26 "Installer would like to access data from other apps" prompt when building 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.
  • Fix(node-module-collector): report empty package-manager output clearly and fall back to node_modules traversal when a collector throws (#10208)
  • Fix(flatpak): stop 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.
  • Fix(flatpak): read flatpak.files from the flatpak config directly so that a single-string or FileSet linux.files no longer throws in FlatpakTarget
  • Fix(pnpm-collector): package the declared versions of nested dependencies with pnpm 11 and node-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

  • Fix: keep the cached blockmap consistent with the cached installer. A download round that did not produce a new blockmap (e.g. the differential download was skipped because the cached installer was evicted) now removes the cached 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.
  • Fix: make multi-range differential downloads work on real servers. Three independent defects made 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.
    • A header-list terminator split across two chunks was never found: only the new chunk was searched, the buffered bytes never were, so the parser locked onto the next part's header instead. Only the last few bytes of an unfinished header list are now carried over and searched together with the next chunk, instead of accumulating the whole list.
    • The 10s watchdog armed when a batch response ends was never disarmed after that batch succeeded. With more than 1000 operations (several range requests) it failed the whole download whenever a later batch took longer than the grace period.

26.16.1​

electron-builder 26.16.1

Patch changes

  • Fix(win): flaky appOutDir mutation created elevate.exe race condition for concurrent builds that included Squirrel target
  • Fix(mac): pass the temporary keychain's own password to 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).
  • Fix(win): only log "signing with signtool.exe" when a certificate is configured and signing actually runs; report at info level when signing is skipped because no certificate is configured (#10168)
  • Fix(mac): retain Electron's 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)
  • Fix: prevent infinite recursion in node module collection when a package depends on itself (e.g. 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

  • Feat: add 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

  • Feat: support fully offline (air-gapped) Electron downloads by picking up a locally seeded 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)
  • Fix: accept base64-encoded SHA-512 checksums for custom toolset downloads again. 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.
  • Fix: allow parentheses in AppImage executable, product, and license file names. Before, product names like 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.
  • Fix: classify missing declared-optional dependencies (e.g. fsevents on Linux/Windows) as missing optional dependencies in the pnpm collector, instead of warning dependency not found on disk
  • Fix NSIS installer hang when the user's PowerShell profile contains interactive commands: run powershell.exe with -NoProfile -NonInteractive in allowOnlyOneInstallerInstance checks
  • Fix(mac): bump icons toolset to 1.2.3 so small ICNS sizes are written as ic04/ic05 ARGB instead of PNG-in-icp4/icp5/icp6, which macOS renders as noise at 16/32px (fixes corrupted Finder/DMG icons)
  • Fix(linux): bump linux-tools-mac toolset to 1.0.1 so its binaries run on macOS 15+ instead of requiring macOS 26 (fixes fpm-based deb/rpm/pacman builds on older macOS hosts)
  • Fix: emit 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)
  • Fix 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.
  • Feat: backport escape xml for appxmanifest

26.15.7​

electron-builder 26.15.7

Patch changes

  • Fix: extract .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.
  • Fix: don't empty the locales dir when electronLanguages uses bare language codes (e.g. en now keeps en-US.pak), refuse to delete every locale, and warn about entries that match nothing

26.15.6​

electron-builder 26.15.6

Patch changes

  • Fix: bundle a workspace sub-package's production dependencies into app.asar when the package manager resolves to the workspace root
  • Fix(nsis): pack the app archive with a filter the install-time extractor can decode so the main executable and native binaries are reliably installed on x64 and arm64 (#9983)

26.15.5​

electron-builder 26.15.5

Patch changes

  • Fix(snap): core24 now runs the app through a generated launcher script, so executableArgs/forceX11 flags containing = or quotes build correctly, and the unused chrome-sandbox helper is removed automatically when launching with --no-sandbox
  • Fix: updating icons toolset to latest 1.2.1 for broader icns asset generation

26.15.4​

electron-builder 26.15.4

Patch changes

  • Fix(nsis): preserve $(...) LangString references in escaped NSIS define values (e.g. shortcutName: "$(customSN)")
  • Fix(linux): write executableArgs verbatim into the .desktop Exec line so packaged apps (deb/rpm) still appear in the application menu
  • Fix: resolve ENOENT on electron zip extraction in Windows Docker
  • Fix: preserve symlinks in zip 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

  • Fix: harden HTTP mirror validation — reject non-localhost HTTP by default, add ELECTRON_BUILDER_BINARIES_ALLOW_HTTP opt-in
  • Fix(download): persist toolset archives in a predictable cache path so repeated builds and offline environments skip the @electron/get network round-trip
  • Fix(publish): set x-amz-content-sha256: UNSIGNED-PAYLOAD before SigV4 signing so S3 accepts streaming PutObject uploads

26.15.2​

electron-builder 26.15.2

Patch changes

  • Fix(mac): use native zip for macOS zip target to preserve .framework symlinks and fix Squirrel.Mac auto-update validation
  • Fix: retry package install on transient network errors
  • Fix(icons): replace png2icons with wasm-vips Lanczos3 resampling for high-quality icon conversion

26.15.1​

electron-builder 26.15.1

Patch changes

  • Chore: ci:validate lint fixes, ci:test:fetch-cache simplification, and code cleanup
  • Chore(deps): unpin and update @electron/rebuild package to latest ^4.0.4

26.15.0​

electron-builder 26.15.0

Minor changes

  • Chore: replace app-builder-bin node-dep-tree and rebuild-node-modules with pure-TS equivalents; nativeRebuilder: "legacy" now routes to @electron/rebuild sequential mode
  • Fix(node-module-collector): invoke package managers via PowerShell -EncodedCommand on Windows to eliminate shell injection vectors and the Node DEP0190 deprecation warning
  • Chore: replace app-builder-bin proton-native command with pure-TS equivalents; Node.js and LaunchUI binaries are now downloaded via downloadBuilderToolset; config.launchUiVersion string is now respected
  • Chore: replace app-builder-bin snap 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 instead
  • Feat(linux): add linux.syncDesktopName opt-in flag to align installed .desktop filename with desktopName and StartupWMClass; will become default in v27

Patch changes

  • Fix(mac): skip signing when no certificate found; warn on ad-hoc + hardenedRuntime
  • Fix: holistic field detection for sha256 hash redaction
  • Fix(mac/pkg): explicitly pass --version to pkgbuild

electron-updater 6.8.9

Minor changes

  • Chore: replace app-builder-bin node-dep-tree and rebuild-node-modules with pure-TS equivalents; nativeRebuilder: "legacy" now routes to @electron/rebuild sequential mode

Patch changes

  • Fix: holistic field detection for sha256 hash redaction

26.14.0​

electron-builder 26.14.0

Minor changes

  • Feat: migrate blockmap and icon commands from app-builder-bin to pure TypeScript
  • Feat(dmg-builder): replace dmg-license post-processing with dmgbuild-native license embedding; removes deprecated hdiutil udifrez dependency

Patch changes

  • Fix(pnpm): properly resolve nested dependencies when nodeLinker: hoisted
  • Fix(dynamic-import): use CJS resolver to reliably resolve package subpaths in pnpm projects
  • Fix(builder-util): add timeout to spawnAndWriteWithOutput

26.13.1​

electron-builder 26.13.1

Patch changes

  • Fix: correct update-alternatives --remove path and unload AppArmor profile on removal
  • Fix(traversal): accept transitive dependencies resolved outside their declared range by package manager overrides
  • Fix(win): log actionable hint when signAndEditExecutable is false so users know to use signExecutable: false to preserve icon and metadata
  • Chore(deps): replace unmaintained @develar/schema-utils with a self-contained ajv@8 validator
  • Fix(win): restore getToolPath() on WindowsSignToolManager and improve public API
  • Fix(nsis): validate makensis stderr and installer file size after build to catch truncated output caused by low disk space
  • Chore: add comment re: non-existent swiftshader directory in newer electron versions
  • Fix(node-module-collector): suppress expected npm list stderr from user-visible warnings when collecting dependencies for Yarn projects using resolutions

26.13.0​

electron-builder 26.13.0

Minor changes

  • Feat: add disableAsarIntegrity config option to skip ASAR integrity computation
  • Feat: migrate app-builder-bin functions to pure JS (certificate-info, ksuid, get-bucket-location, publish-s3)
  • Fix(dmg): add support for APFS filesystem for dmg builds

Patch changes

  • Fix(nsis): replace partial-match process detection with exact findstr /B match to stop false-positive "app cannot be closed" dialogs when a sibling process name contains the app name
  • Chore: prepare upgrade pathway for updating to latest electron/____ npm packages that are ESM-only
  • Chore: stabilize flaky CI tests (electron zip ENOENT, 5xx retries, snap timeouts)
  • Fix(nsis-web): appPackageUrl: stop appending arch macro to paths with explicit URLs
  • Fix(appimage): fully migrate from app-builder-bin AppImage implementation to leverage JS-only approach
  • Chore: Serialize concurrent downloads of the same artifact across vitest workers to prevent @electron/get's non-atomic putFileInCache (remove + move) from racing with a concurrent reader.
  • Fix(appimage): bundle FUSE2 runtime libraries for x64/ia32, matching Go implementation
  • Fix: Use desktopName from package.json for StartupWMClass in Linux desktop entries

electron-updater 6.8.8

Patch changes

  • Chore: stabilize flaky CI tests (electron zip ENOENT, 5xx retries, snap timeouts)
  • Fix: harden the auto-update flow relative paths in PATH, path traversals, and environment variable intercepts
  • Chore: extracting helper function to add coverage in MacUpdater test suite
  • Fix(updater): ensure full changelog includes only release notes up to the latest release

26.12.1​

electron-builder 26.12.1

Patch changes

  • Fix: harden generated-file output, argument construction, and download validation
  • Fix(codeql): resolving GH CodeQL alerts
  • Chore: provide better error messaging when electron version in devDependencies or electronVersion property are not pinned
  • Fix: properly parse and pass through mas configs to overwrite mac config when target is mas or mas-dev
  • Fix: nsisEscapeString incorrectly converting INSTDIR runtime var to double-$$

electron-updater 6.8.7

Patch changes

  • Fix: harden generated-file output, argument construction, and download validation
  • Fix(codeql): resolving GH CodeQL alerts

26.12.0​

electron-builder 26.12.0

Minor changes

  • Feat(linux): replace legacy linux-tools-mac toolset with v1.0.0 for macOS deb/tar builds for packaging or extracting Linux archives
  • Feat: adding support for core24 snapcraft and refactoring support to a new config property snapcraft to maintain backward compatibility
  • Feat(nsis): adding nsis toolset configuration for makensis

Patch changes

  • Fix: add toolset lockfile for operations that leverage system utils that don't support parallelism (e.g. hdiutil, WiX, etc.)
  • Chore: adding additional validations to downloads and child processes
  • Chore(deps): update dependency minimatch to v10.2.5 [security]
  • Fix: make update info have a deterministic ordering of files
  • Fix(nsis): safely copy UserProgramFiles path
  • Fix: avoid system path on windows for cache when user is system OR path is system32
  • Fix(node-module-collector): emit warn-level log for missing platform-specific optional packages with actionable suggestion to add them to optionalDependencies
  • Fix(mac): electronLanguages option is not correctly applied for Mac platform
  • Chore: increase timeout and retries on toolset lockfiles

26.11.1​

electron-builder 26.11.1

Patch changes

  • Fix: allow mac entitlement files to be linked from outside the workspace
  • Fix: always pass through resolved artifact url to electron/get to avoid env var overrides
  • Fix: force electron/get's internal got downloader to respect http(s) proxies
  • Fix: wrap any collector path in a .bat on Windows if path has a space in it

26.11.0​

electron-builder 26.11.0

Minor changes

  • Feat: migrate to resedit npm package from app-builder-bin's usage of rcedit.exe
  • Feat(win): adding config property to allow disabling signing without disabling editing the executable
  • Feat: add CLI action to clear the electron-builder default cache directory (env var override intentionally ignored for security)

Patch changes

  • Chore: add more validations, incl. compression levels, vendor toolsets, and invalid configs
  • Fix(mac): correctly copy extraFiles to productFilename .app instead of Electron.app
  • Fix(win): recover signing queue after transient errors
  • Perf(pnpm): memoize package resolution and skip downward search in flat virtual store.
  • Fix: improving filtering of log redactor and adding support for filtering out potentially-sensitive env vars
  • Fix: update dmg-builder toolset for usage on older macos (decoupling from homebrew packages)
  • Fix: add cache corruption/extraction detection to prevent malformed 7z extractions
  • Fix: update dmgbuild to 1.2.2 and add mac_alias test case
  • Fix: prevent double progress bar from displaying
  • Chore(docs): adding more tsdoc to target configuration ____Options
  • Fix(appimage): fix compression mapping and add per-target squashfs algorithm overrides
  • Chore(docs): documentation updates and docusaurus migration

electron-updater 6.8.6

Patch changes

  • Chore(docs): documentation updates and docusaurus migration

26.10.0​

electron-builder 26.10.0

Minor changes

  • Feat: migrate electronDownload to use electron/get official package. provides much better support for mirrors

Patch changes

  • Chore: adding hardening to resolving scripts to be within the workspace directory, utilize deepAssign helper utility, and escape command used within node module collector
  • Chore(builder-util): add engines field to package.json
  • Chore: swap app-builder-bin binDownload logic for @electron/get implementation
  • Fix: add support for pnpm v11
  • Fix(appimage): add unit tests for applauncher and util, validate env vars, and skip unexpected mime types

26.9.1​

electron-builder 26.9.1

Patch changes

  • Fix: convert file path via vm.toVmFile() in windowsSignAzureManager
  • Fix(nsis): removing windows azure trusted signing preflight checks since TrustedSigning module has its own logging
  • Fix: bundling source files when using extraMetadata.name in Yarn Berry
  • Fix: include workspaceRoot when checking for installed dependencies in installOrRebuild to prevent infinite npm install recursion when install-app-deps runs from a workspace member's postinstall in npm workspaces
  • Fix Windows node module collection failure when spaces are in package manager executable's path
  • Fix: properly resolve package version --> path within pnpm virtual store

electron-updater 6.8.5

Patch changes

  • Fix(electron-updater): filter draft releases in PrivateGitHubProvider.getLatestVersionInfo
  • Fix: GitLab auth token differs between fetching channel yaml & API requests

26.9.0​

electron-builder 26.9.0

Minor changes

  • Feat: pass release notes to GitHub/GitLab release body via releaseBody and releaseName options
  • Feat(nsis): detect windows version and exclude win 7 compatibility logic when not needed
  • Feat: If necessary, start with --no-sandbox

Patch changes

  • Fix: respect electron_builder_binaries_mirror in downloadArtifact
    Details

    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.

    • Extract getBinariesMirrorUrl() to share mirror URL resolution
    • Use the helper in both downloadArtifact() and getBinFromUrl()
    • Ensure custom mirrors are respected for all binary downloads
  • Fix(appimage): use /usr/bin/env in hashbang so it works in non FHS distros
  • Fix: parseNameVersion correctly splits scoped packages with link: paths
  • Fix(normalizePackageData): check bd variable instead of string "bd"
  • Fix(appimage): add entry for patched appimage toolset bundle to resolve issues on Ubuntu 25.1.0

electron-updater 6.8.4

Minor changes

  • Feat: pass release notes to GitHub/GitLab release body via releaseBody and releaseName options

26.8.2​

electron-builder 26.8.2

Patch changes

  • Fix: filter electronLanguages with startsWith filter for generous matching
  • Fix: regenerate schema to unblock CI
  • Fix(win): regenerate app exe if header of the asar has changed so that asar integrity properly matches
  • Fix mksquashfs ENOENT when appimage tool paths are relative
  • Fix(squirrel-windows): remove spurious default vendor warning
  • Fix: handle pnpm deduped dependencies correctly in node module collector

26.8.1​

electron-builder 26.8.1

Patch changes

  • Fix: use package key when reading from dependency list instead of package from to not mislabel package-version strings
  • Chore: add logging summary to end of node collector to flag any special cases/alerts
  • Chore: removing unused notice LogLevel
  • Fix(AppImage): fix mime type directory in AppDir

26.8.0​

electron-builder 26.8.0

Minor changes

  • Feat(win): adding support for latest artifacts for win-codesign tooling to be pulled from electron-builder-binaries
  • Feat: adding support for static appimage runtime via new toolset

Patch changes

  • Refactor: simplify YarnNodeModulesCollector by extending NpmNodeModulesCollector
  • Fix: Windows build failure due to Node.js path with spaces
  • Chore: silence test console logging and throw more helpful error in msiWrapped targetr
  • Chore: allow link: support for package detection to mirror current file: parsing

electron-updater 6.8.3

Patch changes

  • Chore: Remove console logs for autoupdate checks

26.7.0​

electron-builder 26.7.0

Minor changes

  • Feat: add size and shrink options to DmgOptions for explicit DMG filesystem size control
  • Adding optional config property capabilities to AppxOptions (#9436)

Patch changes

  • Chore(deps): update tar again
  • Fix(linux): after-install.tpl: Fix stdio redirects in update-alternative invocation
  • Fix: properly detecting npm duplicate entries and correlating _dependencies property against any duplicated dependencies. (npm collector also covers yarn berry)

electron-updater 6.8.2

Patch changes

  • Fix(updater): ignore releases with non-semver tags when collecting full changelog

26.6.0​

electron-builder 26.6.0

Minor changes

  • Feat(flatpak): use configuration for executableArgs

Patch changes

  • Fix(nsis): allow $INSTDIR to be removed
  • Fix: pnpm collector returning zero modules
  • Feat: update dmgbuild and migrate to portable dmgbuild python bundle. Fixes badge-icon property
  • Chore(deps): updating electron/rebuild, tar, and form-data to latest releases

26.5.0​

electron-builder 26.5.0

Minor changes

  • Feat: add support for dmgbuild's badge-icon configuration

Patch changes

  • Chore: running eslint --fix on more files
  • Chore: fix dmg background by updating vendor dmgbuild
  • Chore: update tar to latest release 7.5.3 to resolve dependabot
  • Fix: Windows build fails with spawn EINVAL after Node.js security fix

electron-updater 6.8.1

Patch changes

  • Chore: running eslint --fix on more files

26.4.1​

electron-builder 26.4.1

Patch changes

  • Fix: post-process parent directories of unpacked files to avoid overeager unpacking
  • Fix: pnpm "Invalid string length" errors during node module collection
  • Fix: delete default macOS appPlist keys using extendInfo when set Nullish
  • Deprecate: warn about implicit publishing in CI
  • Fix: update the dmgbuild hex regex for backgroundColor to be case insensitive
  • Fix: aliased packages not packaged with the correct name
  • Chore: migrating manual Node Module collector to seperate filesystem traversal class

electron-updater 6.8.0

Minor changes

  • Emit download-progress events when downloading with multiple range differential downloader

26.4.0​

electron-builder 26.4.0

Minor changes

  • Feat: allow platform specific build options to override top-level publish configuration

Patch changes

  • Fix: disable corepack strict mode (with optional override) to allow npm list to work on yarn berry and bun project setups
  • Fix: search app directory before package directory to respect two-package.json project setups
  • Chore: The url.parse() function has been deprecated in Node 24. Migrating to url.URL
  • Fix: add signing queue for Windows packager to avoid concurrent signing with AzureTrustedSigning
  • Chore: cleanup logging for node module collectors by detecting non-installed optional deps

26.3.6​

electron-builder 26.3.6

Patch changes

  • Chore: retry cleanup on EBUSY errors
  • Fix: ensure correct dependency graph extraction order and yarn berry _dependencies support

26.3.5​

electron-builder 26.3.5

Patch changes

  • Fix: check if custom nsis and/or nsis resources paths is not purely white space
  • Chore(deps): unpinning semver and updating it for app-builder-lib and electron-updater
  • Fix: validate package version when traversing directories in search of a matching node module

electron-updater 6.7.3

Patch changes

  • Chore(deps): unpinning semver and updating it for app-builder-lib and electron-updater

26.3.4​

electron-builder 26.3.4

Patch changes

  • Fix: only use hardlinks during unit tests to avoid breaking debian builds where /opt is on a different drive
  • Chore: resolve lint-deps issue now that ci-info isn't used
  • Fix: converting all node collector logic from using promise.all to sequential awaits
  • Fix(pkg): support arm64-only MAS submissions by setting correct hostArchitectures in distribution XML
  • Fix: use correct types for makeUniversalApp (e.g. undefined instead of null)"
  • Fix: use projectRoot instead of workspaceRoot for yarn_berry package manager

26.3.3​

electron-builder 26.3.3

Patch changes

  • Fix: double check yarn hoisted mode for each node module - yarn classic doesn't perma-hoist

26.3.2​

electron-builder 26.3.2

Patch changes

  • Perf: optimize duplicate checking in asar packager using Set
  • Fix: returning actual path in hoisted mode for pnpm since it can still return virtual paths
  • Fix: allow home dir when it's symlinked from /var/home

26.3.1​

electron-builder 26.3.1

Patch changes

  • Fix: Use yarn config --json to parse yarn berry (output varies v2-4)
  • Fix: cleanup actool output file handle after spawn
  • Fix: node 14 vs 15+ promisify warning on child_process.exec
  • Fix(dmg): use command -v instead of which for python
  • Fix: install-app-deps missing workspaceRoot for passing projectRootPath into electron/rebuild
  • Chore(deps): update dependency js-yaml to v4.1.1 [security]
  • Fix: properly collect node_modules when they're ESM and we're node>=16
  • Fix: upgrade fpm to 1.17.0

26.3.0​

electron-builder 26.3.0

Minor changes

  • Feat: allowing negative patterns to be provided for signExts as signing overrides
  • Feat: support corepack and packageManager field and add related unit tests
  • Feat: adding bun node_module collector support

Patch changes

  • Fix: fix ci-info import for detecting CI
  • Fix(mac): handle undefined cert password with empty string fallback
  • Chore: bumping version packages of all packages to trigger Trusted Signing provedance release

electron-updater 6.7.2

Patch changes

  • Chore: bumping version packages of all packages to trigger Trusted Signing provedance release

26.2.0​

electron-builder 26.2.0

Minor changes

  • Feat: Allow local nsis-resources via env var ELECTRON_BUILDER_NSIS_RESOURCES_DIR
  • Feat: support Icon Composer icons for macOS

Patch changes

electron-updater 6.7.1

Patch changes

  • Chore: remove "beta" labels from a few features

26.1.0​

electron-builder 26.1.0

Minor changes

  • Feat: Expanding ${arch} macro properly for mac.binaries in case of native node packages for unpacked files for macos universal target
  • Feat: Support gitlab publisher

Patch changes

  • Fix: enhance package manager detection to support Yarn Berry (#9261)
  • Fix: Optional dep's path cannot find in newest npm
  • Chore(deps): updating semver to 7.7.2
  • Fix: removes dynamic eval and utilizes a js helper file for trying await import and require that is then copied into the final npm package
  • Chore(deps): update electron/rebuild to resolve node-gyp dependency issue
  • Fix: incorrect cache name set when ELECTRON_BUILDER_CACHE env var is present

electron-updater 6.7.0

Minor changes

  • Feat: Support gitlab publisher

Patch changes

  • Chore(deps): updating semver to 7.7.2

26.0.20​

electron-builder 26.0.20

Minor changes

  • Fix: implement industry-standard cross-origin redirect auth handling
    Details

    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:

    • Case-insensitive hostname comparison for robust origin detection
    • HTTP→HTTPS upgrade allowance on standard ports (80→443) for backward compatibility
    • Proper default port handling that treats implicit and explicit default ports as equivalent
    • Standards-compliant cross-origin detection following RFC specifications

    Fixes GitHub issue #9207: GitHub release asset downloads failing with 403 Forbidden when redirected from api.github.com to release-assets.githubusercontent.com (Azure backend) or other cloud storage services that don't accept GitHub tokens.

    The implementation now handles all cross-origin redirect scenarios while maintaining compatibility with legitimate same-origin redirects and industry-standard HTTP→HTTPS upgrades.

Patch changes

  • Fix(yarn): check for dependencies in both projectDir and appDir during installation
  • Fix(squirrel-windows): update loadingGif handling to prioritize user-defined option
  • Fix: generate stubExecutableExe and sign it for squirrel.windows using new electron-builder-binaries asset
  • Fix: add quotation marks around variable in AppArmor profile
  • Fix: scrubbing more aggressively anything in the logs that MIGHT be password affiliated (handling spaces in secrets)
  • Fix: fix argument names mismatch in publish command to make it work
  • Fix(nsis): Fix file associations according to the Windows documentation
  • Fix: support option to override PublishPolicy in publish command
  • Feat(github): Add tagNamePrefix option and deprecate vPrefixedTagName
  • Fix detect wrong package manager for two package.json structure
  • Fix(nsis): undefined vars when customCheckAppRunning is defined
  • Fix(app-builder-lib): Change dependency collection to parse from root to better handle monorepos

electron-updater 6.6.8

Minor changes

  • Fix: implement industry-standard cross-origin redirect auth handling
    Details

    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:

    • Case-insensitive hostname comparison for robust origin detection
    • HTTP→HTTPS upgrade allowance on standard ports (80→443) for backward compatibility
    • Proper default port handling that treats implicit and explicit default ports as equivalent
    • Standards-compliant cross-origin detection following RFC specifications

    Fixes GitHub issue #9207: GitHub release asset downloads failing with 403 Forbidden when redirected from api.github.com to release-assets.githubusercontent.com (Azure backend) or other cloud storage services that don't accept GitHub tokens.

    The implementation now handles all cross-origin redirect scenarios while maintaining compatibility with legitimate same-origin redirects and industry-standard HTTP→HTTPS upgrades.

Patch changes

  • Fix(electron-updater): do not use quotes when installing update with sudo
  • Feat(github): Add tagNamePrefix option and deprecate vPrefixedTagName
  • Fix: auto-update powershell script
  • Fix: uncaught exception during differential downloading via multipleRangDownloader

26.0.19​

electron-builder 26.0.19

Patch changes

  • Fix: change installOptions to use npm in yarn PM
  • Fix: remove shell: true from node_modules collector so as to prevent shell console logging from malforming the json output
  • Feat(nsis): terminate only processes running in installation folder
  • Fix(nsis): implement custom function to handle /D parameter with spaces

electron-updater 6.6.7

Patch changes

  • Fix: remove shell: true from node_modules collector so as to prevent shell console logging from malforming the json output
  • Feat(electron-updater): add GitLab provider support

26.0.18​

electron-builder 26.0.18

Patch changes

  • Fix(dmg): resolve dmg flakiness by updating dmgbuild and related python vendor files
  • Feat(nsis): added supports for uninstall components page
  • Feat(nsis): added translation for 'closing app'
  • Fix: upgrade fpm and corresponding portable ruby bundle to resolve build issues on macos
  • Feat: use jiti instead of config-file-ts for loading TypeScript config

electron-updater 6.6.6

Patch changes

  • Feat(updater): Cache the new blockmap file and allow customization of the old blockmap file base URL

26.0.17​

electron-builder 26.0.17

Patch changes

  • Chore: stabilize hdiutil resize by using whole number byte size
  • Fix: don't assume commands end with .cmd on Windows by leveraging which package
  • Chore: wrapping Error in exec rejection so as to pass through error code to downstream logic
  • Chore: adding additional docs to signAndEditExecutable for windows
  • Chore: add additional error stack trace to error message
  • Feat(nsis): add support for more Windows Installer options
  • Refactor: enabling getBin to accept a different repo as a download source (useful for testing)
  • Fix: electronDist when specified a path to an unpacked electron dir
  • Fix: update minimatch to ^10.0.3 to fix downstream issue

26.0.16​

electron-builder 26.0.16

Patch changes

  • Fix(dmg): --force unmount dmg using hdiutil after 3sec delay when receiving error code 16 (resource is busy)
  • Refactor(dmg): add human-readable log messages for hdiutil error codes and refactoring retry logic to only retry on transient error codes
  • Chore(deps): replace is-ci with ci-info
  • Fix(linux): productName should be used as the default value when executableName is not set. (#8766)
  • Test: adding helper function to packageMetadata to accept a relative file:// uri dependency
  • Fix: allow custom electron zip name to be provided when unpacking a provided electronDist

electron-updater 6.6.5

Patch changes

  • Fix: don't error out when trying to determine package manager

26.0.15​

electron-builder 26.0.15

Patch changes

  • Fix(deps): update dependency @electron/osx-sign to v1.3.3
  • Refactor: improve resource directory handling for macOS
  • Fix(deps): update dependency @electron/universal to v2.0.2
  • Refactor: update package manager detection and improve type handling

electron-updater 6.6.4

Patch changes

  • Fix: update regex for multipart content-type parsing in multipleRange
  • Fix: allow forceDevUpdateConfig also on Linux
  • Feat: support upgrading from ARM to ARM, rather than upgrading to x64 in window and linux

26.0.14​

electron-builder 26.0.14

Patch changes

  • Add customNsisResources override to nsis options
  • Chore(asar): use streaming API for electron/asar for constructing asar package
  • Feat: add buildUniversalInstaller option to NSIS portable configuration
  • Chore: migrate fpm packaging from app builder

26.0.13​

electron-builder 26.0.13

Patch changes

  • Fix: malformed Files param when using Azure Trusted Signing
  • Chore(refactor): enable parallel packaging of archs and targets with concurrency config prop
  • Fix(mac): allow ad-hoc identities for codesigning
  • Chore(deps): bump @electron/rebuild to 3.7.1
  • Add information how to use electron-publish s3 with credentials stored in ~/.aws/config file.
  • Chore(deps): updating electron/rebuild to latest 3.7.2
  • Fix: remove implicit dependencies handling
  • Fix: dependency path is undefined

electron-updater 6.6.3

Patch changes

  • Add information how to use electron-publish s3 with credentials stored in ~/.aws/config file.
  • Feat: allow overriding AppUpdater.isStagingMatch
  • Fixed missing lowercase in extension comparison.

26.0.12​

electron-builder 26.0.12

Patch changes

  • Fix: support mas packages for flipping fuses
  • Optimize workspace package resolution in dependency tree
  • Fix: pnpm collection of optional dependencies
  • Chore(docs): Fix typo in SquirrelWindowsOptions
  • Fix: Azure trust signing fails with spaces in parameters

26.0.11​

electron-builder 26.0.11

Patch changes

  • Chore(docs): Document that detectUpdateChannel doesn't work when publishing to github
  • Fix: after-install.tpl: Detect if apparmor is enabled instead of just file-exists check
  • Fix: find cwd using getProjectRootPath for detecting package manager
  • Chore(test): parallel test execution! Updates base Logger to squelch noisy/concurrent logging when VITEST env var and DEBUG=electron-builder are set.

electron-updater 6.6.2

Patch changes

  • Fix: re-export CancellationToken, PackageFileInfo, ProgressInfo, UpdateFileInfo, UpdateInfo from electron-updater

26.0.10​

electron-builder 26.0.10

Patch changes

  • Chore: replace the plist functionality in app-builder-bin with plist
  • Fix: improve atomicRMDir function in NSIS uninstaller
  • Fix: fix custom publisher check and throw error if not found

electron-updater 6.6.1

Patch changes

  • Chore(refactor): refactoring code to reduce cyclical imports in order to migrate to rollup + vite (which have much more strict module resolutions)

26.0.9​

electron-builder 26.0.9

Patch changes

  • Fix: node-linker=hoisted fallback to utilize Npm module collector
  • Fix: remove Promise ability from AsyncEventEmitter as it's impossible to filter listeners by without being async
  • Test: adding fixtures for lockfiles to support --frozen-lockfile (yarn, pnpm) and ci (npm)
  • Fix: allow publishing to Snap Store to be disabled with snap specific publish options
  • Fix: when using osx-sign, specifically pass in identity name instead of hash

26.0.8​

electron-builder 26.0.8

Patch changes

  • Chore: refactor node module collector, extract explicit DependencyTree, update types to be generic and respective to npm list vs pnpm list dependency trees
  • Chore: refactor node module collector to reduce recursion, extract explicit DependencyTree, update types
  • Fix: allow usage of .cjs, .mjs, and type=module custom/generic publishers

26.0.7​

electron-builder 26.0.7

Patch changes

  • Detected circular dependencies and add debug logs for nodeModulesCollector, and refactored YarnNodeModulesCollector to extend NpmNodeModulesCollector.
  • Fix: validate object key before deep assigning
  • Sign the vendor directory instead of using Squirrel.Windows' signing method

electron-updater 6.6.0

Minor changes

  • Fix: Dispatch error in updater if spawnSyncLog fails

26.0.6​

electron-builder 26.0.6

Patch changes

  • Fix: Only update AppArmor profile if not chroot'ed
  • Fix the issue of the missing ms package

26.0.5​

electron-builder 26.0.5

Patch changes

  • Delete peerDepenencies when collecting node modules

26.0.4​

electron-builder 26.0.4

Patch changes

  • Feat: switch app-builder-bin to node-module-collector to get all production node modules

26.0.3​

electron-builder 26.0.3

Patch changes

  • Feat(pkg): support notarizing pkg for macos archives
  • Use electron-winstaller instead of self module

26.0.2​

electron-builder 26.0.2

Patch changes

  • Feat: Allow users to pass a custom electrons headers URL via env var
  • Fix: handle yarn berry patch format in electron-updater version check
  • Fix: upgrading TrustedSigning module and setting it as minimum version instead of required
  • Feat(pkg): support extra component packages (.pkg) for macos archives

electron-updater 6.5.0

Minor changes

  • Feat: add isUpdateAvailable property to checkForUpdates result
  • Feat: add support for custom isUpdateSupported hook for validating UpdateInfo, with fallback to previous minimumSystemVersion logic

26.0.1​

electron-builder 26.0.1

Patch changes

  • Chore: extract common undefined | null to reuse current (unexported) type Nullish. Expose FileMatcher instead of @internal flag
  • Chore: "organize imports" + change ObjectMap => Record for non-external properties (i.e. things that don't get processed for scheme.json)
  • Chore: migrate from BluebirdPromise to vanilla Promise. use tiny-async-pool for setting concurrency limit

electron-updater 6.4.1

Patch changes

  • Chore: extract common undefined | null to reuse current (unexported) type Nullish. Expose FileMatcher instead of @internal flag
  • Chore: "organize imports" + change ObjectMap => 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

  • Support including node_modules in other subdirectories
  • Feat: allowing additional entries in .desktop file, such as [Desktop Actions <actionName>]. Requires changing configuration desktop property to object to be more extensible in the future
  • Chore: remove deprecated fields from winOptions and macOptions
    Details

    For 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 secure

  • Chore: upgrade buildpack-deps base image from focal to jammy. This also forces upgrading python->python3 package and wine-stable
  • Fix: removing conditional logic that would build HFS+ dmg on non-arm64 macs as HFS+ was sunset in macos 15.2

Minor changes

  • Feat: Implement autoupdates for pacman
  • Feat: migrate electronDist to be an electron-builder Hook
  • Feat: migrate to official electron/asar packaging
  • Feat: adding integration with @electron/fuses
  • Feat: add support for AppArmor with template profile and configuration property
  • Add host property to support self-hosted Keygen instances
  • Add forcePathStyle option to S3Options
  • Feat: support completely custom AppxManifest.xml
  • Feat: allow disabling of building a universal windows installer
  • Feat: add pwsh detection to enable azure trusted signing within docker image

Patch changes

  • Chore: change signing warning message to debug
  • Chore(deps): update ejs to v3.1.10
  • Fix: add additional default exclusions to copy logic
  • Chore(deps): update @electron/rebuild to v3.7.0
  • Fix: packages in the workspace not being under node_modules
  • Revert "fix(win): use appInfo description as primary entry for FileDescription" to resolve https://github.com/electron-userland/electron-builder/issues/8599
  • Fix: checking relative path without separator as that doesn't work on Windows
  • Chore(deps): update app-builder-bin to 5.0.0-alpha.11
  • Chore: refactor files for publishing to electron-publish
  • Fix: add quotes to surround file path during azure signing to handle files with spaces
  • Fix: Remove path from published binaries
  • Fix: add rfc3161 timestamp entry as default for azure signing to resolve Windows Defender alert
  • Fix: only sign concurrently when using local signtool. azure can't be in parallel due to resources being locked during usage
  • Chore: refactor electron dist logic to avoid unnecessary console logs
  • Fix(win): add required publisherName field to Azure Trusted Signing
  • Fix: cscIKeyPassword must support empty string arguments
  • Fix: check ResolvedFileSet src when verifying symlinks to be within project directory
  • Fix: use FileCopier for copying files and queue creation of symlinks
  • Chore(deps): update electron/asar to 3.2.17
  • Chore(mac): add back logging of identity name and hash as opposed to just hash
  • Fix(win): corrupt asar integrity file path on crossplatform build
  • Fix(deps): update dependency cross-spawn to v7.0.5 [security]
  • Chore: migrate default recommends and default depends for fpm from app-builder-bin to JS code
  • Fix: smart unpack for local module with dll
  • Fix(deps): update dependency eslint to v9.16.0 [security]
  • Chore: remove stale handler for extend-info in electronMac plist creation
  • Fix: does not work with NPM workspaces
  • Chore: Remove informal Russian messages in the NSIS installer
  • Chore: Rename vmRequired variable to useVmIfNotOnWin
  • Fix: typo in urls in tsdoc
  • Fix: update @electron/asar to 3.2.18 to resolve signing issue with framework symlinks
  • Fix: electron-builder fails when list of node_modules files is too big to pass in a glob
  • Chore(deps): upgrade cross spawn 7.0.6
  • Fix(mac): only fuse macOS universal builds on the combined universal package
  • Fix: ASAR files in extraResources are not included in integrity calculations

electron-updater 6.4.0

Minor changes

  • Feat: Implement autoupdates for pacman
  • Feat(updater): allow usage of autoRunAppAfterInstall on mac updater
  • Add host property to support self-hosted Keygen instances
  • Add forcePathStyle option to S3Options

Patch changes

  • Fix: copyFileSync operation will block the main thread
  • Fix: respect disableDifferentialDownload flag for AppImage
  • Fix(linux): AppImage update fails when filename contains spaces

26.0.0-alpha.11​

electron-builder 26.0.0-alpha.11

Patch changes

  • Fix(mac): only fuse macOS universal builds on the combined universal package
  • Fix: ASAR files in extraResources are not included in integrity calculations

electron-updater 6.4.0-alpha.4

Patch changes

  • Fix(linux): AppImage update fails when filename contains spaces

26.0.0-alpha.10​

electron-builder 26.0.0-alpha.10

Major changes

  • Chore: upgrade buildpack-deps base image from focal to jammy. This also forces upgrading python->python3 package and wine-stable
  • Fix: removing conditional logic that would build HFS+ dmg on non-arm64 macs as HFS+ was sunset in macos 15.2

Minor changes

  • Feat: add pwsh detection to enable azure trusted signing within docker image

Patch changes

  • Chore(deps): upgrade cross spawn 7.0.6

26.0.0-alpha.9​

electron-builder 26.0.0-alpha.9

Major changes

  • Chore: remove deprecated fields from winOptions and macOptions
    Details

    For 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 secure

Minor changes

  • Feat: support completely custom AppxManifest.xml
  • Feat: allow disabling of building a universal windows installer

Patch changes

  • Fix: typo in urls in tsdoc
  • Fix: update @electron/asar to 3.2.18 to resolve signing issue with framework symlinks
  • Fix: electron-builder fails when list of node_modules files is too big to pass in a glob

electron-updater 6.4.0-alpha.3

Patch changes

  • Fix: respect disableDifferentialDownload flag for AppImage

26.0.0-alpha.8​

electron-builder 26.0.0-alpha.8

Minor changes

  • Add host property to support self-hosted Keygen instances
  • Add forcePathStyle option to S3Options

Patch changes

  • Chore: remove stale handler for extend-info in electronMac plist creation
  • Fix: does not work with NPM workspaces
  • Chore: Remove informal Russian messages in the NSIS installer
  • Chore: Rename vmRequired variable to useVmIfNotOnWin

electron-updater 6.4.0-alpha.2

Minor changes

  • Add host property to support self-hosted Keygen instances
  • Add forcePathStyle option to S3Options

26.0.0-alpha.7​

electron-builder 26.0.0-alpha.7

Patch changes

  • Chore(mac): add back logging of identity name and hash as opposed to just hash
  • Fix(win): corrupt asar integrity file path on crossplatform build
  • Fix(deps): update dependency cross-spawn to v7.0.5 [security]
  • Chore: migrate default recommends and default depends for fpm from app-builder-bin to JS code
  • Fix: smart unpack for local module with dll
  • Fix(deps): update dependency eslint to v9.16.0 [security]

26.0.0-alpha.6​

electron-builder 26.0.0-alpha.6

Minor changes

  • Feat: add support for AppArmor with template profile and configuration property

Patch changes

  • Fix: use FileCopier for copying files and queue creation of symlinks
  • Chore(deps): update electron/asar to 3.2.17

26.0.0-alpha.5​

electron-builder 26.0.0-alpha.5

Patch changes

  • Chore: refactor electron dist logic to avoid unnecessary console logs
  • Fix(win): add required publisherName field to Azure Trusted Signing
  • Fix: cscIKeyPassword must support empty string arguments
  • Fix: check ResolvedFileSet src when verifying symlinks to be within project directory

26.0.0-alpha.4​

electron-builder 26.0.0-alpha.4

Patch changes

  • Fix: Remove path from published binaries
  • Fix: add rfc3161 timestamp entry as default for azure signing to resolve Windows Defender alert
  • Fix: only sign concurrently when using local signtool. azure can't be in parallel due to resources being locked during usage

electron-updater 6.4.0-alpha.1

Minor changes

  • Feat(updater): allow usage of autoRunAppAfterInstall on mac updater

Patch changes

  • Fix: copyFileSync operation will block the main thread

26.0.0-alpha.3​

electron-builder 26.0.0-alpha.3

Patch changes

  • Revert "fix(win): use appInfo description as primary entry for FileDescription" to resolve https://github.com/electron-userland/electron-builder/issues/8599
  • Fix: checking relative path without separator as that doesn't work on Windows
  • Chore(deps): update app-builder-bin to 5.0.0-alpha.11
  • Chore: refactor files for publishing to electron-publish
  • Fix: add quotes to surround file path during azure signing to handle files with spaces

26.0.0-alpha.2​

electron-builder 26.0.0-alpha.2

Minor changes

  • Feat: migrate to official electron/asar packaging
  • Feat: adding integration with @electron/fuses

26.0.0-alpha.1​

electron-builder 26.0.0-alpha.1

Patch changes

  • Fix: add additional default exclusions to copy logic
  • Chore(deps): update @electron/rebuild to v3.7.0
  • Fix: packages in the workspace not being under node_modules

26.0.0-alpha.0​

electron-builder 26.0.0-alpha.0

Major changes

  • Support including node_modules in other subdirectories
  • Feat: allowing additional entries in .desktop file, such as [Desktop Actions <actionName>]. Requires changing configuration desktop property to object to be more extensible in the future

Minor changes

  • Feat: Implement autoupdates for pacman
  • Feat: migrate electronDist to be an electron-builder Hook

Patch changes

  • Chore: change signing warning message to debug
  • Chore(deps): update ejs to v3.1.10

electron-updater 6.4.0-alpha.0

Minor changes

  • Feat: Implement autoupdates for pacman

25.1.8​

electron-builder 25.1.8

Patch changes

  • Fix: Path does not end with the package name

25.1.7​

electron-builder 25.1.7

Patch changes

  • Chore(deps): update devDependencies, including typescript
  • Fix: pass in platform to electron-rebuild
  • Fix the main matcher patterns for !node_modules/xxxx
  • Check if the file already starts with a UTF-8 BOM

electron-updater 6.3.9

Patch changes

  • Fix: Unable to copy file for caching: ENOENT
  • Chore(deps): update devDependencies, including typescript

25.1.6​

electron-builder 25.1.6

Patch changes

  • Fix: always produce Release .node builds
  • Fix: add CodeSigningAccountName as required prop in Azure Signing Options
  • Chore(deps): update dependency app-builder-bin to 5.0.0-alpha.10

25.1.5​

electron-builder 25.1.5

Patch changes

  • Fix(chore): upgrading typescript and fixing compiler errors
  • Fix: moving cscInfo logic into signtoolManager to distinguish the logic between custom sign, csc info, and azure signing

electron-updater 6.3.8

Patch changes

  • Fix(chore): upgrading typescript and fixing compiler errors

25.1.4​

electron-builder 25.1.4

Patch changes

  • Chore(docs): updating typedocs by extracting docs from documentation .md files
  • Chore(deps): update dependency https-proxy-agent to v7
  • Chore(deps): update dependency http-proxy-agent to v7
  • Chore(docs): update more docs with proper hyperlinks
  • Fix: force using applicationId if provided before falling back to identityName or app name
  • Fix(deps): update dependency @electron/notarize to v2.5.0

25.1.3​

electron-builder 25.1.3

Patch changes

  • Fix: Fix issues with conflictDependency that have two or more layers
  • Chore(deps): update dependency app-builder-bin to 5.0.0-alpha.9
  • Chore: migrating to typedoc and updating/improving type+interface definitions

electron-updater 6.3.7

Patch changes

  • Chore: migrating to typedoc and updating/improving type+interface definitions

25.1.2​

electron-builder 25.1.2

Patch changes

  • Fix(deploy): redeploy all packages to sync semver ranges

electron-updater 6.3.6

Patch changes

  • Fix(deploy): redeploy all packages to sync semver ranges

25.1.0​

electron-builder 25.1.0

Minor changes

  • Feat: Implement Azure Trusted Signing

Patch changes

  • Chore: improving file path logging to be relative paths when within process.cwd()
  • Chore: update docs to include more interfaces and release configuration
  • Chore: update resedit to 1.7.1
  • Chore(deps): update dependency @electron/notarize to v2.4.0
  • Chore(deps): update dependency app-builder-bin to v5.0.0-alpha.8
  • Fix: correct native dependency tree mismatch in app-builder rebuild
  • Fix: resolveConfig logic ignores .mjs filter
  • Fix(deploy): regenerate lockfile for test package
  • Fix(deploy): attempt to install deps before calculating publish changeset

25.0.6​

electron-builder 25.0.6

Patch changes

  • Fix: retry renaming update file when EBUSY error occurs due to file lock
  • Fix: allow usage of "module" typ config files

electron-updater 6.3.5

Patch changes

  • Fix: retry renaming update file when EBUSY error occurs due to file lock

25.0.5​

electron-builder 25.0.5

Minor changes

  • Feat: allow riscv64 support via custom electron dist

Patch changes

  • Fix: Snap publish regression in pulling publish config

electron-updater 6.3.4

Patch changes

  • Fix: windows signature verification special chars
  • Fix aborted event
  • Update semver to latest

25.0.4​

electron-builder 25.0.4

Patch changes

  • Automatically place .node files into app.asar.unpack
  • Fix: add disableDefaultIgnoredFiles option
  • Fix: return parent dir for local dependency
  • Fix: broken link formatting in the docs

electron-updater 6.3.3

Patch changes

  • Fix: Handle Linux deb auto update installation on applications having spaces in artifactName.
  • Fix: allow custom channel in github provider
  • Fix: handle spaces for all linux package managers

25.0.3​

electron-builder 25.0.3

Patch changes

  • Delete the symlink file when the target is empty
  • Fix: upgrade app-builder-bin with downgraded appimage tool
  • Fix the issue of being unable to sign binary files in the Windows runner on Github Actions

electron-updater 6.3.2

Patch changes

  • Limit concurrent downloads to 1

25.0.2​

electron-builder 25.0.2

Patch changes

  • Fix: adding additional logging when importing/requiring a module in case the hook script is invalid or unable to be executed
  • Chore(deps): update babel monorepo
  • Fix: don't setuid chrome-sandbox when not required
  • Fix: allow enabling tsc lib checking on electron-updater package
  • Fix: checking cancellation token during pack and any retry tasks to exit early on process "cancel"
  • Revert "chore(deps): update dependency mkdocs to <1.7 (#8350)"

electron-updater 6.3.1

Patch changes

  • Fix: allow enabling tsc lib checking on electron-updater package

25.0.1​

electron-builder 25.0.1

Patch changes

  • Fix(deps): update dependency @electron/osx-sign to v1.3.1
  • Fix(mac): disablePreGypCopy: true to handle mac universal builds (fixes #8347)
  • Fix: updating app-builder dependency to resolve #8351
  • Fix: resolve CI flakiness due to lzma-native dependency

25.0.0​

electron-builder 25.0.0

Minor changes

  • Feat: implementing electron/rebuild with config option nativeRebuilder default: legacy to support Yarn 3 (modes: parallel or sequential)
  • Feat: support additionalLightArgs for msi target
  • Feat: add disableSanityCheckAsar to allow encrypted asars
  • Feat: add config options for setting MinVersion and MaxVersionTested fields in appx manifest
  • Feat: export Packager sub-classes from main electron-builder types
  • Use APPLE_TEAM_ID env var when using notarizing with APPLE_ID.
    Details

    Deprecate legacy (altool) notarization API.

  • Feat: add functionality to just publish artifacts
  • Feat: Support for a separate Github publish token to the auto-update token
  • Feat: add afterExtract hook to build process with the same payload interface as beforePack and afterPack
  • Feat(mac): support macos signature additionalArguments parameter
  • Feat: update app-builder-bin to 5.0-alpha release

Patch changes

  • Fix(mac): add retry mechanism in mac code signing for electron/osx-sign.
  • Chore: entering alpha release stage
  • Feat: add minimumSystemVersion in electron updater
  • Chore(deps): update dependency typescript-json-schema to v0.63.0
  • Fix: move disableSanityCheckPackage to within checkFileInPackage to not bypass non-asar usage
  • Fix(win): use appInfo description as primary entry for FileDescription
  • Chore(docs): update Bitbucket Options token doc
  • Fix: order files within asar for smaller incremental updates
  • Fix: unstable hdiutil retry mechanism
  • Fix: replace SYSTEMROOT with $SYSDIR
  • Fix: update autoupdate docs to describe module-based support. set nativeRebuilder default value to use electron/rebuild
  • Should not chmod for 7za when process.env.USE_SYSTEM_7ZA is true
  • Fix: Treat cscLink empty string same as null
  • Feat(linux): add music mac to linux category
  • Chore: update read-config-file dependency
  • Fix(docs): update autoupdate docs noting that channels work with Github
  • Write asar integrity resource on windows
  • Refactored to resolve circular dependency, eliminating warnings from tools such as Rollup
  • Feat(appx): Update identityName for windows 10
  • Fix: @electron/remote wrongly into Windows app.asar
  • Fix: update @electron/notarize to latest version
  • Fix: don't log ignored error when requiring custom publisher
  • Update app-builder to v5.0.0-alpha.4
  • Fix: resolve CI/CD docs generation issue and update schema
  • Fix Folder's named "constructor" not being included in asar
  • Fix: add MemoLazy to fix codeSigningInfo not responding to changed args
  • Chore: update pnpm to 9.4.0
  • Change license file's encode to utf8 with BOM
  • Update binary checking
  • Import builder-util from root instead of out
  • Chore(deps): update dependency typescript to v5.5.3
  • Fix(deps): update dependency minimatch to v10
  • Fix(deps): update dependency read-config-file to v6.4.0
  • Fix(deploy): using pnpm publish cmd line arg to force next tag
  • Fix(docs): fix typo in default glob pattern
  • Fix(deps): update dependency ejs to v3.1.10 [security]
  • Fix(deps): update dependency tar to v6.2.1 [security]
  • Fix: disable broken test, needs further debugging. It's broken on all previous versions of electron-builder, seems MacOS related
  • Fix: disable broken test, needs further debugging. It's broken on all previous versions of electron-builder, seems MacOS related
  • Fix: disable broken test, needs further debugging. It's broken on all previous versions of electron-builder, seems MacOS related
  • Fix(appx): Update identityName validation for windows 10
  • Fix(docs/multi-platform-build.md): broken link of build.sh
  • Fix(deps): update dependency @electron/universal to v2
  • Fix(deps): update dependency @electron/notarize to v2.3.0

electron-updater 6.3.0

Minor changes

  • Feat: adding differential downloader for updates on macOS

Patch changes

  • Fix(mac): revert autoupdate for mac differential
  • Chore: entering alpha release stage
  • Feat: add minimumSystemVersion in electron updater
  • Chore(docs): update Bitbucket Options token doc
  • Fix: unstable hdiutil retry mechanism
  • Fix(docs): update autoupdate docs noting that channels work with Github
  • Refactored to resolve circular dependency, eliminating warnings from tools such as Rollup
  • Fix: verify LiteralPath of update file during windows signature verification
  • Fix: add MemoLazy to fix codeSigningInfo not responding to changed args
  • Chore: update pnpm to 9.4.0
  • Fix(rpm-updater): stop uninstalling app before update
  • Chore(deps): update dependency typescript to v5.5.3

24.13.3​

electron-builder 24.13.3

Patch changes

  • Fix(msi): build emulated arm64 MSI installers as stopgap until electron-builder-binaries wix version is updated
  • Fix(deb): soft symlink instead of hardlink to handle when /opt is on a separate partition
  • Fix(mac): sign NSIS on mac

electron-updater 6.2.0

Minor changes

  • Feat: adding differential downloader for updates on macOS

24.13.2​

electron-builder 24.13.2

Patch changes

  • Fix: execute %SYSTEMROOT% cmd.exe directly during NSIS installer
  • Fix(mac): only skip notarization step when notarize is explicitly false
  • Fix: use pathToFileUrl for hooks for Windows ES module support
  • Fix(pkg): provide BundlePreInstallScriptPath and/or BundlePostInstallScriptPath when a pre/postinstall script is provided to pkg installer

24.13.1​

electron-builder 24.13.1

Patch changes

  • Chore: upgrading connected dependencies (typescript requires higher eslint version)
  • Fix: add dmg-builder and squirrel-windows to peer dependency for pnpm

electron-updater 6.1.9

Patch changes

  • Fix: auto-update powershell script requires reset of PSModulePath
  • Chore: upgrading connected dependencies (typescript requires higher eslint version)

24.13.0​

electron-builder 24.13.0

Minor changes

  • Feat: allow onNodeModuleFile to return a boolean to force include the package to be copied

Patch changes

  • Fix: use CI_COMMIT_TAG instead of CI_BUILD_TAG for Gitlab CI
  • Fix(mac): Update mac notarize keychain env var to be optional
  • Fix(mac): merge fileAssociations with existing CFBundleDocumentTypes if defined in mac.extendInfo
  • Attempt dynamically importing hook as a module if package.json type=module, if fail, fallback to default require
  • Fix(deps): update dependency @electron/universal to v1.5.1
  • Fix(deps): update dependency @electron/notarize to v2.2.1

24.12.0​

electron-builder 24.12.0

Minor changes

  • Mac: Support for a custom 'sign' action

Patch changes

  • Use ~ as pre-release separator for deb targets
  • Use full path to macOS signing utilities

24.11.0​

electron-builder 24.11.0

Minor changes

  • Feat(nsis): add NsisOption to specify selectPerMachineByDefault

Patch changes

  • Fix: notarization with an apple API key
  • Fix(win): product file name is too long causes the find process exe to fail
  • Feat(archive): skip archive when destination file is already up to date
  • Fix(docs/configuration): broken links
  • Fix: update unit test snapshot to account for new package dependency files

electron-updater 6.1.8

Patch changes

  • Feat(nsis): add option to disable differential download

24.10.0​

electron-builder 24.10.0

Minor changes

  • Feat: Enable ESM support for hooks by using dynamic import() when package.json is set to type module.
  • Feat(snap): Use core20 as default base

Patch changes

  • Adding -debug to hdiutil detach for when it fails and attempts a force detach

24.9.4​

electron-builder 24.9.4

Patch changes

  • Chore(docs): Update docs to include msi-wrapped target
  • Fix: pull resultOutputPath from CustomWindowsSignTaskConfiguration (fixes: #7910)
  • Fix macOS app signature when the name contains NFD-normalized characters
  • Allowing test.js in compiled asar to allow testing mechanisms like Playwright
  • Chore: consolidating usages of 7zip-bin to builder-util-runtime so as to execute chmod logic always

24.9.3​

electron-builder 24.9.3

Patch changes

  • Fix dmg build when productName or executableName contains Unicode
  • Fix: pass publish options to snap publisher

24.9.2​

electron-builder 24.9.2

Patch changes

  • Fix notary with pure api key auth
  • Fix macOS app with exectuableName different from productName
  • Fix codesign and DMG layout when productName or executableName contains Unicode

24.9.1​

electron-builder 24.9.1

Patch changes

  • Fix(mac): pass in correct notarize options
  • Docs: update notarization docs in schema
  • Fix: mac notarization issue checking password

24.9.0​

electron-builder 24.9.0

Minor changes

  • Feat: allow api key and keychain to be provided for mac notarization

Patch changes

  • Fix: flatpak build fails due to too large icons
  • Fix: temporarily skip flaky test from transient dependency

24.8.1​

electron-builder 24.8.1

Patch changes

  • Fix: don't notarize mas builds
  • Fix: update @types/node for compat with newest @types/node
  • Fix: compat with newest @types/node
  • Fix(deps): Update 7zip-bin to support Windows on ARM

electron-updater 6.1.7

Patch changes

  • Fix: update @types/node for compat with newest @types/node
  • Fix: compat with newest @types/node

24.8.0​

electron-builder 24.8.0

Minor changes

  • Fix: support executableName in main config

Patch changes

  • Fix: run nsis and portable builds sequentially. fixes #7791
  • Minor addition to docs for snap. add snap recommended core22 option.
  • Minor addition to docs for snap publishing. add snapcraft link to local and cd auth options
  • Fix(nsis): display product names with an & properly

electron-updater 6.1.6

Patch changes

  • Minor addition to docs for snap publishing. add snapcraft link to local and cd auth options

24.7.0​

electron-builder 24.7.0

Minor changes

  • Feat: add customUnWelcomePage macro for NSIS installers

Patch changes

  • Fix: exclude electron-builder.env from app to avoid packaging env secrets
  • Fix: expand macro for ${version}/.icon-ico/ dir on Window's installers
  • Fix: Extract NotarizeNotaryOptions and NotarizeLegacyOptions to explicitly define required vars

24.6.5​

electron-builder 24.6.5

Patch changes

  • Fix(mac): fix errors using native modules that require rebuild when both mas and mac targets are specified
  • Fix(mac): Validate the usage boundary of iconTextSize (#7769)

electron-updater 6.1.5

Patch changes

  • Fix: When error code is ENOENT, try to use electron.shell.openPath to run installer on Windows

24.6.4​

electron-builder 24.6.4

Patch changes

  • Chore(deps): updating @electron notarize, osx-sign, and universal packages and pinning versions
  • Fix: Only schedule upload for unique files after afterAllArtifactBuild
  • Chore: updating @electron/osx-sign to latest version to handle preAutoEntitlements
  • Fix(docs): typos in CONTRIBUTING.md
  • Fix: adding IMAGE_VERSION arg for docker node image so that it force rebuilds when pnpm is updated on any date

24.6.3​

electron-builder 24.6.3

Patch changes

  • Fix: allow explicit configuration on what additional files to sign. Do not sign .node files by default

24.6.2​

electron-builder 24.6.2

Patch changes

  • Fix: add back missing createLazyProductionDeps that was missed during revert

electron-updater 6.1.4

Patch changes

  • Fix: check null for isCustomChannel in GitHubProvider.ts

24.6.1​

electron-builder 24.6.1

Patch changes

  • Fix: reverting migration to electron-rebuild to resolve native prebuilt modules issue
  • Fix: updating simple-update-notifier version to resolve vulnerability

24.6.0​

electron-builder 24.6.0

Minor changes

  • Feat: Added support for overriding ‘preAutoEntitlements’ for electron/osx-sign

Patch changes

  • Fix: use nullish coalescing operator for hardenedRuntime default value
  • Fix: re-enable changeDir step for assisted, perMachine installs

24.5.2​

electron-builder 24.5.2

Patch changes

  • Fix(linux): make semver pre-release versions valid for "pacman" and "rpm" target

electron-updater 6.1.3

Patch changes

  • Fix: trigger app.relaunch() if isForceRunAfter = true for (beta) deb and rpm updaters
  • Fix: change typed-emitter to tiny-typed-emitter to remove rxjs dependency

24.5.1​

electron-builder 24.5.1

Patch changes

  • Fix(mac): use Identity hash instead of name if it exists
  • Fix: use electron/rebuild Rebuilder directly for cross-platform builds
  • Fix: resolve unstable unit test that is on latest mac

electron-updater 6.1.2

Patch changes

  • Fix: removing stdio from spawnSync to fix crash on rpm/deb updaters

24.5.0​

electron-builder 24.5.0

Minor changes

  • Added env variable for 7z filter

Patch changes

  • Fix(nsis): Ensure application name sub-folder on fresh installs.
  • Fix(mac): wrap hdiutil detach in retry w/ backoff
  • Fix: Allow building MAS and dmg targets with different appId

electron-updater 6.1.1

Patch changes

  • Fix: default file name of update.${fileExtension} for downloaded files in private repositories.

24.4.0​

electron-builder 24.4.0

Minor changes

  • Add ability to specify recommended deb dependencies

Patch changes

  • Fix missing @types dependencies for output d.ts files
  • When using the msiWrapped target, allow the nsis target to be capitalized in the configuration file

24.3.0​

electron-builder 24.3.0

Minor changes

  • Display "Space required" text for NSIS installer

Patch changes

  • Chore: Update @electron/rebuild
  • Update link to fpm docs

electron-updater 6.1.0

Minor changes

  • Feat: nsis install method - exposed as public to avoid quit the app for the install

Patch changes

  • Fix differential downloads when the server compresses the blockmap file HTTP response

24.2.1​

electron-builder 24.2.1

Patch changes

  • Use update-alternatives when available.
    Details

    What is changing?

    Test for 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?

    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.

    How should this be consumed?

    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.

  • Update @electron/rebuild to version ^3.2.11 and account for the new folder structure of the package.

electron-updater 6.0.4

Patch changes

  • Fix: handle errors on responses in differential download (#2398)

24.2.0​

electron-builder 24.2.0

Minor changes

  • Feat: Moved electronLanguages to global config to support win/linux

electron-updater 6.0.3

Patch changes

  • Fixed error handling when launching updater (fixes NSIS updates when isAdminRightsRequired is incorrectly set to false)

24.1.3​

electron-builder 24.1.3

Patch changes

  • Fix: "Can't reconcile two non-macho files" due to disablePreGypCopy functionality in new electron/rebuild integration

24.1.2​

electron-builder 24.1.2

Patch changes

  • Removed DefinitelyTyped dependencies from production dependencies list
  • Fix: utilizing frameworkInfo as primary manner of fetching electron version for installation. (fixes: #7494)

electron-updater 6.0.2

Patch changes

  • Fix: NsisUpdater - only resolving true if pid !== undefined
  • Removed DefinitelyTyped dependencies from production dependencies list

24.1.1​

electron-builder 24.1.1

Patch changes

  • Fix: removing ffmpeg dependency due to dependency vulnerability

24.1.0​

electron-builder 24.1.0

Minor changes

  • Feat: Adding new downloadAlternateFFmpeg option to download non-proprietary ffmpeg library

Patch changes

  • Fix(arm64): use RPM architecture aarch64 in name
  • Fix: updating SignOptions to leverage optionsForFile for entitlements
  • Fix: missing quote syntax error in nsis uninstaller
  • Fix: missing quote syntax error in nsis uninstaller

24.0.0​

electron-builder 24.0.0

Major changes

  • Fix: Migrate to electron-rebuild for handling native dependencies
  • Extending linux executableArgs option to be utilized for Snap target
  • Add base option for snapcraft
  • Remove spctl check from Mac notarization step
  • Remove extra adapter field if core22 is set as base for snapcraft
  • Fix(BREAKING): Execute afterSign hook only when signing is completed, otherwise skip
  • Fix: Execute afterSign hook only when signing is complete (i.e. if the signing step wasn't explicitly skipped) (BREAKING)

Minor changes

  • Feat: enabling typescript config files (i.e. electron-builder.ts)
  • Feat(nsis): add ShutdownBlockReasonCreate for blocking Windowns Shutdown alert/prompt
  • Feat: Introducing deb and rpm auto-updates as beta feature
  • Feat: integrating @electron/notarize into mac signing flow
  • Added the accelerate option to handle accelerated s3 buckets
  • Update MacOS signOptions on macPackager
  • Feat: optional vendor information in releaseInfo
  • Feat: Support mjs files for lifecycle operations

Patch changes

  • Docs: Warn users not to disable zip for macos if using auto-update
  • Allow non-semver version formats on Windows
  • Chore(dep): upgrading typescript and eslint dependencies
  • Fix: Using electron-rebuild for finding project root for native node addons to correctly handle monorepo setups
  • Chore(deps): Updating dependencies and fixing pnpm audit with dependency overrides
  • Fix: get CI tag in GitHub Actions
  • Fixes a bug where signtool might not be used in a windows VM
  • Fix(app-builder-lib): export missing TS types
  • Chore: Update dependencies per audit/outdated
  • Fix: Ensure parent directories of symlinks are created when copied directory only contains symlinks
  • Fix: add missing html extension for multi language license files in nsis target
  • Fix: re-add --identifier to mac pkg build to address issue #7348
  • Docs: replaced 'access token' with 'app password' from BitbucketOptions
  • Fix: Allow MAS builds to be unsigned if identity: null is explicitly passed
  • Fix: MAS builds should respect arch suffix per defaultArch config
  • Fix: reset GYP_MSVS_VERSION for multi-arch builds before beforePack
  • Feat: Allow for NSIS windows installer to be wrapped in an MSI
  • Fix: enable signing of .node modules in order to support WDAC
  • Fix: report the correct status result when doSign exits early from macPackager and winPackager. Updated function definition to return Promise<boolean> to properly flag intellisense
  • Fix packager: return success status from doSign function calls
  • Fix(packager): return success status from doSign function calls
  • Revert "feat: Support mjs files for lifecycle operations"
  • Fix: Removing file size from BuildTest smart unpack
  • Fix: update docs for updated electron API
  • Fix: enable signing of .node modules in order to support WDAC
  • Fix(docs): PlatformSpecificBuildOptions.md broken link
  • Fix: incorrect html comment in issue_template.md

electron-updater 6.0.0

Major changes

  • Fix: use appropriate electron-updater cache directory on macOS

Minor changes

  • Feat: Introducing deb and rpm auto-updates as beta feature
  • Added the accelerate option to handle accelerated s3 buckets
  • Feat: Provide a custom verify function interface to enable nsis signature verification alternatives instead of powershell

Patch changes

  • Chore(dep): upgrading typescript and eslint dependencies
  • Chore(deps): Updating dependencies and fixing pnpm audit with dependency overrides
  • Fix: support powershell constrained language mode
  • Chore: Update dependencies per audit/outdated
  • Docs: replaced 'access token' with 'app password' from BitbucketOptions
  • Fix: add reject in handleError in Windows verifySignature function
  • Fix: inherit stdio for updated processes (#7393)