Cross-platform builds
Why a Windows machine cannot produce macOS or Linux artifacts, and what the path to those builds actually is.
NALA's source supports Windows, macOS, and Linux. Its artifacts do not exist for all three, and the reason is structural rather than an oversight.
Makers are guarded by host platform
The packaging configuration declares makers for every target, but each group is
wrapped in a process.platform check:
| Host | Produces |
|---|---|
win32 | Squirrel Setup.exe, portable ZIP |
darwin | ZIP, DMG |
linux | DEB, RPM, AppImage |
Electron Forge only invokes makers matching the machine it runs on; the explicit guards make that visible in the config rather than implicit in the tool.
IMPORTANT
This is not a switch you can flip. macOS DMG creation and Apple code signing require macOS. Linux DEB and RPM packaging requires Linux packaging tools. Running the build on Windows produces Windows artifacts and nothing else.
Consequences for release
Only windows-x64 has a published artifact. The release manifest omits
platforms without a verified build, and the site renders only what the manifest
contains — so an unbuilt platform is never offered as a broken download.
See platform support for the current matrix.
The real path to macOS and Linux artifacts
Cross-platform CI workflows exist in the application repository
(release-cross-platform-preview.yml, ci-cross-platform-baseline.yml). They
are the intended mechanism: each platform's job runs on its own runner, so each
maker gets the host it requires.
Before a platform can be published:
- Its runner produces the artifacts.
- Each artifact is installed and tested on a clean machine of that platform.
- Signing is wired where the platform requires it.
- The artifacts are published with exact byte size and SHA-256.
Declared Linux dependencies
Already specified in the packaging config, and worth knowing when testing:
Debian / Ubuntu: libgtk-3-0, libnotify4, libnss3, libxss1,
libxtst6, xdg-utils; recommends libfuse2 for AppImage.
Fedora / RHEL: gtk3, libnotify, nss, libXScrnSaver, libXtst,
xdg-utils.
Signing
| Platform | Requirement | State |
|---|---|---|
| Windows | Authenticode plus trusted timestamp | Not implemented |
| macOS | Developer ID, hardened runtime, notarization, stapling | Not implemented end to end |
| Linux | Signed checksums, later repository signing | Not implemented |
Stable publication requires signing. An unsigned build can reach the preview channel only, behind an explicit publisher flag, and the product and website must report that status honestly.
Platform behaviour that differs
Do not assume parity when testing:
| Area | Difference |
|---|---|
mod shortcuts | ⌘ on macOS, Ctrl elsewhere |
Ctrl+B prefix | Literal Ctrl on every platform, including macOS |
| Voice dictation | Requires Python 3.10+ on PATH |
| System-wide dictation | Depends on OS window management |
| Managed Node | Can install a private portable LTS under user data; SHA-256 required before download |