← Back to Vitra

Changelog

What we shipped, when, and what changed.

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').