No description
  • TypeScript 97.1%
  • CSS 1.5%
  • Dockerfile 0.9%
  • JavaScript 0.3%
  • Shell 0.2%
Find a file
Cyril ddd8a62be7 feat: docker clone-and-run + line visibility improvements
- Add entrypoint.sh for auto-seed on first Docker start
- Dockerfile: dummy DB during build, runtime seed via entrypoint
- Mark bootstrap route as force-dynamic for Docker build
- Show principal lines (trams + chronos) at all zoom levels
- Dim non-serving lines (0.5 opacity) when stop is selected
- Show non-principal lines serving selected stop

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 13:58:43 +02:00
prisma bit commit 2026-05-31 09:06:25 +02:00
public feat: complete app structure + build success 2026-05-30 10:14:19 +02:00
src feat: docker clone-and-run + line visibility improvements 2026-06-01 13:58:43 +02:00
.dockerignore bit commit 2026-05-31 09:06:25 +02:00
.env bit commit 2026-05-31 09:06:25 +02:00
.gitignore bit commit 2026-05-31 09:06:25 +02:00
CLAUDE.md bit commit 2026-05-31 09:06:25 +02:00
compose.yaml bit commit 2026-05-31 09:06:25 +02:00
Dockerfile feat: docker clone-and-run + line visibility improvements 2026-06-01 13:58:43 +02:00
entrypoint.sh feat: docker clone-and-run + line visibility improvements 2026-06-01 13:58:43 +02:00
next-env.d.ts feat: complete app structure + build success 2026-05-30 10:14:19 +02:00
next.config.js bit commit 2026-05-31 09:06:25 +02:00
package-lock.json bit commit 2026-05-31 09:06:25 +02:00
package.json bit commit 2026-05-31 09:06:25 +02:00
postcss.config.js chore: initial scaffold - Next.js 14 + Prisma + Tailwind + types 2026-05-30 10:01:02 +02:00
README.md bit commit 2026-05-31 09:06:25 +02:00
tailwind.config.ts chore: initial scaffold - Next.js 14 + Prisma + Tailwind + types 2026-05-30 10:01:02 +02:00
tsconfig.json chore: initial scaffold - Next.js 14 + Prisma + Tailwind + types 2026-05-30 10:01:02 +02:00
tsconfig.tsbuildinfo Refactor code structure for improved readability and maintainability 2026-05-31 14:53:15 +02:00
vitest.config.ts bit commit 2026-05-31 09:06:25 +02:00

Transit Grenoble

Application mobile-first d'information sur les transports en commun de l'agglomération grenobloise (réseau M-RÉSO / TAG). Prochains départs en temps réel, positions estimées des véhicules, calcul d'itinéraires et carte interactive.

Pourquoi ce projet ? Les applications commerciales ne couvrent pas correctement le réseau de Grenoble. Transit Grenoble utilise directement l'API OpenTripPlanner de M-RÉSO pour offrir des informations fiables et à jour.

Fonctionnalités

  • Départs en temps réel — Prochains passages à un arrêt avec prise en compte des retards
  • Positions des véhicules — Estimation visuelle des bus et tramways sur la carte (interpolation le long du tracé, pas du GPS brut)
  • Carte interactive — Carte plein écran avec exploration des arrêts à proximité
  • Calcul d'itinéraires — Planification A→B avec plusieurs propositions
  • Design mobile-first — Interface tactile optimisée, installable en PWA
  • Mode sombre — Thème clair/sombre avec détection automatique des préférences système
  • Recherche — Recherche instantanée d'arrêts et de lignes
  • Favoris — Sauvegarde des arrêts favoris en local

Stack technique

Côté Technologies
Framework Next.js 14 (App Router), React 18, TypeScript
Style Tailwind CSS, dark mode
Carte Leaflet, react-leaflet
Base de données SQLite via Prisma ORM
API temps réel API M-RÉSO (data.mobilites-m.fr/api)
Tests Vitest
Déploiement Docker, standalone Next.js

Installation

Prérequis : Node.js 20+

git clone https://github.com/<user>/next-transit.git
cd next-transit
npm install
npm run db:generate   # Générer le client Prisma
npm run db:seed       # Peupler la base depuis l'API M-RÉSO (~30s)
npm run dev           # Serveur de dev sur http://localhost:8810

Le seeding télécharge les lignes, arrêts et géométries de trajet depuis l'API M-RÉSO et les stocke en SQLite. Les données temps réel (départs, itinéraires) sont récupérées en direct à l'utilisation.

Déploiement avec Docker

docker compose up -d

L'application est disponible sur le port 8810. La base SQLite est persistée dans ./data/.

Scripts disponibles

npm run dev          # Serveur de développement (port 8810)
npm run build        # Build production
npm run start        # Serveur production
npm run lint         # ESLint
npm run test         # Tests unitaires Vitest
npm run test:watch   # Vitest en mode watch
npm run db:generate  # Générer le client Prisma
npm run db:seed      # Peupler la base de données
npm run db:studio    # Ouvrir Prisma Studio

Architecture

Client (React)
  └──→ Next.js API routes
          ├──→ SQLite (Prisma)         ← données statiques (lignes, arrêts, tracés)
          ├──→ M-RÉSO OTP API          ← temps réel (départs, itinéraires)
          └──→ Vehicle Engine          ← interpolation des positions véhicules
  • Données statiques (lignes, arrêts, géométries, séquences d'arrêts) : SQLite via Prisma, peuplées une fois au seeding.
  • Données temps réel (prochains départs, calcul d'itinéraire) : requêtes live à l'API M-RÉSO.
  • Positions véhicules : estimées par interpolation le long de la géométrie du trajet, en comparant les horaires théoriques et temps réel.

Hooks client principaux

Hook Rôle
useGeolocation Géolocalisation navigateur
useVehicles Positions véhicules + arrêts à proximité
useNearestStop Arrêt le plus proche + départs
useRoutePlanner Calcul d'itinéraire A→B

Limites connues

  • Seuls les arrêts SEM: (TAG) ont des données temps réel. Les arrêts SNC: (SNCF/TER) et C38: (Cars régionaux) ne renvoient pas de informations en temps réel.
  • Pas de GTFS disponible pour Grenoble — toutes les données transitent par l'API M-RÉSO.
  • Les identifiants de cluster peuvent changer après un redémarrage serveur, nécessitant un re-seeding.

Licence

MIT