← Back to VitraChangelog
What we shipped, when, and what changed.
v0.4.1
2026-05-05Critical 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-05Bar 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-03Hotfix — 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-03One 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-02Editorial 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-01Personalised 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-30Sick-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-29Windows 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-29First 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').