"There's no universal installer. Each OS expects its own package — and generally wants to be built on its own kind of machine."
The Native Formats
Each desktop OS has installer formats users expect. macOS: a .app bundle, usually distributed inside a .dmg. Windows: an .msi (built via WiX) or an .exe installer (built via NSIS). Linux: .deb (Debian/Ubuntu), .rpm (Fedora/RHEL), and .AppImage (distro-agnostic, runs anywhere). You choose which to produce in bundle.targets — "all" for everything available on the current OS, or a specific list.
Build on the OS You Target
The important constraint: you generally build each platform's bundles on that platform. macOS installers need a Mac (for signing and the macOS toolchain), Windows installers need Windows, Linux needs Linux. Cross-compiling exists in limited forms but is fiddly; the reliable path is a build machine per OS — which is exactly why CI with a matrix of macOS/Windows/Linux runners is the standard way to produce all your installers from one push (the next lessons cover that).
Choose Targets by Audience
You don't have to ship every format. If your users are all on macOS, build dmg and skip the rest. Shipping to mixed Linux distros? AppImage is the broadest single choice, with .deb/.rpm for users who prefer their package manager. Match the targets to where your users actually are rather than reflexively building everything — fewer targets means simpler signing, smaller CI, and less to test.