From 4ba300eeb61eb2c943e31c1f479e208d008f1e92 Mon Sep 17 00:00:00 2001 From: RobbieMinderhoud Date: Mon, 23 Feb 2026 10:57:58 +0100 Subject: [PATCH 1/8] fix(dmg): use APFS as default filesystem for DMG builds - # --- packages/dmg-builder/src/dmgUtil.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dmg-builder/src/dmgUtil.ts b/packages/dmg-builder/src/dmgUtil.ts index 927aa473f04..07a05c8f97f 100644 --- a/packages/dmg-builder/src/dmgUtil.ts +++ b/packages/dmg-builder/src/dmgUtil.ts @@ -132,7 +132,7 @@ export async function customizeDmg({ appPath, artifactPath, volumeName, specific "text-size": iconTextSize, "compression-level": Number(process.env.ELECTRON_BUILDER_COMPRESSION_LEVEL || "9"), - // filesystem: specification.filesystem || "HFS+", + filesystem: specification.filesystem || "APFS", format: specification.format, size: specification.size, shrink: specification.shrink, From 3290188f109d1a43cb2d5c3466d585c475500305 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Tue, 24 Feb 2026 06:10:39 -0800 Subject: [PATCH 2/8] Create rude-bottles-walk.md --- .changeset/rude-bottles-walk.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/rude-bottles-walk.md diff --git a/.changeset/rude-bottles-walk.md b/.changeset/rude-bottles-walk.md new file mode 100644 index 00000000000..65509b00269 --- /dev/null +++ b/.changeset/rude-bottles-walk.md @@ -0,0 +1,5 @@ +--- +"dmg-builder": patch +--- + +fix(dmg): use APFS as default filesystem for DMG builds due to incompatibilities on latest MacOS w/ HFS+ From d111bd0177f55145b2f5a9443e3ec91062ed155c Mon Sep 17 00:00:00 2001 From: RobbieMinderhoud Date: Wed, 11 Mar 2026 17:31:25 +0100 Subject: [PATCH 3/8] fix(dmg): add filesystem to DmgOptions for tsc - # --- packages/app-builder-lib/src/options/macOptions.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/app-builder-lib/src/options/macOptions.ts b/packages/app-builder-lib/src/options/macOptions.ts index a8754081ed6..dcf0b8798b2 100644 --- a/packages/app-builder-lib/src/options/macOptions.ts +++ b/packages/app-builder-lib/src/options/macOptions.ts @@ -293,6 +293,12 @@ export interface DmgOptions extends TargetSpecificOptions { */ format?: "UDRW" | "UDRO" | "UDCO" | "UDZO" | "UDBZ" | "ULFO" + /** + * The filesystem for the DMG volume (e.g. `"APFS"` or `"HFS+"`). APFS is the default and recommended on macOS 10.13+. + * @default APFS + */ + readonly filesystem?: string | null + /** * The initial size of the DMG filesystem. Accepts the same syntax as the `-size` argument to `hdiutil`, e.g. `"150m"`, `"4g"`. * If not specified, the size is calculated automatically. From ed7bbd8bfba0148023dbf0a0e032eac7db2bf53c Mon Sep 17 00:00:00 2001 From: RobbieMinderhoud Date: Thu, 12 Mar 2026 09:26:20 +0100 Subject: [PATCH 4/8] fix: default APFS when building dmg - # --- packages/dmg-builder/src/dmg.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dmg-builder/src/dmg.ts b/packages/dmg-builder/src/dmg.ts index 9366636f922..cf84590422c 100644 --- a/packages/dmg-builder/src/dmg.ts +++ b/packages/dmg-builder/src/dmg.ts @@ -159,7 +159,7 @@ export class DmgTarget extends Target { // public to test async computeDmgOptions(appPath: string): Promise { const packager = this.packager - const specification: DmgOptions = { ...this.options } + const specification: DmgOptions = { ...this.options, filesystem: this.options.filesystem ?? "APFS" } if (specification.icon == null && specification.icon !== null) { specification.icon = await packager.getIconPath() } From 788ad20f329aa308c33a3976cfc8c4acb9c693f7 Mon Sep 17 00:00:00 2001 From: RobbieMinderhoud Date: Thu, 12 Mar 2026 09:26:40 +0100 Subject: [PATCH 5/8] fix: dmg test expecting APFS filesystem type - # --- test/snapshots/mac/dmgTest.js.snap | 1 + 1 file changed, 1 insertion(+) diff --git a/test/snapshots/mac/dmgTest.js.snap b/test/snapshots/mac/dmgTest.js.snap index db0ba394b9b..530e550bdfc 100644 --- a/test/snapshots/mac/dmgTest.js.snap +++ b/test/snapshots/mac/dmgTest.js.snap @@ -160,6 +160,7 @@ exports[`dmg > background color 1`] = ` "y": 220, }, ], + "filesystem": "APFS", "format": "UDRO", "title": "Bar", "writeUpdateInfo": false, From af670449a1088abd9f06823ff3a5f35d60c7d3c6 Mon Sep 17 00:00:00 2001 From: Mike Maietta Date: Thu, 12 Mar 2026 16:32:12 -0700 Subject: [PATCH 6/8] chore: updating schema for new property --- packages/app-builder-lib/scheme.json | 8 ++++++++ packages/electron-publish/src/gitlabPublisher.ts | 4 +--- packages/electron-publish/src/util.ts | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/app-builder-lib/scheme.json b/packages/app-builder-lib/scheme.json index 2eadec7b1cc..41a988dd749 100644 --- a/packages/app-builder-lib/scheme.json +++ b/packages/app-builder-lib/scheme.json @@ -898,6 +898,14 @@ }, "type": "array" }, + "filesystem": { + "default": "APFS", + "description": "The filesystem for the DMG volume (e.g. `\"APFS\"` or `\"HFS+\"`). APFS is the default and recommended on macOS 10.13+.", + "type": [ + "null", + "string" + ] + }, "format": { "default": "UDZO", "description": "The disk image format. `ULFO` (lzfse-compressed image (OS X 10.11+ only)).", diff --git a/packages/electron-publish/src/gitlabPublisher.ts b/packages/electron-publish/src/gitlabPublisher.ts index ceedfa3d84e..ce210a99acf 100644 --- a/packages/electron-publish/src/gitlabPublisher.ts +++ b/packages/electron-publish/src/gitlabPublisher.ts @@ -121,9 +121,7 @@ export class GitlabPublisher extends HttpPublisher { const releaseName = this.releaseName || defaultName const branchName = await this.getDefaultBranch() - const description = this.releaseBody - ? trimStringWithWarn(this.releaseBody, 100000, "release body exceeds GitLab limit, truncating") - : `Release ${releaseName}` + const description = this.releaseBody ? trimStringWithWarn(this.releaseBody, 100000, "release body exceeds GitLab limit, truncating") : `Release ${releaseName}` const releaseData = { tag_name: this.tag, diff --git a/packages/electron-publish/src/util.ts b/packages/electron-publish/src/util.ts index 1d072bdca54..2a1db98a3d8 100644 --- a/packages/electron-publish/src/util.ts +++ b/packages/electron-publish/src/util.ts @@ -6,4 +6,4 @@ export const trimStringWithWarn = (str: string, maxLength: number, warnMessage: } log.warn({ length: str.length, maxLength }, warnMessage) return str.substring(0, maxLength) -} \ No newline at end of file +} From eed4f832fca0e832e70f49ee53d8b40ef779bd9c Mon Sep 17 00:00:00 2001 From: RobbieMinderhoud Date: Fri, 13 Mar 2026 10:09:55 +0100 Subject: [PATCH 7/8] fix: APFS dmgTest.ts - # Increased test size, APFS could result in a larger build. --- test/src/mac/dmgTest.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/mac/dmgTest.ts b/test/src/mac/dmgTest.ts index eb8eb0c8c49..d3b3ba28de3 100644 --- a/test/src/mac/dmgTest.ts +++ b/test/src/mac/dmgTest.ts @@ -127,9 +127,9 @@ describe.heavy.ifMac("dmg", { sequential: true }, () => { const totalBytes = stats.bsize * stats.blocks // 500m should give ~524,288,000 bytes (500 * 1024 * 1024) - // Allow margin for filesystem overhead (450MB to 600MB) + // Allow margin for filesystem overhead (450MB to 700MB). const minBytes = 450 * 1024 * 1024 - const maxBytes = 600 * 1024 * 1024 + const maxBytes = 700 * 1024 * 1024 expect(totalBytes).toBeGreaterThan(minBytes) expect(totalBytes).toBeLessThan(maxBytes) From c252a2cc1e1c299ee0e74ff57f09ea4df8171806 Mon Sep 17 00:00:00 2001 From: RobbieMinderhoud Date: Mon, 16 Mar 2026 09:59:50 +0100 Subject: [PATCH 8/8] =?UTF-8?q?fix:=20update=20dmgTest.ts=20to=20accommoda?= =?UTF-8?q?te=20APFS=20block=20sizing=20-=20expanded=20size=20range=20to?= =?UTF-8?q?=20450MB=E2=80=931GB=20-=20#?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/src/mac/dmgTest.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/src/mac/dmgTest.ts b/test/src/mac/dmgTest.ts index d3b3ba28de3..d2a7516b531 100644 --- a/test/src/mac/dmgTest.ts +++ b/test/src/mac/dmgTest.ts @@ -127,9 +127,10 @@ describe.heavy.ifMac("dmg", { sequential: true }, () => { const totalBytes = stats.bsize * stats.blocks // 500m should give ~524,288,000 bytes (500 * 1024 * 1024) - // Allow margin for filesystem overhead (450MB to 700MB). + // Allow margin for filesystem overhead. APFS can report larger sizes than HFS+ due to + // different block sizing and allocation, so use a wide range (450MB–1GB). const minBytes = 450 * 1024 * 1024 - const maxBytes = 700 * 1024 * 1024 + const maxBytes = 1024 * 1024 * 1024 expect(totalBytes).toBeGreaterThan(minBytes) expect(totalBytes).toBeLessThan(maxBytes)