« CinéFouine » — application mobile de recommandation de films et de quiz, conçue dans le cadre du projet final de 5e année IRC à CPE Lyon. Côté mobile, une app Flutter ; côté serveur, une dizaine de microservices .NET et un service Python dédié aux recommandations.
Le projet
Projet de groupe. L’application propose à l’utilisateur des films personnalisés selon ses préférences et son historique, des quiz sur le cinéma en temps réel, des badges de progression, un contenu quotidien et un fil d’évènements. Chaque domaine fonctionnel (auth, utilisateurs, films, quiz, badges, recommandations, notifications…) vit dans son propre service, et un ESB relie le tout.
Aperçus de l’interface

Recherche par titre et fiche film — note, acteurs, commentaires et accès au quiz.
Ce sur quoi j’ai travaillé
- App mobile Flutter (
cinefouine) — navigationauto_route, état avec Riverpod, modèles immuables via Freezed, appels HTTP via Dio, écoute temps réel des quiz via SignalR. - Microservices .NET 8 — MovieMS, QuizzMS, ms-auth, ms-badge, ms-recommend-net : ASP.NET Core Web API + EF Core + PostgreSQL, doc Swagger.
- Recommandation ML — service Python (Flask + pandas + scikit-learn) avec deux moteurs : recommandation par profil utilisateur et par genres.
- Quiz temps réel — Hubs SignalR côté .NET, client
signalr_netcorecôté Flutter, sessions multi-joueurs. - ESB & messaging — ActiveMQ (Apache.NMS) pour découpler producteurs et consommateurs d’évènements entre services.
La stack
Flutter / Dart côté mobile (Riverpod, auto_route, Dio, Freezed, SignalR). .NET 8
- ASP.NET Core + EF Core + PostgreSQL côté API. Python + Flask + scikit-learn pour la couche ML. ActiveMQ pour le bus. Docker et Swagger en transverse.
Ce que j’en ai retenu
Trois grandes leçons.
D’abord, dès qu’une app mobile parle à six services différents, le contrat d’API doit être clair et stable. Un petit changement côté serveur, et c’est toute l’app qui casse.
Ensuite, le temps réel change la façon de penser. Pour afficher une liste de films, un appel REST suffit. Pour un quiz multi-joueurs où chacun voit la réponse des autres en direct, il faut des websockets (SignalR). Ce sont deux outils différents pour deux besoins différents — pas deux options interchangeables.
Enfin, la reco est écrite en Python plutôt qu’en .NET, parce que pandas et scikit-learn font le travail en quelques lignes. Choisir le bon langage pour la bonne tâche, même si ça complique un peu le déploiement.