Site unifié arrosoir.net — Concept
Documentation issue de la session de travail du 2026-06-18
Stack technique
| Couche | Techno | Notes |
|---|---|---|
| Serveur web | Apache | URL rewriting via .htaccess |
| Backend | PHP | Pas de framework, pas de build tool |
| Base de données | SQLite | Pas de MySQL |
| Temps réel | WebSocket Python | ws.arrosoir.net (prod) / 127.0.0.1:8081 (local) |
| Templates | template.class.php |
Moteur maison .tpl — lib partagée |
| Client WS | ws.js |
Gère les component_refresh automatiquement — lib partagée |
| Détection post-its | Python + OpenCV | detect_worker.py + venv |
| OCR | Groq API | meta-llama/llama-4-scout-17b-16e-instruct (multimodal) |
Lib partagée (/srv/www-data/lib/tpl/)
/srv/www-data/lib/tpl/
class/
template.class.php — moteur de templates .tpl
websocket.class.php — client PHP vers le serveur WebSocket
js/
ws.js — client JS WebSocket (auto-refresh composants)
Inclusion PHP :
require_once('/srv/www-data/lib/tpl/class/template.class.php');
require_once('/srv/www-data/lib/tpl/class/websocket.class.php');
Inclusion JS (via alias Apache) :
<script src="/js/ws.js"></script>
L'alias Apache est configuré dans chaque vhost :
Alias /js/ws.js /srv/www-data/lib/tpl/js/ws.js
<Directory /srv/www-data/lib/tpl/js/>
Require all granted
</Directory>
Contexte
Quatre projets existants à fusionner en un seul site :
| Projet | Fonctionnalité apportée |
|---|---|
| post-it.arrosoir.net | Photo → détection post-its → OCR → export texte |
| dot.arrosoir.net | Vote par points sur post-its (sync) |
| pp.arrosoir.net | Planning poker sur post-its (sync) |
| ppa.arrosoir.net | Estimation asynchrone de tickets |
Vocabulaire
| Terme | Rôle |
|---|---|
| Admin | Pilote l'atelier |
| Shooter | Photographie les boards |
| Voter | Participe aux votes |
| Prez | Vue plein écran projetée (photo du board, matrice, ou QR code) |
Modèle conceptuel
Atelier
└── Board N (1 à N boards par atelier, ajoutés à tout moment)
├── Étape 1 (obligatoire) : Photo → Détection → OCR
│ → chaque post-it a une image + un texte
└── Étape 2 (choix de l'admin, un seul par board) :
├── Dot voting [sync ou async]
└── Planning Poker [sync ou async]
+ Export : page de résultats permanente par board,
accessible à tout moment, enrichie au fur et à mesure
Modes de vote
- Sync : l'admin contrôle les phases (lancement, révélation) — tout le monde est en réunion ensemble
- Async : les voters votent à leur rythme — utile pour les équipes dispersées ou sur plusieurs jours
Vue Prez
Disponible en mode sync. Peut afficher :
- La photo du board avec les résultats overlayés sur chaque post-it
- La matrice/canvas avec les post-its positionnés selon leurs scores
- Un QR code en bas à droite (togglable, non intrusif)
Activités par board
Dot voting
Configuration (admin) :
- Mode : sync ou async
- Nombre de points par participant
- Autoriser ou non de mettre tous ses points sur un seul post-it
Vue Prez (sync) :
- Photo du board avec scores overlayés après révélation
- Mode ranking : post-its triés par score, filtre top N possible
- QR code togglable en bas à droite
Planning Poker
Configuration (admin) :
- Mode : sync ou async
- Un ou plusieurs decks (Fibonacci, T-shirt, Impact, Effort, etc.)
Vote (sync) :
- L'admin sélectionne un post-it, lance le vote
- Les voters votent sur tous les decks configurés simultanément
- L'admin voit les validations en temps réel
- L'admin révèle les résultats (consensus + indicateur de dispersion)
- Re-vote possible : les voters retrouvent leur vote précédent, leur validation est remise à zéro — ils peuvent modifier et revalider, ou ne rien faire (vote précédent conservé mais non compté comme validé)
Vue Prez (sync) :
- Photo du board avec résultats overlayés
- Canvas : 1 deck → axe linéaire / 2 decks → matrice
- L'admin bascule entre photo du board et canvas
- QR code togglable en bas à droite
Export
Page de résultats permanente, accessible à tout moment pour chaque board. S'enrichit au fur et à mesure :
- Après l'OCR : liste des textes de chaque post-it (modifiables)
- "Tout copier" : copie tous les textes en plain text, un par ligne (compatible Miro — crée un post-it par ligne au collage)
- Cliquer sur la photo du board : copie l'image du board recadré dans le presse-papier
- Cliquer sur un post-it individuel : copie l'image de ce post-it dans le presse-papier
- Après vote(s) : résultats de toutes les sessions de vote sur ce board
Modèle de données
Table : workshop
| Champ | Type | Notes |
|---|---|---|
slug |
TEXT PK | identifiant URL |
admin_token |
TEXT UNIQUE | accès admin |
name |
TEXT | défaut : 2026-06-18 - 15h01 |
created_at |
INTEGER | timestamp Unix |
Table : board
| Champ | Type | Notes |
|---|---|---|
id |
INTEGER PK | |
workshop_slug |
TEXT | FK → workshop |
name |
TEXT | défaut : "Board 1", "Board 2", etc. |
position |
INTEGER | ordre d'affichage |
phase |
INTEGER | 0 = en attente de photo, 1 = photo reçue, 2 = post-its validés, 3 = OCR terminé |
postits |
TEXT | JSON bounding boxes |
created_at |
INTEGER | timestamp Unix |
Table : postit
| Champ | Type | Notes |
|---|---|---|
id |
INTEGER PK | |
board_id |
INTEGER | FK → board |
position |
INTEGER | numéro du post-it sur le board |
x |
REAL | coordonnée en % |
y |
REAL | coordonnée en % |
w |
REAL | largeur en % |
h |
REAL | hauteur en % |
texte |
TEXT | texte OCR, modifiable |
titre |
TEXT | titre court LLM, modifiable |
corner_top_left |
TEXT | texte détecté par LLM, modifiable, null si vide |
corner_top_right |
TEXT | texte détecté par LLM, modifiable, null si vide |
corner_bottom_left |
TEXT | texte détecté par LLM, modifiable, null si vide |
corner_bottom_right |
TEXT | texte détecté par LLM, modifiable, null si vide |
type_id |
INTEGER | FK → postit_type, null si pas de type défini |
Table : activity
| Champ | Type | Notes |
|---|---|---|
id |
INTEGER PK | |
board_id |
INTEGER | FK → board |
type |
TEXT | dot ou poker |
mode |
TEXT | sync ou async |
config |
TEXT | JSON — dots_per_person, allow_all_on_one (dot) / decks (poker) |
phase |
INTEGER | 0 = configurée, 1 = vote ouvert, 2 = résultats révélés |
created_at |
INTEGER | timestamp Unix |
Table : postit_type
| Champ | Type | Notes |
|---|---|---|
id |
INTEGER PK | |
workshop_slug |
TEXT | FK → workshop |
color |
TEXT | couleur physique (jaune, rose, orange, vert, bleu, blanc) |
name |
TEXT | nom métier défini par l'admin (ex : "Action", "Problème") |
Table : vote
| Champ | Type | Notes |
|---|---|---|
id |
INTEGER PK | |
activity_id |
INTEGER | FK → activity |
postit_id |
INTEGER | FK → postit |
client_id |
TEXT | identifiant du voter (session) |
value |
TEXT | valeur votée (carte poker ou nb de dots) |
deck |
TEXT | null pour dot, nom du deck pour poker |
validated |
INTEGER | 0 = non validé, 1 = validé ("J'ai terminé") |
created_at |
INTEGER | timestamp Unix |
Parcours utilisateurs
Admin
- Arrive sur la home — voit la liste de ses ateliers récents (stockés localement), chaque atelier est un lien vers
/{slug}/{admin_token} - Crée un nouvel atelier (nom par défaut :
2026-06-18 - 15h01) ou clique sur un atelier existant - Est redirigé vers son URL admin
/{slug}/{admin_token}— peut renommer l'atelier depuis cette page (mise à jour : page, DB, et liste sur la home) - Ajoute des boards (un par un, à tout moment), chacun peut être nommé — défaut : "Board 1", "Board 2", etc.
- Affiche le QR code d'un board — à montrer au Shooter pour qu'il accède à la page de prise de photo
Après réception de la photo :
- Voit le board passer à "photo reçue" en temps réel
- Recadre la photo si besoin
- Valide les post-its détectés (corrige faux positifs / ajoute les manquants)
- L'OCR se lance automatiquement en arrière-plan
- Une fois l'OCR terminé — chaque post-it a son image + son texte
Choix de l'activité :
- Choisit l'activité du board : Dot voting ou Planning Poker
- Choisit le mode : sync ou async
- Configure l'activité (voir section Activités)
Lancement du vote (sync) :
- Lance le vote
- Voit l'avancement en temps réel (votes / validations par participant)
- Révèle les résultats
- Peut relancer un re-vote si nécessaire
Lancement du vote (async) :
- Le vote est ouvert dès la configuration
- Voit l'avancement en temps réel
- Ferme le vote quand il le souhaite → résultats visibles sur la page Export
Shooter
- Reçoit le QR code de l'admin (ou l'URL directement)
- Arrive sur la page de l'atelier — voit la liste des boards avec clairement :
- Les boards déjà photographiés (non cliquables)
- Les boards en attente de photo (cliquables)
- Clique sur un board en attente
- Prend la photo ou importe une image
- Envoie → l'admin est notifié en temps réel
- Peut recommencer pour un autre board en attente
Voter
Arrivée :
- Sync : arrive directement sur le board en cours de vote
- Async : arrive sur la liste des boards — chaque board affiche "Votre vote est attendu" (cliquable) ou "Voté" (non cliquable)
Vote Dot voting :
- Deux vues disponibles (toggle) :
- Vue image : photo complète du board avec les post-its overlayés (défaut desktop)
- Vue liste : post-its individuels en liste verticale scrollable (défaut mobile)
- Distribue ses points sur les post-its (+ / - par post-it)
- Clique "J'ai terminé" pour valider
Vote Planning Poker :
- Voit le post-it sélectionné par l'admin (sync) ou le premier post-it non voté (async)
- Vote sur chaque deck configuré
- Clique "J'ai terminé" pour valider
- Navigue au post-it suivant (async) ou attend la sélection de l'admin (sync)
Re-vote Planning Poker (sync) :
- Retrouve son vote précédent affiché
- Sa validation est remise à zéro
- Peut modifier son vote et revalider, ou garder son vote et valider, ou ne rien faire (vote précédent conservé mais non compté comme validé)
Écrans
Page : Home (/)
- Bouton "Créer un atelier" en haut — crée l'atelier et redirige vers la page Admin
- Liste des ateliers récents en dessous — chaque atelier est un lien cliquable vers
/{slug}/{admin_token}, avec une corbeille à droite- 1er clic sur la corbeille → devient rouge pendant 1,5 sec
- 2ème clic avant la fin → supprime l'atelier (DB, photos, storage nav)
- Si pas de 2ème clic → revient à la couleur normale
Page : Admin (/{slug}/{admin_token})
- Nom de l'atelier en haut — renommable via un crayon à droite
- Bouton "Actions" :
- Ajouter un board
- Ouvrir la Prez (nouvel onglet)
- Ouvrir le Shoot (nouvel onglet)
- Copier le lien Prez
- Copier le lien Shoot
- Afficher le QR code Shoot
- Liste des boards — chaque board affiche :
- Son nom
- Son état :
- Phases de capture : "Photo à prendre", "Photo à recadrer", "Post-its à valider", "OCR en cours"
- Une fois prêt : l'activité configurée si elle existe (ex: "Dot voting — sync"), sinon "Prêt"
- Une corbeille à droite (même mécanique que les ateliers : 1er clic rouge 1,5 sec, 2ème clic supprime)
Page : Board Admin (/{slug}/{admin_token}/board/{id})
- Bouton "← Retour" en haut vers
/{slug}/{admin_token} - 4 sections — les 3 dernières se déverrouillent une fois l'OCR terminé :
- Capture — toujours visible
- Export — déverrouillée après OCR
- Dot voting — déverrouillée après OCR
- Planning Poker — déverrouillée après OCR
Section Capture
Phase 0 — En attente de photo :
- Message "En attente d'une photo"
- QR code pour le Shooter
Phase 1 — Photo reçue :
- Outil de recadrage — rectangle ajustable par glisser les bords et coins
Phase 2 — Post-its à valider :
- Canvas avec les post-its détectés (contour rouge par défaut)
- L'admin peut corriger (supprimer faux positifs, ajouter les manquants)
- Création de groupes de post-its :
- Clic "Créer groupe" → sélectionne les post-its → reclique "Créer groupe" pour valider
- Chaque groupe a une couleur de contour distincte (groupe 1 = bleu, groupe 2 = vert, etc.)
- Clic "Supprimer groupe" → clic sur le groupe → reclique "Supprimer groupe" pour confirmer (bouton change de couleur) → les post-its redeviennent individuels
- Bouton "Valider"
Phase 3 — OCR en cours :
- Message "OCR en cours..." (automatique en arrière-plan)
- Une fois terminé → sections Export, Dot voting, Planning Poker se déverrouillent
Section Export
- Liste des post-its avec leur texte — modifiable en cliquant dessus
- Bouton "Tout copier" — copie tous les textes en plain text, un par ligne (compatible Miro)
- Photo du board recadrée — clic dessus → copie l'image du board dans le presse-papier
- Post-its individuels sur la photo — clic sur un post-it → copie son image dans le presse-papier
- Tableau des résultats avec bouton "Copier le tableau" (format TSV pour Google Sheet / Excel) :
- Une ligne par post-it
- Colonnes : Titre (LLM), Texte (OCR), Type (nom métier), puis une colonne par activité de vote lancée
Section Dot voting
- Configuration :
- Mode : sync ou async
- Nombre de points par participant
- Autoriser ou non de mettre tous ses points sur un seul post-it
- Bouton "Lancer le vote"
Mode sync — une fois lancé :
- Voit les validations en temps réel
- Bouton "Révéler les résultats"
- Bouton "Ouvrir la Prez" (nouvel onglet)
- Toggle QR code sur la Prez
Mode async :
- Le vote est ouvert dès la configuration
- Voit l'avancement en temps réel
- Bouton "Fermer le vote"
Section Planning Poker
- Configuration :
- Mode : sync ou async
- Choix d'un ou plusieurs decks — pour chaque deck, sélection des cartes actives
- Bouton "Lancer le vote"
Mode sync — une fois lancé :
- Sélectionne le post-it à voter
- Voit les validations en temps réel
- Bouton "Révéler les résultats"
- Peut relancer un re-vote
- Bouton "Passer au post-it suivant"
- Bouton "Ouvrir la Prez" (nouvel onglet)
- Toggle QR code sur la Prez
- Configuration du canvas pour la Prez :
- Choix du deck sur l'axe X
- Choix du deck sur l'axe Y (optionnel — si un seul deck = axe linéaire)
- Direction de chaque axe (→ ← ↑ ↓)
- Bascule la Prez entre photo du board et canvas
Mode async :
- Le vote est ouvert dès la configuration
- Voit l'avancement en temps réel
- Bouton "Fermer le vote"
Page : Shoot (/{slug}/shoot)
- Nom de l'atelier en haut
- Liste des boards :
- Boards en attente de photo — cliquables
- Boards déjà photographiés — non cliquables, avec indicateur visuel
- Quand le Shooter clique sur un board :
- Page de prise de photo
- Peut prendre une photo ou importer une image
- Bouton "Envoyer" → l'admin est notifié en temps réel
- Retour automatique à la liste des boards
Page : Vote (/{slug}/vote)
Mode sync : arrive directement sur le board en cours de vote
Mode async :
- Nom de l'atelier en haut
- Liste des boards :
- "Votre vote est attendu" — cliquable
- "Voté" — non cliquable
Sur un board en Dot voting :
- Toggle vue image / vue liste (défaut : image desktop, liste mobile)
- Vue image : photo du board avec post-its overlayés, + / - par post-it
- Vue liste : post-its individuels en liste verticale scrollable, + / - par post-it
- Bouton "J'ai terminé"
Sur un board en Planning Poker :
- Post-it en cours affiché (sélectionné par l'admin en sync, premier non voté en async)
- Cartes des decks configurés
- Bouton "J'ai terminé"
- Navigation post-it suivant / précédent (async)
- Re-vote : vote précédent affiché, validation remise à zéro
Page : Prez (/{slug}/prez/{board_id})
- Plein écran, pas de navigation, fond sombre
- Peut afficher :
- Photo du board avec résultats overlayés sur chaque post-it
- Canvas : axe linéaire (1 deck) ou matrice (2 decks), post-its positionnés selon leurs scores, pan & zoom
- QR code contrôlé par l'admin :
- Grand : centré plein écran (pour que tout le monde scanne au début)
- Petit : en bas à droite (discret, pendant le vote)
- Masqué : pas de QR code
- Mise à jour en temps réel via WebSocket
Page : Export (/{slug}/export/{board_id})
Même contenu que la section Export de la page Board Admin, accessible publiquement (sans token admin).