Problem Statement
macOS releases were Apple Silicon only (macOS-arm64). Intel Macs could not run the app at all, and the in-app updater deliberately returned no asset on Intel (browser fallback). Intel users were locked out of the macOS build entirely.
Proposed Solution
Ship a single universal (arm64 + x86_64) artifact built on the arm64 runner:
packages/yourssh_rdp/build.sh builds the Rust dylib for both darwin targets and lipos them into one universal libyourssh_rdp.dylib
- Flutter already builds both slices by default; the release workflow renames macOS artifacts to
-macOS-universal and adds a lipo -archs assertion over the app binary and the dylib, so an arm64-only artifact named universal can never ship
UpdateService: arm64 prefers the universal DMG and falls back to the arm64-only name of older releases; Intel matches only the universal DMG and falls back to the browser against pre-universal releases
Alternatives Considered
- Separate Intel build on GitHub's Intel runners (
macos-13 / macos-15-intel) — previously dropped due to chronic runner unavailability; also doubles CI time and produces a second artifact users must pick correctly
- Staying arm64-only — keeps excluding the Intel install base for a modest download-size saving
Additional Context
Implemented in #61. Trade-off: the universal DMG is larger than the arm64-only one (two slices), offset by the symbols split and font cut from #63. First real verification happens on the next release run via the new lipo assertion step.
Problem Statement
macOS releases were Apple Silicon only (
macOS-arm64). Intel Macs could not run the app at all, and the in-app updater deliberately returned no asset on Intel (browser fallback). Intel users were locked out of the macOS build entirely.Proposed Solution
Ship a single universal (arm64 + x86_64) artifact built on the arm64 runner:
packages/yourssh_rdp/build.shbuilds the Rust dylib for both darwin targets andlipos them into one universallibyourssh_rdp.dylib-macOS-universaland adds alipo -archsassertion over the app binary and the dylib, so an arm64-only artifact named universal can never shipUpdateService: arm64 prefers the universal DMG and falls back to the arm64-only name of older releases; Intel matches only the universal DMG and falls back to the browser against pre-universal releasesAlternatives Considered
macos-13/macos-15-intel) — previously dropped due to chronic runner unavailability; also doubles CI time and produces a second artifact users must pick correctlyAdditional Context
Implemented in #61. Trade-off: the universal DMG is larger than the arm64-only one (two slices), offset by the symbols split and font cut from #63. First real verification happens on the next release run via the new
lipoassertion step.