From 418e3a13e8abac82c9d425fbb427b0cf99fcbea3 Mon Sep 17 00:00:00 2001 From: Davide Scaini Date: Tue, 19 May 2026 20:19:11 +0200 Subject: [PATCH] changelog: document 2026-05-19 performance improvements --- CHANGELOG.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e2b646..907f982 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,55 @@ # Changelog +## [unreleased] — 2026-05-19 + +### Performance — activity detail page + +Four targeted fixes that together eliminate the blank loading screen and +reduce timeseries payload size for the dominant use case. + +**sessionStorage summary passthrough** (`ActivityFeed.svelte`, +`ActivityDetailLoader.svelte`): when the user clicks an activity from the +feed, the summary object is written to sessionStorage before navigation and +read back synchronously at module init on the detail page — before the first +render. The "Loading activity…" screen and the two sequential index-fetch +round trips are eliminated entirely for this path. Direct URLs and bookmarks +fall through to the existing slow path unchanged. + +**Spatial 10 m downsampling** (`bincio/extract/timeseries.py`): timeseries +are now downsampled to one sample per 10 m of distance traveled (GPS +haversine primary, speed × Δt fallback) instead of one per second. Indoor +activities with neither GPS nor speed data are left at 1 s resolution. +Running activities see ~67 % fewer points; long cycling rides ~30 %. A +`bincio render --downsample-timeseries` migration flag retroactively +downsamples all existing stored files without re-extracting from FIT/GPX. + +**nginx timeseries caching** (`deploy/vps/nginx-activity.conf`): a regex +location block before the generic `/data/` handler serves `*.timeseries.json` +with `Cache-Control: public, max-age=3600, stale-while-revalidate=3600`. +Previously every page view triggered a conditional GET even when nothing had +changed. + +**asyncio.to_thread for segment_efforts** (`bincio/serve/routers/activities.py`): +the synchronous file scan in `GET /api/activities/{id}/segment_efforts` is +now dispatched via `asyncio.to_thread` so it runs in a thread pool instead of +blocking the event loop during concurrent fetches. + +### Performance — static asset caching + +**Immutable JS/CSS caching** (`deploy/vps/nginx-activity.conf`): Astro +content-hashes all `/_astro/*.js` and `/_astro/*.css` filenames at build time. +A new nginx location block serves them with `max-age=31536000, immutable` so +browsers never revalidate until the hash changes. HTML pages get an explicit +`no-cache, must-revalidate` header so the latest asset URLs are always fetched +after a deploy. + +### Tooling + +**VPS backup script** (`deploy/vps/backup-vps.sh`): extended to pull +`nginx-wiki.conf` and `nginx-planner.conf` in addition to the existing files. + +--- + ## [0.1.0] — 2026-04-22 ### Improvement — DEM & hysteresis algorithm refinements