Réalisations

Pour des clients

Les missions menées en indépendant.

Prime Services et Vanex Propreté

Des applications métier, du back-end à l’iPhone.

Depuis octobre 2023, en DevOps : le développement full stack des applications de Prime Services et de Vanex Propreté — back-end Micronaut, front-end Angular, application iOS.

  • Micronaut
  • Angular
  • Swift
  • Kubernetes

Outils de méthode

Ce que SSK IT a construit pour mener ses projets de bout en bout.

SSK Canon : une décision de cadrage, avec les options écartées, leurs pour et contre, et l’option retenue.

SSK Canon

Savoir, six mois plus tard, pourquoi le logiciel fait ce qu’il fait.

Garder, sur toute la vie d’un produit, la trace de ce que fait chaque fonctionnalité et de pourquoi elle le fait ainsi. Le référentiel — domaines, fonctionnalités, règles de gestion — vit dans Git, et des cadrages datés le transforment.

Le point délicat

Le référentiel doit rester le reflet exact des cadrages validés, alors que chacun peut modifier un fichier directement dans Git. À sa mise en service, trente et un écarts sont apparus dans un référentiel qui passait tous les contrôles : aucun ne vérifiait le texte des règles.

La solution retenue

Plutôt que de rejouer l’historique ou d’interdire l’édition directe, une action GitHub recalcule l’état attendu, le compare au réel et n’écrit que la différence, en tout ou rien. Relancée sans risque à chaque fusion, elle détecte du même coup toute dérive.

  • Angular
  • PWA
  • Git
  • GitHub Actions
SSK Recon : l’état de Dependabot sur chaque dépôt d’une organisation, avec la cause d’un état inconnu.

SSK Recon

Trente dépôts, un seul écran.

Surveiller tout un parc de dépôts GitHub : les mises à jour de dépendances qui attendent et les failles connues, la saturation d’un registre de conteneurs, la durée de la CI et ses runners, les clusters Kubernetes.

Le point délicat

GitHub compte ses limites par personne et non par jeton : plusieurs jetons et plusieurs écrans puisent dans le même budget. Et dépasser la limite par minute renvoie un refus en tout point semblable à un manque de droits.

La solution retenue

Sans serveur intermédiaire, l’application régule elle-même ses appels, compte par compte : six en parallèle, un débit plafonné sous la limite, une reprise après le délai demandé. Elle affiche le budget restant, et ne confond jamais une limite atteinte avec un droit manquant.

  • Tauri
  • Vue
  • Harbor
  • Kubernetes

Applications de bureau et mobiles

Des produits complets, de la conception à la livraison.

Mnésisk

Son téléphone sur son ordinateur, sans passer par le cloud.

Consulter depuis son ordinateur les contacts, le journal d’appels et les SMS de son téléphone, et envoyer des SMS : l’ordinateur et le téléphone se parlent directement, sur le réseau local.

Le point délicat

Le téléphone et l’ordinateur doivent se reconnaître sur un Wi-Fi qu’on ne contrôle pas, sans aucun serveur pour se porter garant. Faire circuler le code d’appairage, même sous forme d’empreinte, l’aurait livré à un intrus en une fraction de seconde.

La solution retenue

Le code à six chiffres, scanné ou saisi, authentifie un échange de clés (SPAKE2) qui ne le fait jamais circuler, et lie les certificats des deux appareils. Ni autorité de certification ni service en ligne : des briques cryptographiques éprouvées, écrites une seule fois dans le cœur Rust partagé.

  • Tauri
  • Vue
  • Kotlin
  • Jetpack Compose
  • Rust

Spoolisk

Remettre en service une imprimante que plus rien ne sait piloter.

Redonner une place sur le réseau à une imprimante ancienne, que les ordinateurs d’aujourd’hui ne savent plus piloter : un petit boîtier la rend joignable, et son prototype sur Raspberry Pi la met à disposition d’un Mac ou d’un PC sans rien installer.

Le point délicat

L’imprimante perd son firmware à chaque extinction, et accepte alors un travail en entier sans rien imprimer ni signaler d’erreur. La surveiller est délicat : l’USB n’admet qu’un lecteur à la fois, et l’interroger pendant son démarrage la fige.

La solution retenue

Plutôt que de réécrire le service d’impression éprouvé, un petit service l’observe de l’extérieur et n’interroge l’imprimante qu’au repos ; le boîtier lui renvoie lui-même son firmware à l’allumage. L’état publié ne dit que ce qui est sûr : « transmis », jamais « imprimé ».

  • Rust
  • Raspberry Pi
  • CUPS
  • p910nd

JoyBattery

La batterie de ses manettes, d’un coup d’œil.

Voir dans la barre des menus du Mac le niveau de batterie de ses manettes de jeu Bluetooth, et être prévenu quand l’une d’elles faiblit.

Le point délicat

En Bluetooth, une DualShock 4 rallumée n’envoie qu’un rapport réduit, sans niveau de batterie, et macOS ne la fait jamais passer au rapport complet. Lire soi-même les octets bruts aurait marché, mais sur un format non documenté, où une erreur donne un chiffre plausible et faux.

La solution retenue

À la connexion, l’application lit une seule fois le rapport de calibration de la manette, comme le fait le pilote Linux, ce qui suffit à la faire basculer. Le pourcentage reste celui que fournit macOS ; la lecture directe n’est qu’un recours, à activer explicitement.

  • Swift
  • macOS
  • GameController

SSK Audio

Ses livres audio, sans compte, sans algorithme, sans fuite.

Écouter sa propre bibliothèque de livres audio sur son téléphone, depuis des fournisseurs qu’on déclare soi-même : pas de compte, pas de recommandation, et ce qu’on écoute ne quitte jamais l’appareil.

Le point délicat

L’application garantissait que rien ne quitte le téléphone par le moyen le plus sûr — aucun accès réseau — et devait pourtant aller chercher des livres en ligne. Une fois la porte ouverte, aucun contrôle ne prouve plus seul où vont les données, d’autant qu’une bibliothèque tierce peut ajouter ses propres permissions sans qu’une ligne du projet change.

La solution retenue

Plutôt que d’abandonner la promesse ou de faire une seconde application, elle a été reformulée — aucune donnée d’écoute ne sort —, en écrivant ce qu’elle perdait. La construction échoue dès qu’une permission absente d’une liste explicitement admise apparaît, même apportée par une dépendance.

  • Kotlin
  • Android
Explorateur S3 : l’arborescence d’un bucket, dossiers dépliés à la demande, et les comptes AWS, Scaleway et MinIO.

Explorateur S3

Un stockage S3 qui se parcourt comme un disque.

Parcourir et gérer ses buckets S3 — AWS, Scaleway, MinIO — depuis le poste de travail, le secret d’accès gardé dans le trousseau du système.

Le point délicat

Un stockage S3 n’a pas de dossiers, seulement des noms de fichiers, et la première version listait tout le contenu d’un bucket pour en reconstruire l’arborescence : afficher un dossier faisait payer, en attente, en mémoire et en facturation, la totalité du stockage. S3 n’offre par ailleurs aucune recherche.

La solution retenue

Chaque dossier n’est demandé qu’au moment où on l’ouvre, S3 faisant lui-même le regroupement, et une liste incomplète est toujours signalée comme telle. La recherche parcourt le stockage côté natif et ne remonte que les résultats, au fil de l’eau, avec de quoi l’arrêter.

  • Tauri
  • Vue
  • Rust
  • SQLite

SSK Compta

Toute une comptabilité dans un seul fichier, sans serveur ni base.

Tenir les journaux comptables d’une micro-entreprise — factures émises, dépenses, comptes bancaires — sur ordinateur et sur Android : l’application parle directement au stockage objet.

Le point délicat

Sans serveur ni base de données, toute la comptabilité tient dans un seul fichier sur un stockage en ligne, qui ne sait pas ajouter une ligne à la fin d’un fichier. Chaque saisie le réécrit donc en entier, et deux appareils qui écrivent en même temps effaceraient silencieusement le travail de l’autre.

La solution retenue

Le stockage n’accepte une réécriture que si le fichier n’a pas changé depuis sa lecture ; en cas de conflit, l’application relit, rejoue la saisie et ne retente qu’une fois. Rien n’est jamais modifié ni supprimé — une correction est une nouvelle écriture —, et l’historique des versions du stockage sert de filet.

  • Tauri
  • Rust
  • Android
  • Object Storage

Applications web

Des outils métier, accessibles depuis un navigateur.

Dossiers de financement

D’une annonce immobilière au dossier de prêt, sans ressaisie.

Préparer le dossier de financement d’un projet immobilier de chambres d’hôtes : plan de financement, mensualité, coût du crédit, couverture des annuités et avancement des démarches.

Le point délicat

Il fallait créer un dossier à partir d’une annonce immobilière ouverte dans le navigateur, sans ressaisie, mais sans confier à l’extension le moindre accès au compte, ni la laisser interroger le site d’annonces.

La solution retenue

L’extension se contente de lire la page déjà affichée et de la passer à l’application, où l’on est connecté : c’est elle qui enregistre, sous les droits de l’utilisateur, après un aperçu modifiable. Un seul code produit les versions Chrome et Firefox.

  • Angular
  • Supabase
  • PostgreSQL
  • WebExtensions

Rétro-gaming

Des projets personnels, cadrés et outillés comme les autres.

RaSSK : le rapport d’un scan, avec les jeux reconnus et chaque version trouvée, région et qualité du fichier.

RaSSK

Reconnaître chaque jeu d’une collection, version par version.

Calculer l’empreinte de ses fichiers de jeu selon la méthode de RetroAchievements, pour les identifier auprès du service, puis organiser la bibliothèque.

Le point délicat

Une empreinte mal calculée ne provoque aucune erreur : le jeu est simplement déclaré inconnu, et l’utilisateur croit sa collection non prise en charge. Les jeux sur disque ajoutent une difficulté : lire un système de fichiers à l’intérieur de l’image, avant même de calculer.

La solution retenue

Les cartouches sont calculées en Rust, d’après le code de référence plutôt que sa documentation résumée ; les disques sont confiés à la bibliothèque officielle, embarquée plutôt que réécrite. Un second calcul peut être demandé, et tout désaccord s’affiche au lieu d’être corrigé en silence.

  • Rust
  • Tauri
  • Angular
  • SQLite

Batocera Parallaxe

Ce qui existe et ce qu’on possède, dans un seul catalogue.

Un prototype d’interface plein écran, pilotée à la manette, pour Batocera : réunir le catalogue des jeux qui existent et la collection réellement installée.

Le point délicat

Rapprocher le catalogue et les fichiers présents : par le nom, cela semble marcher, mais les conventions de nommage se contredisent, et une fausse correspondance s’affiche exactement comme une vraie. Sur une collection souvent irremplaçable, c’est l’erreur la plus coûteuse et la moins visible.

La solution retenue

Seule une empreinte identique du contenu permet de conclure ; le nom ne fait que proposer, et l’écran le dit. Le prototype lit ces empreintes dans ce que Batocera a déjà constitué, sans compte ni calcul, au prix assumé de ne montrer pour l’instant que les jeux installés.

  • Godot
  • Batocera