Privacy Policy

Last updated: 2026-08-13

FitNote is a workout tracker built to keep your data on your device by default. This policy describes what the app collects, where it lives, and what you can do with it.

What we collect

You choose whether to sign in. That choice determines what the app collects.

Device-only mode (no sign-in)

If you never sign in, nothing leaves your device. Everything you log — sessions, sets, templates, body metrics, preferences — lives in that browser's IndexedDB. There is no account, no server round trip, and no analytics.

If you clear this site's data, uninstall the browser, or switch devices, that history is gone. Export a JSON backup from Settings → Data if you want a copy.

Signed-in mode (email account)

When you sign in with email, the app stores the following on our server (Supabase Postgres, RLS-scoped to your user id):

optional height, optional body-fat and bodyweight caches, optional free-text training goal, appearance preferences.

records, templates, custom exercises, body metric entries (bodyweight, body fat, waist, resting HR, etc. — whatever you choose to log).

Row-Level Security is enforced at the database, per table, and covered by an automated test suite. Another signed-in user cannot read or write your rows.

Passwords are never collected. Sign-in uses a single-use email link (with an emailed code as fallback) via Supabase Auth.

Error diagnostics

When you are signed in, the app may write a scrubbed error record to the server if it hits a bug: the error message, its JavaScript stack trace, the page URL, the browser user agent, and a build identifier. No request bodies, no form fields, no training data. The record scopes to your account via the same RLS rules as your other data. Device-only mode reports nothing.

You cannot read your own error history from within the app; only the developer can, via a service role in the database dashboard. Errors delete with the account.

AI coach

The AI coach is optional. When you use it, the app sends a de-identified summary of your recent training to a Google Gemini endpoint via our backend:

three weeks ago). No absolute dates.

No names, no notes, no absolute dates, no session titles. The full contract is in src/features/coach/summary.ts and the "What's sent" button in the coach screen shows the exact payload before you use it.

Google processes this request under their API terms. We do not train a model on your data.

What we do not collect

first-party, above.

Where your data lives

tokens in localStorage for auth.

region of the project. AI-coach requests transit Google's Gemini API.

hirshguha.com/workout-tracker.

What you can do

containing every one of your rows.

everything in this browser's IndexedDB. Synced accounts re-download from the server; device-only accounts lose their history.

cascades to every row you own on the server. This is not reversible.

Data retention

Rows persist until you delete them, delete your account, or clear local storage. Diagnostic error records are retained for developer troubleshooting and delete with the account.

Children

FitNote is not directed at children under 13. Do not create an account for a child under 13.

Changes

We may update this policy. Material changes will be reflected in the "Last updated" date at the top and, when relevant, announced in-app.

Contact

Questions: open an issue at github.com/hguha/workoutTracker or email the address listed in Account → Settings.