Agent IA conversationnel · Gestion médicale · Website Builder · Paiements hybrides
Une seule plateforme pour digitaliser entièrement un cabinet médical.
DocFlow AI est un SaaS clé-en-main conçu pour les médecins et cliniques.
Il combine un tableau de bord médical complet, un agent IA multi-fournisseurs capable de prendre des rendez-vous en autonomie, un constructeur de site vitrine sans code, et un système de paiement hybride (Stripe + crypto).
|
🤖 Agent IA Multi-Fournisseurs
|
📅 Tableau de Bord Médical
|
|
🩺 Dossier Médical & Diagnostics
|
🎥 Téléconsultation
|
|
🌐 Website Builder
|
💳 Paiements Hybrides & Essai Gratuit
|
|
🔌 Automatisation — API, MCP, Zapier/Make
|
📧 Emails & SMS Transactionnels
|
|
🔐 Sécurité Production
|
⚡ Rate Limiting & Fiabilité
|
| Couche | Technologie | Rôle |
|---|---|---|
| Frontend | Next.js 15, React 19, Tailwind CSS 3 | App Router, Server Components, SSR |
| Langage | TypeScript 5, Zod | Typage strict, validation des entrées |
| Base de données | Supabase (PostgreSQL) | Auth, BDD, Storage, RLS, RPC |
| IA | Claude, Gemini, OpenAI, Ollama | Agent conversationnel & prise de RDV |
| Paiements | Stripe 22, wagmi, viem, Reown AppKit | Cartes + crypto USDC Polygon |
| Nodemailer (SMTP), Resend | Notifications transactionnelles | |
| i18n | next-intl 4 | FR / EN (interface + emails) |
| Déploiement | Vercel | Edge, CDN mondial, preview deployments |
Supabase est le seul provider supporté pour faire tourner l'application. Ce n'est pas qu'une base Postgres : Supabase fournit aussi l'authentification (Auth, sessions, auth.uid()), le stockage de fichiers (Storage) et le moteur qui exécute les policies Row Level Security de supabase/migrations/. Ces policies reposent sur auth.uid() et le schéma auth, qui n'existent que sur la plateforme Supabase — retirer Supabase casserait l'authentification, l'upload de fichiers et l'isolation entre cliniques (RLS).
Neon peut être utilisé en complément, uniquement pour le schéma SQL brut, en dev/staging — par exemple pour explorer la structure des tables, tester des migrations avant de les pousser sur Supabase, ou faire tourner des requêtes d'analyse sur une copie du schéma sans toucher aux données de production. Neon ne remplace pas Supabase : login, upload de fichiers et RLS ne fonctionneront pas sur une base Neon nue, faute d'équivalent à Supabase Auth/Storage.
# 1. Créer un projet sur https://console.neon.tech/
# 2. Récupérer la chaîne de connexion (Dashboard → Connection string)
# 3. Dans .env.local :
DATABASE_PROVIDER="neon"
NEON_DATABASE_URL="postgres://user:password@ep-xxxx.region.aws.neon.tech/dbname?sslmode=require"
# 4. Appliquer le schéma SQL sur Neon (garde-fou : refuse si DATABASE_PROVIDER != "neon")
npm run db:migrate:neonLe script (scripts/migrate-neon.ts) applique chaque fichier de supabase/migrations/ dans l'ordre, garde une table _neon_migrations pour ne jamais rejouer une migration déjà appliquée, et s'arrête proprement à la première erreur. Certaines migrations référencent auth.users/auth.uid() (fournis par Supabase Auth) : elles échoueront sur une base Neon qui n'a pas ce schéma — le script l'indique explicitement dans son message d'erreur plutôt que d'échouer silencieusement.
| Outil | Version minimale | Lien |
|---|---|---|
| Node.js | 20+ | nodejs.org |
| npm | 10+ | inclus avec Node.js |
| Git | toute version | git-scm.com |
| Compte Supabase | — | supabase.com |
# Vérifier les versions installées
node -v # doit afficher v20.x.x ou supérieur
npm -v # doit afficher 10.x.x ou supérieurgit clone <url-du-repo> docflow-ai
cd docflow-ai
npm install- Créez un projet sur supabase.com → New project
- Allez dans SQL Editor → New query
- Exécutez chaque fichier du dossier
supabase/migrations/dans l'ordre numérique (001_...jusqu'au dernier). Le nombre et le nom exact des fichiers évoluent avec le projet — fiez-vous au contenu réel du dossier plutôt qu'à une liste figée ici. À titre indicatif, la structure actuelle :
supabase/migrations/
├── 001_schema.sql ← tables principales
├── 002_functions_indexes_triggers.sql ← fonctions PostgreSQL (booking, quota...)
├── 003_rls_policies.sql ← sécurité Row Level Security
├── 004_medical_carnets.sql ← dossier médical / diagnostics
├── ...
└── 012_starter_professional_free_trial.sql
Alternative en local/CI :
npm run db:migrate(nécessite la Supabase CLI etsupabase link).
- Allez dans Storage → New bucket
- Nom :
clinic-assets - Type : Public bucket ✅
- Nom :
À la racine du projet (même niveau que package.json), créez un fichier nommé exactement .env.local.
⚠️ Ce fichier ne doit jamais être partagé ni poussé sur Git. Il est déjà dans le.gitignore.
📋 Bloc 1 — Supabase (obligatoire)
NEXT_PUBLIC_SUPABASE_URL="https://xxxxxxxxxxxx.supabase.co"
NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
SUPABASE_SERVICE_ROLE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."- Connectez-vous sur supabase.com et ouvrez votre projet.
- Dans la barre latérale gauche, cliquez sur l'icône engrenage ⚙️ tout en bas → "Project Settings".
- Dans le sous-menu qui s'ouvre, cliquez sur "API" (pas "Auth", pas "Database" — "API").
- Vous voyez maintenant 3 blocs :
| Ce que vous voyez sur la page | Variable .env.local |
|---|---|
Project URL (ex: https://abcdefgh.supabase.co) |
NEXT_PUBLIC_SUPABASE_URL |
Project API keys → anon public (commence par eyJ...) |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Project API keys → service_role (commence par eyJ...) |
SUPABASE_SERVICE_ROLE_KEY |
- Cliquez sur le bouton "Copy" à droite de chaque valeur et collez-la dans
.env.local.
⚠️ La cléservice_rolea des droits d'administrateur complets sur votre base de données. Ne l'utilisez jamais dans du code côté client (navigateur). Dans ce projet, elle est uniquement utilisée dans les Server Actions et les routes API serveur.
🤖 Bloc 2 — Intelligence Artificielle (obligatoire)
Vous devez choisir un seul fournisseur IA pour commencer. Mettez sa valeur dans ACTIVE_AI_PROVIDER et ajoutez uniquement la clé correspondante.
# Choisir : claude | gemini | openai | ollama
ACTIVE_AI_PROVIDER="claude"- Allez sur console.anthropic.com et créez un compte (ou connectez-vous).
- Dans le menu de gauche, cliquez sur "API Keys".
- Cliquez sur "Create Key", donnez-lui un nom (ex:
docflow-local), puis cliquez sur "Create Key". - Copiez immédiatement la clé affichée — elle ne sera plus jamais visible après fermeture de cette fenêtre.
- Collez-la dans
.env.local:
ANTHROPIC_API_KEY="sk-ant-api03-..."La clé ressemble à :
sk-ant-api03-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- Allez sur aistudio.google.com/app/apikey.
- Connectez-vous avec votre compte Google.
- Cliquez sur "Create API key".
- Sélectionnez un projet Google Cloud existant ou laissez-en créer un automatiquement.
- La clé s'affiche sous la forme
AIzaSy...— copiez-la.
GEMINI_API_KEY="AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"La clé ressemble à :
AIzaSysuivi de 33 caractères alphanumériques.
- Allez sur platform.openai.com/api-keys.
- Connectez-vous (ou créez un compte sur platform.openai.com).
- Cliquez sur "+ Create new secret key", donnez-lui un nom, puis cliquez sur "Create secret key".
- Copiez immédiatement la clé — elle ne sera plus jamais affichée.
OPENAI_API_KEY="sk-proj-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
⚠️ OpenAI requiert un solde de crédit > 0 pour que l'API fonctionne. Allez dans Billing et ajoutez au moins 5 $ de crédit.
Ollama exécute un modèle IA directement sur votre ordinateur, sans envoi de données à l'extérieur.
- Téléchargez et installez Ollama depuis ollama.com (Mac, Linux ou Windows).
- Lancez l'application Ollama (une icône apparaît dans la barre des tâches).
- Ouvrez un terminal et téléchargez un modèle :
ollama pull llama3 # modèle généraliste (4.7 Go)
# ou, si vous avez peu de RAM :
ollama pull llama3:8b # version plus légère- Vérifiez qu'Ollama est bien lancé :
curl http://localhost:11434/api/tags
# Doit répondre avec la liste des modèles installésOLLAMA_BASE_URL="http://localhost:11434"Ollama doit rester démarré pendant toute l'utilisation de DocFlow AI.
📧 Bloc 3 — Email (obligatoire pour les notifications)
Deux variables communes quel que soit le fournisseur choisi :
ACTIVE_EMAIL_PROVIDER="smtp" # smtp | resend
ADMIN_EMAIL="vous@votre-domaine.com" # adresse qui reçoit les alertes admin
ADMIN_EMAILest l'adresse qui reçoit les demandes Enterprise et les alertes système. Elle est différente de l'adresse d'envoi.
Vous utilisez votre propre adresse Gmail comme expéditeur. Google exige un mot de passe d'application distinct de votre mot de passe Gmail habituel.
Étape 1 — Activer la validation en deux étapes (obligatoire pour créer un mot de passe d'application)
- Allez sur myaccount.google.com.
- Dans le menu gauche, cliquez sur "Sécurité".
- Dans la section "Comment vous connecter à Google", cliquez sur "Validation en deux étapes".
- Suivez les instructions pour l'activer si ce n'est pas déjà fait.
Étape 2 — Créer un mot de passe d'application
- Toujours sur myaccount.google.com → "Sécurité".
- Dans la barre de recherche en haut de la page des paramètres Google, tapez :
mots de passe des applications - Cliquez sur le résultat "Mots de passe des applications" (ou allez directement sur myaccount.google.com/apppasswords).
- Dans le champ "Nom de l'application", tapez
DocFlowpuis cliquez sur "Créer". - Google affiche un mot de passe de 16 caractères en 4 groupes de 4 lettres (ex:
abcd efgh ijkl mnop). - Copiez ce mot de passe en supprimant les espaces → vous obtenez 16 caractères collés (ex:
abcdefghijklmnop).
SMTP_GOOGLE_EMAIL="votre.adresse@gmail.com"
GOOGLE_APP_PASSWORD="abcdefghijklmnop"
⚠️ Le mot de passe d'application doit être collé sans espaces. Les 4 groupes affichés par Google sont uniquement pour la lisibilité.
- Créez un compte sur resend.com.
- Dans le tableau de bord, allez dans "API Keys" → "Create API Key".
- Donnez-lui un nom (ex:
docflow), choisissez les permissions "Full access", puis cliquez "Add". - Copiez la clé affichée (commence par
re_).
ACTIVE_EMAIL_PROVIDER="resend"
RESEND_API_KEY="re_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"💳 Bloc 4 — Stripe (paiements par carte)
Utilisez le mode Test pendant le développement. Aucune vraie transaction n'aura lieu.
- Créez un compte sur dashboard.stripe.com/register.
- Une fois connecté, vérifiez que le bouton en haut à droite indique "Mode test" (fond orange). Si vous voyez "Mode production", cliquez dessus pour basculer en test.
- Dans le menu gauche, cliquez sur "Développeurs" → "Clés API".
- Vous voyez deux clés :
| Clé visible sur Stripe | Variable .env.local |
|---|---|
Clé publiable (commence par pk_test_) |
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY |
Clé secrète (commence par sk_test_, cliquez "Afficher") |
STRIPE_SECRET_KEY |
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="pk_test_51XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
STRIPE_SECRET_KEY="sk_test_51XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"Le webhook permet à Stripe de notifier votre application quand un paiement réussit. En local, vous avez besoin de la Stripe CLI.
Installer la Stripe CLI :
# macOS
brew install stripe/stripe-cli/stripe
# Windows (avec Scoop)
scoop install stripe
# Linux
# Télécharger depuis https://stripe.com/docs/stripe-cliDémarrer l'écoute des webhooks :
# Se connecter à votre compte Stripe
stripe login
# Démarrer le tunnel (laissez cette commande tourner en arrière-plan)
stripe listen --forward-to localhost:3000/api/webhooks/stripeLa console affiche une ligne comme :
> Ready! Your webhook signing secret is whsec_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Copiez cette valeur :
STRIPE_WEBHOOK_SECRET="whsec_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
⚠️ Cette commandestripe listendoit rester active dans un terminal pendant tout votre développement. Elle crée un tunnel entre les serveurs Stripe et votre machine locale.
🔗 Bloc 5 — Web3 / Paiements crypto (optionnel)
Ce bloc est nécessaire uniquement si vous souhaitez activer les paiements en USDC (stablecoin) sur la blockchain Polygon. Vous pouvez ignorer ce bloc si vous n'utilisez que Stripe.
WalletConnect permet aux utilisateurs de connecter leur portefeuille (MetaMask, Coinbase Wallet, etc.) à DocFlow AI.
- Allez sur cloud.walletconnect.com et créez un compte.
- Cliquez sur "Create project".
- Donnez un nom au projet (ex:
DocFlow AI) et sélectionnez le type "App". - Cliquez sur "Create".
- Votre Project ID s'affiche sur la page du projet (une chaîne de 32 caractères hexadécimaux).
NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"C'est l'adresse Ethereum/Polygon sur laquelle vous recevrez les paiements USDC.
- Ouvrez MetaMask (extension Chrome ou application mobile).
- Cliquez sur votre nom de compte en haut (ex: "Account 1").
- Copiez l'adresse affichée (commence par
0x, fait 42 caractères).
NEXT_PUBLIC_CRYPTO_WALLET_ADDRESS="0xAbCdEf1234567890AbCdEf1234567890AbCdEf12"Définissez les tarifs de vos abonnements (en dollars, 1 USDC = 1 USD) :
NEXT_PUBLIC_PLAN_STARTER_PRICE="49"
NEXT_PUBLIC_PLAN_PROFESSIONAL_PRICE="99"
NEXT_PUBLIC_PLAN_ENTERPRISE_PRICE="299"🌍 Bloc 6 — URL de l'app & Cron (obligatoire)
NEXT_PUBLIC_APP_URL est utilisée dans les liens des emails transactionnels, les URLs de retour Stripe, l'annulation de RDV et l'onboarding. CRON_SECRET protège la route /api/cron/appointment-reminders (appelée quotidiennement par Vercel Cron, voir vercel.json) contre les appels non autorisés.
NEXT_PUBLIC_APP_URL="http://localhost:3000" # URL réelle de déploiement en production
CRON_SECRET="un-secret-aléatoire-long"⚡ Bloc 7 — Rate limiting Upstash Redis (recommandé en production)
Sans ces variables, le rate limiting retombe sur un store en mémoire — fonctionnel en dev, mais non partagé entre instances serverless (donc peu fiable en production Vercel).
- Créez un compte gratuit sur console.upstash.com.
- Créez une base Redis.
- Copiez REST URL et REST Token depuis le tableau de bord de la base.
UPSTASH_REDIS_REST_URL="https://your-db.upstash.io"
UPSTASH_REDIS_REST_TOKEN="your-token"📱 Bloc 8 — SMS Twilio (optionnel)
Si absent, les rappels SMS sont silencieusement désactivés — le reste de l'application fonctionne normalement.
- Créez un compte sur twilio.com.
- Récupérez Account SID et Auth Token depuis le tableau de bord.
- Achetez ou récupérez un numéro d'envoi.
TWILIO_ACCOUNT_SID="ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
TWILIO_AUTH_TOKEN="your-twilio-auth-token"
TWILIO_PHONE_NUMBER="+1234567890"🩺 Bloc 9 — APIs médicales : WHO ICD & OpenFDA (obligatoire pour le module Diagnostics)
Le wizard de diagnostic (codage WHO ICD-11/ICF/ICHI, vérification d'interactions médicamenteuses) dépend de ces APIs externes.
- WHO ICD API : créez des identifiants sur icd.who.int/icdapi.
- OpenFDA (optionnel) : une clé sur open.fda.gov/apis/authentication fait passer la limite de 40 à 240 requêtes/min ; l'API fonctionne sans clé en deçà de ce quota.
WHO_ICD_CLIENT_ID="your-who-client-id"
WHO_ICD_CLIENT_SECRET="your-who-client-secret"
OPENFDA_API_KEY="your-openfda-api-key" # optionnelVoici un modèle prêt à copier-coller. Remplacez chaque ... par vos vraies valeurs :
# ─── Supabase ────────────────────────────────────────────
NEXT_PUBLIC_SUPABASE_URL="https://xxxxxxxxxxxx.supabase.co"
NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJhbGciOiJI..."
SUPABASE_SERVICE_ROLE_KEY="eyJhbGciOiJI..."
# ─── Intelligence Artificielle ───────────────────────────
ACTIVE_AI_PROVIDER="claude"
ANTHROPIC_API_KEY="sk-ant-api03-..."
# GEMINI_API_KEY="AIzaSy..."
# OPENAI_API_KEY="sk-proj-..."
# OLLAMA_BASE_URL="http://localhost:11434"
# ─── Email ───────────────────────────────────────────────
ACTIVE_EMAIL_PROVIDER="smtp"
ADMIN_EMAIL="admin@votre-domaine.com"
SMTP_GOOGLE_EMAIL="votre.clinique@gmail.com"
GOOGLE_APP_PASSWORD="motdepasseapplication"
# RESEND_API_KEY="re_..."
# ─── Stripe ──────────────────────────────────────────────
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="pk_test_..."
STRIPE_SECRET_KEY="sk_test_..."
STRIPE_WEBHOOK_SECRET="whsec_..."
# ─── Web3 (optionnel) ────────────────────────────────────
NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID="..."
NEXT_PUBLIC_CRYPTO_WALLET_ADDRESS="0x..."
NEXT_PUBLIC_PLAN_STARTER_PRICE="49"
NEXT_PUBLIC_PLAN_PROFESSIONAL_PRICE="99"
NEXT_PUBLIC_PLAN_ENTERPRISE_PRICE="299"
# ─── URL app & Cron ──────────────────────────────────────
NEXT_PUBLIC_APP_URL="http://localhost:3000"
CRON_SECRET="un-secret-aléatoire-long"
# ─── Rate limiting (recommandé en production) ────────────
# UPSTASH_REDIS_REST_URL="https://your-db.upstash.io"
# UPSTASH_REDIS_REST_TOKEN="your-token"
# ─── SMS (optionnel) ─────────────────────────────────────
# TWILIO_ACCOUNT_SID="AC..."
# TWILIO_AUTH_TOKEN="..."
# TWILIO_PHONE_NUMBER="+1234567890"
# ─── APIs médicales (module Diagnostics) ─────────────────
WHO_ICD_CLIENT_ID="..."
WHO_ICD_CLIENT_SECRET="..."
# OPENFDA_API_KEY="..."# Développement (hot reload)
npm run dev
# Production
npm run build && npm startOuvrir http://localhost:3000
1. /pricing → Choisir un plan (essai gratuit 14j sur Starter/Pro)
2. /signup → Créer un compte médecin
3. /onboarding → Nommer la clinique, configurer le fuseau horaire
4. /app/dashboard → Tableau de bord principal
5. /app/settings → Configurer les disponibilités & services
6. /app/diagnostics → Créer un diagnostic (wizard, codage WHO ICD)
7. /app/ai-settings → Personnaliser l'agent IA, copier l'iframe widget
8. /app/integrations → Générer une clé API / configurer un webhook / MCP
9. /app/website-builder → Créer la page vitrine, publier
10. /clinique/[slug] → Voir la page publique de la clinique
11. /widget/[slug] → Tester le widget IA en autonomie
12. /portail/login → Espace patient (RDV, dossier, paiement)
# Installer la CLI Vercel
npm i -g vercel
# Déployer
vercel
# Configurer les variables d'environnement
vercel env add NEXT_PUBLIC_SUPABASE_URL
# ... répéter pour chaque variableOu via l'interface Vercel : Settings → Environment Variables — importer toutes les variables du fichier .env.local.
Important : En production, configurez le webhook Stripe avec votre vraie URL Vercel (
https://votreapp.vercel.app/api/webhooks/stripe) et remplacez les cléspk_test/sk_testpar les clés live.
docflow-ai/
├── app/
│ ├── (app)/app/ # Pages authentifiées staff (dashboard, patients, diagnostics...)
│ ├── (admin)/admin/ # Panneau super-admin multi-cliniques
│ ├── api/
│ │ ├── v1/ # API REST publique (clé API)
│ │ ├── mcp/ # Serveur MCP (Claude Desktop)
│ │ ├── widget/ # Chat IA + réservation embarquables
│ │ ├── webhooks/ # Stripe, crypto
│ │ └── cron/ # Rappels de RDV (Vercel Cron)
│ ├── clinique/[slug]/ # Page publique de la clinique (Website Builder)
│ ├── widget/[slug]/ # Widget IA intégrable en <iframe>
│ ├── portail/ # Portail patient (dossier, RDV, paiement)
│ └── page.tsx # Landing page
├── actions/ # Server Actions Next.js
├── components/
│ ├── layout/ # Sidebar, Topbar, Header
│ ├── clinic-website/ # Templates du Website Builder
│ ├── integrations/ # UI clés API / webhooks / MCP
│ └── website-builder/ # Éditeur de site vitrine
├── lib/
│ ├── ai/ # Router multi-fournisseurs IA
│ ├── widget-chat/ # Logique métier du widget de réservation IA
│ ├── email/ · sms/ # Notifications transactionnelles
│ ├── security/ # Anti-SSRF, échappement, scrubbing Sentry
│ ├── slots.ts # Génération des créneaux disponibles
│ ├── rate-limit.ts # Rate limiting (Upstash + fallback mémoire)
│ └── subscription/ # Gestion des quotas & essai gratuit par plan
├── supabase/migrations/ # Scripts SQL (à exécuter dans l'ordre)
├── i18n/ # Configuration next-intl (routing, locale)
├── messages/ # Traductions FR / EN (next-intl)
└── __tests__/ # Tests Vitest (`npm run test`)
npm run test # mode watch
npm run test:run # une seule passe (CI)
npm run test:coverage # avec rapport de couverture (v8)Les tests couvrent aujourd'hui les utilitaires purs (lib/utils.ts, lib/notifications.ts, lib/sms/, lib/email/templates/) — voir include dans vitest.config.ts pour le périmètre exact mesuré par test:coverage.
.env.local: ne jamais committer — déjà dans.gitignoreSUPABASE_SERVICE_ROLE_KEY: serveur uniquement, jamais côté client- Clés Stripe : utiliser
pk_test/sk_testen développement uniquement - RLS Supabase : activé sur toutes les tables — chaque clinique ne voit que ses données
- Les endpoints widget (
/api/widget/*) ont un rate limiter dédié (10 req/min en booking, 30 req/min en chat)
L'application ne démarre pas
- Vérifier que
.env.localexiste à la racine et contient au minimum les clés Supabase - Vérifier
node -v≥ 20 - Supprimer
.next/et relancer :rm -rf .next && npm run dev
Erreur Supabase "relation does not exist"
Les migrations SQL n'ont pas toutes été exécutées. Reprendre depuis l'étape 3.3 en exécutant chaque fichier supabase/migrations/*.sql dans l'ordre numérique.
Le widget IA ne répond pas
- Vérifier que
ACTIVE_AI_PROVIDERest défini et que la clé API correspondante est présente - Tester la clé API directement sur la console du fournisseur
- Vérifier les logs dans la console Next.js
Les emails ne partent pas
- Vérifier que
ADMIN_EMAILest défini - Pour Gmail : le mot de passe d'application doit être sans espaces (16 caractères collés)
- Vérifier que la validation en deux étapes est activée sur le compte Google
Upload d'images bloqué
- Vérifier que le bucket
clinic-assetsexiste dans Supabase Storage et est en mode Public - Vérifier les politiques RLS Storage dans Supabase : l'utilisateur authentifié doit avoir les droits
INSERTetSELECT
Construit avec Next.js · Supabase · Claude · Stripe