v1.5.0 — Periodic Breathing, Session Waveforms & Persistent Cache
What's new in v1.5.0
Added
- Periodic Breathing Detection — AASM-compliant algorithm detects Cheyne-Stokes / periodic breathing from tidal volume waveform. Tracks episode count, total time, PB%, and average cycle length per night. Nights with ≥5% PB time are flagged as clinically significant.
- Periodic Breathing Card — New Insights page card showing aggregated PB stats with a colour-coded significance flag and a hover tooltip explaining Cheyne-Stokes respiration and management options.
- Session Waveform Viewer — Click any night on the calendar or sessions list to open high-resolution EDF signal charts: Flow Rate, Breathing Amplitude, Flagged Events, Flow Limitation, Leak, and Pressure. Periodic breathing episodes are overlaid as highlight regions on the amplitude chart.
- Persistent Session Cache — EDF files are now cached locally during every import so session waveform graphs remain accessible after the SD card is removed. No re-import needed on subsequent app launches.
- Flow Limitation & RIN Dual-Axis Chart — Combined chart on the Insights page showing FL P95 (airway narrowing) and RIN (sub-threshold flow-limited events/hr) with mild (0.10) and significant (0.30) threshold lines.
- Flow Limitation & Periodic Breathing Insight Narratives — Auto-generated plain-English clinical summaries when FL P95 exceeds thresholds, RIN is elevated, or periodic breathing is detected.
- 30-Day CMS Compliance Panel — Rolling compliant night count vs. the 70% threshold on the Insights page.
- Weekend vs. Weekday Comparison — AHI and usage delta between weekend and weekday nights.
- Light / Dark Theme Toggle — Full light-mode theme with persistent preference.
- Hover Tooltips on Insight Cards — Each insight type now shows a clinical explanation and recommended action on hover.
Fixed
- Correlations table was growing unbounded on every import — now replaced cleanly on each run.
getSleepNightKeydate-clone bug where both ternary branches produced the same result.Math.max(...largeArray)replaced withreduceto prevent call-stack overflow on long recordings.FlowLimitationChartwas recreating the Chart.js instance on every unrelated parent render — fixed withuseMemo.
Notes
- Linux users: AppImage requires FUSE — run
sudo apt install libfuse2(Debian/Ubuntu) orsudo dnf install fuse(Fedora) if the app doesn't launch - macOS users: On first launch, right-click the app → Open to bypass Gatekeeper (the app is not yet notarized)
Full Changelog: v1.4.0...v1.5.0