apps/desktop/electron-forge/dmg-background/README.md
background.png / [email protected] (and the -dev nightly pair) are the Finder-window background
of the mounted .dmg — the drag the app into Applications screen. Wired into the @electron-forge/maker-dmg
config in electron-forge/forge.config.ts (background + contents + window).
Generated from background.html; don't edit the PNGs by hand. Change the HTML and regenerate:
pnpm --filter desktop generate-dmg-background
Runs on any OS (headless Chromium via the repo's @playwright/test) — but the DMG itself can only be
built and visually verified on macOS (appdmg is os: [darwin] and isn't installed elsewhere). The
contents icon coordinates in forge.config.ts are a best effort matched to the artwork; fine-tune
them on a real macOS build.
preview.png (stable) and preview-dev.png (nightly) are faithful mocks of the assembled Finder window:
the real app icon (icon.icns / icon-dev.icns) and the real macOS Applications-folder icon composited at
the same contents coordinates the DMG uses, under a reconstructed Finder title bar, with the captions
Finder draws. On macOS the icons are rendered from their .icns via sips (pixel-perfect); off macOS it
falls back to the flat logo and a drawn folder so the script still runs anywhere. They are reference
only — appdmg never uses them (it only reads background.png/@2x). Kept reproducible from source so
they aren't mystery images; regenerate with pnpm --filter desktop generate-dmg-preview.
@2x for Retina. appdmg auto-packages background.png and [email protected] into a
multi-resolution TIFF. Finder is Retina-aware (unlike Squirrel's loading window), so it renders crisp.icvp icon-view plist appdmg/ds-store write exposes only icon size, positions,
window size, and background), and appdmg can't ship separate dark/light backgrounds (only tools like
DropDMG can). That black caption colour is why the surface is light (see Design) — the captions read
on their own, with no per-label trick needed.apps/client/src/setup.css, light
theme): soft indigo/purple/blue radial glows over the near-white left-pane base (#f2f2f2). The light
surface keeps Finder's forced-black captions legible on their own. The same gradient is used for both
channels. The drag arrow is a muted neutral grey, kept quiet so it doesn't compete with the icons./Applications alias on the
right, with the drag arrow between them. Their centers must line up with the contents coordinates
in forge.config.ts, which use a top-left origin, y increasing downward, with (x, y) the icon
center — Finder's .DS_Store Iloc convention (confirmed by appdmg's own example, where y: 344 sits
near the bottom of the window). So the contents y is measured from the top, not windowHeight - y.
contents uses y = 182, centering the icon + caption pair vertically now that no banner sits above
them; Finder draws the captions at ~y = 262.Nightly badge on the nightly background (background-dev.png),
centered under the app icon just below where Finder draws the app caption (~y = 282). Stable ships no
baked text at all, so there is no localized instruction line — the arrow conveys the action.background.png is 640 × 400, [email protected] is 1280 × 800.iconSize 128; app icon centered at (180, 182), Applications at (460, 182) in top-left coords —
keep in sync with the contents in the maker config (and the nightly badge position in background.html).