StockPilot
En productionUn logiciel de caisse et de gestion de stock qui fonctionne sans connexion, pour les commerces mal couverts.
- Période
- 2024 — aujourd'hui
- Rôle
- Développeur unique — architecture, interface, backend, infrastructure
- ~30k
- lignes de TypeScript
- 289
- tests automatisés
- 3
- surfaces, un socle
- Solo
- conçu et livré
Obtenir l'application — StockPilot
La caisse tourne dans le navigateur et s'installe comme une application, et les versions bureau et Android se téléchargent directement depuis le serveur du projet — sans magasin entre les deux.
- Télécharger le .exe
Windows
Windows 10 et suivants — 106 Mo
La caisse de bureau, construite par l'intégration continue à chaque changement. Elle continue d'encaisser connexion coupée et se met à jour depuis le même serveur.
- Télécharger l'APK
Android
Android 9 et suivants — 99 Mo
L'APK signé, installé hors magasin. Vous pouvez aussi ouvrir le site dans Chrome et choisir « Installer l'application » si vous préférez ne pas manipuler de fichier.
- Installer
iPhone et iPad
Safari sur iOS 16.4+
Pas d'installateur : ouvrez le site dans Safari, puis Partager et « Sur l'écran d'accueil ». Elle s'ouvre en plein écran et fonctionne hors ligne, sans compte App Store d'aucun côté.
- Indisponible
macOS
macOS 12 et suivants
Constructible en local, mais non signée : elle ne démarre pas sur Apple Silicon sans certificat développeur.
Une boutique mal couverte ne peut pas faire tourner une caisse en ligne. La connexion tombe au pire moment — un client au comptoir, une file derrière lui — et la caisse s’arrête. StockPilot encaisse en local et se réconcilie avec le serveur dès que le réseau revient.
Un socle, trois surfaces
L’application web, l’application mobile et la caisse de bureau partagent la même logique métier, le même catalogue local et le même client de synchronisation, écrits une seule fois en TypeScript dans un monorepo pnpm. Chaque surface garde ses données sur l’appareil et se réconcilie par des opérations commutatives plutôt que par des valeurs absolues — la différence entre « cette vente a retiré 2 unités » et « le stock vaut maintenant 17 », et la raison pour laquelle deux caisses hors ligne convergent au lieu de s’écraser.
Ce qu’il fait
Caisse — encaissement hors ligne, scan de code-barres, entrées libres, rendu de monnaie, tickets imprimables, factures PDF.
Stock — réception, corrections de prix, alertes de rupture, traçabilité complète des mouvements.
Ventes — historique, retours partiels, annulations, remboursements.
Multi-boutique — cloisonnement strict, rôles propriétaire / gérant / employé, super-administration.
Catalogue — import par code-barres depuis Open Food Facts, photos compressées.
Comptabilité — TVA sur prix HT et TTC, factures numérotées, journal d’audit.
L’installation
Aucun magasin d’applications dans la boucle. La caisse est une application web progressive : on ouvre le site dans un navigateur, on choisit « installer », et elle se pose sur l’écran d’accueil comme une application plein écran avec sa propre icône. Un service worker garde l’interface et le catalogue local sur l’appareil : elle s’ouvre et encaisse connexion coupée.
Ce détail compte plus qu’il n’y paraît. Passer par les magasins imposerait un compte développeur Apple, une file de validation et un cycle de publication qui se compte en jours — pour une boutique qui a besoin d’un correctif cet après-midi. L’installation depuis le navigateur met la correction entre les mains d’un caissier dès que la CI est verte.
En exploitation
Docker et Traefik sur un VPS, déployés en SSH depuis GitHub Actions. Les surfaces web et mobile sont en production et servent quotidiennement dans une vraie boutique, et la création d’une nouvelle boutique est ouverte à tous.
La caisse de bureau Electron encaisse hors ligne, tient le stock et l’historique, et se met à jour toute seule. Ce qui lui manque tient en un mot : la signature. Sans certificat, Windows affiche un avertissement SmartScreen au premier lancement — l’installateur est bien publié, mais il faut passer par « Informations complémentaires » pour l’ouvrir.