
Cultural Trails
Une application web complète qui transforme le patrimoine culturel du canton de Vaud en sentiers de randonnée gamifiés et accessibles : des parcours thématiques, des points d'intérêt avec guides audio et quiz, et un mode éditeur qui permet aux acteurs locaux de publier leurs propres sentiers. J'étais responsable du back-end.
- Rôle
- Responsable back-end
- Année
- 2024
- Cadre
- HEIG-VD · Projet d'articulation
- Périmètre
- Équipe de cinq
- Livré
- Application web en ligne, présentation, rapport
Le patrimoine culturel du canton de Vaud est riche mais dispersé, et difficile à découvrir à pied de façon guidée et engageante. Le brief était de construire une application web complète qui le transforme en sentiers de randonnée gamifiés et accessibles, et, point crucial, de permettre aux acteurs locaux de publier et d'éditer les leurs.
Sous le brief produit se trouvait un vrai problème d'ingénierie : une application riche en contenu et centrée sur la carte, avec deux types d'utilisateurs très différents (des gens qui explorent les sentiers et des gens qui les créent), portant du multimédia, des quiz et une couche de gamification, conçue et développée full-stack dans le temps imparti d'un projet étudiant. J'ai pris en charge la moitié back-end.
- Le back-end : le modèle de données, les contrôleurs et la logique applicative, l'authentification et l'accès basé sur les rôles
- L'intégration de la planification d'itinéraires, ainsi que le seeding de la base de données, les migrations et le déploiement
- Des composants front-end qui dialoguent avec la base de données : les formulaires de création de sentiers et de POI, les filtres et les pages de profil
- La phase UX initiale avec l'équipe
- Le travail du responsable front-end, celui du responsable design UX, et le volet visuel et communication
Équipe de cinq (Groupe Loomi) pour le Projet d'articulation à la HEIG-VD : Jérémy Martin (responsable back-end), Antony Neyret (responsable front-end), François Cuennet (design UX), Leïla Fidalgo (cheffe de projet) et Ariadne Melissargos (communication). Encadrés par Laurent Berthelot (gestion de projet et technique), Jonathan Favre-Lamarine (UX/UI et design) et Noemi Romano (cartographie).
Une seule app, pas un front et un back
Nous sommes partis d'une base Laravel Breeze, qui nous a donné l'authentification, Tailwind et Vue clés en main, puis avons pris la décision qui a tout façonné : Blade, Livewire ou Inertia. Nous avons choisi Inertia. Elle nous a permis de construire une application monopage avec des transitions fluides tout en écrivant le back-end comme une application Laravel normale, sans API REST séparée à concevoir, versionner et maintenir synchronisée.
C'est ce choix qui a permis à une équipe de cinq personnes d'avancer vite. Inertia fait le pont entre le back et le front, si bien qu'un contrôleur renvoie les données directement à une page Vue, et la frontière dont j'avais la charge (les modèles, les requêtes, les règles d'accès) est restée propre et côté serveur tandis que le front-end restait réactif.


Un système de contenu pour les sentiers
Le cœur du back-end est le schéma. Un sentier (parcours) est relié à de nombreux points d'intérêt et un point d'intérêt peut appartenir à de nombreux sentiers, donc la table de jonction entre eux porte l'ordre de la marche. Chaque point d'intérêt possède ses propres guides audio, photos et faits ; chaque sentier appartient à un thème. Au-dessus du contenu se trouve un modèle de quiz (quiz, questions, réponses) pour les arrêts gamifiés.
Vient ensuite la couche d'engagement, celle qui donne le sentiment d'un produit plutôt que d'un catalogue : favoris et historiques de complétion pour les sentiers comme pour les points d'intérêt, accomplissements avec une table pivot utilisateur, avis, et un système de rôles sous l'ensemble. Bien établir ces relations dès le départ, c'est ça l'architecture ; tout le reste se construit dessus.




Explorateurs et éditeurs, un seul schéma
L'application sert deux publics depuis le même code. Un explorateur parcourt la carte, arpente un sentier, marque des points d'intérêt comme faits, et gagne des accomplissements. Un éditeur (un acteur culturel local) crée et édite des sentiers et des points d'intérêt à l'aide de formulaires guidés, avec ses propres flux de création et de suppression.
Cette séparation est imposée par l'accès basé sur les rôles. Les routes des favoris, du tableau de bord, des accomplissements et de l'édition sont protégées par un middleware de rôle, si bien que la même application expose en toute sécurité une expérience publique et la boîte à outils d'un contributeur sans que l'une déborde sur l'autre.


Planifier de vrais itinéraires de marche
Les cartes interactives tournent sur MapLibre, et les sentiers eux-mêmes sont de vrais itinéraires, ce qui implique une planification d'itinéraire entre les points d'intérêt. Nous avons utilisé OpenRouteService pour cela via son API publique, en l'appelant depuis le flux d'édition pour planifier un itinéraire au fur et à mesure qu'un sentier était construit. Auto-héberger le moteur était la suite logique, que nous avons signalée pour un vrai déploiement, afin d'échapper aux limites de débit publiques et de lever toute contrainte sur cette planification.


Une application web full-stack en ligne et déployée sur sentiers-culturels-vaud.ch, construite sur Laravel, Inertia et Vue avec une base de données MySQL.
Un riche modèle de données relationnel et un système de contenu basé sur les rôles qui permet aux acteurs locaux de publier leurs propres sentiers, et pas seulement un catalogue fixe contrôlé par l'équipe.
Une cartographie interactive et une planification d'itinéraire entre les points d'intérêt, construites sur MapLibre et OpenRouteService, avec l'auto-hébergement du moteur de routage signalé comme l'étape suivante pour un déploiement en production.
C'est le projet qui m'a appris que le back-end, c'est surtout de la modélisation de données. Les semaines passées à bien établir les relations (sentiers vers points d'intérêt, la couche d'engagement, le système de rôles) sont ce qui a permis au reste de la construction d'avancer vite, et les parties brouillonnes, plus tard, se trouvaient presque toujours là où le modèle avait été trop lâche. Choisir Inertia plutôt qu'une API séparée était le choix pragmatique que je referais : il a échangé un peu de mise en place contre beaucoup moins de friction par la suite.







