← Back to portfolio
Symfony Twitch Docker Chart.js API

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

How does a call work?

A free 30-minute intro call to understand your context and see if we're a good fit.

  1. Pick a slot

    Choose a time that works for you on Calendly. You'll receive a confirmation email.

  2. Scoping conversation

    We review your project, technical constraints, timeline and priorities together.

  3. Next steps

    You leave with concrete options: feasibility, technical approach and possible ways to work together.

Duration 30 minutes

No commitment. The goal is to confirm whether I'm the right person for your needs.

Pick a slot