TKD Strike.

( 01 )
Athlète de taekwondo exécutant un coup de pied en dojang

Overview

TKD Strike est une application mobile de fitness spécialisée taekwondo, construite en solo de l'API jusqu'au build natif Android.

129+ exercices organisés par catégorie avec filtres multicritères. Playlists personnalisables en drag-and-drop. Programmes structurés sur 7 jours. Sessions avec timer intégré, mode répétitions et maintien de l'écran actif pendant l'entraînement. Stats de progression : streak quotidien et taux de maîtrise par exercice. Auth complète avec onboarding en 3 étapes.

Distribuée en beta EAS Android depuis avril 2026. Build iOS non encore soumis à l'App Store.

Development

Architecture

Frontend et backend entièrement séparés dès le départ — deux dépôts, deux déploiements, une auth partagée via Clerk.

Frontend — React Native + Expo

  • React Native 0.81.5 + Expo 54, Expo Router pour la navigation
  • NativeWind pour le styling (Tailwind sur mobile)
  • TanStack Query v5 — cache, requêtes infinies, pagination cursor-based
  • Zustand pour l'état global
  • React Hook Form + Zod pour les formulaires et la validation
  • expo-keep-awake — maintien écran actif pendant les sessions
  • Sentry — monitoring erreurs côté client

Backend — Node.js + Express

  • Express + MongoDB + Mongoose
  • Clerk Express pour l'auth — token partagé avec le frontend
  • Zod — validation des payloads, schémas partagés avec le frontend
  • Swagger/OpenAPI — documentation auto-générée
  • Morgan + Winston — logging structuré
  • Helmet + rate limiting — sécurité basique
  • Jest + Supertest — tests d'intégration sur les routes
  • Sentry — monitoring erreurs côté serveur

Décisions techniques notables

  • Cursor-based pagination : sur les sessions et les listes d'exercices pour maintenir les performances sans offset instable.
  • Validation Zod partagée : les schémas de validation sont définis une fois et importés dans les deux couches — zéro désynchronisation.
  • expo-keep-awake : activé uniquement pendant une session active, désactivé dès que l'utilisateur quitte l'écran d'exercice.
  • Assets externalisés : images via Cloudinary, vidéos via YouTube — pas de stockage binaire dans MongoDB.

Outcome & Results

Beta Android — avril 2026

Build distribué via EAS Build (Expo Application Services). Distribution manuelle APK en beta fermée.

Bugs résolus en beta

  • Crash useSessionStreak : après suppression de compte + reconnexion OAuth, le hook crashait sur les données paginées → fix query.data?.pages?.flatMap() avec guard.
  • Écran en veille : l'écran se coupait pendant les exercices timer → intégration expo-keep-awake avec activation/désactivation selon le focus de l'écran.
  • Validation backend insuffisante : repsDone sans limite max, durationSec: 0 accepté comme valeur valide, exerciseId non vérifié en base → trois fixes Zod + vérification existence en DB.

Dette technique identifiée

Identifiée pendant la beta, prise en charge en cours — pas ignorée.

  • run.tsx (~900 lignes) → découpage en sous-composants en cours
  • 526 inline styles → migration progressive vers StyleSheet.create en cours
  • useProfileScreen.ts → hook trop large, à splitter en hooks ciblés