Capturas de tela que se atualizam automaticamente
(interblah.net)- Um fluxo que captura capturas de tela automaticamente de uma aplicação web em execução e as atualiza junto com o build da documentação de ajuda, facilitando manter as imagens da documentação sempre atualizadas mesmo após mudanças na UI
- Comentários
SCREENSHOTno Markdown contêm instruções como caminho de destino, modo de captura e seletor CSS, e durante o processo de build դրանք são lidos e preenchidos com imagens reais - Uma Rake task executa o Chrome headless por meio de Capybara e Cuprite, agrupa o trabalho por equipe e, após fazer login uma única vez, percorre várias URLs para capturar as imagens
- A captura oferece suporte a três modos: element, full_page e viewport, e também controla UI aberta ou elementos desnecessários com opções como
click,wait,crop,tornehide - Com um único
rails manual:build, a geração das capturas e o build das páginas de ajuda rodam juntos, facilitando alinhar código e documentação no mesmo PR ou commit e reduzindo bastante o atrito de capturas e recortes manuais
Método de capturas de tela que se atualizam automaticamente
- O centro de ajuda do Jelly é configurado para capturar capturas de tela automaticamente de uma aplicação web em execução e atualizá-las junto com cada novo build
- A documentação é escrita em Markdown e, com base no artigo Self-updating screenshots, é processada em HTML com Redcarpet e então renderizada como views ERB em um app Rails
- Dentro do Markdown há comentários
SCREENSHOT, que incluem instruções como caminho de destino, modo de captura e seletor CSS<!-- SCREENSHOT: acme-tools/inbox | element | selector=#inbox-brand-new-section -->- A tag de imagem logo abaixo é usada como a posição onde o resultado será inserido
- Quando a cor da UI, a posição de botões ou os textos mudam mesmo que pouco, as capturas de tela da documentação existente ficam desatualizadas com facilidade; esse fluxo reduz essa carga de atualização manual
Pipeline de captura e efeito na manutenção
- Internamente, uma Rake task executa o Chrome headless por meio de Capybara e Cuprite para varrer os comentários
SCREENSHOTde todos os arquivos Markdown - As tarefas de captura são agrupadas por equipe e, dentro da mesma equipe, são configuradas para fazer login apenas uma vez antes de percorrer várias URLs
- Há suporte a três modos de captura
- element: captura um elemento DOM específico por seletor CSS
- full_page: captura a página inteira e, se necessário, pode recortar com base na altura
- viewport: captura apenas a área atualmente visível na janela do navegador
- Com opções detalhadas como click, wait e crop, também é possível capturar automaticamente estados exibidos após clicar em um botão ou telas depois de animações
<!-- SCREENSHOT: nectar-studio/manage/rules | full_page | click=".rule-create-button" wait=200 crop=0,800 -->- Funciona clicando no botão para abrir o formulário, aguardando 200 ms e então capturando uma área específica recortada
- Há ainda opções adicionais como torn e hide
tornaplica um efeito de borda de papel rasgado usando CSSclip-pathhideoculta temporariamente elementos que não devem aparecer na tela, como dev toolbar ou cookie banner
- Todo o pipeline é executado com um único comando,
rails manual:build, que processa todas as capturas de tela e o build das páginas de ajuda em conjunto - As fontes da documentação ficam organizadas em
public/manual/, em seções como basics, setup e advanced - Na etapa de build, esses arquivos Markdown são convertidos em views ERB dentro de
app/views/help/, com breadcrumb e navegação de seção gerados junto - Como o desenvolvimento de funcionalidades e a atualização da ajuda podem ser tratados juntos no mesmo codebase, fica mais fácil manter a sincronia entre código e documentação no mesmo PR ou no mesmo commit
- Casos especiais como elementos que exigem rolagem, popovers que só abrem com clique e recortes para evitar partes desnecessárias exigiram mais tempo de implementação, mas depois de pronto isso levou a atualizações muito mais frequentes no centro de ajuda
- Basta mudar a UI, executar o build novamente e fazer commit do resultado para manter as capturas sempre atualizadas, praticamente eliminando o atrito de capturas e recortes manuais
1 comentários
Comentários do Hacker News
Já que o programa gera as capturas de tela, dá para criar junto as duas versões do app com tema claro/escuro e alternar entre elas de acordo com
prefers-color-scheme: darkEsse tipo de coisa também funciona bem em READMEs do GitHub: https://github.com/CyberShadow/CyDo#readme
Em app mobile, fiz o Nix subir um emulador Android descartável para gerar capturas atualizadas, sem precisar de configuração prévia e sem deixar dados depois da execução
No meu caso, a configuração em si nem foi tão difícil; o mais complicado foi ter a ideia, e o código Nix eu gerei de primeira com meu LLM favorito
Atualizar capturas manualmente não é a tarefa mais sofrida do mundo, mas o fluxo
upload-apk + take-screenshot + transfer-back-to-PC + edité sempre incômodo o bastante para eu acabar quase nunca fazendo issoDeu para deduzir mais ou menos pelo contexto, mas ainda assim foi incômodo
Em lojas de aplicativos, capturas de tela são obrigatórias, e você precisa gerar imagens para cada tamanho de tela e para cada localização, então isso fica trabalhoso muito rápido
Antigamente eu escrevia scripts para isso; hoje ferramentas como Fastlane, tipo https://fastlane.tools/, ajudam bastante
Uso Fastlane também no meu jogo de lógica Nonoverse, e dá para ver capturas de exemplo na página do app: https://apps.apple.com/us/app/nonoverse-nonogram-puzzles/id6...
Também automatizei a gravação de vídeos de App Preview, incluindo várias cenas, e acho que isso renderia um bom post separado para quem tiver curiosidade
Os joguinhos casuais pequenos que faço com vibe coding sempre começam com o app podendo rodar em modo headless por CLI, com renderização em textura offscreen, comando de captura de tela e até medição de desempenho
Isso quase não leva tempo para incluir e ainda cria um caminho para agentes automatizarem a UI e inspecionarem pontos importantes
Por isso, fazer o agente atualizar as capturas também fica bem fácil
Não é tão elegante quanto algo totalmente integrado ao processo de build, mas agora estou pensando em adicionar essa parte também
Também tenho argumentos de CLI para offscreen screenshot path e world pos/camera view vector, e rodo benchmarks com um formato de entrada baseado em texto
Esse formato é composto por várias linhas de segmentos nomeados, a duração de
nticks de jogo por segmento e as entradas de controle de cada segmentoUso muito isso para testes A/B de visual e desempenho enquanto trabalho no código do jogo
Também tenho muito interesse em como vibe coding está facilitando o desenvolvimento de jogos
Na época do Adobe Flash, o ecossistema de jogos indie era realmente vibrante, e desde então quase nada chegou perto daquele nível de facilidade de desenvolvimento
Vibe coding parece ser a primeira ferramenta a superar aquilo
Isso quase não leva tempo para incluirdepende do casoFiquei curioso sobre qual engine você usa
Gostei especialmente do fato de poder colocar uma declaração de screenshot inline dentro de um documento Markdown
No meu app desktop, criei uma solução que gera capturas em vários idiomas e modos claro/escuro, remove ruído e até aplica molduras de janela do Windows/macOS
Está documentado aqui: https://maxschmitt.me/posts/cakedesk-website-redesign#screen...
Hoje isso está em um script separado, então a manutenção é bem chata; vou dar uma olhada em como incorporar isso como parte do markdown/mdx
Foi uma ótima inspiração
Dá até para usar como meme do tipo o melhor trabalho em X que ninguém percebe
Também há algo parecido no https://github.com/zombocom/rundoc que eu fiz
Como o objetivo principal é gerar tutoriais, ele também reinsere no documento a saída dos comandos executados
Seria algo como colocar a prévia ao vivo da ferramenta dentro de um retângulo
Se a ferramenta for leve, isso pode até ser visualmente ideal, e ainda refletiria as configurações de renderização do navegador, como ajustes de acessibilidade ou addons do usuário
Na documentação do iommi, é exatamente isso que eles fazem: https://kodare.net/2025/01/14/iframes-not-screenshots.html
Se o
docs/ficar no mesmo repositório e você adicionar um novo teste quando precisar de uma nova captura ao atualizar a documentação, parece combinar bemAlguns anos atrás eu comecei a construir exatamente isso, mas acabei abstraindo para algo mais genérico, como https://picshift.io/
Mesmo assim, continuo gostando muito do caso de uso de screenshots, e o nome original desse projeto era
ScreenSync