September 11, 2026

Swift vibing ma courbe de poids

J’ai une balance Withings Body+ que j’utilise pour suivre mon poids, et j’avais écrit par le passé une simple app web en Python, qui utilise OAuth2 + des appels API avec les serveurs de Withings afin de récupérer mes données et les afficher en utilisant matplotlib. Elle utilise pandas pour calculer des insights, la moyenne mobile, les tendances globales et annuelles et tracer tous ces éléments ainsi qu’un IMC coloré. Les données sont stockées localement dans un fichier csv, les nouvelles données de Withings sont ajoutées au début du csv, pas de sqlite, du tout simple.

Ça fonctionne bien, mais je dois penser à l’exécuter, parfois j’oublie dans quel répertoire il se trouve. J’ai beaucoup touché le code, je dirais que cela m’a pris plusieurs jours pour obtenir quelque chose qui me convenait, le code n’est pas propre, j’ai des portions commentées, des clés en dur, etc.

Hier, même problème: où se trouve encore mon script Python ? Bref, j’ai demandé à GPT-5.6 Sol de convertir ça en une application native macOS en utilisant SwiftUI. C’était un simple script Python (600 lignes incluant le HTML pour rendre la page), évidemment GPT l’a fait en un seul prompt.

En moins de 15 minutes, cela fonctionnait parfaitement. J’ai ensuite passé 15 minutes à discuter avec pour peaufiner l’affichage et que ça me plaise un peu plus, et encore 15-20 minutes supplémentares pour obtenir de meilleurs insights.

C’est bien mieux que ce que j’aurais produit moi-même en plusieurs jours de travail à plein temps. J’aurais dû passer des heures sur la documentation Swift juste pour les graphiques, car je ne l’ai pratiquement jamais utilisée, et en comparaison à matplotlib je n’y connais rien.

Maintenant, j’ai une application native macOS qui se trouve dans mon dock, la synchronisation avec Withings se fait sans problème, bref c’est fantastique. Je pourrais l’étendre avec d’autres infos comme la masse grasse et autres métriques que la balance Withings enregistre, peut-être pour un autre après-midi où je m’ennuie.

J’ai généré un fichier de données de poids fictif (GPT a fait un script pour ça) afin de vous montrer à quoi ça ressemble.

Fonctionnalités

  • Graphique (mesures brutes, moyenne mobile, lignes de tendance globale et annuelle, zones d’IMC, poids max/min/le plus récent)
  • Support de plusieurs plages de temps (toutes les données, dernière semaine/mois, année en cours, etc.)
  • Mini-carte pour sélectionner et zoomer rapidement sur des périodes.
  • Infobulles de survol avec plein d’informations.
  • Métriques du tableau de bord pour le poids actuel, la progression vers l’objectif, le poids max/min, et la différence avec le maximum de la période visible.
  • Insights (tendance hebdomadaire, date projetée de l’objectif lorsque disponible, distance à l’objectif, amplitude, etc.)
  • Affichage de toutes les phases majeures de perte et de reprise de poids.
  • Synchronisation des mesures récentes depuis Withings.
  • Outils de qualité CSV pour détecter des valeurs aberrantes , doublons, etc.
alex@mac balance % cloc --exclude-ext=csv,yaml,md .
      60 text files.
      26 unique files.
    2639 files ignored.

github.com/AlDanial/cloc v 2.08  T=0.11 s (230.4 files/s, 41239.1 lines/s)
---------------------------------------------------------------------------
Language                 files          blank        comment           code
---------------------------------------------------------------------------
Swift                        9            308              3           2435
JSON                         7             21              0            830
Python                       2            124            280            380
XML                          6              0              0            205
Bourne Shell                 2             11              0             57
---------------------------------------------------------------------------
SUM:                        26            464            283           3907
---------------------------------------------------------------------------

À la prochaine !