Cette fois, votre « Enregistrer sous » ne mourra plus dans six mois
Vous connaissez sûrement cette frustration. Vous tombez sur un article de blog exceptionnel, un tutoriel de développement particulièrement bien fait, une documentation technique claire comme de l’eau de roche. Par réflexe, vous faites un « Enregistrer sous » dans votre navigateur, convaincu d’avoir sécurisé le contenu pour toujours.
Six mois plus tard, vous rouvrez ce fichier. Écran blanc. Une roue qui tourne indéfiniment sans jamais rien afficher. Ou pire : une copie qui tente encore silencieusement de contacter un serveur d’analytics qui, entretemps, a disparu de la surface du web. La page n’a jamais vraiment été à vous. C’était un client léger, entièrement dépendant du JavaScript de quelqu’un d’autre.
C’est précisément ce problème qu’un nouvel outil open source baptisé Kage, 影, qui signifie « ombre » en japonais, vient résoudre avec une élégance technique qui a rapidement conquis la communauté des développeurs. Son créateur, tamnd, a publié le projet sur GitHub, et il a déjà rassemblé son lot d’admirateurs séduits par une promesse simple : cloner n’importe quel site dans un dossier consultable hors-ligne, avec absolument tout le JavaScript retiré.
Le problème que Kage résout : le web moderne n’est pas fait pour durer
Avant de voir comment Kage fonctionne concrètement, il faut comprendre pourquoi les méthodes d’archivage classiques échouent aussi souvent.
Pourquoi votre « Enregistrer sous » ne fonctionne pas vraiment
Un site web moderne n’est presque jamais un simple document statique. C’est une application : une page qui charge un squelette HTML minimal, puis exécute du JavaScript pour aller chercher le vrai contenu, l’afficher progressivement, gérer les interactions, et souvent envoyer des données vers des serveurs distants (analytics, publicité, authentification).
Quand vous faites un « Enregistrer sous » classique dans votre navigateur, vous ne capturez que ce squelette initial. Le JavaScript, lui, reste actif dans le fichier sauvegardé et sans connexion Internet pour aller chercher ses dépendances, ce JavaScript échoue silencieusement, laissant souvent une page vide ou incomplète.
La philosophie de Kage : capturer le résultat, pas le processus
Kage prend le problème à l’envers. Plutôt que de sauvegarder le code source qui produit la page, il pilote un vrai navigateur (Chrome ou Chromium, en mode headless, c’est-à-dire sans interface graphique visible), laisse la page terminer intégralement son exécution JavaScript comme si un humain la visitait, capture le résultat final tel qu’il apparaît réellement à l’écran, puis arrache tout le code JavaScript de cette capture.
Le résultat : des fichiers .html que vous pouvez ouvrir directement depuis votre disque dur, transmettre à un ami, ou compresser dans un fichier unique et oublier pendant une décennie. Sans traqueur, sans appel réseau, sans surprise.
Comment fonctionne Kage sous le capot : les quatre étapes du processus
Pour bien comprendre la robustesse de cet outil, voici le déroulé technique exact, tel que documenté par son créateur.
Étape 1 : Le rendu dans un vrai navigateur
Kage pilote une instance de Chrome ou Chromium en mode headless. Chaque page ciblée est chargée normalement, avec l’exécution complète de son JavaScript, exactement comme si vous la visitiez avec votre navigateur habituel. L’outil attend patiemment que la page se stabilise avant de passer à l’étape suivante, un point crucial pour les sites qui chargent du contenu de façon différée.
Étape 2 : La capture du DOM final
Une fois la page stabilisée, Kage prend un instantané (snapshot) du DOM, le Document Object Model, c’est-à-dire la structure finale de la page telle qu’elle apparaîtrait réellement dans les yeux d’un visiteur humain, après que tout le JavaScript a fini son travail.
Étape 3 : L’assainissement (« sanitize »)
C’est ici que Kage retire tout le code JavaScript de cette capture, scripts, gestionnaires d’événements, liens en javascript: ne laissant que du HTML et CSS purs. C’est cette étape qui garantit qu’aucun code ne pourra s’exécuter une fois le site archivé, et donc qu’aucun traqueur ne pourra fonctionner.
Étape 4 : La localisation des ressources
Enfin, Kage télécharge et rapatrie localement toutes les ressources externes (feuilles de style CSS, images, polices de caractères) en réécrivant systématiquement tous les liens pour qu’ils pointent vers ces copies locales plutôt que vers les serveurs d’origine.
Le résultat de ce processus ressemble, sur votre disque, à ceci :
paulgraham.com/
├── index.html # la page d'accueil, scripts retirés
├── greatwork.html # un article, par exemple
├── _kage/ # dossier réservé aux ressources
│ ├── paulgraham.com/site.css # feuille de style rapatriée localement
│ ├── paulgraham.com/pg.png
│ └── state.json # état de la capture, pour pouvoir reprendre
└── ...
Installer Kage : plusieurs options selon votre profil
Pour les développeurs Go
Si vous avez déjà un environnement Go installé sur votre machine, l’installation se résume à une seule commande :
go install github.com/tamnd/kage/cmd/kage@latest
Pour ceux qui préfèrent un binaire prêt à l’emploi
Kage propose également des archives précompilées, des paquets .deb, .rpm ou .apk selon votre distribution Linux, ainsi que des sommes de contrôle (checksums) pour vérifier l’intégrité du téléchargement, le tout disponible directement sur la page des releases du projet GitHub.
Pour éviter d’installer Chrome vous-même : l’image Docker
Kage a besoin d’un vrai navigateur Chrome ou Chromium installé sur la machine hôte pour fonctionner, c’est le prix de son approche fidèle au rendu réel des pages. Si vous préférez éviter cette installation, une image Docker toute prête embarque directement Chromium :
docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com
Le tutoriel pratique : archiver votre premier site en quelques commandes
Prenons l’exemple concret proposé par la documentation officielle : archiver les essais du célèbre entrepreneur et essayiste Paul Graham, disponibles sur paulgraham.com, pour pouvoir les lire dans un avion, sur un ordinateur sans wifi, ou même dans plusieurs décennies après que le site aura changé de design.
Étape 1 : Cloner le site
kage clone paulgraham.com
Cette commande déclenche un parcours méthodique (crawl) du site, en respectant le fichier robots.txt, en s’appuyant sur le sitemap.xml du site pour identifier les pages à visiter, et en restant, par défaut, cantonné au domaine d’origine. Le résultat atterrit dans un dossier par défaut, généralement $HOME/data/kage/paulgraham.com/.
Étape 2 : Prévisualiser votre archive hors-ligne
kage serve $HOME/data/kage/paulgraham.com
Cette commande démarre un petit serveur web local, accessible à l’adresse http://127.0.0.1:8800, qui vous permet de naviguer dans votre copie exactement comme si vous étiez sur le vrai site avec des liens qui fonctionnent normalement entre les pages.
Étape 3 : Compresser le tout en un seul fichier
C’est ici que la magie opère vraiment. Une fois votre site cloné, Kage propose de le compresser dans un fichier unique, bien plus pratique à archiver ou à transmettre qu’un dossier contenant potentiellement des milliers de petits fichiers :
kage pack paulgraham.com
Cette commande produit un fichier paulgraham.com.zim.
Étape 4 : Et pour un fichier exécutable autonome
Voilà la fonctionnalité la plus spectaculaire, celle qui donne tout son sens au titre de cet article :
kage pack paulgraham.com --format binary -o paulgraham
./paulgraham
Cette commande produit un fichier exécutable unique qui, littéralement, est le site. Vous le lancez, il se lance lui-même comme un mini-serveur, et sert le contenu archivé sans que quiconque n’ait besoin d’installer quoi que ce soit au préalable, ni Kage, ni un lecteur spécifique.
Le format ZIM : pourquoi Kage ne réinvente pas la roue
Un choix technique de Kage mérite une attention particulière : plutôt que d’inventer son propre format d’archive propriétaire, l’outil s’appuie sur le format ouvert ZIM.
Un format déjà éprouvé par des millions d’utilisateurs
Le ZIM est un format de fichier ouvert et documenté, conçu précisément pour cet usage : compresser un site web entier, voire l’intégralité de Wikipedia, dans un seul fichier indexé, en lecture seule. C’est le format qui alimente Kiwix, le projet de contenu hors-ligne que des utilisateurs à travers le monde utilisent pour emporter Wikipédia, Stack Overflow ou le Projet Gutenberg sur des bateaux, dans des salles de classe sans connexion Internet, ou sur un téléphone lors d’un long vol.
L’avantage de ne pas être enfermé dans l’écosystème Kage
Parce que le format ZIM est un standard documenté, et non une invention propre à Kage, un fichier paulgraham.com.zim que vous créez aujourd’hui s’ouvrira toujours dans n’importe quel lecteur ZIM dans plusieurs années, que ce soit avec Kage lui-même, avec Kiwix Serve, avec l’application Kiwix Desktop, ou même avec les applications Kiwix pour Android et iOS.
kage open paulgraham.com.zim # relire avec kage
kiwix-serve paulgraham.com.zim # ou servir avec Kiwix
Petite précision technique honnête : Kage écrit une archive structurellement valide avec les métadonnées standards, mais elle ne construit pas l’index de recherche plein texte que les archives Kiwix officielles embarquent habituellement. La navigation et les clics fonctionnent partout, mais la recherche interne au lecteur reste limitée sur les archives produites par Kage.
Le déterminisme, un détail technique qui compte
La mise en paquet (packing) réalisée par Kage est déterministe : la même archive source produira toujours un fichier byte-identique, avec un identifiant unique dérivé du contenu lui-même plutôt qu’aléatoire, ce qui rend chaque fichier ZIM produit fiable à vérifier par somme de contrôle et sûr à mettre en cache.
Le fichier exécutable autonome : comment ça marche vraiment
Revenons plus en détail sur cette fonctionnalité qui distingue vraiment Kage de la plupart de ses concurrents.
Un exécutable universel, indépendant de la plateforme
L’option --format binary agglomère l’archive à une copie de Kage lui-même, produisant un exécutable unique qui sert le site hors-ligne dès qu’on le lance. La personne à qui vous envoyez ce fichier n’a besoin d’installer strictement rien : ni Kage, ni un lecteur ZIM, ni quoi que ce soit d’autre.
Un détail technique intéressant : l’archive ajoutée à l’exécutable est indépendante de la plateforme, seul l’exécutable de base porte la spécificité de l’architecture (Windows, macOS, Linux). Cela signifie que vous pouvez, depuis un Mac, générer un exécutable Windows en pointant simplement l’option --base vers une version de Kage compilée pour Windows :
# Depuis un Mac, produire un lecteur pour Windows
kage pack paulgraham.com --format binary --base kage-windows-amd64.exe
# -> paulgraham.exe
Le compromis à connaître : la taille du fichier
Cette flexibilité a un prix : l’exécutable embarque une copie complète de Kage, ce qui lui fait peser environ 13 Mo au minimum, quelle que soit la taille réelle du contenu archivé. Si vous n’avez besoin que du contenu pur, sans le confort de l’auto-exécution, le format ZIM classique reste largement plus léger.
Une vraie fenêtre plutôt qu’un onglet de navigateur
Par défaut, un exécutable Kage ouvre votre navigateur système habituel pour afficher le contenu, ce qui signifie que le site apparaît comme un onglet de plus, à côté des quarante-sept que vous avez probablement déjà ouverts. Mais Kage propose une option de compilation avec le tag webview, qui ouvre le contenu dans sa propre fenêtre dédiée, s’appuyant sur le composant WebView natif du système d’exploitation (WKWebView sur macOS, WebView2 sur Windows, WebKitGTK sur Linux). Le résultat ressemble et se comporte comme une vraie application autonome.
make build-webview
kage pack paulgraham.com --format binary --base bin/kage -o paulgraham
./paulgraham # ouvre une fenêtre, sans navigateur en vue
Les options avancées pour affiner votre archivage
Kage propose une série d’options en ligne de commande particulièrement utiles pour des cas d’usage plus précis :
| Option | Ce qu’elle fait |
|---|---|
-o, --out | Choisir le dossier de destination de l’archive |
-p, --max-pages | Limiter le nombre de pages archivées (utile pour tester rapidement sur un grand site) |
-d, --max-depth | Limiter la profondeur de liens à suivre |
--scope-prefix | Ne cloner qu’une section précise d’un site (par exemple, uniquement /doc) |
--subdomains | Inclure également les sous-domaines du site cible |
--scroll | Faire défiler automatiquement chaque page pour déclencher le chargement des images en lazy loading |
--workers | Nombre de pages rendues simultanément (4 par défaut) |
--no-robots | Ignorer le fichier robots.txt (à utiliser avec discernement et courtoisie) |
-f, --force | Supprimer une archive existante avant de recommencer entièrement |
--refresh | Re-parcourir un site déjà archivé pour capturer le contenu ajouté depuis |
Un crawl intelligent et reprenable
Un détail d’ingénierie particulièrement soigné : le processus de clonage de Kage est idempotent. Chaque page est identifiée de façon unique par le fichier qu’elle produit, ce qui signifie qu’un même article accessible via http ou https, avec ou sans slash final, ne sera récupéré qu’une seule fois. Si vous interrompez le processus avec Ctrl-C, Kage sauvegarde sa progression et reprend exactement où il s’était arrêté lors du prochain lancement, un vrai confort pour l’archivage de très grands sites qui peut prendre du temps.
Pour qui cet outil est-il vraiment pertinent ?
Les développeurs et documentalistes techniques
Kage est particulièrement précieux pour conserver des documentations techniques de bibliothèques ou de frameworks, des ressources dont on sait, par expérience, qu’elles peuvent disparaître, changer radicalement de structure, ou passer derrière un mur payant du jour au lendemain.
Les voyageurs et les zones à connectivité limitée
Pour quiconque doit travailler dans des environnements sans connexion fiable (avion, train, zones rurales, déplacements internationaux) pouvoir emporter une documentation complète, un blog technique favori, ou une base de connaissances entière dans un unique fichier exécutable représente un gain de productivité concret.
Les bibliothécaires numériques et archivistes
Le choix du format ZIM ancre naturellement Kage dans l’écosystème plus large de la préservation numérique, aux côtés de projets comme Kiwix, dont la mission est précisément de rendre la connaissance accessible sans dépendre d’une connexion Internet permanente, un enjeu qui dépasse largement le confort individuel pour toucher à des questions d’accès équitable à l’information.
Les créateurs de contenu qui veulent partager sans dépendance
Envoyer un dossier de mille petits fichiers à un collègue ou un client est peu pratique. Envoyer un unique fichier exécutable, qui « est » littéralement le site archivé, simplifie radicalement le partage de contenu web hors ligne.
Les limites à connaître avant de vous lancer
Voici ses limites actuelles, honnêtement documentées par son propre créateur.
- Kage nécessite un vrai navigateur Chrome ou Chromium installé sur la machine qui effectue le clonage (sauf si vous utilisez l’image Docker qui l’embarque).
- La recherche plein texte n’est pas incluse dans les archives ZIM produites par Kage, contrairement aux archives officielles distribuées par le projet Kiwix.
- Les exécutables autonomes pèsent un minimum de 13 Mo, même pour archiver une seule petite page, un coût fixe qui peut sembler disproportionné pour de très petits contenus.
- Kage retire systématiquement tout le JavaScript, ce qui signifie que les sites reposant fondamentalement sur des interactions dynamiques complexes (formulaires interactifs avancés, applications web à page unique très riches) perdront ces fonctionnalités dans la version archivée, puisque seul le résultat visuel final est conservé, pas la logique interactive.
Tech-Connect Actualités tech, tutoriels et astuces informatiques expliqués simplement