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>
77 lines
3.6 KiB
Markdown
77 lines
3.6 KiB
Markdown
## 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) and `public` on 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 `view` or
|
|
`edit` permission 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 `forkedFromId` link
|
|
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 search
|
|
- `route-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 display
|
|
- `planner-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 `visibility` enum column on `journal.routes` and
|
|
`journal.activities`. New `journal.route_shares` table. New `contributors`
|
|
text array on `journal.route_versions`. New `forkedFromId` column on
|
|
`journal.routes`.
|
|
- **Server logic**: New `permissions.server.ts` module with `canView` and
|
|
`canEdit` functions. 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).
|