Install location standardized to /opt/aerodrome on every distro, plus firewalld awareness. v3.2.0's multi-distro work surfaced a real architectural question through dogfooding: on openSUSE Tumbleweed (and Fedora, RHEL, Rocky, Alma, AlmaLinux — anything SELinux-enforcing) installing under /home/ doesn't actually work, because SELinux's targeted policy denies systemd from ExecStarting a binary in a user's home directory. The user-visible symptom is a 203/EXEC failure on service start with "Permission denied" on /home/<user>/aerodrome/venv/bin/python3 — even though Unix permissions allow it. v3.3.0 fixes this by moving the default install location to /opt/aerodrome on every distro, not just SELinux-enforcing ones. One install path, one mental model, FHS-correct, works on every distro without per-distro workaround documentation.
What you see as a new user: bash <(curl -fsSL https://install.aerodromeadsb.com) now extracts to /opt/aerodrome, the bootstrap announces "Creating /opt/aerodrome (requires sudo since it's outside your home)..." once, you enter your password, and the rest of the install runs exactly as before. The systemd unit still runs as your regular user (not root), the config file is still user-owned and editable through the web UI, the in-app updater still works without sudo for file operations — /opt/aerodrome is created by root but then chowned to the install user so everything downstream is unprivileged. The dashboard, watchlist, notifications, demo mode, switch-to-real wizard — all unchanged from a user-experience standpoint. The only difference is where the files live.
What you see as an existing ~/aerodrome user: absolutely nothing. v3.3.0 detects existing installs at any prefix (presence of VERSION + main.py) and upgrades them in place. No forced migration, no nag, no "your install is at the deprecated location" warning. If you want to move to /opt/aerodrome eventually, the procedure is documented in INSTALL.md (uninstall keeping data, reinstall fresh to /opt, restore your config + db via the web UI's Backup & Restore page). If you don't want to move, you never have to — ~/aerodrome keeps working indefinitely.
Override: --prefix <path> still works for users who have a strong preference. bash <(curl ...) --prefix ~/aerodrome restores the pre-v3.3.0 layout if that's what you want. The bootstrap warns nothing — it'll just install where you tell it.
Why /opt and not /usr/local or /srv or /var/lib: /opt/ is the FHS-blessed location for "add-on application software packages" — exactly Aerodrome's niche. /usr/local/ is for system administrator-installed software intended to be managed by the package manager (which Aerodrome isn't). /srv/ is for "data for services," not the services themselves. /var/lib/ is also for data, not the application tree. /opt/ matches conventional third-party software placement: GitLab, Splunk, Atlassian products, Sonatype Nexus, and dozens of others all install to /opt/<product>/. Aerodrome joins them.
firewalld awareness — the other Fedora/openSUSE finding. Both Fedora and openSUSE Tumbleweed enable firewalld by default with a restrictive public zone that blocks port 8000. v3.2.x would install cleanly on those distros but leave the dashboard unreachable from any non-localhost source — which looked like "Aerodrome isn't running" from the user's laptop. v3.3.0's bootstrap detects active firewalld and prompts (default-yes) to open port 8000 persistently on the public zone. Skips silently on Debian/Ubuntu/Arch where firewalld isn't enabled by default. The exact commands are printed either way so users who decline can run them later.
uninstall.sh mirrors both changes: it now detects whether the install is inside the user's home or outside (/opt-style) and emits the correct removal command — rm -rf /opt/aerodrome requires sudo because /opt/ is root-owned, even though Aerodrome's own directory is user-owned. The "show command to remove the project directory" prompt and the --purge path both produce the right command for the install's actual location. Firewalld port 8000 also gets a "close it?" prompt during uninstall on firewalld-active systems, keeping install/uninstall state symmetric.
Why ship this as a minor (3.3.0) rather than a patch (3.2.2): the install-location default change is user-visible behavior, not just bug fix. New users see a different default path. Existing users see no change but the install scripts know how to handle both layouts, which is new capability. Per semver, capability addition + default change is a minor bump. The release adds capability cleanly; it doesn't break anything.
Scope:
scripts/bootstrap.sh—PREFIXdefault changed from${HOME}/aerodrometo/opt/aerodrome, install-dir setup step now creates parent dirs with sudo when needed and chowns the result, new "Existing install detected at — upgrading in place" message when the target already has VERSION+main.py, new firewalld step between install.sh completion and the success banner. Help text and top-of-file comment block updated to reflect the new default.uninstall.sh— install-dir-removal logic now branches on inside-vs-outside-home to emit the right command. Firewalld port-close step mirrors the install-side open step.install.sh— no changes. install.sh has always used$(dirname "$0")to find the install root, so it adapts to wherever it's run from. The bootstrap is the only thing that decides where to extract.docs/INSTALL.md— every~/aerodromereference replaced with/opt/aerodrome(15 occurrences across the Installation, Updating, Backup, and Manual-install sections). New "Install location (v3.3.0)" and "Firewall handling" subsections in the Multi-distro support area documenting the new default, the override path, the upgrade-existing-installs behavior, and the firewalld prompt.- Test contract: maintainer dogfoods fresh openSUSE Tumbleweed and Fedora VMs end-to-end (install → demo mode → switch-to-real → uninstall) before publishing the GitHub Release. Arch and Debian/Ubuntu installs at their existing locations are also verified to upgrade cleanly without surprises.