local-first · zero telemetry
0 readings

New reading

enter measurement · adds to local store

Today's readings

reminders off
    Last 7 days
    Readings logged

    30-day trend

    individual readings · 7-day rolling mean · AHA bands
    Normal <120/80 Elevated 120–129 Stage 1 130–139/80–89 Stage 2 ≥140/90

    Summary

    over selected window

    Reading by hour

    scatter · all readings · last 30d default

    Heatmap · day × hour

    average systolic · darker = higher · helps spot confounders

    Time-bucket averages

    groups your readings by part of day

    Clinical report

    format your doctor will recognize

    Average blood pressure

    morning (before noon) vs evening · the comparison clinicians care about for antihypertensives
    Morning · pre-noon
    0 readings
    Evening · noon onward
    0 readings

    Overall mean
    Mean pulse
    bpm
    Total readings
    Pulse pressure
    mmHg
    SYS – DIA

    Classification distribution

    % of readings by AHA category · highest of (sys, dia) wins

    Reading log

    all readings in window · for inclusion in chart notes
    Date Time BP Pulse Class Notes

    Random reminders

    stratified random sampling across waking hours

    The day is split into N equal windows between your wake and sleep times. One reminder fires at a random moment in each window you haven't yet logged a reading for. This approach gives you broader temporal coverage than purely random alerts and helps surface confounders (caffeine, meals, exertion, time-of-day patterns) that might be biasing your data.

    Enable reminders requires notification permission · reminders run while this site is open or installed as a PWA
    Wake time earliest possible reminder
    Sleep time latest possible reminder
    Reminders per day 2–8 · evenly distributed windows

    Try it with demo data

    generates 60 days of plausible readings · for evaluation only

    Adds synthetic readings with realistic time-of-day variation and a slight downward trend (as if a new med is working). Wipe afterward before logging real data.

    Import from Google Fit

    Takeout JSON or CSV · runs locally · nothing uploaded

    From Google Takeout, select Fit, download the archive, and locate Takeout/Fit/All Data/derived_com.google.blood_pressure*.json (or the matching CSV under Daily Aggregations). Drop it below — duplicates are skipped automatically.

    Export your data

    three formats · for portability and backup

    Display

    Light mode better for printing · matches some doctor's office screens

    Install as PWA

    For best background notification support on Android, install this site as an app. Chrome menu → "Add to Home screen" / "Install app". On iOS Safari, share → "Add to Home Screen" (note: iOS limits notification scheduling for PWAs to roughly when they're foregrounded).

    Danger zone

    All readings live in your browser's IndexedDB. Wiping is irreversible. Export first.

    About · technical notes
    Data lives in IndexedDB under the database name bp-tracker. No external services are contacted other than loading Chart.js and Google Fonts on first visit (then cached by the service worker for offline use). The classification scheme follows the 2017 ACC/AHA guideline. The "highest-of (sys, dia)" rule is the standard convention — a reading of 118/92 classifies as Stage 2. Pulse pressure (SYS − DIA) is included because cardiologists evaluating antihypertensives often look at it alongside the absolute numbers.