Projet 01 — Digitale PSM

Une base de données
dans le navigateur.

Digitale PSM est une application web gratuite et à code ouvert pour les entreprises agricoles et horticoles. Elle permet de calculer, consigner et exporter les traitements phytosanitaires. Sans compte, backend ni cloud. Toutes les données restent dans un fichier SQLite sur l'ordinateur de l'utilisateur, et la base s'exécute dans le navigateur via WebAssembly.

Par Abbas Hoseiny·Depuis 04/2025·Version 2.0·Licence MIT

L'utilisation professionnelle de produits phytosanitaires impose de consigner chaque traitement : produit, quantité, surface, culture, date et délai avant récolte. En pratique, ces informations finissent souvent dans des classeurs ou des services cloud avec compte, abonnement et serveur tiers. Digitale PSM propose une autre approche : une application web qui fonctionne comme un logiciel local, conserve les données dans un fichier détenu par l'utilisateur et reste utilisable sans réseau.

Écran d'accueil de Digitale PSM sur ordinateur : créer une base ou ouvrir un fichier existant
Écran d'accueil de Digitale PSM sur téléphone
Fig. 1 — l'écran d'accueildigitale-psm.de sur ordinateur et téléphone

Ni connexion ni inscription. L'application demande simplement de créer une base ou d'ouvrir un fichier existant. Ce fichier est une base SQLite ordinaire sur l'ordinateur de l'utilisateur : il est facile à copier, à sauvegarder et à lire avec tout outil compatible.

Fonctionnalités

Calculer, consigner, justifier.

Calcul
Dose selon la surface ou la quantité, conversion d'unités, profils de produits pour les combinaisons fréquentes, sélection rapide des codes EPPO et des stades BBCH.
Traçabilité
Enregistrement de chaque traitement, vue calendrier avec filtres et export PDF ou CSV.
Autorisations officielles
Après import, la base des autorisations du BVL se trouve dans votre propre fichier. Recherche par culture, organisme nuisible et substance active, même hors ligne.
Sur ordinateur, hors ligne
Installation comme application de bureau depuis Chrome ou Edge, démarrage sans réseau, réouverture de la dernière base et ouverture des fichiers .sqlite par double-clic. Localisation GPS des parcelles.
Technique

Comment les données sont stockées

L'architecture habituelle serait un serveur avec une base de données et un compte par utilisateur. Je voulais que les données restent chez l'entreprise, dans un seul fichier sur son ordinateur. La base devait donc s'exécuter au même endroit que les données : dans le navigateur.

1. Un fichier plutôt qu'un serveur

L'application se compose uniquement de fichiers HTML, CSS et JavaScript statiques, servis par GitHub Pages. Aucun serveur ne reçoit les enregistrements. SQLite est compilé en module WebAssembly (@sqlite.org/sqlite-wasm), inclus localement dans l'application, avec empreinte et version attribuées lors de la compilation comme pour les autres fichiers. Rien n'est récupéré depuis un CDN tiers pendant l'exécution ; la base peut donc fonctionner hors ligne.

Un détail essentiel : le fichier sur le disque est une véritable base SQLite, pas un format d'exportation maison. Il s'ouvre dans tout outil SQLite, se sauvegarde, se copie et se transfère sur un autre ordinateur.

2. Trois couches

La base ne s'exécute jamais sur le fil principal du navigateur, mais dans son propre Web Worker. L'interface reste ainsi réactive pendant un import volumineux. Les deux communiquent uniquement par messages.

Interface · fil principal
Astro, TypeScript, Bootstrap
  • Formulaires, calendrier, listes et exports PDF/CSV
  • État et bus d'événements
  • Accès à la base uniquement par messages
  • Conserve l'accès au fichier et y écrit les données
⇄postMessage
ID, délai maximal,
transfert de grands tampons
Base de données · Web Worker
SQLite 3.54 via WebAssembly
  • Schéma avec migrations : user_version de 1 à 11
  • WAL, clés étrangères et cache de pages de 20 Mo
  • Requêtes, listes paginées et import du BVL
  • Export de la base entière sous forme d'octets
⇄octets
export · import
Stockage · chez l'utilisateur
Un fichier .sqlite
  • File System Access API ; référence du fichier conservée dans IndexedDB pour la réouverture au démarrage
  • Mode OPFS si le navigateur le permet
  • Solutions de repli : fichier JSON, localStorage et mémoire

3. L'enregistrement, étape par étape

  1. Une saisie, par exemple un nouveau traitement, est envoyée au worker par message. Chaque message porte un identifiant et un délai maximal ; la réponse revient de façon asynchrone.
  2. Le worker écrit dans sa base SQLite, située en mémoire ou, si le navigateur l'autorise, dans l'Origin Private File System (OPFS).
  3. Il exporte ensuite toute la base sous forme d'octets (sqlite3_js_db_export) et transmet le tampon au fil principal sans copie, grâce au mécanisme Transferable.
  4. Le fil principal écrit ces octets dans le fichier .sqlite de l'utilisateur via son accès au fichier : createWritable, write, puis close. Le fichier sur disque contient ainsi une base complète et cohérente.
  5. Les changements rapprochés sont regroupés. Si une écriture est déjà en cours, l'application mémorise simplement qu'une autre sera nécessaire ensuite. Une série de modifications provoque donc une écriture, pas une écriture par frappe.

4. Reconnaître le contenu du fichier

À l'ouverture, l'application lit les octets et vérifie la signature initiale : SQLite format 3. Le contenu détermine le format, pas l'extension. Un fichier nommé .json peut contenir une base binaire. Les anciennes versions utilisaient JSON, et ce mélange a un jour fait paraître « vide » une base intacte. Depuis, la signature fait foi.

S'il s'agit de SQLite, le worker en fait la base active via sqlite3_deserialize. En mode OPFS, OpfsDb.importDb l'importe dans le fichier persistant. S'il s'agit de JSON, les données sont importées comme un instantané. Les deux chemins aboutissent à la même base et exécutent les migrations.

5. La préparation des données du BVL

La base officielle des autorisations du BVL, l'Office fédéral allemand de la protection des consommateurs et de la sécurité alimentaire, est accessible par une API publique. Elle n'est toutefois pas adaptée à une utilisation directe dans le navigateur : nombreux points d'accès, nombreuses requêtes, aucun usage hors ligne. Les données sont donc préparées en amont par une chaîne dédiée dans le dépôt public pflanzenschutz-db :

  1. Tous les deux jours, GitHub Actions récupère les données de l'ensemble des points d'accès du BVL, les valide et les enrichit, notamment avec les indicateurs d'usage en agriculture biologique, les noms des substances actives et les mentions de danger.
  2. Le résultat est un fichier SQLite, compressé en Brotli et en ZIP, publié sur GitHub Pages avec un manifeste indiquant la taille et l'empreinte SHA-256 de chaque fichier.
  3. L'application charge le manifeste, choisit le plus petit format que le navigateur peut décompresser, affiche la progression et transmet les octets au worker.
  4. Le worker ouvre le téléchargement comme une base temporaire en mémoire, puis copie ses tables dans la base de l'utilisateur en une seule transaction, dans l'ordre des dépendances pour préserver les clés étrangères.
  5. Tout le catalogue se trouve alors dans le fichier .sqlite de l'utilisateur et reste consultable hors ligne. Un journal interne à la base indique la version importée.
État au 25 octobre 2026Valeur
Produits du catalogue2,165
Usages autorisés, par produit, culture et organisme nuisible30,836
Substances actives482
Téléchargement, Brotli / ZIP6,8 Mo / 12,5 Mo
Après décompression, SQLite113 Mo

6. Hors ligne et comme application

À l'installation, un service worker met en cache tous les fichiers de compilation identifiés par leur empreinte, module WebAssembly compris. L'application démarre ensuite sans réseau. Chaque compilation inscrit une nouvelle version du cache dans le service worker ; sinon les utilisateurs de l'application installée conserveraient l'ancien code, car le navigateur ne réinstalle pas un service worker identique octet pour octet.

Installée sur ordinateur, Digitale PSM s'enregistre via la File Handling API pour les extensions .sqlite, .db et .json. Un double-clic dans l'explorateur ouvre directement la base dans l'application. La référence du dernier fichier est conservée dans IndexedDB ; au démarrage suivant, l'application redemande seulement l'autorisation et le rouvre.

7. Performances et robustesse

8. Les limites actuelles

9. Fiche technique

Applicationdigitale-psm.de — gratuite, sans publicité ni compte
LangueAllemand ; l'application suit la réglementation allemande sur les autorisations et la base du BVL
Début du projetAvril 2025 ; version actuelle 2.0
Licence et codeMIT, code source sur GitHub
TechnologiesAstro 5, TypeScript, Bootstrap 5 inclus localement, SQLite 3.54 via WebAssembly, Web Worker, service worker et manifeste d'application web
StockageFichier SQLite détenu par l'utilisateur via la File System Access API ; OPFS si disponible ; solutions de repli avec fichier JSON et localStorage
Données d'autorisationAPI du BVL, préparation dans pflanzenschutz-db par GitHub Actions tous les deux jours, distribution en Brotli/ZIP avec manifeste et SHA-256
HébergementFichiers statiques sur GitHub Pages ; compilation et déploiement par GitHub Actions
Projet associést.digitale-psm.de : tableau de statistiques de la base du BVL, avec requêtes SQL directement dans le navigateur