Documentation PostCards
Guide complet pour développer et déployer sur la plateforme PostCards.
Démarrage rapide
Installez et lancez le projet en 5 minutes
API Backend
Référence complète des fonctions Convex
Architecture
Comprendre la structure du projet
Guide de démarrage
Prérequis
- Node.js ≥ 18
- npm ≥ 9 ou yarn
- Compte Convex
- Compte Clerk
- Compte Stripe (pour les paiements)
Installation
# Cloner le repo
git clone <repo-url>
cd postcards-apps
# Installer les dépendances
npm install
# Configurer l'environnement
cp apps/web/.env.example apps/web/.env.local
cp apps/native/.env.example apps/native/.env
# Lancer le backend
cd packages/backend && npx convex dev
# Dans un autre terminal, lancer le web
cd apps/web && npm run devArchitecture
Vue d'ensemble
PostCards est une plateforme SaaS composée de trois applications principales :
- App Native - React Native + Expo pour iOS et Android
- App Web - Next.js 15 pour le dashboard photographe et portail client
- Backend - Convex pour la logique métier et la base de données
Stack technique
| Couche | Technologie |
|---|---|
| Mobile | React Native + Expo |
| Web | Next.js 15 + React 19 |
| Backend | Convex (serverless) |
| Auth | Clerk |
| Paiements | Stripe Connect |
| Stockage | AWS S3 + CloudFront |
| Push | Firebase Cloud Messaging |
| Wallet | Apple PassKit + Google Pay |
Gestion des Rôles (RBAC)
L'accès aux galeries est géré via la tablegallery_members. Chaque membre se voit attribuer un rôle déterminant ses permissions :
| Rôle | Permissions | Usage |
|---|---|---|
owner | Total | Photographe propriétaire |
collaborator | Gestion | Assistant ou second photographe |
client | Privilégié | Client principal (B2B) |
guest | Lecture | Visiteur public (Lien/QR) |
API Backend
Le backend est entièrement géré par Convex. Consultez les fichiers danspackages/backend/convex/ pour la référence complète.
Fonctions principales
| Fichier | Description |
|---|---|
| galleries.ts | CRUD galeries |
| media.ts | Gestion des médias |
| stripeConnect.ts | Onboarding Stripe |
| escrowPayments.ts | Paiements escrow |
| pushNotifications.ts | Notifications push |
| galleryInvitations.ts | Invitations par email |
| clientSelections.ts | Sélection client |
| clientInvoices.ts | Facturation |
Stripe Connect
Les photographes peuvent recevoir des paiements via Stripe Connect. Le flux d'escrow garantit que les fonds sont bloqués jusqu'à confirmation.
Flux de paiement
- Client autorise le paiement (fonds bloqués)
- Photographe confirme la livraison
- Fonds libérés vers le compte Stripe du photographe
- Timeout 14 jours → libération automatique
Fees
| Partie | Montant |
|---|---|
| Client | Base + 5% |
| Photographe | Base - 15% |
| Plateforme | 20% (5% + 15%) |
Variables d'environnement
Convex Dashboard
CLERK_ISSUER_URL
STRIPE_SECRET_KEY
STRIPE_WEBHOOK_SECRET
STRIPE_CLIENT_ID
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_S3_BUCKET
AWS_CLOUDFRONT_DOMAIN
FIREBASE_PROJECT_ID
FIREBASE_PRIVATE_KEY
FIREBASE_CLIENT_EMAILWeb (.env.local)
NEXT_PUBLIC_CONVEX_URL
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEYNative (.env)
EXPO_PUBLIC_CONVEX_URL
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEYPipeline images optimisé
Le pipeline d'images utilise une stratégie multi-niveaux pour garantir des temps de chargement rapides et une consommation mémoire stable :
- Compression côté client — Les images sont redimensionnées à 2048px max (JPEG 70%) et un thumbnail 300px est généré avant upload.
- Upload parallèle — Original compressé + thumbnail uploadés simultanément sur S3.
- Affichage optimisé —
OptimizedImagechoisit automatiquement le thumbnail pour les grilles et le preview pour le viewer. - Virtualisation — La galerie publique utilise
@tanstack/react-virtualavec pagination (30 items/page) pour ne jamais surcharger le DOM.
Chat B2B
Le chat projet permet la communication photographe-client avec références directes aux photos de la galerie :
- Messagerie temps réel (Convex subscriptions)
- Mentions de médias (sélection visuelle dans la sidebar)
- Historique persistant, avatars colorés, états de lecture
- Interface compacte (panel galerie) ou pleine page (/messages)
Planning Kanban
Le tableau Kanban remplace la page livraisons pour un suivi visuel des projets :
- 4 colonnes : À faire / En cours / Livré / Expiré
- Drag & drop via @dnd-kit
- Publier une galerie = déplace automatiquement en "Livré"
- Export ICS pour intégration calendrier
Ingestion Prospects (Leads)
Le CRM intègre un endpoint public POST /api/leads permettant de brancher n'importe quel formulaire externe (Wix, WordPress, etc.). Les prospects apparaissent ensuite dans le Kanban unifié.
Devis & Contrats (DocuSeal)
Depuis le Kanban, un prospect peut être converti en projet via l'émission d'un devis. Une fois accepté, le contrat est généré légalement via l'intégration DocuSeal.
Facturation & Automatisations (Resend)
PostCards automatise entièrement le cycle financier (Loi Anti-Fraude activée) :
- Acompte (30%) : Généré automatiquement à l'acceptation du devis.
- Solde (70%) : Facturé automatiquement et envoyé par e-mail via Resend lorsque la galerie passe au statut "Livrée".
- Rappels : Un e-mail de rappel est envoyé automatiquement à J-3 de la date de la séance.
Documentation complète
Consultez les fichiers Markdown dans le dossier docs/ pour une documentation détaillée de chaque composant.