Your Garmin and Strava data, together, at home.
Garmin knows how you slept. Strava knows what you rode. Neither brings the two together, because they don't talk to each other. Cairn does — on your own machine, in a file that belongs to you.
The problem
You string together a heavy week. Your heart rate variability has been falling for three nights and your resting rate is creeping up: Garmin sees it. You've piled on enduro descent and a three-hour road ride: Strava sees it. But nobody brings the two together, and that is precisely where an overload shows before it costs you.
Cairn brings both sources together, understands that a ride appearing on both sides is one ride, and sets the night's recovery against the day's training.
What it does
Nightly sync
One pass each night. The raw responses from both services and your
original .fit files are kept: nothing is lost, and
anything can be recomputed later.
No more duplicates
A ride recorded on your watch lands in both Garmin and Strava. Cairn keeps one, with the sensors from the first and the gear from the second.
Recovery and load
Sleep, heart rate variability and resting rate set against the same day's rides — the comparison neither service can make.
Weekly summary
A model installed alongside the app puts your week into words, offline. It computes nothing: every figure comes from your own data, and any it invents is thrown out.
Desktop application
One window to link your accounts, run a sync and see what matters. Nothing to install alongside: put it on a USB stick and it carries its settings and its data with it.
Second-by-second analysis
Your .fit files are decoded point by point: time
actually spent in each heart rate zone, cardiac drift, a close read
of any ride.
Project status
Cairn is under construction and has no stable release yet. Here is where things stand, unembellished.
- Done Garmin and Strava sync, duplicate merging, resume after interruption
- Done
.fitdecoding, heart rate zones, TRIMP training load - Done Built-in analysis: intensity zones, volume per discipline, weekly load
- Done Chronic and acute load, comparison against your own averages, overload detection
- Done Weekly summary written by a local model, sent to Discord
- Planned Automatic warning as soon as a fatigue threshold is crossed
First launch
Nothing to prepare: the app carries its database and its model. On first launch, the Settings page picks where your data lives, creates the key that encrypts your access, prepares the database and links your accounts. Since Garmin doesn't open its API to individuals, Cairn opens a session and keeps only the token, encrypted: your password is never stored.
Everything fits in one file, cairn.db. Backing it up backs
up Cairn; copying it elsewhere moves Cairn there.
Download the app
A self-contained application: no Python, no database, no model to install alongside. You launch it, it works.
| Platform | File | Notes |
|---|---|---|
| Linux x86-64 | Cairn-x86_64.AppImage | chmod +x then run |
| Windows x86-64 | Cairn-windows-x86_64.zip | Unzip, then run Cairn.exe |
| macOS Apple Silicon | Cairn-macos-arm64.dmg | Not notarised: xattr -dr com.apple.quarantine |
| macOS Intel | Cairn-macos-x86_64.dmg | Not notarised: xattr -dr com.apple.quarantine |
Each build carries the qwen3:0.6b model, which is what
makes it around 800 MB. That is the price of a summary that runs
offline, with nothing to install and not a line of your data leaving
the machine. If you already run Ollama elsewhere, put its address in
the settings and Cairn will use it.
Every file ships with its SHA-256 checksum. Without a paid signing certificate, Windows and macOS will warn you on first launch.
On Linux and macOS, in one command:
curl -fsSL https://devfrp.github.io/Cairn/get.sh | sh
Your data stays yours
Cairn only talks to Garmin and Strava, and only to fetch what is yours. No third-party service, no telemetry, no account to create. Your data and activity files stay on your machine — and this page loads no fonts or scripts from anywhere else.