Forerunner 910XT on Linux: Getting Activities into Garmin Connect

Forerunner 910XT Linux downloading files from device

By Greg Nowak. Last updated 2026-10-27.

Getting activities off a Garmin Forerunner 910XT on Linux takes more work than it should. The useful approach is to split the job into two stages: download the activity files from the watch, then import those files into Garmin Connect through your browser.

The original version of this article documented a working setup at the time. Its installation commands have aged. The community tool antfs-cli still lists the 910XT as supported, but its dependencies need attention on a current Linux machine. Establish that the software starts correctly before spending an afternoon changing watch settings.

Understand the transfer before installing anything

The 910XT sends its activity history through a USB ANT stick. Garmin’s owner’s manual describes this wireless transfer and recommends keeping the watch within three metres of the computer. Start with a charged watch, a saved activity, and a compatible ANT receiver.

This gives you three separate places to check when something fails:

Stage What success looks like What to investigate
Software startup The command displays its help without a traceback. Python environment and dependency compatibility.
Watch transfer Pairing completes and activity files appear locally. USB permissions, receiver access, watch settings, and range.
Garmin Connect import The selected activity appears in your account. The chosen file and any import error.

Check the Python compatibility problem first

There is a concrete mismatch in the upstream projects checked for this update. The antfs-cli source imports modules from ant.fs, while current OpenANT packaging includes the openant namespace. That makes a fresh installation vulnerable to an import failure before it reaches the watch.

I would therefore treat the following as an isolated evaluation of the upstream code. It replaces the original system-wide Python installation approach, but resolving the namespace mismatch may still require a compatible build or a reviewed code change.

With Git, Python 3, and your distribution’s virtual-environment support installed:

python3 -m venv ~/.venvs/antfs
source ~/.venvs/antfs/bin/activate
git clone https://github.com/Tigge/antfs-cli.git
cd antfs-cli
python -m pip install .
antfs-cli --help

The Python Packaging User Guide recommends virtual environments for third-party packages. This keeps the experiment separate from the Python packages managed by Linux.

If you see ModuleNotFoundError: No module named 'ant', stop at this stage. That error concerns the software dependency; pairing the watch again will not fix it. For occasional recovery, weigh the effort of maintaining this tool against using another computer with a working Garmin transfer setup.

Pair the watch and download activities

Once you have a compatible installation, plug in the ANT stick, enable pairing under MODE → Settings → System → Data Transfer, and run:

antfs-cli

Accept the pairing request on the watch and allow the download to finish. Run the transfer as your normal user so its files belong to your account.

If USB access is denied, check the receiver permissions. OpenANT documents a Linux udev rule installer; with the virtual environment above, its command is:

sudo "$HOME/.venvs/antfs/bin/python" -m openant.udev_rules

This applies to an installed OpenANT version that provides that module. Reconnect the receiver afterward. If the command starts successfully but the transfer stalls, collect diagnostic output:

antfs-cli --debug

Keep those logs private when sharing troubleshooting details until you have checked their contents.

Find the FIT files and keep a copy

The default activity location follows this pattern:

~/.config/antfs-cli/DEVICE_ID/activities/

DEVICE_ID represents your watch’s identifier. If XDG_CONFIG_HOME is set, the base directory changes accordingly. Locate the downloaded files with:

find "${XDG_CONFIG_HOME:-$HOME/.config}/antfs-cli" -type f -iname '*.fit'

Copy the activity files somewhere safe before changing the setup or deleting watch history. If older saved activities are missing, Garmin documents MODE → History → Transfer All for resending history.

Import an activity into Garmin Connect

Garmin’s manual upload instructions describe the browser import process. Its device-file retrieval steps target Windows and Mac; for this Linux workflow, use the FIT file already extracted locally.

  1. Sign in to Garmin Connect in your browser.
  2. Select the upload cloud icon, then Import Data.
  3. Browse to a downloaded activity FIT file and select Import.
  4. Check the activity’s date, duration, distance, and recorded details before importing the rest.

The --upload option in antfs-cli concerns transfers back to the device. The project separately documents Garmin Connect upload scripts, but their presence does not establish compatibility with current authentication. My recommendation is to prove manual import works before considering automation.

Make the working process easy to repeat

Once a transfer succeeds, record the Python version, package versions, receiver model, file location, and exact commands. A short handover note matters when another person has to run the process later.

That applies equally to a watch, an agency reporting script, or an awkward business integration. If your team has a recurring transfer that depends on one person remembering the steps, talk to Greg about making it reliable and easier to maintain.

Related on GrN.dk

Need help with this kind of work?

Talk to Greg about a recurring integration problem Get in touch with Greg.

Sources

Seneste artikler

Lad AI skrive kampagneudkast til Black Friday ud fra godkendte produktdata. Få styr på priser, modtagere og godkendelse, før Mailchimp-kladden bliver sendt.

Få tilbudsmails fra Outlook ind i CRM med AI. Afklar felter, dubletter og sælgeransvar, og mål i en pilot, om løsningen sparer tid og får flere forespørgsler fulgt op.

Gør månedsrapporten lettere at gentage med AI til Excel, Python og faste kontroller. Få styr på import, fejllister og afstemning, så tallene kan efterprøves.

Få godkendte timer fra Clockify med på fakturakladder i Dinero. AI skriver ydelsesbeskrivelser, mens faste regler styrer beløb, godkendelse og genkørsler.

Lad AI kundeservice hente ordrestatus fra Shopify og Shipmondo. Se, hvordan I afgrænser opgaven, kontrollerer kundens identitet og sender usikre sager videre.

Når kunden beder om indsigt, kan AI hjælpe med at samle materiale fra WordPress og Microsoft 365. Se, hvordan I holder styr på datakilder, ansvar og kontrol.

Når en ingrediens ændres, kan menukortet kræve rettelser, selv om opskriftsdatoen står stille. Sådan kan AI hjælpe med gennemgang og godkendelse i WordPress.

Når checkout fejler, skal driftspartneren have noget konkret at arbejde med. Se, hvordan AI, dmesg og journalctl kan samle sporene i en brugbar driftssag.

Brug oktober til at afprøve daglige AI-forslag til genbestilling før Black Friday. Få styr på Shopify-data, leveringstid og budget, før forslagene bliver til indkøb.

Jeg lærte serverdrift ved at ødelægge mine egne servere. Jeg søger en, der vil stå ved siden af mig, mens jeg gør det, og så gøre det selv ugen efter.