WorldsBestTracker

Your n-of-1 experiment is only as good as the log behind it

You have a spreadsheet with a tab per protocol. A notes app with a running list of what you took. A wearable app that knows your HRV and nothing about your stack. Three months in, you cannot answer the only question you started this for: did any of it do anything? The data exists. It is just scattered across four places that do not share a timestamp, and the version in your head has already started rewriting itself. World's Best Tracker is one log for what you take, how you feel, how you sleep, what you train and what you spend, built by people who decided a number gets shown with where it came from.

Start free See the live demo

The problem is not discipline. It is that your log is not analysable.

You are not lazy. You have logged for months. The problem is the shape of what you wrote down.

"Felt kind of flat today" is a sentence, not data. You cannot line it up against the week you doubled the dose. Six months of honest notes give you one output: a vague memory that spring was worse than summer.

So the vocabulary is fixed. A feeling is a coded id plus an intensity from 1 to 5. There are 58 of them across 11 categories, from energy and mood to digestive, cardio and skin.

What you take is structured the same way: category (Medication, Supplement, Peptide, Other), delivery route, cadence. And the day you took more or less is a titration, not an edit. In a spreadsheet you overwrite the cell and the history is gone. Here it is a multiplier factor plus one of 10 fixed reasons, and it never rewrites the blueprint. Zero is excluded: a dose of nothing is a skip, a different event, and it shows up as a day with no log. The reason chips reorder toward the direction you dialled but never filter, because a form that second-guesses you teaches people to stop logging honestly.

One timeline, or it is not an experiment

A dose log is worthless alone. The comparison is the experiment, and it needs one clock.

Sleep goes in as absolute bedAt and wakeAt timestamps. Duration is derived, never stored, so it cannot disagree with them. If a wearable already reported that night, the manual logger steps aside.

Food goes in with meal slot, name, brand, servings and full per-serving macros. Type or paste the barcode, or search by name, and the lookup runs cache first, then Open Food Facts, USDA FoodData Central and NIH DSLD. There is no live camera barcode decoder: in the cabinet you photograph a label and OCR lifts the digits, and in the food diary you type them.

Training goes in set by set: PRs off an Epley 1RM estimate, and a spoken set like "back squat 225 for 5" transcribed by your phone's own dictation and parsed on-device, no model call, no round trip to our server.

Recovery goes in as 26 modalities across 7 families, and none get a half-life or a decay curve, because they are not pharmacology. Cost goes in too: price paid, cost per serving, cost per milligram.

Imports that fill themselves, named honestly

Effort is the denominator. Here is what arrives without your typing.

Strava: implemented. OAuth with read and activity:read_all, up to 5000 activities, full history on the first sync, refreshed every time you open the app.

WHOOP: implemented, over signature-verified webhooks. Recovery score, HRV RMSSD, resting heart rate, SpO2, sleep minutes and efficiency, workout strain and heart rate. There is no live stream: push lands within minutes of WHOOP finishing its processing.

Oura: implemented, polling only. It pulls when you connect it and whenever you tap Sync now. No webhooks, deliberately: the verification handshake could not be confirmed against live docs, and guessing at a security handshake ships something broken.

Google Health v4 for Fitbit, Pixel Watch and Wear OS: built and working, closed to new connections behind an annual third-party CASA assessment at $500 to $5,000 a year.

Garmin: a Connect IQ watch app that pairs by code, pulls today's schedule and posts a dose from your wrist. It is sideloaded today rather than installed from the store, and it does not read Garmin Connect activity, sleep or heart rate.

Two devices catching one session merge inside a 5-minute window, both credited. Two that report the same day and disagree stay separate, because averaging them invents a number neither measured.

It refuses to guess, and that is the feature you are buying

Anything with a chat box will happily tell you a half-life. Most are making it up.

The compound lookup prompt orders the model to return null for any field it is not confident about, and forbids guessing, estimating, approximating and inferring. Every AI-produced field is stamped source:'ai' and shown as unverified. In the pharmacology view every half-life carries a provenance chip: with no citable source it reads "WBT reference", with one it names the FDA label and links it.

Patterns are computed in code before a language model sees them. The model only phrases what the code found, with its n attached. A time-of-day cluster needs at least 5 logged events for that feeling, with 4 or more inside one 3-hour band holding at least half of them. Below the thresholds you get nothing. Not a cheerful "nothing to report". Nothing.

It will not give you dosing advice, a diagnosis, or a start-stop recommendation. That is a hard instruction to the assistant, and the daily check-in additionally runs a post-model regex screen for dosage-change, start-stop and diagnosis phrasing, swapping in the plain computed sentence when one trips. Check-in suggestions are scoped to timing and rest: never an amount, never something new, never stopping. In conversation it may tell you what a named public source says about a supplement or a lifestyle change, always attributed, never about a prescription medication.

The offer: log a real week for free, then decide

There is no card to start.

Free gives you 25 cabinet items, 60 label scans a month, 40 assistant messages a day and 60 hand-logged workouts a month. They were raised on 2026-08-15, up from 5 cabinet items, 15 scans a month and 10 assistant messages a day, for one stated reason: so a real week of tracking fits inside Free. The workout meter came a day later, and it started at 60.

Plus is $2.99: the cabinet and workout caps go, scans rise to 200 a month. Pro is $7.99: scans unlimited, 400 assistant messages a day. Nobody sells you "unlimited AI": even Pro carries a ceiling, and the code says why, an unbounded assistant is an unbounded bill. Wearable-synced workouts never count against any meter.

The paid tier is ceiling, not features. Scans and assistant messages are the two that actually stop you, and the two the paid tier lifts.

What you are afraid of, handled. Billing stores a customer id and a tier, no line items, no product names. Ad pixels get three standard event names, nothing about meds, doses or feelings. Your OAuth tokens are unreadable by every client including you. The app never asks for your location on its own.

What is not true, said plainly: this is not a local-only app. Your logs live in Firestore on Google Cloud, each assistant turn sends a bundle of them to Gemini, and platform admins have cross-account read, blocked from writing. It is not HIPAA covered.

Every week you do not log in a structured format is a week you cannot analyse later. Nothing recovers it. Start the log.

What it deliberately does not do

  • It does not invent a half-life. In the pharmacology view every half-life carries a provenance chip naming its source, and an unsourced number reads 'WBT reference' rather than being dressed up as a citation (src/lib/provenance.ts:15-31, src/components/PharmacologyPanel.tsx:155).
  • It does not guess at pharmacology. The compound lookup prompt orders the model to return null for any field it is not confident about, and forbids guessing, estimating, approximating and inferring (server.ts:3266-3268). Every AI-produced field is stamped source:'ai' and shown as unverified, never as a catalog value (server.ts:3239-3241, src/lib/compoundLookup.ts:30-37).
  • It does not give dosing advice, diagnoses, or tell you to start, stop or change a medication. That is a hard instruction to the assistant (server.ts:3041). On top of it, the daily check-in message runs through a post-model regex screen for three patterns (dosage change, start or stop, diagnosis) and falls back to the plain computed sentence when one trips (server-lib/concierge.ts:82-107, server.ts:4101).
  • It does not let a language model discover a pattern. Patterns are computed in code with minimum thresholds first; the model only phrases what the code already found (server-lib/patterns.ts:3-19).
  • It does not read sentiment or extract themes from your journal. Recurrence detection is literal word counting, on purpose (server-lib/patterns.ts:300-305).
  • It does not paraphrase you. log_note stores your own words lightly cleaned of filler, never a summary (server.ts:574, :3038).
  • It does not average two wearables that disagree. Two devices on one day are never merged into one row, because averaging them would invent a number neither device measured (src/types.ts:264-267).
  • It does not double-count a session. A hand-logged sleep record beats a device record for the same night and is never summed or averaged (server.ts:3062), and a Strava and WHOOP capture of the same workout merge inside a 5-minute window with both sources credited (src/lib/workouts.ts:59-109).
  • It does not guess where an unknown workout came from. An unknown source normalizes to 'unknown' rather than 'strava' (src/lib/workouts.ts:50-56).
  • It does not invent an adherence percentage. It counts days with no dose instead, because the app does not reliably know every expected time and a made-up denominator produces a confident wrong number (server-lib/patterns.ts:225-227).
  • It does not record a skip as an event. A skipped dose is the absence of a log, which is exactly what the adherence view counts, and a titration factor of zero is rejected for that reason (src/lib/titration.ts:103-110, server-lib/patterns.ts:250).
  • It does not invent a beyond-use date. budDays is user-entered or a standard you confirm, and with neither date present freshness stays 'unknown' (src/lib/shelfLife.ts:6-8).
  • It does not convert units or read the %DV column during label OCR. It never multiplies or divides a label value, and returns a UPC or expiry only if it can actually read it (server.ts:3377-3389).
  • It does not decode barcodes with a live camera. In the cabinet you photograph the barcode and OCR reads the digits; in the food diary you type or paste them, or search by name (server.ts:3389, src/components/NutritionScreen.tsx:349-353).
  • It does not read macros from a photo of your plate. No food-image endpoint and no food-image capture input exist.
  • It does not send your voice to a model to log a set. The transcript comes from your phone's own dictation, and the parse into exercise, weight and reps is local regex against the exercise tree, with no model call and no round trip to our server (src/lib/workoutSession.ts:191-215).
  • It does not stream WHOOP live. Data arrives as push within minutes after WHOOP finishes processing, and the code explicitly forbids promising a 'during' readout (server-lib/whoop.ts:10-13).
  • It does not push from Oura, and it does not poll Oura on app open. Oura pulls when you connect it and when you tap Sync now, because the webhook verification handshake could not be confirmed against live docs at build time (server-lib/oura.ts:14-19, src/lib/wearables.ts:52). Strava and Google Health are the two that refresh themselves when you open the app.
  • It does not sync Garmin Connect. There is a Connect IQ watch app for logging a dose from the wrist, sideloaded to the watch today rather than installed from the Connect IQ store, and it does not read Garmin activity, sleep or heart rate (garmin/README.md:3, server.ts:3903-4055).
  • It does not accept new Fitbit, Pixel Watch or Wear OS connections. The Google Health v4 integration is built but closed to new connections pending an annual third-party CASA assessment costing $500 to $5,000 per year (src/components/SettingsProfileScreen.tsx:637-649, server-lib/googleHealth.ts:60-66).
  • It does not write device data back to Google Health. Write-back is limited to WBT-created rows only: completed planned workouts, logged modalities and profile weight (server-lib/googleHealth.ts:267-286).
  • It does not publish a subscribable calendar feed. You export a downloadable .ics file covering the next 7 days of doses and import it into your calendar (src/lib/reminders.ts:134-181).
  • It does not put pharmacology on a sauna. Modalities have no half-life and are never rendered as a decay curve (src/lib/modalityOntology.ts:5-10).
  • It does not send anything about your health to ad pixels. Three standard events only, SignUp, Lead and ViewContent, with nothing about meds, doses, feelings or profile contents (src/lib/analytics.ts:1-4).
  • It does not store what you track alongside your money. Billing keeps a customer id and a tier, no line items and no product names (server-lib/billing.ts:15-16).
  • It does not ask for your location on its own. Environment readings use a position only if one was already granted, and the only thing that can raise the browser prompt is you tapping the location chip yourself. Whatever is used is rounded to an 11 km cell before it leaves (src/lib/environment.ts:10-18).
  • It does not claim your data never leaves the device. A signed-in account writes to Firestore on Google Cloud, each assistant turn sends a bundle of your real health data to Gemini, and platform admins have cross-account read by design (src/lib/guestDemo.ts:10-11, src/App.tsx:809-940, firestore.rules:20-32).
  • It does not write anything on your behalf without a tap. Every assistant action renders a confirm card and the client, not the model, performs the write (src/lib/assistant.ts:3-4).
  • It is not HIPAA compliant. It is a consumer wellness product and not a HIPAA covered entity today (firestore.rules:21-25).
  • It does not do appointments yet. Appointment features are marked coming soon (src/types.ts:432-435).
  • It does not offer unlimited AI on any tier. Even Pro is capped at 400 assistant messages a day, because an unbounded assistant is an unbounded bill (src/lib/limits.ts:35, :46).

Questions

Can I track a peptide cycle without the app telling me what to dose?

Yes. Peptide is a first-class category on a blueprint, alongside Medication, Supplement and Other, with delivery methods including Injection IM, SubQ and IV, Sublingual, Troche, Nasal and Topical (src/types.ts:104-128, src/components/BlueprintWizard.tsx:27-40). The assistant is under a hard instruction that it is not a medical professional and must never give dosing advice, diagnoses, or tell you to start, stop or change anything (server.ts:3041). On top of that instruction, the daily check-in message runs through a post-model regex screen for dosage-change, start/stop and diagnosis phrasing, and swaps in the plain computed sentence when one trips (server-lib/concierge.ts:82-107, server.ts:4101). You set the protocol. It records it.

How does it handle a day when I took more or less than my standing dose?

That is a titration, and it is a first-class record rather than an edit. It stores a multiplier factor plus one of 10 fixed reasons and an optional note, and it never rewrites the blueprint (src/types.ts:144-148, src/lib/titration.ts:45-74). Factors are clamped between 0.05x and 10x, and zero is excluded, because a dose of nothing is a skip, which is a different event from an adjustment (src/lib/titration.ts:103-110). A skipped dose shows up as a day with no log, and that is what the adherence view counts. The reason chips reorder toward the direction you just dialled but never filter, and every reason stays available, because being second-guessed by a form is how you teach someone to stop logging honestly (src/lib/titration.ts:38-42, :63-66).

Which wearables actually import into World's Best Tracker right now?

Strava, WHOOP and Oura are implemented. Strava pulls your full history on the first sync, up to 5000 activities, and refreshes itself every time you open the app (server-lib/strava.ts:33-138, src/App.tsx:2565). WHOOP pushes recovery score, HRV RMSSD, resting heart rate, SpO2, sleep metrics and workout strain over a signature-verified webhook, arriving within minutes after WHOOP processes a session, not live (server-lib/whoop.ts:10-13, :223-306). Oura is polled rather than pushed: it syncs when you connect it and whenever you tap Sync now in Settings, covering readiness and contributors, sleep score and stages, average HRV, lowest heart rate, activity, stress and workouts (server-lib/oura.ts:131-251). Anything a device does not report stays null rather than being estimated.

Can I connect a Fitbit or Pixel Watch?

Not today. The Google Health API v4 integration is built and working, but new connections are closed because every googlehealth scope is restricted and requires an annual third-party CASA security assessment costing $500 to $5,000 a year (src/components/SettingsProfileScreen.tsx:637-649, server-lib/googleHealth.ts:60-66). Accounts that connected before the pause keep syncing; new users see a card to vote for the integration. WHOOP, Oura and Strava connect today.

Is the AI going to make up numbers about my compounds?

The design is built to prevent that. The compound lookup prompt orders the model to return null for any field it is not confident about, and forbids guessing, estimating, approximating and inferring; every AI-produced field is stamped source:'ai' and shown as unverified, never dressed up as a catalog value (server.ts:3239-3268, src/lib/compoundLookup.ts:30-37). In the pharmacology view every half-life carries a provenance chip naming where it came from, reading 'WBT reference' when there is no citable source, and openFDA can upgrade a catalog value to an FDA label with a URL (src/lib/provenance.ts:15-31). The one place estimation is allowed is macros for food you describe in conversation, and those are marked as estimates you can edit on the confirmation card (server.ts:3054).

What does the free tier actually give me, and what does paying unlock?

Free defaults to 25 cabinet items, 60 label scans a month, 40 assistant messages a day and 60 hand-logged workouts a month (src/lib/limits.ts:43-47). Those numbers were raised on 2026-08-15, up from 5 cabinet items, 15 scans a month and 10 assistant messages a day, specifically so a real week of tracking fits inside Free; the workout meter arrived a day later and started at 60 (src/lib/limits.ts:26-42). Plus is $2.99 and lifts the cabinet and workout caps entirely while raising scans to 200 a month; Pro is $7.99 and makes scans unlimited with 400 assistant messages a day (server-lib/billing.ts:47-53, src/lib/limits.ts:43-47). Scans and assistant messages are the two meters enforced server-side, because they are the two that cost real money to serve. Wearable-synced workouts never count against the workout meter at any tier (src/lib/limits.ts:27-29).

Who can see my data?

You, anyone you explicitly grant a care link to, and platform admins, who have cross-account read and are blocked from writing by rule, because an admin silently editing someone's medication record is a worse failure than reading one (firestore.rules:20-32). A signed-in account stores to Firestore on Google Cloud, and each assistant turn sends a bundle of your real logs to Gemini to answer (src/App.tsx:809-940). Ad pixels get three standard event names and nothing about your health (src/lib/analytics.ts:1-4), billing stores only a customer id and a tier (server-lib/billing.ts:15-16), and your OAuth tokens are unreadable by every client including you (firestore.rules:171-174). This is not a local-only app and it does not claim to be.

Start free See the live demo

WorldsBestTracker is a record-keeping tool. It is not a medical device, it does not diagnose, and it does not tell anyone what to take. Always talk to your own clinician about your treatment.

Home · Demo · Privacy · Terms · [email protected]