Insérer des captures d’écran qui se mettent à jour automatiquement dans la documentation
(interblah.net)- Mettre en place un flux qui capture automatiquement des captures d’écran depuis une application web en cours d’exécution et les met à jour en même temps que le build de la documentation d’aide, afin que les images de la doc restent à jour même après des changements d’UI
- Des commentaires
SCREENSHOTdans le Markdown contiennent des instructions comme le chemin cible, le mode de capture ou un sélecteur CSS, puis le processus de build les lit et les remplit avec de vraies images - Une tâche Rake lance Chrome en mode headless via Capybara et Cuprite, regroupe le travail par équipe, se connecte une seule fois, puis parcourt plusieurs URL pour effectuer les captures
- La capture prend en charge trois modes, element, full_page et viewport, avec des options comme
click,wait,crop,tornethidepour contrôler aussi bien les UI ouvertes que les éléments inutiles - Avec un simple
rails manual:build, la génération des captures d’écran et le build des pages d’aide s’exécutent ensemble, ce qui facilite l’alignement du code et de la documentation dans la même PR ou le même commit et réduit fortement la friction liée aux captures et recadrages manuels
La méthode des captures d’écran auto-actualisées
- Le centre d’aide de Jelly (un service de boîte de réception e-mail partagée pour les équipes) en production est conçu pour capturer automatiquement des captures d’écran depuis l’application web en cours d’exécution et les mettre à jour à chaque nouveau build
- La documentation est écrite en Markdown et, d’après l’article Self-updating screenshots, elle est transformée en HTML avec Redcarpet, puis rendue via des vues ERB dans une application Rails
- Le Markdown contient des commentaires
SCREENSHOT, qui embarquent ensemble des instructions comme le chemin cible, le mode de capture et un sélecteur CSS<!-- SCREENSHOT: acme-tools/inbox | element | selector=#inbox-brand-new-section -->- La balise image placée juste en dessous sert d’emplacement pour le résultat
- Dès que la couleur de l’UI, la position d’un bouton ou le texte change légèrement, les captures d’écran existantes dans la documentation deviennent vite obsolètes ; ce flux réduit cette charge de mise à jour manuelle
Le pipeline de capture et ses effets sur la maintenance
- En interne, une tâche Rake lance Chrome en mode headless via Capybara et Cuprite pour scanner les commentaires
SCREENSHOTde tous les fichiers Markdown - Les tâches de capture d’écran sont regroupées par équipe et, pour une même équipe, le système est conçu pour ne se connecter qu’une seule fois avant de parcourir plusieurs URL
- Trois modes de capture sont pris en charge
- element : capture un élément DOM précis via un sélecteur CSS
- full_page : capture la page entière et peut, si nécessaire, la recadrer selon la hauteur
- viewport : capture uniquement la zone actuellement visible dans la fenêtre du navigateur
- Des options détaillées comme click, wait et crop permettent de capturer automatiquement aussi bien l’état qui apparaît après un clic sur un bouton que l’écran après une animation
<!-- SCREENSHOT: nectar-studio/manage/rules | full_page | click=".rule-create-button" wait=200 crop=0,800 -->- Le système clique sur le bouton pour ouvrir le formulaire, attend 200 ms, puis capture après recadrage sur une zone donnée
- Il existe aussi des options supplémentaires, torn et hide
tornapplique un effet de bord de papier déchiré à l’aide du CSSclip-pathhidemasque temporairement les éléments qui ne doivent pas apparaître à l’écran, comme une dev toolbar ou une bannière de cookies
- L’ensemble du pipeline s’exécute avec une seule commande,
rails manual:build, qui traite à la fois toutes les captures d’écran et le build des pages d’aide - Les sources de la documentation sont organisées sous
public/manual/par sections telles que basics, setup et advanced - À l’étape de build, ces fichiers Markdown sont convertis en vues ERB sous
app/views/help/, avec génération des breadcrumbs et de la navigation de section - Comme le développement des fonctionnalités et la mise à jour de l’aide peuvent être gérés dans la même base de code, il devient plus facile de maintenir la synchronisation entre le code et la documentation dans la même PR ou le même commit
- Les cas particuliers comme les éléments nécessitant un scroll, les popovers qui s’ouvrent au clic, ou les recadrages destinés à éviter des parties inutiles ont demandé plus de temps à implémenter, mais une fois le système en place, le centre d’aide a pu être mis à jour beaucoup plus souvent
- Il suffit de modifier l’UI, de relancer le build, puis de commit le résultat pour garder les captures d’écran toujours à jour, ce qui fait presque disparaître la friction des captures et recadrages manuels
1 commentaires
Commentaires sur Hacker News
Puisqu’on génère les captures d’écran par programme, on peut produire en même temps les deux versions light/dark theme de l’app, puis les permuter selon
prefers-color-scheme: darkCe genre d’élément fonctionne aussi très bien dans un README GitHub : https://github.com/CyberShadow/CyDo#readme
Sur mobile, j’ai utilisé Nix pour lancer un émulateur Android éphémère afin de générer les captures les plus récentes ; aucune préconfiguration n’est nécessaire et aucune donnée ne reste après exécution
Dans mon cas, la configuration elle-même n’était pas si difficile ; le plus dur était plutôt d’avoir l’idée, et j’ai généré le code Nix d’un coup avec mon LLM préféré
Mettre à jour les captures manuellement n’est pas la tâche la plus pénible du monde, mais le flux
upload-apk + take-screenshot + transfer-back-to-PC + editest toujours légèrement agaçant, donc au final je le fais presque jamaisOn pouvait plus ou moins deviner avec le contexte, mais c’était quand même gênant
Les app stores exigent des captures d’écran, mais comme il faut produire des images pour chaque taille d’écran et chaque localisation, ça devient vite pénible
Avant, j’écrivais moi-même des scripts pour ça, et aujourd’hui des outils Fastlane comme https://fastlane.tools/ aident énormément
J’utilise aussi Fastlane pour mon jeu de logique Nonoverse, et on peut voir des captures d’exemple sur sa page App Store : https://apps.apple.com/us/app/nonoverse-nonogram-puzzles/id6...
J’ai aussi automatisé l’enregistrement des vidéos App Preview, y compris avec plusieurs scènes, et si ça intéresse des gens, ça pourrait mériter un article à part entière
Pour les petits jeux casual que je fais en vibe coding, l’app commence toujours avec un CLI capable de tourner en mode headless, de faire du rendu sur texture hors écran, de prendre des captures et même de mesurer les performances
Ça prend très peu de temps à intégrer, et ça crée aussi un point d’entrée pour qu’un agent puisse automatiser l’UI et inspecter les zones importantes
Du coup, faire mettre à jour les captures par un agent devient aussi très simple
Ce n’est pas aussi propre qu’une intégration complète dans le processus de build, mais je pense ajouter ça maintenant
J’ai aussi des arguments CLI pour le chemin de capture offscreen et le world pos/camera view vector, et je lance des benchmarks scriptés avec un format d’entrée textuel
Ce format se compose de plusieurs lignes de segments nommés, avec pour chaque segment une durée de
nticks de jeu et les entrées de contrôle correspondantesJe m’en sers énormément pour faire des tests A/B sur le visuel et les performances pendant que je travaille sur le code du jeu
Moi aussi, je m’intéresse à quel point le vibe coding facilite le développement de jeux
À l’époque d’Adobe Flash, l’écosystème du jeu indé était vraiment foisonnant, et depuis, peu de choses ont retrouvé ce niveau de facilité de développement
Le vibe coding semble être le premier outil à dépasser vraiment ce niveau
ça prend très peu de temps à intégrerdépend quand même des casJe me demande quel moteur tu utilises
J’aime particulièrement le fait qu’on puisse mettre des déclarations de captures d’écran inline dans un document Markdown
Pour mon application desktop, j’ai mis en place une solution qui génère des captures dans plusieurs langues et en modes light/dark, supprime le bruit, et applique même des cadres de fenêtre Windows/macOS
J’ai documenté ça ici : https://maxschmitt.me/posts/cakedesk-website-redesign#screen...
Pour l’instant c’est encore un script séparé, donc assez pénible à maintenir ; je devrais regarder comment l’intégrer comme partie de markdown/mdx
Très bonne source d’inspiration
On pourrait presque en faire un mème du genre meilleur travail sur X que personne ne remarque
Il y a une fonctionnalité similaire dans https://github.com/zombocom/rundoc que j’ai créé
L’objectif principal est la génération de tutoriels, donc il réinsère aussi dans le document la sortie des commandes exécutées
Par exemple, intégrer un aperçu live de l’outil dans un rectangle
Si l’outil est léger, ça pourrait même être optimal visuellement, tout en reflétant aussi les réglages de rendu du navigateur, comme les paramètres d’accessibilité ou les extensions de l’utilisateur
C’est d’ailleurs ce qu’ils font dans la documentation d’iommi : https://kodare.net/2025/01/14/iframes-not-screenshots.html
Si la doc
docs/est dans le même dépôt, et qu’on ajoute un nouveau test lorsqu’une mise à jour de la documentation nécessite une nouvelle capture, ça semble assez bien s’imbriquerJ’ai commencé à construire exactement ça il y a quelques années, puis j’ai fini par l’abstraire vers quelque chose de plus générique, comme https://picshift.io/
Cela dit, j’aime toujours beaucoup le cas d’usage des captures d’écran, et le nom d’origine de ce projet était
ScreenSync