SHELTER
Jeu mobile narratif de survie à choix binaires dans un univers post-apocalyptique.
Application complète React Native + API TypeScript




Présentation du projet
Shelter est un jeu mobile narratif de survie dans un univers post-apocalyptique, basé sur un système de choix binaires impactant directement la progression du scénario et l’état du personnage (faim, moral, santé, sécurité, nourriture).
Né d’un projet collaboratif, le jeu a été entièrement repris et reconstruit en V2 en solo : passage à TypeScript de bout en bout, refonte du backend autour de Prisma + PostgreSQL, mise en place d’une authentification JWT avec Google Sign-In, et ajout d’un ensemble de fonctionnalités produit (succès, classement, parrainage, premium, publicités récompensées).
Architecture technique
Stack full TypeScript, séparation stricte client / serveur, logique de jeu côté backend pour garder une source de vérité unique.
Frontend
React Native · Expo SDK 54 · TypeScript
- Redux Toolkit + redux-persist
- React Navigation (stack + tabs)
- Expo AV / Haptics / Updates
- Google Sign-In · AdMob
- fetchWithAuth (refresh token auto)
Backend
Node · Express · TypeScript
- Modules : auth · users · games · achievements · feedbacks
- JWT + refresh token · Google OAuth
- Helmet · CORS · rate limit
- json-rules-engine (logique de jeu)
- Cache cartes en mémoire
- Tests Jest + Supertest
Base de données
PostgreSQL · Prisma ORM
- Users · Games · Cards · Achievements
- Referrals (système de parrainage)
- Feedbacks · UserAchievements
- Migrations versionnées
- Seed reproductible
Mon rôle dans le projet
Refonte complète en V2
Reprise du projet collaboratif initial et reconstruction de zéro côté backend, avec migration JavaScript vers TypeScript et MongoDB vers PostgreSQL via Prisma.
API REST modulaire
Architecture Express découpée par domaine (auth, users, games, achievements, feedbacks) avec services, routes et middlewares isolés pour faciliter les évolutions et les tests.
Authentification et sécurité
JWT avec refresh token, Google Sign-In, hash bcrypt, Helmet, CORS strict et rate limiting différencié sur les routes sensibles et générales.
Moteur de jeu côté serveur
Logique de partie (cartes, scénarios, jauges, jours) pilotée par json-rules-engine, avec un cache cartes en mémoire pour éviter une requête DB à chaque tour.
App React Native (Expo)
Navigation typée, state global Redux Toolkit + redux-persist, écrans auth / jeu / profil / classement / boutique / succès, gestion son et haptique, animations et sliders custom.
Monétisation et rétention
Intégration AdMob (publicités récompensées), achat premium via Google Play, système de parrainage, progression XP / niveaux et succès débloquables côté serveur.
Tests et déploiement
Tests d’API avec Jest + Supertest, build mobile via EAS et préparation du test fermé sur Google Play Console.
Fonctionnalités clés
Auth JWT + Google
Connexion email / mot de passe ou Google Sign-In, tokens JWT avec refresh token persistés côté client et révoqués côté serveur.
Moteur de jeu typé
Cartes, scénarios et jauges (faim, moral, santé, sécurité, nourriture) gérés côté serveur via json-rules-engine pour empêcher toute triche client.
Classement global
Leaderboard temps réel basé sur le meilleur score, avec positionnement du joueur et pagination côté API.
Succès et progression
Système de succès débloquables, XP et niveaux calculés côté serveur, restitués dans l’app et persistés en base.
Premium et parrainage
Achat premium via Google Play (vérification du purchase token), codes parrain uniques et suivi des parties des filleuls.
Pubs récompensées
Intégration React Native Google Mobile Ads pour proposer des bonus en partie, désactivées pour les joueurs premium.
Sécurité API
Helmet, CORS restreint, rate limiting (10 req / 15 min sur auth, 100 sur les routes générales) et middleware d’erreurs centralisé.
Reprise de partie
Une partie en cours par utilisateur, sauvegardée côté serveur (cartes utilisées, jauges, jour, scénarios actifs) et reprise depuis n’importe quel appareil.
Ce que j’ai appris
Penser une API en modules par domaine (auth, users, games, achievements, feedbacks) rend le code plus lisible, plus testable et limite les régressions quand de nouvelles fonctionnalités arrivent.
Déplacer la logique de jeu côté serveur (cartes, jauges, succès) et n’exposer au client que des actions à valider évite la triche et garde une seule source de vérité.
Migrer de MongoDB à PostgreSQL via Prisma m’a appris à modéliser sérieusement les relations (User, Game, Card, parrainages, succès) et à m’appuyer sur les migrations pour faire évoluer la base sans tout casser.
Sécuriser une API publique demande plus que du JWT : Helmet, CORS strict, rate limiting différencié, gestion centralisée des erreurs et vérification serveur des achats Google Play.
Sortir une app mobile en production (build EAS, signing, test fermé Google Play, AdMob, Google Sign-In) implique autant de travail de configuration et de conformité que de code applicatif.
Un projet similaire en tête ?
Je suis disponible pour échanger autour de vos idées ou pour discuter d’une collaboration.