Imprint: - Add explicit Streitbeilegung section with the EU ODR link and the required statement that we don't participate in consumer dispute resolution proceedings. - Keep structure tight; drop the Haftungsausschluss boilerplate that repeated what's already covered by §§ 7-10 TMG. - Bilingual with EN summaries below each section. Privacy: - Reshape around proper GDPR structure: Controller → Data categories & purposes → Legal bases → Server logs → Storage durations → Third parties → Rights → Complaint authority → (plain-language) Privacy Manifest at the end. - FIX: acceptance of the Terms is NOT consent. Moved from Art. 6(1)(a) to Art. 6(1)(b) (Vertragserfüllung), with an explicit note that contract acceptance is not consent within the meaning of (1)(a). - Add explicit Server-Logfiles section (IP / timestamp / method / path / status / user-agent; Art. 6(1)(f); 14-day retention). - Add explicit Storage-duration list (account, Planner sessions, magic-link tokens, logs, Sentry). - Expand third-parties: Sentry, OpenStreetMap (explicit that the browser sends IP+UA directly to OSM tile servers, with OSMF privacy policy link), Overpass (via our proxy, upstream only sees our server), BRouter (self-hosted), SMTP, hosting inside EU under DPA. - Each section has a short "English." summary paragraph inline below the German text, per the feedback format request. - Privacy Manifest kept as a developer-friendly epilogue; trimmed and aligned with current reality (no cookies/localStorage/sessionStorage in Planner; no replays; no PII via Sentry). Terms: - Add § 2 Mindestalter (16) for Journal accounts; Planner anonymous has no age requirement. - Add § 3 Dienstverfügbarkeit (service availability): operator may modify/limit/interrupt/discontinue the service or individual accounts. - Add § 6 Inhalte und Nutzungsrechte: user retains ownership; grants operator a limited, non-transferable licence to store/process/ display content only for operating the service. - Tighten §4 DB reset, §5 user backup responsibility, and §9 liability (standard German DACH tiering: unlimited for intent/gross neg./life- body-health; limited to foreseeable damages on cardinal-duty breach for slight negligence; otherwise excluded). - Add §7 rule: no bulk scraping to build competing services. - Same bilingual format as the other two pages. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| .github | ||
| apps | ||
| docker/brouter | ||
| docs | ||
| e2e | ||
| infrastructure | ||
| openspec | ||
| packages | ||
| scripts | ||
| .gitignore | ||
| .gitleaks.toml | ||
| .mcp.json | ||
| .prettierrc | ||
| .sops.yaml | ||
| CLAUDE.md | ||
| docker-compose.dev.yml | ||
| eslint.config.js | ||
| LICENSE | ||
| package.json | ||
| playwright.config.ts | ||
| pnpm-lock.yaml | ||
| pnpm-workspace.yaml | ||
| README.md | ||
| SECURITY.md | ||
| tsconfig.base.json | ||
| turbo.json | ||
| vitest.config.ts | ||
| vitest.setup.ts | ||
| vitest.shared.ts | ||
trails.cool
Collaborative route planning and federated activity sharing for outdoor enthusiasts.
Planner — Plan routes together in real-time. Share a link, invite friends, edit waypoints collaboratively. Powered by BRouter for intelligent routing with elevation awareness.
Journal — Track your adventures. Import activities from Garmin, Strava, or Wahoo. Share routes and rides with friends. Self-host your own instance and federate with others via ActivityPub.
Status
Early development. See the architecture plan and project philosophy.
Project Structure
This is a TypeScript monorepo using pnpm workspaces and Turborepo.
apps/
planner/ Collaborative route editor (React Router 7 + Yjs + Leaflet)
journal/ Activity social platform (React Router 7 + Fedify + PostGIS)
packages/
types/ Shared TypeScript interfaces
ui/ Shared React components (Tailwind)
map/ Leaflet map wrappers
gpx/ GPX parsing and generation
i18n/ Internationalization (English + German)
Getting Started
Prerequisites: Node.js 20+, pnpm, Docker
# Clone
git clone https://github.com/trails-cool/trails.git
cd trails
# Install dependencies
pnpm install
# Start development (apps only, no database or routing)
pnpm dev
# Start full stack (PostgreSQL + BRouter + apps)
pnpm dev:full
Full Local Dev Setup
pnpm dev:full starts everything needed to test the Planner end-to-end:
- PostgreSQL + PostGIS on port 5432 (via Docker)
- BRouter routing engine on port 17777 (via Docker)
- Database schema pushed automatically via Drizzle
- BRouter segment downloaded for Berlin area (~124MB, cached)
- Journal on http://localhost:3000
- Planner on http://localhost:3001
Other useful commands:
pnpm dev:services # Start Docker services only (DB + BRouter)
pnpm db:push # Push database schema changes
pnpm db:studio # Open Drizzle Studio (DB browser)
Development Tools
This project uses AI-assisted, spec-driven development. See docs/tooling.md for details.
| Tool | Purpose |
|---|---|
| cmux | Native macOS terminal for running multiple AI coding sessions |
| Claude Code | AI coding assistant (primary development tool) |
| GitHub Copilot | AI coding assistant |
| Crit | Browser-based inline code review |
| OpenSpec | Spec-driven development workflow |
Self-Hosting
The Journal is designed to be self-hosted. A single Docker Compose file gets you running:
curl -O https://raw.githubusercontent.com/trails-cool/trails/main/infrastructure/docker-compose.yml
docker compose up -d
See docs/architecture.md for details on self-hosting configuration.
Philosophy
- Privacy by design — The Planner collects zero user data
- Data ownership — Export everything, self-host, no lock-in
- Open source — MIT licensed, built on open standards
- Simplicity — Start simple, add complexity only when needed
Read more: docs/philosophy.md
Contributing
Human contributions are welcome! This project is built with AI-assisted development (Claude Code + OpenSpec), but we value human judgment, design taste, and community input.
License
MIT