Backend : - Nouvelle table `consultations` (slug unique, fenêtre temporelle, webhook, logo) - `ideas.consultation_id` FK nullable (NULL = contexte global home) - `synthesis.consultation_id` FK nullable (synthèse par contexte) - Boucle auto-fermeture (thread daemon, 60 s) — ferme + webhook à l'échéance - Webhook de clôture : POST JSON (synthèse + métadonnées) via urllib.request - Routes publiques : GET/POST /api/consultations/<slug>, synthèse, contributions, export/print - Routes admin : list, create, close (+ webhook), delete (cascade explicite) - CSP ajustée sur /export/print pour autoriser window.print() Frontend : - Nouvelle page /consultation/:slug — formulaire, synthèse live, contributions paginées, PDF - Admin panel : onglet Consultations — liste, formulaire création, fermeture, suppression Docs : DAT.md v1.5, DEX.md v1.7 (section P5, tables, routes, webhook) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
La Voix du Peuple
Plateforme civique de démocratie participative assistée par IA
Un espace d'expression citoyenne — pas un sondage, pas une vérité établie.
Présentation
La Voix du Peuple permet à des citoyens de soumettre librement des propositions politiques en texte libre. Chaque contribution est automatiquement :
- Filtrée par une IA selon le droit international des droits humains (DUDH, PIDCP, CEDH, Charte UE, CERD, Statut de Rome)
- Intégrée à une synthèse collective structurée par thèmes
- Mise à disposition des élus et décideurs sous forme lisible
La plateforme ne produit pas un consensus, ni une vérité : elle donne à voir ce que des citoyens ont choisi d'exprimer, tel quel. La démarche est portée par un auteur attaché à l'expertise et au dialogue fondé sur les preuves.
Captures d'écran
Page principale — soumission et synthèse en temps réel
À propos — concept et posture éditoriale
Fonctionnement — parcours d'une contribution
Flyer QR — diffusion physique imprimable
Fonctionnalités
| Fonctionnalité | Description |
|---|---|
| Soumission libre | Formulaire texte avec pseudonyme optionnel |
| Modération IA | Filtre automatique fondé sur le droit international |
| Synthèse thématique | Résumé en temps réel par Mistral Large |
| Export PDF | Synthèse mise en page, générée côté client |
| Partage horodaté | Copie dans le presse-papier ou partage natif mobile |
| Flyer QR imprimable | Flyer A4 avec QR code configuré sur votre domaine |
| Dark mode | Thème sombre pétrol |
| Accessibilité | Police dyslexie · Contraste élevé · Texte agrandi · Navigation clavier |
Stack technique
| Couche | Technologie |
|---|---|
| Frontend | React 18 · TypeScript · Vite 7 · Tailwind CSS · shadcn/ui |
| Backend | Python 3.11 · Flask 3 · Gunicorn |
| Base de données | PostgreSQL 15 |
| IA — modération | Mistral Small (mistral-small-latest) |
| IA — synthèse | Mistral Large (mistral-large-latest) |
| QR code | qrcode.react |
Installation rapide (RockyLinux)
Voir le guide complet → docs/INSTALL_ROCKY.md
# Cloner le dépôt
git clone https://homegit.gyozamancave.fr/billisdead/la-voix-du-peuple.git
cd la-voix-du-peuple
# Configurer l'environnement
cp .env.example .env
vim .env # DATABASE_URL, MISTRAL_API_KEY, SESSION_SECRET
# Définir le domaine et construire le frontend
bash scripts/set-domain.sh https://votredomaine.fr
# Démarrer les services
systemctl start voix-du-peuple-api
systemctl start nginx
Le site écoute sur le port HTTP 8080. Vous gérez le HTTPS en amont.
Variables d'environnement clés
# Base de données
DATABASE_URL=postgresql://user:pass@localhost:5432/voix_du_peuple
# IA (Mistral recommandé — souveraineté européenne)
MISTRAL_API_KEY=sk-...
# Sécurité (obligatoire en production)
SECRET_KEY=une-longue-chaine-aleatoire-minimum-32-chars
ADMIN_SECRET=votre-mot-de-passe-admin
# Anti-abus (optionnel — valeurs par défaut raisonnables)
REDIS_URL=redis://localhost:6379/0
RATE_LIMIT_CONTRIBUTIONS=5 per minute;3 per hour
CONTRIBUTION_COOLDOWN_SECONDS=3600
FLOOD_THRESHOLD=10
# hCaptcha (optionnel — recommandé en production)
HCAPTCHA_SECRET_KEY=votre-cle-secrete
# Frontend
VITE_APP_URL=https://votredomaine.fr
VITE_HCAPTCHA_SITE_KEY=votre-cle-de-site # Nécessite rebuild frontend
Changer de domaine (QR code)
bash scripts/set-domain.sh https://nouveaudomaine.fr
systemctl reload nginx
Documentation
| Document | Contenu |
|---|---|
docs/DAT.md |
Architecture technique complète |
docs/DEX.md |
Guide d'exploitation et maintenance |
docs/WIKI.md |
Page wiki — présentation générale |
docs/INSTALL_ROCKY.md |
Installation sur RockyLinux 9 |
docs/SECURITE_ANTI_ABUS.md |
Protections anti-bot, flood, rate limiting, hCaptcha |
docs/RGPD.md |
Conformité RGPD — registre des traitements |
docs/PROMPTS_IA.md |
Prompts IA intégraux (transparence algorithmique) |
Licence
Ce projet est publié sous European Union Public Licence v. 1.2 (EUPL-1.2).
L'EUPL-1.2 est la licence open source officielle de l'Union européenne. Elle est :
- Compatible avec la GPL v2/v3, l'AGPL v3 et la MPL 2.0 (cf. Appendice)
- Reconnue par la Commission européenne et les institutions publiques de l'UE
- Adaptée aux projets civiques et associatifs souhaitant une réutilisation libre sous condition de réciprocité (copyleft)
- Disponible en 23 langues officielles de l'UE — voir joinup.ec.europa.eu
Ce choix est cohérent avec la posture souveraineté numérique européenne du projet et permet à toute association, mairie ou collectif de reprendre et déployer cet outil sous les mêmes conditions.



