
TagSpaces-Erweiterung für Garmin FIT und GPX
TagSpaces-Erweiterung für Garmin FIT und GPX
Überblick#
Die erste diesjährige Testfahrt auf dem Rad ist vollbracht, da fällt schmerzhaft auf, dass rubiTrack, mein Analyse-Programm für gefahrene Strecken, unter Linux natürlich nicht mehr vorhanden sein wird. Als Mindestanforderung soll aber zumindest eine Ansicht der gefahrenen Strecken möglich sein. Ich habe Claude auf eine Beispiel-FIT-Datei angesetzt und 75 Minuten später war eine TagSpaces-Extension fertig, die die gefahrene Route samt Richtungspfeilen, farblicher Geschwindigkeitskodierung und Tooltips auf der Karte und den Charts darstellen kann:

Damit bin ich für’s Erste zufrieden, aber es weckt natürlich die Lust, Claude eine Gnome-Applikation schreiben zu lassen, die ein paar Übersichten über Monate und Jahre erzeugt 😃.
Zusätzlich lasse ich Thumbnail-Dateien generieren, die TagSpaces einliest:

FIT/GPX Viewer — TagSpaces Extension#
Eine Viewer-Extension für TagSpaces ↗, die Garmin FIT-Dateien (.fit) und GPX-Dateien (.gpx) als interaktive Kartenansicht mit Geschwindigkeits-, Höhen- und Temperaturdaten darstellt. Die Extension funktioniert auch standalone im Browser ohne TagSpaces.
Das visuelle Design orientiert sich an den GNOME Human Interface Guidelines ↗ (libadwaita) und unterstützt Light Mode und Dark Mode.
Funktionen#
Kartenansicht#
-
Geschwindigkeitsabhängige Routenfarbe: Die Route wird farblich nach Geschwindigkeit dargestellt (auf Karte und in Diagrammen):
Geschwindigkeit Farbe < 10 km/h Hellblau 10–15 km/h Blau 15–20 km/h Grün 20–25 km/h Dunkelgrün 25–30 km/h Gelb 30–35 km/h Dunkles Gelb 35–40 km/h Orange 40–50 km/h Dunkles Orange ≥ 50 km/h Rot -
Vollbild-Start: Die Karte startet im Vollbildmodus. Über den Diagramm-Button (unterhalb der Zoom-Buttons) können die Charts ein-/ausgeblendet werden.
-
Richtungspfeile: Weiße Kreise mit schwarzem Pfeil zeigen die Fahrtrichtung an. Die Anzahl der Pfeile passt sich automatisch an den Zoom-Level an.
-
Start/End-Marker: Grüner Punkt am Start, roter Punkt am Ziel.
-
Karten-Tooltip: Beim Hovern über die Route werden Distanz, Geschwindigkeit, Höhe, Temperatur und weitere verfügbare Werte angezeigt.
-
Karten-Layer: OpenStreetMap und OpenTopoMap als Standard. Mit Thunderforest-API-Key zusätzlich OpenCycleMap und Outdoors.
-
GPS-Korrektur: Unrealistische Geschwindigkeitsspitzen (> 130 km/h) aus GPS-Fehlern werden automatisch bereinigt.
Diagramme#
Unterhalb der Karte werden Liniendiagramme mit den verfügbaren Messdaten angezeigt. Die X-Achse zeigt die Distanz in Kilometern.
- Speed + Temperature: Kombiniertes Diagramm. Geschwindigkeit (links) mit farbiger Flächenfüllung in den Geschwindigkeitsfarben. Temperatur als breite, halbtransparente Linie im Hintergrund.
- Altitude + Heart Rate: Kombiniertes Diagramm mit zwei Y-Achsen. Höhenprofil (links) mit Flächenfüllung unter der Kurve. Herzfrequenz (rechts) als separate Linie.
- Power, Cadence: Weitere Diagramme werden automatisch angezeigt, wenn die entsprechenden Daten in der FIT/GPX-Datei vorhanden sind.
Alle Diagramme:
- Passen ihre Breite automatisch an die Fensterbreite an.
- Zeigen beim Hovern einen Tooltip mit den aktuellen Werten.
- Bewegen synchron einen orangefarbenen Positionsmarker auf der Karte (distanzbasiert).
- Klick auf ein Diagramm zentriert die Karte auf den entsprechenden GPS-Punkt.
Statistik-Panel#
Ein Panel oben rechts auf der Karte zeigt zusammenfassende Werte:
- Distanz, Dauer, Durchschnittsgeschwindigkeit
- Aufstieg, Abstieg
- Durchschnittliche Herzfrequenz, Leistung, Kalorien (falls vorhanden)
Theming#
Unterstützt Light Mode und Dark Mode mit der Adwaita-Farbpalette. Der Modus wird von TagSpaces über den theme-Parameter gesetzt oder kann per URL-Parameter ?theme=dark gewählt werden.
Unterstützte Dateiformate#
FIT (Garmin)#
Die Extension liest folgende FIT-Record-Felder:
| Feld | Beschreibung |
|---|---|
position_lat, position_long | GPS-Koordinaten |
altitude | Höhe über dem Meeresspiegel |
speed | Geschwindigkeit |
distance | Kumulative Distanz |
heart_rate | Herzfrequenz |
cadence | Trittfrequenz |
power | Leistung in Watt |
temperature | Temperatur |
timestamp | Zeitstempel |
Session-Daten (Gesamtstatistiken) werden ebenfalls ausgelesen, falls vorhanden. Andernfalls werden die Werte aus den Track-Punkten berechnet.
GPX#
Die Extension unterstützt GPX-Dateien (GPS Exchange Format), wie sie z.B. von Komoot, Strava oder anderen Plattformen exportiert werden.
| Feld | Beschreibung |
|---|---|
lat, lon | GPS-Koordinaten |
ele | Höhe über dem Meeresspiegel |
time | Zeitstempel |
Die Geschwindigkeit wird automatisch aus Position und Zeitstempel berechnet. Garmin-GPX-Extensions (Herzfrequenz, Trittfrequenz, Leistung, Temperatur) werden ebenfalls unterstützt, falls vorhanden.
Installation#
In TagSpaces (macOS)#
Die Extension in den Plugin-Ordner kopieren:
~/Library/Application Support/TagSpaces/tsplugins/@tagspaces/extensions/fit-viewer/
├── package.json
└── index.htmlplaintextNach einem Neustart von TagSpaces werden .fit- und .gpx-Dateien automatisch mit dem FIT/GPX Viewer geöffnet.
Standalone#
cd tagspaces-fit
python3 -m http.server 8899bashDann im Browser öffnen:
http://localhost:8899/index.html?file=example.fit
http://localhost:8899/index.html?file=example.gpxplaintextAlternativ: Datei per Drag & Drop oder über den Datei-Dialog laden.
URL-Parameter#
| Parameter | Beschreibung |
|---|---|
file | Pfad zur FIT- oder GPX-Datei |
theme | dark oder light |
apikey | Thunderforest-API-Key für OpenCycleMap |
locale | Spracheinstellung (z.B. de, en) |
eventID | TagSpaces Event-ID (intern) |
OpenCycleMap#
OpenCycleMap (Thunderforest) benötigt einen kostenlosen API-Key von thunderforest.com ↗ (Hobby-Plan: 150.000 Tiles/Monat). Übergabe per URL-Parameter:
index.html?file=route.fit&apikey=DEIN_KEYplaintextTechnische Details#
- Keine Build-Tools: Einzelne HTML-Datei mit inline CSS und JavaScript.
- Keine Abhängigkeiten: Nur Leaflet ↗ (via CDN) für die Karte.
- Eigener FIT-Parser: Inline-Implementierung, die das Garmin FIT-Binärformat direkt parst. Unterstützt Normal- und Compressed-Timestamp-Header, Developer Fields und alle gängigen FIT-Datentypen.
- GPX-Parser: Parst GPX-XML mit
DOMParser. Berechnet Geschwindigkeit und Distanz automatisch aus GPS-Koordinaten und Zeitstempeln (Haversine-Formel). - Koordinaten-Konvertierung: FIT-Semicircles werden automatisch in Grad umgerechnet (
value × 180 / 2³¹).
Thumbnail-Generierung#
Ein Python-Skript erzeugt quadratische JPG-Thumbnails für alle FIT/GPX-Dateien im aktuellen Verzeichnis. Die Thumbnails werden im .ts/-Verzeichnis abgelegt (TagSpaces-Konvention) und zeigen Datum, Distanz sowie eine Liniengrafik der Route.
Vor der Thumbnail-Erzeugung werden fehlende Tags automatisch in den Dateinamen eingefügt (TagSpaces-Konvention [tag1 tag2]):
- Timestamp-Tag: Start-Zeitpunkt der Route im Format
YYYYMMDDTHHmmSS - Plus Code: Open Location Code ↗ der Start-Koordinate
Beispiel: ride.fit → ride[20240315T143022 9F4MCFV5+53].fit
Sidecar-Dateien im .ts/-Verzeichnis (.jpg, .json) werden beim Umbenennen automatisch mitgenommen.
Einrichtung#
python3 -m venv .venv
source .venv/bin/activate
pip install fitparse gpxpy matplotlib PillowbashNutzung#
source .venv/bin/activate
python3 generate_thumbnails.py # nur fehlende Thumbnails erzeugen
python3 generate_thumbnails.py --force # alle Thumbnails neu generieren
python3 generate_thumbnails.py --retag-date # Timestamp-Tag aus Datei neu schreibenbashThumbnail-Layout#
- Oben: Datum und Distanz (zentriert, fette Schrift)
- Darunter: Liniengrafik der GPS-Route mit schwarzer Umrandung
Distanzabhängige Linienfarbe#
| Distanz | Farbe |
|---|---|
| < 10 km | Grau |
| < 25 km | Hellblau |
| < 50 km | Helles Lila |
| < 75 km | Helles Grün |
| < 100 km | Orange |
| ≥ 100 km | Rot |
Plattform-Unterstützung#
Das Skript läuft unter macOS und Ubuntu. Als Schriftart wird Arial (macOS) bzw. DejaVu Sans / Liberation Sans (Ubuntu) verwendet.