No description
  • TypeScript 46.4%
  • Python 28%
  • HTML 17.8%
  • CSS 6.9%
  • JavaScript 0.7%
  • Other 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Martin Faust 026c22908c
All checks were successful
CI / games (push) Successful in 19s
CI / frontend (push) Successful in 19s
CI / backend (push) Successful in 8s
Quiz: keine Wiederholungen innerhalb einer Runde
Der geteilte quiz.ts-Runner zog jede Frage rein zufällig, sodass sich Wörter in
einer 10er-Runde wiederholen konnten. Question bekommt jetzt einen optionalen
`key`; der Runner meidet Keys, die in dieser Runde schon dran waren (begrenzte
Retries, damit ein kleiner Pool nie endlos schleift). Keys gesetzt für Eloquenz
(Wort), Vokabeln (DE-Wort) und Kennzeichen (Code). Bekannte Zahlen und
Verkehrsschilder hatten bereits ein eigenes No-Repeat-Deck.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017YNQ1XZ3R8X7xrMq95gyhY
2026-08-09 22:51:42 +02:00
.forgejo/workflows CI + Regressionstest gegen den PWA-Weißbild-Fehler 2026-08-09 08:38:46 +02:00
backend offthepath: Klaistow-Overlay nachziehen (enrichment.json war der Ueberschreiber) 2026-08-07 08:29:41 +02:00
design Spiele: Prompt-Sammlung für on-brand Illustrationen 2026-08-08 08:42:48 +02:00
docs roadmap: idea — curated regional Hörspiele with Spotify links (Spiele area) 2026-08-02 13:44:25 +02:00
enrichment-playbooks offthepath: Portugal-Enrichment-Playbook (6 Korridore Festland, ~90 Orte) 2026-08-04 11:49:28 +02:00
frontend offthepath: Spiele-Link ins Info-Menü (nach Blog) 2026-08-05 12:09:57 +02:00
games Quiz: keine Wiederholungen innerhalb einer Runde 2026-08-09 22:51:42 +02:00
work-items Reciprocal profiles, favorites modal, admin charts/CRUD, DB source-of-truth 2026-07-29 07:04:00 +02:00
.gitignore Initial commit: off-the-path backend (FastAPI + PostGIS) 2026-07-22 20:42:58 +02:00
CLAUDE.md docs: durable ARCHITECTURE/ANALYTICS/ROADMAP/OPERATIONS for fresh sessions 2026-07-31 17:22:07 +02:00
enrichment-at.md data: Austria — 98 family attractions across all 9 Bundesländer 2026-07-26 02:42:03 +02:00
enrichment-be.md data: Benelux — NL (113), BE (98), LU (28) family attractions 2026-07-26 09:10:49 +02:00
enrichment-ch.md data: Switzerland — 109 family attractions across 25 cantons (trilingual) 2026-07-26 03:17:47 +02:00
enrichment-countries.md offthepath: PT-Roadmap-Status -> live (92 Orte); bestätigte Länderliste komplett (13) 2026-08-04 12:07:39 +02:00
enrichment-fr.md data: France — 139 family attractions across all 13 régions 2026-07-26 13:29:47 +02:00
enrichment-it.md data: Italy fix pass — re-research 46 low-confidence/ODbL rows 2026-07-26 02:03:28 +02:00
enrichment-lu.md data: Benelux — NL (113), BE (98), LU (28) family attractions 2026-07-26 09:10:49 +02:00
enrichment-nl.md data: Benelux — NL (113), BE (98), LU (28) family attractions 2026-07-26 09:10:49 +02:00
enrichment.md docs: Welle 2 als erledigt vermerken (alle 481 Ziele angereichert) 2026-07-24 00:06:42 +02:00
README.md Initial commit: off-the-path backend (FastAPI + PostGIS) 2026-07-22 20:42:58 +02:00
TODO.md feat: frontend error reporting → /api/client-error with build commit 2026-07-24 08:54:01 +02:00

off-the-path

A web app for family road trips: enter a start and end (driving only for now), and it shows kid-friendly attractions along the route on a map. Starts with Germany (Mecklenburg-Vorpommern seed data), built to expand across Europe.

Stack

  • Backend: FastAPI + SQLAlchemy 2.0 + GeoAlchemy2, PostgreSQL + PostGIS. Attractions "along the route" are found with a PostGIS corridor query (ST_DWithin + order by ST_LineLocatePoint). Routing/geocoding via OpenRouteService (driving-car), kept behind our own API so it can be swapped or self-hosted later. Until an ORS key is set, /route uses a straight line between the two points and start/end must be given as lat,lon (no geocoding).
  • Frontend: (planned) Vite + React + MapLibre GL.
  • API: auto OpenAPI/Swagger at /docs — the basis for the future phone app.

Backend — run locally

Needs a PostGIS database and an OpenRouteService API key.

cd backend
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env    # set DATABASE_URL + ORS_API_KEY
uvicorn app.main:app --reload

Postgres with PostGIS for local dev:

docker run -d --name otp-db -e POSTGRES_USER=offthepath -e POSTGRES_PASSWORD=offthepath \
  -e POSTGRES_DB=offthepath -p 5432:5432 postgis/postgis:17-3.5

On first start the app enables PostGIS, creates the schema, and seeds the initial attractions.

Endpoints

  • GET /api/health
  • GET /api/attractions?country=DE&age=6
  • GET /api/route?start=52.52,13.40&end=54.31,13.09&radius_km=20&age=6 (start/end are lat,lon; once an ORS key is set they also accept place names)

Deployment

Deployed from the mf-server repo (Ansible): a container behind Caddy at off-the-path.martinfaust.com, using the shared PostGIS instance (ensure_db), frontend served static with /api reverse-proxied to this backend.

Notes / TODO

  • Websites for the seed attractions are not filled in yet.
  • Add Alembic migrations once the schema settles.
  • Cache computed routes to stay within the ORS free-tier quota.