Skip to content

Releases: dsubtle1/row-tracker

v0.13.0

Choose a tag to compare

@github-actions github-actions released this 21 Aug 18:41

Added

  • Two more Insights Milestones: total strokes taken and peak heart rate. New stroke_count
    and heart_rate_max columns, 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 as backfill_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

Choose a tag to compare

@github-actions github-actions released this 21 Aug 18:07

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_seconds column, mirroring rest_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-only time_seconds, untouched, same reasoning as the meters fix.
  • backfill_rest_meters.py now backfills both rest_distance_meters and rest_time_seconds in
    the same live-API pass.

v0.11.2

Choose a tag to compare

@github-actions github-actions released this 20 Aug 12:59

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

Choose a tag to compare

@dsubtle1 dsubtle1 released this 20 Aug 12:57

Fixed

  • C2ApiClient.get_results() was reading the wrong pagination key (meta.last_page instead
    of the real meta.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 local raw_json — most historical
    workouts here were CSV-imported and never had raw_json locally, 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

Choose a tag to compare

@dsubtle1 dsubtle1 released this 20 Aug 12:57

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_distance field, apart from each interval's own distance — 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. New rest_distance_meters
    column (models.py) captured on every sync going forward; backfill_rest_meters.py backfills
    it from raw_json for 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

Choose a tag to compare

@dsubtle1 dsubtle1 released this 20 Aug 12:57

Added

  • Pre-built multi-arch Docker images, published to GHCR on every version tag
    (.github/workflows/publish-image.yml) — linux/amd64 and linux/arm64 (Raspberry Pi and
    other ARM boards), tagged with the version, major.minor, and latest. This is an
    additional way to run Row Tracker, not a replacement — docker-compose.yml still defaults
    to build: . so the homelab deploy flow (deploy.sh) is unaffected. Self-hosters who'd rather
    docker compose pull than build locally can swap in image: ghcr.io/dsubtle1/row-tracker:latest
    — documented in the README under "Using the pre-built image instead of building locally."

v0.10.4

Choose a tag to compare

@dsubtle1 dsubtle1 released this 16 Aug 11:59

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

Choose a tag to compare

@dsubtle1 dsubtle1 released this 16 Aug 11:56

Fixed

  • CI workflow pinned actions/checkout@v4 and actions/setup-python@v5 — the first run flagged
    both as being forced onto a deprecated Node.js runtime. Bumped to the current majors
    (@v7/@v7).

v0.10.2

Choose a tag to compare

@dsubtle1 dsubtle1 released this 16 Aug 11:55

Added

  • CI: GitHub Actions now runs the full test suite on every push to main and 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.md updated to mention the automated check.

v0.10.1

Choose a tag to compare

@dsubtle1 dsubtle1 released this 15 Aug 23:52

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.