Changelog

Follow new updates and improvements to PERFLIGHT.

March 6th, 2026

Added

  • Enhanced Error Logging - Toggle errors are now logged to %APPDATA%\com.sim.perflight\error.log for easier troubleshooting

  • Library Filter Status - Library Manager now shows an Enabled Only or Disabled Only badge in the header next to the library/add-on/size totals when those display filters are active

  • Caution/Warning Lights - New design pattern for triggered MASTER CAUTION and MASTER WARNING button states replacing Simulator Status pills (preview with Control-Shift-W)

Fixed

  • Sets Add/Remove Now Creates/Removes Junctions - Adding or removing an addon from an active Set now properly creates or removes the filesystem junction in the Community folder

  • Community Folder Selection - Manual folder picker during simulator detection now accepts selecting the Community folder directly or its parent folder

  • Cross-Library Move Detection - Addons that move between libraries are no longer incorrectly soft-deleted during scanning

  • Elevation Prompt Detection - Admin elevation modal now triggers correctly on all Windows locales and security configurations

  • Source Path Validation - Addon enable now verifies the source folder exists before creating a junction, preventing broken links to moved or deleted folders

  • Toggle Error Messages - Backend error details are now shown to the user instead of generic "Failed to toggle addon" messages

  • Reconcile Improvements - Reconciliation button on DATA page now catches addons where the database contradicts itself (enabled vs actual state mismatch) and brings the database back in sync with filesystem reality

Changed

  • Launch Windth - Initial window width upon launch increased to 1260px by 920px to show 4 addons per row, still reducible to 1024 x 600 (minimum)

February 27th, 2026

Added

  • Custom Category Management - Categories are now editable database records instead of hardcoded values. Create, rename, and reorder categories from the Data page; addons group by category ID so renames propagate instantly.

  • Reassignable Scanner Tags - All 9 scanner tags are moveable between categories now, including unknown, allowing users to control where unrecognized addons land. For example, if you decide to create a separate "Liveries" category, you can move the livery scanner tag there so new liveries are categorized correctly without manual intervention.

  • Library Management on Data Page - Rename, delete, and open individual libraries from the Library Breakdown section via a kebab (three-dot) menu on each row

  • Per-Library Max Depth Display - Data Management page now shows the deepest folder level at which addons were found in each library, helping users choose an appropriate scan depth setting

  • Drag-and-Drop Photo Upload - Drag an image onto the Edit Addon Modal's preview area to replace the hero image instantly. Validates file type (JPG/PNG/WebP), size (<10MB), and single-file drops with inline warnings

  • Admin Elevation Handling - App detects "Access denied" junction errors and offers to restart with administrator privileges

  • Show Library Name Toggle - New toggle in Library Manager settings to show the Library name before the folder name on the cards

Fixed

  • Flightplan Units: Metric vs Imperial - Flightplan now properly reads the <units> field from the SimBrief XML and displays distances in either kilograms or pounds accordingly

  • Navigation State Persistence - App now correctly restores the active tab after refresh or relaunch

February 20th, 2026

This update brings some great QOL improvements, as well as critical changes for Steam support. The Checklist now has β€œTier 2” and β€œTier 3” smart action matches for your addons, as well as options to find or purchase addons for your aircraft, arrival or departure airports. And to the user who has over 5,000 addons, thank you for requesting scrollbars. They have been enabled through the Library gear settings menu!

Added

  • Smart Actions Multi-Match - Smart Actions now return all matching addons per flight plan slot, not just the first

    • Tier 1: Exact ICAO match on the icao field (case-insensitive) for aircraft, departure, and arrival

    • Tier 2: Automatic substring matching across displayName and packageName (runs on render, no manual trigger)

    • Tier 3: ICAO family expansion for aircraft β€” e.g., "A359" finds all A350-family addons via ICAO Doc 8643 dataset

    • New Find/Shop buttons (FS Addon Compare, Flightsim.to, iniBuilds, Contrail) for matching aircraft and airports

  • Checklist Set Activation - "Activate Addons" checklist step now supports selecting an entire addon set

    • Unified search picker in StepTemplateDrawer returns both sets and individual addons

    • Sets appear first in results with addon count badge and distinct visual indicator

  • Library Manager Scrollbars - Elegant auto-reveal scrollbar and scroll-to-top navigation

    • Centered "Back to top" pill button appears after scrolling 200px

    • Scrollbar visibility toggle in library settings gear menu (persisted via localStorage)

    • Global scrollbar hiding with .scrollbar-elegant opt-in class

  • Multi-Simulator Detection - App now scans all four known MSFS installation paths and lets users choose

    • Detects MSFS 2024 (MS Store), MSFS 2024 (Steam), MSFS 2020 (MS Store), and MSFS 2020 (Steam) simultaneously

    • If one installation found: auto-confirms with "Choose a different simulator" escape hatch

    • If multiple found: shows selection cards with simulator name and Community folder path

  • Version Check - Clicking the version number in the title bar triggers a manual update check

    • Bypasses the 6-hour TTL so users can check on demand

    • Initial 5-second update check on launch also bypasses TTL so restarting within 6 hours won't skip it

  • Configurable Scan Depth Slider - Scan depth range slider (1–20, default 10) in the library settings gear menu

    • "Faster" / "Slower" labels with current numeric value display

    • Persists across app restart via localStorage

    • Rescan button moved from Libraries drawer into the settings menu alongside the slider

Changed

  • Direct Simulator EXE Launch - Probes for and launches the simulator executable directly with -FastLaunch/-FastStart flags for MSFS 2024, falling back to store/Steam detection if EXE not found

  • Serde camelCase Cleanup - Rust Addon and Library structs now serialize as camelCase JSON over the Tauri bridge, eliminating all || fallback chains across 15+ frontend files

Removed

  • typeCode field - Removed from Addon interface and all frontend components (field was never populated from database)

  • Boeing/Airbus search term expansion - Removed aircraftSearchTerms() regex-based type code munging in favor of exact ICAO matching

February 17th, 2026

Fixed

  • SimBrief Flight Plan Sync Broken in Production - Reverted unnecessary Content Security Policy restriction

    • CSP was added in v1.0.0 for frontend GA4 gtag.js loading, but analytics was subsequently migrated to Rust backend

    • The restrictive connect-src allowlist blocked fetch() calls to https://www.simbrief.com

    • Reverted to "csp": null since Tauri apps load only local content and the Rust HTTP client bypasses CSP entirely

Changed

  • Updated Discord Invite Link - Community Discord link updated in Welcome modal and website

February 17th, 2026

PERFLIGHT's first public release. After multiple beta iterations refining addon management, flight services, and the pre-flight checklist, v1.0.0 marks the official launch on Flightsim.to. This release adds automatic update notifications and addresses several checklist reliability fixes discovered during beta testing.

Added

  • Automatic Update Notification - App checks for new versions on startup and every 6 hours

    • Fetches release.json from perflight.com via Rust backend (bypasses WebView CSP)

    • Compares remote version against installed version using semver comparison

    • Shows info notification with "Update Now" button linking to Flightsim.to download page

    • 24-hour snooze on dismiss prevents repeated prompts for the same version

    • 6-hour TTL between checks to minimize network requests

    • Silently no-ops on any error (update checks never break the app)

    • "Clear All Data" resets all update check state (TTL, snooze, last seen version)

Fixed

  • Database Reset Missing Checklist Tables - "Clear All Data" now properly clears checklist_state and checklist_items tables

    • Previously, resetting data left orphaned checklist records in the database

    • Tables are now cleared in correct FK order (checklist_state before checklist_items)

  • Checklist Delete Item State Leak - Deleting a checklist step now removes its check state and execution state

    • Previously, only the item was removed from the list; stale checkState and executionState entries persisted

    • Optimistic delete now cleans up all three maps (items, checkState, executionState) with full revert on error

  • Staleness Sync Used Wrong Handler - Flight plan staleness "Sync now" prompt now executes the sync action

    • Previously called toggleItemChecked which only toggled the checkbox without running the step

    • Now calls executeAndCheck to actually perform the SimBrief sync

  • SQLite Foreign Key Integrity Hardening - database connections now explicitly enable FK enforcement and run startup orphan cleanup

    • Added PRAGMA foreign_keys = ON at connection initialization

    • Added startup repair for legacy orphan records in checklist, sets, operation logs, user services, and addons-with-missing-library references

    • Added FK diagnostic logging via PRAGMA foreign_key_check

  • Command Panic Reduction (Checklist + Storage + Enable/Disable) - command handlers now return structured lock/serialization errors instead of panicking on common failure paths

    • Replaced multiple db.lock().unwrap() command-path usages with lock error propagation

    • Replaced checklist config serialization unwrap() with explicit error handling

    • Hardened get_data_paths parent-dir handling to avoid null-parent panic

  • Data Reset UX Consistency - "Clear All Data" now also clears persisted library UI preference keys

    • Clears perflight-visible-libraries, perflight-enabled-libraries (legacy), perflight-view-mode, and perflight-group-by-mode

    • Prevents stale library filters/view mode from surviving a full reset

Changed

  • Addon Toggle Locking Model (User Commands) - moved user-facing enable/disable/toggle junction filesystem operations outside long-held DB mutex scope

    • Reads addon/sim status under short lock windows

    • Performs junction create/remove without holding global DB lock

    • Re-acquires lock only for reconciliation/state persistence

    • Added per-addon in-memory pending guard for duplicate toggle suppression

  • Service-Layer Runtime Validation (Warn Mode) - added Zod validation at the Tauri invoke() boundary for checklist and library payloads

    • Validation currently runs in tolerant/warn mode to preserve compatibility with existing installs

    • Invalid payload shapes now emit structured warnings for follow-up hardening

  • Analytics Backend Migration - migrated analytics from frontend gtag.js to backend Rust via GA4 Measurement Protocol

    • Client-side gtag.js was silently blocked by Tauri WebView2 sandbox restrictions

    • Events now sent as HTTP POST from Rust backend using reqwest, bypassing WebView entirely

    • Persistent client_id stored in database settings for consistent user tracking across sessions

    • Added explicit Content Security Policy (CSP) to tauri.conf.json replacing the implicit default

February 14th, 2026

Finally! The Checklist feature is ready for departure. This is truly the main reason for this app, and all the other neat features were added early on to finally enable an actual pre-simulator checklist process. Highly flexible, tied to your service apps (and websites) so you never forget a critical step. Also includes our first taste of a β€œSmart Action” which will help ensure you have activated addons for your flight, or assisting in finding new ones!

Added

  • Pre-Flight Checklist (Epic 10) - Customizable step-by-step preflight workflow

    • Six step types: Sync Flight Plan, Launch Service, Open URL, Manual Reminder, Activate Addons, Launch Simulator

    • Steps execute their action when checked (SimBrief sync, app launch, addon activation, etc.)

    • Builder mode with drag-and-drop reordering, add/remove steps, and type-specific config pickers

    • Smart sub-actions: flight plan-aware addon prompts for aircraft, departure, and arrival airports

    • One-click addon activation from smart sub-actions with active/inactive/missing status

    • Provider-specific marketplace search (Flightsim.to, iniBuilds, Contrail) for missing addons

    • Flight plan staleness detection with 24-hour threshold and refresh prompt

    • Launch Simulator enforcement toggle to block launch until checklist is complete

    • Ready indicator with progress counter on the Launch Simulator step

    • Per-step loading spinner, success flash, and error feedback with retry

    • "Include smart items" and "Allow incomplete launch" settings persisted to database

  • Google Analytics Event Framework - Production telemetry for understanding app usage

    • Lightweight analytics service with pluggable GA4 backend via window.gtag

    • app_launched, page_view, and checklist-specific events

    • Graceful degradation: silently no-ops when GA4 unavailable

January 27th, 2026

Another one of the final steps towards v1.0! In order to implement the final launch feature β€œChecklists” we needed to support URL buttons as well as EXE. So we took the time to clean up and polish the Flight Service Grid, allowing more extensive customization of your custom buttons. We also increased the Services panel to 60% width. We also took another pass at improving the simulator auto-detection and completely removed version detect, as it seemed unnecessary. I think we all know when a new version is available. Lastly, we make some tweaks to β€œFolder watcher” to cause less alerts on files that have not truly changed. The focus is Adding or Removing addons, not β€œtouching” a config file only. Also you can β€œShow Disabled Only” for revealing the addons you may have forgotten!

Changed

  • Initialization Page Layout - Widened Flight Services panel from 50/50 to 40/60 split

    • Pilot Profiles column narrowed (content is compact by nature)

    • Flight Services grid gets more horizontal space for service buttons

    • Updated PMDG button logo and improved VATSIM/Simbrief log imports

  • Simulator Detection Simplified - Removed PowerShell-based version detection from launch flow

    • Simulator type and platform now derived entirely from the Community folder path

    • Eliminates slow PowerShell Get-AppxPackage call that caused startup delays and visible console popups

    • Removed "Checking Simulator Version" step from progress stepper (now 3 steps instead of 4)

    • Removed "Latest Version" from the status popover (was based on unreliable forum scraping)

    • Renamed "Last Checked" to "Last Verified" in status popover to reflect path verification

    • Launch modal backdrop darkened to properly obscure content behind it

Added

  • Web URL Support for Custom Services - Add web-based services alongside local executables

    • New "Web URL" option in the custom service form via segmented control toggle

    • URLs open in default browser using Tauri's opener plugin

    • Backend validation ensures URLs start with http:// or https://

    • URL services display a globe icon in the configured services list view

  • Custom Button Appearance - Personalize custom service button colors and labels

    • Native color picker for choosing a button accent color (falls back to hash-derived color)

    • Optional short label field (max 20 characters) displayed on grid buttons

    • Grid buttons now show full service name with auto-sizing text instead of 4-character abbreviations

    • Color dot indicator shown in the configured services list view

  • Custom Installer Branding - NSIS installer now displays custom PERFLIGHT artwork

    • Sidebar image on welcome and finish pages replaces default Windows blue panel

    • Header image on intermediate installer pages

  • Show Disabled Only Filter - New display option in Library Manager settings menu

    • Filter to show only disabled addons (complements existing "Show Enabled Only")

    • Mutually exclusive with "Show Enabled Only" - selecting one deselects the other

    • Both filters can be turned off to show all addons

    • "Show Missing" toggle remains independent and can be used with either filter

    • Filter preference persists across sessions via localStorage

Fixed

  • Simulator Type Misidentification - MSFS 2024 Store users no longer incorrectly shown as "MSFS 2020 - Steam"

    • Root cause: PowerShell query Get-AppxPackage -Name *FlightSimulator* did not match MSFS 2024's package name (Microsoft.Limitless)

    • When the query returned wrong or no results, the saved platform/type was overwritten with incorrect values

    • Fix: all detection now uses path-based matching which correctly identifies all four variants (2024 Store, 2024 Steam, 2020 Store, 2020 Steam)

  • Steam MSFS Community Folder Auto-Detection - Steam installations now detected automatically

    • Previously only detected MS Store paths in %LOCALAPPDATA%\Packages\

    • Now also detects Steam paths in %APPDATA%\Microsoft Flight Simulator 2024\ and %APPDATA%\Microsoft Flight Simulator\

    • Correctly identifies platform as "MSFS 2024 - Steam" or "MSFS 2020 - Steam"

  • File Watcher False Positives - Reduced spurious "Library changes detected" notifications

    • No longer triggers when opening JSON files for viewing (not editing)

    • No longer triggers when starting MSFS or ending flights

    • Now only notifies on actual addon changes: folder added/removed, or manifest.json/aircraft.cfg content modified

    • Uses content hash comparison to distinguish real edits from file access events

  • Broken Profile Logos in Production Build - VATSIM and SimBrief logos now display correctly

    • Images used hardcoded /src/assets/... paths which only work in Vite dev server

    • Replaced with proper ES module imports so assets are bundled correctly for production

January 5th, 2026

This release contains three more small changes relating to simulator path detection and custom install paths (with more to come)

Added

  • MSFS 2024 Steam Support - Proper detection for Steam version of Flight Simulator 2024

    • Detects MSFS 2024 Steam installation in steamapps\common\Limitless folder

    • Correctly identifies as "MSFS 2024 - Steam" instead of incorrectly showing "MSFS 2020 - Steam"

    • Frontend now recognizes Steam app ID 2537590 as MSFS 2024

  • Re-detect Simulator Button - "Locate Again" button added to Data Management page

    • Allows users to re-run simulator detection without clearing all data

    • Useful for fixing incorrect detection or after reinstalling simulator

Fixed

  • MSFS 2024 Custom Install Path Detection - Community folder now detected for non-default installations

    • Previously only searched for Microsoft.FlightSimulator package folders (MSFS 2020)

    • Now also searches for Microsoft.Limitless package folders (MSFS 2024)

    • Correctly reads UserCfg.opt to find custom Community folder paths on other drives

December 18th, 2025

This release is mostly focused on squashing bugs with advanced addon management (junction paths, false positives, similar folder names, missing addons, etc). We did tweak three small things in the UI, listed below.

Changed

  • Data Management UI Cleanup - Hidden "Show Data File Location" button (developer-focused feature)

  • Blank Addon Hero Image - If the user "removes" the default image, it will remain that way when restored

  • Create New Set from Addon Picker - Initial addon now pre-populates when creating a set from addon context menu

    • Clicking "Create New Set" from an addon's Sets picker now shows the addon in "In This Set (1 addon)"

    • Fixed: was searching by name instead of fetching by ID, causing addon lookup to fail

    • Picker now hides automatically when Create Set modal opens

Fixed

  • Junction Link Path Handling - Addons now persist enabled state correctly across app restarts

    • Scanner no longer sets link_path incorrectly when scanning junctions (e.g., Aerosoft One addons)

    • Reconciliation now constructs correct junction path from community_path + folder_name

    • Self-healing: corrupted link_path values (equal to install_path) auto-corrected on rescan

    • Drift detection now checks junction at correct Community folder location

    • Fixed "already exists" junction handling to update link_path correctly

    • Prevents adding MSFS Community folder (or subfolders) as a library

    • Library validation errors now display in modal only (not duplicate inline banner)

  • Bulk Operation Notifications - Enable/Disable All now uses global notification system

    • Replaced ProgressToast bubble with global notification bar per architecture spec

    • Shows "X addons activated" or "Y addons deactivated" after bulk operations complete

  • False-Positive Soft-Delete on Rescan - Scanner no longer marks all addons as missing when scan fails

    • Previously, if a rescan failed to find any addons (e.g., folder temporarily inaccessible), ALL existing addons in that library would be incorrectly marked as "Missing"

    • Now checks if library folder actually has subdirectories before soft-deleting

    • If folder has subdirectories but scan found 0 addons, skips soft-delete (scan failure)

    • If folder is truly empty, proceeds with soft-delete (user deleted all addons)

    • Added safety warning log messages when protection activates

  • Set Member Soft-Delete Cascade Bug - Deleting addon folders no longer causes mass addon loss

    • Previously, deleting an addon folder that was a member of a set caused FK constraint errors on rescan

    • This caused ALL addons in the library to be incorrectly marked as "Missing"

    • Now properly deletes set_membership entries when addons are soft-deleted

    • Soft-delete only runs if the database save succeeded (prevents cascading failures)

    • Shows notification when previously-deleted addons are restored: "X addons restored, please check for missing set memberships"

  • Restored Addons Junction Detection - Reinstalled addons now correctly detect existing junctions

    • Previously, addons restored from soft-delete were forced to inactive status even if a junction existed

    • Now runs junction reconciliation on restored addons to detect if junction still exists in Community folder

    • Restored addons show active status if junction is present, inactive otherwise

    • Fixes issue where reinstalled addons showed wrong status after uninstall/reinstall cycle

  • Addon Library Move Detection - Addons moved between libraries no longer get incorrectly soft-deleted

    • Previously, if an addon with the same folder name moved from one library to another (e.g., LIVERIES to AIRCRAFT), it would be restored in the new library but then soft-deleted when the old library was scanned

    • Now updates detected_from_library_id when an addon is found in a different library than originally detected

    • Prevents addon from being marked "missing" when it simply moved to a different library folder

December 16th, 2025

Added

  • Flight Services Grid Mode - Quick launch panel for configured services

    • Toggle between Edit and Grid modes via icon buttons in Flight Services header

    • Grid mode displays service icons in a responsive grid

    • Mode preference persists across sessions via localStorage

    • Edit mode remains available for adding/removing services

  • Centralized Test Fixtures - Salesforce Fixtures.cls pattern for test data

    • AddonBuilder - Fluent API for creating test Addon instances with all 40+ fields

    • LibraryBuilder - Fluent API for creating test Library instances

    • Fixtures factory methods - Quick helpers like minimal_addon(), simulator_status()

    • Single source of truth for test data - future model changes only update one file

Fixed

  • Set Activation/Deactivation Bug β€” Sets now properly enable/disable addons

    • Previously, activating or deactivating a set only updated the database enabled field

    • Now correctly creates/removes filesystem junctions in the MSFS Community folder

    • MSFS only discovers addons via Community folder junctions, not database state

    • This fix ensures set toggles actually affect which addons MSFS loads at startup

Changed

  • Set Toggle Result Reporting β€” Detailed success/failure feedback for set operations

    • activate_set and deactivate_set now return SetToggleResult with counts

    • Reports total_addons, succeeded, failed, and per-addon error details

    • Frontend logs results for debugging and displays errors when they occur

Technical

  • Refactored database layer: activate_set() and deactivate_set() now return addon IDs to process

  • Command layer now calls execute_addon_toggle() for each addon to perform filesystem operations

  • Added SetToggleResult and SetToggleError types in both Rust and TypeScript

  • Updated setStore.ts to handle new return types and log operation results

  • Test Infrastructure Refactoring - Migrated 8 backend test files to use centralized fixtures

    • basic_database_validation.rs, database_tests.rs, command_unit_tests.rs

    • sets_tests.rs, basic_model_test.rs, import_parser_tests.rs

    • cross_layer_integration_tests.rs - All using AddonBuilder/LibraryBuilder

    • Removed ~400 lines of duplicate inline struct creation code

Documentation

  • Added "MSFS Domain Knowledge (Critical)" section to docs/architecture/coding-standards.md

  • Added "Test Layer Separation (Critical for Backend)" guidance to coding standards

  • Expanded Section 5.6 in docs/architecture/architecture.md with detailed set activation flows