Breathing Index 🫁

Privacy

Last updated 7 August 2026

There is no server. No account, no login, no database of yours anywhere. Your diary is a value in your browser's storage on this device, and the only way it leaves is if you export it yourself.

What stays on your device

Everything you type or tap. Ratings, confounder tags, notes, saved places, settings, the exposure readings captured with each entry, and the last good air reading kept for offline use. They live under these keys in this browser's localStorage, plus one marker in IndexedDB used to notice that the browser wiped the rest:

Clearing site data deletes all of it, permanently, and I cannot get it back for you — I never had it. Settings has an export button. Use it.

No cookies. Nothing here is a cookie, and the app sets none.

What gets sent, and to whom

Four other services see a request from your browser. That is the whole list.

Open-Meteo Air quality and weather. Sees your coordinates, rounded to three decimals (about 110 m), and nothing else.
AirNow Station measurements for comparison, US only, off unless you turn it on in Settings. Sees the same rounded coordinates.
BigDataCloud Turns those coordinates into the place name in the header. Same rounded coordinates, asked once per location and then cached.
Mixpanel Usage pings — the table below. Off if you turn it off.

Fonts and icons are served from this domain, so opening the app is not a request to Google or a CDN. There is no ad network, no tag manager, no embedded anything.

Usage pings, exactly

Turn them off in Settings and the analytics code is never even loaded. While they are on, these are the events. No rating, tag, note, place name, coordinate, or pollutant value appears in any of them.

Page view Automatic, on load and on every in-app navigation: the URL path and query string of the screen (/, /diary, /settings…).
Prediction viewed diaryEntries — how many entries your diary holds stale — whether the reading shown was a cached one locationSourceauto, saved or default, never which place
Diary entry saved coldStart — whether the forecast was still unpersonalized saveMs — how long the save took totalEntries — how many entries after it Not the rating.
Conflict tagged kindsuperseded or unmodeled-trigger, the type of card, not the tag you chose
Intro dismissed choicelocation or manual
Diary eviction seen No properties. Records that a browser wiped somebody's diary.
Diary restored entries — how many entries the backup you loaded added
Persistence requested granted — whether the browser agreed to stop treating your diary as disposable cache

Mixpanel attaches its own defaults to every event: a random device id (not an account), browser and operating system name and version, screen size, referrer, and the current URL. IP geolocation is switched off and the city, region and country properties are blocked, so no location is derived from the request. Mixpanel's servers still receive your IP address at the network level, the way every server you contact does; it simply is not turned into a place and stored.

What the pings are for: knowing whether people can log an entry and whether anything is broken. Nothing is sold, shared, or joined to anything else. There is nobody to sell it to; this is one person's side project.

Children

Not directed at children under 13, and since nothing identifying is collected, there is nothing of theirs for me to hold.

Changes

If the app ever sends something new, this page changes in the same commit — that is a rule I hold myself to, not a promise in the abstract. The date at the top is the last time it did.

Contact

Drew Hoover — drewhoover.com. The code is public at github.com/DrewHoo/breathing-index, so you can check any of this rather than take my word for it.