Après avoir consulté plusieurs créateurs de sites web, notre choix s'est porté sur "ClickForest". Pas le moins cher, mais une approche directe et personnelle. Grâce à une bonne collaboration avec Frederiek, notre nouveau site "Servaes Services" a été lancé rapidement et efficacement, et nous les recommandons vivement.
Kunstbrein : un site d'actualité qui se remplit tout seul, avec les règles éditoriales dans le code
Un site d'actualité IA néerlandophone qui lit cinquante sources chaque matin, décide lui-même quel récit vaut la peine, rédige l'article avec une couche d'analyse destinée aux entrepreneurs flamands et le publie sans que personne ne clique sur merge. Les portes qui bloquent un article erroné sont écrites dans le code, et elles sont testées.
Une instruction dans un prompt est une demande. Une porte est une porte. C'est pourquoi le contrôle qualité de Kunstbrein vit dans le code, et non dans la consigne donnée au modèle.
Défi
Le marketing de contenu ne se met pas à l'échelle à la main, et un contenu IA que personne ne vérifie coûte plus d'autorité qu'il n'en rapporte. La question n'a donc jamais été de savoir si l'IA peut écrire des articles, puisque n'importe qui le démontre en cinq minutes. La question était de savoir si l'on peut construire un système que l'on ose laisser publier sans relecture finale, chaque jour, sans que rien ne parte en ligne en contredisant sa propre source.
Approche
Tout ce qui peut vivre dans le code vit dans le code. La collecte, la déduplication, le regroupement et la pondération se font sans modèle de langage, donc ces étapes ne peuvent rien inventer et ne coûtent rien. Le modèle n'intervient que là où un jugement est nécessaire : la rédaction et la vérification des faits. Au-dessus, cinq portes qui refusent au lieu d'avertir, 300 tests, et git comme unique source de vérité pour le contenu.
sources collectées, dédupliquées, regroupées et pondérées chaque matin, entièrement sans modèle de langage
des articles rédigés ne passent pas : 22 rédigés, 11 publiés sur 16 exécutions enregistrées
tests sur le pipeline, les portes et l'horloge, tous au vert au moment d'écrire cette étude de cas
tâches automatiques par jour : collecter, rédiger, vérifier, compléter, plus une newsletter deux fois par semaine
Cinquante sources, chaque matin, sans modèle
À 07:25, le pipeline récupère 47 flux RSS et Atom plus trois pages qui ne proposent pas de flux et sont donc interrogées directement. Ces cinquante sources ne sont pas égales : 41 peuvent fournir du contenu, neuf sont derrière un paywall et ne peuvent que signaler qu'il se passe quelque chose. Chaque source a aussi un rôle, de la source primaire à l'analyse et à la contradiction, en passant par la presse et la politique.
Ce qui suit se passe dans le code. Les flux sont normalisés, dédupliqués contre tout ce qui est déjà en ligne, puis regroupés : le même récit chez cinq éditeurs devient un seul candidat au lieu de cinq. La pondération tient compte du nombre de sources indépendantes (de façon logarithmique, car dix sources ne comptent pas dix fois), de la diversité des rôles (une source primaire plus une analyse plus la presse forment un vrai récit, cinq copies du même communiqué non), de la fraîcheur et de la présence de termes pertinents pour les PME. L'actualité purement scientifique reçoit un malus. Ce dernier réglage est arrivé après que "Midjourney rachète une appli d'astrologie" a pu devenir candidat.
Faire tout cela sans modèle n'est pas de l'économie mais de la fiabilité. Ce qui vit dans le code ne peut rien inventer, est reproductible et se teste. À ce volume, faire classer quatre-vingts titres par jour par un modèle de langage coûterait d'ailleurs plus cher que la rédaction elle-même.
Les portes : la qualité vit dans le code, pas dans le prompt
C'est le cœur du projet. Cinq couches se dressent entre un article rédigé et sa publication, toutes dans le code et toutes testées :
- Recouvrement littéral. Après la rédaction, l'article est comparé mot par mot au texte source. Toute suite de huit mots ou plus qui correspond littéralement et ne se trouve pas dans une citation marquée est un refus. Les faits sont libres, les formulations non. Un affinage est venu de la mesure : une suite plus courte contenant un chiffre est une description factuelle et non du plagiat, car "de 10 gigawatts dans le sud de l'Ohio" ne se dit pas autrement sans perdre le fait. Dix mots d'affilée sans chiffre n'est jamais un hasard.
- Vérification des faits avec deux mesures. Une puce de résumé est un fait et doit figurer dans les sources. Une conséquence d'analyse est une interprétation et ne doit par définition pas figurer dans les sources, puisque la consigne demande explicitement un angle que les sources n'ont pas. Traiter les deux de la même façon reviendrait soit à refuser toute analyse, soit à laisser passer toute affirmation factuelle inventée.
- Porte anti-doublon. Recouvrement des titres avec les publications récentes, avec un seuil. Le 30 juillet, elle a refusé un article parce qu'il reconstruisait la même intrusion via un agent IA qu'un texte de quatre jours plus tôt. À juste titre.
- Contrôle des entités et des liens. Les URL de sources, éditeurs ou noms inventés ne passent pas. Le frontmatter doit renvoyer à ce que l'étape de collecte a réellement rapporté.
- Longueurs, avec une cible et un point de rupture. Le modèle écrit vers le plafond, donc trois caractères de trop ne sont pas un défaut de qualité mais du calcul de probabilités. Il y a désormais une limite que la consigne demande et une frontière dure où la porte refuse. Entre les deux, l'article reçoit une remarque de style, et le style se corrige mais ne refuse jamais.
Le piège en dessous est le schéma de contenu. Une porte plus large que le schéma laisse passer un article qui casse le build, et le pipeline fusionne sa propre pull request. C'est pourquoi un test lit les maxima du schéma de contenu et les compare aux points de rupture dans le code. Quiconque relèvera une frontière en oubliant le schéma obtiendra un test rouge plutôt qu'un site à l'arrêt.
La moitié est refusée, et c'est voulu
Sur 16 exécutions de rédaction enregistrées, 22 articles ont été écrits et 11 publiés. Les refus : 10 sur la vérification des faits, 6 sur la longueur, 3 sur le plagiat, 2 comme doublons et 1 sur une réponse de modèle cassée. Ces 50 % ne sont pas un défaut, c'est le système qui fonctionne.
La vérification des faits existe d'ailleurs parce que quelque chose est passé. La source disait que trois modèles étaient impliqués, dont un pas encore sorti. L'article en a fait un nom de modèle que personne n'avait annoncé. Toutes les portes étaient au vert, et le corps de l'article était correct. L'erreur se trouvait dans la couche de compression, dans le résumé, et c'est précisément là que la nuance meurt. Depuis, chaque puce de cette couche est confrontée aux sources individuellement.
Le site est sa propre horloge
Le pipeline dépendait d'abord du planificateur de GitHub Actions. Ce n'est volontairement pas une garantie : les événements planifiés arrivent dans une file partagée. Mesuré sur ce dépôt, l'étape de collecte a tourné avec 2 heures et 32 minutes de retard le 26 juillet, l'étape de rédaction avec 2 heures et 2 minutes, et les 27 et 28 juillet rien n'a tourné du tout. Passer à des minutes impaires n'a rien changé, et une sentinelle accrochée à ce même planificateur n'est qu'une demi-solution.
Depuis le 28 juillet, les rôles sont inversés. Le Worker Cloudflare qui sert déjà le site est aussi le réveil : ses déclencheurs cron lancent le pipeline via un appel API qui part immédiatement, et GitHub Actions n'est plus que l'atelier. Il y avait un véritable obstacle technique en dessous, car l'adaptateur Astro construit un point d'entrée qui n'accepte que le trafic des visiteurs et ne laisse aucune place à une tâche planifiée. Un point d'entrée propre à côté de celui d'Astro résout cela, et comme une telle intervention est sensible aux versions, le script de build vérifie tout ce dont il dépend. Si quelque chose ne colle pas, le build échoue, et un build échoué est un déploiement sauté plutôt qu'un site cassé.
Cette même migration a produit la leçon la plus coûteuse du projet. Le cron de la newsletter était réglé sur une valeur qui signifie mardi et vendredi dans crontab et dans GitHub Actions. Cloudflare compte les jours de la semaine autrement, la newsletter est donc partie un jour trop tôt. Un test existait, intitulé "démarre le mardi et le vendredi matin", mais il vérifiait si la bonne chaîne de caractères figurait dans le tableau. Il testait la frappe, pas l'hypothèse, alors que son nom suggérait le contraire. La numérotation des jours de Cloudflare figure désormais comme tableau dans le code et les tests vérifient ce qui sort réellement. Un test qui ne tient pas sa propre promesse est pire que pas de test.
Git est la base de données du contenu
Il n'y a pas de CMS. Un article n'existe qu'après un commit, ce qui ressemble à une limite mais est un avantage : chaque article a un diff, un historique et un retour arrière, le sitemap obtient un vrai lastmod par page, et aucune base de données ne peut se corrompre en silence. La déduplication se fait contre les URL de sources de ce qui est déjà publié, il n'y a donc pas de table de statut séparée qui pourrait se désynchroniser de la réalité.
Le site lui-même est en Astro 7 sur Cloudflare Workers, avec tous les articles, rubriques et dossiers prérendus : aucune attente et aucun appel de base de données pour lire un article. D1 ne gère que ce qui est réellement un état, comme la liste de la newsletter, le compteur des articles les plus lus et les alertes. La recherche tourne sur Pagefind, sans service de recherche externe. L'image OG de chaque article est dessinée au postbuild avec la rubrique et le titre. Les polices sont auto-hébergées, la CSP est en mode strict, GA4 ne charge qu'après consentement et l'admin est derrière Cloudflare Access avec une vraie validation de jeton : si les clés ne correspondent plus, cette admin se ferme au lieu de s'ouvrir.
La couche d'analyse est l'apport propre
Une réponse d'IA ne cite pas un site qui dit la même chose que cinq autres. Le cœur de chaque article Kunstbrein n'est donc pas l'actualité mais sa lecture : trois à quatre profils concrets, comme une PME qui exploite un chatbot via un fournisseur externe ou un marketeur qui compare des abonnements IA sur le prix, avec à chaque fois la conséquence explicitée. C'est le texte qui n'existe nulle part ailleurs, et donc la seule partie pour laquelle une réponse d'IA doit renvoyer vers Kunstbrein.
Autour se trouve la transparence que les réponses d'IA récompensent. Chaque article montre ses sources avec l'éditeur, le titre, l'horodatage et le lien, sans nofollow, car une mention de source est l'inverse d'un lien payant. Chaque article indique lui-même qu'il a été composé avec l'assistance de l'IA, sous la responsabilité éditoriale de Frederiek Pascal. La charte éditoriale est une vraie page et constitue en même temps la cible de publishingPrinciples dans le graphe schema.org. Chaque article est un NewsArticle dont les citations sont construites à partir du champ de sources obligatoire : pas de source, pas d'article, imposé par le schéma. Par-dessus : une politique délibérée envers les crawlers IA, un llms.txt et un sitemap avec un vrai lastmod par page.
Ce que cela coûte
Un à trois dollars par mois de coûts de modèle. Ce chiffre bas ne vient pas d'un modèle bon marché mais de l'architecture : le modèle ne fait que la rédaction et la vérification des faits, tout le reste se passe dans le code. Tout passe par la Message Batches API à la moitié du prix des tokens, car personne n'attend la réponse à huit heures dix du matin. Le flux fonctionne par tours : d'abord tous les appels principaux en un seul lot, puis les portes dans le code, puis toutes les demandes de correction ensemble dans le lot suivant. Un lot qui n'est pas prêt après quarante-cinq minutes est annulé et l'exécution échoue proprement : pas d'article, pas de pull request, on recommence demain.
Ces coûts sont réellement mesurés, pas estimés : un script récupère la consommation et les coûts chez le fournisseur lui-même. Notre propre total tiré des logs ne comptait en effet que les articles publiés, alors qu'un article refusé coûte exactement autant de tokens. Pour le reste : Cloudflare Workers, D1 et le routage e-mail dans le plan existant, et Resend pour l'envoi. Pas de licence CMS, pas de service de recherche, pas de banque d'images.
Ce que nous ne prétendons pas
Une étude de cas qui ne montre que le beau côté est une brochure. Donc :
- Ce n'est pas "l'IA écrit, l'humain vérifie". Il n'y a pas de relecture finale avant publication. Les portes se trouvent avant le merge, et le contrôle qualité a posteriori se fait dans l'admin, où un article peut être archivé ou un retour peut déclencher une réécriture. C'est un choix assumé.
- Aucune promesse de trafic ni de classement. La mesure n'a démarré qu'au lancement. Le point de contrôle est à trois et six mois : Kunstbrein apparaît-il dans les réponses d'IA aux questions du public cible, et du trafic arrive-t-il vers nos propres pages IA. Sinon, cela s'arrête, avec une archive qui reste en ligne.
- Les articles les plus anciens sont du matériel de démarrage issu de la phase précédant la mise en service du pipeline, et ils sont plus courts. Nous séparons donc toujours les chiffres de longueur moyenne à cette date, sinon vous mesurez deux choses à la fois.
Cinquante sources, chaque matin
Collecte, déduplication, regroupement et pondération se font sans modèle de langage, donc rien ne peut être inventé et cela ne coûte rien.
La moitié est refusée
22 articles rédigés, 11 publiés. Un article qui contredit sa propre source ou la recopie littéralement ne passe pas.
Le site est sa propre horloge
Le même Worker Cloudflare qui sert les pages lance le pipeline, après que le planificateur de GitHub a sauté trois jours de suite.
Outils utilisés
Nous faisons cela pour vous aussi
Vous voulez une approche similaire pour votre entreprise ? Découvrez les services derrière cette étude de cas.
Nous travaillons avec des PME belges qui veulent grandir.
Via Shopify, le performance marketing et l'IA.