What's New
A summary of new features, improvements, and fixes in each update. This page updates automatically with every release.
1.2.3
LatestNew
- Analyze page actionability — Metric detail accordions let you expand any result in-line for more context.
- Mobile file picker — iOS and Android users can now select SD card backup files directly from their device, without needing a desktop computer.
- First-run welcome screen — A short welcome prompt greets new users on first analysis with a link to join the community forum.
- Processing time estimate — The analysis progress bar now shows a rough time estimate so you know what to expect.
- Historical trend analysis — The Trends tab now shows multi-session patterns over time, including night-to-night changes in your key metrics.
- CPAP tips drip email sequence — 5-email series sent on days 3, 7, 12, 18, and 25 after signup with practical tips for reading your data.
- Extended activation nurture emails — Activation sequence extended from 3 to 5 emails.
- Dormancy re-engagement cadence — Re-engagement now sends 3 emails at 14, 28, and 45 days of inactivity, up from 2 emails.
- New blog articles — 14 new guides published through April: What Are RERAs, What Is Flow Limitation on CPAP, How to Read OSCAR CPAP Charts, CPAP Leak Rate Explained, What Does Leak Rate Mean, How to Analyse Your CPAP Data at Home, CPAP Compliance Tracking FAQ, How to Export and Understand Your CPAP Data, Understanding Your CPAP Data, Low AHI But Still Tired, Understanding Your CPAP Pressure Settings, What Is UARS, BiPAP vs CPAP Data, and What Is Central Apnea.
- Four metrics pillar post — "The Four Metrics AirwayLab Measures" reference article covering AHI, Glasgow Index, IFL Risk, and FL Score.
- Glossary pages — Individual pages for Glasgow Index, WAT, NED, and FL Score with full definitions and cross-links.
- ResMed SD card guides — Three device-specific guides for getting SD card data off AirSense and AirCurve devices.
- FAQ schema on blog posts — Machine-readable FAQ markup added to blog articles to improve how they appear in search results.
- Internal blog cross-links — Blog posts and glossary pages now cross-link throughout the site.
- Post-purchase activation banner — A confirmation prompt appears on the analyze page after checkout with links to getting-started resources.
Improved
- Data highlights panel — "Clinician questions" renamed to "Data highlights" with more direct language describing what your data shows.
Bug Fixes
- AirCurve 11 device identification — AirCurve 11 VAuto was misclassified as iVAPS; now correctly identified.
- O2Ring CSV upload — O2Ring oximeter CSV files are now recognised during upload validation.
- AI insights reliability — Fixed 413 payload errors on large sessions and added timeout retry logic; credit exhaustion now shows a clear alert instead of silently failing.
- Mobile tab navigation — Analyze tabs no longer overflow off-screen on small devices.
- Mobile display polish — Multiple display and interaction fixes on iOS and Android .
- Tier selection through login — Chosen pricing tier is now correctly preserved when you click "subscribe" before signing in.
- Upload deduplication — Retry logic no longer submits duplicate waveform contributions on repeated attempts.
1.2.2
New
- New headline — -- "See What Your PAP Data Actually Shows" replaces effectiveness-framing headline with data-descriptive copy.
- Metrics comprehension framing — -- AHI context banner explaining what AHI does and doesn't capture, plain language tooltips for key metrics, and a new insight for low-AHI users who may still have flow limitation.
- UX quick wins — -- Upload progress stage labels , simplified upload instructions, and a mid-page CTA on the landing page.
- Social proof on pricing — -- Testimonials section and community stats bar on the pricing page.
- Mobile email capture — -- Desktop reminder signup on /analyze for mobile visitors .
- Desktop reminder emails — -- POST /api/remind-desktop endpoint with unsubscribe flow for mobile-to-desktop conversion.
- v1.2.1 blog post — -- "Clearer Language, Same Deep Analysis" release announcement.
- Internal linking — -- Homepage blog section and cross-linked blog posts for SEO.
- Point-of-use medical disclaimers — -- Disclaimer components on AI insights, clinician questions, and metric info popovers.
Improved
- MDR compliance sweep — -- Comprehensive review and rewrite of all user-facing copy across 10+ PRs.
- Better search discoverability — -- FAQ schema markup, updated meta descriptions for 6 key pages, canonical URLs, and sitemap corrections.
Bug Fixes
- Forum copy feedback — -- The "Copy Forum Post" button now shows a clear error when clipboard access is denied.
- More reliable analysis for unusual SD card data — -- EDF files with corrupted or incomplete data no longer halt the analysis pipeline.
- Privacy policy accuracy — -- Corrected waveform and oximetry data flow disclosures to accurately reflect what data is shared and when.
- Email template compliance — -- Removed MDR MUST violations from email templates .
- Sentry feedback noise — -- Removed unnecessary Sentry capture on successful feedback submissions.
Security
- Discord OAuth rate limiting — -- Request throttling on the OAuth flow prevents abuse.
- API input validation — -- 7 API endpoints now validate incoming data with Zod schemas before processing.
1.2.1
Bug Fixes
- MDR insight string violations — -- Removed 22+ MDR MUST violations from insight text strings.
- MDR AI system prompt violations — -- Removed 2 MDR violations from AI system prompt.
- MDR email template violations — -- Resolved HIGH severity MDR violations in email templates.
1.2.0
New
- SEO & LLM Discoverability Overhaul — canonical URLs on all pages, FAQPage JSON-LD on /about, Organization JSON-LD in root layout, BreadcrumbList JSON-LD on about sub-pages, expanded llms.txt with "when to recommend" and OSCAR comparison sections, sitemap cleanup, automated SEO regression test suite.
- Hypopnea & Amplitude Stability Detection — new Airway Stability section in Flow Analysis tab with Brief Obstruction Index, Hypopnea Index, and Amplitude CV metrics.
Bug Fixes
- InfoTooltip viewport overflow — tooltip now flips above the trigger when near the bottom of the viewport instead of rendering off-screen.
1.1.0
New
- Privacy Policy — — full GDPR/CCPA-compliant privacy policy covering data categories, legal basis, retention schedules, 8 third-party processor disclosures, user rights, children's privacy, breach notification, and international transfers.
- Terms of Service — — 18+ eligibility, medical device disclaimer , subscription billing and 14-day refund policy, ROSCA auto-renewal compliance, acceptable use, HIPAA disclaimer, limitation of liability, indemnification.
- Accessibility statement — — WCAG 2.1 AA target conformance with known limitations, browser/AT support, and feedback channel.
- Contact page — — 6 structured channels.
- AI consent modal — explicit consent required before first AI insights API call; explains what data is sent to Claude; persists in localStorage and logs to server audit trail.
- Consent audit trail — append-only Supabase table with RLS, hashed IP, user agent for GDPR compliance.
- Dashboard loading skeleton — for the analyze page.
- Footer Legal column — with links to Privacy, Terms, Accessibility, and Contact.
Improved
- Medical disclaimer strengthened — now includes "not FDA/CE cleared" language with link to Terms.
- Footer bottom bar — added FDA/CE disclaimer and inline Privacy/Terms links.
- CLAUDE.md — added 7 compliance conventions and 4 anti-patterns.
1.0.0
New
- IFL Symptom Risk composite metric — new 0–100% composite that weights FL Score , NED Mean , Flatness Index , and Glasgow Index into a single "how much is flow limitation driving symptoms" signal.
- IFL theory blog posts — 3 new articles based on Dr.
- Night context notes — structured per-night logging with free-text notes, persisted to localStorage, correlated by AI insights.
- Actionable AI insights — AI prompt now analyses all machine settings, correlates user-reported night context, and generates concrete investigation suggestions.
- Extended settings extraction — pulls all STR.edf machine settings plus catch-all for remaining signals.
- Metric methodology explanations — every key metric now has a "How is this calculated?" expandable section in its info tooltip.
- Progressive persistence — when localStorage exceeds 4MB, oldest nights are dropped via binary search instead of losing everything, with warning banner.
- Analysis complete banner — shows night count and date range after processing.
- Machine event parsing — EVE.edf parser extracts machine-recorded events from ResMed EVE files using EDF+ TAL format.
- Per-type event toggles — all event types now have individual toggle buttons on Graphs and Waveform tabs.
- Provider-grade chart browser — synced stacked charts with shared toolbar, touch gestures, and minimap.
- SA2 EDF oximetry parsing — auto-detects pulse oximetry from ResMed files, prioritised over CSV when both exist.
- Waveform data contribution — opted-in users contribute raw breathing patterns alongside analysis scores, with engine version tracking and incremental upload.
- Share link MVP — 30-day share links for analysis results with consent flow.
- For Providers page — marketing page for sleep consultants at with contact form.
- Night Summary Hero card — glanceable traffic-light therapy status above metrics.
- Auto-fix Sentry errors — GitHub Actions workflow for automated error fixes via Claude Code.
- Real EDF test fixtures — 3 representative nights with integration tests and Playwright E2E tests.
- Brand voice guide — with voice attributes, tone, and terminology reference.
- Centralised chart theme — as single source of truth for all chart styles.
- Contribution nudge social proof — live counter of contributors and total nights.
- AI credits synced from server — community tier credit count now reflects actual server-side usage.
- Unlimited data contribution — removed 1095-night cap; chunked batches of 1000.
Improved
- Reframed arousal-centric language — metric explanations, insights, and AI prompt now reflect that flow limitation itself may drive symptoms independently of arousals.
- Glasgow thresholds updated
- Typography upgrade — Plus Jakarta Sans for body text.
- Two-tone wordmark — "Airway" bold white + "Lab" brand-teal.
- Device-agnostic upload flow — removed ResMed-specific language; ResMed mentioned only in compatibility note.
- Dashboard density — tighter spacing, Device Settings collapsed by default, beginner-friendly progressive disclosure.
- Tab bar redesign — variant with visible underline indicator; primary tabs show full words on mobile.
- Chart UX — zoom presets as pill buttons, interaction hints near toolbar, minimap hover state.
- Improved event detection — flatness-based FL detection replacing amplitude-based.
- Consolidated Supabase clients — single module import.
- Shared rate limiter — replaced 5 inline implementations with class.
Bug Fixes
- Critical engine bugs — Glasgow weighted averaging, NED H1/H2 split, WAT FFT zero-padding, oximetry buffer-zone trimming, night-grouper date extraction.
- Security hardening — CSRF validation, rate limiting on all API routes, Stripe webhook verification, Zod validation, CSP headers.
- Accessibility — skip-to-content, ARIA labels, keyboard chart navigation, semantic heading hierarchy, screen reader announcements.
- UX quick wins — loading skeletons, error boundaries with retry, empty states, toast notifications.
- Glasgow radar chart scaling — axis domain corrected from to.
- Oximetry-only upload — no longer re-processes entire SD card.
- Heatmap/metrics table date sort — newest-first default, visible sort button.
- Demo exit preserves data — no longer clears persisted real analysis data.
Removed
- ~85 macOS duplicate files — removed Finder-created copies with " 2", " 3" suffixes.
0.6.0
New
- Auth + Stripe subscription system — full authentication flow with Supabase Auth , Stripe checkout for Supporter and Champion tiers, customer portal, and webhook-driven tier sync.
- Cloud storage system — raw SD card file upload with consent, deduplication, and waveform loading from cloud when local files unavailable.
- Flow waveform browser — interactive waveform viewer with scroll-zoom, drag-pan, keyboard navigation, pressure overlay, and event markers.
- Changelog page — user-facing route parsed from this file.
- Feedback widget — floating feedback form stored in Supabase.
- Data contribution opt-in — anonymised breathing scores contributed to research dataset with explicit consent.
- 20 Plausible analytics events — conversion funnel , engagement , and retention signals.
- Build-time version check — fails the build if version has no matching CHANGELOG entry.
Improved
- Generalised CPAP → PAP — all user-facing references updated to cover BiPAP/ASV users.
- Pricing page CRO improvements — yearly monthly-equivalent pricing, value-oriented copy, FAQ section.
- Demo AI insights — static pre-generated insights for demo mode with support CTA.
Bug Fixes
- Browser freeze on large SD cards — raised night cap to 3 years, added chunked processing.
- Synthetic waveforms — show synthetic waveform when SD files unavailable instead of dead end; don't show for real data.
- Checkout error handling — graceful fallback when Stripe price IDs are missing.
- Combined metric explanations — render as separate paragraphs instead of merged text.
- GitHub stars rate limiting — proxied through server API to avoid client-side 403s.
Security
- Auth hardening — account deletion, health check endpoint, deployment safeguards.
- RLS enforcement — enabled on and tables.
- API logging — on all 4xx rejections for audit trail.
0.5.0
New
- AI Insights MVP — optional AI-powered therapy recommendations via Claude Haiku API route.
- AI key input component — "Unlock AI-powered insights" card with API key input, stored in localStorage.
- Skip-to-content link — keyboard accessibility improvement for screen reader users.
- Medical disclaimer on forum exports — "Not medical advice — discuss results with your clinician".
Improved
- Renamed SleepScope → AirwayLab — full codebase rename including all metadata, localStorage keys, OG images, JSON-LD, sitemap, and documentation.
- Anonymized codebase — removed all personal identifiers, author set to "AirwayLab".
- AI insights route hardened — added max 90-night limit on request payload validation.
- Traffic light accessibility — metric values now include with status text.
0.4.0
New
- Custom thresholds — power users can override all 15 traffic-light threshold levels via a settings modal.
- Comparison mode — new "Compare" tab for side-by-side two-night comparison with delta badges, traffic-light indicators, and a secondary night picker dropdown.
- Enhanced PDF report — multi-page layout with:.
0.3.0
New
- Glasgow component breakdown on Overview tab — collapsible section showing all 9 Glasgow components (Skew, Spike, Flat Top, Top Heavy, Multi-Peak, No Pause, Insp.
- Heatmap metric toggles — toggle buttons in the Night-by-Night Heatmap header to show/hide individual metric rows.
- Heatmap column sorting — click date header to sort chronologically , click metric row labels to sort nights by that metric's values.
- Heatmap sparklines — optional "Trends" toggle adds a mini SVG sparkline column at the end of each metric row.
- Clickable oximetry upload from results — "No Oximetry Data" card on the Overview tab is now clickable , opens a file picker for CSV upload and re-runs analysis with oximetry data.
- Inline email opt-in in controls bar — email signup moved from bottom of results page to the controls bar.
Improved
- "Try Demo" → "See Demo" — updated button text on landing page and analyze page.
Bug Fixes
- Page wider than viewport — added to in and class to in , preventing horizontal scroll caused by wide heatmap tables or other overflowing content.
0.2.1
Bug Fixes
- Critical: Glasgow scores always 0 on real SD card uploads — ResMed BRP.edf files store flow data in L/s , but the Glasgow engine thresholds are calibrated for L/min.
0.2.0
New
- Root error boundary — — catches unhandled runtime errors with a user-friendly recovery page.
- Test suite — 6 test files with 105 passing tests covering:.
- Clipboard error handling — visual error state when clipboard write fails.
- Vitest configuration — with jsdom environment and path aliases.
Improved
- Parallelised file I/O
- Memoised derived state
- Memoised settings diff
- Memoised metrics array
- O(1) tooltip lookups
- Wrapped components in `React.memo` — , , now skip re-renders when props are unchanged.
- Wrapped callbacks in `useCallback`
- Standardised traffic-light colours
Bug Fixes
- Export crash resilience — all export functions wrapped in try-catch to prevent unhandled exceptions.
- Clipboard API fallback — graceful degradation when is rejected.
Accessibility
- Added `aria-hidden="true"` to decorative hero dashboard on landing page
- Added `aria-label="Machine settings per night"` to settings timeline table
- Added `scope="col"` to all table header cells in settings timeline
- Added `aria-hidden="true"` to decorative AlertTriangle icons in settings timeline
- Added `sr-only` text ("Settings changed") for screen reader users on change indicators
Security
- Persistence layer — — 7-day auto-expiry, 4MB size guard, bulk signal data stripped before storage, JSON parse wrapped in try-catch with corruption recovery.
- Upload validation — — file type allowlist, 500MB per-file size limit, folder structure validation, max 365 files guard.
0.1.0
New
- Initial MVP release
- Glasgow Index engine — 9-component breath-by-breath flow limitation scoring.
- WAT engine — FL Score , Regularity Score , Periodicity Index.
- NED engine — breath segmentation, NED calculation, flatness index, M-shape detection, RERA sequence detection.
- Oximetry engine — 17-metric framework: ODI3/4, T<90/T<94, HR clinical surges, coupled events, H1/H2 splits.
- EDF parser — binary EDF reader for ResMed SD card files.
- Settings extractor — STR.edf parser for daily machine settings with AirCurve/AirSense detection.
- Night grouper — date-based file grouping with session merging.
- Oximetry CSV parser — Viatom/Checkme O2 Max format support.
- Web Worker architecture — all analysis runs off the main thread.
- Analysis orchestrator — manages worker lifecycle, file grouping, result collection.
- Dashboard UI — 5-tab layout.
- Charts — Glasgow radar, trend lines, night heatmap, flow waveform, oximetry timeline.
- Export — CSV, JSON, printable PDF report, forum post formatting.
- Session persistence — localStorage with automatic restore on revisit.
- Landing page — hero section, 4-engine feature cards, privacy callout, demo CTA.
- Demo mode — 5-night sample dataset for instant exploration.
- Email opt-in — post-analysis waitlist capture.
- Privacy-first design — all processing client-side, zero data transmission.
- Dark-only theme with shadcn/ui components
- Responsive mobile-first layout
- GPL-3.0 license
Want to understand the analysis behind these features? Read the methodology documentation, explore the blog for deep dives, or check the metric glossary for definitions.