<feed xmlns='http://www.w3.org/2005/Atom'>
<title>biking_home/web/sync.go, branch main</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>https://git.kagamino.dev/biking_home/atom?h=main</id>
<link rel='self' href='https://git.kagamino.dev/biking_home/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/'/>
<updated>2026-08-28T20:38:57Z</updated>
<entry>
<title>Rename rides.type to external_sport_type, infer bike type from Strava sport type and display categories in UI</title>
<updated>2026-08-28T20:38:57Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-28T20:38:57Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=827b55f610119d553b965ceb4d3631f0481bbb3b'/>
<id>urn:sha1:827b55f610119d553b965ceb4d3631f0481bbb3b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add dual GPX/FIT exporter and backfill for rides</title>
<updated>2026-08-27T17:03:34Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-27T17:03:34Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=d7b93325d4f70eeab369fa8a3c4cce9f0c4e0081'/>
<id>urn:sha1:d7b93325d4f70eeab369fa8a3c4cce9f0c4e0081</id>
<content type='text'>
Phase 1 writes both .gpx and .fit on Strava import, adds fit_path
column, renames storage.gpx_dir to storage.rides_dir, and backfills
missing FIT files from existing GPX without breaking CLI progress.
FIT files are gitignored.
</content>
</entry>
<entry>
<title>Resync Strava title from list payload via Save</title>
<updated>2026-08-27T11:37:26Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-27T11:37:26Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=abbbf17bcfe6dfa663b7019c4892db09e27b3808'/>
<id>urn:sha1:abbbf17bcfe6dfa663b7019c4892db09e27b3808</id>
<content type='text'>
Context / Problem: Strava titles can be corrected after import. The sync path only handled new rides; existing rides were marked skipped without checking the cheap list metadata, so corrections like ride #789 stayed stale.

What: In syncRides reuse the existing Save write path for rare title resyncs (pay GPX parse cost) when existing.Name != list.Name; track progress.Updated and surface it in SSE/TS UI; add tests for resync without stream fetch. Remove the now-obsolete TODO.

QA: go test/ vet, tsc, biome/stylelint pass.
</content>
</entry>
<entry>
<title>Apply go fix modernizations and refresh TODO list</title>
<updated>2026-08-23T11:13:30Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-23T11:13:30Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=1125e0b7086dd2b71e0558aaf641c23dea02f200'/>
<id>urn:sha1:1125e0b7086dd2b71e0558aaf641c23dea02f200</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Handle Strava rate limiting with abort, retry time and daily usage display</title>
<updated>2026-08-23T09:44:41Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-23T09:44:41Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=d0875a51b2f07766b339b34a580d4e6e9fab348d'/>
<id>urn:sha1:d0875a51b2f07766b339b34a580d4e6e9fab348d</id>
<content type='text'>
Strava sync for 167 rides exceeds the 100/15-min read limit (2 calls per ride).
Previously a 429 was treated as a skipped ride, so every remaining ride also
failed silently. Now GetJSON returns a typed RateLimitError with RetryAfter
computed from Retry-After/Date and X-RateLimit headers (15-min window resets
at :00/:15/:30/:45, daily at midnight UTC) and tracks Read/Overall usage.
syncRides aborts on 429 with partial progress instead of skipping, and
handleSync emits an SSE error with retry time, daily usage vs limit and
structured rateLimit snapshot; progress and complete events also carry the
snapshot for the UI to display. Frontend shows Read daily/15-min usage in
progress details and on completion.
</content>
</entry>
<entry>
<title>Merge ride and rides packages into ride/store following mountain_pass structure</title>
<updated>2026-08-23T09:09:07Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-23T09:09:07Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=53615a05708ff852af42905e2b5ced66ba70c43d'/>
<id>urn:sha1:53615a05708ff852af42905e2b5ced66ba70c43d</id>
<content type='text'>
Consolidate persistence (Save, List, Backfill) into ride/store.go alongside
ride.go/climb.go/moving_time.go, rename rides.Ride to ride.StoredRide to
avoid collision with parsed ride.Ride, update all web/cli consumers and
RideView to use named Ride field, adjust templates and regenerate templ files,
and remove rides directory.
</content>
</entry>
<entry>
<title>Add global analytics page shell and split server.go by concern</title>
<updated>2026-08-21T17:02:05Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-21T17:02:05Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=1e63f5c91f0e5ff7dfc582b67d262d5939cc34bc'/>
<id>urn:sha1:1e63f5c91f0e5ff7dfc582b67d262d5939cc34bc</id>
<content type='text'>
</content>
</entry>
</feed>
