Architecture
Structure du projet
L'arborescence du monorepo Vantablvck, dossier par dossier.
Le projet est un monorepo Nx sur Bun. Les applications vivent dans apps, les briques partagées dans packages.
Arborescence
vantablvck/
├── apps/
│ ├── web/ # Next.js App Router, la PWA (client web-first)
│ ├── server/ # Elysia (Bun), API et montage de l'auth
│ ├── native/ # Expo, application mobile (gelée)
│ └── fumadocs/ # Site de documentation
├── packages/
│ ├── db/ # Drizzle : schéma, migrations, accès PostgreSQL
│ ├── core/ # Logique métier pure, testée en isolation
│ ├── auth/ # Configuration Better Auth partagée
│ ├── ui/ # Composants partagés, coss et Base UI
│ ├── env/ # Validation des variables d'environnement (Zod)
│ └── config/ # Configuration TypeScript partagée
├── docs/ # Documentation interne (hors site public)
├── CLAUDE.md # Garde-fous rechargés à chaque session
├── progress.md # État vivant du projet
├── docker-compose.yml # PostgreSQL et services
├── biome.json # Lint et format
├── nx.json # Orchestration Nx
└── package.json # Workspaces BunLe détail par dossier
apps
| Dossier | Contenu |
|---|---|
web | Le client web Next.js, cible principale, servi comme PWA. Contient le manifest, les pages, les composants d'interface. |
server | L'API Elysia. Aujourd'hui, montage de l'authentification. Demain, les modules métier et le plugin de sécurité. |
native | L'application Expo, gelée. L'authentification y est déjà câblée, aucune feature métier n'y est développée pour le MVP. |
fumadocs | Ce site de documentation, en Next.js et MDX. |
packages
| Dossier | Contenu |
|---|---|
db | Le schéma Drizzle découpé par domaine, les migrations, et le client PostgreSQL. |
core | La logique métier pure, sans dépendance à un framework, testable directement sur le runner Bun. |
auth | La configuration Better Auth, partagée entre le serveur et les clients. |
ui | Les composants d'interface partagés, construits sur coss et Base UI. |
env | La validation des variables d'environnement avec Zod, une source de vérité par cible (serveur, web, natif). |
config | La configuration TypeScript de base, étendue par chaque package. |
Conventions de frontières
Les frontières entre modules sont explicites. Un module ne fait pas de jointure sauvage dans le domaine d'un autre, ce qui permettra plus tard de séparer des services ou d'introduire une fédération sans tout réécrire. Les routes délèguent aux services, les services passent par les repositories Drizzle, jamais l'inverse.