Bincio Planner

bincio_planner è lo strumento di pianificazione percorsi del gruppo. Permette di costruire itinerari sulla mappa con waypoint draggabili, calcola il percorso ottimale via Brouter, mostra il profilo altimetrico e permette di salvare e scaricare le route.

Repository: git.bincio.org/bincio/bincio_planner · Produzione: planner.bincio.org

Funzionalità implementate

  • Waypoint sulla mappa — click per aggiungere punti numerati, trascinabili
  • Routing via Brouter — calcolo percorso debounced (400ms), profili selezionabili
  • Inserimento su percorso — click sul tracciato esistente per inserire un waypoint nel punto esatto
  • Profili disponibili: Strada (fastbike), Gravel, MTB, Trekking, Safety
  • Statistiche percorso: distanza totale + dislivello positivo
  • Profilo altimetrico — grafico SVG responsivo sotto la mappa
  • Tile multipli — CyclOSM (default), OSM standard, OpenTopoMap, Esri Satellite
  • Chiudi anello — duplica il primo waypoint come ultimo
  • Export GPX — genera e scarica il file GPX dal GeoJSON Brouter
  • Salvataggio piani — salva/carica/elimina percorsi nominati via backend FastAPI
  • Track di riferimento — sovrappone attività passate sulla mappa, colorate per anno
  • Palette gare — cambia colore accent durante Giro/Tour/Vuelta (come bincio_activity)
  • Auth gate — richiede login via bincio; redirect automatico se non autenticato

Architettura

Browser (SPA statica — Svelte 5 + Vite)

  ├── activity.bincio.org/api/me  — auth check al caricamento
  ├── brouter.de/brouter          — calcolo routing (esterno, pubblico)
  └── planner.bincio.org/api/     — salvataggio piani (FastAPI locale)

Il frontend è una SPA completamente statica. Il routing geografico è delegato interamente a Brouter (nessun codice di routing in questo repo). Il backend FastAPI è opzionale: senza di esso la pianificazione e l’export GPX funzionano ugualmente; manca solo il salvataggio piani.

Backend piani

Il server FastAPI (server/server.py) espone un CRUD per i piani:

MetodoPathDescrizione
GET/api/plansLista piani utente (senza GeoJSON)
POST/api/plansCrea nuovo piano
GET/api/plans/{id}Carica piano completo
PUT/api/plans/{id}Aggiorna piano esistente
DELETE/api/plans/{id}Elimina piano

I piani sono salvati come file JSON in /var/bincio_planner/{handle}/{plan_id}.json. L’auth usa il cookie bincio_session verificato sul database SQLite condiviso.

Auth

Il cookie bincio_session è emesso da bincio auth e scoped su .bincio.org, quindi è disponibile automaticamente su tutti i sottodomini.

Frontend: al caricamento chiama activity.bincio.org/api/me per verificare la sessione. In caso di 401 redirige a bincio.org/login/ (non a activity). La chiamata a activity è solo una verifica di validità JWT, non autenticazione.

Backend (server/server.py): valida il JWT direttamente — nessun accesso a database, nessuna chiamata HTTP ad altri servizi. Tenta RS256 (OIDC da bincio_auth, chiave pubblica caricata via JWKS all’avvio), poi HS256 (segreto condiviso). Controlla il claim activity_access nel payload.

Dipendenze esterne

Brouter (brouter.de) — motore di routing gratuito, no API key. Query: ?lonlats=lng,lat|..&profile=gravel&format=geojson. Restituisce GeoJSON con coordinate [lng, lat, elevation_m] e proprietà track-length, ascend.

Stack

ComponenteTecnologia
FrontendSvelte 5 + Vite (SPA statica)
MappaMapLibre GL JS
RoutingBrouter API (esterno)
BackendPython, FastAPI, uvicorn
Deploynginx + systemd (bincio-planner.service)
Links To This Page
Attributes