La plus grande encyclopédie collaborative du rail français.
À la croisée des rails.
Présentation · Fonctionnalités · Stack · Installation · Contribuer · Roadmap · Architecture
VFF (Voies Ferrées de France) est une plateforme en ligne créée par des passionnés du rail. Notre mission : documenter, cartographier et partager l'intégralité du patrimoine ferroviaire français — qu'il s'agisse des lignes en service aujourd'hui ou de celles qui ont disparu il y a plus d'un siècle.
Au cœur du projet : une carte interactive temporelle qui permet de remonter le temps et de visualiser le réseau ferré tel qu'il existait en 1990, 2000, 2010, 2020 — et tel qu'il se dessine aujourd'hui, dans un snapshot vivant 2030 qui évoluera jusqu'à cette date avant d'être figé à son tour.
Chaque ligne est documentée par :
- son tracé géoréférencé (en service, voie unique, abandonnée, déposée, rasée) ;
- son matériel roulant historique (locomotives, automotrices, rames qui l'ont parcourue, en photos) ;
- ses dates clés (inauguration, électrification, fermeture, démantèlement) ;
- ses archives (photographies, plans, documents datés) ;
- à terme, des reconstitutions 3D assistées par IA des lieux disparus, générées à partir des éléments existants.
Le projet est 100 % collaboratif : passionnés, archivistes, photographes, historiens locaux et développeurs sont invités à enrichir la base. Une API publique permettra à d'autres développeurs de construire leurs propres outils par-dessus.
- Page d'accueil enrichie : header parallax TGV, sections Genèse / Maps / Features / Timeline interactive (5 époques) / Galerie d'archives / Stats / Contribute teaser / Final CTA
- Pages internes complètes :
/whoarewe,/maps(teaser),/contribute,/donate,/api,/legal,/privacy,/use-conditions - Internationalisation FR / EN / DE (i18next + svelte-i18next) avec détection auto via
Accept-Language+ cookie persistant 1 an + endpointGET /locale/{code} - Dark mode complet (cookie 1 an) avec design tokens CSS custom properties
- Modèle de données ferroviaire complet (PostgreSQL 18 + PostGIS 3.6 via Magellan) : eras, lignes, segments
LINESTRING, garesPOINT, matériels, événements, médias polymorphes, contributions - Service d'import OSM (Overpass API) — squelette :
php artisan vff:import-osm --region=FR - Footer riche avec liens communauté, légal et partenaires
- Performance hero :
background.png2.7 MB → WebP 179 KB desktop / 117 KB tablet / 63 KB mobile - Accessibilité :
prefers-reduced-motion, focus-visible,all: unsetsur les buttons icônes
En développement (voir ROADMAP.md)
- Carte interactive MVP (MapLibre GL JS + tuiles OSM)
- Sélecteur temporel fonctionnel par décennie (1990 / 2000 / 2010 / 2020 / 2030)
- Couche optionnelle OpenRailwayMap (infra, électrification, vitesses)
- Fiche détaillée par ligne (matériel, dates, médias)
- Système de contribution communautaire avec validation par les pairs
- Encyclopédie du matériel roulant
- API publique REST + GeoJSON + MVT (documentée via Scramble + Stoplight Elements)
- API GraphQL pour l'admin (Lighthouse, Phase 7)
- Apache AGE — extension graphe pour pathfinding historique (Phase 8)
- Reconstitutions 3D IA de lieux ferroviaires disparus (Phase 9)
- Mode hors-ligne (PWA)
- Extension historique 1900 → 1980 (Phase 10)
| Couche | Techno | Pourquoi |
|---|---|---|
| Framework backend | Laravel 13 | Dernière stable, structure minimaliste bootstrap/app.php, support long terme |
| Langage backend | PHP 8.2+ | Types stricts, enums backés, performance |
| Base de données | PostgreSQL 18 + PostGIS 3.6 + Apache AGE (Phase 8) | Stockage natif LINESTRING / POINT (SRID 4326), requêtes spatiales (ST_Intersects, ST_Within, ST_Length, ST_AsMVT…) et requêtes graphe via Cypher pour pathfinding historique |
| PostGIS ↔ Laravel | Clickbar Magellan 2.1 | Casts Eloquent (Point, LineString…), Blueprint Schema ($table->magellanLineString()), query builder spatial |
| Cache & queue | Valkey 8 | Fork BSD de Redis (souveraineté, éthique), 100 % compatible RESP |
| Pont front/back | Inertia.js 3 | App quasi-SPA sans réécriture en pure SPA, routing Laravel conservé |
| Framework front | Svelte 5 | Composants compilés (zéro runtime), runes $state/$derived/$effect, parfait pour UI riche |
| i18n | i18next 26 + svelte-i18next | FR canonique côté Laravel lang/{locale}, partagés à Inertia, consommés via store réactif |
| Cartographie | MapLibre GL JS 5 | Vectoriel + GPU, multi-couches temporelles fluides, libre (fork de Mapbox GL JS pré-licence proprio) |
| Fond carte | OpenStreetMap via MapTiler ou Stadia Maps | Tuiles vectorielles, attribution communautaire |
| Overlay rail | OpenRailwayMap | Couche optionnelle dédiée infrastructure ferroviaire (signaux, électrification, vitesses, écartement) |
| Données ferroviaires | OSM via Overpass API → import Postgres | Pré-peuplement massif, pas de saisie manuelle from scratch |
| Build front | Vite 8 | HMR rapide, intégration Laravel via laravel-vite-plugin 3 |
| Iconographie | Bootstrap Icons | Déjà en place, cohérent avec l'existant |
| Typographie | Lato · Gabarito · Inter · Montserrat | Auto-hébergées, identité visuelle déjà posée |
| Tests | PHPUnit 13 + Pest (à venir) | Tests unitaires & feature |
| Qualité | Laravel Pint, Prettier, ESLint | Formatage automatique |
| Auth | Laravel Sanctum | Sessions + tokens API |
- PHP 8.2+ avec extensions :
pdo_pgsql,mbstring,xml,curl,gd,intl,bcmath,zip - Composer 2.5+
- Node.js 20+ et pnpm 9+
- Docker + Docker Compose v2 (pour Postgres + Valkey)
💡 Seules Postgres+PostGIS et Valkey tournent en Docker. L'app Laravel et Vite tournent sur l'hôte pour un cycle de dev rapide.
# 1. Cloner
git clone https://github.com/UnxWares/VFF-Project.git
cd VFF-Project
# 2. Tout-en-un (recommandé) — env + services Docker + deps + key + migrations
make setup
# 3. Lancer le dev (serve + queue + pail + vite en parallèle)
make dev→ Le site est accessible sur http://localhost:8000. → Vite HMR sur http://localhost:5173. → Adminer (UI DB) sur http://localhost:8080.
cp .env.example .env
# Services de données
docker compose up -d # postgres + valkey + adminer
# Dépendances
pnpm install
composer install
# App
php artisan key:generate
php artisan migrate
# Dev (orchestre serve + queue + pail + vite via concurrently)
composer run devphp artisan vff:import-osm --region=france # à venir en phase 1npm run build
php artisan optimize
php artisan view:cache
php artisan config:cache
php artisan route:cacheVFF-Project/
├── app/
│ ├── Console/Commands/ # ImportOsmRegion (php artisan vff:import-osm)
│ ├── Enums/ # LineType, SegmentStatus, StationType, MaterialType…
│ ├── Http/
│ │ ├── Controllers/ # Contrôleurs Inertia + LocaleController
│ │ └── Middleware/ # HandleInertiaRequests, SetLocale
│ ├── Models/ # Era, Line, LineSegment, Station, Material, LineMaterial, LineEvent, Media, Contribution, User
│ ├── Services/ # OsmImporter
│ └── Support/ # Translations (aplatissement des lang/*.php pour Inertia)
├── bootstrap/
│ ├── app.php # Configuration Laravel 13 (routes, middleware, exceptions)
│ └── providers.php # Service providers app
├── config/ # Standard Laravel + services.osm + services.cartographie
├── database/
│ ├── factories/
│ ├── migrations/ # 11 migrations métier : extensions PostGIS, eras, lignes, segments, gares, matériels…
│ └── seeders/ # EraSeeder (5 époques 1990–2030)
├── lang/ # i18n FR canonique + EN complet + DE partiel
│ ├── fr/ # nav, footer, home, whoarewe, maps, contribute, donate, api, légales, common…
│ ├── en/
│ └── de/
├── resources/
│ ├── css/ # general (tokens + dark mode), header, footer, sections (intouchables hors additif)
│ ├── fonts/ # TTF auto-hébergées (Lato, Gabarito, Inter, Montserrat)
│ ├── images/ # Logo VFF, TGV, UnxWares, backgrounds WebP (3 tailles)
│ ├── js/
│ │ ├── app.js # Entrée Inertia + Svelte + i18next bootstrap
│ │ ├── Components/ # Header, Footer, Layout, LanguageSwitcher, PageHero, IconCard, SectionBlock, LegalPage, Sections/*
│ │ ├── Pages/ # Home, Placeholder, WhoAreWe, Maps, Contribute, Donate, ApiDocs, Legal, Privacy, UseConditions
│ │ └── lib/
│ │ ├── i18n.js # setup i18next + LOCALES
│ │ ├── stores/ # theme.svelte.js
│ │ └── actions/ # navbarFade, parallaxTGV, scrollReveal, smoothScrollTo
│ └── views/
│ └── app.blade.php # Shell Inertia (1 seul template Blade)
├── routes/
│ ├── web.php # Routes Inertia + GET /locale/{code}
│ ├── api.php # API publique (à venir Phase 6)
│ └── console.php
├── tests/
│ ├── Feature/
│ └── Unit/
├── docker/postgres/init/ # 01-postgis.sql (extension PostGIS auto-créée)
├── docker-compose.yml # postgres-postgis-18 + valkey-8 + adminer-5
├── Makefile # raccourcis dev (make setup, make dev, make psql, …)
└── public/ # Assets compilés + favicon
# Dev (raccourcis Makefile)
make help # liste de toutes les cibles
make dev # serve + queue + pail + vite (concurrently)
make up / make down # services Docker (postgres + valkey + adminer)
make psql # console psql dans le conteneur db
make valkey-cli # console valkey
# Dev (sans Make)
composer run dev # idem make dev
php artisan tinker # REPL Laravel
docker compose up -d # services data
# Base de données
make migrate # ou : php artisan migrate
make migrate-fresh # reset complet + seed
make seed # php artisan db:seed
# Imports métier (à venir)
php artisan vff:import-osm --region=france
php artisan vff:import-photos /chemin/vers/dossier
# Qualité
make pint # formater PHP
make format # formater JS/Svelte/CSS (Prettier)
make lint # vérifier le formatage
make test # PHPUnit
# Production
pnpm build
php artisan optimizeVFF est collaboratif par essence. Trois façons d'aider :
- Documenter des lignes — directement depuis l'interface web une fois inscrit, ou en ouvrant une PR sur les seeders.
- Apporter des médias — photos d'archives, plans, documents (voir CONTRIBUTING.md section Médias).
- Contribuer au code — fork, branche, PR. Voir CONTRIBUTING.md pour les conventions (commits conventionnels, style, tests).
Toutes les contributions sont validées par les pairs avant publication.
- 🌍 Site officiel : vff-project.org (à venir)
- 💬 Discord : https://discord.com/invite/6SwTfXBx4h
- 📸 Instagram : @vff_project
- 🐦 X / Twitter : @vff-project
- 🐙 GitHub : UnxWares/VFF-Project
- 🏢 Studio porteur : UnxWares (et sa Division Cloud pour l'hébergement)
- 📧 Contact :
contact@vff-project.org
Le projet sera juridiquement porté par une association ESS en cours de constitution (« UnxWares Opensource ») qui gérera les dons et les actifs des projets open-source d'UnxWares — dont VFF.
Plateforme de dons à arbitrer :
- Patreon — soutien récurrent mensuel, populaire dans la communauté tech open-source
- HelloAsso — don ponctuel ou récurrent, déductible fiscalement une fois l'asso reconnue d'intérêt général
→ Choix définitif en cours.
Le code est distribué sous licence MIT.
Les données ferroviaires importées depuis OpenStreetMap sont sous licence ODbL — toute redistribution doit respecter l'attribution OSM.
Les tuiles OpenRailwayMap utilisées en overlay sont sous CC BY-SA 2.0.
Les médias contribués (photos, documents) restent la propriété de leurs auteurs ; ceux-ci en cèdent l'usage à VFF sous licence Creative Commons CC BY-SA 4.0 sauf mention contraire.
Développé par Baptiste Gosselin · Hébergement UnxWares — Division Cloud · Fond cartographique © contributeurs OpenStreetMap · Overlay rail © contributeurs OpenRailwayMap