Recovery, strain and sleep scores for your Fitbit Air
Open source and self-hosted. Pulse turns your Google Health data into daily scores, on a server you own.


Three numbers each morning
Sleep, Recovery and Strain open the home screen, each scored against your own baselines.
- 86%%SleepHow well last night's sleep met your need.
- 74%%RecoveryHow ready your body is to take on strain today.
- 12.4StrainThe day's cardiovascular load, from 0 to 21.
Example values. Each score has its own page with its inputs, weights and limits.
Made for the phone in your pocket
Pulse is a web app you add to your home screen from the browser. Screens from demo mode, with generated data.

StrainThe day so far, and today's Strain Target. 
SleepSleep Performance against your own need. 
HealthPulse Age and Pace of Aging. 
Health MonitorHeart rhythm and body measurements. 
JournalLog water, food, weight and mood.
On a laptop, the whole picture at once
My Dashboard
Choose which metrics sit on Home and in what order: heart rate variability first and steps last, or the other way round.

Trends
Recovery, sleep, activity and body metrics by week, month, six months or year, each with averages to compare against.

Health Monitor
Last night's vitals against your normal range, ECG readings and irregular rhythm notifications, weight and body fat.

Journal
Log your day, check in each evening, and see which habits move the next morning's Recovery.

18 scores, each explained in full
Inputs, weights, bands, limits and sources for every number Pulse shows. Browse the metrics
- RecoveryHow ready your body is to take on strain today, from 0 to 100%.
- StrainThe cardiovascular load of your day, on a scale from 0 to 21.
- Strain TargetA Strain range for today, set by your Recovery and recent load.
- Sleep PerformanceHow well last night’s sleep met your need, from 0 to 100%.
- Sleep PlannerTonight’s sleep need, and the bedtimes that meet it.
- Pulse AgeHow old your body behaves, and how fast that is changing.
- Stress MonitorHow far your heart rate sits above your calm level, from 0 to 3.
- Energy BankAn estimate of how much energy you have left today, 0 to 100%.
- Health MonitorLast night’s five vitals against your own normal ranges.
- Fitness levelYour VO2 max compared with people of your age and sex.
- Training balanceWhether your recent strain is above or below what you are used to.
- Behaviour insightsHow each behaviour you log goes with your next day’s scores.
- Sleep consistencyHow closely your sleep and wake times repeat from day to day.
- Recovery forecastAn estimate of tomorrow morning’s Recovery.
- Fitness, fatigue and formYour long-term and short-term training load, and the gap between them.
- Heart rate recoveryHow far your heart rate drops in the minute after a workout.
- Heart rate variability (HRV)The night-to-night signal Recovery leans on most, read from your Fitbit Air.
- Resting heart rateYour lowest sleeping heart rate, and the vital most scores lean on.
How your data gets to Pulse
- Fitbit AirRecords heart rate, sleep and nightly vitals, and syncs to your phone.
- Google Health appHolds the band's data in your Google account, as it always has.
- Google Health APIPulse reads it with an OAuth client from your own Google Cloud project.
- Your serverOne Docker container scores every day and keeps the history in SQLite.
- Your browserOpen it on your phone or laptop, and install it like an app.
Your health data stays on a machine you control.
- No Pulse account
- You sign in with your own Google account, to your own instance. There is no Pulse service to sign up for.
- No analytics in the app
- The app talks to Google's sign-in and Health API, and nothing else.
- One owner per instance
- Only the Google account you name can sign in. Nobody else's data is on your server, and yours is on nobody else's.
- Leave whenever you like
- Disconnecting removes Pulse's access in your Google account. The database is one SQLite file you can back up or delete.
Get started
Try the demo on your laptop in a few commands, then point it at your own data. You need Node 24 and pnpm for the demo, Docker for a server.
Try the demo
git clone https://github.com/adityaongit/pulse.git
cd pulse
pnpm install
cp .env.example .env
pnpm devOpen localhost:3000 and choose Continue with demo data.
Run it on a server
# in .env: Google OAuth client, OWNER_EMAIL, TZ
docker compose up -d --build
docker compose logs -f pulsePut a tunnel or HTTPS reverse proxy in front, then open it on your phone.
About this project
Pulse is made by one independent developer, for the community, and it is free. There is no company behind it, and no intention of competing with WHOOP or anyone else.
It uses no WHOOP device, data, code or assets. Every score is computed from your own Google Health data, with methods published in full. The interface takes design inspiration from apps the developer admires.
WHOOP and the other names on this site are trademarks of their owners, and Pulse is not affiliated with or endorsed by them. If you represent WHOOP or any other company and have a concern, please email work.adityajindal@gmail.com and it will be changed or taken down.
Questions
Something else? Ask on GitHub.
Is Pulse free?
Yes, for personal and other noncommercial use, under the PolyForm Noncommercial 1.0.0 license. Selling it, or putting it inside a commercial product, is not allowed.
What do I need to run it?
A Fitbit Air paired with the Google Health app, a Google Cloud project for the OAuth client, and any machine that runs Docker: a home server, a NAS or a small cloud VM. To reach it from your phone, give it an HTTPS address with a tunnel or reverse proxy. The setup guide covers each step.
Can I try it before connecting my Google account?
Yes. Demo mode generates 180 days of realistic data on your laptop, with no Google account and nothing sent anywhere.
Where does my data go?
From Google Health to your own server, and nowhere else. The app talks only to Google's sign-in and Health API. There is no Pulse account, no Pulse cloud and no analytics in the app.
Does it work with other Fitbit devices?
Pulse is built and tested with the Fitbit Air. It reads from the Google Health API, so other devices that sync to the Google Health app may work, but the scores are tuned to the data the Air records.
The old Fitbit Web API is shutting down. Does that affect Pulse?
No. Pulse uses the newer Google Health API from the start, with your own Google OAuth client.
Can several people share one Pulse?
No. Each instance belongs to one owner, set by the Google account allowed to sign in. Everyone runs their own, so nobody's health data sits on someone else's server.
Are the scores medical advice?
No. Pulse is a wellness tool, not a medical device. Every score is an estimate from a wrist sensor, and each metric page lists its limits.
Is Pulse affiliated with a wearable company?
No. Pulse is a free project by one independent developer, with no intention of competing with WHOOP or any other company. It uses no WHOOP device, data, code or assets, and every score comes from your own Google Health data. The interface takes design inspiration from apps the developer admires. If you represent WHOOP or any other company and have a concern, please email work.adityajindal@gmail.com and it will be changed or taken down.