Surface Segments, Admin Tools, and a Leaner Import Story
This week was about polish and sustainability. We shipped a new surface-type visualization, tightened up the activity detail UI, and experimented with bulk import before deciding to keep OpenRoutes focused on single-activity uploads.
Road Surface Visualization
Activities now show a surface bar under the elevation chart. It pulls surface tags from OpenStreetMap, groups them into human-friendly categories, and syncs hover state between the map, chart, and surface bar.
To keep the app fast and reliable, surface data is now computed offline and cached. There’s a new status field on activities so the UI can gracefully show “pending” or “unavailable” without blocking page loads.
Admin + Quality-of-Life Updates
- Admin dashboard for quick health checks and moderation.
- User display names with tighter username validation.
- FIT parsing fixes to improve elevation/device metadata.
- Query and map tuning to reduce N+1s and make trail lines clearer.
- Test suite upgrades and migration tracking to keep releases safer.
Bulk Import Experiment (Rolled Back)
We built a bulk import flow with a Strava guide, zip upload preview, and a Huey-based worker for background processing. It worked, but it added more operational weight than we want right now.
That entire flow has been removed to keep OpenRoutes lean. The project stays focused on a clean, fast single-upload workflow.
Under the Hood
- Shared Overpass helper + config settings for consistent API calls.
- Activity detail scripts now initialize through a single controller instead of global polling.
- Surface labels are escaped before rendering to keep UI output safe.