How to Add Whoop Metrics Integration to Zakirullin Files Journals
Zakirullin Files includes a standalone Go utility in cmd/whoop/whoop.go that converts raw Whoop CSV exports into formatted Markdown journal entries, processing sleep, recovery, and workout data for the last 10 days.
The zakirullin/files.md repository provides a minimalist journaling system based on plain Markdown files. For users tracking biometric data, the repository ships with a purpose-built Whoop metrics integration that transforms CSV exports from the Whoop dashboard into human-readable journal entries without requiring API access or internet connectivity.
How the Whoop Integration Works
The utility operates entirely offline by parsing three specific CSV files exported from the Whoop dashboard.
Entry Point and Data Structure
The main() function in cmd/whoop/whoop.go accepts a path to the export folder (defaulting to the current directory .) and initializes a map of day structs keyed by date. Each struct aggregates metrics from sleep, recovery, and workout sources into a single chronological record.
Parsing the Whoop CSV Files
Three dedicated functions handle the distinct data types:
parseSleeps()readssleeps.csvand extracts sleep performance percentage, total minutes asleep, and a presence flag.parseCycles()processesphysiological_cycles.csvto capture recovery score, heart rate variability (HRV), resting heart rate (RHR), and strain metrics.parseWorkouts()handlesworkouts.csv, storing each activity type with its duration.
All parsers utilize generic CSV helpers—readCSV(), indexHeader(), field(), parseTime(), atoi(), and atof()—to safely manage missing columns and string-encoded numeric values.
Sorting and Filtering
After parsing, the utility sorts the collected days in descending chronological order using sort.Slice with Date.After. The output is deliberately limited to the last 10 days to maintain concise weekly or bi-weekly journal reviews.
Markdown Rendering
The printDay() function generates a structured Markdown block for each date:
#### 23 July, Thursday
- Sleep: 86%, 7h 12m
- Recovery: 94%, HRV 61, RHR 52
- Strain: 3.2
- Workout: Run 45m
- Workout: Yoga 30m
This format is optimized for direct insertion into journal files such as journal/2024.08 August.md.
Running the Whoop Metrics Integration
To generate journal entries from your Whoop export:
# Export your Whoop data to a folder, e.g. ~/whoop-export
go run ./cmd/whoop/whoop.go ~/whoop-export
Appending to Monthly Journals
For automated insertion into a monthly journal file:
go run ./cmd/whoop/whoop.go ~/whoop-export >> journal/$(date +%Y.%m).md
Advanced Scripting
Insert the output under a specific heading using sed:
#!/usr/bin/env bash
EXPORT_DIR="${1:-$HOME/whoop}"
OUTPUT="$(go run ./cmd/whoop/whoop.go "$EXPORT_DIR")"
sed -i "/^## Whoop metrics$/a $OUTPUT" journal/$(date +%Y.%m).md
Summary
- The Whoop metrics integration resides in
cmd/whoop/whoop.goand requires no API keys or network access. - It parses three CSV files—
sleeps.csv,physiological_cycles.csv, andworkouts.csv—using robust helper functions. - Output is sorted by date descending and limited to the last 10 days for readability.
- The generated Markdown is compatible with any file in the Zakirullin Files journal structure.
Frequently Asked Questions
Does the Whoop integration require an API subscription?
No. The utility reads local CSV files exported from the Whoop dashboard, making it completely offline and API-independent as implemented in zakirullin/files.md.
Can I modify the number of days included in the output?
Yes. The limit is hardcoded in the main() function loop (currently set to 10). You can adjust this value in cmd/whoop/whoop.go before running the tool to show more or fewer days.
What happens if my Whoop export is missing a CSV file?
The parser safely handles missing columns and files through defensive programming in helpers like field() and atof(). Missing data simply results in omitted metrics for that day rather than parser errors.
Is the output compatible with other journaling systems?
Yes. Because the tool outputs pure Markdown, you can integrate the results into any text-based journal system, not just Zakirullin Files.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →