Réseau social mobile d'objectifs et d'exploits personnels
Peak est une application mobile de réseau social centrée sur la définition, le suivi et le partage d'objectifs personnels. Le concept part d'un constat simple : les réseaux sociaux classiques valorisent l'image et l'instantané, mais aucun ne met en avant la progression personnelle sur le long terme.
Peak propose une alternative où chaque utilisateur définit des "exploits" — des objectifs concrets répartis dans 12 catégories de vie (Sport, Carrière, Voyage, Créativité, Santé, etc.) — et documente sa progression à travers des publications photo/vidéo. Le fil d'actualité ne montre pas ce que les gens consomment, mais ce qu'ils construisent.
| Module | Description |
|---|---|
| Exploits | CRUD complet, 12 catégories, durées flexibles, difficulté 1-5, progression automatique calculée sur les sous-objectifs |
| Sous-objectifs | Milestones ordonnés avec complétion individuelle, recalcul automatique du pourcentage parent |
| Publications | Posts photo/vidéo (jusqu'à 10 médias), carrousel, lightbox plein écran, compression automatique |
| Feed | Double fil "Abonnements" et "Explorer", pagination infinie, pull-to-refresh |
| Social | Follow/unfollow, profils publics, recherche d'utilisateurs |
| Messagerie | Conversations temps réel via WebSocket, partage de médias, indicateur de lecture |
| Notifications | Push notifications (follows, likes, commentaires, messages), badges |
| Vidéo récap | Compilation automatique des posts d'un exploit complété via FFmpeg natif |
| i18n | Français et Anglais (~230 clés), détection automatique de la langue |
| Hors-ligne | Détection de connectivité, cache local, synchronisation au retour |
| Couche | Technologies |
|---|---|
| Framework | React Native 0.81 + Expo SDK 54 |
| Langage | TypeScript 5.9 (mode strict) |
| Navigation | Expo Router 6 (file-based routing) |
| State | React Context + TanStack React Query 5 |
| Backend | Supabase (PostgreSQL, Auth, Storage, Realtime) |
| Validation | Zod (20+ schémas runtime) |
| Monitoring | Sentry + Amplitude |
| Tests | Jest + Testing Library + Detox (E2E) |
| CI/Build | EAS Build (Expo Application Services) |
peak/
├── app/ # Routes (Expo Router, file-based)
│ ├── (auth)/ # Groupe auth (login, register)
│ ├── (tabs)/ # Navigation par onglets (5 tabs)
│ ├── goal/ # CRUD objectifs
│ ├── post/ # CRUD posts
│ ├── messages/ # Messagerie
│ └── settings/ # Paramètres
├── components/ # ~50 composants réutilisables
├── services/ # 22 services (logique métier + Supabase)
├── hooks/ # 18 hooks custom
├── contexts/ # 3 providers (Auth, Theme, Network)
├── types/ # Modèles TypeScript
├── lib/ # Clients (Supabase, Sentry, QueryClient)
├── i18n/ # Traductions (fr.json, en.json)
├── supabase/ # 26 migrations SQL
└── scripts/ # 20+ scripts de migration et seeding
Patterns clés :
14 tables PostgreSQL avec Row Level Security (RLS) sur chaque table :
users — Profils avec username unique, avatar, biogoals + sub_goals — Objectifs et sous-objectifs ordonnésposts + post_media — Publications multi-médiasfollows — Graphe sociallikes + comments — Interactions socialesconversations + messages — Messagerie temps réelnotifications — Notifications typées3 buckets de stockage : avatars, posts, recap-videos.
Avant : ~80 requêtes par chargement (problème N+1)
Après : 1 à 3 requêtes grâce à des fonctions SQL, du batching et de l'eager loading
| Défi | Solution |
|---|---|
| Performance du feed (N+1) | Fonctions SQL, vues optimisées et batching |
| Gestion des médias multi-formats | Pipeline de compression, validation MIME, quotas d'upload |
| Internationalisation complète | Système i18n custom avec contexte React, 230 clés structurées |
| Temps réel pour la messagerie | Supabase Realtime avec subscriptions WebSocket |
| UX hors-ligne | NetworkContext + cache AsyncStorage + sync au retour |