Wellness
The wellness table stores daily health metrics from wearable devices or manual entry. Each row represents one day from one source.
Schema
Section titled “Schema”| Column | Type | Unit | Description |
|---|---|---|---|
id | UUID | — | Row identifier |
user_id | UUID | — | Owner |
date | date | — | Calendar date (YYYY-MM-DD) |
source | text | — | Data source (see below) |
rhr_bpm | real | bpm | Resting heart rate |
hrv_rmssd | real | ms | HRV — root mean square of successive differences |
sleep_hours | real | hours | Total sleep duration |
readiness | real | 0–100 | Readiness / recovery score (source-specific scale) |
created_at | timestamptz | — | When the record was created |
All metric columns are nullable — a row may have only some metrics filled in depending on what the device reported.
Source values
Section titled “Source values”| Source | Description |
|---|---|
oura | Oura Ring (via Oura API) |
garmin | Garmin Connect (via Garmin Health API) |
whoop | WHOOP strap |
manual | Entered manually in FitRepo |
Uniqueness
Section titled “Uniqueness”Each (user_id, date, source) combination is unique. If a source reports updated data for the same day, FitRepo upserts the row.
HRV note
Section titled “HRV note”hrv_rmssd is the standard overnight HRV metric used by most wearables. RMSSD (root mean square of successive RR-interval differences) is a time-domain measure — higher values generally indicate better parasympathetic activity and recovery.
Different devices measure HRV differently (sampling window, filter algorithms). For trend analysis, stick to a single source to avoid cross-device noise.
Readiness score
Section titled “Readiness score”The readiness field maps to the device’s own readiness/recovery score:
- Oura: Readiness Score (0–100)
- Garmin: Body Battery (0–100)
- WHOOP: Recovery Score (0–100)
These are not directly comparable across sources.
Querying via MCP
Section titled “Querying via MCP”Use the get_wellness tool to fetch wellness data:
get_wellness(from: "2025-01-01", to: "2025-03-31", source: "oura")The source filter is optional — omit it to get all sources for a date range.