Repository navigation
Releases: johanohly/AirTrail
Release list
v3.13.0
What's Changed
This release adds roles and permissions. Every account is now either the owner or has exactly one role, and you can edit the built-in User and Administrator roles or create your own under Settings → Roles, down to who can see or edit other people's flights. Existing accounts are migrated automatically: the owner stays the owner, admins become Administrator and everyone else becomes User. See Roles and Permissions.
AirTrail now has a versioned REST API at /api/v1 and a remote MCP server, so scripts and AI assistants can read and manage your flights. API keys and connected apps live under Settings → Security and carry scopes, so a key can be limited to less than your own role allows. Existing API keys keep full access, and the old /api/flight/* endpoints still work but are deprecated in favor of /api/v1. See Getting started with the API.
The basemap provider is now configurable under Settings → Appearance → Basemap Provider, with OpenFreeMap, CARTO, Protomaps or your own MapLibre style. OpenFreeMap is the new default and needs no key, so installs that never chose a provider will switch from the previous CARTO map to OpenFreeMap. CARTO now requires an API key. See Basemaps.
The flight list now shows at a glance which flights have a track, recorded times, other passengers or a note, the passenger picker suggests guests you've added before, and flight lookups can use AeroDataBox's direct API instead of RapidAPI. For NAS users, there are now PUID and PGID settings and Unraid templates. To make that work, the container now starts as root, hands the uploads folder to PUID/PGID (1000:1000 by default) and then drops to that user. Nothing changes for Docker Compose, but platforms that refuse to start containers as root, such as Kubernetes with runAsNonRoot, need an explicit user like runAsUser: 1000.
This release also fixes the flight reason dropdown not showing the selected reason, and updates AirTrail's dependencies, including MapLibre 6, which renders right-to-left map labels correctly.
🚀 Features
- feat: configurable basemap providers by @johanohly in #725
- feat: RBAC by @johanohly in #726
- feat: add versioned REST API and MCP server by @johanohly in #737
🌟 Enhancements
- feat: show track, time, passenger and note indicators in the flight list by @Gaudv in #714
- feat: support the direct AeroDataBox API alongside RapidAPI by @mhlas7 in #732
- feat: suggest previously added guests in the passenger picker by @Gaudv in #711
🐛 Bug fixes
- fix: stabilize mobile drawers and dismissal behavior by @johanohly in #723
- fix: stop preference changes resetting other preferences by @johanohly in #738
- fix: allow selecting GPX and KML track files on iOS by @johanohly in #739
- fix: allow typing any day before the month in date fields by @johanohly in #740
📚 Documentation
- fix: restore the broken star history chart by @FaintFlower in #718
New Contributors
- @FaintFlower made their first contribution in #718
Full Changelog: v3.12.0...v3.13.0
v3.12.0
What's Changed
This release gives individual flights their own details pane. Select a flight from the map, route details, or flight list, and AirTrail will focus the map on that journey while showing its details. This is especially useful if the flight has a dedicated track.
Uploaded flight tracks can now be colored by altitude, with a legend and dashed sections where the path was estimated. AirTrail can also import readsb trace JSON files and help select the correct flight when a trace contains multiple legs.
Passenger information has also been reworked. Each passenger can now have their own seat, flight reason, and custom field values. Custom fields now support multi-select values too. Existing seat and flight-reason data is migrated automatically.
Importing and browsing flight history is easier as well. v3.12.0 adds a Miles & More importer, mapping for unknown airlines and aircraft, and field-by-field conflict resolution when AeroDataBox returns different information. The flight list now groups connecting legs and separates upcoming flights from past ones.
This release also tightens permissions when importing AirTrail backups and fixes a path traversal issue in custom airline icon uploads.
🚀 Features
- feat: add altitude-colored flight tracks by @johanohly in #658
- feat: individual flight details pane by @mhlas7 in #649
- feat: per-passenger custom fields and flight reasons by @johanohly in #679
🌟 Enhancements
- fix: correct airport last visit date and add next visit by @jonlarson13 in #640
- feat: add flight track preference option by @achatman in #655
- fix: respect date and time preferences throughout the app by @johanohly in #660
- feat: add unknown aircraft mapping to imports by @achatman in #669
- fix: add additional PWA app icon sizes and fix the apple icon by @mhlas7 in #680
- feat: in-app changelog enhancements by @johanohly in #683
- feat: add Miles & More flight history importer by @nicolaus-hee in #685
- fix: import flights with unknown airlines by @johanohly in #694
- feat: consider the entered origin/destination when searching aerodatabox by @mhlas7 in #689
- feat: add aerodatabox data conflict resolution modal by @mhlas7 in #673
- feat: group layovers and separate upcoming from past flights by @Gaudv in #696
🐛 Bug fixes
- fix: improve antimeridian flight track rendering and map interactions by @idunwannagotoschool in #657
- fix: fill visited countries based on flights not working by @achatman in #659
- fix: secure AirTrail backup imports by @johanohly in #662
- fix: make Kosovo and Taiwan selectable on visited countries map by @johanohly in #663
- fix: path traversal in airline icon upload by @bunlongheng in #695
- fix: prefer precise AeroDataBox aircraft model by @johanohly in #705
- fix: make the browser-side map caching actually work by @mhlas7 in #681
- fix: treat an empty METAR response body as no data by @mews-se in #704
- fix: count dropped FR24 rows and surface unknown aircraft by @mews-se in #703
- fix: derive FR24 arrival times left empty in the export by @mews-se in #698
- fix: align arc endpoints at high zoom by @johanohly in #706
- fix: preserve flight list scroll after edit by @johanohly in #707
- fix: close date picker after selection by @johanohly in #708
New Contributors
- @jonlarson13 made their first contribution in #640
- @achatman made their first contribution in #655
- @idunwannagotoschool made their first contribution in #657
- @nicolaus-hee made their first contribution in #685
- @bunlongheng made their first contribution in #695
- @trugty made their first contribution in #688
- @mews-se made their first contribution in #704
Full Changelog: v3.11.1...v3.12.0
v3.11.1
What's Changed
Important
This patch fixes a production issue in v3.11.0 where oversized SvelteKit
preload Link headers could cause 502 Bad Gateway responses behind nginx.
🌟 Enhancements
- feat: add system theme option by @johanohly in #627
- feat: add flight backup API endpoint by @johanohly in #628
🐛 Bug fixes
- fix: drop excessive link headers by @johanohly in #626
Full Changelog: v3.11.0...v3.11.1
v3.11.0
What's Changed
Warning
v3.11.0 can produce oversized preload Link headers on some routes, which may
cause 502 Bad Gateway behind nginx. Upgrade to v3.11.1.
This release adds the option to show the map in a globe view, rather than a flat map.
Additionally, you can now enable a time of day layer, to show where it is currently day and night on the map, and a rain layer to show where it is currently raining.
It is also now possible to attach a flight track to a flight, meaning instead of the map showing the flight path as a uniform arc, it will show the actual path the flight took, including taxiing if the data contains it. Tracks can be uploaded as GPX, KML, FR24 CSV, or FlightAware CSV files.
This release also includes two small security hardening fixes.
AirTrail no longer exposes user password hashes in page data or user API responses. These were Argon2id hashes, not plaintext passwords, and are only useful if someone can also guess the original password. For context, this mainly matters for weak or reused passwords; a random 12-character mixed letter/number password would be far out of reach, taking roughly a billion years to brute-force at 100,000 guesses per second. Advisory: GHSA-vwj8-562r-m3qw
OAuth account linking has also been tightened. AirTrail now validates OAuth state/PKCE data and requires the local AirTrail user password before linking an OAuth login to an existing account. The account takeover scenario required a very unusual setup: an open or compromised identity provider able to claim another user’s username. Advisory: GHSA-w7fj-fm46-r3fc
🚀 Features
- feat: globe view by @johanohly in #589
- feat: flight tracks by @johanohly in #592
🔒 Security
- fix: harden OAuth account linking by @johanohly in #616
- fix: stop exposing user password hashes by @johanohly in #617
🌟 Enhancements
- feat: improve flight filters by @johanohly in #607
- feat: time of day layer by @johanohly in #595
- feat: rain layer by @johanohly in #596
- feat: add OpenFlights importer by @johanohly in #599
- feat: add JetLovers importer by @johanohly in #612
- feat: add uniform airport circle size by @johanohly in #598
- feat: add statistics API endpoint by @mhlas7 in #606
- feat: improve statistics drilldowns by @johanohly in #621
🐛 Bug fixes
- fix: allow scheduled-only future flights by @johanohly in #620
- fix: add fallback for Carto map style fetch failures by @johanohly in #587
- fix: improve import validation error handling by @johanohly in #597
- fix: align username validation by @johanohly in #618
- fix: AirTrail importer backwards-compatibility by @johanohly in #619
New Contributors
Full Changelog: v3.10.0...v3.11.0
v3.10.0
What's Changed
This release makes the map much more interactive. Selecting an airport or route now opens a details pane with airport activity, related flights, local time, and METAR weather, while the selected airport or route is highlighted directly on the map. Map appearance also gets a satellite basemap, more airport detail controls, and frequency-based route coloring so heavily flown routes stand out more clearly.
AirTrail now also has a dedicated Preferences settings page for units and date/time display, including distance, wind speed, temperature, pressure, time format, date format, week start, and whether flight times are shown in airport local time, UTC, or your system timezone. Existing unit settings are migrated automatically.
🚀 Features
- feat: map panes by @johanohly in #578
🌟 Enhancements
- fix: reduce airport import memory usage by @johanohly in #562
- feat: add frequency-based route color visualization by @Gaudv in #571
🐛 Bug fixes
- fix: constrain deduplicate table height to viewport by @timmaurice in #572
📚 Documentation
- docs: document outbound proxy configuration by @johanohly in #579
New Contributors
- @hwcltjn made their first contribution in #566
- @timmaurice made their first contribution in #572
Full Changelog: v3.9.0...v3.10.0
v3.9.0
What's Changed
This release brings a variety of new map customization options to AirTrail.
The default map style has been enhanced to show more airport details when zoomed in (like taxiways, gates etc.).
You can now change the size of/hide the airport circles on the map, change the width of the route arcs to either be uniform or proportional to the frequency of the route, and you can now optionally enable the overlay of aviation charts on the map (requires configuration of the openAIP integration).

🚀 Features
- feat: map customizability by @johanohly in #557
- feat: create flights with just a year by @johanohly in #558
🌟 Enhancements
- feat: allow admins to list all instance flights through flight list API endpoint by @johanohly in #559
🐛 Bug fixes
- fix: hide tail numbers on shared links by @johanohly in #555
- fix: make usernames case-insensitive by @johanohly in #560
Full Changelog: v3.8.1...v3.9.0
v3.8.1
What's Changed
🌟 Enhancements
- feat: add history for back navigation to statistics modal by @EthanShoe in #543
🐛 Bug fixes
- fix: improve rate limiting for aircraft search by @EthanShoe in #542
- fix: remove 'Click to view all' message in non-clickable popups by @EthanShoe in #541
- fix: clear deleted time inputs by @johanohly in #548
- fix: fall back to scheduled times in flight list by @johanohly in #549
- fix: show passengers instead of flight number in mobile flight list by @johanohly in #550
- fix: hide toolbar when nested modals are open by @johanohly in #551
New Contributors
- @EthanShoe made their first contribution in #542
Full Changelog: v3.8.0...v3.8.1
v3.8.0
What's Changed
🚀 Features
- feat: allow admins to view all users' flights by @johanohly in #528
🐛 Bug fixes
- fix: increase mobile flight list bottom spacer by @johanohly in #529
Full Changelog: v3.7.5...v3.8.0
v3.7.5
What's Changed
🌟 Enhancements
- feat: add airtrail-admin CLI for instance management by @johanohly in #523
- feat: extract airport codes from OurAirports keywords and protect referenced airports from deletion by @johanohly in #521
- feat: animate settings height changes by @johanohly in #522
🐛 Bug fixes
- fix: prevent statistics filters from overflowing on mobile by @johanohly in #519
Full Changelog: v3.7.4...v3.7.5
v3.7.4
What's Changed
🌟 Enhancements
- feat: redesign flight list with floating toolbar by @johanohly in #510
- feat: show filters on statistics page and add year filter by @Gaudv in #504
🐛 Bug fixes
- fix: don't import flights with unknown airports before user maps them by @johanohly in #499
- fix: hide create airline/airport/aircraft UI from non-admin users by @johanohly in #500
- fix: prevent deck.gl overlay from rendering above map controls by @johanohly in #511
Full Changelog: v3.7.3...v3.7.4