workshop.arrosoir.net

Parcours utilisateurs — document de travail

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

Vue Prez

Disponible en mode sync. Peut afficher :


Activités par board

Dot voting

Configuration (admin) :

Vue Prez (sync) :

Planning Poker

Configuration (admin) :

Vote (sync) :

Vue Prez (sync) :

Export

Page de résultats permanente, accessible à tout moment pour chaque board. S'enrichit au fur et à mesure :


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

  1. Arrive sur la home — voit la liste de ses ateliers récents (stockés localement), chaque atelier est un lien vers /{slug}/{admin_token}
  2. Crée un nouvel atelier (nom par défaut : 2026-06-18 - 15h01) ou clique sur un atelier existant
  3. 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)
  4. Ajoute des boards (un par un, à tout moment), chacun peut être nommé — défaut : "Board 1", "Board 2", etc.
  5. 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 :

  1. Voit le board passer à "photo reçue" en temps réel
  2. Recadre la photo si besoin
  3. Valide les post-its détectés (corrige faux positifs / ajoute les manquants)
  4. L'OCR se lance automatiquement en arrière-plan
  5. Une fois l'OCR terminé — chaque post-it a son image + son texte

Choix de l'activité :

  1. Choisit l'activité du board : Dot voting ou Planning Poker
  2. Choisit le mode : sync ou async
  3. Configure l'activité (voir section Activités)

Lancement du vote (sync) :

  1. Lance le vote
  2. Voit l'avancement en temps réel (votes / validations par participant)
  3. Révèle les résultats
  4. Peut relancer un re-vote si nécessaire

Lancement du vote (async) :

  1. Le vote est ouvert dès la configuration
  2. Voit l'avancement en temps réel
  3. Ferme le vote quand il le souhaite → résultats visibles sur la page Export

Shooter

  1. Reçoit le QR code de l'admin (ou l'URL directement)
  2. 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)
  3. Clique sur un board en attente
  4. Prend la photo ou importe une image
  5. Envoie → l'admin est notifié en temps réel
  6. Peut recommencer pour un autre board en attente

Voter

Arrivée :

Vote Dot voting :

  1. 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)
  2. Distribue ses points sur les post-its (+ / - par post-it)
  3. Clique "J'ai terminé" pour valider

Vote Planning Poker :

  1. Voit le post-it sélectionné par l'admin (sync) ou le premier post-it non voté (async)
  2. Vote sur chaque deck configuré
  3. Clique "J'ai terminé" pour valider
  4. Navigue au post-it suivant (async) ou attend la sélection de l'admin (sync)

Re-vote Planning Poker (sync) :


Écrans

Page : Home (/)

Page : Admin (/{slug}/{admin_token})

Page : Board Admin (/{slug}/{admin_token}/board/{id})

Section Capture

Phase 0 — En attente de photo :

Phase 1 — Photo reçue :

Phase 2 — Post-its à valider :

Phase 3 — OCR en cours :

Section Export

Section Dot voting

Mode sync — une fois lancé :

Mode async :

Section Planning Poker

Mode sync — une fois lancé :

Mode async :

Page : Shoot (/{slug}/shoot)

Page : Vote (/{slug}/vote)

Mode sync : arrive directement sur le board en cours de vote

Mode async :

Sur un board en Dot voting :

Sur un board en Planning Poker :

Page : Prez (/{slug}/prez/{board_id})

Page : Export (/{slug}/export/{board_id})

Même contenu que la section Export de la page Board Admin, accessible publiquement (sans token admin).