Changelog
All notable changes to this project are documented here. Format loosely
follows Keep a Changelog. New entries are
appended automatically to [Unreleased] by a commit hook (see
README.md); versions are cut and tagged on main by hand.
[Unreleased]
- chore: cut v0.6.0, backfill v0.3.1-v0.5.0 changelog sections
[0.6.0] - 2026-10-28
- Feature: installable PWA for mobile home screens
- feat: add a release-and-delete admin action for activities, to avoid dangling ownership
- feat: add a recapture-all admin action, for use after importing new POIs
- feat: give summits a distinct map icon from mountain passes
- chore: ignore the app's log directory
- feat: show scan progress during OSM POI extraction
- feat: add an offline Geofabrik-extract pipeline for POIs, as an alternative to live Overpass queries
- fix: don't blindly query regions anymore, keep track
[0.5.0] - 2026-10-14
- feat: stream summit import as each region fetches, so stopping early loses nothing
- fix: raise the request budget and shuffle region order to stop systematic undercounting
- fix: back off adaptively (doubling to 60s cap) instead of a flat request pace
- fix: pace Overpass requests to stop self-inflicted cascading timeouts
[0.4.2] - 2026-10-14
- fix: summit import no longer crashes on persistent 5xx/429 from Overpass
[0.4.1] - 2026-10-14
- fix: summit import now splits regions that time out instead of silently returning nothing
[0.4.0] - 2026-10-13
- feat: import summits from OpenStreetMap, filtered by elevation/wikipedia/prominence
- feat: support multiple POI types (mountain passes, summits) with per-type map filters
- chore: remove the grid overlay, it was slow and added no visual value
- fix: captured tiles no longer fade to near-invisible near expiry
[0.3.1] - 2026-10-12
- fix: stop applying sport multiplier to mountain pass points
- chore: cut v0.3.0, backfill missed v0.2.1/v0.2.2 changelog sections
[0.3.0] - 2026-09-21
- feat: move sync/import into the profile dropdown, keep rules/leaderboard visible
- feat: show capture breakdown on profile page
- fix: swim points don't depend on holding the tile
- fix: player colors are assigned by join order, can't collide
- fix: territory/POI capture respects recording time, not import order
- style: trim docstrings and comments to one-liners across game and accounts
[0.2.2] - 2026-09-18
- fix: pool swims have no GPS, get points without capturing tiles (track now optionnal)
[0.2.1] - 2026-09-11
- fix: capture the single tile for activities with no GPS track
- chore: make db reachable from other apps
- chore: cut v0.2.0
[0.2.0] - 2026-09-10
- feat: score tiles/passes by sport, swimming weighted by distance
- chore: revise caddy setup and reduce gunicorn worker count
- chore: don't generate changelog during rebase and cherry-pick
- feat: release tiles on activity deletion
- feat: score based on whole days + compass on map
- feat: show point calculation breakdown and per-ride detail on leaderboard
- feat: add setup.sh for one-command dev environment setup
- chore: add changelog, MIT license, and changelog commit hook
[0.1.0] - 2026-09-08
First public-ish version - a friend-group hobby game, playable end to end.
Added
- Strava-only login (OAuth popup), tokens encrypted at rest
- Territory capture: the world is a grid of small hexagonal tiles, claimed by
riding through them (or enclosing them with a closed loop)
- Mountain pass POIs, imported worldwide from OpenStreetMap, claimed by
riding within range of one
- Time-based decay: captures fade to zero value over 30 days, then release
back to unclaimed automatically
- Leaderboard and per-player profile pages with a score breakdown
- Three ways to get activities in: manual GPX upload, one-click "Sync from
Strava", and a real-time Strava webhook
- Rules page and a first-visit welcome popup explaining the game and the
Strava login's security model
- Self-service account deletion, including Strava deauthorization and
correctly handing captured territory back to whoever else rode it
- Production deployment on a Raspberry Pi: Docker Compose, Caddy for
automatic HTTPS, DuckDNS for a stable address