- Package Release Post
- Create professional R/Python package release blog posts following Tidyverse or Shiny blog conventions.
- Quick Start
- Identify the blog platform
-
- Tidyverse (tidyverse.org) or Shiny (shiny.posit.co)
- Verify NEWS.md or changelog exists for the package
- Gather package info: name, version, repository (e.g., "tidyverse/dplyr")
- Follow the workflow below
- Use
- scripts/get_contributors.R
- to generate acknowledgments
- Reference the appropriate formatting guide for final polish
- Platform Selection
- This skill supports two blog platforms with different formatting requirements:
- Tidyverse blog
- (tidyverse.org)
- Uses hugodown
- R packages primarily
- More rigid structure and conventions
- See
- references/tidyverse-formatting.md
- Shiny blog
- (shiny.posit.co)
- Uses Quarto
- R and Python packages
- More flexible, feature-focused structure
- See
- references/shiny-formatting.md
- First, determine which platform the post is for
- , then follow the general workflow and apply platform-specific formatting.
- General Workflow
- These steps apply to both platforms. Content guidelines are based on Tidyverse best practices but adapt them as needed for Shiny posts.
- Step 1: Gather Information
- Collect required information:
- Platform
-
- Tidyverse or Shiny blog?
- Package name and version
-
- e.g., "dplyr 1.2.0" or "shiny 1.9.0"
- Repository
-
- GitHub repo in "owner/repo" format
- Package language
-
- R or Python
- NEWS content
-
- Read the package's NEWS.md, CHANGELOG, or NEWS
- Package description
-
- One-sentence core purpose
- Previous release tag
-
- For contributor fetching (optional)
- Featured image
-
- For frontmatter (optional but recommended)
- Step 2: Structure the Post
- Create the post outline following this order:
- Frontmatter
-
- Platform-specific YAML (see formatting references)
- Title and Opening
- :
- Title: Package name and version
- Opening: Announcement with one-sentence package description
- Installation: Code block with installation command
- Overview: Brief summary with link to full release notes
- Main Content
- (choose appropriate sections):
- Migration guide
- (if breaking changes) - Always first when present
- Lifecycle changes
- (deprecations, soft-deprecations, defunct)
- Feature sections
- (one per major feature, descriptive headings)
- Minor improvements
- (bulleted list)
- Acknowledgements
- (when appropriate):
- Use
- scripts/get_contributors.R
- Format: "A big thank you to all the folks who helped make this release happen:"
- Comma-separated GitHub links
- Step 3: Apply Content Guidelines
- Follow the best practices in
- references/content-guidelines.md
- :
- Opening style
-
- "We're [random adjective expressing excitement] to announce the release of..."
- Section organization
-
- Migration → Lifecycle → Features → Improvements → Acknowledgements
- Tone
-
- Conversational, professional, enthusiastic but authentic
- Technical precision
-
- Use exact function names in backticks
- Focus on benefits
-
- Explain "why" not just "what"
- Code examples
-
- Realistic, well-commented, properly formatted
- Step 4: Transform NEWS Content
- Convert NEWS.md bullets to blog-friendly content:
- Research features thoroughly
-
- Don't just copy NEWS bullets—read function docs, check PRs, understand the context
- Expand context
-
- Why changes matter, not just what changed
- Add complete code examples
-
- Show realistic usage with full workflows, not just function signatures
- Explain concepts first
-
- For unfamiliar features, explain what they are and how they work before showing code
- Group thematically
-
- Combine related NEWS items into coherent sections
- Use conversational tone
-
- Transform terse bullets into prose
- Link documentation
-
- Add relevant links to docs and resources
- Highlight breaking changes
-
- Make migration paths clear
- Multi-language parity
- (Shiny only): For R+Python packages on the Shiny blog, ensure all examples show both languages in tabsets
- Step 5: Apply Platform-Specific Formatting
- For Tidyverse posts
- , read
- references/tidyverse-formatting.md
- and apply:
- hugodown frontmatter with
- slug
- ,
- photo.url
- ,
- photo.author
- Specific slug format:
- packagename-x-y-z
- (hyphens replace dots)
- R code blocks with
- r
- language identifier
- Acknowledgements always included as final section
- For Shiny posts
- , read
- references/shiny-formatting.md
- and apply:
- Quarto frontmatter with YAML anchors for social media
- Flexible title formatting
- Use tabsets for Python/R or Express/Core variations
- Platform-specific code block attributes
- Acknowledgements optional, varies by post type
- May use lead paragraphs, callouts, embedded media
- Step 6: Generate Acknowledgements
- Run the contributor script:
- Rscript scripts/get_contributors.R
- "owner/repo"
- Or with a specific starting tag for the previous version (or tag used for last release post):
- Rscript scripts/get_contributors.R
- "owner/repo"
- "v1.0.0"
- Copy the markdown output into the Acknowledgements section.
- Step 7: Review and Polish
- Platform-agnostic checklist:
- Frontmatter complete with all required fields
- Opening clearly states package purpose
- Installation code block present (both languages if applicable)
- Sections organized logically
- Code examples use proper syntax highlighting
- Function names in backticks with parentheses:
function()- Package names are not backticked or otherwise styled
- Tone is conversational but not marketing-speak
- No superlatives ("powerful", "rich", "seamless", etc.)
- Features explained with context, not just listed
- Concepts explained before showing code
- All examples show R and Python variants (if applicable)
- Links to full release notes included
- Platform-specific checklist:
- Tidyverse:
- Slug format:
- package-x-y-z
- (hyphens, not dots)
- Photo URL and author included
- Acknowledgements section is final section
- All contributors listed alphabetically
- Shiny:
- YAML anchors used for description (
- &desc
- ,
- *desc
- )
- Social media cards configured (
- open-graph
- ,
- twitter-card
- )
- Appropriate filters specified if using tabsets/shinylive
- Tabsets used for showing paired variants (Python/R, Express/Core)
- Multi-language tabsets used consistently (for R+Python packages only)
- Reference Documentation
- Load these as needed for detailed guidance:
- Content Guidelines
- references/content-guidelines.md
- - General best practices for all release posts:
- Post structure and organization
- Opening style and tone
- Section hierarchy and organization
- Code examples and formatting
- Before/after patterns
- Acknowledgments conventions
- Platform-Specific Formatting
- references/tidyverse-formatting.md
- - Tidyverse blog requirements:
- hugodown frontmatter structure
- Slug and title conventions
- Photo attribution
- Code block formatting
- Lifecycle section structure
- Acknowledgements format
- references/shiny-formatting.md
- - Shiny blog requirements:
- Quarto frontmatter with YAML anchors
- Social media card configuration
- Lead paragraphs and callouts
- Tabsets for variants
- Line highlighting and annotations
- Video embedding
- Flexible acknowledgements
- Resources
- scripts/get_contributors.R
-
- Fetch formatted contributor list using
- usethis::use_tidy_thanks()
- references/content-guidelines.md
-
- General content best practices (platform-agnostic)
- references/tidyverse-formatting.md
-
- Tidyverse-specific formatting requirements
- references/shiny-formatting.md
- Shiny-specific formatting requirements Platform-Specific Quick Reference Tidyverse Post Template
output : hugodown : : hugo_document slug : package - x - y - z title : package x.y.z date : YYYY - MM - DD author : Your Name description :
Brief description photo : url : https : //unsplash.com/photos/id author : Photographer Name categories : [ package ] tags : [ package ]
package x.y.z We're pleased to announce the release of package x.y.z...
r
install.packages
(
"package"
)
...
Acknowledgements A big thank you to all the folks who helped make this release happen: [Contributors from get_contributors.R] Shiny Post Template
title : Package Name x.y.z description : &desc | Brief description of the release. author : "Your Name" date : "YYYY-MM-DD" image : feature.png open-graph : image : feature.png description : desc twitter-card : image : feature.png description : desc
- package x.y.z
- We're excited to announce package x.y.z...
- [Installation for Python or R]
- ...
- Tips
- Breaking changes first
-
- Put migration guides before features
- Highlight the wins
-
- Lead with the most exciting features
- Show don't tell
-
- Use code examples liberally
- Link generously
-
- Help readers find more information
- Keep it conversational
-
- Write like you're explaining to a colleague
- Be authentic
- Enthusiasm should feel genuine, not marketing-speak