Shiny for Python Release Train
Walk through releasing the full py-shiny ecosystem interactively. Each phase requires
explicit user confirmation before proceeding to the next.
Interactive Protocol
- Present one phase at a time with its checklist
- After presenting a phase, stop and wait for the user to confirm completion or ask for help
- Use
gh CLI for GitHub operations (PRs, releases, tags)
- Track progress with a TodoWrite checklist
- If the user says "skip", mark the phase done and move on
- If a phase fails, help debug before moving on
- Never proceed to the next phase until the current one is resolved or explicitly skipped
Pre-release gate (REQUIRED before any release action)
Before tagging, creating a GH Release, or pushing a tag for ANY package, stop and run
this verification checklist with the user:
- Show the release summary:
- Package name and version
- RC branch name and PR link
- CI status (link to the passing run)
- Changelog entry (show the relevant section)
- Dependency check result (any git-based deps found?)
- For py-shiny: shinylive example test results
- Ask for explicit confirmation:
"Ready to release {package} v{version}? This will tag the commit and publish
to {registry}. Please confirm with 'yes' to proceed."
- Do NOT proceed until the user explicitly says "yes", "go", "proceed", or equivalent
- If the user raises concerns, address them before re-presenting the gate
Getting Started
- Ask the user which version of py-shiny is being released (e.g.,
1.3.0)
- Ask if py-htmltools also needs a release (and what version)
- Ask if any Shiny HTML Dependencies were updated (triggers shinyswatch prerequisite)
- Create a TodoWrite checklist of all 13 phases
- Begin with Phase 1
Phase Overview
[ ] Phase 1: Prerequisites (shinyswatch update if HTML deps changed)
[ ] Phase 2: Release py-htmltools
[ ] Phase 3: Release py-shiny
[ ] Phase 4: Release py-shinyswatch
[ ] Phase 5: Release py-shinywidgets
[ ] Phase 6: Update Shinylive (JS) repo
[ ] Phase 7: Update py-shinylive
[ ] Phase 8: Update r-shinylive
[ ] Phase 9: Update py-shiny (bump shinylive docs version)
[ ] Phase 10: Update py-shiny-site
[ ] Phase 11: Conda-forge
[ ] Phase 12: Huggingface
[ ] Phase 13: Publish blog post
For detailed steps in each phase, read references/release-phases.md.
Repos
| Package |
Repo |
Registry |
| py-htmltools |
posit-dev/py-htmltools |
PyPI |
| py-shiny |
posit-dev/py-shiny |
PyPI |
| py-shinyswatch |
posit-dev/py-shinyswatch |
PyPI |
| py-shinywidgets |
posit-dev/py-shinywidgets |
PyPI |
| shinylive (JS) |
posit-dev/shinylive |
GH Release artifact |
| py-shinylive |
posit-dev/py-shinylive |
PyPI |
| r-shinylive |
posit-dev/r-shinylive |
CRAN |
| py-shiny-site |
posit-dev/py-shiny-site |
GitHub Pages |
| conda htmltools |
conda-forge/py-htmltools-feedstock |
conda-forge |
| conda shiny |
conda-forge/py-shiny-feedstock |
conda-forge |
General Package Release Pattern
Many phases (2-5, 7) follow this common flow:
- Checkout branch
rc-vX.Y.Z
- Verify
pyproject.toml has no git-based deps (e.g., no htmltools @ git+https://...)
- Bump version (changelog +
__init__.py, or tag-based for py-shiny)
- Commit, push, open PR, wait for CI
- Verify no additional commits were added to the RC branch beyond the release prep
- Run the pre-release gate (see above) - present summary and get explicit user confirmation
- Squash merge the RC PR into main via GitHub (this is the release commit)
- Tag the squash commit on main:
git checkout main && git pull && git tag vX.Y.Z && git push origin vX.Y.Z
- Create GH Release with changelog content, mark as "Latest"
- Wait for PyPI publish to succeed
- If publish fails: delete tag + GH Release, fix, redo
On Failure
- For PyPI failures: remind user to delete the tag and GH Release before retrying
- For CI failures: help investigate logs with
gh run view
- For shinylive build failures: check
make clean && make all output
- Never proceed to the next phase until the current one is resolved or explicitly skipped
Source: posit-dev/py-shiny — distributed by TomeVault.
1---2name: posit-dev-py-shiny-py-shiny-release3description: Shiny for Python Release Train4---56# Shiny for Python Release Train78Walk through releasing the full py-shiny ecosystem interactively. Each phase requires9explicit user confirmation before proceeding to the next.1011## Interactive Protocol1213- Present one phase at a time with its checklist14- After presenting a phase, **stop and wait** for the user to confirm completion or ask for help15- Use `gh` CLI for GitHub operations (PRs, releases, tags)16- Track progress with a TodoWrite checklist17- If the user says "skip", mark the phase done and move on18- If a phase fails, help debug before moving on19- Never proceed to the next phase until the current one is resolved or explicitly skipped2021### Pre-release gate (REQUIRED before any release action)2223Before tagging, creating a GH Release, or pushing a tag for ANY package, **stop and run24this verification checklist with the user**:25261. **Show the release summary**:27 - Package name and version28 - RC branch name and PR link29 - CI status (link to the passing run)30 - Changelog entry (show the relevant section)31 - Dependency check result (any git-based deps found?)32 - For py-shiny: shinylive example test results332. **Ask for explicit confirmation**:34 > "Ready to release **{package} v{version}**? This will tag the commit and publish35 > to {registry}. Please confirm with 'yes' to proceed."363. **Do NOT proceed** until the user explicitly says "yes", "go", "proceed", or equivalent374. If the user raises concerns, address them before re-presenting the gate3839## Getting Started40411. Ask the user which version of py-shiny is being released (e.g., `1.3.0`)422. Ask if py-htmltools also needs a release (and what version)433. Ask if any Shiny HTML Dependencies were updated (triggers shinyswatch prerequisite)444. Create a TodoWrite checklist of all 13 phases455. Begin with Phase 14647## Phase Overview4849```50[ ] Phase 1: Prerequisites (shinyswatch update if HTML deps changed)51[ ] Phase 2: Release py-htmltools52[ ] Phase 3: Release py-shiny53[ ] Phase 4: Release py-shinyswatch54[ ] Phase 5: Release py-shinywidgets55[ ] Phase 6: Update Shinylive (JS) repo56[ ] Phase 7: Update py-shinylive57[ ] Phase 8: Update r-shinylive58[ ] Phase 9: Update py-shiny (bump shinylive docs version)59[ ] Phase 10: Update py-shiny-site60[ ] Phase 11: Conda-forge61[ ] Phase 12: Huggingface62[ ] Phase 13: Publish blog post63```6465For detailed steps in each phase, read [references/release-phases.md](references/release-phases.md).6667## Repos6869| Package | Repo | Registry |70|---------|------|----------|71| py-htmltools | `posit-dev/py-htmltools` | PyPI |72| py-shiny | `posit-dev/py-shiny` | PyPI |73| py-shinyswatch | `posit-dev/py-shinyswatch` | PyPI |74| py-shinywidgets | `posit-dev/py-shinywidgets` | PyPI |75| shinylive (JS) | `posit-dev/shinylive` | GH Release artifact |76| py-shinylive | `posit-dev/py-shinylive` | PyPI |77| r-shinylive | `posit-dev/r-shinylive` | CRAN |78| py-shiny-site | `posit-dev/py-shiny-site` | GitHub Pages |79| conda htmltools | `conda-forge/py-htmltools-feedstock` | conda-forge |80| conda shiny | `conda-forge/py-shiny-feedstock` | conda-forge |8182## General Package Release Pattern8384Many phases (2-5, 7) follow this common flow:85861. Checkout branch `rc-vX.Y.Z`872. Verify `pyproject.toml` has no git-based deps (e.g., no `htmltools @ git+https://...`)883. Bump version (changelog + `__init__.py`, or tag-based for py-shiny)894. Commit, push, open PR, wait for CI905. Verify no additional commits were added to the RC branch beyond the release prep916. **Run the pre-release gate** (see above) - present summary and get explicit user confirmation927. Squash merge the RC PR into main via GitHub (this is the release commit)938. Tag the squash commit on main: `git checkout main && git pull && git tag vX.Y.Z && git push origin vX.Y.Z`949. Create GH Release with changelog content, mark as "Latest"9510. Wait for PyPI publish to succeed9611. If publish fails: delete tag + GH Release, fix, redo9798## On Failure99100- For PyPI failures: remind user to delete the tag and GH Release before retrying101- For CI failures: help investigate logs with `gh run view`102- For shinylive build failures: check `make clean && make all` output103- Never proceed to the next phase until the current one is resolved or explicitly skipped104105---106> Source: [posit-dev/py-shiny](https://github.com/posit-dev/py-shiny) — distributed by [TomeVault](https://tomevault.io).107<!-- tomevault:4.0:skill_md:2026-05-22 -->