Back to Developer Logs

Build Log — March 27, 2026

Build Log — March 27, 2026

What We Shipped

Swim Pool Metrics & CPT Health Monitoring

PR #597 (991409b5, 1db052ed) wires up swim pool metrics from Garmin — lap count, pool length, SWOLF scores — into the workout detail view and training load calculations. Swimmers who sync via Garmin Connect now get granular per-lap data instead of just a duration blob.

Alongside that, a new CPT (Critical Power/Pace Threshold) health monitoring system tracks whether your threshold estimates are stale, trending, or freshly calibrated. If your last threshold test is older than six weeks, the system flags it. This is foundational for accurate training zone calculations — garbage thresholds mean garbage zones.

Nutrition Photo Chat

PR #596 (2c6ee014) merges the nutrition photo chat feature. Athletes can snap a photo of a meal and get AI-powered nutritional analysis right inside the coaching conversation. The AI identifies foods, estimates macros, and contextualizes the meal against the athlete's training load for the day. A genuinely useful feature for athletes who want nutrition guidance without the tedium of manual food logging.

Webhook Performance: Memoized User Lookups

Commit 81768853 eliminates redundant database reads in the Garmin webhook handler. When a batch of activities arrives (common after a sync), the handler was hitting the database for user lookup on every single activity — even when they all belong to the same user. A simple memoization layer now caches the lookup for the duration of the request. Fewer round-trips, faster webhook processing.

Smaller Fixes

  • Auth method in signup alerts (f7bb9c57) — New user alert emails now show whether someone signed up via Google OAuth, Apple, or email/password. Useful for understanding acquisition patterns.
  • Recap timeout bump (051c4f48) — Weekly recap generation timeout increased from 15s to 30s, and projection queries now filter by completed_at instead of status. Fixes timeouts for athletes with large training histories.
  • Import script type fix (ca75feff) — Resolved a TypeScript error in the Garmin export import script that was blocking bulk historical imports.

The Takeaway

A productive day across the stack. The swim metrics and nutrition photo features add real depth for athletes, while the webhook memoization and recap timeout fixes shore up reliability under load. Seven commits, two merged PRs, zero broken tests.