← Back to Vitra

Changelog

What we shipped, when, and what changed.

v0.9.0

2026-06-12
A big one — a CBT-i sleep tab with an auto-filled diary, new Blood Oxygen and Respiratory tabs, a full research References library, mood-and-energy correlations, and a handful of new daily targets.
  • Added**A CBT-i sleep tab** — the gold-standard, drug-free method for better sleep, made something you can actually follow. A sleep diary auto-fills from your ring each morning (and you can correct any night by hand), your sleep efficiency is tracked against the 85–90% target band, a wake-up heatmap shows the clock hours you tend to surface, and opt-in sleep-window guidance suggests a time in bed anchored to your own wake time. The sleep-restriction window stays behind a toggle on purpose — it has real contraindications — and everything is worked out on your machine.
  • Added**Blood oxygen (SpO2) tab** — Heart Health gains a Blood Oxygen tab that reads your overnight SpO2 from your ring and shows your average and lowest readings against a healthy range, with the sleep-apnoea research behind it cited.
  • Added**Respiratory rate tab** — the Sleep page now charts your breathing rate through the night against your own personal normal band, so an unusual night stands out at a glance.
  • Added**A References library** — a new References page in Settings lists every published study Vitra's guidance draws on, so you can read the source behind any number or suggestion.
  • Added**Mood & energy → next-day patterns** — your one-tap 1–5 mood and energy logs now feed the correlation engine, surfacing how today's mood and energy track with tomorrow's sleep and recovery.
  • Added**New daily targets** — a daily hydration target and a weight-based protein target join your dashboard, plus an estimated walking distance from your height on the steps view.
  • Added**Your own temperature band** — temperature charts now draw your personal normal range as a soft band, so a real deviation reads against your baseline instead of a generic one.
  • Added**Tags from the Today drawer** — log context tags right where you record your day, with a tidier tagger and cleaner modal backdrops throughout.
  • Added**Turn off hardware acceleration** — Settings → System now has a toggle to disable GPU hardware acceleration if your machine flickers or freezes, with a restart prompt in plain language.
  • Fixed**Recovers after your Mac sleeps** — after the computer woke from sleep, Vitra's data service could stay down until you restarted the app (saving Today's note or a suggestion would fail). It now restarts itself automatically.

v0.8.2

2026-06-04
Body & Profile polish — set your exact height, weight to the decimal, seven new weight achievements, and a tidy share button on every stat.
  • Added**Set your exact height** — Oura only reports height to the nearest 10 cm, so 181 cm came through as 180. Tap your height on the Profile page and type the real value — it's used everywhere BMI and body metrics are worked out.
  • Added**Seven new weight achievements** — reach your goal weight, land in a healthy BMI range, hit 5% and 10% progress from your starting weight, log your first weigh-in, and keep 7- and 30-day weigh-in streaks. Each one is shareable.
  • Added**Weigh-in reminder** — if you weigh in regularly and then go quiet for a week, Vitra gives you a gentle nudge to step back on the scale. Respects your alert and quiet-hours settings.
  • Added**A share button on every stat** — every figure on your Profile and each earned achievement now has its own small share button in the corner, so you can share a single number cleanly.
  • Changed**Profile shows your logged weight** — your most recent weigh-in now takes priority over Oura's profile number, shown to the decimal (88.5, not 88).
  • Changed**Achievements show your best** — record achievements (steps, deep sleep, longest workout, VO₂ max, readiness, HRV…) now display your biggest-ever value instead of the figure that first unlocked them, and your peak records line up exactly with your Personal Records.
  • Fixed**Height & weight update without a restart** — changing your height or weight in the Oura app now flows through on the next sync instead of waiting for an app restart.
  • Fixed**A cleaner daily weigh-in** — the weight field accepts a single decimal place and starts empty each day (with your last weigh-in shown as a hint), so logging the same number as yesterday registers cleanly.

v0.8.1

2026-06-03
Patch release. Fixes the Body page opening on the wrong tab.
  • Fixed**Body page opens on the Body tab** — before you'd logged a weight, tapping Body could jump straight to the Metabolic tab. It now always opens on the Body overview, where your health radar and Body Score live.

v0.8.0

2026-06-03
The biggest update yet — a whole new Body page that scores your overall health, weight & body-composition tracking, per-workout heart-rate detail, cardio fitness, and a redesigned daily log.
  • Added**Body — a whole-body health page** — a new Body page answers "am I healthy?" at a glance. A single Body Score (0–100) blends your key measures and leans toward your weakest one, so a single lagging system can't hide. An "Am I healthy?" radar plots seven systems — cardio fitness, HRV, resting heart rate, BMI, weight, daily activity and sleep — each scored 0–100 against published health norms. Below it, a one-sentence "what to focus on" names your weakest measure with a research-cited action, a per-system breakdown shows exact scores with week-over-week arrows, and a Body Score trend tracks where you're heading. All computed on your machine — no cloud, no AI model.
  • Added**Weight & body composition** — log your weight right inside the daily note and Vitra turns it into a resting-burn (BMR) and daily-burn (TDEE) estimate, BMI, an estimated body-fat read, and a healthy-weight range for your height. A smoothed trend line cuts through daily water-weight noise to show the real direction, a goal gives you an honest date range and a safe-pace band (0.5–1% of bodyweight per week), and a calorie target shows what to eat to get there. Backfill, edit or remove any weigh-in. Replaces the old Withings link — Oura-only, your data stays on your Mac.
  • Added**Cardio capacity — your VO₂ max, graded for you** — Vitra now reads your Oura VO₂ max and grades it against the FRIEND-registry reference percentiles for your exact age and sex, on a clear coloured band scale (Kaminsky et al., Mayo Clin Proc 2015) — so the same number is judged against your real cohort, not a one-size-fits-all cut-off.
  • Added**Per-workout heart rate** — open any workout to see its heart-rate graph, average and max, time spent in each of the five training zones, and your pace — reconstructed on demand from your ring's second-by-second data. A "Time in HR zones" summary aggregates the mix across all your recent workouts.
  • Added**Deeper insights** — a new Impacts view ranks the behaviours that actually move your numbers; an Explore view lets you plot any metric against any other; HRV and resting heart rate now show your percentile for your age and sex; naps are broken down by type (power / recovery / full-cycle); custom tags are editable; the energy timeline shows a personalised caffeine cut-off time; and Calendar gains a recovery-distribution bar, with a last-7-nights strip on Overview.
  • Added**A redesigned daily log** — "Today" is where you record your day — weigh-in, mood, energy, caffeine and alcohol, and a note. It's now more prominent and inviting, with your weigh-in front and centre.
  • Added**Close to tray (Windows & Linux)** — closing the window can now keep Vitra running quietly in the background instead of quitting. Toggle it in Settings → System.
  • Added**Your right to be forgotten** — a one-click data-erasure request, and a privacy policy that now precisely describes what is and isn't stored.
  • Changed**Activity, unified** — the old Fitness page folded into Activity, so training load, intensity mix, by-sport totals and heart-rate zones all live in one place, alongside a new zone-coloured 24-hour heart-rate ribbon.
  • Changed**Oura-only, on purpose** — the Strava and Withings integrations were removed so Vitra can do one ring exceptionally well. Everything is computed locally from your Oura data.
  • Changed**Live refresh & polish** — the page you're on now updates in place when you tap Sync now, reduced-motion preferences are respected throughout, and there's a broad accessibility and design pass across the app and landing page.
  • Fixed**Cardio capacity now syncs** — a bug left the Cardio Capacity page blank even right after taking Oura's walking test. VO₂ max now syncs correctly.

v0.7.0

2026-05-31
Two new ways to read your data: a Recovery view that balances your training load and tracks how your HRV bounces back, and a Circadian view that scores how regular your sleep timing is. Plus a smarter, research-backed sleep window.
  • Added**Recovery — training load, zone-2 minutes & HRV rebound** — a new Recovery tab on the Activity page reads your workout history and surfaces three things most apps hide. A training-load balance compares this week's effort against your own four-week baseline and flags when you're ramping up too fast or drifting into detraining. A weekly zone-2 readout shows your easy-cardio minutes against the 150-minute guideline. And an HRV-rebound panel shows how far your overnight HRV dips after a hard day and how quickly it recovers — your own resilience, measured. All computed on your machine from your ring's data, no cloud.
  • Added**Circadian — sleep regularity, social jetlag & naps** — a new Circadian tab on the Sleep page adds the dimension research now rates above raw sleep duration. A Sleep Regularity Index (0–100) scores how closely your sleep and wake times repeat from day to day. A social-jetlag readout compares your mid-sleep on free days versus work days, revealing the weekend body-clock drift. And a nap panel tracks how daytime naps affect the night that follows. Low regularity or high social jetlag also surface as research-cited notes on your Overview.
  • Added**A sharper, research-backed sleep window** — the sleep-window guidance now draws on CBT-i (the front-line clinical method for better sleep): it reads your per-night awakenings, gives richer guidance when your sleep efficiency runs low, and cites the research behind each suggestion so you can see why.
  • Changed**Prices now shown in euros** — Solo and Pro are now displayed as €19 and €29. Same one-time prices, same lifetime ownership — just settled in euros, which also trims a small currency-conversion fee.

v0.6.9

2026-05-30
Patch release. Fixes a licensing issue that could ask some long-time users to re-enter their key even though their purchase was still valid.
  • Fixed**Some long-time users were wrongly asked to re-activate** — a licensing check could show the activation screen to a paying customer whose app simply hadn't re-confirmed with our server in a while, even though nothing was wrong with their purchase. Vitra now re-confirms your licence automatically before ever showing that screen, and quietly reconnects anyone who was affected the next time they open the app on a connected machine. No action needed — if you were caught by this, it just works again.

v0.6.8

2026-05-29
Patch release. Fixes Windows updates that could get stuck at 100%, and stops the Today view from labelling a genuinely short night as "incomplete data".
  • Fixed**Windows update no longer gets stuck at 100%** — some Windows installs would download an update, reach 100%, and then sit there without restarting into the new version. The updater now hands off and relaunches cleanly.
  • Fixed**Short nights are no longer flagged as "incomplete data"** — if you genuinely slept a short night, the Today view used to show an "incomplete data" card and pause its suggestions, even though the data was complete. A real short night now counts normally — your score and guidance stand. The card is reserved for actual gaps (ring off, no readings).
  • Fixed**No premature "incomplete data" before today syncs** — the card no longer fires on yesterday's session while waiting for today's data to land.

v0.6.7

2026-05-26
Smaller download. v0.6.6 inadvertently bundled the framework's build cache into the app, inflating the installer. This release strips it — DMG drops roughly 200 MB.
  • Changed**Bundle size — DMG ~200 MB smaller** — v0.6.6 shipped with the Next.js build cache packed inside the app bundle by mistake (about 1 GB of compile artefacts that the running app never reads). The packaging config now excludes it. Auto-update downloads are roughly half the size; fresh installs from the website too.

v0.6.6

2026-05-25
Patch release. Fixes the "no data" morning notification, keeps chart today-slots fresh in long-running sessions, and pulls in the latest Next.js security release.
  • Fixed**Morning brief waits for today's data** — at your configured time (default 10:00) Vitra used to fire a "no data" notification when Oura hadn't synced yet that day, and then lock itself out until tomorrow. It now waits silently and fires the moment today's data arrives.
  • Fixed**Charts stay aligned across midnight** — Activity, Sleep, Readiness, HRV, Heart and Body Temperature detail views now keep their "today" slot pointing at real today even if you leave the app open overnight or across a sleep/wake cycle. Previously the chart's last bar could drift to yesterday's date until you restarted.
  • Fixed**Bedtime suggestion refreshes at midnight** — the optional bedtime-reminder notification no longer surfaces yesterday's recommendation if the app ran overnight without a fresh sync.
  • Changed**Security update** — Vitra now ships on the latest patch release of its web framework, picking up upstream fixes. Standard housekeeping.

v0.6.5

2026-05-25
Patch release. Fixes a bug where the in-app metric pages could stay on the previous score even after Oura had already synced a fresh one, and tightens up the morning check-in around midnight and save errors.
  • Fixed**Health pages now refresh with the latest Oura score** — fixes a bug where doing a workout (or any event that changed your Oura activity/readiness/sleep score) would update the menu-bar numbers but leave the in-app Activity, Sleep, Readiness and Heart pages stuck on the previous value until you relaunched. The two startup data loads no longer race each other.
  • Fixed**Morning check-in resets at midnight + surfaces save errors** — after the day rolls over, the check-in card now clears yesterday's answers cleanly. If your answers fail to save, the card now tells you instead of silently dropping them.

v0.6.4

2026-05-21
Fixes the missing menu-bar scores after v0.6.3, adds a public methodology page on the website, and trims the app's reliance on the cloud for everyday syncing.
  • Fixed**Menu-bar scores restored** — fixes a regression in v0.6.3 where the Mac menu bar showed only Vitra's icon with no readiness · sleep · activity numbers, and the popup that opens on click was empty. The tray title and popup are populated again on every sync.
  • Added**Public methodology page on the website** — vitrahealth.app/methodology now lists every metric Vitra computes, the rule or statistic behind it, and the published study it draws from. Twelve sections covering HRV, RHR, body temperature, sleep, training load, cardio fitness, day-tag correlations, and the personal-baseline engine that powers them all.
  • Changed**Faster, more private syncs** — Vitra now talks to Oura directly from the app instead of going through our server first. Each sync is one less hop, the app keeps working on every health page even when our infrastructure has an outage, and far less of your traffic ever touches our domain.

v0.6.3

2026-05-21
Hotfix: fixes a crash when the app checked for updates. If you saw "Application error: a client-side exception" recently, this release resolves it.
  • Fixed**Update-check crash** — fixed a regression where Vitra could show "Application error: a client-side exception" right after checking for updates. The whole renderer crashed; reinstalling from the website was the only workaround. Resolved.

v0.6.2

2026-05-21
Forward-looking energy timeline, monthly correlation report, normal-range bands on charts, injury pause toggle, and a fix that recovers months of missing Oura data for affected users.
  • Fixed**Oura sync recovers missing data** — fixed a long-standing issue where a single unavailable Oura endpoint could silently drop the entire day's readiness, sleep, HRV and activity from being written to your local database. If you've seen long stretches of blank days in Vitra despite your ring working, opening the app will now backfill them on the next sync.
  • Added**Energy timeline on Overview** — forward-looking hour-by-hour predicted alertness curve anchored to your actual wake time. Names the named windows on the curve: morning peak, post-lunch dip, afternoon peak, wind-down. Hover for the exact %.
  • Added**Grogginess countdown** — while you're still inside your morning sleep-inertia window, the energy timeline shows a real countdown ("clears in 47 min — about 08:30"). Duration scales with last night's sleep quality.
  • Added**Normal-range band on every metric chart** — each detail chart (HRV, RHR, Sleep, Readiness, Activity) now draws a soft band representing your personal mean ± 1 SD over the visible series. Today's value reads against the band immediately.
  • Added**HRV Variability (CV) overlay** — Heart Health's HRV view now shows a rolling 7-day Coefficient of Variation stat. Combined with the HRV trend it surfaces non-functional overreaching that a single number can hide.
  • Added**Monthly correlation report** — once a month on the 1st-3rd, a new slide in the review deck shows the top behaviours that actually moved your readiness over the last 30 days. Each entry has a ≥5 yes + ≥5 no sample-size gate so the answer isn't built on noise.
  • Added**"I'm injured" pause toggle** — new Activity Status switch in Settings → Profile. Suppresses training-load nudges while you recover, with an optional resume date that auto-clears the flag. Joins the sick + travel pill family.
  • Added**Today's mode pill** — Today's Suggestion card now carries a small categorical pill (Rest / Active Recovery / Strength / Cooldown) tagging what kind of day to expect, derived from readiness, HRV deviation, sleep, and yesterday's strain.
  • Fixed**Incomplete-data banner timing** — the "sleep or ring contact was insufficient" notice no longer fires before today's Oura sync has actually delivered today's session. Banner now waits for real data before evaluating.

v0.6.1

2026-05-21
German and Mandarin languages, data density toggle, mood climate, heart-rate line charts, and a long list of polish + fixes.
  • Added**German and Mandarin language support** — Vitra now speaks de and zh in addition to en/es/fr/pt. The first-launch gate and onboarding auto-detect your OS language and pick the closest match.
  • Added**Data density toggle** — new Comfortable / Compact switch in Settings → Display lets you trade whitespace for information density across every page.
  • Added**Mood climate** — Overview now shows a mood climate visualization that surfaces how your tagged moods cluster over time, plus a richer hover popover when you brush across the chart.
  • Added**Score delta tooltip** — hover the delta arrow on Overview to see a balloon explaining the change since yesterday in plain language.
  • Added**Topbar Oura delay note** — when Vitra is showing yesterday's data because Oura hasn't synced today yet, a small note at the top makes that obvious instead of you wondering why numbers look stale.
  • Added**"Logged" pill on manual workouts** — activities you enter by hand now get a small "Logged" pill so they're visually distinct from auto-imported sessions.
  • Changed**Heart rate charts redesigned** — the hourly bar chart on Heart Health is now a smooth line chart (both day view and intraday average), with min/max y-axis labels and an hours axis. Easier to read trend at a glance.
  • Changed**Sidebar auto-widens for large text** — when you bump text size to Large or X-Large in Settings → Accessibility, the expanded sidebar widens automatically so nothing clips.
  • Changed**Low-confidence banner redesign** — on Overview, the low-confidence banner is now a clearer card with an icon and pill reasons instead of a flat line of text.
  • Changed**Overview and Heart Health polish** — shared UI primitives for cards, pills, and status banners give a more consistent look across pages, including a unified palette and type pass.
  • Changed**Toasts stack instead of overlapping** — multiple toasts now line up vertically instead of stacking on top of each other.
  • Changed**Local Manrope font** — the gate and onboarding no longer load Manrope from Google's CDN; it's bundled locally for faster first paint and no third-party requests.
  • Changed**Tighter under-the-hood security** — additional hardening across the app's network paths.
  • Fixed**Daily check-in re-prompt** — fixed a case where the morning check-in could re-appear after you'd already answered it.
  • Fixed**Weekly digest toast on thin data** — Sunday's weekly review toast no longer fires when there isn't enough data to summarise the week.
  • Fixed**Weekly toast dismiss** — dismissing the weekly toast (Esc or click-away) now correctly marks the week as viewed, so it doesn't pop back up later.
  • Fixed**Oura delay note timing** — the sidebar's "yesterday's data" note no longer shows before 6 AM, when it's normal not to have today's data yet.
  • Fixed**Forecast tooltip translations** — the low-confidence forecast tooltip is now localised in all supported languages.
  • Fixed**Sleep confidence and quality** — both now use today's primary sleep session rather than picking up naps, fixing some confusing scores on nap-heavy days.
  • Fixed**Heart Age forecast anchor** — Recovery and Heart Age forecasts now anchor to today's score, with a clearer disclosure of the underlying CVA source.
  • Fixed**Heart Age chart legend** — corrected the CVA chart legend and removed a wrong subtitle that didn't match the data.
  • Fixed**Dark-mode chart tooltips** — tooltip text in charts is now readable on dark backgrounds (was washed out before).

v0.6.0

2026-05-09
Settings restructure, profile + achievements, share-card modal, machine handoff, smart alerts, sick-day pill, hidden health-report PDF, and calendar compare ranges.
  • Added**Smart alerts** — local-only nudges when your numbers drift: resting HR elevated 3 nights, HRV suppressed ≥2σ for 3 nights, two short nights of sleep, or bedtime drifted +90 min for 3 nights. Hourly checks, quiet hours 22:00–08:00, fires once per day per rule. Toggle in Settings → Notifications.
  • Added**Sick-day pill on Overview** — when Rest mode triggers (HRV down, RHR up, temperature elevated), a clear "I think you're sick" pill appears next to today's score. Click to see the signals that triggered it.
  • Added**Health report (PDF)** — Settings → System → Export now has a printable 90-day summary of RHR, HRV, sleep, and readiness with medians, ranges, and recent-vs-baseline deltas. Generated locally, no data leaves your device. Designed to take to a doctor visit.
  • Added**Compare ranges on Calendar** — new "Compare ranges" button opens a modal with two date pickers and a delta table for HRV, RHR, sleep, and readiness. Defaults to last week vs the prior week.
  • Added**Pure black background** — new option in Settings → Display → Appearance (dark mode only) for an OLED-style fully black canvas.
  • Added**Six new context tags** — period, argument, deadline, poor air, dehydrated, and late screens. Feeds the tag → next-day correlations engine.
  • Added**Confidence chips on tag patterns** — Vitra AI's tag → next-day patterns now show a high / med / low confidence chip for each correlation, derived from the z-score.
  • Added**Range-aware Vitra Score** — Vitra AI now labels the Vitra Score with the active range ("30 Days / 90 Days / All time") and adds a Share button so you can post your composite score.
  • Added**Profile page with achievements** — new Profile view tracks streaks, milestones (first sync, 30-day streak, etc.), and unlocks. Earned achievements fire toasts you can click to focus the achievement on the page. Toasts are persistent until acknowledged.
  • Added**Weekly digest slide deck** — Sunday's digest now opens in a fullscreen slide-deck portal instead of a small toast, so the week's highs / lows / lever read clearly.
  • Added**Machine-handoff wizard** — Settings → System has a guided handoff flow: encrypted backup zip on the old Mac, restore wizard on the new one. Imports surface friendly errors for corrupt or version-mismatched backups.
  • Added**Settings 6-tab restructure** — Profile / Ring / Coaching / Display / Accessibility / System. Each tab is hash-deep-linkable. Adds units (metric / imperial), clock format (12h / 24h), and date format toggles.
  • Added**Pages section in Settings** — turn whole sections of the app on or off. First toggle: Metabolic, with Profile to follow.
  • Added**Share button on every detail page** — a single reusable share button on Overview, Sleep, Readiness, HRV, Heart Health, Activity, Temp, and Vitra AI. Generates a clean PNG card with the score plus a one-line synthesis underneath.
  • Added**Share-card modal with image** — preview the social card before downloading, with a one-line interpretation rendered under the score so the image stands on its own.
  • Added**Stale-sync banner on Overview** — visual nudge when your last Oura sync is older than expected, so you don't read stale numbers as today's.
  • Added**Skip / override low-confidence days** — when Vitra detects a sleep night was likely garbage (ring off, partial wear, < 4 h), you can mark the day as Skip so it never pollutes your baselines or trends.
  • Added**Window position and size persistence** — Vitra remembers where you left it and how wide you made it. The window also grows wider automatically when you expand the sidebar.
  • Added**Expanded evidence library** — Action-of-the-day now pulls from a richer, context-aware evidence library with research citations behind each recommendation. The Vitra AI research-signals section reuses the same library for verdicts.
  • Added**Split data export** — the export now produces two CSV bundles: a raw Oura set (untouched sync rows) and a Vitra set (per-day computed scores, baselines, deltas). Either is one click in Settings → System.
  • Added**Three new FAQ entries** on the landing page covering data ownership, the share card, and the handoff flow.
  • Changed**Daily check-in fade-in** — the morning check-in card no longer flashes briefly when you've already answered. It fades in cleanly only when there's an unanswered prompt for today.
  • Changed**Settings tab scroll-to-top** — switching between Settings tabs now smooth-scrolls back to the top, so long sections don't strand you mid-page.
  • Changed**Verdict suppression on bad nights** — when last night's data is low confidence, Vitra holds back its verdict instead of telling you you're tired based on a broken signal.
  • Changed**Quit-after-reset** — the offboarding flow now quits the app after reset instead of relaunching to the gate, with softer copy throughout.
  • Changed**"Back at full strength"** — small copy refinement in en — replaces the older "bounced back overnight" phrasing where readiness had recovered.
  • Fixed**Personal Records spacing** — Vitra AI's Personal Records section now has proper top spacing instead of sitting flush against the section above it.
  • Fixed**Feedback API on no-row** — `/api/db/feedback?day=...` returned 500 when no answer existed for a day; now returns `null` cleanly.
  • Fixed**Metabolic chart type error** — TypeScript error around Chart.js bar-element typing that blocked production builds. Resolved.
  • Fixed**Overview state vs. Readiness alignment** — the state shown on Overview (READY / STEADY / TIRED / RECOVERING) and the wording on the Readiness page no longer disagree on borderline scores.
  • Fixed**Share button anchoring** — the share button is now portal-rendered to the viewport, so it stays put on long detail pages.
  • Fixed**Share filename** — Overview share now saves as `vitra-score-today.png` instead of the duplicated `vitra-vitra-…` filename.
  • Fixed**Settings handoff section** — row buttons are now aligned and the divider between them is flush with the card.
  • Fixed**Backup manifest version** — backup zips correctly report the Vitra version, not Electron's version.
  • Fixed**Live name updates** — changing your name in Settings now updates the Overview greeting immediately, no relaunch needed.
  • Fixed**OAuth state nonce** — uses `localStorage` for the OAuth state nonce and surfaces specific failure reasons when authorization is rejected.
  • Fixed**OAuth API CORS** — corrected CORS headers on the OAuth callback endpoints so the loopback flow no longer randomly fails.
  • Fixed**Service worker through middleware** — `/sw.js` is now allow-listed in middleware, so cache invalidation actually runs after auto-update.
  • Fixed**Tomorrow predictors** — reconciled the inputs and weights used for tomorrow's directional outlook on Overview.

v0.5.5

2026-05-07
Expandable sidebar with sections, accessibility settings, and a fix for the Oura connection issue.
  • Added**Expandable sidebar** — click the toggle at the bottom to widen the sidebar with named groups (Today / Health / Analysis). State persists across launches.
  • Added**Accessibility settings** — new section in Settings with adjustable text size, high-contrast mode, reduced motion, and a dyslexia-friendly font (Atkinson Hyperlegible).
  • Added**Mac architecture picker** — the landing-page download button now opens a modal that auto-detects whether you need the Apple Silicon or Intel build.
  • Changed**First-launch screen redesign** — the license / trial screen now matches the rest of the app's typography and identity.
  • Changed**Daily check-in follow-up** — when you say "not really", the better/worse prompt now sits below a clean separator, keeps your selection highlighted, and shows an acknowledgement. You can also tap your answer again to undo it.
  • Fixed**Oura ring connection** — some users couldn't authorize their ring on first launch. Resolved.

v0.5.4

2026-05-07
Manual sync, license panel in Settings, smarter empty states, and copy refinements.
  • Added**Sync now button** — the ring-sync indicator in the top bar is now clickable. Tap to sync immediately. Includes a 3-minute cooldown to be friendly to the Oura API.
  • Added**Auto-sync after sleep/wake** — leaving Vitra open overnight no longer leaves you with stale data. The app syncs automatically as soon as your computer wakes.
  • Added**License panel in Settings** — a new section shows whether your license is verified, and lets you enter a license key without quitting the app.
  • Added**Brand-new ring empty state** — if you just got your ring and have no data yet, the dashboard now shows a friendly message instead of a stuck loading screen.
  • Added**Daily check-in follow-up** — if the day's score doesn't match how you feel, Vitra now asks whether you feel better or worse than the score suggests, to learn over time.
  • Fixed**Wrong ring generation in Settings** — Vitra showed an older ring's generation/firmware for users who upgraded. Now reads the most recent ring.
  • Fixed**Heart rate copy** — the resting heart-rate card no longer says "at this moment" for a value that's actually from the last sync. Now reads "at your last reading".
  • Fixed**Equal heart-rate vs. baseline** — when today's resting HR matched your baseline exactly, the card incorrectly said "lower than usual". Now shows "in line with your usual" with no arrow.

v0.5.3

2026-05-06
Activation reliability improvements and active user count on the landing page.
  • Fixed**Activation reliability** — occasional 'Could not activate' errors on first launch are now handled automatically. If the activation takes a moment longer than usual, the app retries in the background.
  • Fixed**Wrong version in bug reports** — the activation screen sent an old version number in bug report URLs. Now reads the correct installed version.
  • Added**Active user count on landing page** — the landing page now shows the current number of active users, updated weekly.

v0.5.2

2026-05-06
Restores menu-bar tray icon (v0.5.0/0.5.1 only showed numbers).
  • Fixed**Menu-bar tray icon missing** — `electron/tray.ts` and `electron/main.ts` resolved icon paths via `__dirname/../assets/...`, which lands inside `.electron/` after the v0.5.0 tsconfig expansion shifted `main.js` one directory deeper. Bumped to `../../assets/...`. Tray icon now appears next to the score numbers as before.

v0.5.1

2026-05-06
Critical hotfix — restores app launch (v0.5.0 was broken on first run).
  • Fixed**v0.5.0 launch failure** — app would not start: the Next.js server could not locate the bundled standalone server (path resolution broke when main.js moved one directory deeper after the tsconfig expansion), and the morning brief scheduler crashed on its first tick because the database directory was captured at module load before the data path env var was set. Both fixed.

v0.5.0

2026-05-06
Tomorrow's outlook, daily morning brief, weekly narratives, and fully multilingual notifications.
  • Added**Tomorrow's outlook** — directional UP / FLAT / DOWN forecast on Overview from HRV trend, sleep velocity, recovery debt, RHR delta, and baseline z-score. Honest accuracy with a confidence pill (~3 of 4 days).
  • Added**Daily morning brief** — opt-in OS notification at your chosen time with a one-sentence summary of today's readiness, HRV, and sleep. Fires from the desktop scheduler so it works even when the window is closed.
  • Added**Weekly + monthly narratives** — best / worst day strips and biggest-lever correlation (sleep / HRV / RHR → next-day readiness) on the Weekly Report, with localized weekday names.
  • Added**Anomaly digest** — z-score outlier detection (>2 SD vs your baseline) on HRV / sleep / readiness / RHR / temperature, with co-occurring tag context. Top 3 standout events surface on the Vitra AI page.
  • Added**Daytime rhythm** — intraday heart-rate profile binning minute-level readings into 24 hourly buckets. Detects peak and quiet windows from awake hours. Lives on the Heart Rate tab.
  • Added**Caffeine & alcohol log** — one-tap stepper in the Today's Note drawer. Lag analysis on Vitra AI: caffeine → deep-sleep delta, alcohol → next-morning HRV delta.
  • Added**Deeper Signals** — new section on the Vitra AI page: SpO2, breathing rate, stress ↔ HRV correlation, mood / energy ↔ readiness Pearson r. Sample-size guarded.
  • Added**Compact typography preset** — Manrope across the entire UI as a third option alongside Modern and Mixed. Now the default for fresh installs.
  • Added**Tray popup theming** — menu-bar popup respects your typography and accent color.
  • Added**Custom Vitra time picker** in Settings — clickable digits with +/- steppers, monospace display, fully on-brand.
  • Changed**All notification copy translated** across English / Português / Español / Français — sync alerts, threshold breaches, bedtime reminders, trend alerts, morning brief.
  • ChangedSettings toggles unified to a single iOS-style design across all sections.
  • ChangedSub-12px text bumped to 12px minimum app-wide for legibility.
  • ChangedHeart Rate · Today chart migrated to the standard Vitra bar chart for visual consistency.
  • ChangedHealth Trajectory day-of-week chart bars now full-height (no overlap).
  • ChangedLight theme contrast improved (darker dim / dimmer text colors).
  • Changed“Daily calibration” renamed to “Daily Check-in” in all locales.
  • ChangedDomain migrated to vitrahealth.app — landing, /recover page (now i18n), email links, and in-app links all updated.
  • Fixed**Bedtime drift bug** — per-day session selection now picks the longest, not the last. Naps no longer poison stats. Fixes the “832 min later than usual” phantom message.
  • FixedHeart Rate restorative time now reads correctly (8100 s → “2h 15m” instead of the prior “135h”). Oura returns these in seconds despite the naming.
  • FixedWindows: notifications no longer prefix “Electron — ”; sender now shows as “Vitra” via AppUserModelId.
  • FixedReadiness page no longer duplicates HRV / RHR tabs (already covered by the dedicated HRV page).
  • FixedSleep page dropped HRV / RHR tabs — they duplicated the HRV detail page.
  • FixedTempDetail delta pill: removed leftover background for visual consistency with other detail pages.
  • FixedSettings: double separators after the last toggle in each section.

v0.4.1

2026-05-05
Critical Mac tray popup metrics redesign for faster at-a-glance read.
  • ChangedTray popup metrics redesigned for Mac menu-bar users — clearer hierarchy, tighter spacing, and stronger signal readability in the compact view.
  • FixedImproved tray popup rendering and metric presentation logic so the menu-bar snapshot is more reliable and legible during daily use.

v0.4.0

2026-05-05
Bar charts on every detail page, landing redesign, animated score reveal, Cmd+K palette, personal targets with AI auto-fill, multi-color heatmap.
  • AddedBar charts on all detail pages — Sleep, Readiness, HRV, Heart Health, Activity, and Temp each get a full trend bar chart with hover tooltips, goal reference line, and baseline band.
  • AddedCmd+K (Ctrl+K) command palette — jump to any view, open today's note, sync now, toggle theme. Mono items, serif input, accent-soft selection.
  • AddedPersonal targets — set goal lines on detail charts (HRV, RHR, sleep h, deep sleep, efficiency, readiness) under Settings. Research-backed Suggested values shown inline. iOS-style 'Let Vitra AI set your values' toggle fills targets from your last 180 days (p35/p65/median).
  • AddedCalendar tiles lift on hover with the day-number in a dark pill. Click a tile to open the day-detail drawer with a smooth view-transition morph (where supported).
  • Added30-day record eyebrow on Overview — when today hits an HRV/sleep/RHR/efficiency record, a single mono line appears above the AI sentence.
  • AddedDaily calibration card — the 'does this match how you feel?' question is now a prominent bordered card with an editorial eyebrow, so it's actually visible.
  • AddedOverview animations — score numeral grows in on first view, hero row fades in with a stagger reveal, skeleton shimmers replace blank placeholders on load. Grow-in plays once per session.
  • AddedEmpty-state poetry — placeholder text for views with no data uses voice-consistent editorial copy instead of generic 'No data' messages.
  • ChangedLanding page — full v2A redesign: Manrope sans-serif, dark gradient panels, flat feature grids, i18n polish across all four locales.
  • ChangedCalendar heatmap now uses four distinct band colors (excellent=blue, good=teal, fair=amber, poor=warn) instead of opacity ramps of one accent — readable at a glance.
  • ChangedDetail-page delta uses a directional arrow (↗ above mean, ↘ below) and is locked to a permanent --good blue (#17a4f6), so 'good' stays blue even when your accent is red or coral.
  • ChangedChart 'Goal' reference line is grey, solid, with a 'Goal · N' pill that appears on canvas hover only. Legend entries reordered: [stood out] · [baseline] · [goal]; both bar swatches square.
  • ChangedTag chips redesigned — pill, hairline border, soft shadow, scale-press on tap. Selected option fills with accent-soft.
  • ChangedCalendar 'Excelente (80+)' band uses --good blue. Confusing Low→High gradient strip removed (band table already explains).
  • ChangedOverview 'why is today middling' is a static heading with the list always visible — no more accordion.
  • ChangedSettings — typography presets now 50/50 (Old Newspaper retired, too playful for the brand). Personal targets and Activity targets render side-by-side.
  • Changedi18n parity across en/es/fr/pt for all new strings: color names, typography preset labels, suggested/Goal/calibration eyebrow, AI toggle copy.
  • FixedTag modal z-index now sits above the calendar day-detail drawer — chip-edit works inside the drawer.
  • FixedLanding page — removed the double scrollbar (only html scrolls now) and a stray horizontal line through the hero mockup.
  • FixedScore grow-in animation plays once per session only — not on every page navigation.
  • RemovedHero score halo SVG, sticky detail header, body paper-grain texture, today-bar pulse, ring-battery topbar pill (Oura API doesn't expose battery).

v0.3.3

2026-05-03
Hotfix — Metabolic page works again, Calendar alignment fixed.
  • FixedMetabolic page no longer shows the false 'Need more data' message — v0.3.1 / v0.3.2 shipped a stale native database binary in the packaged app, which made every database read fail silently. The packaged Next server now loads the correct binary, built from source against Electron's runtime.
  • FixedCalendar page no longer sits ~20px lower than every other page — a stray top-margin on the eyebrow was pushing the whole page down.
  • ChangedMetabolic page now distinguishes 'loading' from 'truly empty' so the message during initial sync is no longer misleading.

v0.3.1

2026-05-03
One editorial language across the app — Sleep, Calendar, Metabolic, and Vitra AI all share the same flat, typography-first surfaces.
  • AddedSleep page — new Sleep Overview card under the trend chart with score average, hours average, best night, and average deep sleep.
  • AddedVitra AI — VitraOrb animated state indicator (idle / thinking / done) in the panel header.
  • ChangedSleep page — Sleep Quality, Optimal Sleep, Breathing & SpO2, and Sleep Stage Optimizer dropped their card backgrounds for flat hairline strips. Sleep Overview is the only card on the page.
  • ChangedOptimal Sleep chart redesigned as a friendly horizontal table — one row per duration with hour, bar (mean encoded as fill width), readiness score, and night count. The optimal row is highlighted in accent.
  • ChangedCalendar — Readiness heatmap and Records & Streaks blocks lost their card surfaces for the same flat strip pattern.
  • ChangedMetabolic — Biggest Lever and every signal card flattened. Numbers use the canonical mono numeral style. Bad bars now use warn / amber colour (was dark grey, hard to read).
  • ChangedVitra AI — Sleep Consistency, Recovery Debt + Load, Health Trajectory, Personal Records, Tag Impact and other sub-sections all converted to flat strips. Suggestions text size aligned with body.
  • ChangedToday's Energy Forecast graph is taller (140px) and the tallest bar now reaches the top of the chart instead of leaving empty space.
  • ChangedVitra AI ranking labels switched to uppercase 12px tracked weight (was a regular 13px label) for stronger metric hierarchy.
  • FixedSleep Debt main number now reads '7h 30m' instead of '7h 30' — the trailing 'm' was missing on every fmtH usage.
  • FixedVitra AI — 'Show ALL range' picker no longer wipes the page on first load.
  • FixedAuto-update on macOS — Electron now closes all windows and removes the tray icon before quitAndInstall, so the new version starts cleanly.
  • FixedCalendar day-detail panel portals to document.body and sits above the topbar — no more clipping behind sticky headers.
  • FixedCycle phase fetch disabled — Oura's daily_cycle_phases endpoint is not in the public API and was returning errors.
  • FixedResolved 4 bugs: stale temperature labels in long Electron sessions, empty 'no data' state right after first sync, workouts not fetched on first sync, tray icon survival across app quits.
  • FixedOverview alerts section is expanded by default and the toggle now reads as a real button with a clearer affordance.
  • Changedi18n parity — UpdateToast, kcal abbreviation tooltip, and workout fallback strings localised across en / es / fr / pt.
  • ChangedCalendar day panel UI redesign with kcal display, tooltip fix, and personal note.

v0.3.0

2026-05-02
Editorial redesign + UX polish — calmer surfaces, smarter modals, richer sleep insights.
  • FixedAll modals (tag picker, logout confirm) now portal to document.body — they no longer drift when the page is scrolled.
  • FixedTag modal overlay z-index raised above the floating Nota de Hoje button so the backdrop correctly covers everything.
  • FixedActivity page graph no longer animates twice on load — chart updates are now instant; only the initial mount animates.
  • ChangedResearch flags section (below Os teus Padrões) redesigned: flat rows with a 2px left-rule accent instead of rounded balloon cards and pill badges.
  • ChangedRecovery outlook title and day labels use softer text tokens (--text-2 / --text-dim) for better hierarchy.
  • ChangedTag pills in stood-out moments now use the active accent colour for their border, not a hardcoded blue.
  • AddedOptimal sleep chart: hovering a duration bar now shows a tooltip with the sleep duration, average readiness, and number of nights in that bucket.
  • AddedOptimal sleep chart caption explains the bar encoding (brighter = higher readiness, coloured = your sweet spot).
  • AddedHRV / VFC abbreviation balloons added to Best HRV in 60 days, Highest HRV day (Weekly Patterns), and Dia com maior VFC labels.
  • AddedOxblood accent preset in Settings → Accent — a warm ink that finally matches Vitra's cream paper tone (Ocean blue stays the default).
  • AddedEditorial type scale + 8px spacing system — eight type tokens and seven spacing tokens drive every page consistently.
  • AddedCalendar top stats strip sticks under the topbar while the grid scrolls — monthly average and active-day count stay in view.
  • ChangedDe-carded the entire app — chart panels, moments, correlates, calendar metric tiles, and the Helpful? widget dropped their rounded white boxes for hairline section rules.
  • ChangedHero score is calmer (200 → 168px) and the daily sentence is bigger (44 → 56px serif). Section labels are now uppercase tracked eyebrows for consistent rhythm.
  • ChangedCharts fill the full content column — TrendChart and Sleep Stages went responsive (Chart.js + ResizeObserver), no more 50px gap on the right.
  • ChangedSparkline terminal point is a 4px square tick (halo removed). 90-day heatmap collapses to a single warm-accent opacity ramp (100/70/50/30/20/10%) instead of the old blue / amber / red mix.
  • ChangedWeekly Report comparison chart is now three small multiples (HRV, sleep, readiness) — label · sparkline · mono % at right, single accent colour, per-row baseline at 100%.
  • ChangedVitraAI radar replaced with VitraRanking — a sorted horizontal-bar panel with a median tick at 50% and an optional dark target tick. Six metrics, one glance.
  • ChangedTab pills no longer show the accent-tinted background when active — they switch to the panel surface (white in light, near-black in dark) so they feel like editorial selectors.
  • ChangedAction-of-the-day on the Overview is now a magazine-style pull-quote: top hairline, accent eyebrow, serif italic headline, mono citation.
  • ChangedCalendar day cells are square-cornered. Day-detail drawer pinned to full viewport height with a higher z-index.
  • ChangedPulse animations, streak squares, heatmap, and every chart line now derive their colour from the active accent — change Settings → Accent and the whole app follows.
  • ChangedNotices / research-flag block on the Overview moved from the middle of the page to the end (after Weekly Patterns).
  • RemovedEmber accent preset.
  • FixedVitraAI score, sleep-stages REM legend swatch, calendar streak squares, and the sync-indicator pulse were hardcoded blue regardless of the chosen accent. They now follow whatever accent you pick.
  • FixedView Changelog modal in Settings now locks the underlying scroll container while open. Page no longer scrolls behind it.
  • FixedHeart Health detail head — combined tab + range strip (matches the other detail panes).
  • FixedBedtime suggestion anchored to a 7-day median of actual bed times instead of a single yesterday value, so a missing or late night doesn't throw the recommendation off by hours.
  • FixedWind-down sub-line shows slept duration as 7h 36m instead of 7.6h.
  • ChangedDetail panes (Sleep, Readiness, Activity, HRV, Heart Health) — metric tabs and range tabs now share one row at the top instead of stacking.
  • ChangedTrend chart cards on Sleep, Readiness and HRV dropped the title that duplicated the active tabs.
  • ChangedSleep page — Sleep Debt and Sleep Timing now sit side-by-side (50/50 grid) when both have data.
  • ChangedDetail-page delta pill normalised across every page — single outlined-pill class with a warn modifier; removed five per-page inline style overrides.
  • ChangedActive-tab background switched from pure white to a 50/50 mix of panel and bg-2 — a step brighter than its neighbours, not a hard flash.
  • ChangedMetabolic page — graph bars now use accent for 'good' and grey for 'bad' (was blue / red); biggest-lever card background follows the same mapping; padding normalised to a clean all-round var(--s-3).
  • ChangedOverview Today plan no longer shows a static wind-down row — the live countdown card above already covers it.
  • ChangedDetail tabs (Sleep, Readiness, HRV, Heart Health, Activity) redesigned — pill borders dropped for a clean 2px accent underline indicator; range selector switched to compact monospace codes with an accent-soft active state.
  • FixedSettings → Idioma flags now render on Windows — replaced emoji flags (invisible in Segoe UI Emoji) with real SVG country flags via flagpack.
  • ChangedLanding page — added a 'macOS only' platform badge next to the menu-bar section, swapped the simplified Apple SVG for the official mark across download buttons / badge / mock menubar, and switched the footer 🇵🇹 to the same SVG flag as Settings.

v0.2.6

2026-05-01
Personalised optimal sleep + an end-to-end performance pass.
  • AddedPersonalised optimal sleep duration — a new card on Sleep learns the duration where your readiness plateaus instead of using the population 8h. Surfaces once 30+ nights are logged. Source: Chaput et al., Sleep Med Rev 2018; AASM 2015.
  • AddedAction-of-the-day card on the Overview — one ranked action per day across nine evidence-weighted levers (HRV suppression, elevated RHR, sleep deficit, bedtime drift, high-strain recovery, hydration after alcohol, sick rest, travel easy, low mood + energy). Personalised optimal sleep, bedtime regularity, and yesterday's strain feed in.
  • AddedMood + energy 1-tap log on the Today's Note drawer. Five-segment cumulative bar with per-cell hover label. Values feed the tag-correlation engine as pseudo-tags (mood_low, energy_high, …) so next-day deltas compute alongside regular tags.
  • AddedCalendar — 30D / 90D / 180D range filters. Cell size, hero average, active-days counter, heatmap title, and Personal Records section all bind to the selected range.
  • ChangedCharts now morph between range changes — switching 7D/30D/90D/All animates the line between datasets instead of redrawing. Line graphs are 1px thicker with monotone-cubic curves; anomaly dots shrunk so they punctuate instead of dominate.
  • ChangedPage transitions are GPU-composited — translate3d + will-change so the fade runs on the GPU thread and doesn't fight React's mount work. Loader overlay only shows on a page's very first visit per session; revisits remount silently.
  • ChangedWhole-app performance pass — startup payload cut ~50% (full-history fetch dropped to a 90-day window), settings / tags / workouts deduped at module level, redundant metrics round-trips eliminated, React contexts memoized so detail pages no longer re-render on every nav. Rapid sidebar clicks no longer get coalesced.
  • ChangedCharts no longer linger in memory between pages — the active view is the only one mounted, so leaving a detail page tears down its Chart.js instances. Loader covers the ~75ms rebuild on revisit.
  • ChangedFonts are now bundled with the app (Inter Tight, JetBrains Mono, Newsreader, Playfair Display, Libre Caslon Text, Special Elite). No more runtime requests to fonts.googleapis on every cold load — also removes a privacy-relevant external dependency.
  • ChangedPage navigation feels instant — visited detail pages stay mounted under the hood and fade in without a remount, while a brief loader overlay covers the very first visit so the click feels immediate.
  • ChangedMetrics cache layer — same data window asked across pages now hits one shared in-memory cache (5 min ceiling, auto-flushed after every Oura sync), eliminating repeated round-trips.
  • FixedAuto-update no longer needs a manual hard-refresh after relaunch — Vitra detects the version bump and clears the renderer's HTTP and service-worker caches before first paint.
  • FixedSidebar nav triangle no longer flashes between pages.

v0.2.5

2026-04-30
Sick-day mode and a friendlier late-night reminder.
  • AddedGoal mode — pick 0–2 from sleep, recovery, or fitness in onboarding or Settings. Vitra pins a focus card on the Overview page per goal: today's metric, your personal delta vs baseline, and a research-cited action tip (Walker, Chaput, Laborde, Plews, Murphy, Phillips). 3-tone (low / normal / high). Suppressed when sick or travel mode is active.
  • AddedSick-day mode — when the illness compound pattern fires, Vitra enters Rest mode: training-load alerts muted, badge in the date header with a one-click 'why' explainer, daily synthesis swaps to rest-framed copy with your personal temp/RHR deltas. Auto-clears when metrics return inside personal baselines.
  • AddedUpdate consent — auto-updater no longer downloads silently. A toast prompts you with version + size; you click Download, see live progress, and choose when to relaunch.
  • ChangedWind-down card stays visible past your planned bedtime — now switches to a warn-coloured 'You should have gone to bed Xh ago' framing instead of disappearing.
  • ChangedUpdate check cadence relaxed to once every 24 h while the app is open (was every 4 h).
  • ChangedDetail pages declutter — back button removed from main sidebar destinations (Readiness, Sleep, Activity, Heart Health, HRV, Temp, Calendar, Metabolic, Vitra AI, Cycle, Settings); range selector floats top-right inside content instead of taking its own row.
  • ChangedFaster app start — every detail view is lazy-loaded, so Overview no longer blocks on parsing the heavier pages.
  • FixedMonth-in-review overlay now covers the Today's Note button (was rendered above the blur due to a stacking-context trap).
  • FixedHeart Health 'Heart Rate' tab abbreviated per locale so it stops overflowing.
  • FixedLocale parity — 24 heart-rate-zone strings were English-only; now translated to es / fr / pt-PT.
  • FixedWeekly report — removed a stray 600px content cap and made the comparison chart responsive so it fills the page.

v0.2.4

2026-04-29
Windows support, metabolic health page, and your-data personalisation.
  • AddedWindows build — NSIS installer for Windows x64, same Electron app and on-device AI runtime as macOS, auto-updater wired to the same R2 feed.
  • AddedMetabolic health page — 5 behavioural levers research links to body composition: sleep duration adequacy, sleep regularity, daily steps, late workouts, autonomic load. Each signal cites a peer-reviewed study and gives an actionable suggestion.
  • AddedCompound pattern detection — illness, overreach, and acute-load signatures fire one clear diagnosis instead of three correlated alerts.
  • AddedPersonalised thresholds — rolling 60-day baselines + per-metric SDs (HRV, sleep, RHR, temp, readiness). Alerts now scale with your own volatility, with floors at validated population thresholds.
  • AddedTag → next-day correlation engine — for each tag, observed deltas in HRV, sleep, readiness, RHR, deep sleep vs your untagged baseline. Surfaces on Vitra AI when N≥5.
  • AddedPersonal records & streaks — 90-day records (best readiness, HRV, deep sleep, lowest RHR, best efficiency) with sparklines, plus current/best streaks for readiness ≥70 and sleep ≥7h.
  • Added90-day readiness heatmap on Calendar page with category counts, average, and best ≥70 streak.
  • AddedOne-line daily synthesis at the top of the dashboard, naming today's worst-offender metric vs your baseline.
  • AddedSmart bedtime adjustment — age-based sleep target plus winddown messaging that adapts to last night's recovery.
  • AddedForecast cells on Calendar show ↑ / ↓ / − vs today's readiness.
  • Added13 new research-grounded flags across recovery, sleep-stage, VO₂ vs age norm, and late-workout patterns.
  • AddedPublic roadmap, founder note, /landing/compare page (Vitra vs Oura, Whoop, Apple Health), pricing FAQ, Built in Portugal badge.
  • Added'?' explainers on Overview signal cards.
  • ChangedVitra Score hero enlarged, detail typography polished.
  • ChangedDaily synthesis restyled as suggestion card, moved into the Vitra AI block.
  • Fixedpt-PT cleanup — Brazilianisms swept (e.g. 'deita-te cedo' instead of imperative-as-gerund).
  • FixedWinddown card visible all day; bedtime calc and summary bar polish.
  • FixedScrollable landing subpages, heatmap stats panel, FAQ versioning.
  • FixedSynthesis output wrapped in tooltip-aware abbreviation component.

v0.2.3

2026-04-29
First release.
  • AddedFirst release.
  • AddedReport a bug — Settings, gate window, landing footer, and thanks page now link to a feedback form.
  • AddedLanding page loading screen + scroll reveal animations.
  • ChangedHero copy now reflects continuous analysis (was 'every night').