← Toutes les réalisations
Rapport de démonstration. Ce document montre la méthode et le niveau de détail d'un audit HANDICODE. L'entreprise est anonymisée et les mesures qui y figurent illustrent des défauts réellement rencontrés sur des sites comparables ; elles ne sont pas le relevé d'une mission chez un client identifiable. Un audit réel porte les mesures du site concerné, horodatées et rejouables.

Dossier A-2026-014 · Audit technique

Site vitrine d'un cabinet de conseil

Diagnostic de performance, de sécurité et de visibilité d'un site de 48 pages, suivi d'un plan d'intervention chiffré. Le site perdait la moitié de ses visiteurs mobiles avant l'affichage du premier texte.

Secteur · Conseil aux entreprises Pages publiées · 48 Technologie · React 18, rendu client Hébergement · Mutualisé, France Mesuré le · 6 au 9 octobre 2026 Outils · Lighthouse 12, CrUX, Observatory

Section 1Périmètre et méthode

Quarante-huit pages ont été découvertes par le plan de site. Quinze ont été retenues pour l'analyse détaillée, choisies par gabarit plutôt qu'au hasard : trois pages d'un même modèle suffisent à savoir si un défaut se répète, quinze pages d'un seul modèle n'apprennent rien de plus.

FamilleOutilCe qui est mesuréLimite
Performance laboratoireLighthouse 12.2Profil mobile, réseau bridé, 5 passagesSimulation, pas le réel
Performance terrainCrUX p75Visiteurs réels, 28 jours glissantsAbsent sous ~1000 visites/mois
Sécurité de surfaceObservatoryEn-têtes HTTP publicsAucun test actif
Référencement65 contrôlesMéta, structure, balisage, robotsPas de données de position
Accessibilitéaxe-core 4.10Règles automatiquesCouvre ~40 % des critères

Ce que cette méthode ne dit pas. Un audit automatique ne remplace ni un test d'intrusion, ni un audit d'accessibilité conforme au RGAA, ni une analyse de positionnement. Les règles automatiques d'accessibilité couvrent environ 40 % des critères : le reste demande un passage humain au clavier et au lecteur d'écran.

Section 2Ce qu'il faut retenir

Le site est correctement construit sur le fond. Son problème est un problème de livraison : il envoie au navigateur beaucoup plus de code que la page n'en utilise, et il l'envoie avant d'afficher quoi que ce soit.

Performance 38 Accessibilité 72 Sécurité 25 Référencement 84 0 50 100
Notes sur 100, profil mobile, médiane de cinq passages. Le référencement tient parce que le contenu est bon ; la performance et la sécurité tiennent au paramétrage, pas au contenu.

critiqueLe visiteur mobile attend 6,8 secondes

L'affichage du contenu principal (LCP) est mesuré à 6,8 s en laboratoire, 5,2 s au 75e centile des visiteurs réels. Le seuil recommandé par Google est de 2,5 s. Au-delà de trois secondes, plus de la moitié des visiteurs mobiles abandonnent.

critiqueAucun en-tête de sécurité

Le serveur n'envoie ni politique de sécurité du contenu, ni transport forcé en HTTPS, ni protection contre l'inclusion dans un cadre tiers. Cinq en-têtes attendus sur cinq sont absents.

majeureTrente-huit pages sans description

Sur les 48 pages publiées, 38 n'ont pas de méta-description. Google en fabrique une à partir du texte, souvent mal, et le taux de clic s'en ressent.

Section 3Performance : où partent les secondes

Les mesures de laboratoire et de terrain concordent, ce qui écarte l'hypothèse d'un incident ponctuel. Le terrain est systématiquement meilleur que le laboratoire parce que les visiteurs réels ont de meilleures connexions que le profil bridé.

SignalLaboratoireTerrain p75SeuilVerdict
Affichage du contenu principal (LCP)6,80 s5,20 s2,50 sinsuffisant
Réaction après un clic (INP)—412 ms200 msinsuffisant
Stabilité visuelle (CLS)0,340,280,10insuffisant
Premier affichage (FCP)2,90 s2,10 s1,80 sà surveiller
Réponse du serveur (TTFB)0,64 s0,58 s0,80 scorrect
Blocage du fil principal (TBT)1 240 ms—200 msinsuffisant

Le temps de réponse du serveur est bon : l'hébergement n'est pas en cause. Tout le retard se joue après l'arrivée du document, dans le navigateur.

La cascade de chargement

document 0,64 s · 12 Ko bundle principal 1,6 s · 684 Ko bibliothèque dates 0,45 s · 188 Ko carrousel 0,36 s · 142 Ko polices (4 fichiers) 0,6 s · 312 Ko exécution JS 4,1 s image du hero 1,1 Mo LCP 6,8 s 0 s 2 s 4 s
Le document arrive vite. Ce sont les 1,01 Mo de JavaScript et leurs 4,1 secondes d'exécution qui repoussent l'affichage. L'image du hero, souvent accusée, n'est pas le facteur déterminant ici : elle arrive après.

Section 4Le JavaScript, poste par poste

Le site expédie 1,01 Mo de JavaScript compressé sur la page d'accueil. L'analyse de couverture montre que 712 Ko ne sont jamais exécutés lors d'une visite normale : du code chargé pour rien.

PaquetTransféréInutiliséCause
Bundle applicatif684 Ko441 KoAucun découpage par route
Bibliothèque de dates188 Ko184 KoImport global pour un seul formatage
Carrousel142 Ko87 KoChargé même sans carrousel sur la page
Mesure d'audience182 Ko—Chargée avant le contenu

Le défaut le plus coûteux, et le moins visible

Le carrousel et l'assistant de conversation sont déclarés en chargement différé. Le code semble donc correct. Mais un repli temporel les monte malgré tout, sans aucune action du visiteur :

// Le composant est bien différé… const Carrousel = lazy(() => import('./Carrousel')); // …mais ce repli le charge tout seul au bout de 4 secondes, // même si le visiteur n'a jamais défilé jusqu'à lui. requestIdleCallback(() => setVisible(true), { timeout: 4000 });

Le correctif ne supprime rien : il retire le repli temporel et garde les écouteurs d'interaction. Un visiteur qui descend jusqu'au carrousel le charge ; celui qui ne descend jamais ne le télécharge plus.

// Correctif : le composant se monte au premier geste, jamais tout seul. ['pointerdown', 'keydown', 'touchstart', 'scroll'].forEach( (e) => addEventListener(e, () => setVisible(true), { once: true, passive: true }) );

Effet attendu, mesuré sur un site comparable

JavaScript transféré 400 Ko → 173 Ko. Code inutilisé 271 Ko → 70 Ko. Blocage du fil principal 22 ms → 0 ms. Aucune fonction retirée, aucun composant supprimé.

La stabilité visuelle

Le décalage cumulé de 0,34 vient de deux causes identifiées : les images n'ont pas de dimensions déclarées, et la police de titre remplace la police de repli avec des métriques différentes, ce qui fait sauter le texte.

/* Repli métrique : le texte occupe la même place avant et après */ @font-face { font-family: 'Titre-repli'; src: local('Arial'); size-adjust: 98.35%; ascent-override: 98.63%; descent-override: 25.42%; }

Section 5Sécurité de surface

Cet examen porte sur ce que le serveur annonce publiquement. Aucun test actif n'a été conduit : il faudrait une autorisation écrite et un périmètre contractuel.

En-têteÉtatCe que son absence permetGravité
Strict-Transport-SecurityabsentRétrogradation vers HTTP sur un réseau hostilehaute
Content-Security-PolicyabsentExécution de scripts injectéshaute
X-Frame-OptionsabsentInclusion dans un cadre tiers, détournement de clicmoyenne
X-Content-Type-OptionsabsentInterprétation d'un fichier selon son contenumoyenne
Referrer-PolicyabsentFuite de l'adresse d'origine vers des tiersbasse
Certificat TLSvalide——

Ces cinq en-têtes se posent au niveau du serveur, sans toucher au code du site. C'est le meilleur rapport entre l'effort et le résultat de tout ce rapport : une demi-journée, et la note de sécurité passe de 25 à 95.

# nginx · à poser dans le bloc server add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header X-Content-Type-Options "nosniff" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self'" always;

Une précaution. La politique de sécurité du contenu doit être posée en mode observation d'abord. Une politique trop stricte appliquée d'emblée casse silencieusement les scripts tiers légitimes, sans message d'erreur visible.

Section 6Référencement et lecture par les IA

Soixante-cinq contrôles ont été exécutés. Le contenu est bon, la mécanique l'est moins.

ConstatPages touchéesEffetEffort
Méta-description absente38 / 48Extrait fabriqué par Google1 j
Même titre sur plusieurs pages11 / 48Les pages se concurrencent0,5 j
Contenu lisible sans JavaScript0 / 48Les IA lisent rarement le JS3 j
Données structuréesabsentesPas d'entité déclarée0,5 j
Fichier llms.txtabsentRien ne guide les assistants0,2 j
Deux pages du plan de site en erreur 4042 / 48Budget d'exploration gaspillé0,1 j

Le point qui engage l'avenir

Le site est rendu entièrement côté client : le document HTML servi contient une div vide et un script. Google sait l'exécuter, au prix d'un délai. Les assistants conversationnels, eux, lisent rarement le JavaScript.

<!-- Ce que reçoit un assistant qui lit la page --> <div id="root"></div> <script src="/assets/app-d41d8c.js"></script> <!-- Rien d'autre. Aucun texte, aucun titre, aucune entité. -->

Aucun balisage ne garantit d'être cité par une IA, et personne ne devrait le promettre. Mais un site dont le contenu n'est pas lisible sans exécuter du code se prive de toute chance de l'être.

Section 7Accessibilité

Les règles automatiques couvrent environ 40 % des critères. Elles ont relevé 73 occurrences réparties sur 6 types de défauts.

DéfautOccurrencesQui est empêché
Contraste insuffisant31Lecture difficile en plein jour, daltonisme
Image sans texte alternatif18Lecteur d'écran
Champ de formulaire sans étiquette9Lecteur d'écran, saisie vocale
Ordre des titres rompu8Navigation par structure
Lien sans intitulé explicite5Navigation par liste de liens
Langue du document non déclarée2Prononciation par synthèse vocale

Le contraste domine, et c'est une bonne nouvelle : il se corrige dans la feuille de style, sans toucher au contenu. Les 31 occurrences se ramènent à quatre couleurs à ajuster dans la palette.

Section 8Préconisations détaillées

Chaque préconisation porte son critère d'acceptation : la mesure qui dira, après intervention, si elle a produit l'effet attendu. Une recommandation sans critère vérifiable n'est qu'un avis.

P-01 · priorité 1 · performance

Retirer les replis temporels qui chargent le code non demandé

Constat
Deux composants déclarés en chargement différé se montent malgré tout après 4 secondes, par un repli requestIdleCallback. 229 Ko sont téléchargés et exécutés sans qu'aucun visiteur ne les demande.
Préconisation
Supprimer le repli temporel. Conserver les écouteurs pointerdown, keydown, touchstart et scroll en { once: true, passive: true }.
Mise en œuvre
Deux fichiers, une ligne retirée dans chacun. Aucune fonctionnalité supprimée : le composant se monte au premier geste du visiteur.
Critère d'acceptation
JavaScript transféré sur l'accueil inférieur à 450 Ko, mesuré par l'onglet Réseau en cache vide, profil mobile. Les deux composants restent fonctionnels après un défilement.
Risque de régression
Faible. Un visiteur qui n'interagit jamais ne verra pas le carrousel monter : c'est l'effet recherché. Vérifier que les lecteurs d'écran déclenchent bien l'écouteur clavier.
Effort · Gain
0,5 jour · −229 Ko, −1,2 s sur l'affichage
P-02 · priorité 1 · sécurité

Poser les cinq en-têtes de sécurité, la politique de contenu en observation

Constat
Aucun en-tête de sécurité n'est émis. Le site est exposé à la rétrogradation de protocole, à l'injection de scripts et au détournement de clic.
Préconisation
Poser les cinq en-têtes au niveau du serveur. Déployer la politique de sécurité du contenu d'abord en Content-Security-Policy-Report-Only pendant deux semaines, relever les violations, puis basculer en mode appliqué.
Mise en œuvre
Bloc server de nginx, aucune modification du code du site. Rechargement de la configuration sans interruption.
Critère d'acceptation
Note Mozilla Observatory supérieure ou égale à 90. curl -I renvoie les cinq en-têtes. Zéro violation de politique dans le journal après deux semaines d'observation.
Risque de régression
Réel si la politique est appliquée d'emblée : elle casse silencieusement les scripts tiers légitimes, sans message visible. D'où les deux semaines d'observation obligatoires.
Effort · Gain
0,5 jour + 2 semaines d'observation · sécurité 25 → 95
P-03 · priorité 2 · stabilité visuelle

Déclarer les dimensions des images et poser un repli métrique de police

Constat
Décalage cumulé de 0,34, soit plus de trois fois le seuil. Deux causes : images sans dimensions et substitution de police aux métriques différentes.
Préconisation
Ajouter width et height sur chaque image, ou un conteneur en aspect-ratio. Déclarer un repli métrique avec size-adjust, ascent-override et descent-override calculés sur la fonte réelle.
Mise en œuvre
Les valeurs se calculent à partir des métriques de la police (unités par em, ascendante, descendante, hauteur d'x). Elles ne se devinent pas : une valeur approximative déplace le texte au lieu de le stabiliser.
Critère d'acceptation
CLS terrain inférieur à 0,10 au 75e centile, après 28 jours de collecte. Aucun saut visible à l'arrivée de la police, vérifié par enregistrement vidéo du chargement.
Risque de régression
Faible. Un repli mal calculé se voit immédiatement : le texte change de taille au lieu de rester en place.
Effort · Gain
1 jour · CLS 0,34 → moins de 0,05
P-04 · priorité 2 · accessibilité

Corriger quatre couleurs plutôt que trente et une occurrences

Constat
31 occurrences de contraste insuffisant, qui se ramènent à quatre couleurs de la palette employées à plusieurs endroits.
Préconisation
Ajuster les quatre valeurs dans la palette, au lieu de traiter chaque occurrence. Viser un rapport de 4,5:1 pour le texte courant et 3:1 pour les textes de grande taille et les éléments d'interface.
Mise en œuvre
Assombrir les teintes de 8 à 14 % suffit dans les quatre cas sans altérer l'identité visuelle. Le gris de légende est le plus éloigné du seuil.
Critère d'acceptation
Zéro violation de contraste signalée par axe-core sur les quinze pages échantillonnées. Vérification manuelle de la lisibilité en plein soleil sur un écran de téléphone.
Risque de régression
Nul sur le plan technique. À faire valider par la direction si la charte graphique est contractuelle.
Effort · Gain
0,5 jour · 31 défauts corrigés, accessibilité 72 → environ 88
P-05 · priorité 3 · référencement

Écrire 38 méta-descriptions et lever 11 titres dupliqués

Constat
38 pages sur 48 n'ont pas de description, 11 partagent leur titre avec une autre page. Google fabrique alors l'extrait, souvent mal, et les pages au même titre se concurrencent.
Préconisation
Rédiger une description de 120 à 160 caractères par page, qui annonce le contenu et porte une raison de cliquer. Rendre chaque titre unique, en 30 à 60 caractères, en plaçant le terme distinctif en tête.
Mise en œuvre
Travail éditorial, non technique. Le gabarit du site accepte déjà les deux champs : aucun développement n'est nécessaire.
Critère d'acceptation
48 pages sur 48 avec une description unique de 120 à 160 caractères. Zéro titre dupliqué, vérifié par un nouveau passage du crawl.
Risque de régression
Aucun risque technique. L'effet sur le taux de clic ne se mesure qu'après plusieurs semaines d'indexation, et dépend de la concurrence.
Effort · Gain
2 jours · référencement 84 → environ 98
P-06 · à arbitrer · architecture

Rendre le contenu lisible sans exécuter de JavaScript

Constat
Le document servi contient une div vide et un script. Aucune des 48 pages n'est lisible sans exécution de code.
Préconisation
Deux voies. Le pré-rendu à la construction convient à un site dont le contenu change peu : il génère un fichier HTML complet par page, sans serveur supplémentaire. Le rendu côté serveur convient si le contenu devient dynamique, au prix d'une infrastructure Node à maintenir.
Mise en œuvre
Pour 48 pages stables, le pré-rendu suffit et coûte trois fois moins cher. Il s'ajoute à la chaîne de construction existante sans changer l'hébergement.
Critère d'acceptation
curl sur chaque page renvoie le titre, les sous-titres et le corps de texte. Le premier affichage descend sous 1,8 seconde.
Risque de régression
Modéré. Le pré-rendu fige l'état au moment de la construction : tout contenu réellement dynamique doit être identifié avant, sous peine de servir une version périmée.
Effort · Gain
6 à 10 jours · condition nécessaire pour être cité par les assistants conversationnels, sans qu'aucun balisage ne le garantisse

Section 9Plan d'intervention et arbitrage

Classé par rapport entre l'effort et le résultat, pas par difficulté technique.

LotContenuEffortEffet attendu
1 · Immédiat Les cinq en-têtes de sécurité, en mode observation pour la politique de contenu 0,5 j Sécurité 25 → 95
2 · Semaine 1 Retrait des replis temporels, découpage par route, import ciblé des dates 2 j JS 1,01 Mo → ~310 Ko
3 · Semaine 2 Dimensions d'images, repli métrique de police, image du hero préchargée 1 j CLS 0,34 → < 0,05
4 · Semaine 3 Quatre couleurs de la palette, 18 textes alternatifs, 9 étiquettes 1,5 j Accessibilité 72 → ~96
5 · Semaine 4 38 méta-descriptions, 11 titres, données structurées, llms.txt 2 j Référencement 84 → ~98
6 · À arbitrer Rendu serveur ou pré-rendu des 48 pages 6 à 10 j Contenu lisible sans JavaScript
■ mesuré ■ après les lots 1 à 5 Performance 38 92 Accessibilité 72 96 Sécurité 25 95 Référencement 84 98
Projection fondée sur les gains constatés sur des sites comparables après les mêmes corrections. Ce sont des cibles de travail, pas des garanties : la mesure après intervention fait seule foi.

Sept jours pour les lots 1 à 5. Le lot 6 change l'architecture du site et se décide à part : il ne se justifie que si la lecture par les assistants conversationnels devient un objectif commercial.

Section 11Annexe : ce qui n'a pas été mesuré

Un rapport qui ne dit pas ses limites laisse croire qu'il a tout vu.

  • Positions dans Google. Aucune donnée de position n'a été relevée : cela demande un accès à la Search Console du site.
  • Trafic et conversions. Aucun accès analytique n'a été fourni. Les recommandations portent sur la mécanique, pas sur le rendement.
  • Sécurité applicative. Aucun test actif, aucune tentative d'authentification, aucune analyse des dépendances côté serveur. Cela relève d'un test d'intrusion contractualisé.
  • Accessibilité réglementaire. Les règles automatiques ne permettent pas de déclarer une conformité RGAA. Un audit déclaratoire demande un passage humain sur chaque critère.
  • Les 33 pages non échantillonnées. Quinze pages sur 48 ont été analysées en détail. Les défauts relevés se répètent probablement ailleurs, mais cela reste une hypothèse.

PrestationTransparence : ce que coûte cette intervention

Nous publions le détail de nos prestations parce qu'un audit dont on ne connaît ni le temps ni le prix se juge mal. Les montants ci-dessous sont des ordres de grandeur indicatifs pour une intervention de ce calibre ; seul un devis nominatif engage.

PosteTempsCe qui est faitMontant indicatif HT
Audit et diagnostic3 jRelevés sur 2 semaines, rapprochements, entretiens, rédaction du présent rapport1 440 €
Mise en œuvre7 jLes lots du plan d'intervention, du premier au dernier, avec leurs critères d'acceptation3 360 €
Accompagnement et transfert1 jAteliers, documentation, formation de l'équipe, reprise en main sans nous480 €
Total11 jTaux journalier unique de 480 € HT, sans forfait caché ni frais de dossier5 280 €

Ce qui est compris, et ce qui ne l'est pas

Compris dans le montantHors prestation
Le rapport complet, remis en main propre et commentéHébergement, noms de domaine, abonnements tiers, facturés au réel par le fournisseur
Les ateliers et la formation de l'équipeLicences logicielles et services d'intelligence artificielle, à la consommation
La documentation et les procédures laissées en placeCréation de contenu éditorial, photographies, traductions
Les points de suivi : 2 points de 45 min à 1 et 3 mois, inclusDemandes hors périmètre, chiffrées séparément avant d'être engagées
Les correctifs sur ce que nous avons livré, sans limite de duréeÉvolutions fonctionnelles nouvelles, qui font l'objet d'un devis

Accompagnement, pédagogie et ressources

Pédagogie

Une séance de 2 h sur la lecture des indicateurs de performance, pour que l'équipe puisse mesurer sans nous. Notre critère de réussite est que l'équipe sache faire sans nous : un client qui dépend de son prestataire pour comprendre son propre outil a été mal servi.

Ressources mises à disposition

Accès à l'outil de mesure interne, jeu de relevés horodatés, grille de contrôle réutilisable. Tout cela reste au client, dans un format lisible et sans nous.

Rendu

Rapport de 18 pages, 1 atelier de restitution, 3 fiches de procédure. Chaque chiffre du rapport renvoie à son relevé horodaté, et chaque préconisation porte son critère d'acceptation : vous pouvez vérifier vous-même que le travail est fait, y compris contre nous.

Ce que nous ne promettons pas

Les gains annoncés par préconisation sont des hypothèses sauf mention contraire explicite, et ils sont présentés comme telles. Nous nous engageons sur les critères d'acceptation, qui sont vérifiables, pas sur un résultat commercial qui dépend aussi de ce que fait le marché.

HANDICODE · Dossier A-2026-014 · Rapport de démonstration
Méthode : 65 contrôles, Lighthouse 12.2, CrUX, Mozilla Observatory, axe-core 4.10.
Les mesures d'un audit réel sont horodatées et rejouables ; chaque chiffre renvoie à son relevé.

Les autres rapports

Le même regard sur votre site

L'Audit 360 mesure votre site en une minute, sans inscription, et vous rend les constats avec leurs sources et leurs limites.

Lancer un audit gratuit