Skip to main content

release-blog-post

Generate the announcement blog post (and LinkedIn image) for a new Selenium 4.x release, by scaffolding from the previous post, summarizing the GitHub changelog, sorting contributors, and compositing the release image. Use when a new Selenium version (e.g. 4.41) has just been released and needs its blog post.

Source facts

Repository
SeleniumHQ/seleniumhq.github.io
Last source activity
July 21, 2026 at 19:50
Detected SKILL.md language
English
Stars
1,400
Forks
1,580

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
release-blog-post
description
Generate the announcement blog post (and LinkedIn image) for a new Selenium 4.x release, by scaffolding from the previous post, summarizing the GitHub changelog, sorting contributors, and compositing the release image. Use when a new Selenium version (e.g. 4.41) has just been released and needs its blog post.
# Release blog post Produces the `selenium-4-N-released.md` post and its `selenium_4.N.jpg` share image for a freshly released Selenium version, following the same structure as previous posts under `website_and_docs/content/blog/*/selenium-4-*-released.md`. Run every step from the repo root. Ask the user for the new version (e.g. `4.41`) if it isn't already known — everything else below is derived from it. ## 1. Scaffold ``` scripts/release-updates.sh 4.41 ``` This, for version 4.41 (previous = 4.40): - Bumps `4.40.x` → `4.41.0` (and the adjacent human-readable release date) in `website_and_docs/layouts/partials/selenium-clients-and-webdriver-bindings.html` and `website_and_docs/layouts/downloads/list.html`. - Copies the previous release's blog post to `website_and_docs/content/blog/<year-of-release>/selenium-4-41-released.md`, `git add`s it, replaces `4.40` → `4.41` throughout, and sets `date:` to the `selenium-4.41.0` tag's commit date (the year is derived the same way, so this works across year boundaries). - Prints three deduped, sorted `{{< gh-user ... >}}` lists — Selenium, Docs, and Docker contributors — for commits between the `selenium-4.40.0` and `selenium-4.41.0` tags. Everything after this point is manual editing of the new blog file using the data gathered in the remaining steps. The copied file still has the *previous* release's prose and contributor lists — all of it needs replacing, not just the version string. ## 2. Split contributors: external vs. Selenium Team The Selenium Team roster is the set of `gh-user` logins already listed on `website_and_docs/content/project/structure/_index.html` (Project Leadership Committee plus all per-binding committers) — extract it with: ``` grep -oE 'api.github.com/users/[A-Za-z0-9_.\[\]-]+' website_and_docs/content/project/structure/_index.html \ | sed 's#api.github.com/users/##' | sort -u -f ``` (The `seleniumhq/selenium-tlc` and `seleniumhq/selenium-committers` GitHub teams are close but incomplete for this purpose — several names on the structure page, e.g. `joerg1985`, `nvborisenko`, `VietND96`, aren't members of either GitHub team. Use the structure page, not the teams API.) Also drop bot/automation accounts from all three lists before anything else — they show up in the raw commit data but were never credited in past posts: `dependabot[bot]`, `github-actions[bot]`, `renovate[bot]`, `selenium-ci`. For each of the three (now bot-free) contributor lists from step 1: - Logins that appear on the structure-page roster → remove from that list, and add to one merged, deduped, alphabetically-sorted (case-insensitive) "Selenium Team Members" list instead. - Everyone else stays under their original section (Selenium / Selenium Docs & Website / Docker Selenium). If a contributor list ends up empty after removing team members, omit that `###` section for this release rather than leaving an empty block. ## 3. Draft the changelog sections Fetch the release notes for the new tag and the recent docker-selenium activity: ``` gh api repos/seleniumhq/selenium/releases/tags/selenium-4.41.0 --jq '.body' gh api --method GET /repos/seleniumhq/docker-selenium/commits -f since="<SINCE_COMMIT_DATE>" -f until="<UNTIL_COMMIT_DATE>" -f per_page=1000 --jq '.[].commit.message' ``` (`SINCE_COMMIT_DATE`/`UNTIL_COMMIT_DATE` are the same tag commit dates step 1 already computed — rerun the two `gh api repos/seleniumhq/selenium/commits/selenium-4.X.0 --jq '.commit.committer.date'` calls if needed.) Read the PR titles in the changelog body and write, in the same tone as prior posts: - **✨ Highlights**: 5-7 bullets, one per notable theme (new BiDi commands, a new class, Chrome DevTools version bump, Grid behavior changes, build/infra work). Bold the binding name in brackets when a bullet is specific to one, e.g. `**[Java]** ...`. Check whether the changelog mentions new Chrome DevTools protocol versions and call them out first if so. - **📦 Notable Changes**: one `###` subsection per binding (Java, Python, Ruby, .NET, Grid, Build & Infra) with 3-5 bullets each, paraphrasing the PR titles — don't just paste them verbatim. - **🐳 Docker Selenium**: bullet list of the docker-selenium commit messages (they already include their PR number, e.g. `Docker: update X (#3002)`), followed by the fixed line `[See all changes](https://github.com/SeleniumHQ/docker-selenium/releases)`. Skip any of the binding subsections that had no meaningful changes rather than inventing content. ## 4. Edit the blog file In the scaffolded file: - Replace the `## ✨ Highlights`, `## 📦 Notable Changes`, and Docker Selenium sections with the drafts from step 3. - Replace each `### [Selenium](...)`, `### [Selenium Docs & Website](...)`, and `### [Docker Selenium](...)` contributor block with the non-team logins from step 2, each as `{{< gh-user "https://api.github.com/users/<login>" >}}` on its own line. - Replace the `### [Selenium Team Members][team]` block with the merged team-member list from step 2. - Double-check `date:` and the `images:` path both reflect the new version (step 1 sets these, but verify — `images:` should point at `/images/blog/<year>/selenium_4.41.jpg`). ## 5. Generate the release image ``` scripts/generate-release-image.sh 4.41 <release-date YYYY-MM-DD> website_and_docs/static/images/blog/<year>/selenium_4.41.jpg ``` This composites "Selenium 4.41 Released" and the Selenium logo over a gradient background, auto-picked by season from the release date (no photo needed). If the user supplies a background photo instead (matching the look of some earlier posts, e.g. a stock photo), pass it as a 4th argument: ``` scripts/generate-release-image.sh 4.41 <release-date> <output.jpg> /path/to/background.jpg ``` Read the resulting image back to sanity-check text placement and legibility before moving on — regenerate (a different `--seed`-driven gradient will differ slightly) if the text is hard to read against the background. ## 6. Review - Reread the finished post end to end against `website_and_docs/content/documentation/about/style.en.md`. - Run `./build-site.sh` (or `cd website_and_docs && hugo server`) if practical, and check the post renders — especially the `gh-user` shortcodes and the image. - Do not commit or push — leave the changes for the user to review first, per their usual workflow.
View on GitHub