Galsen Basket Pro : Quand la passion rencontre le code
Comment on a transformé une frustration de fan en solution tech pour tout l'écosystème basket sénégalais
Le déclic : Pourquoi c'est si galère de suivre notre championnat ?
Imaginez la scène : vous êtes passionné de basket, vous voulez suivre les performances de l'AS Douanes ou du GBA, et vous vous retrouvez à naviguer entre des posts Facebook éparpillés, des captures d'écran floues de classements, et des groupes WhatsApp où l'info se noie dans les débats.
C'était notre réalité depuis des années😤.
Le basket sénégalais méritait mieux. Nos joueurs, nos clubs, nos fans méritaient une expérience digne de ce sport qu'on aime tant. Alors on a arrêté de râler et on a codé.
L'équipe : Quand les bonnes personnes se rencontrent au bon moment
Oumar Fall (c'est moi 👋 “di leen ziar😁 jajëuf waay”) - Lead Dev Mobile et Product Owner de Galsen Basket Pro. Mobile developer passionné, obsédé par l'UI/UX et les animations fluides😁. Quand je ne code pas, je regarde des matchs Basket ou “fait du Taxawalou wala …. 😅”.
Moustapha Mangane - Backend Architect
Le maestro Laravel qui transforme nos idées en APIs robustes. Capable de modéliser une base de données complexe entre deux Tasse cafés Touba😅.
Moushab Diey - Dev Mobile /DevOps & CI/CD
Notre sauveur silencieux. Grâce à lui, nos deploiments se font sans stress et nos build ne nous réveillent plus la nuit.
Notre Master Mor Dieng Ndiaye - Tech Mentor
La voix de la sagesse qui nous rappelle les bonnes pratiques quand on veut tout faire en mode "quick et dirty".
Les premières décisions : Poser les bonnes bases
Avant même d'écrire la première ligne de code, on s'est posé les vraies questions :
Quelle technologie pour toucher le maximum d'utilisateurs ?
Comment structurer le code pour qu'il reste maintenable ?
Quels partenariats nouer pour avoir les bonnes données ?
Mais ce qui fait vraiment la différence dans cette équipe, c'est qu'on a nos bases sur chaque technologie choisie. Pour ne pas dire qu'on est des experts 😂, mais disons qu'on maîtrise nos outils. Ce qui nous a permis d'aller super vite, vu qu'on codait les weekends ou la nuit... ou quand j'embêtais Moustapha et Moushab avec mes "petites idées" de dernière minute 😂
"Serigne Oumar, ñu baayi baa souba dina ko daur vite fait 😂" Moustapha, probablement 50 fois.
Stack technique : Les choix qui nous ont portés
Frontend Mobile : Flutter + Riverpod
/// Notre philosophie : du code propre, des animations fluides
class TeamStandingsWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final standings = ref.watch(standingsProvider);
return standings.when(
data: (teams) => AnimatedList(
children: teams.map((team) => TeamCard(team)).toList(),
),
loading: () => ShimmerLoading(),
error: (error, _) => RetryWidget(),
);
}
}
Pourquoi Flutter ? Performance native, une seule codebase pour iOS et Android, et une communauté incroyable. Plus besoin de choisir entre développer pour iPhone ou Android.
Pourquoi Riverpod ? Finies les galères de gestion d'état. Le code reste lisible même quand l'app grandit.
Backend : Laravel, parce que ça marche
Moustapha avait déjà une solide expérience Laravel, et franchement, pourquoi réinventer la roue ? En quelques semaines, on avait :
Une API REST complète
Un back-office pour gérer les matchs
Un système d'authentification robuste
Des notifications push automatisées
Architecture : Feature-First, notre adaptation
lib/
├── common/
├── features/
│ ├── teams/
│ ├── players/
│ ├── matchs/
│ └── New/
├── routing/
└── Localization/
Pas de Clean Architecture complexe. On voulait un code que n'importe qui dans l'équipe puisse comprendre et modifier rapidement.
Monitoring: Sentry + Firebase Analytics
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await dotenv.load(fileName: '.env');
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
]).then((value) async => await SentryFlutter.init(
(options) {
options.dsn = Constant.sentryDSN;
options.tracesSampleRate = 1.0;
},
appRunner: () => runApp(ProviderScope(
observers: [Observers()],
child: const MyApp(),
)),
));
La réalité du développement : Entre galères et petites victoires
Développer une application, c'est pas juste du code. C'est aussi naviguer entre les défis techniques, les contraintes business, et les attentes utilisateurs. Laisse-moi te raconter nos vrais combats.
Les défis qu'on a surmontés
1. La collecte de données
Le problème : Pas d'API officielle de la FSBB, données éparpillées.
Notre solution : Partenariat direct avec les clubs + système de saisie simplifié pour les scoreurs.
2. L'engagement utilisateur
Le problème : Comment fidéliser dans un marché où les apps locales peinent ?
Notre solution : Notifications push (pas de spam !), interface en intuitive, et fonctionnalité qui résolvent de vrais problèmes.
3. Performance sur les smartphones d'entrée de gamme
Le problème : Beaucoup d'utilisateurs ont des téléphones avec peu de RAM.
Notre solution : Optimisation poussée, cache intelligent, images compressées, lazy loading partout.
Les fonctionnalités qui font la différence
Résultats des matchs
Statistiques personnalisées
Interface intuitive
Notifications intelligentes
Actualités du championnat
voir démo 😁😁
Chiffres et impact (3 mois après le lancement)
1,300+ téléchargements (800 iOS, 500+ Android)
85% de rétention à 7 jours
3+ articles de presse générés via notre plateforme
Note moyenne 4.7/5 sur les stores
téléchargements
Mais le plus beau ? Les messages qu'on reçoit :
"très bonne appli tt simplement j recommande ça à tt les amateurs d basket sénégalais"
"Super App pour nous les amateurs du basket Sénégalais • I like it ♥️❣️❤️"
"rapide et fluide"
Du code qui raconte une histoire
Bon, parlons technique maintenant. Parce qu'au-delà des belles paroles, c'est dans le code que ça se joue vraiment.
Code samples : Les petits détails qui comptent
Animation custom pour les scores
class ScoreAnimation extends StatefulWidget {
final int score;
final Color teamColor;
@override
_ScoreAnimationState createState() => _ScoreAnimationState();
}
class _ScoreAnimationState extends State<ScoreAnimation>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _scaleAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: Duration(milliseconds: 600),
vsync: this,
);
_scaleAnimation = Tween<double>(
begin: 1.0,
end: 1.3,
).animate(CurvedAnimation(
parent: _controller,
curve: Curves.elasticOut,
));
}
@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _scaleAnimation,
builder: (context, child) {
return Transform.scale(
scale: _scaleAnimation.value,
child: Text(
'${widget.score}',
style: TextStyle(
fontSize: 32,
fontWeight: FontWeight.bold,
color: widget.teamColor,
),
),
);
},
);
}
void animateScore() {
_controller.forward().then((_) {
_controller.reverse();
});
}
}
Provider pattern pour les données temps réel
final liveMatchProvider = StreamProvider.autoDispose<Match>((ref) {
final matchId = ref.watch(currentMatchIdProvider);
return ref.read(websocketServiceProvider)
.getMatchStream(matchId)
.map((data) => Match.fromJson(data));
});
Retour d'expérience : Ce qu'on a appris en chemin
Après 6 mois sur ce projet, on a accumulé pas mal de leçons. Certaines évidentes, d'autres plus surprenantes. Voici notre bilan transparent.Ce qu'on referait différemment
Tests unitaires dès le début : pas encors, mais ça aurait évité quelques bugs embarrassants
Design system plus tôt : On a refactorisé 3 fois nos composants UI
Feedback utilisateur plus fréquent : On codait parfois dans notre bulle
Ce qui a marché fort
MVP rapide : 3 mois pour la v1, puis itérations hebdomadaires
CI/CD robuste : Merci Moushab “borom CI/CD 😎“, zéro stress en production
L'avenir : On ne fait que commencer
Galsen Basket Pro aujourd'hui, c'est cool. Mais ce qu'on prépare pour demain, ça va être dingue.
Laisse-moi te donner un aperçu de ce qui nous attend...
Roadmap 2025-2027 : On ne s'arrête pas là
Court terme (Q2 2025)
Statistiques avancées : Efficacité au tir, +/-, PIR détaillé
Classement du championnat
Moyen terme (fin 2025)
API publique : Permettre à d'autres développeur de créer des outils
Live streaming : Partenariat avec les diffuseurs
Long terme (2026-2027)
Expansion régionale : Mali, Burkina, Côte d'Ivoire…. 😎
Plateforme de recrutement : Connecter joueurs et clubs
E-commerce : Boutique officielle des clubs
Gestion Ticketing: Pour les matchs
IA prédictive : Algorithmes de prédiction de matchs
Fantasy League : Créez votre équipe virtuelle
Message à la communauté tech africaine
Si tu es développeur en Afrique et que tu lis ces lignes, sache que ce projet nous a prouvé quelque chose d'important : on peut créer des solutions de qualité mondiale depuis chez nous, pour résoudre nos propres problèmes.
Pas besoin d'aller chercher l'inspiration dans la Silicon Valley. Nos défis locaux sont nos plus grandes opportunités.
Stack recommendations pour des projets similaires :
Mobile: Flutter + Riverpod/Bloc
Backend: Laravel/Django + PostgreSQL
CI/CD: Codemagic/GitHub Actions
Monitoring: Sentry + Firebase Analytics
Design: Figma + Flutter Inspector
Tips pour les développeurs qui se lancent :
Résolvez un vrai problème que vous vivez personnellement
Commencez petit, itérez vite
Impliquez les utilisateurs dès les premières versions
Documentez votre code: votre vous de demain vous remerciera
Célébrez les petites victoires 🎉
Remerciements
Merci à tous ceux qui nous ont soutenus :
Les premiers utilisateurs qui ont testé nos versions bugguées
Nos familles qui supportent nos nuits de code 😅
en wolof “maagui sant sama ñari waadiour 😅”
Galsen Basket Pro, c'est plus qu'une app. C'est la preuve que quand la passion rencontre le code, on peut changer les choses.
Téléchargez l'app, suivez notre aventure, et si vous avez des idées ou envie de rejoindre l'équipe, contactez-nous !
#GalsenBasketPro #FlutterDev #MadeInSenegal #Basketball #TechAfricaine
Oumar Fall - Lead Developer @Galsen Basket Pro
Du lourd Good Job !
Le meilleur reste à venir