You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Accessed your website via a M5 MBP. Clicked download. It downloaded the x64 instead of arm version of app. Not sure if x64 is universal, but it was confusing nonetheless. Had to go to github to grab amd specifically.
Steps to reproduce
Accessed your website via a M5 MBP. Clicked download. It downloaded the x64 instead of arm version of app. Not sure if x64 is universal, but it was confusing nonetheless. Had to go to github to grab amd specifically.
Confirming the setup first: the x64 DMG is a separate Intel-only build, not a universal binary — release-desktop.yml:70-81 copies each per-arch DMG to a stable Superset-<arch>.dmg name, and electron-builder.ts builds per-arch mac targets. So downloading Superset-x64.dmg on an Apple Silicon Mac gets you a Rosetta-translated app, which is a real (if silent) degradation, not just a naming confusion.
Where the choice is made
Only one place on the site can ever hand out the x64 DMG: the download interstitial at superset.sh/download.
apps/marketing/src/app/[lang]/components/DownloadButton/DownloadButton.tsx:44-47 — every download CTA just routes to /download; it doesn't pick a URL.
apps/marketing/src/app/[lang]/download/components/DownloadInterstitial/DownloadInterstitial.tsx:19-23 — macUrlFor() returns DOWNLOAD_URL_MAC_X64 iff the detected platform is Platform.MacIntel, otherwise arm64. It's used both for the auto-redirect (:36-47) and the "download now" fallback link (:114).
packages/shared/src/constants.ts:62-63 — the two URLs.
For contrast, the download buttons in the web app (app.superset.sh) hardcode arm64 — apps/web/src/app/(agents)/agents/page.tsx:73 and apps/web/src/app/(dashboard-legacy)/settings/billing/page.tsx:63 — so they can't produce this. The issue form says "Web app (app.superset.sh)" but the described flow (clicked download → got x64) matches the marketing interstitial. Worth confirming which host it was.
Suspected root cause
detectMacArch() in apps/marketing/src/app/[lang]/hooks/useOS/useOS.ts:18-43 infers CPU architecture from the WebGL unmasked renderer string, and treats "renderer string doesn't contain apple" as proof of Intel:
Every genuine failure path already falls back to Apple Silicon (:30, :32, :36, :41), so a missing extension isn't what bit this reporter. The bug is the last branch: a renderer string that is present but not the real GPU is silently classified as Intel. That happens on Apple Silicon whenever:
the browser masks or randomizes WEBGL_debug_renderer_info for fingerprinting resistance (Brave's farbling returns a generic/Google string by default; Firefox with privacy.resistFingerprinting);
hardware acceleration is off or the GPU is blocklisted, so WebGL falls back to a software renderer (SwiftShader, llvmpipe, ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device ...))) — none of which contain "apple";
the page runs in a VM, remote/screen-shared session, or a browser launched with --disable-gpu.
The heuristic is also on borrowed time: WEBGL_debug_renderer_info was removed in Safari 17 and is deprecated in Chromium, and GPU model is a poor proxy for CPU arch regardless. Note also that the fallback direction is now backwards from reality — Apple hasn't shipped an Intel Mac since 2023, so "unknown" should mean arm64 and Intel should require positive evidence.
Reproduction
Manual, no Intel hardware needed:
On an Apple Silicon Mac, launch Chrome with --disable-gpu (or turn off Settings → System → Use graphics acceleration when available), or use Brave with default Shields.
Visit https://superset.sh/download.
Observe Superset-x64.dmg downloads. Check chrome://gpu or evaluate the renderer string in the console to see what detectMacArch saw.
Unit-level sketch (detectMacArch is currently module-private, so this needs it exported, or test through usePlatform with a stubbed navigator.userAgent):
test("software renderer on Apple Silicon is not classified as Intel",()=>{stubWebGLRenderer("ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (Subzero)), SwiftShader driver)");expect(detectMacArch()).toBe(Platform.MacAppleSilicon);});
There are no tests for useOS.ts today — adding a table of real renderer strings (Apple Metal, Intel Iris, SwiftShader, masked/empty) would pin this down. The download_started event already carries platform (DownloadInterstitial.tsx:42), so the analytics split between mac-intel and mac-apple-silicon should show how often this fires in the wild; a share materially above the real Intel Mac population confirms it.
Suggested fix direction
Primary signal: UA-Client Hints. In Chromium, await navigator.userAgentData.getHighEntropyValues(["architecture"]) returns "arm" / "x86" directly and isn't affected by GPU state. It's async, which fits the existing useEffect in usePlatform (useOS.ts:73-75).
Invert the WebGL fallback so it only reports Intel on a positive match (/intel|amd|radeon|nvidia|geforce/), defaulting to arm64 for anything unrecognized, masked, or software-rendered. This alone fixes the reported case.
Always offer the escape hatch. The interstitial's non-waitlist branch (DownloadInterstitial.tsx:100-125) should carry an explicit "Intel Mac? Get the x64 build" / "Apple Silicon build" link so detection being wrong is a one-click recovery rather than a trip to GitHub Releases — apps/docs/content/docs/install.mdx:17 already does this.
Longer term, a universal DMG (mac.target with arch: ["universal"] in apps/desktop/electron-builder.ts:113-140) removes the guess entirely, at the cost of artifact size and a change to the release-artifact renaming in release-desktop.yml:70-81.
Activity
github-actions commentedon Aug 31, 2026
Confirming the setup first: the x64 DMG is a separate Intel-only build, not a universal binary —
release-desktop.yml:70-81copies each per-arch DMG to a stableSuperset-<arch>.dmgname, andelectron-builder.tsbuilds per-arch mac targets. So downloadingSuperset-x64.dmgon an Apple Silicon Mac gets you a Rosetta-translated app, which is a real (if silent) degradation, not just a naming confusion.Where the choice is made
Only one place on the site can ever hand out the x64 DMG: the download interstitial at
superset.sh/download.apps/marketing/src/app/[lang]/components/DownloadButton/DownloadButton.tsx:44-47— every download CTA just routes to/download; it doesn't pick a URL.apps/marketing/src/app/[lang]/download/components/DownloadInterstitial/DownloadInterstitial.tsx:19-23—macUrlFor()returnsDOWNLOAD_URL_MAC_X64iff the detected platform isPlatform.MacIntel, otherwise arm64. It's used both for the auto-redirect (:36-47) and the "download now" fallback link (:114).packages/shared/src/constants.ts:62-63— the two URLs.For contrast, the download buttons in the web app (
app.superset.sh) hardcode arm64 —apps/web/src/app/(agents)/agents/page.tsx:73andapps/web/src/app/(dashboard-legacy)/settings/billing/page.tsx:63— so they can't produce this. The issue form says "Web app (app.superset.sh)" but the described flow (clicked download → got x64) matches the marketing interstitial. Worth confirming which host it was.Suspected root cause
detectMacArch()inapps/marketing/src/app/[lang]/hooks/useOS/useOS.ts:18-43infers CPU architecture from the WebGL unmasked renderer string, and treats "renderer string doesn't containapple" as proof of Intel:Every genuine failure path already falls back to Apple Silicon (
:30,:32,:36,:41), so a missing extension isn't what bit this reporter. The bug is the last branch: a renderer string that is present but not the real GPU is silently classified as Intel. That happens on Apple Silicon whenever:WEBGL_debug_renderer_infofor fingerprinting resistance (Brave's farbling returns a generic/Google string by default; Firefox withprivacy.resistFingerprinting);SwiftShader,llvmpipe,ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device ...))) — none of which contain "apple";--disable-gpu.The heuristic is also on borrowed time:
WEBGL_debug_renderer_infowas removed in Safari 17 and is deprecated in Chromium, and GPU model is a poor proxy for CPU arch regardless. Note also that the fallback direction is now backwards from reality — Apple hasn't shipped an Intel Mac since 2023, so "unknown" should mean arm64 and Intel should require positive evidence.Reproduction
Manual, no Intel hardware needed:
--disable-gpu(or turn off Settings → System → Use graphics acceleration when available), or use Brave with default Shields.https://superset.sh/download.Superset-x64.dmgdownloads. Checkchrome://gpuor evaluate the renderer string in the console to see whatdetectMacArchsaw.Unit-level sketch (
detectMacArchis currently module-private, so this needs it exported, or test throughusePlatformwith a stubbednavigator.userAgent):There are no tests for
useOS.tstoday — adding a table of real renderer strings (Apple Metal, Intel Iris, SwiftShader, masked/empty) would pin this down. Thedownload_startedevent already carriesplatform(DownloadInterstitial.tsx:42), so the analytics split betweenmac-intelandmac-apple-siliconshould show how often this fires in the wild; a share materially above the real Intel Mac population confirms it.Suggested fix direction
await navigator.userAgentData.getHighEntropyValues(["architecture"])returns"arm"/"x86"directly and isn't affected by GPU state. It's async, which fits the existinguseEffectinusePlatform(useOS.ts:73-75)./intel|amd|radeon|nvidia|geforce/), defaulting to arm64 for anything unrecognized, masked, or software-rendered. This alone fixes the reported case.DownloadInterstitial.tsx:100-125) should carry an explicit "Intel Mac? Get the x64 build" / "Apple Silicon build" link so detection being wrong is a one-click recovery rather than a trip to GitHub Releases —apps/docs/content/docs/install.mdx:17already does this.mac.targetwitharch: ["universal"]inapps/desktop/electron-builder.ts:113-140) removes the guess entirely, at the cost of artifact size and a change to the release-artifact renaming inrelease-desktop.yml:70-81.fix(marketing): stop inferring Mac CPU arch from the WebGL renderer
fix(marketing): stop inferring Mac CPU arch from the WebGL renderer
fix(marketing): stop inferring Mac CPU arch from the WebGL renderer
fix(marketing): stop inferring Mac CPU arch from the WebGL renderer (P…