Changelog

Stay up to date with the latest updates, features, and improvements.

Get every release delivered

Pegasus v2.0.12

Features

  • New X-Plane plugin connection - now the default.
    Pegasus ships with a native X-Plane plugin and connects through it instead of the UDP dataref stream. It is lighter on X-Plane (no per-dataref network subscriptions), captures hard-landing g-spikes at full frame precision, and needs no X-Plane network setup at all when Pegasus runs on the same machine. Pegasus offers a guided install (your X-Plane installs are auto-detected; also available any time under Settings > Simulator), keeps the plugin updated, and existing UDP users are switched over automatically. Raw UDP remains available in Settings for anyone who prefers it.

  • Laminar A330-300 (X-Plane 12): full systems detection enabled from a pilot's wizard submission.

Changes

  • Internal: the aircraft add-on database rewritten for better aircraft detection and systems and flaps configuration entries.

  • The XPUIPC connection option has been removed. Anyone still set to XPUIPC is moved to the new plugin connection automatically.

  • Recognise more aircraft add-ons: Carenado Do 228 (MSFS 2024) and ATR 72-500 (Prepar3D), SimWorks Studios Van's RV-14/RV-14A, Got Friends Stemme S12-G, DeltaSim RC-135W Rivet Joint, E-6B Mercury and E-8C Joint STARS, plus more ToLiss install-folder variants on X-Plane 11 (A320, A321 V1.3 and A330-900 XP11 editions). Taog's Hangar AS365 Dauphin helicopter (MSFS 2024, all eight presets), ToLiss A340-600 PRO (ToLiss's first MSFS release), PMDG 737-700 and 737-900/-900ER cabin presets (MSFS 2024), the remaining FSLabs A321neo variants (-252NX/-253N/-271N), Just Flight Fokker 100 title variants, Aerosoft A340-600 and iniBuilds A350 house-livery titles, Kuro A3neo, Aerosoft A320neo (Prepar3D), and on X-Plane 11 the LevelUp 737-700NG, SSG 747-8 V2.5.1, Magknight 787, RWDesign DHC-6 Twin Otter and several Zibo/ToLiss install-folder variants.

  • Improve Aircraft detectioon in cases where no path is provided - common for streamed and marketplace aircraft on MSFS 2024.


Fixes

  • Switching aircraft in MSFS no longer briefly misidentifies the aircraft.

  • Fixed the Aircraft Data Wizard trapping you on its intro screen when opened from Settings: the Close button now actually returns you to Settings, the settings gear no longer brings an exited wizard back, and Back is properly greyed out on the first page instead of doing nothing. Previously the only way out was restarting Pegasus.

  • Wizard captures now snapshot the aircraft state after the movement settles, so the recorded evidence can no longer lag one step behind what the pilot actually did.

  • Fixed the Simulator settings page being cut off at the bottom of the window: with the new X-Plane plugin section the page could grow taller than the window, hiding its lower controls behind the Save button. The page now scrolls when its content doesn't fit.

  • Fixed aircraft data wizard submissions being lost after appearing to succeed.

  • Internal re-wiring of flight events and telemetry variables to be more informative and consistent

vAMSYS v5.4.9

What's new

  • Dashboard banners

    A new Banners block for the dashboard builder. Staff upload images (with light and dark variants), optionally link each one to an external URL or a custom page, order them, and schedule when they're active. Pilots see them as an auto-scrolling carousel on the dashboard, replacing the fake-event workaround many Virtual Airlines used for promotional banners. Managed under Orwell's Pages cluster.

  • Badge statistics

    The pilot profile now shows a badge summary: badges earned, total available and completion percentage. Badges tied to past events are excluded from the total since they can no longer be earned, and staff-awarded badges are included with a note. The Community Leaderboard also gains an all-time badges ranking, with the same privacy redaction as the other rankings.

  • Activities leaderboard

    The Community Leaderboard gains an activities ranking with a per-type selector covering Events, Slotted Events, Focus Airports, Tours, Rosters and Curated Rosters, ranked by completions all-time.

  • Activity completion statistics on the pilot profile

    The profile's statistics area now shows how many activities of each type a pilot has completed, using your airline's own naming for community activities. Completions only, not registrations.

  • Disable PA and cabin announcements per fleet

    Fleet settings' ACARS Sounds tab gains a "Disable PA / Cabin Announcements" toggle. When enabled (for business jets, for example), no announcement sounds play for that fleet's flights, even when the airline has default sounds configured. No Pegasus update needed, and no more 10-second-silence-file workarounds.

  • PIREP review shows the network callsigns actually flown

    The flight details panel now lists every network connection recorded during the flight window, with network, callsign and times, marks callsigns that differ from the booked one, and shows Offline when the pilot wasn't connected.

  • An opt-in review rule for mismatched online callsigns

    A new Network Connectivity category in the autoreject rules lets you hold PIREPs for review when a pilot flew online under a callsign that doesn't match the booking for a configurable share of the flight. Prefix matching, an allowlist for acceptable alternate prefixes, and a minimum connected time so short or spotty sessions never trigger it. Flying offline never triggers the rule, and it's off by default for every Virtual Airline.

  • Operations API: pilot ban and removal reasons

    GET /pilots and GET /pilots/{id} now include airline_ban_reason, platform_ban_reason and removal_reason, mirroring what airline staff already see in the back office. The existing filter[trashed] filter includes removed pilots, and webhook payloads that embed the pilot object carry the new fields. Non-breaking.

  • Operations API: badge bonus points

    Badges created or updated via the API can now configure the per-PIREP bonus that back-office badges could always set: bonus_points, bonus_points_as_percentage and bonus_name, with validation mirroring the back office. Non-breaking.

What's improved

  • The "Callsign may be in use" warning recognises your own connection

    If the connection or prefile holding the callsign belongs to your own linked VATSIM, IVAO, POSCON or APOC ID, the warning no longer fires. Genuine third-party collisions still warn.

  • The Ready-to-Dispatch card shows your selected alternates

    The SimBrief row now lists the chosen alternate airports (or "No alternate selected"), live as they change, with a link that jumps straight to the alternate controls.

  • The Alternate Finder follows your fleet's Alternate Management settings

    The search radius now honours the fleet's configured radius instead of a hidden cap, and the minimum runway and ceiling filters default from the fleet's SimBrief alternate settings, matching exactly what the OFP request uses. A "Follow fleet alternate settings" toggle (on by default) presets these; turning it off restores full manual control. A new bad-weather filter hides candidates currently reporting thunderstorms, fog, freezing rain or heavy rain, based on current METAR.

  • The Alternate Finder ranks airports your airline serves first

    Candidates now order by your preferred alternates, then suitable alternates, then company airports and hubs, then everything else, with weather and distance breaking ties. Hubs and company airports get their own icons. Fixed alternates set on the arrival airport now pre-fill the finder's slots with a Fixed badge, so pilots can see what the airline locked in before choosing to replace it.

  • The Orwell Activities table can now sort by its Registrations and Completions columns

What's fixed

  • Account merges no longer clear platform bans. Merging a banned account into another account previously left the surviving account completely clean. The surviving account now inherits the platform ban automatically, and ACARS connections now properly enforce platform bans as well.

  • The touchdown point on PIREP review is now accurate, and all its numbers agree. The "TD Point" figure could disagree with the drawn touchdown dot by 700 to 1,000ft, because the two came from different position-report samples. Both now derive from a single calculation, the percentage and remaining-distance figures use the correct runway lengths, and multi-touchdown PIREPs honour the selected touchdown. Because the display now recomputes live from position reports, historical PIREPs render correctly too, with no backfill needed.

  • Rich-text editing on macOS no longer traps the cursor. Editing an airport briefing, email, badge or any other rich-text field on a Mac could trap the cursor so firmly that clicking Save did nothing. This turned out to be several separate problems stacked on top of each other, including a vendor bug triggered by documents containing numbered lists; each has been fixed, and as a belt-and-braces measure the editor now releases focus automatically the moment a save button is clicked.

  • Accepting a transfer, pilot-invite or claim PIREP no longer errors. These PIREP types have no scheduled route by design, and accepting one crashed part-way through: the PIREP was marked accepted, but the statistics, activity and badge follow-ups silently never ran, and in a bulk accept the crash aborted the rest of the batch.

  • Ground flap events now work for addons that don't name the flap position. Some addons log "Flaps set to position 0" with no detent name, and the parser dropped those lines entirely, so the ground-flaps scorers never fired on those fleets. These lines now parse correctly, and scorers that judge detent names skip events without one rather than misjudging them. See the note for Virtual Airline staff below.

  • PIREPs flown on an "Ignored" livery are now held for review, as the documentation has always described. Ignored liveries were being treated the same as Accepted ones, so those PIREPs completed automatically with no review. They now hold PIREPs like any not-yet-reviewed livery, while still staying out of the pending-livery triage queue. See the note for Virtual Airline staff below.

  • Tour and roster legs no longer get permanently stuck when a claim's hand-entered times slightly overlap the next leg. A claim whose entered landing time overlapped the next leg's departure by even a minute blocked that leg, and every leg after it, from crediting, with no way to override it. Sequential checks involving a claim now tolerate small overlaps as entry noise, while ACARS-to-ACARS comparisons stay strict. Affected logbooks self-correct the next time a relevant PIREP is filed or reprocessed.

  • The departure-analysis and flight-analysis panels in Orwell printing raw JavaScript as visible text on the page

  • Chart tooltips on those panels showing altitude and groundspeed readings from the wrong point on the flight path

  • Dispatching a tour or roster leg failing with an error when the leg's stored airport data had drifted from its linked route

  • Event, slot and roster page booking links being rejected for every route except the last one in the list

  • The billing consent page crashing instead of loading, blocking affected owners from reaching billing

  • The departure time field rejecting correctly typed times after losing its typing mask

  • Payload changes made with the number spinner buttons not updating the live dispatch figures

  • Payload edits freezing the Ready-to-Dispatch card's Payload, Cargo and ZFW readouts until a full page reload

  • The Orwell dashboard and beta-site footer continuing to advertise a beta version, with a dead changelog link, after the beta cycle had ended

  • Deleting an airline staff member leaving their airport-manager assignments behind; the existing backlog has been cleaned up

  • Owners of closed Virtual Airlines being wrongly blocked from deleting their vAMSYS accounts

  • A user being able to end up with two active pilot accounts at one airline; existing duplicates have been merged

  • Pegasus reporting no booking for pilots affected by those duplicate records

Pegasus v2.0.11

This one is on us

Fixes

  • It was not possible to proceed past Aircraft Data wizard's Flap step

Pegasus v2.0.10

Features

  • Aircraft Data Wizard, rebuilt around your cockpit: you tap the switch labels printed on your panel (POSITION, ANTI COLLISION, LANDING…), do a quick all-on/all-off pass for simple switches, and Pegasus walks you through the rest one switch at a time - no aviation knowledge or typing needed. Flap positions work the same way: declare the labels on your flap lever, then follow the guided walk (dial-a-flap aircraft like the MD-80 capture their variable range too). Speedbrakes are captured at their anchor points (down, armed, fully up). Pitot heat and the parking brake take under a minute. Run it anytime from Settings > Simulator, or accept the end-of-flight offer when Pegasus is missing data for your aircraft — you are only ever asked once per aircraft, and every submission is reviewed by hand before it reaches other pilots.

  • Deep capture: on X-Plane 12.1+ (Web API) and MSFS (via the FSUIPC WASM module) the wizard also reads the aircraft's own switch data with every capture, so custom aircraft (Zibo, ToLiss, PMDG, Fenix and friends) can get exact per-switch support instead of best-effort guesses. Before capturing, Pegasus quietly watches your aircraft for half a minute to learn what changes by itself - so unreliable readings can never contaminate a submission.

  • Spoiler arming is now tracked: the flight log records "Spoilers armed" and "Spoilers disarmed" alongside the existing deployed/stowed entries (X-Plane and FSUIPC). An armed speedbrake auto-deploying on touchdown is logged as armed, then deployed — the way it happens in the cockpit.

  • Zibo 737 (X-Plane 12): navigation, landing and taxi lights are now read from the Zibo's own switches, fixing lights that logged wrongly (nav following battery power, landing lights tracking only one of the four switches).

  • ProSim 737-800 (MSFS 2020): navigation lights, strobes, speedbrake and parking brake detection enabled, validated from a pilot's wizard submission. Beacon, landing and taxi lights stay off for now.

Changes

  • Light, pitot heat, parking brake and spoiler entries now appear only for aircraft with verified detection, so what you see in the flight log is trustworthy. Aircraft without verified detection simply show no entries for those systems - better no data than wrong data. Coverage was seeded from a fleet-wide analysis of recent flights (44 aircraft/simulator combinations at launch) and grows through the in-app wizard.

  • Once you submit wizard data for an aircraft (or dismiss the end-of-flight offer), Pegasus stops offering the wizard for that aircraft - no nagging after every flight.

  • Recognise more aircraft add-ons: Contrail Falcon 50, Fly the Maddog X 20th Anniversary, BravoAirspace 787-8 GE, LatinVFR A318 ACJ, NextGenSim EMB-110 Bandeirante, PILOT'S DHC-7, PHM Dash 8 Q400, IndiaFoxtEcho F-35A and Eurofighter, SwissMilSim DH-100 Vampire, IRIS F-22 (P3D), PMDG 737/747 (FS2004), plus many more ToLiss, LevelUp, FlightFactor, Magknight, Rotate, X-Crafts and iniSimulations install-folder variants on X-Plane.


Fixes

  • Wizard submissions are protected against accidental junk: captures are rejected while the simulator is paused or when nothing has moved, big-jet flaps are given time to finish travelling before each reading, and a short capture is challenged before it can be submitted.

vAMSYS v5.4.8

What's new

  • Dispatch, rebuilt from the ground up

    The whole dispatch screen has been redesigned with a new sticky Ready-to-Dispatch summary card showing your live payload, zero-fuel weight, aircraft, callsign, route and flight details as you build the booking. The layout now flows aircraft → callsign → route → network, settings sections collapse to keep things tidy, and warning badges appear the moment your payload exceeds maximum takeoff or landing weight.

  • A faster, smarter container picker

    Selecting cargo containers is now instant, with no waiting between clicks. Live weight and volume bars update as you go, plus new filters to hide incompatible containers or show only what's loaded.

  • A redesigned alternate-airport finder

    Search and filter alternates in real time, with ranked candidates, live METAR/TAF weather, runway and crosswind details, and direct slot assignment — no more digging through a separate tool to check diversion weather.

  • Asynchronous SimBrief flight plans

    OFP generation now runs in the background with a poll-fallback, so a slow SimBrief generation no longer holds up your booking.

  • POSCON is now a supported online network
    vAMSYS reads the POSCON network feed and detects when you're flying online, matching you by the POSCON ID on your profile. POSCON flying now counts towards network scoring exactly as VATSIM, IVAO and APOC do. Nothing extra to set up beyond having your POSCON ID saved on your profile.

  • Jumpseat to airline bases without network connectivity

    Where enabled, pilots can now jumpseat to airline bases even when not connected to a network.

  • Airport briefing URLs on the Resources page

    Pilots can now view and open external airport briefing links from Resources → Airports.

  • Full OAuth request headers in Orwell

    Staff can now inspect complete OAuth request headers from the API client details modal, making integration debugging much easier.

  • A proper view for personal rosters in Orwell

    Staff can now open a pilot-created personal roster from Activities and see a clean, read-only leg-by-leg view: the required flight, departure and arrival, completion state, and a link to the matching PIREP, with a delete action and a link to the owning pilot.

  • Updated legal documents, taking effect 17 August 2026

    We're rolling out an updated Terms of Service, a new Virtual Airline Owner Terms, an Acceptable Use Policy, an updated Privacy Policy and Cookie Policy, and a new Data Sharing Agreement. Pilots and VA staff will see an in-product notice: a dismissible heads-up now, then a one-time accept-or-leave screen from 17 August. Accepting takes one click and changes nothing about your account.

What's improved

  • Dispatch page polish throughout

    Loading indicators during booking creation and preview generation, copy-to-clipboard for callsign and routing, a searchable SimBrief profile dropdown, clearer empty states and tooltips, and better mobile and screen-reader support.

  • Dispatch restrictions enforced consistently, server-side

    Route, aircraft and network choices are now re-validated on the server everywhere a flight can be dispatched, closing a bypass where restrictions could be circumvented by manipulating the page URL directly.

  • Faster pages across the platform

    A dedicated performance push cut database load on the busiest pages: Phoenix's topbar and sidebar, community activity, the flight map, dispatch, and the Operations API are all noticeably snappier.

  • Faster Operations API OAuth handling

    Duplicate OAuth client and token lookups per request have been eliminated, and airline rate-limit lookups are now cached, reducing overhead on every authenticated API call.

  • Callsign availability now covers POSCON and APOC

    Dispatch now warns you when a callsign is already in use on POSCON or APOC. This check previously worked for VATSIM and IVAO only.

  • APOC is now selectable everywhere it should be

    APOC arrived as a network in 5.4.3 but was never wired into badge rules, slotted-event network restrictions, community activities, the split online leaderboard, or several staff panels. It's now available in all of them, alongside VATSIM, IVAO and POSCON.

  • Account retention and erasure now match the updated Privacy Policy

    Frozen accounts are now genuinely anonymised after 60 days rather than only hidden, and removed pilot records left unclaimed for 12 months are transferred to the airline's Robot pilot and permanently deleted. Accounts with a ban or restriction on file are exempt and kept intact, so ban enforcement and appeals still work. Access logs and lapsed marketing-consent records now age out on a schedule. None of this is visible day to day — it matters only if someone asks for their account to be deleted, or never comes back.

  • Clearer account-deletion messaging

    The freeze notices now state the correct retention periods (2 days for a pilot account, 60 days for a user account), and the incorrect warning that a deleted account can never re-register has been removed for accounts with no ban on file.

  • Marketing-consent checkbox names the actual Virtual Airline

    The signup checkbox now shows the specific VA's name rather than a generic "Virtual Airline".

What's fixed

  • Container picker was overestimating imperial cargo capacity by roughly 2.2×, which could allow a load above maximum takeoff weight. This has been corrected, along with a related issue where metric cargo weight was being summed in pounds instead of kilograms. If your fleet uses imperial units, we'd recommend double-checking any bookings dispatched on 5.4.7 or earlier.

  • Excessive block and flight time recorded when the sim connection dropped during a pause. If your connection dropped while you were already paused (or you paused immediately after a disconnect), the gap was logged as active flight time rather than a pause, inflating block time, flight time and credited time. The calculation is now correct. Note that PIREPs already filed are not recalculated — if a specific flight looks wrong, ask your VA staff to raise it with us.

  • IVAO callsign checking was reporting every callsign as free. IVAO changed the shape of its network data and vAMSYS was reading it from the wrong place, so it found no online pilots and treated every IVAO callsign as available. It now reads IVAO's data correctly.

  • SimBrief profile not falling back to the airline/system default when no tail-specific profile was set, and dispatch picking an arbitrary imported profile (such as a third-party livery profile) instead of the generic default

  • SimBrief toggle staying stuck on when no airframe profile was available for the aircraft

  • Payload weight-bar figures, Cost Index and payload section not displaying correctly in some cases

  • Aircraft selection modal applying changes even when Cancel was pressed

  • Event-slot bookings regenerating a new callsign instead of reusing the one already reserved

  • A missing airline design (logo/stylesheet) causing a 500 error instead of falling back safely

  • A pilot with no rank assigned causing an error in the page header

  • The Book Flight button showing on slotted-event pages where it doesn't apply

  • SimBrief alternate airports no longer accepting the NONE sentinel, affecting over 11,500 production routes — restored

  • OFP routes occasionally disappearing from PIREPs when a booking was created or an OFP attached via the API

  • Duplicate PIREPs being created when a removed pilot's account was reactivated

  • Map filter dropdown scrollbars squeezing content and causing horizontal overflow on Windows

  • Legacy livery names occasionally failing to match due to a lookup reusing stale search constraints


⚠️ Operations API breaking change: simbrief_options

The simbrief_options object on POST /routes and PUT /routes/{id} now only accepts its 26 canonical fields. Thirteen fields that never affected flight planning altn, altn2, altn_rte, altn_rte2, airline, units, taxiout, taxiin, cruiseprofile, cruisespeed, cruisealt, cruisefl, descentprofile) will now return a 422 if sent.

Six real alternate fields have been added: altn_1_id, altn_2_id, altn_3_id, altn_4_id, eualtn_id, toaltn_id. Use altn_1_id where you previously sent altn, and altn_2_id where you previously sent altn2 — these are the fields that actually feed SimBrief OFP generation.

Partial PUT updates now merge field-by-field rather than replacing the whole object: sending a field as null clears just that field, and simbrief_options: null clears everything. *_units fields now only accept min or wgt. GET responses only return documented fields.

We've already migrated existing altnaltn2 values to altn_1_idaltn_2_id and removed the dead fields in production, so no action is needed for existing routes — this only affects new writes from your integration.

Pegasus v2.0.9

Features

  • Flap Wizard: a new guided, in-app tool that walks you through each flap position so Pegasus can correctly detect your aircraft's flap layout. Offered automatically at the end of a flight when flap detection had trouble, or run it anytime from Settings > Simulator. The captured layout is sent to vAMSYS to improve flap detection for everyone.

  • Stall detection: the flight log now records when a stall is detected and when you recover, including the altitude (height above ground and true altitude), airspeed, pitch and vertical speed at the time.

  • Unlimited fuel is now recorded: the flight log notes when unlimited fuel is switched on or off in the simulator.

  • New flight log entries for lights (nav, beacon, landing, taxi, strobe), pitot heat, parking brake, and spoiler use: each is now recorded as it changes during the flight, plus a one-time note at the start of the flight for anything already on. It may not be available across all addons as not all addons report it.

Fixes

  • Custom sound packs: a missing or incorrectly chosen custom sound folder no longer fills the logs with errors, and is simply treated as having no custom packs. When you choose a custom sound folder that contains no packs for your airline, Pegasus now warns you and shows the expected folder layout so you can correct it.

  • Aerosoft A340-600 Professional (MSFS): engine start/stop is now detected from engine N1 instead of the aircraft's running flag, which flickers several times per second on this addon and could flood the flight log with tens of thousands of false engine events, breaking PIREP submission. Other aircraft are unaffected.

  • About page: the Changelog link no longer spills out of the version card and overlaps the third-party licenses list.

Changes

  • The changelog has moved to the web: open it from Settings > About > Changelog (it opens vamsys.co.uk). The in-app changelog page has been removed.

Pegasus v2.0.8

Features

  • Beta updates opt-in: choose the Beta or Stable update channel in Settings > Updates, and switch back at any time.

  • Position reporting rewritten to be more resilient: reports are batched, sampled adaptively, and queued during connection drops then resent on reconnect, so a dropped connection no longer leaves gaps in your flight track. Flight events are recorded in more detail.

  • Refuelling is now detected and recorded as a flight event.

Fixes

  • Startup is hardened: if a required component is missing (a broken or incomplete install), Pegasus shows a clear message to reinstall instead of failing silently.

  • If a downloaded update cannot be installed (for example a security policy such as Windows Application Control, AppLocker or Smart App Control, or antivirus, blocks the updater), Pegasus now explains why and how to allow it instead of failing to start, and will not run an outdated version.

  • macOS and Linux now include the .NET runtime, so it no longer needs to be installed separately.

  • X-Plane (UDP connection): fixed a recurring frame rate stutter by reading detailed simulator data only briefly around each position report instead of continuously. Turning telemetry off in Settings now also fully stops that data being read from the simulator.

  • X-Plane (UDP connection): further lowered the frame rate impact of telemetry by reading continuously-streamed background data at lower rates, especially in cruise, while keeping the fastest rate for approach and landing.

Pegasus v2.0.6

Added

  • Support for many more add-on aircraft across MSFS 2020/2024, FSX, Prepar3D and X-Plane 11/12 (PMDG, QualityWings, Aerosoft, FSLabs, FeelThere, Captain Sim and others).

  • Engine sub-variant (e.g. GE/PW/RR) is recorded where it can be detected.

  • Flap-change detection support from surface deflection, for aircraft that report flaps that way instead of as a detent index.

  • Optional flight telemetry. Opt out in Settings > Logs.

Changed

  • X-Plane connection rewritten: Pegasus finds X-Plane on the network (including on another PC), connects over UDP, and reconnects when the sim restarts. XPUIPC stays available under Advanced settings.

  • Announcement audio is decoded by its content instead of its file extension, so a mismatched extension no longer stops playback. It is no longer loaded into memory in full.

  • Removed an MSFS connection setting that could leave it disconnected.

  • Clock sync uses multiple time sources and refreshes hourly, with a fallback for restricted networks.

Fixed

  • Crashes and stuck connections when X-Plane is closed or restarted.

  • Engine start and shutdown detection on ToLiss aircraft in X-Plane 11.

  • A crash when an alert appeared before the main window was ready.

  • Stray text in the update and minimise dialogs.

vAMSYS v5.4.7

What's new

  • 300 ft AFE stabilisation gate

    VA owners can now configure a 300 ft above-field-elevation stabilisation gate in the scoring rules — useful for matching real-world carrier policies (e.g. Alaska Airlines). Pegasus now emits 300 ft landing reports to support it.

What's improved

  • Event-slot dispatch is now locked to the event

    When dispatching an event slot, the departure time auto-fills from the slot and locks, and the route picker is constrained to the event's own route(s) — regardless of the pilot's current location. Direct URLs can no longer dispatch an off-event route onto a slot.

What's fixed

  • PIREPs getting stuck on "Processing" with no points awarded after a stabilised approach, caused by airline gate altitudes being stored as text

  • 500 error when dispatching event-slot flights, caused by the forced network being dropped from the form

  • Event detail pages returning a 404 for plain Event activities even though they appeared in the events list

  • Pegasus PIREP filing returning a 500 when the filing pilot had been deleted — it now returns a clear "pilot not found" error

  • A pilot with no rank causing a 500 wherever their name-with-rank was displayed

  • Route creation accepting airports outside the caller's own airline network (cross-airline leak); foreign airports are now rejected

  • Stabilised-approach scoring failing a go-around because of an unstable reading from an abandoned earlier approach — only the final approach is now evaluated

  • Intermittent error on the Phoenix flight-center dispatch form caused by the event-slot reservation not surviving a live update; the callsign field could also wrongly become editable

  • Crash when processing Discord staff updates for a staff member whose airline had been removed, and one bad record aborting a bulk duplicate-pilot merge

  • 500 during server-to-server pilot name changes when no user was authenticated

vAMSYS v5.4.6

What's new

  • Slotted Events — departure-slot booking for events (launching in beta)

    A new activity type for running structured flyouts and delivery events. Instead of every pilot trying to depart at once, you publish a grid of departure times organised into Waves, and each pilot reserves a slot — reserving is their event registration, so there's no separate sign-up step. Waves can unlock progressively (immediately, once the previous wave fills, or at a set time), and slots are tracked separately per network, so the same 09:00 departure can be held by one pilot on VATSIM and another on IVAO. On the day, the pilot dispatches from the event page straight into the normal Dispatch flow, with their reserved callsign and network locked in. Set it all up from a new Slotted Events tab in Orwell. We're launching this in beta capacity — expect us to be watching closely and ironing out rough edges quickly in the days after release.

  • Fresh activity window for returning pilots

    When a pilot leaves and rejoins your Virtual Airline, you can now give them a fresh initial-activity window — exactly as if they were a new joiner — without changing their join date, stats, history or pilot number. This fixes the long-standing trap where a rejoining pilot would land back on the roster already past their activity window and get removed again the next night, with no way to tell why. When the window is reset, both the removal deadline and the activity reminder re-arm from the day the pilot returns. This applies to self-service rejoins and to staff restores alike. The new controls:

    • Reset Initial Activity Window on Rejoin — a toggle in Settings → Registration Settings (under your Rejoining options). Off by default, and only shown when Rejoining is enabled.

    • Returning Pilot Email — alongside it, choose what a returning pilot is emailed: Use the new-pilot welcome email (your existing one), or Use a separate returning-pilot email.

    • Returning-pilot email template — if you pick the separate option, write its own subject and content under Settings → Registration Emails. Leave it blank and no email is sent.

    • Restore action options — restoring a removed pilot in Orwell now offers a matching Reset initial activity window toggle (defaulting to your airline setting) and a Notify pilot by email toggle. Staff restores were previously silent, so this is the first time a restore can tell the pilot they're back.

  • A quick connection test

    Pilots will have seen a short invite on their dashboard to run a one-minute connection test from the browser. This is a temporary measurement exercise to help us understand connection quality around the world .

What's improved

  • One active booking per route

    You can now only hold one active booking for a given route at a time. Trying to book a route you've already got open is blocked. We also closed a related case where switching Virtual Airline mid-dispatch could create a booking under the wrong airline.

  • No more duplicate PIREPs or claims

    Double-submitting a flight report, or a tracker retrying after a dropped connection, could previously file the same flight twice or claim the same booking twice. Filing and claiming are now race-safe: a booking can only ever hold one active PIREP, and a retry returns a clear "already filed" or "already claimed" response instead of quietly creating a duplicate.

  • Clearer PIREP review with Submit & Decide

    Staff landing-rate decisions are now made on a single Submit & Decide panel (Reprocess, Accept, Reject or Invalidate). A decision made while a PIREP is still reprocessing is now applied safely once reprocessing finishes, instead of clashing with it — closing a race that could leave a PIREP in an inconsistent state. PIREPs that staff have already actioned no longer get re-flagged for review.

  • Alternate Finder no longer hides airports with old or missing weather

    Previously, any candidate airport whose weather was more than a few hours old — or that had no recent report at all — was silently dropped from the Alternate Finder, so viable diversion airports simply didn't appear. The finder now always lists the airport and shows its last known weather with a clear label ("Stale" with an age, or "No recent weather"), leaving the judgement to you. Relatedly, the booking page no longer blanks out a METAR once it's a couple of hours old — it shows the latest available observation.

  • Global weather data flowing again

    Fixed the upstream feeds that meant METAR and TAF data had stopped updating for many airports. Weather across the platform is being populated reliably again.

  • Operations API: older integrations no longer rejected

    Fixed a case where integrations built on older API clients could be unexpectedly rejected when their access token refreshed, despite nothing changing on their end.

  • Faster across the board

    The leaderboard year selector now loads roughly 250× faster, and a round of query work has sped up route creation, event filters, auto-reject rule editing, the hubs API, activity editing, the book-a-flight map and the flight generator. Behind the scenes we also rebuilt how flight position data is stored, reclaiming hundreds of gigabytes while keeping the live map fast as flight history keeps growing.

  • Saved OFP PDFs now kept for 90 days

    Downloadable OFP PDFs are now removed 90 days after a flight. Your flight history and PIREP details are kept in full — only the saved PDF for older flights is no longer available to re-download.

What's fixed

  • Flights with an incorrectly formatted alternate airport could silently fail to generate an OFP, leaving you with no flight plan and no error — alternates are now cleaned and validated so SimBrief planning works reliably

  • The connected-apps page (Your Apps) erroring for some users

  • Saving a route occasionally crashing, and switching Virtual Airline in another tab leaving you editing under the wrong airline

  • A malformed pagination cursor on Operations API list endpoints returning a server error instead of a clear validation message

  • Invalid filter values on the Operations API PIREPs endpoint returning a server error instead of a clear validation message


⚠️ Operations API breaking change

To comply with Planespotters' terms, aircraft image fields on the live flight-map endpoint now return null when the photo is sourced from Planespotters. If your integration reads aircraft photos from this endpoint, expect null values for Planespotters-sourced images — airline-uploaded images are unaffected. The Phoenix flight map and Pegasus continue to show these photos with attribution, so pilots see no change.

vAMSYS v5.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

vAMSYS v5.4.4

What's new

  • Bulk hide and unhide aircraft in Phoenix
    Select multiple aircraft in the Orwell aircraft list and hide or unhide them in Phoenix in one go - useful when part of your fleet moves in or out of maintenance. Updates run in the background, so even very large fleets are processed without timeouts.

  • More powerful route export filters
    Route and routing CSV exports can now exclude as well as include. The tag filter has three modes - routes with any selected tag, routes without any selected tag, or completely untagged routes. Route exports can also exclude by internal remarks and filter by visibility (all, visible only, or hidden only).

What's fixed

  • Saving a badge in Orwell admin caused a fatal error on every edit

  • Manual PIREP submission returned a 500 error when the airline's Discord review channel had been deleted - the PIREP was saved correctly, but the pilot saw an error; stale channels now clear themselves automatically

  • Rank, Badge, and Reward Settings forms crashed with a server error when saving very large points or bonus values — these fields now enforce sensible maximums

vAMSYS v5.4.3

What's new

  • APOC Network Support
    Full integration with the APOC (Apocalypse Flyleague) online network, joining VATSIM, IVAO, and POSCON. Pilots can link their APOC CID in social settings, and VA owners can use APOC in network restrictions, activity settings, scorer and OAuth scopes.

  • Activity Repeat-Until Date
    Recurring activities can now have an end date. Once the repeat-until date is reached, the activity stops replicating automatically — no more manually deleting future occurrences.

  • 2-1-3 Engine Start Sequence Scoring
    New scoring rule for 3-engine aircraft that awards correct centre-first engine start sequence (engine 2, then 1, then 3). Available as a selectable option in Orwell scoring group configuration.

What's improved

  • Activity Listing Filters
    Activity type tabs now filter to current activities by default. A new Personal Roster tab separates pilot-created roster items from VA-planned events, and the "All" tab has been renamed to "VA All" for clarity.

  • SimBrief Plan Format Priority
    Plan format selection now correctly follows the full override chain: Pilot preference, Aircraft, Fleet, then Airline default. Previously, aircraft and fleet-level overrides were skipped.

  • Account Deletion Messaging
    Replaced internal terminology with clear, user-friendly messaging when accounts are deleted — now explains what happened and provides links to VA and vAMSYS support.

  • Featurebase feedback widget replaced with the in-house vAMSYS Feedback system across the entire platform

What's fixed

  • Landing Distance Available calculation using full runway length instead of usable landing distance, overstating remaining runway on touchdown analysis

  • Runway profile graphic incorrectly inflating the rendered runway length by double-counting displaced thresholds

  • Destination map showing expired and future-dated routes that should not be available for booking

  • Booking page METAR display using wrong data field

  • Flight map failing when airport has no ICAO code

  • Network IDs not being transferred when merging duplicate user accounts

  • Dashboard booking and PIREP summary box items not aligning correctly

  • Marketing subscriber export including pilots with deleted user accounts

  • Activity restrictions not parsing network and landing rate settings correctly in the API

  • Recurring events re-sending Discord notifications on each replication

  • Activity sidebar allowing title without content and vice versa

  • Non-numeric PIREP filter values causing server errors instead of returning empty results

  • Webhook documentation Node.js example using re-encoded body for signature verification

vAMSYS v5.4.2

Internal refactoring, query improvements and other back-end work.

For latest substantive changes see vAMSYS 5.4.1 changelog

vAMSYS v5.4.1

What's new

  • Configurable Dashboard PIREP/Booking Boxes
    VA owners can now choose which data fields appear in PIREP and Booking summary boxes on the Phoenix dashboard. Pick from fields like flight time, landing rate, landing G, aircraft, fleet, network and more — all configurable from the Dashboard Builder in Orwell.

What's improved

  • Community Goal Percentile Accuracy
    Percentile calculation for community goals has been corrected - rank 1 now properly qualifies for the top 10% tier instead of being miscalculated. Tier thresholds have been unified across all community goal features for consistent results.

  • Selected Engine Taxi-In Scoring
    Multi-engine taxi-in scoring no longer falsely rejects valid procedures where the first selected engine shuts down slightly before on-blocks while the last engine shuts down at on-blocks.

  • Auth Page Security Hardening
    Airline login and registration pages have been hardened against crafted requests.

What's fixed

  • Personal rosters from Flight Generator appearing in Orwell's activities listing alongside VA-planned events

  • Flight booking filter options not refreshing after jumpseating to a new airport

  • Errors when viewing orphaned pilot accounts without linked users

  • SimBrief fuel configuration failing when airframe fuel options are incomplete

  • Curated roster sidebar entries appearing when no entries are visible to the pilot

  • Incorrect registration count shown on curated rosters listing page

  • Airport exporter load factor queries failing

  • Tour point updates failing when restrictions are not set

  • Stripe API failures causing crash instead of failing gracefully

  • Badge creation failing when bonus points percentage option is not set

  • Fixed gear aircraft (e.g. C208 Caravan) being auto-rejected for "gear up landing" when gear state cannot be determined

  • PIREP point values overflowing when extremely large values are saved

  • Scoring rules overview not sortable by group count column

  • Route tag suggestions query failing

  • Infinite recursion when loading activity completions

  • Mail preview failing when email content is missing

  • PIREP landing rate filter applying incorrectly

  • Operations API not returning accepted or rejected registrations when filtering by status

  • Touchdown data values not being cast to their correct types from the API

  • OAuth request logs failing when URL or user agent exceeds column length

  • OAuth authorization failing on non-numeric client IDs instead of returning a proper error

  • Deleted user accounts causing errors on registration lookups - now shows "Deleted User"

  • Socket-based page refresh failing when airline context is missing

vAMSYS v5.4.0

vAMSYS 5.4 is a major 5.0 release introducing the Pilot API, Pilot Passport, personal rosters, bonus points system changes, activity flight type exclusions, hot weather scoring exemptions, new autoreject rules, and significant performance improvements across the platform.

What's new

Some items are Launch Only

Some changelog items, even if configured in Beta environment, will not take effect until 5.4 is out to public release - 16th March at the earliest. For example:

  • Generated Roster Leg tracking
  • Staff Bonus Points
  • New Scorers/Autorejects
  • Activity requirement changes
    will work only when 5.4 launches

Pilot API

A brand-new OAuth PKCE API for third-party pilot-facing applications. Developers can build apps that authenticate pilots and access their data within the context of a specific Virtual Airline. The Pilot API offers over 40 endpoints across 10 granular scopes, covering:

  • Profile & Identity — pilot profile, rank, statistics, statistics breakdown, badges, holidays, preferences, location, and hub.

  • Bookings & Dispatch — list, create, and cancel bookings; generate dispatch URLs; link SimBrief OFPs.

  • PIREPs — browse flight history, view position reports and flight profiles, read and post comments.

  • Manual PIREP Claims — submit, view, and delete manual flight claims.

  • Activities & Rosters — register for activities, track progress, manage personal rosters.

  • Favourites & NOTAMs — toggle favourite aircraft and airports, browse and acknowledge NOTAMs.

Full OpenAPI documentation is auto-generated and available via the Scalar documentation viewer. OAuth clients are created and managed in Orwell.

Personal Rosters & My Rosters

Pilots can now save generated rosters from the Flight Generator as personal rosters. Personal rosters require a minimum of two legs and appear on the new My Rosters page alongside any registered curated rosters. Each roster includes progress tracking with real-time updates, dispatch integration for booking individual legs, and an interactive map showing the full route.

Registering for a curated roster now also adds it to My Rosters, giving pilots a single unified view of all their active rosters. Pilots can unregister from curated rosters directly from this page.

Bonus Points

Three new bonus scoring tiers can be applied to PIREPs, each configurable as fixed points or a percentage of the base PIREP score:

  • Staff Bonus — bonus points awarded on every PIREP filed by a staff member. Configured in PIREP & Reward Settings.

  • Badge Bonus — per-badge bonus points awarded on PIREPs when the pilot holds that badge. Configured on each badge individually.

  • Airport Manager Bonus — the existing Airport Manager bonus now supports percentage mode alongside fixed points.

All bonus types support custom display names.

Activity Flight Type Exclusions

Staff can now exclude specific flight types from pilot activity requirement checks. Excluded flight types do not count towards or against activity thresholds for both initial and ongoing requirements. Configure this in Orwell under Settings > Activity Requirements.

Hot Weather Flap Exemption

Parking flap scoring rules (Flaps Retracted Before Parking / Flaps Not Retracted Before Parking) now support a hot weather exemption. When the arrival airport temperature exceeds a threshold (determined from METAR data within 6 hours of arrival), an alternative flap range can be accepted. This prevents pilots from being penalised for leaving flaps extended in hot weather conditions. Configurable per scoring rule with minimum/maximum flap positions and optional bonus points.

Phoenix Dashboard Hide/Show Toggle

Each Phoenix Dashboard component now has a hidden toggle. Hidden components preserve all their configuration (size, position, settings) and can be quickly toggled back without re-entering settings. This makes it easy to seasonally enable or disable dashboard sections.

Flight Time on Activity Cards

Activity cards in Phoenix now display estimated flight time information. Tours and rosters show the total flight time, while airport-based events show a time range. This helps pilots gauge the time commitment before joining an activity.

Operations API Enhancements

  • OAuth Scopes — five granular scopes for Client Credentials tokens, allowing read-only tokens safe for public use. Fully backwards-compatible — existing tokens continue to work without changes.

  • See the separate Operations API changelog entry for full technical details including breaking changes.

Route Tag Review Autoreject

A new autoreject rule lets staff configure specific route tags (such as Exam or Checkflight) that automatically trigger PIREP rejection when a pilot flies a tagged route. Tags are configured per rule in the AutoReject Rules settings.

Engine Start Sequence Autoreject

Airlines can now automatically reject or flag PIREPs for review when engines are started in the wrong order. Configure the required start sequence (Engine 1–4) and set fleet-specific overrides for aircraft types that require different start orders. Uses the same violation detection as the existing Engine Start Sequence scoring rule. The required sequence is displayed to pilots on the Scores page.

Pilot Passport

A new section on pilot profiles that tracks every airport and country visited across your flights. See your exploration progress with country and airport completion percentages, per-country progress bars, and detailed airport visit histories including visit counts and first/last visit dates. Countries where all route network airports have been visited earn a gold star. Airports you have visited that are later removed from the route network are preserved as historical stamps — your visits are permanent.

What's improved

  • Curated Roster enhancements — curated rosters now support optional completion points (fixed or percentage), fleet-type-per-leg selection as an alternative to specifying individual aircraft, and points-as-percentage mode.

  • Roster name overrides — customise the "My Rosters" label, roster generator label, and roster type labels to match your Virtual Airline's terminology.

  • Orwell Profile link — staff can access Orwell pilot profiles directly from the Phoenix pilot profile page.

  • Dispatch information — callsign and flight number are now displayed in dispatch route information.

  • PIREP weight — all displayed flight counts throughout Phoenix now respect the pirep weight setting used during Transfer/Manual PIREP creation.

  • SimBrief OFP from booking detail — pilots can generate a SimBrief OFP directly from the booking detail page without returning to the dispatch screen.

  • Pilot search in Orwell — staff can now search for pilots by real name (in addition to username) across all pilot selection fields, including the Award Badge modal, Holiday management, Rank assignments, and Pilot Notes.

  • Dispatch Table columns — column visibility is now controlled entirely by the airline's dispatch box settings in Orwell. The pilot-facing column toggle has been removed for a cleaner, consistent experience.

What's fixed

  • Duplicate pilot accounts being created by repeated restore operations

  • ICAO/IATA airport lookup failing for lowercase input in route creation

  • Null flight distance on non-jumpseat routes — existing affected routes have been backfilled

  • Integer overflow when creating PIREPs through pilot invite with very large values

  • Leaderboard rank position mismatch in the My Position panel — deleted pilots and the system user are now excluded from ranking calculations

  • Route bulk actions could process an unlimited number of records — now capped at 500 and converted to batch SQL for reliability

  • Missing pirep_analytics_count column in Ranks pilot list

  • OpenAPI specification type mismatches causing documentation viewer errors

  • Hidden filter not working correctly in Fleet and Aircraft lists

  • API 500 errors caused by Spatie Data structure caching

  • Flight length arrival time calculation producing incorrect values

  • Various N+1 query issues: activity detail page reduced from 170+ to approximately 80 queries, with fixes also applied to the events listing and tour/roster tables

  • Hidden aircraft could be booked via pilot favourites, bypassing the visibility filter

  • Map sprite and glyph assets pointing to external URLs that intermittently failed — now self-hosted

  • Create Booking button becoming permanently disabled after form validation failure (e.g., passenger count exceeding maximum), requiring a page reload

  • Orwell edit pages crashing when a record was deleted while the page was open — users are now redirected to the listing page with a notification

  • Operations API scope enforcement not resolving wildcard tokens against the client's configured allowed scopes

  • Selected Engine Taxi In scorer falsely failing PIREPs when multiple engines were selected — the on-blocks timing check has been removed as it conflicted with multi-engine shutdown sequences

Performance

  • Column selection added to all Operations API index endpoint eager loads, reducing data transfer and query times

  • Covering partial index added for pilot listing by airline

  • Middleware audit: hot paths cached, dead code removed, OAuth logging made asynchronous

  • Three duplicate queries per page load eliminated from middleware and layout

vAMSYS v5.4.0-Operations API

This entry covers all changes to the Operations API shipping with vAMSYS 5.4. If you integrate with the Operations API, review the breaking changes section carefully and update your consumers. vAMSYS 5.4 Beta is not due to launch publicly till 16th March at the earliest.

Breaking changes

/routes pagination keys renamed

The GET /routes endpoint previously returned cursor pagination metadata using non-standard keys. These have been renamed to match all other cursor-paginated endpoints:

  • meta.next_page_url → meta.next_cursor_url

  • meta.prev_page_url → meta.prev_cursor_url

Consumers of GET /routes reading these keys must update to the new names. All other cursor-paginated endpoints already used the correct keys and are unaffected.

Viable upgrade path would be to update your various scripts to look for xxx_cursor_url and try to default to xxx_page_url if former is not available; This will make your scripts work with current 5.3 and will not error out when 5.4 goes out.

Action endpoints now wrap responses in data key

The following action endpoints previously returned fields at the root level of the JSON response. They now wrap all fields under a "data" key, consistent with every other endpoint in the API:

  • POST /registrations/{id}/approve and /reject

  • POST /transfers/{id}/approve and /reject

  • POST /ranks/reorder

  • POST /ranks/{id}/pilots/{pilot_id} (honorary rank)

  • POST and DELETE /hubs/{id}/pilots/{pilot_id}

Consumers reading response.message, response.email_sent, response.manual_pirep_queued, response.pilot_id, response.hub_id, or response.rank_id should update to read from response.data.* instead.

What's new

OAuth Scopes

Five opt-in OAuth scopes are now available for Client Credentials tokens. Existing tokens issued without scopes continue to work with full unrestricted access — no action required. New tokens that explicitly request scopes are restricted to matching endpoints only.

  • ops:read — all GET endpoints (fleet, routes, airports, pilots, PIREPs, bookings, statistics, activities, flight map).

  • ops:config:write — create, update, and delete fleet, aircraft, airports, hubs, ranks, badges, routes, parameters, containers, load factors, routings, alerts, and NOTAMs.

  • ops:flights:write — cancel bookings; manage PIREP comments, points, bonus points, need-reply flag, internal notes, times; select landings; manage pilot notes.

  • ops:moderation:write — PIREP accept, reject, and invalidate; pilot banning and deletion; registration and transfer approve/reject.

  • ops:activities:write — create, update, and delete events, tours, rosters, focus airports, community goals, community challenges, and activity registrations.

Scopes are configured per-client in the Orwell API settings panel. A token with only ops:read is safe to embed in client-side JavaScript for public displays. Tokens missing a required scope receive HTTP 403 with error "insufficient_scope".

New response fields

  • Booking responses — new user_route field containing the pilot's custom route string (or null).

Custom URI Schemes for OAuth

OAuth clients can now use custom URI schemes (e.g., myapp://callback) as redirect URIs, enabling native desktop and mobile applications to implement OAuth flows. Plain HTTP remains blocked; HTTPS and any custom scheme are accepted.

CuratedRoster enhancements

POST /rosters and PATCH /rosters/{id} now accept optional points configuration and fleet-level aircraft assignment per leg for CuratedRoster types:

  • Optional points — points, points_as_percentage, time_award_scale, restrictions.award_per_leg, and restrictions.activity_complete fields. Points default to 0 if omitted.

  • Fleet-per-leg — legs[].aircraft_type_id assigns a fleet type instead of a specific aircraft. For CuratedRoster legs, either aircraft_id or aircraft_type_id must be provided (previously aircraft_id was always required).

What's improved

  • All endpoints returning 422 Unprocessable Entity now document validation error responses in the OpenAPI specification.

  • Path parameters are documented with descriptions across all controllers.

  • Column selection added to all index endpoint eager loads, reducing query counts and response times.

What's fixed

  • GET /pireps/{id}/touchdowns returning 500 when the PIREP had no touchdown data.

  • PUT /badges/{id} returning 500 on every request due to an internal data class method error.

  • PATCH /parameters/{id} returning 500 when updating string or array fields.

  • GET /routes with fleet_id filter returning 500 due to an incorrect subquery reference.

  • PUT /ranks/{id} throwing a mass assignment error in certain update scenarios.

  • GET /ranks/{id}/pilots returning an error when pilots existed on the rank.

  • GET and PATCH /pilots/{id}/notes returning 500 due to a computed attribute eager-loading conflict.

  • Scope enforcement not resolving wildcard tokens against the client's configured allowed scopes — wildcard tokens are now properly resolved to the client's actual allowed scopes for per-endpoint enforcement.

  • OAuth Authorize page content being clipped when a client requests many scopes, making the Authorize button unreachable.

vAMSYS v5.3.38

What's improved

  • Automatic cleanup of orphaned transfer records
    Transfer records where the pilot has been deleted are now automatically cleaned up daily, preventing stale data accumulation.

What's fixed

  • Double-clicking the Create Booking button could create duplicate bookings

  • Live flight map ETA always showing as null

  • Community Goal tier calculation mismatch between displayed tier and actual reward tier

  • Reset Map button in Book Flight leaving the map in an unresponsive state

  • Freight and cargo amounts displaying incorrect values for imperial unit users in Community Goals

  • Transfer review page crashing when the transferring pilot has been deleted

  • Bulk PIREP reprocess attempting to process PIREPs without ACARS records

  • Community Goal and Challenge progress components failing to load rank informat

vAMSYS v5.3.37

What's fixed

  • Error when accessing activity logbook for newly registered pilots before their logbook record was created

  • SimBrief airframe sync showing duplicate success notifications when updating multiple airframes

  • Notification panel errors caused by corrupted session data

  • OAuth login failures when client ID was empty

  • Error when generating a new callsign from the booking sidebar

  • Pilot full name not displaying correctly in certain API and export contexts

  • URL validation errors when creating or updating records via API v3

vAMSYS v5.3.36

API Breaking Change

The flight-map endpoint (/api/v3/operations/flight-map) now excludes position reports by default for performance reasons. To include position history, add include_posreps=true to your request.

What's new

  • Preparation work put in place for Pegasus Addon API
    New API for Pegasus to identify addons via our backend API, instead of being hardcoded into Pegasus builds.

What's improved

  • API v3 Performance
    Pilots endpoint with statistics is now 10-25x faster. Flight map endpoint is 5-37x faster with position reports now optional for better performance.

  • Changelog entries now served from vamsys.co.uk and vamsys.io picks up new releases automatically

What's fixed

  • Route filtering on flight distance in Orwell causing invalid database queries

  • Badge selection allowing null badge submissions

  • Version service type error caused by stale cache entries

  • PIREP position reports not displaying on Orwell map

  • Several Dashboard boxes having some undefined widths, which are available for selection in Orwell

  • Aircraft icon URLs not using absolute origin and defaulting to basic icon on flight maps