<feed xmlns='http://www.w3.org/2005/Atom'>
<title>biking_home/db, 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-09-25T06:46:58Z</updated>
<entry>
<title>Chart power vs time for official climb attempts</title>
<updated>2026-09-25T06:46:58Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-25T06:46:58Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=077aa1700fbcaf3f499c2178e0e58e89ae9dcaf8'/>
<id>urn:sha1:077aa1700fbcaf3f499c2178e0e58e89ae9dcaf8</id>
<content type='text'>
Snapshot average power per attempt in a nullable average_power_w column (backfilled from stored rides), plot each powered attempt on the climb page as duration vs average watts with ride hover and click-through, and show avg power in the attempts table.
</content>
</entry>
<entry>
<title>Match official climbs against their recorded sample</title>
<updated>2026-09-24T06:37:33Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-24T06:37:33Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=90614736f2a0c556f31eca5361b3c032f5f309f6'/>
<id>urn:sha1:90614736f2a0c556f31eca5361b3c032f5f309f6</id>
<content type='text'>
An official climb matched on endpoint coordinates alone. On a loop ridden
the other way the route meets the climb's top before its bottom, so pairing
each start with the first end inside its lap window credited a 5.9 km
passage as the 850 m Chemin de la Tour Pey Blanc, and a 49 km one on
another ride.

Climbs now keep the sample of the segment they were created from: the
recorded length and elevation gain of the selected route points, captured
by the ride detail and preview handlers and stored NOT NULL. Matching takes
the whole route and drops any candidate outside ±50% of that sample on
either axis, and attempts are refreshed by upsert and prune so re-analyzing
a ride keeps the recorded-at stamp of the passages that survive.

The backfill leaves the web package: backfill.Run recomputes ride values
then official climb attempts as a single `go run . backfill` command
(climbs-backfill is gone), rideanalysis owns the attempt snapshot, and the
mountain-pass loading margin is shared. Applied to the stored rides it
stamps 78 samples, drops the four bogus attempts and leaves ride 800 with
its three Pont Rout passages.
</content>
</entry>
<entry>
<title>Persist official climb attempts with climbs pages</title>
<updated>2026-09-13T19:55:59Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-09-13T19:55:59Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=e3d0beee5be3dd2854b0f4fc10905a4fcdc08f47'/>
<id>urn:sha1:e3d0beee5be3dd2854b0f4fc10905a4fcdc08f47</id>
<content type='text'>
Record one attempt row per (ride, climb, occurrence) when a ride detail
loads, snapshotting distance, elevation gain, slope, cotacol and attempt
timestamps; a climbs-backfill CLI command seeds all existing rides.

New /climbs list page aggregates attempts (medians computed in Go, best
time as min duration) with sortable columns, and /climbs/{id} shows the
median scalar stats, a median normalized elevation profile (50 steps
over each attempt's own length), the full-precision recorded route of
the median-distance attempt on an OSM map, and every attempt with time
at second precision.
</content>
</entry>
<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 touring ride type for cyclotourisme</title>
<updated>2026-08-28T08:19:15Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-28T08:19:15Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=10806900a46b4eba197af9fc768928c57bd33982'/>
<id>urn:sha1:10806900a46b4eba197af9fc768928c57bd33982</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>Categorise OSM passes by highway and colour them on the ride detail map</title>
<updated>2026-08-27T16:05:59Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-27T16:05:59Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=558f755f5746a4ee819de87579951b7533688e5d'/>
<id>urn:sha1:558f755f5746a4ee819de87579951b7533688e5d</id>
<content type='text'>
Passes are extracted from OSM PBF nodes (mountain_pass=yes) and linked to
containing ways; highway road values map to road, track to track,
path/footway to path, plus hiking for rock/climbing. All passes are kept,
coloured distinctly (road/track/path/hiking/unknown) for road-bike validation
on ride 397. Single squashed migration adds category column, cheap to re-extract.
</content>
</entry>
<entry>
<title>Add hardcore ride categorisation with bike and ride types</title>
<updated>2026-08-23T19:35:59Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-23T19:35:59Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=08fdd6964fd9ef29356420b035e2d186546f674a'/>
<id>urn:sha1:08fdd6964fd9ef29356420b035e2d186546f674a</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Use OSM as the single source of mountain passes</title>
<updated>2026-08-21T08:30:27Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-21T08:30:27Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=44f7333d9deef81d3468e20b378c63692a9406ec'/>
<id>urn:sha1:44f7333d9deef81d3468e20b378c63692a9406ec</id>
<content type='text'>
Replace the centcols CSV download/enrichment pipeline with OSM PBF
extraction as the primary (only) source: merge osmpass into mountain_pass,
drop the centcols table and model fields, filter to named passes with
elevation, and remove the centcols CLI flags.
</content>
</entry>
<entry>
<title>feat(ride): persist canonical moving time, preserve Strava reference</title>
<updated>2026-08-21T04:56:12Z</updated>
<author>
<name>Martin Kagamino Lehoux</name>
<email>martin@lehoux.net</email>
</author>
<published>2026-08-21T04:56:12Z</published>
<link rel='alternate' type='text/html' href='https://git.kagamino.dev/biking_home/commit/?id=9da52d7355f5a77f0adc9a658619b3bfef03ba3c'/>
<id>urn:sha1:9da52d7355f5a77f0adc9a658619b3bfef03ba3c</id>
<content type='text'>
</content>
</entry>
</feed>
