← Retour au portfolio
Symfony Twitch Docker Chart.js API

Monodyssée — Plateforme web solidaire

Plateforme web pour un tour d'Europe à vélo de 7 800 km streamé sur Twitch — vitrine solidaire, bingo du live et statistiques du voyage.

La Monodyssée est un tour d'Europe à vélo de 7 800 km sur 4 mois, streamé quotidiennement sur Twitch par Mono. L'objectif : lever des fonds pour la Ligue contre le cancer et sensibiliser à la cause, notamment l'accompagnement des aidant·es. Chaque jour de live, une communauté de viewers suit l'aventure, fait des dons et participe à des animations interactives. J'ai conçu et déployé la plateforme web qui soutient cette opération : vitrine du projet, outils d'engagement du tchat et tableau de bord des statistiques du voyage.

Mon rôle

Développement full-stack de l'application Symfony hébergée en production derrière nginx, de la conception des fonctionnalités à l'infrastructure Docker et aux scripts de déploiement.

Points clés

  • Site en production sur monodyssee.fr
  • Bingo collaboratif en temps réel pour des centaines de viewers Twitch
  • Statistiques du voyage sur 121 jours de stream et 7 800 km
  • Stack conteneurisée avec scripts de déploiement et bootstrap automatisés

Stack technique

  • PHP 8.4, Symfony 7.4, typage strict PHPStan niveau max
  • Doctrine ORM 3, migrations versionnées, EasyAdmin
  • Twitch OAuth (authenticator custom), Steam OpenID
  • Cache dédié pour l'état du bingo (grilles, bans, activité)
  • Docker Compose (dev + prod), MySQL 8, Elasticsearch, nginx
  • Twig, CSS custom, Chart.js, HTMX

Intégrations tierces

  • Twitch OAuth — authentification des participants au bingo (state CSRF, provisioning utilisateur, session dédiée)
  • API externe de leaderboard — classement des équipes solidaires
  • Steam OpenID — modules personnels (calendrier de jeux, liste d'amis, wishlist)

Front-office (entreprises)

  • Vitrine solidaire — présentation du périple, de la cause et liens vers la cagnotte, Twitch et le bingo du live (SEO et accessibilité)
  • Bingo du live — grille unique quotidienne (25 cases), régénérée à minuit (fuseau Europe/Paris), connexion via compte Twitch
  • Bingo du live — API REST collaborative (/bingoBot/api/state, /bingoBot/api/toggle) pour cocher/décocher les cases en temps réel
  • Bingo du live — modération (exclusion temporaire d'un joueur), journal d'activité, état persisté en cache avec versioning
  • Statistiques du voyage — profil de progression sur 7 800 km (dénivelé), viewers quotidiens, heures vues cumulées (Chart.js)
  • Classement solidaire — intégration d'une API externe de leaderboard pour les équipes participantes à la collecte

Back-office (administration)

  • EasyAdmin — gestion des entités de l'application

Développements majeurs

  • Architecture backend modulaire — services, DTO typés, repositories Doctrine
  • Intégration Twitch OAuth — flux complet pour l'authentification des participants au bingo
  • Mise en production — stack Docker autonome, rotation des secrets BDD, reverse proxy nginx
  • Interface responsive — charte Monodyssée (ruban orange, identité Ligue contre le cancer)
  • Application multi-contexte — routage par host (monodyssee.fr) pour la vitrine publique et modules internes sur la même codebase

Enjeux & défis

  • État partagé en live — bingo collaboratif où des centaines de viewers modifient la même grille sans conflit, avec invalidation journalière et gestion des abus
  • Authentification Twitch sans friction — flux OAuth complet (state CSRF, provisioning utilisateur, session dédiée au bingo)
  • Déploiement production — stack conteneurisée derrière nginx, secrets BDD générés, scripts de diagnostic et bootstrap automatisés
  • Séparation des contextes — une seule codebase Symfony pour le site public Monodyssée et les outils internes, avec matchers de host et firewalls distincts

Comment se déroule un RDV ?

Un premier échange gratuit de 30 minutes pour comprendre votre contexte et voir si nous sommes alignés.

  1. Choix du créneau

    Sélectionnez un horaire qui vous convient directement sur Calendly. Vous recevez une confirmation par e-mail.

  2. Échange de cadrage

    Nous passons en revue votre projet, vos contraintes techniques, votre calendrier et vos priorités.

  3. Prochaines étapes

    Vous repartez avec des pistes concrètes : faisabilité, approche technique et modalités de collaboration possibles.

Durée 30 minutes

Sans engagement. L'objectif est de valider si je suis le bon interlocuteur pour votre besoin.