The roadmap claimed social-federation depends on route-sharing for public routes, but that prerequisite shipped independently via public-content-visibility (2026-04-24) and social-feed (2026-04-25): visibility columns, public profiles, and IRI-keyed follows are all in place. Reorder Phase 1 to reflect that federation can start now. Also flag route-sharing's proposal as needing re-scoping: tasks 1.1-1.3 and 3.1 duplicate already-shipped visibility work, and the proposed enum contradicts the shipped text-column design. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86 lines
4.2 KiB
Markdown
86 lines
4.2 KiB
Markdown
> **⚠️ Needs re-scoping before implementation (noted 2026-06-06):** This
|
||
> proposal predates `public-content-visibility` (archived 2026-04-24), which
|
||
> already shipped route/activity visibility as a plain-text column with three
|
||
> values (`private | unlisted | public`), public detail pages, public profiles,
|
||
> and an owner-facing visibility selector. Tasks 1.1–1.3 and 3.1 are obsolete
|
||
> (and 1.1's enum approach contradicts the shipped text-column design — see
|
||
> `packages/db/src/schema/journal.ts`). The remaining scope — per-user sharing
|
||
> (view/edit), forking, contributor tracking — is still valid and unshipped.
|
||
|
||
## 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).
|