Bonjour à tous,
Mise à jour 09/05/2026
Je partage un repo qui explore un pattern simple : des interfaces mobiles complètes au-dessus d’un document Grist, empaquetées en APK Android avec Capacitor. Le repo Grist-AppStore contient 4 apps démonstratives, testables immédiatement dans le navigateur, et les briques pour en construire d’autres.
Pourquoi pas juste un widget ou une PWA
Les widgets Grist custom sont puissants au bureau, mais se heurtent à trois murs dès qu’on veut sortir sur le terrain :
- Sandbox iframe : l’accès au micro, à la caméra ou au GPS via
getUserMedia()est capricieux (Permissions Policy violation selon navigateur et version de Grist) - CORS : une page hébergée hors du domaine Grist ne peut pas toujours taper dans l’API Grist —
grist.numerique.gouv.frn’autorise pas CORS externe - Pas d’offline : réseau qui coupe = tout s’arrête
L’APK fait sauter les trois. Le WebView natif voit les capteurs comme une app classique, le HTTP natif ignore CORS, et le cache local tient hors réseau.
Ce qu’on peut tester tout de suite
Chaque app est utilisable directement dans le navigateur mobile (mode PWA, sans rien installer) :
| App | Ce qu’elle fait | Tester |
|---|---|---|
| SCOUT IA | Voix → transcription IA streaming + photo → analyse VLM + GPS auto → record Grist avec PJ audio et photo | Lancer |
| SCOUT Vision | Caméra → détection d’objets temps réel (80 classes, 15-25 FPS, embarqué) → streaming géolocalisé vers Grist | Lancer |
| SCOUT ML Lite | Photographier des exemples → nommer les classes → entraîner un classificateur dans le navigateur en 5s → prédire en temps réel | Lancer |
| SCOUT ML Pro | Annoter des images (bbox au doigt) → gérer un dataset → exporter en COCO JSON → charger un modèle custom .tflite | Lancer |
Le catalogue présente l’ensemble.
En mode navigateur : caméra, GPS et IA embarquée fonctionnent. La sync Grist nécessite soit une instance avec CORS, soit le mode APK pour les instances comme grist.numerique.gouv.fr.
Ce que chaque app démontre
SCOUT IA — Saisie vocale terrain pour l’inspection d’infrastructure. L’agent enregistre un commentaire audio, la transcription arrive en streaming par chunks de 10 secondes (STT via SSPCloud ou Albert API). Il peut aussi prendre une photo qui est analysée par un VLM (gemma4-31b). Le LLM extrait les champs structurés (type d’observation, urgence, actions, matériaux, surface). Audio et photo sont sauvés comme pièces jointes Grist sur le record.
SCOUT Vision — Détection d’objets en temps réel depuis la caméra. Le modèle COCO-SSD (TensorFlow.js, choix entre 3 variantes) tourne entièrement dans le navigateur, sans serveur. Overlay de bounding boxes sur le flux vidéo, GPS continu avec vitesse et cap, déduplification spatiale (IoU + cooldown), batch sync vers Grist toutes les 3 secondes.
SCOUT ML Lite — Un « Teachable Machine » de terrain. L’agent photographie des exemples pour chaque classe (ex: « fissure » / « sain »), l’app entraîne un classificateur par transfer learning (MobileNet V2) directement dans le navigateur en 2-5 secondes, puis prédit en temps réel. Galerie éditable, classes renommables, modèles sauvés et exportables. Aucun serveur, aucune compétence ML requise.
SCOUT ML Pro — Pour aller au-delà de la classification : annotation de bounding boxes au doigt, statistiques du dataset par classe, export COCO JSON pour entraînement GPU (SSPCloud), chargement de modèles pré-configurés (EfficientDet-Lite0/Lite2) ou custom (.tflite, model.json). Les deux apps ML partagent le même format de dataset — les photos des agents terrain peuvent être reprises pour entraîner un détecteur plus précis.
La recette pour construire une autre app
Le repo contient un dossier shared/ avec des modules JS réutilisables :
- grist-client.js — Client Grist complet (CRUD, applyUserActions, upsert, requêtes SQL, attachments, auto-auth en mode widget)
- storage.js — Persistance locale + file d’attente offline (IndexedDB)
- sensors.js — Capteurs mobiles (GPS continu, caméra, micro par chunks, accéléromètre, boussole, réseau)
- batch-sync.js — Sync par batch avec déduplification spatiale et temporelle
- ml-*.js — Dataset, entraînement in-browser, inférence temps réel, gestion de modèles
Pour créer une nouvelle app Grist terrain (inventaire QR, comptage trafic, relevé acoustique, formulaire dynamique…) :
- Une table Grist = la spécification de l’app
- Une page HTML/JS qui importe les modules partagés et ajoute la logique métier (~300-500 lignes spécifiques)
- Capacitor empaquette en APK Android
- GitHub Actions (un seul workflow paramétré) build l’APK à chaque tag → release en ~2 min
Pas de serveur intermédiaire, pas de framework, pas de compte Play Store. Chaîne souveraine complète (SSPCloud / Albert pour l’IA, Grist DINUM pour les données).
Ce que je cherche
- Des retours terrain sur les 4 apps (surtout ML Lite — est-ce que le train en 5s marche sur vos téléphones ?)
- Des cas métier concrets à transformer en app suivante
- Des avis techniques sur les permissions widget iframe (si quelqu’un a fait fonctionner
getUserMedia()de façon reproductible dans un widget Grist, je suis preneur)
Repo et releases APK : github.com/nic01asFr/Grist-AppStore
Tester en ligne : nic01asfr.github.io/Grist-AppStore