Stryder is a modular, local-first running data management system built around Stryd and Garmin CSV exports.
It provides multiple interfaces on top of the same shared core:
- Stryder Core handles parsing, matching, normalization, and metrics.
- Stryder TUI (Textual) provides a full-screen interactive terminal interface.
- Stryder Web (Django) provides a read-only web viewer on the same database.
Stryder is designed both as a personal analytics tool and as a software architecture learning project focused on modular design and multi-interface systems.
Stryder is structured as a multi-layer application:
- Shared business logic used by all interfaces
- CSV parsing and normalization
- Timezone-aware Garmin β Stryd matching (Β±60s tolerance)
- Canonical metrics and summaries
- SQLite database schema
- Interactive terminal-based UI built with Textual
- Async import workflow with live progress
- Integrated find-unparsed review flow
- DataTable-based run navigation with pagination
- Terminal graph visualizations (plotext)
- Non-blocking background workers
- Local web viewer running on Django
- Single run detailed reports with interactive graphs
- Custom date range reports
- User-selectable X/Y axes
- Read-only by design (no imports via web)
All interfaces operate on the same SQLite database, ensuring consistency across views.
βΆ Watch 1 minute demo: https://youtu.be/VWjr1V5QczQ
View your stored runs filtering them by custom dates or keywords.
Visualize your training load with selectable axes.
- Timezone-aware Stryd β Garmin matching (Β±60s tolerance)
- Canonical metrics system (distance_km, avg_power, etc.)
- Normalized workout naming
- Local SQLite storage
- Full-screen interactive terminal interface
- Background worker-based imports
- Integrated unmatched-run review workflow
- Paginated run views
- Terminal graph visualizations
- Single run detailed reports
- Custom date range analysis
- Interactive X/Y axis selection
- Clean page-based layout
Before using Stryder, make sure you have:
Detailed per-run CSV files exported from Stryd PowerCenter or the mobile app.
Each file contains second-by-second metrics (pace, power, cadence, etc.).
Export them in bulk and place them in a folder.
Example filenames:
5059274362093568.csv
5073428460371968.csv
A single CSV file containing summary data for your Garmin runs.
To download:
- Visit https://connect.garmin.com/
- Go to Activities
- Export all (or running-only) activities as
.csv
Example filename:
activities.csv
For quick testing, the repository includes example files:
- assets/stryd/ β Sample Stryd per-run CSV files
- assets/garmin/ β Matching Garmin activities CSV
You can use these to test the full import and reporting pipeline without exporting your own data.
Simply point Stryder to these paths during import.
pip install -r requirements.txt
python -m stryder_tui
The TUI allows you to:
- Import Stryd and Garmin CSV files
- Review unmatched runs
- View reports and summaries
- Navigate runs interactively
python manage.py runserver
The web interface:
- Reads from the same SQLite database
- Provides interactive visual reports
- Does not import or modify data
A legacy menu-based CLI is still included in the repository but is not the recommended interface in v1.8.
Stryder is currently TUI-first.
The CLI will be redesigned as a true command-driven interface in a future major release.
- Python 3.11
- SQLite
- Pandas
- Textual
- Plotext
- Django
- HTML / CSS (Django templates)
- Matplotlib (server-side rendering)
All interfaces share the same database and core logic.
- CLI import & summaries
- Canonical metrics refactor
- Web viewer (Django)
- Textual TUI interface
- Redesign CLI as command-driven interface (v2.0)
- Advanced run comparisons
- Segment-based analysis
- Export filtered data to CSV
- Support FIT / TCX / GPX parsing
Giorgos Chrysopoulos
Junior Python Developer & Hobbyist Runner
π LinkedIn: https://www.linkedin.com/in/giorgos-chrisopoulos-277989374/
π‘ Want to contribute? Open an issue or fork the repo!
MIT License β see the LICENSE file.


