Files
billisdead bc6bd3f9d7 Dé-Replit-isation complète du projet
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>
2026-05-23 22:41:06 +02:00

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`