Awlak Benjah
Suivi de diplôme et de moyenne fonctionnant hors ligne, construit en monorepo Turborepo associant une application Expo React Native et une vitrine Astro.
Aperçu de l'architecture
graph TB
subgraph Monorepo["Turborepo + pnpm workspaces"]
A["apps/mobile<br/>Expo SDK 57"]
B["apps/showcase<br/>Astro + Tailwind"]
C["packages/typescript-config"]
D["packages/oxlint-config"]
end
subgraph Appareil["Sur l'appareil"]
E["expo-sqlite"]
F["Drizzle ORM"]
G["Store Zustand"]
end
A --> E
F --> E
A --> G
C --> A & B
D --> A & B
B --> H["Cloudflare Pages"]
Un suivi de diplôme et de moyenne qui conserve chaque calcul sur l'appareil. L'étudiant modélise son cursus en semestres et en cours, saisit ses notes au fur et à mesure, et voit la moyenne se recalculer sans compte ni appel réseau.
Le dépôt est un monorepo Turborepo sur des workspaces pnpm : l'application Expo et la page vitrine Astro partagent une base TypeScript stricte et une seule configuration oxlint, et chaque tâche passe par le cache de Turbo.
Fonctionnalités clés :
- Modèle de données entièrement hors ligne via
expo-sqliteet Drizzle ORM - Hiérarchie diplôme, semestre et cours avec surcharges de maquette par cursus
- Calcul continu de la moyenne et du statut des notes, avec graphiques de progression
- Sauvegardes multiples pour suivre plusieurs plans de diplôme en parallèle
- Interface localisée avec i18next et détection de la langue de l'appareil
- Édition par bottom sheet avec retour haptique et animations Lottie
- Vitrine Astro statique déployée séparément de l'application
Stack technique :
- Mobile : Expo SDK 57, React Native, Expo Router, TypeScript
- Données : Drizzle ORM, expo-sqlite, Zustand, TanStack Query
- UI : HeroUI Native, Uniwind, Tailwind CSS, react-native-gifted-charts
- Vitrine : Astro, Tailwind CSS, astro-icon, Cloudflare
- Outillage : Turborepo, pnpm, oxlint, dependency-cruiser, Vitest, Zod
Un premier prototype web de la même idée avait été livré en React et Supabase avant que le projet ne bascule vers une architecture native, hors ligne d'abord.