Two wins that directly shrink /map and /weather latency under interactive use: **Debounce the moveend → repaint path (150ms).** Leaflet fires `moveend` once per pan but 5–10× per second during a wheel-zoom. Previously each one ran a full `scores_at` (or `weather_grid_at`) read + a ~20–100KB websocket push. Now they coalesce into a single trailing-edge flush via `schedule_bounds_update` (and the /weather twin `schedule_weather_flush`) — the same pattern we already use for forecast preload. 150ms is short enough that the user doesn't perceive the pause; >90% of the burst disappears. **Parallelize point_forecast across 4 tasks.** The sparkline that pops up on point click was reading up to 18 `.prop` files sequentially off NFS. Each read is cheap (pread one byte at row*cols+col) but RTT-dominated. `Task.async_stream` with max_concurrency=4, ordered=true brings 18-file wall time from ~50ms down to ~15ms on NFS without changing the public API. No test changes: existing map_bounds test only asserts the bounds assign lands, which the debounced path still does synchronously. |
||
|---|---|---|
| .. | ||
| components | ||
| controllers | ||
| live | ||
| plugs | ||
| endpoint.ex | ||
| gettext.ex | ||
| live_table_footer.ex | ||
| live_table_resource.ex | ||
| metrics_plug.ex | ||
| router.ex | ||
| skew_t.ex | ||
| telemetry.ex | ||
| user_auth.ex | ||