Releases: nicglazkov/commutescout
Release list
v2.26.0
v2.26.0
A thirteen-item quality pass, every change validated end to end in a real browser before shipping.
Fixed: camera popup images (a CSP allowlist gap blocked every snapshot), Cloudflare analytics in the admin portal (the env carried the beacon token instead of the RUM siteTag), dispatch-log ordering (now by CHP's own comment index, newest first), and the conditions list showing nearby-but-not-on-route events (buffer tightened 4 km to 0.35 km).
New: "Depart at" (future departures annotate each condition against its Caltrans schedule window), an "Explain the codes" translator for dispatch logs (deterministic 67-term glossary), Google Maps-style itinerary (icon column, drag to reorder, inline add stop), instant markers on pick-on-map, dynamic route-aware suggested chips, a data-source status panel on the topbar indicator backed by /api/sources, ~6x finer fire perimeters with an honest "exact shape unknown" fallback, an admin panel for Was-this-right feedback, and privacy-page updates.
v2.25.0
v2.25.0
Full-fidelity CHP capture, end to end.
- Parser: the shared dispatch timeline (comments plus unit lifecycle) and
LocationDescfromsa.xmlare now parsed and kept verbatim; they were previously dropped. - Archive: new
updatelifecycle phase and apayloadJSON column. Appear rows carry the full structured state; update rows carry only what changed (new dispatch entries, problem-type changes, fire growth, closure changes). Analytics can go as granular as the raw CHP shorthand. - Web: incident popups gain "Show dispatch log (N)", lazily fetched via
GET /api/incident/{id}from the in-process feed cache.
v2.24.1
v2.24.1
Event-archive fix: "clear" lifecycle rows now keep the kind recorded at appear time. They previously derived kind from the event id prefix (chp:/lcs:), splitting each event's lifecycle across two kind vocabularies in BigQuery, which would have double-counted in any history or trend feature. Existing rows are normalized (chp to incident, lcs to closure) alongside this release.
v2.24.0
v2.24.0
Launch-ready documentation refresh and a branded MCP endpoint.
- README rebuilt: product-first hero, hosted-vs-self-hosted comparison, "Self-hosting (advanced)" with a clear support boundary, and an honest sustainability note (MIT core; upcoming premium features on the hosted app fund the service).
- New docs:
docs/data-sources.md,docs/mcp.md,docs/architecture.md;docs/deploy.mdis now the self-hosting runbook. Added CONTRIBUTING.md, SECURITY.md, and issue templates. - The MCP server now lives at https://mcp.commutescout.com/mcp (managed certificate; the legacy run.app URL keeps working).
server.jsonpoints at the branded endpoint.
v2.23.0
v2.23.0
Admin-only Analytics view backed by Cloudflare Web Analytics (GraphQL RUM): pageviews, visitors, a daily chart, and top pages / referrers / countries. The API token stays server-side (Secret Manager); the browser only ever sees aggregated numbers.
Hardening: the admin portal moved to a secret, env-driven path (ADMIN_PATH) — /admin now 404s and no served page links to it. The real gate is unchanged: every admin request is verified server-side against ADMIN_EMAILS.
v2.22.1
v2.22.1
Follow-up to v2.22.0. That release's stale-while-revalidate covered every feed except CHP (incidents), which had its own cache and hit CHP's server on every request — so /api/stats and /api/mapdata still rode CHP's per-request latency (a live probe caught a 2.1s spike ~5 min after boot). CHP now uses the same TTL + SWR cache (60s TTL, 10-min max-serve) as the other feeds: requests serve the last parse from memory and refresh in the background. Conditional-GET / ETag / carry-forward logic unchanged. 239 tests passing.
v2.22.0
v2.22.0
Sidebar pick-on-map — the map no longer sets route points on every click. Arm a Pick on map button in the sidebar (From / To, or Add stop on map once a route exists); the next single map click sets that point and disarms. Escape cancels. Route drag-to-reshape is unchanged.
Stale-while-revalidate cache — TTLCache now serves the cached value instantly when a key's TTL lapses and refreshes it in the background, so /api/stats and /api/mapdata (and the MCP feeds) never block ~1.5–2s on an upstream refetch. Only a cold key still fetches on the request path (covered by the boot prewarm); a failed refresh keeps serving the last good value, flagged stale, until max_serve.
Verified: full suite 238 passing (incl. 2 new SWR tests), ruff clean, Playwright pick-on-map smoke 6/6.
v2.21.0 — CommuteScout
Rebrands the project to CommuteScout (commutescout.com).
- Web app, MCP server identity, alert emails, and trip share pages now read CommuteScout
- Canonical / OG / Twitter URLs point at
commutescout.com - Alert sender moved to
alerts@send.commutescout.com(Resend) - Internal identifiers unchanged: GCP project
ca-roads-mcp, Cloud Run service names, Python packages/modules, console scripts, and the pip dist name
Both Cloud Run services redeployed on this version.
v2.20.2: audit round 3
Tightened the web-push endpoint allowlist to exact push-service hosts and stopped forwarding raw exception text into the assistant's context. This release accompanies a live-verification pass confirming rate-limit spoofing is defeated, auth rejects bad tokens, database rules are deny-all, and the share pages resist injection.
v2.20.1: checker efficiency
The alert checker now reads each user's devices once per cycle instead of once per matched event, trimming database work on busy cycles. Small internal cleanups alongside.