世界を動かす技術を、日本語で。

自己更新型スクリーンショット

概要

Jelly のヘルプセンターでは、 自動スクリーンショット取得システム を構築。 UI変更時も 一括自動更新 で、古い画像問題を解消。 Markdown 内の特殊コメントで、柔軟にスクリーンショット指定。 Rakeタスク による自動化で、運用負担を大幅削減。 コードとドキュメントの同期 が容易になり、運用効率化を実現。

Jellyのヘルプセンター自動スクリーンショットシステム

  • ヘルプセンターやドキュメントサイト運用 における最大の悩み:スクリーンショットの陳腐化問題

    • UI変更のたびに、手動で画像を撮り直し・加工・差し替えが必要
    • 古い画像が残ることで、ユーザー体験や信頼性が低下
  • Jelly独自の解決策 :スクリーンショット自動取得&自動更新システムの開発

    • ビルド時に 全スクリーンショットを最新状態で自動生成
    • UI変更後も コマンド一発 で全画像を更新可能
  • Markdownベースのドキュメント管理

    • 記事は Markdown で記述、Redcarpet経由でHTML変換し、RailsアプリでERBとしてレンダリング
    • Markdown内に 特殊なHTMLコメント (例:<!-- SCREENSHOT: acme-tools/inbox | element | selector=#inbox-brand-new-section -->)を埋め込むことで、取得対象や方法を細かく指定
  • スクリーンショット取得の仕組み

    • RakeタスクCapybaraCuprite でヘッドレスChromeを起動
    • Markdownをパースし、SCREENSHOTコメントを抽出・チームごとにグルーピング
    • URL遷移・ログイン・DOM要素取得・キャプチャを自動化
  • 対応モードとオプション

    • element :CSSセレクタ指定のDOM要素のみをキャプチャ
    • full_page :ページ全体を指定範囲でキャプチャ
    • viewport :ブラウザウィンドウに見えている範囲のみキャプチャ
    • click :ボタン等を自動クリックし、動的UIの状態も取得可能
    • wait :アニメーション等の待機も指定可能
    • crop :キャプチャ後のトリミングも自動対応
    • torn :CSSでちぎり紙風のエフェクトを自動適用
    • hide :不要な要素(例:開発ツールバーやCookieバナー)を一時的に非表示
  • 運用フローの効率化

    • rails manual:buildコマンド一発で全プロセス自動化
    • UI変更時も 画像の取り忘れや差し替え漏れゼロ
    • Markdownファイルはpublic/manual/にセクションごとで管理、ビルド後はapp/views/help/にERBとして整理
    • パンくずリストやセクションナビゲーションも自動生成
  • コードとドキュメントの同期性向上

    • 機能開発と同時にドキュメント更新 が可能
    • 同じPRやコミット でコードと説明を一元管理

導入して感じた効果と学び

  • 最初は「手間の割にメリットが少ない」と感じて後回しにしていた

    • 実装には 細かい例外処理 (スクロール、ポップオーバー、不要部分の切り抜き等)が多く、想定以上に工数がかかった
  • 導入後は運用効率が劇的に向上

    • 摩擦がほぼゼロ になり、ドキュメント更新頻度が大幅増
    • UI変更→ビルド→コミット で常に最新のヘルプセンターを維持
    • 手動キャプチャや画像編集の手間が完全になくなった
  • 「なぜもっと早くやらなかったのか」と感じる便利さ

    • 開発者・運用者双方の心理的負担を大幅軽減
    • ユーザーにとっても常に正確なドキュメント提供が可能

Hackerたちの意見

これ、何度も必要だったわ。ちなみに、これをミームにしたらいいと思う:「これがXで作った一番 neat なものかもしれないけど、誰も気づかないだろうな。」

超クールだね。俺がちょっとしたカジュアルゲームを vibe コーディングしてる時、いつもアプリが CLI でヘッドレスに動くところから始めるんだ。オフスクリーンテクスチャにレンダリングして、スクリーンショットコマンドやパフォーマンス計測もつける。これを含めるのに時間はかからないし、エージェントが UI を自動化して重要なことをチェックする手段を与えてくれる。エージェントがスクリーンショットを更新するのも簡単だしね。ビルドプロセスの一部になるほど neat ではないけど、今後それも追加するつもり。

これらのカジュアルゲームのリンクを共有してもらえないかな? vibe コーディングがゲーム開発をどう楽にするかに興味があるから聞いてるんだ。Adobe Flash があった頃はインディーゲームシーンがすごく活気があったけど、それ以来あの開発のしやすさには触れてないと思う。vibe コーディングはそれを超える最初のツールだと思うんだ。

俺も同じことやってるよ :-) オフスクリーンのスクリーンショットパスがあって、ワールドポジションやカメラビューのベクトル用の CLI 引数もある。ゲームのティック長さの名前付きセグメントの行があって、各セグメントに制御入力を持つシンプルなテキストベースの入力形式でベンチマークをスクリプト化してる。ゲームコードを作ってる間に、ビジュアルやパフォーマンスの A/B テストにそれを広く使ってる。

これを含めるのに時間はかからない それがかかる場合もあるよ。どのエンジン?

同じく、俺も .#screenshots の派生を追加したよ。最初は手間がかかるけど、その後はほぼメンテナンスフリー。ボーナスとして、プログラム的にスクリーンショットを生成するから、アプリのライト/ダークテーマそれぞれのペアを生成して、prefer-color-scheme: dark に応じて入れ替えられる。GitHub の README でも要素が使えるよ: https://github.com/CyberShadow/CyDo#readme

モバイルプロジェクトにはすごく役立つよね。アプリストアはスクリーンショットを要求するけど、N枚の画像を NUMBER_OF_SCREEN_SIZES と NUMBER_OF_LOCALIZATIONS の掛け算で生成するのは大変だよね。昔は自分でスクリプトを書いてたけど、今は Fastlane[1] みたいなツールが助けてくれる。俺は論理パズルゲーム Nonoverse[2] に Fastlane を使ってるよ。App Store ページでサンプルスクリーンショットが見れる。複数のシーンを含む App Preview 動画の録画も自動化したし。もっと読みたい人がいたら教えてね、これって記事のいいテーマになるかも。 [1]: https://fastlane.tools/ [2]: https://apps.apple.com/us/app/nonoverse-nonogram-puzzles/id6...

それ、魅力的だね!でも、有料サービスなのかローカルOSアプリなのか、ちょっと分からないな。

このアプローチには賛成だね。Textual(Python の TUI ライブラリ)のドキュメントは、ドキュメントと一緒にスクリーンショットを生成するんだ。技術的にはスクリーンショットじゃなくて SVG なんだけど、原則は同じ。古くなることはないよ。 https://textual.textualize.io/widgets/markdown/#example

これめっちゃクールだね!https://voiden.md/で試してみようかな。

こういう場合、リアルタイムレンダリングのアプローチってどう?ツールのライブプレビューを四角の中に表示する感じ。ツールが軽ければ、視覚的にも最適だと思うよ。ブラウザのレンダリング設定、例えばアクセシビリティのパラメータやカスタムアドオンにも対応できるし。

それってセキュリティの問題にもなるかも?

Djangoの設定でDEBUG=Falseにした方がいいよ。

面白いアプリだね!ドキュメントの更新作業がかなり減りそう。

ねえ、モバイルでコードの例を横スクロールできるようにしてほしい!内容は文脈から推測できるけど、やっぱり不便だよね。