Vitra is a desktop companion for the Oura Ring, on macOS and Windows. It reads your ring data through Oura's official API and processes all of it on your own machine.
Oura hands you a readiness score every morning with no way to check whether the score is right. Vitra builds a rolling baseline from your own history, one per metric, and shows you the gap. Instead of "today is a 62" you get "your resting heart rate is 4 above your own 14 day median, third night running". That statement can be wrong, and you can catch it being wrong. That is the whole point.
It uses AI that learns from your own data and your corrections. There is no LLM anywhere in the decision path, so the same inputs always give the same output. Nothing is generated and nothing drifts between runs.
Your health data never leaves the computer. No account, no cloud sync. The only outbound calls are to Oura's own API to fetch your data, and a licence key check when you activate.
Live sync needs an Oura Gen 3, Ring 4 or Ring 5 with an active Oura membership. Gen 2 is import only. Give it about two weeks of your history before the daily read is worth much, since it is still learning your baseline.
One time purchase, no subscription, lifetime updates. Seven day trial, no card required.
Rolling baseline per metric, built from your own history rather than a population average
One plain sentence a day explaining what actually moved, not just a score
Your full history on a real screen, not the last few days the phone app shows you
Runs entirely on your machine. No account, no cloud sync, no health data leaving the device
Deterministic. No LLM in the decision path, so the same inputs always give the same output
Corrections stick. Tell it when it got something wrong and it weights that going forward
Tags and journal notes stored locally alongside the ring data
Missing days stay null, never zero, so one gap cannot poison your baseline
macOS 12+ and Windows 10/11
One time purchase, lifetime updates, no subscription
You wake up, glance at the score, close the app, and it never told you anything you could act on
You want to know whether a bad night was actually bad or just below your own average
You are trying to work out whether the wine, the late workout or the warm room is what moved your numbers
You want your full history on a desktop screen instead of scrolling a phone
You are getting ill and want the resting heart rate rise a day before you feel it
You do not want your health data sitting on someone else's server
You are sick of paying a subscription on top of a subscription
Oura on the Web is retiring and you need somewhere to look at your data properly


"Missing days stay null, never zero" is the line I would put at the top of the page. We ship a step counter and its day-boundary read used to fail silently and render 0, which is not a missing value, it is a false statement about the user's day. We replaced it with a dash and the complaints stopped. One thing that looks off in the funnel rather than the product: you say the daily read is not worth much until it has about two weeks of history, and the trial is seven days, so by your own description the trial ends before the thing becomes good. If an import can seed the baseline from existing Oura history on day one, say that loudly on the trial screen, because otherwise a fair evaluator judges you at half-baseline. And a warning from running local-first with no account ourselves: the privacy is real and so is the blind spot. With nothing phoning home you hear about a defect only when a human tells you, and every serious bug we shipped was found by someone using the app rather than by the test suite. For a paid desktop tool an opt-in "export a diagnostic file I can send you" is worth building before you need it.
I built this for myself first. Every morning I'd open the Oura app, see a number, close it, and be no wiser. The score never told me what moved, or whether it was even unusual for me. So Vitra does the opposite. It builds a baseline from your own history and tells you the gap in one sentence: your resting heart rate is 4 above your own 14 day median, third night running. Boring, but it can be wrong and you can catch it being wrong. A score you can't check isn't a measurement. Two things I decided early and would defend. Everything runs on your machine, because health data on someone else's server is a liability I didn't want to own. And no LLM in the decision path, so the same inputs always give the same output. It's less impressive in a demo and I'm fine with that. Happy to answer anything, including the parts that don't work yet.


"Missing days stay null, never zero" is the line I would put at the top of the page. We ship a step counter and its day-boundary read used to fail silently and render 0, which is not a missing value, it is a false statement about the user's day. We replaced it with a dash and the complaints stopped. One thing that looks off in the funnel rather than the product: you say the daily read is not worth much until it has about two weeks of history, and the trial is seven days, so by your own description the trial ends before the thing becomes good. If an import can seed the baseline from existing Oura history on day one, say that loudly on the trial screen, because otherwise a fair evaluator judges you at half-baseline. And a warning from running local-first with no account ourselves: the privacy is real and so is the blind spot. With nothing phoning home you hear about a defect only when a human tells you, and every serious bug we shipped was found by someone using the app rather than by the test suite. For a paid desktop tool an opt-in "export a diagnostic file I can send you" is worth building before you need it.
I built this for myself first. Every morning I'd open the Oura app, see a number, close it, and be no wiser. The score never told me what moved, or whether it was even unusual for me. So Vitra does the opposite. It builds a baseline from your own history and tells you the gap in one sentence: your resting heart rate is 4 above your own 14 day median, third night running. Boring, but it can be wrong and you can catch it being wrong. A score you can't check isn't a measurement. Two things I decided early and would defend. Everything runs on your machine, because health data on someone else's server is a liability I didn't want to own. And no LLM in the decision path, so the same inputs always give the same output. It's less impressive in a demo and I'm fine with that. Happy to answer anything, including the parts that don't work yet.
Find your next favorite product or submit your own. Made by @FalakDigital.
Copyright ©2025. All Rights Reserved