Un site qui affirme que la souveraineté se vérifie doit être vérifiable lui-même. Voici donc ce qu’il est, exactement.

source
github.com/kallioli/kevinallioli.com
commit
7d2c9564378ce1dfdb2c32ef053ef1e0040135ff
generator
Hugo 0.165.0 extended
stylesheet
main.73696a8a7ba91c279dd62215e8204e579aca95d37f408866410ff8886b216e12.css
script-src
sha256-JWkP4OLql65Ng9NZyYicPsZKLizhJHgax5PUBv4hED4=

Construction

Le site est généré par Hugo en version extended, épinglée dans le fichier .hugo-version du dépôt et lue par la même chaîne en local et en intégration continue. Pas de latest : une version flottante rend un build irreproductible et c’est exactement ce que ce site reproche aux autres.

Aucun thème tiers. Tous les gabarits sont écrits dans ce dépôt. Les thèmes Hugo populaires sont reconnaissables au premier coup d’œil et constituent une dépendance de plus à suivre ; ici il n’y a rien à suivre.

Pas de Node, pas de npm, pas de bundler. Le SCSS est transpilé, minifié et empreinté par Hugo Pipes. Les URL d’assets contiennent leur empreinte, ce qui les rend immuables et permet de les mettre en cache un an sans revalidation, exactement comme les chemins du registre d’images d’Open Image Cloud.

Ce que le navigateur télécharge

Une page HTML, une feuille de style, quatre fichiers de police préchargés, et deux de plus seulement si la page contient de l’italique ou un titre en serif grasse. Rien d’autre, et rien qui vienne d’un autre domaine.

Les polices sont la famille IBM Plex, sous licence SIL Open Font License, servies depuis ce domaine en woff2 sous-ensemblés au latin étendu. Six graisses pèsent 132 Ko au total. Pas de Google Fonts : demander une police à un tiers, c’est lui annoncer chacune de vos visites.

Pas d’analytics, pas de balise de suivi, pas de CDN externe, pas de bandeau de consentement, parce qu’il n’y a rien à consentir.

JavaScript

Une fonction, en ligne dans le <head>, qui lit une préférence de thème en localStorage, l’applique avant le premier rendu et révèle le bouton de bascule. Sans JavaScript, le bouton reste caché et le thème suit prefers-color-scheme. Aucune page d’article n’exécute quoi que ce soit d’autre.

L’empreinte SHA-256 de ce script est reportée ci-dessus, et c’est la même valeur que la directive script-src de l’en-tête Content-Security-Policy. Elle est calculée au build : le script ne peut pas changer sans que la politique change avec lui.

En-têtes

Le fichier _headers est généré par un gabarit, pas écrit à la main. La politique de sécurité de contenu se réduit à default-src 'self' plus l’empreinte du script ci-dessus. S’y ajoutent HSTS, nosniff, Referrer-Policy: strict-origin-when-cross-origin, frame-ancestors 'none' et une Permissions-Policy qui refuse à peu près toutes les API du navigateur, puisque le site n’en utilise aucune.

Hébergement et déploiement

Le dépôt est sur GitHub. Chaque poussée sur main déclenche une action qui installe la version épinglée de Hugo, vérifie son empreinte, construit le site, contrôle que l’empreinte de la CSP correspond bien au script servi, puis publie avec wrangler sur Cloudflare Workers Static Assets. Le jeton d’API vit dans les secrets du dépôt ; il n’apparaît nulle part dans le code.

Il n’y a aucun script Worker devant le site, et c’est délibéré : les en-têtes de _headers sont posés par le serveur d’assets, mais pas sur une réponse produite par du code Worker. Un Worker placé devant, même de trois lignes, retirerait silencieusement la politique de sécurité de toutes les pages. La redirection depuis www est donc une règle de zone, qui s’exécute de toute façon avant les Workers.

Le hash du commit affiché plus haut est injecté au moment du build. Il désigne l’état exact du dépôt qui a produit la page que vous lisez.

Typographie

IBM Plex, une seule famille pour tout le site. Plex Sans pour les titres et la navigation, Plex Serif pour le corps des articles, Plex Mono pour tout ce qui est une donnée plutôt qu’une phrase : dates, numéros de changement, versions, empreintes. Corps à 18 pixels, interligne 1,65, mesure limitée à 68 caractères.

Deux thèmes, clair et sombre, dérivés d’un même jeu de variables CSS. Un seul accent.

Licence

Les textes sont sous CC BY 4.0. Le code des gabarits et des styles est sous licence MIT. Les polices IBM Plex sont sous SIL OFL 1.1.