SHELTER

Jeu mobile narratif de survie à choix binaires dans un univers post-apocalyptique.

Application complète React Native + API TypeScript

TypeScript
React Native
Expo
Redux Toolkit
Node
Express
Prisma
PostgreSQL
JWT
Jest
Menu
Game
GameOver
RecapGame

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.

Mobile

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)
API

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
Data

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.