Generates polished website release notes between two git tags for docs.streamlit.io. Use when preparing a new Streamlit release or reviewing changes between versions.
Generate publish-ready website changelog (docs.streamlit.io format) between two git tags. Uses PR labels (impact:users, impact:internal, change:*) for categorization and rewrites PR titles into user-friendly descriptions.
The GitHub release changelog is auto-generated from .github/release.yml — this skill only produces the website format.
Usage: /generating-changelog <previous-tag> <new-tag> (e.g., /generating-changelog 1.44.1 1.45.0)
If only one tag is given, treat it as the new release tag and fetch the previous tag automatically.
gh api repos/streamlit/streamlit/releases/latest --jq '.tag_name'
git rev-parse -q --verify "refs/tags/<tag>" > /dev/null
git log -1 --format=%ai <new-tag>
Run the fetch script to extract PR numbers from git log and batch-fetch metadata via GitHub GraphQL:
uv run python scripts/changelog_fetch_prs.py <prev-tag> <new-tag>
This produces work-tmp/pr-data.json — a JSON array of {number, title, labels, author, related_issues, related_issues_truncated} objects sorted by PR number.
related_issues is sourced from the same batched GraphQL query (no per-PR N+1 requests) and includes linked issue numbers plus 👍 counts:
"related_issues": [{"number": 9836, "thumbs_up": 42}]
Run the categorization script to exclude noise and categorize PRs by labels:
uv run python scripts/changelog_categorize_prs.py
This reads work-tmp/pr-data.json, applies the following rules, and writes work-tmp/pr-categorized.json:
Excluded: bot authors, release/version/docstring PRs, internal-only PRs (impact:internal without impact:users — this includes internal features with change:* labels).
External contributors: Each non-excluded PR includes an is_external boolean field. Authors matching sfc-gh-* or a known internal set are marked is_external: false; all others are is_external: true. The summary output lists external contributors separately — use this to attribute contributions without needing to look up GitHub profiles.
Script categories (by label priority: breaking > feature > bugfix > other):
| Label | Script Category |
|---|---|
change:breaking | Breaking Changes |
change:feature | New Features |
change:bugfix | Bug Fixes |
impact:users or unrecognized change:* labels | Other Changes |
PRs with no impact:* or change:* labels are flagged as unlabeled for user review.
Note: change:* labels are typically required by release labeling conventions. The "Other Changes" fallback is a defensive catch-all for impact:users PRs and non-standard change:* values not covered by breaking/feature/bugfix.
Important: These script categories are intermediate groupings for triage. The website changelog does not have a "Breaking Changes" or "New Features" section. All entries are mapped into the three website tiers below. Breaking changes, deprecations, and removals fold into Notable Changes or Other Changes with appropriate emojis (see Step 6).
Map into three website tiers:
Before generating final output, present a summary to the user:
related_issues as one prioritization signal (not the only signal)is_external field) — verify any edge cases but no need to look up GitHub profiles for sfc-gh-* or known internal authorsNote: Internal-only feature PRs (e.g., e2e infra, CI workflows, agent skills) are already excluded by the categorize script. You should not need to manually filter these.
Do NOT proceed to Step 6 until the user confirms.
Generate the file in the work-tmp/ directory: work-tmp/changelog-website-<new-tag>.md
st.foo has a new bar parameter to...", "st.foo supports..."st.spinner avoids a race condition..."[fix]/[feat]/[chore]/[docs] prefixes from PR titles before rewritingst.* command references: Use backtick formatting and link to the specific API doc subcategory path: st.image, st.dataframe. Only link the first/primary mention of a command. Links are more common in Notable Changes than Other Changes.([#14139](https://github.com/streamlit/streamlit/pull/14139), [#9836](https://github.com/streamlit/streamlit/issues/9836)). Use /pull/ for PRs and /issues/ for issues.[username] (no @ prefix) in link text, placed after the closing paren and period: ([#NNNNN](https://github.com/streamlit/streamlit/pull/NNNNN)). Thanks, [username](https://github.com/username)!- 🎨 Main feature description:
- Sub-detail or sub-command ([#NNNNN](https://github.com/streamlit/streamlit/pull/NNNNN)).
- Another sub-detail ([#MMMMM](https://github.com/streamlit/streamlit/pull/MMMMM)).
## **Version <new-tag>**
_Release date: <Month Day, Year>_
**Highlights**
- 🍿 Introducing [`st.new_thing`](/develop/api-reference/widgets/st.new_thing) — a widget that lets you do something amazing ([#14200](https://github.com/streamlit/streamlit/pull/14200)).
**Notable Changes**
- 📊 [`st.dataframe`](/develop/api-reference/data/st.dataframe) has a new `selection_mode` parameter that lets you configure row and column selection behavior ([#14139](https://github.com/streamlit/streamlit/pull/14139), [#9836](https://github.com/streamlit/streamlit/issues/9836)).
- ☠️ `st.legacy_thing` is deprecated and will be removed in a future version. Use `st.new_thing` instead ([#14050](https://github.com/streamlit/streamlit/pull/14050)).
- 🔑 App menu redesign:
- New "Settings" option in the app menu ([#14100](https://github.com/streamlit/streamlit/pull/14100)).
- Reorganized menu items for better discoverability ([#14101](https://github.com/streamlit/streamlit/pull/14101)).
**Other Changes**
- 🐛 Bug fix: `st.spinner` avoids a race condition when used right before a cache miss ([#13849](https://github.com/streamlit/streamlit/pull/13849), [#13634](https://github.com/streamlit/streamlit/issues/13634)).
- 🦋 Bug fix: `st.number_input` no longer resets to default when the step value changes ([#14125](https://github.com/streamlit/streamlit/pull/14125)). Thanks, [contributor](https://github.com/contributor)!
- 🪲 Bug fix: Fixed a layout shift in `st.columns` when using `gap="small"` ([#14080](https://github.com/streamlit/streamlit/pull/14080)).
When the release has no Highlights, omit that section entirely (do not include an empty Highlights header).
After writing the file, print:
.github/release.yml — canonical label-to-category mapping (also used for auto-generated GitHub release notes)https://docs.streamlit.io/develop/quick-reference/release-noteshttps://raw.githubusercontent.com/streamlit/docs/997b19a5eda68b72ce091d69be9d6921a37e3da0/content/develop/quick-references/release-notes/2026.md