Authoritative installations
- Goal
-
Ship an install users, IT, and automation can trust, upgrade, and uninstall.
- Why (deep context)
-
Installation architecture (platform essays + Unity Install Layout (UIL)).
- Packaging steps
This page is how-to: choices and checklists. The essays explain why MSI is hard, why FHS is weak cross-platform, and what UIL names as roles.
Decision tree (start here)
-
What are you shipping?
-
Library/SDK → language registry first (Package registries); OS packages optional.
-
CLI → registry + OS package manager or standalone archive with explicit PATH story.
-
GUI desktop → platform installer or Flatpak/Store; avoid “binary in Downloads” as 1.0.
-
Service → container image or OS unit (systemd/rc.d); not the same checklist as GUI.
-
-
Which OS scopes are in scope?
List concrete targets (e.g. Windows 10+, macOS 13+ arm64, Ubuntu 24.04 + Flathub). “Linux” is not one answer—see Linux installation.
-
Per-user or per-machine (Windows/macOS)?
Per-user reduces UAC friction; machine-wide fits MDM and shared servers. Decide before paths and winget
Scope. -
Pick primary channel per OS
OS Prefer (left first) Windows
MSIX or MSI → winget manifest → signed EXE with journal (see direct disk section)
macOS
Notarized
.app+ Sparkle or brew cask → pkg only if you need system daemonsLinux
Distro package for named LTS or Flathub or AppImage with
.desktop+ XDG dirsBSD
Native
pkg/pkginbuild in CI; documentrc.conffor daemons -
Updates
Follow Automatic updates ladder: package manager / store → in-place installer upgrade → in-app updater. Wire how-tos: Windows · Unix/macOS.
-
Concurrency (agents/CI on same host)
If multiple workers install tools, use a host-wide install mutex (OS install concurrency); on Windows consider install-coordinator.
-
Shell visibility
Plan PATH/shims and env refresh (Shell environment refresh; OpenShellOrg entrypoint dispatch).
Checklist (release gate)
-
Package identity stable across versions (name, publisher, upgrade code / bundle id)
-
Payload tree versioned; user data outside payload
-
Signed artifacts (Authenticode, notarization, repo sigs as applicable)
-
Uninstall removes claims (ARP, desktop file, services) — smoke test N → N+1 → uninstall
-
Upgrade preserves user data; handles file locks (quit-and-swap documented)
-
Discovery: Start Menu /
.desktop/ PATH / winget manifest as promised -
Checksums and release notes on the Git tag
-
SBOM when feasible (enterprise customers increasingly ask)
-
Silent flags documented for IT and agents (
/quiet,DEBIAN_FRONTEND=noninteractive, etc.) -
Outer install lock documented if your team runs parallel agents
When to bypass MSI (Windows)
Acceptable when you still implement UIL roles (UIL): atomic versioned tree, journaled claims, side-by-side or shim, per-user roots if scoped, quiet automation. Read the full rationale: Why tools write directly to disk.
When one download is not enough
Polyglot distribution helps CI ship one asset; users still need a host-specific install step (Tailor, extractor, or installer). Do not skip ARP/desktop integration because the download was polyglot.
Authoring tools (Dev-Centr)
-
Ibex — generate UIL-friendly manifests and Windows installers with quiet modes.
-
msi-generator — MSI-focused generation where MSI remains the channel.