changelog: document 2026-05-19 performance improvements
This commit is contained in:
@@ -1,5 +1,55 @@
|
|||||||
# Changelog
|
# 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
|
## [0.1.0] — 2026-04-22
|
||||||
|
|
||||||
### Improvement — DEM & hysteresis algorithm refinements
|
### Improvement — DEM & hysteresis algorithm refinements
|
||||||
|
|||||||
Reference in New Issue
Block a user