45°54′01″N 6°10′58″EGarmin export DuckDB
Every activity, lap and heartbeat from your Garmin export, in one .duckdb file you keep. Query it with SQL, Python, R, or hand it to your AI assistant.
Launch price€19 instead of €29, once. No account, no subscription. Payment by Stripe.
D SELECT z_sport AS sport,
count(*) AS sessions,
round(sum(z_total_distance) / 1000, 1) AS km
FROM z_fit_session_mesgs
GROUP BY ALL
ORDER BY km DESC;| sportvarchar | sessionsint64 | kmdouble |
|---|---|---|
| cycling | 238 | 9120.0 |
| running | 612 | 5841.0 |
| hiking | 31 | 418.0 |
| swimming | 97 | 212.0 |
Request an export from Garmin's data management page. Garmin emails you a download link, usually within a few hours, sometimes a few days.
Copy the address behind the download button in Garmin's email and paste it above. The link expires after a few days, so don't let it sit in your inbox.
We unzip the export, decode every FIT file and load it into a single DuckDB database. You get an email when it's ready.
A few ideas to start with. Each one is a query away, or simply a question to your AI assistant.
Draw every GPS track you've ever recorded on one map. Your favourite loops, and the valleys you've never explored.
z_fit_record_mesgsWatch your average heart rate drift down as your fitness builds, season after season.
z_fit_session_mesgsTrack your best 5 km, 10 km or half-marathon times and see exactly when you broke through.
z_fit_session_mesgsEvery workout on a calendar. Streaks, rest weeks, and that suspicious gap in November.
z_fit_session_mesgsAdd up every metre of climbing since your first watch. How many Everests is that?
z_fit_session_mesgsPlot speed against heart rate to check you go faster for the same effort than last year.
z_fit_record_mesgsTime spent in each heart-rate zone, week after week. Are your easy days really easy?
z_fit_session_mesgsYour best power over 5 seconds, 1 minute, 20 minutes… if you ride with a power meter.
z_fit_record_mesgsPace per 100 m and strokes, length after length, pool session after pool session.
z_fit_length_mesgsEarly bird or lunch-break rider? See when, and on which days, you actually train.
z_fit_session_mesgsAsk the questions no product manager at Strava or Garmin ever thought you'd ask.
One table per FIT message type, linked back to the file it came from. Every column is commented, enum values included, so your AI assistant knows what every field means without guessing.
filesone row per FIT file in your exportz_fit_session_mesgsone row per activity: sport, distance, time, HR, power…z_fit_lap_mesgsevery lap and intervalz_fit_record_mesgssecond-by-second GPS, heart rate, cadence, altitudez_fit_device_info_mesgswatches, sensors, firmware versionsz_fit_…_mesgsevery other FIT message typeDuckDB is an analytical database that runs inside whatever tool you use, with no server to install. Think SQLite, but designed to crunch numbers across millions of rows. That's what training data is.
$ duckdb db.duckdb
D DESCRIBE z_fit_lap_mesgs;import duckdb
con = duckdb.connect("db.duckdb")
con.sql("FROM z_fit_record_mesgs").df()library(duckdb)
con <- dbConnect(duckdb(), "db.duckdb")
dbGetQuery(con, "FROM z_fit_lap_mesgs")"How has my easy-run pace
changed since 2021?"Everything Garmin stores as FIT files: activities, laps, per-second records, devices and the rest. If it's in a FIT file in your export, it's in the database.
Absolutely not. You don't need to write a single line of SQL. Plug the file into an AI assistant like Claude or ChatGPT and ask your questions in plain English: "What was my longest ride last year?", "Am I running faster than in 2022?". Spreadsheet and dashboard tools can open it too. No technical skills required to dig into your own data.
It depends on how many years of training you have. You get an estimate right after paying, and an email when the file is ready.
Turning years of FIT files into a database takes real compute: downloading the export, decoding every file, building and storing the database. The payment covers that work. You pay once per export, with no account and no subscription.
Garmin's links expire after a few days. Request a new export from Garmin and paste the new link.
Your export is only used to build your database. Once you've downloaded it, everything is deleted from our servers: the Garmin export and the database itself.
No. It was made with the help of AI, sure, but everything is handcrafted and carefully reviewed.
Sure, no objection. Feel free to do it yourself and share the token cost afterward. We highly recommend saving those tokens for the analytical step instead. ;)
Your training data. Finally yours.