Back to Developer Logs

Build Log — March 26, 2026

Build Log — March 26, 2026

What We Shipped

Swim Workout Builder

PR #595 (ba287dea) is the headline: a full swim workout builder inside the structured workout editor. Athletes can now build swim sessions with per-step stroke type selection (freestyle, backstroke, breaststroke, butterfly, mixed, drill), equipment toggles (pull buoy, paddles, fins, kickboard, snorkel), and swim-specific distance entry in meters or yards with quick-fill buttons for common intervals — 25, 50, 100, 200, 400, 800.

Four pattern presets drop in common swim structures: ladder sets, descending sets, kick sets, and pull sets. A set preview panel renders proper swim notation (e.g. "4×100m Free Pull pull buoy"), and total yardage/meterage rolls up in the header summary. 767 lines added, 12 new tests, all 3,741 passing. This closes a real gap — swim was the last major discipline without first-class builder support.

Cross-Source HIIT Dedup

If you sync both Garmin and Strava, HIIT workouts were getting double-counted in training load calculations (6ef8bce1). The root cause: Garmin labels HIIT as "cardio" while Strava calls it "crosstrain." The dedup layer was treating them as different sports entirely. The fix normalizes crosstrain, cross_train, crossfit, and workout variants all down to "cardio" before matching, and the dedup engine now uses sport equivalence checks instead of strict string comparison. Four files touched, training load accuracy restored for multi-platform athletes.

Pull-to-Refresh Disabled on Chat Pages

Nothing kills a coaching conversation like accidentally refreshing the page mid-thought (46c41547). A new usePreventPullToRefresh hook intercepts touchmove events when the scroll container is at the top and the user pulls down, blocking the browser's native page refresh. Applied across all three chat surfaces: mobile coach tab, AIChatSheet drawer, and ChatDock panel.

The Takeaway

Three commits, but they cover breadth — a major new feature for swimmers, a data integrity fix for cross-platform athletes, and a mobile UX fix that eliminates a genuinely frustrating interaction. The swim builder in particular rounds out the structured workout editor to cover all four triathlon disciplines properly.