aboutsummaryrefslogtreecommitdiff
path: root/README.md
Commit message (Collapse)AuthorAge
* Categorise OSM passes by highway and colour them on the ride detail mapMartin Kagamino Lehoux2026-08-27
| | | | | | | | 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.
* Use subcommand args instead of flags for CLIMartin Kagamino Lehoux2026-08-27
|
* Resync Strava title from list payload via SaveMartin Kagamino Lehoux2026-08-27
| | | | | | | | 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.
* Add local Pyroscope server and Go continuous profilingMartin Kagamino Lehoux2026-08-27
| | | | | | | | | Add a docker-compose service running the Grafana Pyroscope backend on port 4040 with a persistent data volume, and instrument the Go app via github.com/grafana/pyroscope-go. The app pushes CPU, memory, and goroutine profiles every 10s when pyroscope.enabled is set in config.yaml. Config is extended with application_name and server_address (defaults to http://localhost:4040). Document usage in the README.
* clenaupMartin Kagamino Lehoux2026-08-27
|
* Extract climb detection into a dedicated climb packageMartin Kagamino Lehoux2026-08-27
| | | | | | | | | | | | | | | | | | | Move climb detection, slope, and Cotacol scoring out of ride into a new climb package that operates on a geometry-only Route (distances, elevations, coords). Ride embeds climb.Route and keeps its timing and telemetry columns. - climb.Detect returns []DetectedClimb (Climb + ride-absolute Start). - Climb owns its sliced geometry; indices are local, with Start reported at the detection boundary for absolute position. - Detected bounds use core.Interval; freeRegions claim suppression fixed. - ride no longer builds slices: ClimbFromDist/ClimbFromIndexes/climbFrom and ride.Climb/Interval/Range are removed; rideanalysis, mountain_pass MatchClimb, and web views are rewired to climb types. - New internal/routetest builds climb.Route from the ride DSL; ridetest reuses it and adds timestamps and telemetry. - Tests moved to climb (synthetic detection and difficulty) and kept in ride for GPX-example integration; ride.comparison detection coverage retained. - mountain_pass.nearestCrossing now reuses geo.Nearest.
* Lint & fixMartin Kagamino Lehoux2026-08-27
|
* analytics groupingMartin Kagamino Lehoux2026-08-25
|
* Verify downloaded France OSM PBF against geofabrik's published MD5Martin Kagamino Lehoux2026-08-24
|
* Ride type multiselect filter with a checkbox group across library and analyticsMartin Kagamino Lehoux2026-08-24
|
* Add progress bars to the long-running CLI processes (backtest, backfill, ↵Martin Kagamino Lehoux2026-08-24
| | | | extract-osm)
* readmeMartin Kagamino Lehoux2026-08-24
|
* Document ride categorisation featureMartin Kagamino Lehoux2026-08-24
|
* readmeMartin Kagamino Lehoux2026-08-24
|
* readmeMartin Kagamino Lehoux2026-08-24
|
* Add on-demand pprof profiling grouped by routeMartin Kagamino Lehoux2026-08-23
| | | | Expose pprof at /debug/pprof via -pprof flag, tag each handler with runtime/pprof route label, add handleRoute helper to avoid repeating patterns, and document UI workflow in README.
* Apply go fix modernizations and refresh TODO listMartin Kagamino Lehoux2026-08-23
|
* Match official climbs once per lap on looping ridesMartin Kagamino Lehoux2026-08-23
| | | | | | | | | | | | Official climb matching now returns all non-overlapping occurrences per ride instead of only the globally nearest pair. Each lap is detected by clustering contiguous points within the endpoint radius and pairing each start cluster with the first end cluster inside its window, preserving direction. The ride analysis aggregates all matches and sorts claimed ranges before excluding them from auto-detection. Fixes the case where a looping ride only showed one instance of a saved climb while the user expected one per repetition.
* Add normalized difficulty versus moving duration to analyticsMartin Kagamino Lehoux2026-08-23
| | | | | | | Extend analytics with a second scatter plotting Cotacol per 100 km against moving hours, keep speed versus Cotacol as first chart, render both canvases from shared points, open ride detail in a new tab on dot click, and keep all website copy in English.
* Merge ride and rides packages into ride/store following mountain_pass structureMartin Kagamino Lehoux2026-08-23
| | | | | | | | 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.
* Require a 3.5% minimum slope on detected climbs, re-segmenting gentler stretchesMartin Kagamino Lehoux2026-08-21
| | | | | | | | | | | | | | A detected climb must now average at least 3.5% slope with re-segmentation: gentle drags are split into their qualifying steeper parts instead of being reported wholesale or dropped. Qualifying climbs keep their previous boundaries exactly; only regions whose classic best climb averages below the threshold get re-segmented (full-scan for the best qualifying sub-segment, found=false when none exists). QA: A/B across data/rides (362 rides) went from 137 to 133 climbs, 23 rides changed; the 7 fully-dropped rides were audited to contain zero qualifying sub-segments. Example-ride tests updated for the new behavior; the resolved "minimum slope" TODO was removed.
* Add distance filter to analytics and go fix to the check gateMartin Kagamino Lehoux2026-08-21
|
* Upgrade to Go 1.27 and apply go fix modernizationMartin Kagamino Lehoux2026-08-21
|
* docs: update TODO and ignore juggler local stateMartin Kagamino Lehoux2026-08-21
|
* Use OSM as the single source of mountain passesMartin Kagamino Lehoux2026-08-21
| | | | | | | 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.
* feat(ride): persist canonical moving time, preserve Strava referenceMartin Kagamino Lehoux2026-08-21
|
* feat(ride): compute moving time from GPX with backtestMartin Kagamino Lehoux2026-08-20
| | | | | | | | Add ride.MovingTime, a speed-threshold algorithm over track timestamps. Add a -backtest CLI command comparing computed values against Strava's reference across all stored rides, with a percentile distribution summary. Baseline: mean err 3.9%, p50 1.6, p75 4.6, p90 8.4, p95 12.1, p99 44.9.
* feat(web): add ride library filtersMartin Kagamino Lehoux2026-08-18
|
* fix: match official climbs outside detected boundsMartin Kagamino Lehoux2026-08-18
|
* improved mise configMartin Kagamino Lehoux2026-08-18
|
* update readmeMartin Kagamino Lehoux2026-08-17
|
* doc: update readmeMartin Kagamino Lehoux2026-08-17
|
* feat(web): improve ride detail climb profilesMartin Kagamino Lehoux2026-08-16
|
* docs: clarify Cotacol step sizeMartin Kagamino Lehoux2026-08-15
|
* chore: remove legacy chart renderingMartin Kagamino Lehoux2026-08-11
|
* feat: Save Strava activities without routesMartin Kagamino Lehoux2026-08-11
|
* feat: Add Strava import progressMartin Kagamino Lehoux2026-08-11
|
* feat: Add ride detail mapMartin Kagamino Lehoux2026-08-11
|
* docs: Document ride backfill workflowMartin Kagamino Lehoux2026-08-08
|
* refactor: Remove demo CLIMartin Kagamino Lehoux2026-08-05
|
* refactor: Extract CLI and chart packagesMartin Kagamino Lehoux2026-08-05
|
* refactor: Remove obsolete Strava helpers and add mise tasksMartin Kagamino Lehoux2026-08-05
|
* refactor: Replace env config with atomic YAMLMartin Kagamino Lehoux2026-08-05
|
* feat: Add web ride library with Strava syncMartin Kagamino Lehoux2026-08-05
|
* feat: Detect mountain pass crossings, name climbs after passes, render ride ↵Martin Kagamino Lehoux2026-08-03
| | | | | | | | | | charts - osmpass: extract mountain_pass=yes nodes from an OSM PBF, enrich centcols passes with OSM coordinates, resumable -fetch-osm download - mountain_pass: DetectCrossings for a ride, MatchClimb to name a climb after the pass it tops - ride: expose Points(), add Climb.Top() and Climb.Name - chart: -chart renders elevation profile with climb bands and pass markers - commands: -fetch-osm, -extract-osm, -import-cached, -enrich
* docs: Reformat README to project conventionsMartin Kagamino Lehoux2026-08-01
|
* feat: Add Cotacol difficulty score for ridesMartin Kagamino Lehoux2026-08-01
|
* feat: Download mountain passes from centcols into SQLiteMartin Kagamino Lehoux2026-08-01
|
* Update README.mdMartin Kagamino Lehoux2025-07-20
|
* Cleanup parsingMartin Kagamino Lehoux2025-04-21
|