February 17th, 2026

[1.0.0] - 2026-02-16

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