DEVLOPN Audit

Blog

Audit de code, sans langue de bois

Retours d’expérience et analyses sur l’audit de code Flutter et mobile natif : architecture, sécurité, performance, code IA-généré.

1000 warnings supprimés par des agents IA, que faut-il vérifier ?

Supprimer les warnings Dart avec unawaited() ne corrige pas les bugs. Comment cadrer les agents IA et vérifier les appels asynchrones lors de la revue de code.

Un assetlinks.json placeholder en prod, et vos deeplinks sont interceptables

La vérification App Links échoue en silence quand le fichier est un exemple copié-collé. Résultat, vos liens deviennent interceptables. Détectable en une commande.

Le rôle GCS « lecture seule » qui expose la liste complète de vos fichiers

Sur un bucket public, objectViewer autorise le LIST anonyme complet là où legacyObjectReader le bloque. La différence tient à une permission. Testé en curl.

Cloudflare devant ma Cloud Function, et pourtant zéro cache — le piège des en-têtes

Une Cloud Function qui sert des images Cloud Storage paie invocation + egress à chaque vue. Le CDN ne cache rien sans Cache-Control — la chaîne complète en 6 étapes.

ITSAppUsesNonExemptEncryption = false — le réflexe faux des apps Flutter qui chiffrent

Chiffrer sa base locale avec sqlite3mc et cocher false, c'est répondre faux à une question de classification EAR. Notes 3 et 4, ERN au BIS, déclaration ANSSI.

La vaisselle du code — ne laissez pas votre dette technique s'accumuler

Un TODO « on gérera cette erreur plus tard » resté des années, un objet dummy fini en cache, et un bug bien réel. La dette technique a des intérêts composés.

Apple a rejeté notre app pour un bug… d'iPadOS — et c'est un redémarrage qui a tout débloqué

Rejet App Store pour un clavier vide qui plantait aussi dans Safari et la recherche iPadOS. Escalade téléphonique chez Apple, et le grand classique — reboot.

SpecKit seul, j'ai lâché — avec un orchestrator, 64 specs shippées d'affilée

Transformer le pipeline manuel de SpecKit en boucle autonome sûre — backlog source de vérité, une feature par tour, invariants codés en dur dans la CI.

Rejeté deux fois par Apple pour deux popups dans le mauvais ordre — ATT et CMP

Prompt ATT d'Apple d'un côté, CMP RGPD de l'autre — l'ordre et le purpose linking qui font passer la review, et la guideline 5.1.1 qui rejette sinon.

Vacances sans MacBook : garder un accès à mon Mac depuis un iPad

Mon MacBook reste allumé à Lyon pendant mes vacances en Grèce. Avec Tailscale, SSH, tmux et Mosh, je garde un accès depuis mon iPad, même en changeant de réseau.

38 000 € d'amende pour une ligne manquante dans des CGV — le médiateur de la consommation

Depuis 2016, tout pro vendant à des particuliers doit désigner un médiateur de la consommation et l'afficher — dès le premier client, freelances compris.

J'ai ajouté une ligne à ma Definition of Done — /review avant de push

Une passe de review par un agent IA sur le diff avant même d'ouvrir la PR — les reviewers humains lisent enfin de l'archi et des choix, plus des coquilles.

verify(mock.method()) — le test vert qui laissait passer un double appel

En Mockito, verify sans .called(1) explicite peut rester vert alors que la méthode part deux fois. Pourquoi la précision dans les tests protège le lecteur.

Rejet App Store pour « clavier absent » — quand le faux positif vient du reviewer

Un rejet App Store impossible à reproduire, une barre de raccourcis iPadOS sur la capture du reviewer, et un iPad jamais redémarré qui finit par tout expliquer.

3 étapes pour me passer de Figma en dev solo — du vibe designing au design.md

Du prompt au feeling au fichier design.md versionné — comment un fichier source unique de tokens et de règles transforme des prompts IA en vraies specs.

Pourquoi Google te demande ton SIREN — la facture électronique arrive pour de vrai

Facture électronique obligatoire au 1er septembre 2026 — vos fournisseurs collectent les SIREN pour router les factures. La vague de mails ne fait que commencer.

« Vous partagez des données avec des data brokers ? » — la case à ne pas cocher au feeling

Google Analytics ou Dynatrace ne sont pas des data brokers mais des sous-traitants. La question qui tranche avant de remplir un privacy label App Store.

Le token broker OAuth, quand il sert et quand c'est du cargo cult

Avec PKCE, le client mobile ne détient aucun secret. Le broker en Cloud Function n'est donc pas obligatoire, c'est un choix. Voici les bonnes raisons de le faire.

webcredentials — les 3 lignes qui branchent le trousseau iCloud sur ton app

Associated Domains, apple-app-site-association et les AutofillHints Flutter — la config qui active l'autofill iOS et prépare le terrain pour les passkeys.

Dropbox-API-Arg et les fichiers accentués, le premier bug de toute photothèque française

Le header Dropbox-API-Arg doit être de l'ASCII pur. Le premier « Vacances à Éze.jpg » casse le téléchargement. La règle d'échappement en une ligne.

Ton utilisateur français ouvre ton app, elle est en japonais — locale en Flutter

PlatformDispatcher.locale vs Localizations.localeOf — deux façons de récupérer la locale en Flutter, et l'ordre de supportedLocales qui tranche en silence.

Désinstaller ne suffit pas — l'Auto Backup Android restaure vos données à l'insu de tous

Dès l'API 23, Android sauvegarde prefs, SQLite et cache vers le Drive de l'utilisateur, puis les restaure à la réinstallation, avant même le premier lancement.

Google Photos exige le header Authorization, OneDrive l'interdit

Télécharger une photo utilisateur, deux clouds, deux comportements opposés sur le même header HTTP. Le genre de détail qui coûte une journée de debug.

29 000 € de redressement pour un seuil dépassé sans le savoir — le piège du versement libératoire

La perte du droit au versement libératoire est automatique, mais la régularisation ne l'est pas. Le décalage de deux ans du RFR rend le piège traître.

J'ai cartographié toutes les sources photo possibles pour mon app, voici les survivants

Instagram Basic Display est mort, WhatsApp est structurellement fermé, Facebook tient encore. Le paysage réel des imports photo pour une app mobile en 2026.

Des paillettes façon Magic en Flutter — particules animées et playground Web

D'un GIF envoyé un vendredi après-midi à une implémentation Flutter de l'effet paillettes, particules animées comprises, avec un playground Web en ligne.

Ajouter un testeur iOS sans toucher au portail Apple — Bitrise Test devices

Fini l'enregistrement d'UDID sur le portail Apple et la régénération manuelle des provisioning profiles — Bitrise gère l'intégration au moment du build.

Flutter 3.19 embarque enfin les assets par flavor, et personne ne l'utilise

Depuis Flutter 3.19, pubspec.yaml sait exclure les assets hors flavor du bundle. Build plus léger sans toucher au code, avec deux limites à connaître.

HiveCacheStore + dio_cache_interceptor — les 3 pièges que personne ne documente

Corruption au cold start, purge TTL absente, taille non bornée — trois cas limites du cache Dio + Hive en Flutter à gérer dès le départ pour éviter la casse.

in_app_review — 3 chances par an, et Apple ne vous dira jamais rien

La popup de notation iOS est limitée à 3 affichages par an et par device, sans aucun feedback développeur. Et la guideline qu'on cite partout est la mauvaise.

« test cedric » en prod — pourquoi il faut trois projets Firebase séparés

Une notification de test envoyée en production à des milliers de clients d'une banque. Le scénario redouté par tout dev mobile, et la pratique qui l'évite.

Le poulet et le cochon — impliqué ou engagé, toute la différence d'une équipe

La fable du poulet et du cochon appliquée aux projets logiciels — distinguer ceux qui donnent un avis de ceux qui portent le code, et pourquoi les deux comptent.

SOLID en Flutter — des principes écrits dans la CI, pas dans un wiki

Une app qui dure trois ans en prod, ce n'est pas une question de framework récent mais de frontières respectées. SOLID appliqué concrètement en Flutter.

J'ai demandé un conseil fiscal à une IA — elle a validé une erreur à redressement

Une IA généraliste a confondu les articles 154 bis et 163 quatervicies sur la déduction PER. Ce qui a sauvé le coup — un outil conçu pour contredire.

Mon Supabase gratuit se mettait en pause tous les 7 jours — réglé en 5 lignes de SQL

Le plan gratuit de Supabase met votre projet en pause après 7 jours d'inactivité. Solution élégante avec pg_cron — la base génère sa propre activité.

92 % de tokens économisés — rendre visible le coût invisible des agents IA

RTK encapsule les commandes dev courantes dans des wrappers qui ne renvoient que l'essentiel au contexte de l'agent. Bilan chiffré sur 13 361 commandes.

La DES, l'obligation que personne ne vous annonce quand vous facturez dans l'UE

Facturer un client professionnel dans l'UE sans TVA ne suffit pas — la Déclaration Européenne de Services est obligatoire dès le premier euro, sous peine d'amende.

Accélérez vos cycles de test Flutter avec CallbackShortcuts

Vider le cache, remplir un formulaire, injecter un mot de passe de test en un raccourci clavier — sans classe Intent ni Action, et invisible en release.

Code IA-généré — pourquoi un audit humain reste indispensable

Le vibe coding accélère le développement mais laisse des angles morts. Ce qu'un audit expert détecte que vos outils ne voient pas.