Monodyssée — Solidarity web platform
Web platform for a 7,800 km bike tour across Europe streamed on Twitch — solidarity landing page, live bingo and trip statistics.
Monodyssée is a 7,800 km bike tour across Europe over 4 months, streamed daily on Twitch by Mono. The goal: raise funds for the French Cancer League and raise awareness about the cause, especially support for caregivers. Every live day, a community of viewers follows the adventure, donates and takes part in interactive activities. I designed and deployed the web platform supporting this operation: project showcase, chat engagement tools and trip statistics dashboard.
My role
Full-stack development of the Symfony application hosted in production behind nginx, from feature design to Docker infrastructure and deployment scripts.
Key highlights
- Live site at monodyssee.fr
- Real-time collaborative bingo for hundreds of Twitch viewers
- Trip statistics over 121 streaming days and 7,800 km
- Containerised stack with deployment and automated bootstrap scripts
Tech stack
- PHP 8.4, Symfony 7.4, strict typing PHPStan max level
- Doctrine ORM 3, versioned migrations, EasyAdmin
- Twitch OAuth (custom authenticator), Steam OpenID
- Dedicated cache for bingo state (grids, bans, activity)
- Docker Compose (dev + prod), MySQL 8, Elasticsearch, nginx
- Twig, custom CSS, Chart.js, HTMX
Third-party integrations
- Twitch OAuth — bingo participant authentication (CSRF state, user provisioning, dedicated session)
- External leaderboard API — solidarity team rankings
- Steam OpenID — personal modules (game calendar, friends list, wishlist)
Front-office (enterprises)
- Solidarity landing page — trip and cause presentation with links to the fundraiser, Twitch and live bingo (SEO and accessibility)
- Live bingo — unique daily grid (25 cells), regenerated at midnight (Europe/Paris timezone), Twitch account login
- Live bingo — collaborative REST API (/bingoBot/api/state, /bingoBot/api/toggle) to toggle cells in real time
- Live bingo — moderation (temporary player exclusion), activity log, cached state with versioning
- Trip statistics — 7,800 km progress profile (elevation), daily viewers, cumulative watch hours (Chart.js)
- Solidarity leaderboard — external leaderboard API integration for fundraising teams
Back-office (administration)
- EasyAdmin — application entity management
Major contributions
- Modular backend architecture — services, typed DTOs, Doctrine repositories
- Twitch OAuth integration — full flow for bingo participant authentication
- Production deployment — standalone Docker stack, database secret rotation, nginx reverse proxy
- Responsive interface — Monodyssée branding (orange ribbon, Cancer League identity)
- Multi-context application — host-based routing (monodyssee.fr) for the public site and internal modules on the same codebase
Challenges
- Shared live state — collaborative bingo where hundreds of viewers edit the same grid without conflicts, with daily invalidation and abuse handling
- Frictionless Twitch authentication — full OAuth flow (CSRF state, user provisioning, dedicated bingo session)
- Production deployment — containerised stack behind nginx, generated database secrets, diagnostic and automated bootstrap scripts
- Context separation — single Symfony codebase for the public Monodyssée site and internal tools, with host matchers and distinct security firewalls