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>
3.6 KiB
Why
Routes in the Journal are currently invisible to everyone except the owner. There
is no way to make a route public, share it with a specific person, or fork
someone else's route into your own collection. The architecture doc specifies
visibility levels, a permission matrix, and forking for Phase 2, and the original
route-features spec bundled these with spatial search, multi-day routes, and
photos. This change breaks out the sharing and permissions scope into a focused,
independent unit of work.
Without visibility and sharing, routes are just private GPX storage. Users cannot show a planned bikepacking route to a friend, let a co-planner view the latest version in the Journal, or build on someone else's published route. This is the minimum social layer needed before federation makes routes visible across instances.
What Changes
- Route visibility:
private(default) andpublicon routes and activities. Public routes are viewable by anyone with the link. Private routes are owner-only. - Route sharing: Owners can share a route with specific users at
vieworeditpermission level. Shared users see the route in their collection and can act according to their permission. - Route forking: Logged-in users can fork any public route, copying the route
metadata and latest GPX into their own collection with a
forkedFromIdlink back to the original. - Contributor tracking: When the Planner saves back to the Journal via JWT callback, the contributor's identity is recorded on the route version. The route detail page shows who contributed to each version.
These are all Journal-side changes (database schema, server logic, and UI). No Planner changes are needed.
Capabilities
New Capabilities
route-sharing: Visibility levels (private/public), per-user sharing with view/edit permissions, share dialog with user searchroute-forking: Copy public routes into own collection with provenance link
Modified Capabilities
route-management: Visibility toggle on routes and activities, permission checks on all route access, contributor displayplanner-callback: JWT callback records contributor identity on route versions
Non-Goals
- Granular permissions beyond view/edit: No "edit waypoints but not description" or "view but not export GPX". Two levels are enough.
- Team or organization sharing: No group-level permissions. Share with individual users only.
- ActivityPub federation of shares: Sharing is local to the instance for now. Cross-instance sharing comes with the federation change.
- Followers-only visibility: Only private and public for now. A followers-only level can be added when the follow system exists.
- Spatial search / explore page: Broken out as a separate change. Public routes are a prerequisite; discovery is not.
Impact
- Database: New
visibilityenum column onjournal.routesandjournal.activities. Newjournal.route_sharestable. Newcontributorstext array onjournal.route_versions. NewforkedFromIdcolumn onjournal.routes. - Server logic: New
permissions.server.tsmodule withcanViewandcanEditfunctions. Route loaders and list queries updated to respect permissions. - UI: Visibility toggle on route detail/edit page. Share dialog modal with user search. Fork button on public routes. "Forked from" link. Contributor list on route detail.
- Privacy: Privacy manifest updated to document visibility and sharing behavior.
- i18n: New translation keys for visibility, sharing, forking, contributors (en + de).