Archive the monolithic route-features spec and replace with 9 focused OpenSpec changes: multi-day-routes, waypoint-notes (with POI snapping), undo-redo, local-dev-stack, route-sharing, route-discovery, activity-photos, osm-overlays, plus the existing changelog and komoot-import. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.8 KiB
2.8 KiB
Why
The Journal currently has no way to discover routes other users have published. Each user's route list is isolated -- you can only see your own routes. Once route-sharing adds public visibility, there needs to be a way to actually find those public routes. Without discovery, making a route public has no effect.
Outdoor platforms live and die by discovery. A hiker planning a trip to the Harz Mountains should be able to pan the map there and see what routes exist. This is the most natural interface for spatial data: a map.
What Changes
- Explore page: A new
/routes/explorepage in the Journal with a full-page Leaflet map. Users pan and zoom to browse public routes in any area. - Bounding box API: A server endpoint that takes the current map viewport
bounds and returns public routes whose geometry intersects the bounding box,
using PostGIS
ST_Intersects. Results are limited to 50 and geometries are simplified for transfer performance. - Route polylines: Public routes rendered as clickable polylines on the explore map. Clicking a route shows a popup with name, distance, elevation gain, author, and a link to the route detail page.
- Spatial index: Verify (or create) a GiST index on
journal.routes.geomto keep bounding box queries fast.
Capabilities
New Capabilities
route-discovery: Map-based exploration of public routes via spatial queries
Modified Capabilities
journal-navigation: Add explore link to main navigationmap-display: Route polylines with interactive popups on explore map
Non-Goals
- Full-text search: No searching routes by name or description. Map browsing is the only discovery mechanism for now.
- Filtering: No filtering by distance, elevation, activity type, difficulty, or tags. These are useful but add complexity -- defer until real users ask.
- Recommendations: No "routes you might like" or personalized suggestions.
- Clustering: No marker clustering for dense areas. The 50-result limit and geometry simplification keep the map readable. Clustering can come later.
- Federated discovery: Routes from other Journal instances are out of scope. This only covers routes on the local instance.
Dependencies
- route-sharing (route-features change, section 1): The
visibilitycolumn onjournal.routesmust exist before this change can query for public routes. Without it, there are no public routes to discover.
Impact
- Database: GiST spatial index on
journal.routes.geom(may already exist) - New route:
/routes/explorepage + API endpoint - Navigation: Explore link added to Journal nav
- Packages: Uses
@trails-cool/map(MapView, RouteLayer) -- may need a new component for interactive route polylines with popups - i18n: New keys for explore page UI (en + de)