Votre page est parfaite. Google ne la voit plus.
goflag est un CLI qui lit votre site comme un crawler le lit, et fait échouer une étape de CI avant qu’un défaut invisible ne parte en production.
npx @goflag/cli https://example.comUne balise change.
jour 0Sans goflag
Ça part en production.
jour 0La page quitte l’index.
des semaines plus tardQuelqu’un demande pourquoi le trafic a baissé.
des mois plus tardAvec goflag
La CI lève le drapeau.
4 min plus tardUn développeur ou un agent corrige.
quelques minutes plus tardÇa part en production, propre.
toujours jour 0Ce qu’un navigateur ne peut pas vous montrer
Chacun de ces cas s’affiche parfaitement. Le défaut se trouve dans la partie de la page que personne ne regarde, et le prix se paie dans un index de recherche que vous ne voyez jamais.
Ce que vous voyez
Une page qui s’affiche exactement comme prévu.
Ce que voit un crawler
<link rel="canonical" href="/another-page">Conséquence
La page demande à être écartée au profit d’une autre. Elle le sera.
Ce que vous voyez
Quatre locales, toutes accessibles.
Ce que voit un crawler
no <link rel="alternate" hreflang> anywhereConséquence
Chaque traduction concurrence les trois autres au lieu de se consolider avec elles.
Ce que vous voyez
Un site de production en ligne, qui sert du trafic.
Ce que voit un crawler
robots.txt → User-agent: *
Disallow: /Conséquence
Aucune page n’est jamais récupérée, donc la directive d’indexation présente sur chaque page n’est jamais lue.
Toute l’interface
Le rapport JSON est l’interface : redirigez-le dans vos scripts, comparez-le entre deux exécutions, conditionnez la CI dessus, ou donnez-le à lire à un agent IA. La sortie du terminal en est un rendu.
$ npx @goflag/cli https://example.com
goflag https://example.com/
RED FLAG 128 pages crawled, 128 scanned
3 broken links 2 missing translations 14 SEO issues 1 site issue 0 unreachable pages
Broken links
https://example.com/blog/hreflang-basics
[404] https://example.com/guides/canonical-tags
[blocked 403 forbidden] https://api.partner.example/status
Missing translations
/blog/hreflang-basics — missing de (have en, fr)
missing-back-link https://example.com/fr/blog/hreflang-basics
/fr/blog/hreflang-basics declares an alternate to /de/... but the peer does not link back.
SEO issues
https://example.com/blog/hreflang-basics
warn canonical.missing Page is missing <link rel="canonical">.
warn description.length Description is 31 characters — short of the recommended 50–160 window.
https://example.com/pricing
error robots.conflict Page asks to be indexed while robots.txt disallows it.
warn og.image.missing Page has no og:image.
Site-wide issues
locales: en, fr, de (via sitemap)
https://example.com/
error hreflang.missing Site serves 3 locales but declares no hreflang alternates.
note: 1 link returned 403 from an anti-bot filter, not counted as broken.
Sortie réelle ; seul l’espacement est ajusté pour la page. La progression part sur stderr pour que stdout reste propre pour le rapport.
Bloquer sur les régressions, pas sur la perfection
Une exécution qui échoue au moindre constat est inutilisable sur un site qui n’est pas encore propre, alors on la désactive, ou on l’ignore en silence. Trois flags rendent le garde-fou tenable, et l’un d’eux fait vraiment diminuer la dette.
Capturer une baseline
goflag https://example.com \ --baseline .goflag/baseline.json --update-baselineFigez les constats du jour comme connus, pour que le garde-fou puisse demander si ce changement a aggravé les choses plutôt que si le site est parfait. La sortie ne dit jamais que c’est propre tant que des constats restent en suspens; elle dit combien on en laisse passer.
Bloquer sur ce qui est nouveau
goflag http://localhost:3000 --no-external \ --baseline .goflag/baseline.json --regressions-onlyLes constats sont appariés par empreinte, et les URL de pages sont normalisées en routes indépendantes de l’origine: une baseline capturée contre la production se compare donc proprement à une exécution contre localhost.
Abaisser le cliquet
goflag … --baseline .goflag/baseline.json --max-debt 13Corrigez un constat, baissez --max-debt de un, committez les deux. Sans cela, une baseline se fossilise derrière un build qui passe.
En CI
Deux moments méritent un audit, et ils répondent à des questions différentes.
| Quand | Contre | Répond à |
|---|---|---|
| Sur la merge request | Le build de la branche elle-même, démarré par --start | Ce changement provoque-t-il une régression ? |
| Après le déploiement | L’environnement en cours d’exécution | Ce qui est réellement servi est-il correct ? |
Les flags à connaître (--no-external, l’épinglage de version, les codes de sortie) tiennent en trois courtes sections de la documentation.
Voir les recettes CIConstruit en auditant mes propres sites
goflag existe parce que quatre sites que j’exploite en avaient besoin, celui-ci compris: goflag.tech est gardé par son propre audit en CI, et un merge qui le casse ne passe pas. Chaque chiffre ci-dessous est mesuré, pas estimé.
- sites sous garde-fou en CI
- 4sites sous garde-fou en CI
- pages auditées en 4 min
- 456pages auditées en 4 min
- tests dans le CLI
- 516tests dans le CLI
Ce que goflag n’est pas
Une commande, un rapport JSON, un code de sortie. Si ce que vous voulez est un chiffre à optimiser, ce n’est pas le bon outil : une note invite à optimiser la note.
Si vous voulez un crawler de bureau avec une interface, Screaming Frog existe ; si vous ne cherchez que les liens morts, lychee est plus rapide. goflag sert à conditionner un build sur ce qu’un crawler lit.
Avant d’installer
Pointez-le vers votre site.
Le démarrage rapide vous mène d’un premier passage rouge à un garde-fou auquel vous faites confiance.
npx @goflag/cli https://example.com