Tap to Play!

Back

Ü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:

Screenshot 2026-03-10 at 02.42.09

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:

Screenshot 2026-03-10 at 02.43.34

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):

    GeschwindigkeitFarbe
    < 10 km/hHellblau
    10–15 km/hBlau
    15–20 km/hGrün
    20–25 km/hDunkelgrün
    25–30 km/hGelb
    30–35 km/hDunkles Gelb
    35–40 km/hOrange
    40–50 km/hDunkles Orange
    ≥ 50 km/hRot
  • 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:

FeldBeschreibung
position_lat, position_longGPS-Koordinaten
altitudeHöhe über dem Meeresspiegel
speedGeschwindigkeit
distanceKumulative Distanz
heart_rateHerzfrequenz
cadenceTrittfrequenz
powerLeistung in Watt
temperatureTemperatur
timestampZeitstempel

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.

FeldBeschreibung
lat, lonGPS-Koordinaten
eleHöhe über dem Meeresspiegel
timeZeitstempel

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.html
plaintext

Nach 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 8899
bash

Dann im Browser öffnen:

http://localhost:8899/index.html?file=example.fit
http://localhost:8899/index.html?file=example.gpx
plaintext

Alternativ: Datei per Drag & Drop oder über den Datei-Dialog laden.

URL-Parameter#

ParameterBeschreibung
filePfad zur FIT- oder GPX-Datei
themedark oder light
apikeyThunderforest-API-Key für OpenCycleMap
localeSpracheinstellung (z.B. de, en)
eventIDTagSpaces 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_KEY
plaintext

Technische 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.fitride[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 Pillow
bash

Nutzung#

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 schreiben
bash

Thumbnail-Layout#

  • Oben: Datum und Distanz (zentriert, fette Schrift)
  • Darunter: Liniengrafik der GPS-Route mit schwarzer Umrandung

Distanzabhängige Linienfarbe#

DistanzFarbe
< 10 kmGrau
< 25 kmHellblau
< 50 kmHelles Lila
< 75 kmHelles Grün
< 100 kmOrange
≥ 100 kmRot

Plattform-Unterstützung#

Das Skript läuft unter macOS und Ubuntu. Als Schriftart wird Arial (macOS) bzw. DejaVu Sans / Liberation Sans (Ubuntu) verwendet.