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

Latest articles

Know what dmesg and journalctl can tell you after a reboot, how to find previous-boot logs, and how to check that retention covers your investigation window.

Check how your chatbot identifies itself as AI, where requests for human help actually go, and what customers encounter when support is unavailable.

Start with one website change on board.nowa.dk. Write a clear task, answer questions as they arise and review the result before giving an AI agent more work.

Keep AI search visibility, training preferences and assistant access separate. Use a practical policy matrix to check Cloudflare settings and test key public pages.

Let AI draft Black Friday campaigns using approved product data. Check prices and recipients, and secure approval before sending the campaign from Mailchimp.

Make AI meeting notes useful after the call: confirm decisions, agree owners and deadlines, check existing tasks, and verify that work reaches the right tracker.

Before tuning your AI chatbot, check whether your PDFs supply readable text, reliable reading order, usable tables, and passages you can trace to the page.

Bring quote request emails from Outlook into your CRM with AI. Define fields, duplicate checks and sales ownership, then use a pilot to measure whether the solution saves time and helps more enquiries get followed up.

Plan your PHP upgrade around checkout, enquiries and daily operations, with practical checks for compatibility, staging, deployment and rollback before support ends.

Claude Sonnet 4.5 has a tentative November 30 retirement date. Find affected workflows, check compatibility and test a supported replacement before switching.