Offrir une synthèse ouverte, impartiale et vérifiable des sujets clivants de notre société.
Débats est un projet francophone et participatif qui vise à créer une plateforme collaborative de type wiki pour cartographier les positions et l'évolution de l'engagement des personnalités publiques sur des sujets de société controversés.
- Démocratie transparente : Permettre aux citoyens de suivre les positions de leurs représentants
- Rigueur intellectuelle : Collecter et organiser les prises de position avec des sources vérifiables
- Lutte contre la simplification : Promouvoir un débat public nuancé
- Crédibilité de l'engagement public : Documenter l'évolution des positions dans le temps
Le projet a été initié en 2014 et a connu plusieurs itérations technologiques :
- Stack : Ruby on Rails fullstack
- État : Version la plus aboutie avec modèle de données complet
- Localisation :
ruby-backend/ - Fonctionnalités : CRUD complet, authentification, upload d'images
- Stack : React + Redux + GraphQL
- État : Interface utilisateur moderne mais incomplète
- Localisation :
frontend/ - Objectif : Moderniser l'interface utilisateur
- Stack : Node.js + GraphQL + Prisma
- État : API moderne mais non finalisée
- Localisation :
api/ - Objectif : Remplacer le backend Ruby par une API moderne
- Stack : Elixir + Phoenix + PostgreSQL
- État : Refonte complète mais abandonnée
- Localisation :
debats-elixir/ - Objectif : Performance et fiabilité
- Stack : Next.js 16 + TypeScript + Supabase + Effect TS
- État : En cours de développement
- Localisation : racine du projet
- Objectif : Consolidation et première version exploitable
Le cœur du modèle est cohérent entre toutes les versions :
Subject (Sujet)
├── Positions (ex: "Pour", "Contre", "Nuancé")
└── Statements (Prises de position)
├── PublicFigure (Personnalité)
├── Evidence (Preuves/Sources)
└── Arguments
Contributors (Contributeurs)
- Subject : Les sujets de débat (ex: "Immigration", "Écologie", "Retraites")
- Position : Les différentes positions possibles sur un sujet
- PublicFigure : Les personnalités publiques (politiques, intellectuels, dirigeants d'institutions, porte-paroles d'organisations, etc.) - Critère de notoriété : la personnalité doit avoir fait l'objet d'au moins deux publications dans des sources indépendantes et fiables (inspiré des critères d'admissibilité Wikipedia). La page Wikipedia n'est pas obligatoire.
- Statement : Les prises de position concrètes d'une personnalité sur une position
- Evidence : Les preuves et sources (citations, articles, vidéos, discours)
- Argument : Les arguments développés pour défendre une position
- Contributor : Les utilisateurs contributeurs de la plateforme
- Frontend/Backend : Next.js 16 (App Router)
- Base de données : PostgreSQL via Supabase
- Authentification : Supabase Auth
- Domain : Effect TS + Effect Schema
- Styling : CSS Modules
- Tests : Vitest
- Monitoring : Sentry + Plausible
├── app/ # Next.js App Router (pages et Server Actions)
├── domain/ # Logique métier (entités, services, règles, use cases)
├── infra/ # Infrastructure (Supabase, Wikipedia API)
├── components/ # Composants React réutilisables
├── hooks/ # React hooks
├── styles/ # CSS Modules et design system
├── supabase/ # Migrations et seeds
├── types/ # Types générés (database.types.ts)
├── docs/ # Documentation et maquettes de référence
└── public/ # Assets statiques (polices, images)
ruby-backend/: Application Rails originaledebats-elixir/: Version Phoenix abandonnée
- Node.js 22+
- Docker (pour Supabase local)
- Supabase CLI
npm install
supabase start
supabase migration up # Applique les migrationsAttention :
supabase db resetdétruit toutes les données locales. Préférersupabase migration uppour appliquer les migrations de manière incrémentale.
Copier .env.example vers .env.local et renseigner les valeurs :
cp .env.example .env.localLes variables essentielles pour le développement local :
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:64321
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=<clé affichée par supabase start>
SUPABASE_SECRET_KEY=<clé affichée par supabase start>
SIGNUP_SECRET_TOKEN=<token pour l'inscription par invitation>Voir .env.example pour la liste complète des variables.
npm run devnpm run dev # Serveur de développement
npm test # Tests (Vitest)
npm run lint # Linting (ESLint)
npm run format # Formatage (Prettier)
npm run typecheck # Vérification des types
npm run check # Lint + format + typecheck + build (à lancer avant chaque commit)La configuration auth de production (URLs, templates email, rate limits…) est gérée par un script dédié, pas par supabase config push (qui écraserait la prod avec les valeurs locales).
npm run supabase:config:push # Affiche le diff et demande confirmation
npm run supabase:config:push -- --yes # Push sans confirmationLe script lit les credentials depuis .env.production et les templates email depuis supabase/templates/. La config est déclarée en dur dans scripts/push-prod-auth-config.ts pour être auditable dans le diff git.
supabase start # Démarrer l'environnement local
supabase stop # Arrêter l'environnement
supabase migration up # Appliquer les migrations
# Générer les types TypeScript après chaque migration
supabase gen types typescript --local > types/database.types.tsLes URLs locales sont configurées sur le port 64321 (voir supabase/config.toml) :
- API : http://127.0.0.1:64321
- Studio : http://127.0.0.1:64323
- Inbucket (emails) : http://127.0.0.1:64324
- Consolidation du modèle de données
- Interface de consultation des sujets et positions
- Authentification Supabase (inscription par invitation)
- CRUD sujets, personnalités, positions, prises de position
- Système de réputation des contributeurs
- Système de modération
- Historique des modifications
- Interface d'administration
- Recherche et filtres avancés
- API publique
- Export de données
- Analyses et statistiques
Le projet est open source et accueille les contributions. Voir CONTRIBUTING.md pour plus d'informations.
MIT