
SIGNA est une application Expo (React Native) couplée à une API Hono/Neon qui structure le cycle de vie d’un signalement urbain : du citoyen qui déclare un problème jusqu’à la validation finale par la collectivité. Quatre espaces isolés (citoyen, collectivité, vérification, intervention) appliquent une machine à états stricte, avec unités d’intervention type Active Directory, preuves photo (R2) et attribution automatique du quartier à partir des coordonnées GPS.
01 : Contexte
Pourquoi ce projet
Les collectivités manquent souvent d’un canal unique pour recevoir, prioriser et suivre les signalements terrain. Les échanges restent fragmentés (appels, mails, WhatsApp) et la responsabilité opérationnelle (constat vs réparation vs validation) est floue.
02 : Problématique
Le problème
Comment permettre à un citoyen de signaler un incident géolocalisé, et à une collectivité de le piloter jusqu’à résolution, avec une séparation claire entre vérification terrain et intervention technique ?
03 : Solution
Ce qui a été développé
App Expo Router + API Hono sur Neon Postgres, auth JWT, realtime WebSocket, stockage R2, unités/membres d’intervention, et écran collectivité pour confirmer, affecter et valider. Le technicien soumet une preuve ; seule la collectivité clôture en « résolu ».
04 : Architecture
Schéma technique
- 01
Frontend mobile : Expo / React Native (Expo Router)
- 02
Backend : Hono (Node) — auth, incidents, org, chat, uploads
- 03
Base de données : Neon Postgres
- 04
Stockage médias : Cloudflare R2
- 05
Temps réel : WebSocket (/ws)
05 : Fonctionnalités
Ce que le projet fait
4 espaces isolés par rôle : citoyen, collectivité, vérification, intervention
Workflow d’états (envoye → verification → confirme → prise en charge → intervention → résolution → résolu)
Création de signalement multi-étapes (type, position, détails, photo, récap)
Carte interactive des incidents ouverts + disparition des dossiers clôturés
Unités d’intervention + techniciens (liaison type Active Directory)
Affectation collectivité : vérificateur et/ou unité ± technicien
Upload photos via API vers Cloudflare R2 (preuve obligatoire à la soumission de résolution)
Attribution automatique du quartier depuis les coordonnées GPS
Notifications temps réel (WebSocket) : toast in-app + notifs locales
Chat citoyen avec les signalements affichés comme notifications
Comptes démo multi-rôles pour démontrer le parcours de bout en bout
06 : Technologies
Stack utilisée
07 : Défis techniques
Problème → résultat
Isoler strictement les espaces sans mélanger les rôles ; encoder une machine à états partagée client/serveur ; fiabiliser l’upload photo (PUT R2 vides côté RN) ; gérer Expo Go SDK 57 (login obligatoire + limites push) ; afficher un lieu lisible (quartier) plutôt que de simples coordonnées.
RésultatLa gouvernance métier (qui décide vs qui constate vs qui répare) doit être modélisée dans le code (FSM × rôle). Les uploads mobiles passent mieux par une API serveur que par des URL présignées directes. Le reverse geocoding + un référentiel local de quartiers améliore fortement l’UX métier.
08 : Sécurité
Contrôles concernés
- Auth JWT obligatoire pour les actions métier
- Isolation des espaces par rôle (useSpaceGate)
- Transitions de statut refusées si hors machine à états
- Technicien / vérificateur limités aux dossiers qui leur sont assignés
- Propriétaire seul autorisé à modifier/supprimer son signalement
- Secrets hors client (DATABASE_URL, JWT, R2 dans server/.env)
09 : Résultats
Ce qui est observable
- Parcours démo bout-en-bout opérationnel sur 4 comptes
- Pilotage collectivité avec équipes et affectations par unité
- Preuves photo visibles dans le détail du dossier
- Lieu affiché sous forme de quartier (ex. attribution auto)
10 : Galerie
Visuels
Cliquez pour voir l’image en entier