Cairn

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 .fit decoding, 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.

PlatformFileNotes
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.