- TypeScript 97.1%
- CSS 1.5%
- Dockerfile 0.9%
- JavaScript 0.3%
- Shell 0.2%
- 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> |
||
|---|---|---|
| prisma | ||
| public | ||
| src | ||
| .dockerignore | ||
| .env | ||
| .gitignore | ||
| CLAUDE.md | ||
| compose.yaml | ||
| Dockerfile | ||
| entrypoint.sh | ||
| next-env.d.ts | ||
| next.config.js | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.js | ||
| README.md | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
| tsconfig.tsbuildinfo | ||
| vitest.config.ts | ||
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êtsSNC:(SNCF/TER) etC38:(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