Réalisations

Projets

Une application que j’ai créée, quelques démonstrateurs publiés sur GitHub, et l’étude de cas du portage de l’application sur une deuxième plateforme.

Applications

Mes projets

Allure+

En production sur iOS · Android en cours

Application d'entraînement et de suivi de la performance. Je l'ai créée sur iOS. Le portage Android est en cours. Le site vitrine présente les fonctionnalités et les actualités.

  • iOS
  • SwiftUI
  • Android (en cours)
  • Kotlin
  • Jetpack Compose
  • Sport
allureplus.app (nouvel onglet)

Open source

Démonstrateurs

Des outils courts, pensés pour être lus et réutilisés. Le code est sur GitHub, avec une documentation en français et en anglais.

Architecture et .NET

Une base de projet Azure et deux bibliothèques réutilisables.

  • Starter .NET 10 et Azure (nouvel onglet)

    API minimale qui publie des événements sur Azure Service Bus. Domaine pur, tests, Bicep et CI, sans secret (identité managée et RBAC).

    • .NET 10
    • Azure
    • Bicep
    • CI/CD
  • SFerrand.Http (nouvel onglet)

    Classe de base pour écrire des clients REST et GraphQL typés en .NET. Les erreurs HTTP sont un résultat, pas une exception. Nouvelles tentatives avec backoff, clés d'idempotence, pagination, redirections maîtrisées (les identifiants ne quittent jamais l'origine d'appel) et traces OpenTelemetry. Un paquet de test accompagne la bibliothèque.

    • C#
    • .NET 8+
    • REST
    • GraphQL
    • Sécurité
  • SFerrand.Common (nouvel onglet)

    Utilitaires .NET issus de services en production. Masquage des données sensibles dans les journaux (secrets, URI, cartes, IBAN, NIR, SIREN, SIRET), rédaction dans du texte libre, clés de contrôle (Luhn, IBAN, RIB), comparaison en temps constant et conversions de casse.

    • C#
    • .NET 8+
    • Journalisation
    • RGPD

Calculs d’entraînement

Extraits des calculateurs d’Allure+ et réécrits en C#, avec leurs tests.

  • Sport Metrics (nouvel onglet)

    TSS, TRIMP, forme (CTL, ATL, TSB), traces GPX et plan de course triathlon.

    • C#
    • .NET 10
    • GPX
  • Cycling Physics (nouvel onglet)

    Vitesse à vélo à partir de la puissance, de la pente, du vent et de l’altitude (solveur numérique), et braquets.

    • C#
    • .NET 10
    • Physique
  • Swim Metrics (nouvel onglet)

    Vitesse critique de nage (CSS) selon trois protocoles, en mètres ou en yards, avec SWOLF, Stroke Index et zones d’allure.

    • C#
    • .NET 10
    • Natation
  • Running Performance (nouvel onglet)

    VMA et VO₂max par tests de terrain (Cooper, Léger-Bouchard, Vaussenat…), prédiction de temps (Riegel) et zones de course.

    • C#
    • .NET 10
    • Physiologie
  • Training Zones (nouvel onglet)

    Zones cardiaques (Karvonen), FTP estimé selon le protocole et le niveau, zones de puissance de Coggan.

    • C#
    • .NET 10
    • Puissance
  • HRV Recovery (nouvel onglet)

    Récupération à partir de la VFC : référence personnelle par médiane, score, statut et garde-fous contre les mesures parasitées.

    • C#
    • .NET 10
    • Statistiques robustes

Outils

Deux petits outils en ligne de commande.

Retour d’expérience

Études de cas

Le contexte, les choix et l’état d’avancement.

Portage d’Allure+ de iOS vers Android

Allure+ est d'abord une application iOS écrite en SwiftUI, aujourd'hui publiée sur l'App Store. Le portage Android se fait dans un dépôt séparé, et le code iOS n'est jamais modifié pour le permettre. iOS reste la référence : le comportement doit être le même sur les deux plateformes.

allureplus.app (nouvel onglet)

Enjeu

Le domaine d'iOS (calculateurs, générateurs de plans et de séances) continue d'évoluer pendant le portage. Il faut le reprendre sans l'écrire de travers, et sans courir après une cible mouvante.

Choix d’architecture

  • Domaine partagé, interface nativeKotlin Multiplatform pour le domaine (module shared), SwiftUI sur iOS, Jetpack Compose et Material 3 sur Android.
  • Parité vérifiée par les testsLe Swift sert de référence, je le réécris en Kotlin. Chaque test reprend les mêmes paires entrée / sortie que son équivalent Swift : plus de 800 tests, sur la JVM, sans émulateur.
  • Calculateurs d’abord, plans ensuiteSéquencement revu en cours de route : l’onglet Entraînement est devenu indispensable à la première version.
  • Une architecture d’écran simpleMVVM : un calcul pur et testable, un ViewModel en StateFlow, un écran Compose. Une traduction manquante fait échouer la compilation.
  • Persistance localeSQLDelight pour l’historique, les séances et les plans, DataStore pour le profil. Injection de dépendances à la main, tant que le graphe reste petit.
  • Services système derrière des interfacesHealth Connect, localisation, météo OpenWeatherMap, rappels avec WorkManager. Health Connect fournit du RMSSD là où HealthKit donne du SDNN : l’écart est documenté.
  • Ni compte ni backendiCloud et Sign in with Apple n’ont pas d’équivalent, et les deux plateformes ne se synchronisent pas.
  • Exports et abonnementTexte, calendrier (ICS), FIT pour les montres, intervals.icu. Premium reste derrière un écran « bientôt disponible » jusqu’à Google Play Billing.

Calculateurs, outils de référence, profil, onboarding et onglet Entraînement portés (plans, calendrier, rappels, exports). Reste : Google Play Billing et la publication.