Merge pull request #417 from trails-cool/roadmap

Add roadmap and fix CLAUDE.md drift
This commit is contained in:
Ullrich Schäfer 2026-05-24 10:47:25 +02:00 committed by GitHub
commit 588447efd3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 96 additions and 5 deletions

View file

@ -9,7 +9,9 @@ trails.cool is a federated, self-hostable platform for outdoor enthusiasts with
Full architecture: `docs/architecture.md` Full architecture: `docs/architecture.md`
Philosophy: `docs/philosophy.md` Philosophy: `docs/philosophy.md`
OpenSpec change: `openspec/changes/phase-1-mvp/` Roadmap: `docs/roadmap.md`
Ideas (pre-spec explorations): `docs/ideas/`
OpenSpec changes: `openspec/changes/`
## Principles ## Principles
@ -25,7 +27,7 @@ OpenSpec change: `openspec/changes/phase-1-mvp/`
- **Frontend**: React + Tailwind CSS + React Router 7 (Remix stack) - **Frontend**: React + Tailwind CSS + React Router 7 (Remix stack)
- **Maps**: Leaflet + OpenStreetMap tiles - **Maps**: Leaflet + OpenStreetMap tiles
- **CRDT**: Yjs + y-websocket (Planner only) - **CRDT**: Yjs + y-websocket (Planner only)
- **Federation**: Fedify (Journal only, Phase 2) - **Federation**: Fedify (Journal only)
- **Database**: PostgreSQL + PostGIS - **Database**: PostgreSQL + PostGIS
- **Media storage**: S3-compatible (Garage) - **Media storage**: S3-compatible (Garage)
- **Routing engine**: BRouter (Java, runs as separate Docker container) - **Routing engine**: BRouter (Java, runs as separate Docker container)
@ -41,9 +43,15 @@ apps/
packages/ packages/
types/ — Shared TypeScript interfaces (Route, Activity, Waypoint) types/ — Shared TypeScript interfaces (Route, Activity, Waypoint)
ui/ — Shared React components (Tailwind) ui/ — Shared React components (Tailwind)
map/ — Leaflet map wrappers and tile layer configs map/ — React/Leaflet components (MapView, RouteLayer); re-exports map-core
map-core/ — Framework-free map constants (colors, tiles, POI, z-index, snap); safe to import server-side
gpx/ — GPX parsing, generation, validation gpx/ — GPX parsing, generation, validation
fit/ — FIT file generation (Wahoo route push)
i18n/ — react-i18next config + translations i18n/ — react-i18next config + translations
api/ — Shared API contracts (endpoints, pagination, error types, versioning)
db/ — Drizzle schema, database client, migration helpers
jobs/ — pg-boss setup, worker, and background job types
sentry-config/ — Shared Sentry configuration
infrastructure/ — Terraform + Docker Compose infrastructure/ — Terraform + Docker Compose
openspec/ — OpenSpec specs and changes openspec/ — OpenSpec specs and changes
docs/ — Architecture, philosophy, tooling docs docs/ — Architecture, philosophy, tooling docs

View file

@ -39,8 +39,10 @@ Revisit once **any** of these is true:
different hardware (AX52 ≈ €54/mo for a dedicated 64 GB NVMe box that different hardware (AX52 ≈ €54/mo for a dedicated 64 GB NVMe box that
handles planet at low user counts; see design.md). handles planet at low user counts; see design.md).
- **Switch path**: no client changes needed to cut over — the Planner - **Switch path**: no client changes needed to cut over — the Planner
proxy already reads `OVERPASS_URL` from env and defaults to proxy reads `OVERPASS_URLS` (comma-separated list with round-robin
private.coffee. Flipping the env var points at our own instance. fallback) or the single-entry alias `OVERPASS_URL`, defaulting to
`lz4.overpass-api.de` then `overpass-api.de`. Flipping the env var
points at our own instance.
## What's in the folder ## What's in the folder

81
docs/roadmap.md Normal file
View file

@ -0,0 +1,81 @@
# Roadmap
Strategic view of what ships when and why. For implementation detail, see the linked OpenSpec changes in `openspec/changes/`. For exploratory ideas not yet in a change, see `docs/ideas/`.
---
## Launch readiness
Five changes must ship before public announcement:
| Change | Why it blocks launch |
|---|---|
| [`route-sharing`](../openspec/changes/route-sharing/) | Visibility levels (private / public / shared-link) and forking. Federation depends on it. |
| [`social-federation`](../openspec/changes/social-federation/) | The platform is described as federated — launching without it would be misleading. ActivityPub, WebFinger, inbound Mastodon follows. |
| [`visual-redesign`](../openspec/changes/visual-redesign/) | Design system not yet implemented. Current UI is unstyled Tailwind. Must land before any public-facing announcement. |
| [`wahoo-production-cutover`](../openspec/changes/wahoo-production-cutover/) | Wahoo sandbox rate limits make the integration unusable at scale. Ops task, not a feature, but launch-blocking. |
| [`changelog`](../openspec/changes/changelog/) | Public `/changelog` is part of the launch narrative — how we communicate "here's what just shipped" to early users on day one. |
---
## Phases
### Phase 1 — Feature complete
Implement all launch-blocking changes above, in dependency order:
1. `route-sharing` (no dependencies)
2. `social-federation` (depends on route-sharing for public routes)
3. `wahoo-production-cutover` (ops, can run in parallel)
4. `changelog` (no feature dependencies)
### Phase 2 — Polish sprint
After features are stable, run a dedicated UI/UX review pass:
- Walk every user-facing flow end-to-end in a real browser
- Implement `visual-redesign` if not already complete (this change may span phases 12)
- Fix rough edges: empty states, loading states, error messages, mobile layout
- Review copy and i18n strings for consistency
- No new features during this phase — polish only
The polish sprint is its own phase because it requires a stable feature set. Polishing during active feature development is expensive churn.
### Phase 3 — Soft launch / beta
Invite 1020 real users before public announcement:
- Watch Sentry for crashes and unhandled errors
- Watch Grafana for performance regressions
- Watch for federation interop issues (Mastodon follow/unfollow, object delivery)
- Collect structured feedback on onboarding and core flows
- Fix anything critical; defer cosmetic issues to post-launch
### Phase 4 — Public announcement
Announce once beta feedback is resolved:
- Changelog entry for launch
- Social post / blog post
---
## Post-launch
These changes are scoped and designed but not blocking launch:
| Change | Notes |
|---|---|
| [`route-discovery`](../openspec/changes/route-discovery/) | Spatial map-based route exploration. The text `/explore` page covers the gap at launch. |
| [`activity-photos`](../openspec/changes/activity-photos/) | Photo uploads for activities. Enriches content but not a day-one requirement. |
| [`mobile-app`](../openspec/changes/mobile-app/) | React Native unified app. Substantial scope; explicitly post-launch. |
---
## Ideas (exploratory, not yet in a change)
See `docs/ideas/` for pre-spec explorations:
- `mobile-activity-recording/` — GPS tracking and activity logging from a native app
- `mobile-nearby-sync/` — BLE-based proximity discovery
- `self-host-overpass/` — Self-hosted Overpass API for POI overlays