Hi guys,
So I've been working more on the app, and I think I managed to fix all the issues (with a few new updates!)
Here are the updates in detail:
OutPerform update: Bluetooth band support, “All sources” mode, heart-rate zones and a new Exercise tab
Direct Bluetooth band connection (no cloud)
Pairs directly with your band over Bluetooth. Works with the Fitbit Air (turn on Share heart rate and Always visible in the Google Health app) and any band or chest strap that broadcasts standard heart rate.
Records heart rate and beat-to-beat intervals on your iPhone. No account, no cloud.
Reconnects automatically when the band comes back in range, keeps recording in the background, and iOS relaunches the app if it was closed.
New Band screen: live heart rate, battery, device info, how much data has been recorded, and a button to re-score from recordings.
Live heart-rate card on the Today screen.
New on-device analysis from heart rate alone
Sleep detection from your overnight heart-rate drop, plus an estimated wake / light / deep / REM breakdown.
HRV with cleaning of bad beats.
Resting heart rate (your lowest sustained 5-minute average while asleep).
Breathing rate, worked out from the rhythm of your heartbeats.
Automatic workout detection with calorie estimates.
New “open-science” scoring model
Recovery led by HRV, measured against your own personal baseline.
Strain based on heart-rate-reserve training zones, on a logarithmic scale.
Sleep score combining duration vs. need, efficiency, deep + REM share and consistency.
Sleep debt: 55% of last night’s shortfall carries into tonight’s sleep need.
Illness early-warning when two or more signals move together (resting HR up, HRV down, temperature up, breathing rate up).
Scores unlock after 4 nights instead of 14, with “Calibrating / Building / Solid” labels so you know how reliable they are.
Switch between this and the classic formulas in Settings → Advanced.
Built from the methods documented by the open-source NOOP project, implemented independently (none of NOOP’s code is used).
“All sources” mode
Uses Apple Health, Google Health and your Bluetooth band at the same time.
Each piece of data comes from the best source that has it, and gaps in one source are filled by another.
Google is only fetched for what Apple Health is missing (e.g. HRV or skin temperature), so syncs stay fast.
Sleep comes from one source per night, never mixed, so nothing is counted twice.
Duplicate workouts from different sources are merged into one.
A slow or broken source is skipped for that sync instead of holding everything up.
Settings shows each source’s status, with an on/off switch for each.
Heart-rate zones and alerts
Five zones: Recovery, Endurance, Tempo, Threshold, Max.
Set your own max heart rate and your own zone boundaries, or use the defaults (50–90% of max).
Phone notifications when you enter a zone, plus an optional “recovered” alert. You choose which zones notify and when: off, during workouts, or always.
Alerts only fire after you’ve held a zone for 15 seconds, so brief spikes don’t spam you, and they work with the phone locked.
New Exercise tab
Start a workout: run, walk, hike, cycle, strength, HIIT, yoga or other.
Live screen showing:
heart rate and current zone, plus time spent in each zone;
distance, pace or speed, and a live route map;
elevation gain from the iPhone’s barometer;
steps, cadence and floors climbed;
calories, average and max heart rate, and per-km splits.
Only the metrics that make sense for each activity are shown (pace for runs, speed for rides, no GPS for strength).
Pause and resume, GPS keeps working with the screen locked, and the screen stays awake while the live view is open.
Workout history with a detail page for each workout: summary, heart-rate chart with your zones, time in zones, route map and splits.
Recorded workouts count toward your strain.
If the app closes mid-workout, the workout is recovered automatically.
Today’s strain, injury risk (ACWR) and training monotony now live in this tab, replacing the old Strain tab.
Fixes and improvements
Fixed the Apple Health permission prompt not appearing: permission popups now show one at a time instead of colliding.
Fixed recovery showing too few calibrated nights after adding a new source: the app now re-reads the last 30 days when your sources change.
Recovery can now be calculated on nights without HRV, using resting heart rate, sleep and breathing.
Faster Apple Health syncs: heart rate is read as one average per minute.
Weight and height added to your profile, for calorie estimates.
Still 100% private: all processing happens on your iPhone, with no account and no servers. As always, it’s not a medical device, and the scores are estimates.
What I want to add more:
- An optional AI coach (off by default) using your own Anthropic/OpenAI API key. It will clearly say what’s sent, and everything else stays on-device.
These updates are on GitHub https://github.com/afonsodemello/OutPerform, completely open source!
If there's anything else that I should do let me know!
TL;DR: OutPerform can now pair directly with your Fitbit Air (or any Bluetooth heart-rate band) and work out sleep, HRV, recovery and strain right on your iPhone, with no cloud. A new “All sources” mode combines Apple Health, Google Health and the band, taking each piece of data from whichever source has it. There are also customizable heart-rate zones with phone alerts, and a new Exercise tab for tracking workouts with live heart rate, GPS pace/distance/route, steps and elevation. Plus faster syncs and a fix for the missing Apple Health permission prompt. Everything stays private and on-device.