Generate Garmin FIT workout files from a simple DSL
Project description
pace2fit
Generate Garmin FIT workout files from a simple text description.
pace2fit generate 'warmup@6:00,3x(8min@threshold+2min@easy),cooldown@6:30' -o workout.fit
Quick start
No install needed -- run directly with uvx:
uvx --from git+https://codeberg.org/Solal/pace2fit pace2fit generate '10min@Z2'
Install
Requires Python 3.10+.
uv sync
Or install as a tool:
uv tool install .
Usage
Generate a workout
# Simple zone workout
pace2fit generate '10min@Z2'
# Structured workout with intervals
pace2fit generate 'warmup@6:00,3x(8min@threshold+2min@easy),cooldown@6:30' \
-o thursday.fit -n 'Thursday Threshold'
# Distance-based
pace2fit generate '5km@5:30-6:00' -o easy_run.fit
Options
pace2fit generate [OPTIONS] WORKOUT
Arguments:
WORKOUT Workout description string (required)
Options:
-o, --output PATH Output .fit file path (default: workout.fit)
-n, --name TEXT Workout name (default: the input string)
--unit [km|mi] Pace unit (default: km)
--help Show help and exit
Web interface
Start a local web UI for writing workouts in the browser:
pace2fit serve
pace2fit serve --port 3000
Open http://127.0.0.1:8000 in your browser. The page includes a DSL syntax cheatsheet with clickable examples. Dark mode follows your OS preference.
DSL Syntax
A workout is a comma-separated list of steps:
warmup@6:00, 10min@Z2, 3x(8min@4:30+2min@6:00), cooldown@6:30
Durations
| Syntax | Meaning |
|---|---|
10min |
10 minutes |
30sec or 30s |
30 seconds |
5km |
5 kilometres |
400m |
400 metres |
warmup |
Open duration (lap button), warmup intensity |
cooldown |
Open duration (lap button), cooldown intensity |
open |
Open duration (lap button) |
Targets
Targets are specified with @ after the duration.
Pace targets (min:sec per km):
| Syntax | Meaning |
|---|---|
@5:30 |
5:30/km (auto-creates a +/-5s range) |
@5:00-6:00 |
Pace range from 5:00 to 6:00/km |
Heart rate zones:
| Syntax | Meaning |
|---|---|
@Z1 .. @Z5 |
HR zone 1 through 5 |
Named pace zones:
| Name | Pace range |
|---|---|
easy |
6:00 - 6:30/km |
recovery |
6:30 - 7:00/km |
tempo |
5:00 - 5:15/km |
threshold |
4:30 - 4:45/km |
marathon |
5:00 - 5:20/km |
hm |
4:40 - 4:55/km |
interval |
3:45 - 4:15/km |
repetition |
3:30 - 3:45/km |
Repeats
3x8min@threshold # 3 repeats of a single step
3x(8min@5:00+2min@6:00) # 3 repeats of work + recovery
4x(1min@Z4+1min@Z2+30s@Z5) # 3 steps repeated 4 times
Full examples
# Easy 30 min run
pace2fit generate '30min@easy'
# 10k tempo
pace2fit generate 'warmup@6:00,10km@tempo,cooldown@6:30' -n '10k Tempo'
# Classic threshold session
pace2fit generate 'warmup@6:00,3x(8min@threshold+2min@easy),cooldown@6:30'
# Track intervals
pace2fit generate 'warmup@6:00,8x(400m@Z5+400m@Z1),cooldown@6:30' -n 'Track 400s'
# Pyramid
pace2fit generate 'warmup@6:00,2min@Z3,4min@Z4,6min@Z4,4min@Z4,2min@Z3,cooldown@6:30'
Output
The generated .fit file can be loaded onto Garmin devices or uploaded to Garmin Connect as a workout.
Development
# Install dependencies
uv sync
# Run tests
uv run pytest
# Run tests with verbose output
uv run pytest -v
Dependencies
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pace2fit-0.1.0.tar.gz.
File metadata
- Download URL: pace2fit-0.1.0.tar.gz
- Upload date:
- Size: 25.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0fc848323f1c525e30b9493e487da86d11af7f5b14ac488220e4fd735cd7b8c9
|
|
| MD5 |
994491af4c5b1a667a60a17346277030
|
|
| BLAKE2b-256 |
74d7c5d919fda585550f6f81baa9ce9f3c14eea983e517c1165f81560acf2023
|
File details
Details for the file pace2fit-0.1.0-py3-none-any.whl.
File metadata
- Download URL: pace2fit-0.1.0-py3-none-any.whl
- Upload date:
- Size: 29.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
252fa08cc455822346717b9ebc437e2b752a03002d0e69dbb1c4658f748aa113
|
|
| MD5 |
3e5f78404435ce21f2c06cb80a95c225
|
|
| BLAKE2b-256 |
0b24bd2a1aabbd249cbbad44bd2ccd4a1d671dc3ac4cf1fd7502479812511c6d
|