Aller au contenu
Portfolio / Éd. 2026— Chargement —
N° 00 / Bonjour

HugoBoulicaut–Raffort

Fullstack JS — React / Nuxt / Flutter / Python
Annecy — France
Dispo alternance / Sept. 2026

J'écris des interfaces qui tiennent. Rapides, lisibles, sans approximation — du code qu'on peut relire six mois plus tard sans grimacer.

01 / À propos

Je code depuis 2022. Une obsession : que ça tienne en production — l'UX, les détails, et le code derrière.

Je travaille au résultat, pas aux specs. Ce qui compte : l'interface répond, le code se relit, et le projet survit au prochain dev qui l'ouvre. Le reste est décoration.

01 / Parcours

Quatre ans,
quatre étapes.

  1. 01Louis Armand — Chambéry
    2022

    Baccalauréat

    Spé maths + sciences. Les bases rigoureuses qui servent encore quand un bug résiste.

  2. 02Lyon
    2023

    École 42

    Peer-learning, zéro prof. Un an à casser du C, du shell, des algos — et à apprendre à lire le code des autres.

  3. 03Agence freelance
    2025

    Alp-Web — fondateur

    Ma propre structure. Des projets clients livrés en Nuxt, Next, Supabase — du cahier des charges à la mise en prod.

  4. 04Saint-Michel — Annecy
    2026

    BTS CIEL

    En cours. Développement fullstack, cybersécurité, déploiement. Alternance recherchée pour prolonger la pratique en entreprise.

Compétences

Les outils que je manie au quotidien.

Frontend
ReactNext.jsVue 3Nuxt 3TypeScriptTailwind CSSFramer MotionGSAP
Backend / Data
Node.jsExpressSupabasePostgreSQLMongoDBRESTGraphQL
Mobile / Systèmes
FlutterDartC / C++
Outillage / Infra
GitDockerVercelAWSGitHub ActionsFigma
02 / Projets

Ce que je construis.

Trois projets. Ce qu'ils sont, ce qu'ils résolvent, ce qui a demandé de choisir.

01 / 2025 / FullstackEn cours

Checkly

Avis anti-fraude par NFC ou QR. Un scan, un token unique. Fini les notes truquées.

checkly.app/le-coq-gourmand
Page publique d'un commerce sur Checkly
Rôle
Fullstack — conception & développement
Durée
6 mois — en cours
Année
2025
Statut
En cours
Contexte

En deux lignes

Plateforme d'avis pour restaurants, commerces et hôtels. Chaque scan génère un token signé à usage unique — les liens ne se rejouent plus, les faux comptes tombent, les pros voient des retours réels.

Problème

Ce qu'il fallait résoudre

Les avis en ligne se truquent sans effort : liens statiques rejouables, multi-comptes, bots, aucun ancrage avec le point de vente. Les pros encaissent sans moyen de trier le vrai du faux, et perdent du temps à répondre à des retours fictifs.

Réponse

L'approche retenue

Chaque tag NFC ou QR délivre une URL signée avec un token dynamique, valable une fois. L'avis part — connecté via Supabase Auth ou anonyme nominatif — et le dashboard pro agrège tout en temps réel : typologie, filtres, photos, rating recalculé à la volée.

Fonctionnalités

Ce que le projet fait

  • 01

    Scan NFC ou QR

    Chaque scan ouvre une URL signée, valable une seule fois. Aucun lien rejouable, aucun contournement.

  • 02

    Anti-fraude natif

    Tokens régénérés à chaque passage, détection des motifs suspects, rate-limit par IP et empreinte.

  • 03

    Avis connecté ou anonyme

    Dépôt via Supabase Auth ou anonyme nominatif. Les deux identités ne se croisent jamais dans la base.

  • 04

    Dashboard Pro

    Config du commerce, suivi des avis, rating moyen, stats et réponses. Tout en temps réel.

  • 05

    Modération admin

    Les horaires saisis par les pros passent en validation avant publication. Aucune donnée douteuse en ligne.

  • 06

    Médias traçables

    Photos ancrées à userId + businessId (et reviewId si pertinent). Catégories, filtres, recherche.

Architecture

Comment c'est construit

Full-stack Nuxt 3 + Supabase. Le front consomme une librairie serveur typée qui encapsule chaque accès Supabase. Les types TypeScript descendent du schéma Postgres via la CLI. Les rôles user/pro vivent dans publicMetadata Supabase Auth et sont contrôlés côté serveur sur chaque route sensible. Tables principales : users, businesses, reviews, photos, categories, features, hours, reactions, fraud_events.

Points clés

À retenir

  • 01

    Token dynamique à chaque scan — zéro lien rejouable.

  • 02

    Séparation stricte user / pro via Supabase Auth publicMetadata, gardée côté serveur.

  • 03

    Types Supabase générés par CLI, partagés entre front et serveur sans divergence.

  • 04

    Rating moyen et reviewCount recalculés automatiquement à l'insert et au delete.

  • 05

    Photos rattachées à userId + businessId, reviewId optionnel pour la traçabilité.

  • 06

    Horaires pro passés en validation admin avant publication.

Obstacles

Ce qui a demandé des choix

  • Sécurité vs latence

    Régénérer un token à chaque scan sans ralentir le dépôt d'avis. Il a fallu pré-signer côté serveur et paralléliser la vérification avec l'ouverture du formulaire.

  • Deux identités, un seul utilisateur

    Un même user peut apparaître connecté ou anonyme selon l'avis. Les deux identités coexistent dans les tables sans jamais être reliées — même pas par déduction.

Stack
Front
Nuxt 3Vue 3Nuxt UITypeScript
Back / Data
SupabasePostgreSQLRow Level Security
Auth
Supabase AuthpublicMetadata.role
Outillage
Supabase CLI (types)Vercel
Liens
Galerie3 visuels
checkly.app/recherche
Recherche d'un commerce sur Checkly
Recherche — découvrir un commerce à proximité
pro.checkly.app/dashboard
Dashboard Pro Checkly
Dashboard pro — retours et stats en temps réel
Dépôt d'avis Checkly sur mobile après scan validé
Dépôt d'avis — formulaire servi après scan validé
02 / 2025 / FullstackEn cours

Melo

Copilote alimentaire mobile. Profil nutri, repas suggérés par LLM, planning hebdo, courses. Zéro régime imposé.

Page d'accueil de l'app Melo
Rôle
Fullstack — app Flutter & orchestration backend
Durée
8 mois — en cours
Année
2025
Statut
En cours
Contexte

En deux lignes

App mobile cross-plateforme (iOS, Android, Web, macOS). 15 écrans d'onboarding construisent un profil nutritionnel côté serveur (BMR, TDEE, macros), puis un backend VPS orchestre un LLM pour générer repas, recettes et planning — ajustés au profil réel, pas à un régime standard.

Problème

Ce qu'il fallait résoudre

Manger équilibré selon son budget, ses goûts et son temps demande un vrai effort quotidien. Les apps de diète imposent des plans rigides, ignorent le contexte (courses, envie, timing) et laissent peu la main à l'utilisateur.

Réponse

L'approche retenue

L'onboarding bâtit un profil complet en 15 étapes. Le serveur calcule les macros, construit les prompts, appelle le LLM, renvoie du JSON strict. Le client Flutter — MVVM + Provider — parse avec défense, affiche via GoRouter, gère l'achat via RevenueCat. Les réponses LLM sont normalisées avant d'atteindre la présentation.

Fonctionnalités

Ce que le projet fait

  • 01

    Onboarding 15 écrans

    Profil complet : objectif, morphologie, contraintes, activité. Le serveur calcule BMR, TDEE et macros cibles, mis en cache local pour la session.

  • 02

    Repas suggérés par LLM

    Onglet Home — idées contextualisées (petit-déj, déjeuner, dîner, snack) selon les contraintes. Recette détaillée à la demande.

  • 03

    Planning hebdomadaire

    Onglet Week — grille 7 jours × repas. Re-génération case par case, export des ingrédients vers les Courses.

  • 04

    Courses agrégées

    Les ingrédients du planning groupés par catégorie, quantités ajustées. Cochables, persistants entre sessions.

  • 05

    Paywall RevenueCat

    Abonnement natif sur App Store, Play Store, Web. Gate les fonctions premium (planning illimité, recettes avancées).

  • 06

    Une base, quatre plateformes

    iOS, Android, Web, macOS. Une seule base Flutter, transitions GoRouter adaptées à chaque plateforme.

Architecture

Comment c'est construit

Client Flutter en trois couches : Presentation (Screens + widgets Material 3), ViewModels (ChangeNotifier Provider), Services (API, auth, billing). Domain models immutables avec fromJson/toJson défensifs. Navigation GoRouter, transitions custom par plateforme. Côté serveur, une API REST sur VPS orchestre : profil → calculs nutritionnels → prompts → LLM → normalisation JSON stricte → réponse. Credentials dans un .env chargé au boot via flutter_dotenv. RevenueCat gère les trois stores de facturation. SharedPreferences persiste profil, planning et courses en local.

Points clés

À retenir

  • 01

    MVVM strict — 8 ViewModels découplés, chacun testé isolément.

  • 02

    Backend VPS orchestre le LLM. Le client ne voit jamais le prompt brut, uniquement du JSON typé.

  • 03

    Parsing défensif : les sorties LLM arrivent parfois enrobées de markdown ou de texte parasite. Les fromJson nettoient et isolent le JSON valide avant de planter.

  • 04

    Domain models immutables. Toute mutation passe par copyWith, zéro surprise d'état partagé.

  • 05

    Calculs BMR/TDEE/macros côté serveur. Une seule source de vérité, les formules évoluent sans re-livrer l'app.

  • 06

    Google Sign-In v7 + Sign in with Apple. Sessions unifiées, tokens rafraîchis en silence.

Obstacles

Ce qui a demandé des choix

  • Domestiquer le LLM

    Les réponses arrivent propres, parfois enrobées de ```json, parfois en texte libre avec des retours à la ligne parasites. Les fromJson nettoient et isolent le JSON valide avant qu'il atteigne la couche présentation.

  • Quatre plateformes, une logique

    iOS et Android demandent deux providers d'auth natifs (Google, Apple) et deux stores de billing. Le Web et macOS exigent une dégradation propre quand l'API native n'existe pas.

  • 15 écrans sans perdre l'utilisateur

    Chaque étape capture un champ ou un choix et autorise le retour arrière sans perte. Un seul ViewModel porte l'état jusqu'à la soumission finale.

Stack
Client mobile
Flutter 3.5+DartMaterial 3GoRouterProvider (ChangeNotifier)
Auth & Billing
Google Sign-In v7Sign in with AppleRevenueCat (purchases_flutter)
Back / Data
API REST (VPS)Orchestration LLMSharedPreferencesflutter_dotenv
Média & UX
Lottieflutter_svgPexels (photos de repas)permission_handler
Outillage
flutter_test (8 ViewModels sous test)Mocks APIEnv stagé .env
Galerie6 visuels
Onboarding Melo — étape 1
Onboarding Melo — étape 2
Onboarding Melo — étape 3
Onboarding Melo — étape 4
Onboarding Melo — étape 5
Onboarding — du profil nutritionnel à l'objectif
Planning hebdomadaire
Planning 7 jours — repas générés par LLM
03 / 2026 / BackendEn cours

CrowdMind

Et si une opinion se calculait ? 100 citoyens synthétiques, 22 topics pondérés, moteur déporté sur Raspberry Pi. Zero LLM en prod.

CrowdMind — Raspberry Pi exécutant le moteur heuristique
Rôle
Backend & infra — conception & développement
Durée
6 semaines — en cours
Année
2026
Statut
En cours
Contexte

En deux lignes

Projet de recherche backend. Une API FastAPI sur Azure génère des agents, délègue le calcul à un Raspberry Pi branché au bureau d'étude via WebSocket sortant, persiste dans Supabase, et renvoie la distribution — tout se calcule, rien ne s'invente.

Problème

Ce qu'il fallait résoudre

Demander à un LLM unique « que pense le public ? », c'est demander à une seule tête. Cher, lent, imprévisible, aucune distribution en sortie — une moyenne n'a jamais fait un sondage.

Réponse

L'approche retenue

100 agents tirés sur 5 clusters politiques français : centre-gauche progressiste, centre-droite conservateur, gauche radicale, droite radicale, divers. Chaque agent porte 4 axes idéologiques et 5 axes démographiques. Le moteur détecte les topics via 22 regex, pondère les axes, applique les modificateurs démographiques, injecte un bruit gaussien seedé par paire agent × question — et sort une distribution en moins de 200 ms.

Fonctionnalités

Ce que le projet fait

  • 01

    5 clusters politiques français

    Population tirée sur gaussiennes centrées autour des cinq pôles du paysage français. Les axes démographiques — âge, éducation, classe sociale, urbain/rural — corrèlent avec les axes idéologiques, pas à l'aveugle.

  • 02

    Moteur heuristique 22 topics

    Immigration, nucléaire, retraites, pouvoir d'achat, Europe, laïcité… Chaque topic est un couple (regex, poids par axe). Une question transversale matche plusieurs topics, les poids se moyennent automatiquement.

  • 03

    100 % reproductible

    Même seed, mêmes agents, mêmes réponses. Chaque paire agent × question a son propre RNG dérivé d'un hash MD5 — indispensable pour comparer deux scénarios ou calibrer les poids sans bruit parasite.

  • 04

    Calcul sur Raspberry Pi

    Le moteur tourne sur un Pi physique, au bureau d'étude. Connexion WebSocket sortante vers le backend, aucun port exposé, aucune IP publique requise. Reconnexion automatique avec backoff 1 s → 60 s.

  • 05

    Calibration contre sondages IFOP

    10 cas de référence tirés de sondages IFOP. Chaque modification de poids est évaluée contre ces distributions avant merge — le moteur ne dérive pas en silence.

  • 06

    Trois formats de questions

    Stance (pour/contre/mitigé), likert (échelle numérique), QCM (choix multiples). Les trois cohabitent dans un même questionnaire, agrégation automatique par type.

Architecture

Comment c'est construit

Deux dépôts, trois étages physiquement séparés. Le backend FastAPI vit containerisé sur un VPS Azure, derrière un Nginx qui termine le TLS et proxifie HTTP comme WebSocket (timeout 3600 s). L'API parle à Supabase — 11 tables métier, relations tracées avec CASCADE et RESTRICT réfléchis — et délègue tout le calcul de simulation à un Raspberry Pi branché au bureau d'étude. Le Pi ouvre lui-même la connexion WebSocket, pas l'inverse ; chaque appel est corrélé par un task_id UUID géré par PiWsManager. Redis porte les sessions et la canalisation realtime. Côté livraison, deux workflows GitHub Actions : le CI lint (ruff), teste (pytest, cov ≥ 90 %), build l'image Docker et push sur GHCR ; le CD, déclenché au succès du CI, SCP le compose, SSH pour pull/up --force-recreate, boucle un healthcheck 30 fois, prune les images, recharge Nginx. Dev bascule sur staging, main sur prod.

Points clés

À retenir

  • 01

    Architecture hexagonale — endpoints, services, repositories, infrastructure. Les tests injectent FakePiClient et FakeRepository, zéro accès réseau.

  • 02

    WebSocket sortant initié par le Pi — aucun port ouvert derrière le NAT domestique, aucun DynDNS à maintenir.

  • 03

    Corrélation backend ↔ Pi par task_id UUID. PiWsManager expose un call_sync aux endpoints HTTP synchrones.

  • 04

    Moins de 200 ms pour 100 agents × 5 questions. Zéro LLM, zéro appel externe en prod.

  • 05

    Deux environnements mappés sur des GitHub environments distincts — dev bascule sur staging, main sur prod.

  • 06

    Déploiement SSH avec healthcheck actif (30 tentatives, 2 s d'intervalle) — aucune validation avant que l'API réponde.

Obstacles

Ce qui a demandé des choix

  • Encoder une opinion dans un scalaire

    Le vrai travail de fond. Trouver les bons poids par axe pour chaque topic, pour que la distribution colle à celle d'un vrai sondage. Beaucoup d'allers-retours sur la polarité (réduire / renforcer / négation) et les modificateurs démographiques — calibrés contre 10 sondages IFOP de référence.

  • Tunneler le Pi sans l'exposer

    Le Pi vit derrière un NAT domestique. Contrainte : zéro port entrant, zéro IP publique, zéro DynDNS. Réponse : un WebSocket sortant permanent initié par le Pi, avec reconnexion automatique (backoff 1 s → 60 s) et corrélation des appels par task_id UUID côté backend.

  • CI/CD zéro-intervention

    Rendre le déploiement impossible à casser à la main. Pipeline : lint → tests → build Docker → push GHCR → SCP compose → SSH pull/up --force-recreate → healthcheck 30 tentatives → prune → nginx reload. Dev bascule sur staging, main sur prod, via GitHub environments distincts — aucun SSH manuel requis.

Stack
API (cloud)
FastAPIPython 3.13PydanticUvicorn
Worker (edge)
Raspberry PiwebsocketssystemdMoteur heuristique (pure stdlib)
Data
SupabasePostgreSQLRedis
Infra
VPS AzureDocker ComposeNginx (TLS + WSS)GHCR
CI/CD
GitHub Actions (CI + CD)ruff check & formatpytest cov ≥ 90 %SSH deploy + healthcheck 30 tentatives
03 / Stack technique

Ce que je parle

ReactNext.jsVue 3Nuxt 3TypeScriptTailwindFramer MotionGSAP
ReactNext.jsVue 3Nuxt 3TypeScriptTailwindFramer MotionGSAP
Node.jsSupabasePostgreSQLExpressMongoDBRedisGraphQL
Node.jsSupabasePostgreSQLExpressMongoDBRedisGraphQL
GitDockerVercelAWSGitHub ActionsFigmaFlutterC++
GitDockerVercelAWSGitHub ActionsFigmaFlutterC++
04 / Contact

Travaillons
ensemble.

Je cherche une alternance dès septembre 2026. Un projet, une question, un simple bonjour — écris, je réponds sous 48 h.

Ou via le formulaire
Envoyé via EmailJS, aucun spam.