Back to changelog

vAMSYS 5.4.5

What's new

  • Automatic invalidation of PIREPs awaiting a pilot reply

    PIREPs flagged as needing a pilot reply are now automatically invalidated when the pilot doesn't respond within your airline's reply window - a new setting on the PIREP Settings page in Orwell (PIREP Review section), configurable from 0 to 365 days and defaulting to 7. Auto-invalidation runs nightly, writes a clear entry to the PIREP's action log, and immediately unblocks the pilot from booking. Note: the first run after this release will clear out the existing platform-wide backlog of long-stale need-reply PIREPs.

  • Pending PIREPs no longer shield pilots from activity checks forever

    Previously, a pilot with any pending PIREP was exempt from activity-requirement removal indefinitely - creating roster entries that could neither fly (blocked by the need-reply check) nor be removed. The exemption is now bounded by the reply window plus your activity grace period, and the initial-activity check re-checks recently deferred pilots daily instead of only once on their exact Nth day. Pilots who previously escaped the initial check are grandfathered - there is no retroactive removal sweep.

  • Community Goal & Challenge outcome badges

    Badges can now be tied to community activity outcomes directly from the badge form. Two new rule blocks join the existing Event Participation rule:

    • Community – Completed / Won — on goals, awarded to every participant when the goal is achieved; on challenges, to every contributor on the winning team.

    • Community – Top 10% Contributors — awarded to the top 10% of contributors at activity end (on challenges, within the winning team), mirroring the activity-side tier badge exactly.

  • Both are evaluated when the activity's rewards are distributed, with helper text spelling out exactly who gets what. The same rule types are also available via the Operations API badge endpoints.

  • Badge selects on Community Goal & Challenge forms

    The Participation, Completion and Top 10% Contributors badge selects are now available directly on the Community Goal and Challenge create/edit forms in Orwell. Badges can be attached from whichever side suits your workflow — per-pilot de-duplication prevents double awards if both are set.

    Challenges now have a Winner Badge select, and the badge is awarded to every contributor on the winning team when rewards are distributed (provided the winning team reached its target). The field was previously settable via the Operations API but was never actually awarded.

  • Callsign generator validation everywhere

    Invalid callsign generator strings are now rejected at every intake point - the route importer, the Orwell route form, and airline-level route creation defaults - instead of being accepted and then failing at generation time. The generate-callsign button on the dispatch and booking pages now only appears when the route's generator is actually valid.

What's improved

  • One pilot ID, one pilot — enforced

    Concurrent registration approvals could race and hand two pilots the same pilot ID, or create duplicate pilots for the same user. Username allocation is now serialised per airline, approvals atomically claim the registration, and a database-level unique constraint on active pilot usernames backs it all up - with existing duplicates repaired as part of the rollout. Rejoining pilots can still reclaim their old number.

  • Orwell & Phoenix performance

    A round of query work across the platform: the Orwell pilot list statistics now use the airline index instead of scanning all PIREP analytics, the leaderboard year list is cached, the booking flight map no longer repeats expensive lookups, the shared cockpit pilot list no longer runs a query per friend, route maps no longer run a query per airway, and the rosters generator gained a dedicated index.

  • SimBrief saved airframes re-sync properly

    Saved airframes previously synced exactly once per user, ever - a stuck throttle meant a new airframe could take weeks to appear. Airframes now re-sync hourly, a failed fetch retries instead of locking, and opening the favourite-aircraft page in Phoenix triggers a sync. Relatedly, the airframe sync no longer rewrites every profile on every dispatch page load.

  • Dispatch survives broadcast outages

    SimBrief OFP notifications now broadcast via the queue, so a realtime-server outage no longer crashes dispatch or SimBrief imports. Broadcast connections now have proper timeouts so requests can't hang indefinitely.

  • More robust live flight tracking

    Flights now leave the live flight list as soon as their PIREP is filed, bulk updates to historical bookings (notably "Reset my account") can no longer resurrect years-old flights onto the live map, and position report cleanup is now atomic.

  • More resilient Discord notifications

    A single failed Discord send (rate limit, outage, timeout) previously disabled an airline's entire Discord integration until staff re-saved their settings, and the announcement was lost. Transient errors now simply retry on the next run, a deleted channel only clears that one channel setting, and only a deleted server (or kicked bot) disables the integration.

  • Operations API: removed pilots and past bookings now resolvable

    GET /pilots/{id} and GET /bookings/{id} now return removed pilots and completed/cancelled bookings instead of a 404 (matching what the list endpoints already showed), GET /registrations/{id} now genuinely resolves processed registrations for airline-restricted clients, and removed pilots can now be banned via POST /pilots/{id}/ban.

  • Operations API: stricter PIREP update validation

    PUT /pireps/{id}/times previously accepted empty or partial bodies and silently nulled any omitted time fields - a data-loss trap. All four time fields are now required, and missing fields return a 422. POST /pireps/{id}/select-landing likewise now rejects a missing touchdown_index.

What's fixed

Phoenix & dispatch

  • Pilots who switched Virtual Airline mid-dispatch could book another airline's route under the wrong airline, with the PIREP following the bad booking - the dispatch and booking pages now validate everything more robustly against the active Virtual Airline

  • Phoenix dashboard crashing for all viewers when a live flight referenced a deleted position report - the phase now shows "Unknown" instead

  • Saved SimBrief map type ("Advanced Route Map" or "No Map") silently falling back to the default on every new dispatch

  • The manual SimBrief link sending nonsense cargo and baggage weights - small cargo loads were inflated a thousandfold and passenger bag weight was dropped

  • Dispatch crashes for pilots whose browsers report legacy timezone names (e.g. Asia/Saigon), and from stale stacked Time Setter modals

  • Clicking the generate-callsign hint on the booking page throwing an error on routes with broken generator data

  • Attaching a SimBrief OFP via the Pilot API always being rejected with route_mismatch, even when the route matched

  • Fetching the flight profile of an in-progress PIREP via the Pilot API returning a 500

Orwell & staff tools

  • Event Participation badge rules pointed at a Community Goal or Challenge were never awarded - qualifying contributions now award them immediately, and a sweep at reward distribution catches badges created late

  • Tour, Roster and Curated Roster registrations made via the API never tracking progress - PIREPs now count, and unregistering cleans up in-progress logbooks consistently across web and API

  • Events created via the copy action (or weekly auto-replication) never being announced to Discord

  • Saving a Community Goal or Challenge failing with a 500 when an activity webhook was subscribed and event/focus airport webhooks that were silently never delivered now fire

  • The rank transfer message rendering raw Markdown to pilots - bold, lists and paragraphs now display properly (and the content is sanitised)

  • Aircraft photos disappearing from flight maps platform-wide after a photo-provider change

  • Orwell route form crashing on airports without ICAO codes and on non-Latin callsigns

  • Route import not clearing emptied SimBrief fields - an empty cell now clears the override instead of keeping the old value

  • 500 error when filtering the HQ statistics page

  • Duplicate pilot IDs from concurrent registration approvals (see "One pilot ID, one pilot" above)

Billing & OAuth

  • Billing webhook failing when an airline's owner staff record had been removed - receipts now fall back to a sensible address

  • OAuth authorisation showing a generic 500 when an integration sent a non-numeric client ID - it now shows a friendly invalid-client error

Operations API

  • 500 error when creating a callsign parameter, and create/update responses returning stale data

  • 500 error when approving a livery

  • 500 error when assigning containers or load factors to a route

  • 500 error fetching legacy PIREPs without a type - the type field is now nullable and its documented values corrected to what the API actually returns

  • 500 error on GET /statistics/general for clients of deleted airlines

Don't miss the next one

Subscribe and we'll email you when we ship.

Unsubscribe anytime.