bc6bd3f9d7
Supprimés : - replit.md — doc Replit obsolète - docs/GITEA_TUTO.md — tuto push Replit → Gitea (obsolète) - artifacts/api-server/ — serveur TypeScript mort, remplacé par Flask - artifacts/voix-du-peuple/vite.config.selfhost.ts — fusionné dans vite.config.ts Nettoyés : - ai_agent.py — fallback Replit AI supprimé (Mistral + OpenAI-compatible suffisent) - vite.config.ts — plugins @replit/* retirés, PORT optionnel (défaut 5173) - package.json + pnpm-workspace.yaml — @replit/* retirés du catalog et des deps - badge.tsx + button.tsx — commentaires // @replit supprimés - README.md, DEPLOIEMENT.md, DAT.md, DEX.md, WIKI.md — références Replit remplacées Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
113 lines
4.5 KiB
Markdown
113 lines
4.5 KiB
Markdown
# La Voix du Peuple — Page wiki
|
|
|
|
**Type** : Plateforme civique numérique
|
|
**Stack** : Python / Flask · React / Vite · PostgreSQL · Mistral AI
|
|
**Hébergement** : Auto-hébergeable (RockyLinux, Debian, VPS UE)
|
|
**Dépôt** : `voix-du-peuple` (Gitea)
|
|
**Statut** : Actif — avril 2026
|
|
**Version doc** : 1.4
|
|
|
|
---
|
|
|
|
## Qu'est-ce que c'est ?
|
|
|
|
Un outil permettant à des citoyens de soumettre des propositions politiques en texte libre. Ces propositions sont :
|
|
|
|
- **filtrées** automatiquement par une IA selon les textes internationaux des droits humains (DUDH, PIDCP, CEDH…)
|
|
- **synthétisées** en un résumé structuré par thèmes, destiné à des élus ou décideurs
|
|
- **affichées** en temps réel sur la page principale
|
|
- **exportables** : copie horodatée dans le presse-papier, PDF mise en page, ou flyer A4 avec QR code pour diffusion physique
|
|
|
|
L'objectif est de fournir aux représentants politiques un document clair et utilisable issu des préoccupations citoyennes, sans intermédiaire. **Ce que contient la synthèse est de l'expression — pas de la vérité établie.** La démarche est portée par un auteur attaché à l'expertise et au dialogue fondé sur les preuves.
|
|
|
|
---
|
|
|
|
## Fonctionnement en 6 points
|
|
|
|
1. Un citoyen saisit une proposition sur la page principale
|
|
2. L'IA (Mistral Small) vérifie que le contenu respecte les droits fondamentaux
|
|
3. Si la contribution est acceptée, elle s'ajoute à la base et déclenche une re-synthèse
|
|
4. L'IA (Mistral Large) relit toutes les contributions et produit un résumé thématique
|
|
5. Le résumé s'affiche en temps réel à droite de l'écran
|
|
6. Le résumé peut être partagé (texte horodaté), exporté en PDF, ou diffusé via un flyer QR imprimable
|
|
|
|
---
|
|
|
|
## Pages de l'application
|
|
|
|
| URL | Contenu |
|
|
|-----|---------|
|
|
| `/` | Formulaire de soumission + contributions récentes + synthèse (avec boutons Partager / PDF) |
|
|
| `/about` | Description du projet, posture éditoriale ("Expression, pas vérité"), fondements juridiques |
|
|
| `/transparence` | Fonctionnement de l'IA, données collectées, limites, encart "Ce que cette plateforme n'est pas" |
|
|
| `/flyer` | Flyer A4 imprimable avec QR code configurable pour diffusion physique |
|
|
|
|
---
|
|
|
|
## Fonctionnalités d'export et de diffusion
|
|
|
|
### Partager la synthèse
|
|
Bouton dans l'en-tête de la colonne de synthèse. Sur mobile : partage natif (WhatsApp, mail…). Sur bureau : copie dans le presse-papier avec date et heure.
|
|
|
|
### Exporter en PDF
|
|
Bouton "PDF" dans la même zone. Ouvre une fenêtre avec le résumé mis en page (tricolore, titre, date, texte, pied de page) pour impression ou export PDF depuis le navigateur.
|
|
|
|
### Flyer QR imprimable
|
|
Page `/flyer` : flyer format A4 avec grand QR code. L'URL encodée est modifiable :
|
|
- Via le champ texte en haut de la page (sans recharger)
|
|
- Via le paramètre URL `/flyer?url=https://monsite.fr`
|
|
- En modifiant la constante `DEFAULT_QR_URL` dans `src/pages/flyer.tsx`
|
|
|
|
---
|
|
|
|
## Stack technique
|
|
|
|
| Couche | Technologie |
|
|
|--------|-------------|
|
|
| Frontend | React 18 + TypeScript + Vite 7 + Tailwind CSS |
|
|
| Backend | Python 3.11 + Flask 3 + Gunicorn |
|
|
| Base de données | PostgreSQL |
|
|
| IA | Mistral AI (API OpenAI-compatible) |
|
|
| Modération | `mistral-small-latest` |
|
|
| Synthèse | `mistral-large-latest` |
|
|
| QR code | `qrcode.react` |
|
|
| Police | Bahnschrift (titres), Inter (corps) |
|
|
| Couleur principale | Pétrol foncé `hsl(185 42% 28%)` — sans connotation partisane |
|
|
| Accessibilité | Dark mode · Police dyslexie · Contraste élevé · Texte agrandi (panneau dans la navbar) |
|
|
| Dépôt | Gitea — push via `bash scripts/push-gitea.sh` (token `GITEA_TOKEN`) |
|
|
|
|
---
|
|
|
|
## Variables d'environnement clés
|
|
|
|
```
|
|
DATABASE_URL — URL PostgreSQL
|
|
MISTRAL_API_KEY — Clé API Mistral
|
|
SESSION_SECRET — Secret Flask
|
|
GITEA_TOKEN — Token d'accès Gitea (push sécurisé)
|
|
FILTER_MODEL — Modèle de modération (optionnel)
|
|
SYNTHESIS_MODEL — Modèle de synthèse (optionnel)
|
|
```
|
|
|
|
---
|
|
|
|
## Données collectées
|
|
|
|
- Texte de la contribution
|
|
- Pseudonyme (facultatif, choisi par l'utilisateur)
|
|
- Horodatage
|
|
- Résultat du filtre IA (accepté / refusé + motif)
|
|
|
|
**Non collecté** : adresse IP, compte utilisateur, cookies de suivi.
|
|
|
|
**Export / partage** : entièrement côté client, rien n'est envoyé au serveur lors d'un partage ou d'un export PDF.
|
|
|
|
---
|
|
|
|
## Liens
|
|
|
|
- Tutoriel Gitea → [`docs/GITEA_TUTO.md`](./GITEA_TUTO.md)
|
|
- Architecture technique → [`docs/DAT.md`](./DAT.md)
|
|
- Exploitation → [`docs/DEX.md`](./DEX.md)
|
|
- Fonctionnement technique (in-app) → `/transparence`
|