Releases: dsubtle1/row-tracker
Releases · dsubtle1/row-tracker
Release list
v0.13.0
Added
- Two more Insights Milestones: total strokes taken and peak heart rate. New
stroke_count
andheart_rate_maxcolumns, captured on every sync going forward. Neither has a work/rest
split to worry about — C2 doesn't report rest-period strokes or a separate rest heart rate, so
both are plain per-session values (total strokes is a whole-session sum; peak HR is the highest
single reading across history, with the date it happened). backfill_strokes_hr.py— same live-API backfill pattern asbackfill_rest_meters.py, for the
same reason (most historical workouts here were CSV-imported, no local raw_json to read this
from). Unlike badges/journeys, Insights milestones are computed fresh on every page load rather
than earned-once-and-locked, so there's nothing to retroactively correct here.
v0.12.0
Added
- Two new Insights Milestones: total workouts logged and total calories burned. Lifetime
counterparts to the existing "years rowing" and "hours on the erg" cards, same "always-true
fun fact" treatment (gated only on having enough history, no significance test). Concept2 has
no rest-period calorie figure anywhere in its API, so total calories is a plain sum — no
work/rest split to worry about there, unlike distance and time. - New
rest_time_secondscolumn, mirroringrest_distance_meters(0.11.0). Concept2 tracks
rest-interval time separately from work-interval time the same way it does distance —
Workout.total_time_seconds(work + rest) now feeds the "hours on the erg" milestone, so a
session with light rowing between intervals counts all of it as real time spent rowing. Pace
and PBs stay on work-onlytime_seconds, untouched, same reasoning as the meters fix. backfill_rest_meters.pynow backfills bothrest_distance_metersandrest_time_secondsin
the same live-API pass.
v0.11.2
Added
- GitHub Releases are now created automatically on every version tag push
(.github/workflows/publish-image.yml), with notes pulled straight from that version's
CHANGELOG.md section. Previously a tag push only built the GHCR image — the Release itself was
always a manual step, and it quietly stopped happening after v0.10.4 (v0.10.5 through v0.11.1
shipped with tags but no Releases until this was noticed and backfilled).
Fixed
- CHANGELOG.md was missing the
## [0.10.4]header — the Dependabot entry had been folded
invisibly into[0.10.5]'s section since it shipped.
v0.11.1
Fixed
C2ApiClient.get_results()was reading the wrong pagination key (meta.last_pageinstead
of the realmeta.pagination.total_pages), so it silently stopped after the first 100 results
on every sync. Nightly incremental syncs rarely hit that ceiling so it went unnoticed, but a
historical backfill or a sync recovering from a long outage would have quietly dropped
everything past page 1. Fixed, and now covered by a regression test.- Added retries (3 attempts, short backoff) for transient C2 API failures — its results endpoint
returns occasional bare 500s in normal operation, seen firsthand in production, and one of
those was tripping the nightly sync's failure alert for no real reason. backfill_rest_meters.py(see 0.11.0) now sources rest-distance values from a live re-fetch of
the full C2 history (matched by workout ID) instead of localraw_json— most historical
workouts here were CSV-imported and never hadraw_jsonlocally, so the previous approach only
recovered data for ~150 of 2559 workouts. Re-running it against the live API on top of this
release backfilled the rest correctly.
v0.11.0
Fixed
- Interval workout "rest" meters (light rowing between intervals) were silently dropped from
every lifetime/volume total. Concept2 tracks rest-interval distance as a separate
rest_distancefield, apart from each interval's owndistance— the C2 sync only ever read
distance, so none of it ever made it into Row Tracker. Discovered by comparing against the
Concept2 website's "Lifetime Meters" figure, which includes it. Newrest_distance_meters
column (models.py) captured on every sync going forward;backfill_rest_meters.pybackfills
it fromraw_jsonfor existing workouts and retroactively corrects the earned dates of the
five volume badges and one virtual journey that had already crossed their thresholds under the
old, undercounted totals. - Pace, personal bests, single-piece test results, and CAWR/training-load are unaffected — they
were already, and remain, based on work-interval distance/time only, so a slower recovery split
can never inflate a time or a PB.
Added
- Workout detail page now shows rest-interval meters alongside the main distance stat when a
session had any.
v0.10.5
Added
- Pre-built multi-arch Docker images, published to GHCR on every version tag
(.github/workflows/publish-image.yml) —linux/amd64andlinux/arm64(Raspberry Pi and
other ARM boards), tagged with the version,major.minor, andlatest. This is an
additional way to run Row Tracker, not a replacement —docker-compose.ymlstill defaults
tobuild: .so the homelab deploy flow (deploy.sh) is unaffected. Self-hosters who'd rather
docker compose pullthan build locally can swap inimage: ghcr.io/dsubtle1/row-tracker:latest
— documented in the README under "Using the pre-built image instead of building locally."
v0.10.4
Added
- Dependabot (
.github/dependabot.yml) — weekly automated PRs for outdated pip dependencies
(requirements.txt/requirements-dev.txt), the Docker base image, and the GitHub Actions added
in 0.10.2. Every Dependabot PR gets checked by the same CI workflow as any other PR, so a bump
that breaks something fails the check instead of merging silently.
v0.10.3
v0.10.2
Added
- CI: GitHub Actions now runs the full test suite on every push to
mainand every PR
(.github/workflows/tests.yml) — 228 tests, Python 3.11 to match the Docker base image, pip
dependency caching. The test suite has existed for a while but nothing ran it automatically;
now a red check on a PR means something needs a look before merge. Status badge added to the
top of the README, alongside the license badge. CONTRIBUTING.mdupdated to mention the automated check.
v0.10.1
Fixed
- "Insights" was missing from the mobile nav drawer — it was added to the desktop nav when
the Insights page shipped (0.9.5) but never added to the hamburger menu, so it was invisible on
phones/tablets ever since. Added, and covered by a new regression test that diffs the desktop
and mobile nav link sets so a future addition can't silently repeat this.