How-to Guides
Create step-by-step tutorial guides with screenshots, using a Playwright browser container to capture each step.
Infrastructure
Docker Setup
# Start browser container
docker compose --profile browser up -d
# Execute browse script
docker compose --profile browser exec browser python browse.py <url> --steps steps.json
# Stop
docker compose --profile browser down
- docker-compose.yml — browser service definition
- browser/Dockerfile — Playwright Python environment
- browser/browse.py — browse + screenshot automation
Screenshot Conversion
Convert PNG screenshots to WebP for Jekyll embedding:
ffmpeg -i input.png input.webp
Workflow
Define steps — create a steps.json describing the user journey:
[
{"action": "screenshot", "name": "01-landing"},
{"action": "click", "selector": "#signup-btn", "name": "02-click-signup"},
{"action": "fill", "selector": "#email", "value": "user@example.com", "name": "03-fill-email"},
{"action": "wait", "ms": 2000, "name": "04-loading"},
{"action": "scroll", "y": 500, "name": "05-scrolled"}
]
Run browse.py — outputs .png files to .browser/ volume mount
Convert to WebP — ffmpeg -i .browser/01-landing.png 01-landing.webp
Write guide in Jekyll markdown — use HTML img tags to embed:
---
title: "How to Do X"
layout: "page/note/slides"
---
## Step 1: Open the landing page
Navigate to the site.
<img src="./01-landing.webp" width="500">
## Step 2: Click Sign Up
Click the sign up button in the top right.
<img src="./02-click-signup.webp" width="500">
Steps JSON Actions
| Action |
Required Fields |
Description |
screenshot |
name |
Take screenshot only |
click |
selector, name |
Click element, wait for load, screenshot |
fill |
selector, value, name |
Fill input field, screenshot |
wait |
name, ms (optional, default 1000) |
Wait then screenshot |
scroll |
name, y (optional, default 500) |
Scroll down Y pixels, screenshot |
Output Format
- Layout:
page/note/slides — each ## h2 = one slide/step
- Images: always
<img src="./filename.webp" width="500"> (never markdown ![]())
- Keep each step focused: one action per slide, brief description above the screenshot
- Number steps sequentially in filenames:
01-, 02-, etc.
1---2name: content-how-to-guides3description: Create step-by-step tutorial guides with Playwright screenshots and Jekyll markdown output.4---56# How-to Guides78Create step-by-step tutorial guides with screenshots, using a Playwright browser container to capture each step.910## Infrastructure1112### Docker Setup13```bash14# Start browser container15docker compose --profile browser up -d1617# Execute browse script18docker compose --profile browser exec browser python browse.py <url> --steps steps.json1920# Stop21docker compose --profile browser down22```2324- [docker-compose.yml](docker-compose.yml) — browser service definition25- [browser/Dockerfile](browser/Dockerfile) — Playwright Python environment26- [browser/browse.py](browser/browse.py) — browse + screenshot automation2728### Screenshot Conversion29Convert PNG screenshots to WebP for Jekyll embedding:30```bash31ffmpeg -i input.png input.webp32```3334## Workflow35361. **Define steps** — create a `steps.json` describing the user journey:37 ```json38 [39 {"action": "screenshot", "name": "01-landing"},40 {"action": "click", "selector": "#signup-btn", "name": "02-click-signup"},41 {"action": "fill", "selector": "#email", "value": "user@example.com", "name": "03-fill-email"},42 {"action": "wait", "ms": 2000, "name": "04-loading"},43 {"action": "scroll", "y": 500, "name": "05-scrolled"}44 ]45 ```46472. **Run browse.py** — outputs `.png` files to `.browser/` volume mount48493. **Convert to WebP** — `ffmpeg -i .browser/01-landing.png 01-landing.webp`50514. **Write guide in Jekyll markdown** — use HTML img tags to embed:52 ```markdown53 ---54 title: "How to Do X"55 layout: "page/note/slides"56 ---5758 ## Step 1: Open the landing page5960 Navigate to the site.6162 <img src="./01-landing.webp" width="500">6364 ## Step 2: Click Sign Up6566 Click the sign up button in the top right.6768 <img src="./02-click-signup.webp" width="500">69 ```7071## Steps JSON Actions7273| Action | Required Fields | Description |74|--------|----------------|-------------|75| `screenshot` | `name` | Take screenshot only |76| `click` | `selector`, `name` | Click element, wait for load, screenshot |77| `fill` | `selector`, `value`, `name` | Fill input field, screenshot |78| `wait` | `name`, `ms` (optional, default 1000) | Wait then screenshot |79| `scroll` | `name`, `y` (optional, default 500) | Scroll down Y pixels, screenshot |8081## Output Format8283- Layout: `page/note/slides` — each `## h2` = one slide/step84- Images: always `<img src="./filename.webp" width="500">` (never markdown `![]()`)85- Keep each step focused: one action per slide, brief description above the screenshot86- Number steps sequentially in filenames: `01-`, `02-`, etc.