March 6th, 2026
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)
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
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
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
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!
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
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
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
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
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.
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)
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
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!
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!
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
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
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)
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
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.
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

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
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
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
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
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