{"id":"release-post","name":"release-post","summary":"TidyverseやShinyのブログ慣習に従って、プロフェッショナルなパッケージリリースブログ記事を作成しましょう。","body":"# Package Release Post\n\nCreate professional R/Python package release blog posts following Tidyverse or Shiny blog conventions.\n\n## Quick Start\n\n1. **Identify the blog platform**: Tidyverse (tidyverse.org) or Shiny (shiny.posit.co)\n2. Verify NEWS.md or changelog exists for the package\n3. Gather package info: name, version, repository (e.g., \"tidyverse/dplyr\")\n4. Follow the workflow below\n5. Use `scripts/get_contributors.R` to generate acknowledgments\n6. Reference the appropriate formatting guide for final polish\n\n## Platform Selection\n\nThis skill supports two blog platforms with different formatting requirements:\n\n- **Tidyverse blog** (tidyverse.org)\n  - Uses hugodown\n  - R packages primarily\n  - More rigid structure and conventions\n  - See `references/tidyverse-formatting.md`\n\n- **Shiny blog** (shiny.posit.co)\n  - Uses Quarto\n  - R and Python packages\n  - More flexible, feature-focused structure\n  - See `references/shiny-formatting.md`\n\n**First, determine which platform the post is for**, then follow the general workflow and apply platform-specific formatting.\n\n## General Workflow\n\nThese steps apply to both platforms. Content guidelines are based on Tidyverse best practices but adapt them as needed for Shiny posts.\n\n### Step 1: Gather Information\n\nCollect required information:\n\n- **Platform**: Tidyverse or Shiny blog?\n- **Package name and version**: e.g., \"dplyr 1.2.0\" or \"shiny 1.9.0\"\n- **Repository**: GitHub repo in \"owner/repo\" format\n- **Package language**: R or Python\n- **NEWS content**: Read the package's NEWS.md, CHANGELOG, or NEWS\n- **Package description**: One-sentence core purpose\n- **Previous release tag**: For contributor fetching (optional)\n- **Featured image**: For frontmatter (optional but recommended)\n\n### Step 2: Structure the Post\n\nCreate the post outline following this order:\n\n1. **Frontmatter**: Platform-specific YAML (see formatting references)\n\n2. **Title and Opening**:\n   - Title: Package name and version\n   - Opening: Announcement with one-sentence package description\n   - Installation: Code block with installation command\n   - Overview: Brief summary with link to full release notes\n\n3. **Main Content** (choose appropriate sections):\n   - **Migration guide** (if breaking changes) - Always first when present\n   - **Lifecycle changes** (deprecations, soft-deprecations, defunct)\n   - **Feature sections** (one per major feature, descriptive headings)\n   - **Minor improvements** (bulleted list)\n\n4. **Acknowledgements** (when appropriate):\n   - Use `scripts/get_contributors.R`\n   - Format: \"A big thank you to all the folks who helped make this release happen:\"\n   - Comma-separated GitHub links\n\n### Step 3: Apply Content Guidelines\n\nFollow the best practices in `references/content-guidelines.md`:\n\n- **Opening style**: \"We're [random adjective expressing excitement] to announce the release of...\"\n- **Section organization**: Migration → Lifecycle → Features → Improvements → Acknowledgements\n- **Tone**: Conversational, professional, enthusiastic but authentic\n- **Technical precision**: Use exact function names in backticks\n- **Focus on benefits**: Explain \"why\" not just \"what\"\n- **Code examples**: Realistic, well-commented, properly formatted\n\n### Step 4: Transform NEWS Content\n\nConvert NEWS.md bullets to blog-friendly content:\n\n- **Research features thoroughly**: Don't just copy NEWS bullets—read function docs, check PRs, understand the context\n- **Expand context**: Why changes matter, not just what changed\n- **Add complete code examples**: Show realistic usage with full workflows, not just function signatures\n- **Explain concepts first**: For unfamiliar features, explain what they are and how they work before showing code\n- **Group thematically**: Combine related NEWS items into coherent sections\n- **Use conversational tone**: Transform terse bullets into prose\n- **Link documentation**: Add relevant links to docs and resources\n- **Highlight breaking changes**: Make migration paths clear\n- **Multi-language parity** (Shiny only): For R+Python packages on the Shiny blog, ensure all examples show both languages in tabsets\n\n### Step 5: Apply Platform-Specific Formatting\n\n**For Tidyverse posts**, read `references/tidyverse-formatting.md` and apply:\n- hugodown frontmatter with `slug`, `photo.url`, `photo.author`\n- Specific slug format: `packagename-x-y-z` (hyphens replace dots)\n- R code blocks with `r` language identifier\n- Acknowledgements always included as final section\n\n**For Shiny posts**, read `references/shiny-formatting.md` and apply:\n- Quarto frontmatter with YAML anchors for social media\n- Flexible title formatting\n- Use tabsets for Python/R or Express/Core variations\n- Platform-specific code block attributes\n- Acknowledgements optional, varies by post type\n- May use lead paragraphs, callouts, embedded media\n\n### Step 6: Generate Acknowledgements\n\nRun the contributor script:\n\n```bash\nRscript scripts/get_contributors.R \"owner/repo\"\n```\n\nOr with a specific starting tag for the previous version (or tag used for last release post):\n\n```bash\nRscript scripts/get_contributors.R \"owner/repo\" \"v1.0.0\"\n```\n\nCopy the markdown output into the Acknowledgements section.\n\n### Step 7: Review and Polish\n\nPlatform-agnostic checklist:\n\n- [ ] Frontmatter complete with all required fields\n- [ ] Opening clearly states package purpose\n- [ ] Installation code block present (both languages if applicable)\n- [ ] Sections organized logically\n- [ ] Code examples use proper syntax highlighting\n- [ ] Function names in backticks with parentheses: `` `function()` ``\n- [ ] Package names are not backticked or otherwise styled\n- [ ] Tone is conversational but not marketing-speak\n- [ ] No superlatives (\"powerful\", \"rich\", \"seamless\", etc.)\n- [ ] Features explained with context, not just listed\n- [ ] Concepts explained before showing code\n- [ ] All examples show R and Python variants (if applicable)\n- [ ] Links to full release notes included\n\nPlatform-specific checklist:\n\n**Tidyverse:**\n- [ ] Slug format: `package-x-y-z` (hyphens, not dots)\n- [ ] Photo URL and author included\n- [ ] Acknowledgements section is final section\n- [ ] All contributors listed alphabetically\n\n**Shiny:**\n- [ ] YAML anchors used for description (`&desc`, `*desc`)\n- [ ] Social media cards configured (`open-graph`, `twitter-card`)\n- [ ] Appropriate filters specified if using tabsets/shinylive\n- [ ] Tabsets used for showing paired variants (Python/R, Express/Core)\n- [ ] Multi-language tabsets used consistently (for R+Python packages only)\n\n## Reference Documentation\n\nLoad these as needed for detailed guidance:\n\n### Content Guidelines\n**`references/content-guidelines.md`** - General best practices for all release posts:\n- Post structure and organization\n- Opening style and tone\n- Section hierarchy and organization\n- Code examples and formatting\n- Before/after patterns\n- Acknowledgments conventions\n\n### Platform-Specific Formatting\n\n**`references/tidyverse-formatting.md`** - Tidyverse blog requirements:\n- hugodown frontmatter structure\n- Slug and title conventions\n- Photo attribution\n- Code block formatting\n- Lifecycle section structure\n- Acknowledgements format\n\n**`references/shiny-formatting.md`** - Shiny blog requirements:\n- Quarto frontmatter with YAML anchors\n- Social media card configuration\n- Lead paragraphs and callouts\n- Tabsets for variants\n- Line highlighting and annotations\n- Video embedding\n- Flexible acknowledgements\n\n## Resources\n\n- **`scripts/get_contributors.R`**: Fetch formatted contributor list using `usethis::use_tidy_thanks()`\n- **`references/content-guidelines.md`**: General content best practices (platform-agnostic)\n- **`references/tidyverse-formatting.md`**: Tidyverse-specific formatting requirements\n- **`references/shiny-formatting.md`**: Shiny-specific formatting requirements\n\n## Platform-Specific Quick Reference\n\n### Tidyverse Post Template\n\n````markdown\n---\noutput: hugodown::hugo_document\nslug: package-x-y-z\ntitle: package x.y.z\ndate: YYYY-MM-DD\nauthor: Your Name\ndescription: >\n    Brief description\nphoto:\n  url: https://unsplash.com/photos/id\n  author: Photographer Name\ncategories: [package]\ntags: [package]\n---\n\n# package x.y.z\n\nWe're pleased to announce the release of package x.y.z...\n\n```r\ninstall.packages(\"package\")\n```\n\n...\n\n## Acknowledgements\n\nA big thank you to all the folks who helped make this release happen:\n\n[Contributors from get_contributors.R]\n````\n\n### Shiny Post Template\n\n````markdown\n---\ntitle: Package Name x.y.z\ndescription: &desc |\n  Brief description of the release.\nauthor: \"Your Name\"\ndate: \"YYYY-MM-DD\"\n\nimage: feature.png\n\nopen-graph:\n  image: feature.png\n  description: *desc\ntwitter-card:\n  image: feature.png\n  description: *desc\n---\n\n# package x.y.z\n\nWe're excited to announce package x.y.z...\n\n[Installation for Python or R]\n\n...\n````\n\n## Tips\n\n- **Breaking changes first**: Put migration guides before features\n- **Highlight the wins**: Lead with the most exciting features\n- **Show don't tell**: Use code examples liberally\n- **Link generously**: Help readers find more information\n- **Keep it conversational**: Write like you're explaining to a colleague\n- **Be authentic**: Enthusiasm should feel genuine, not marketing-speak","author":"@posit-dev","ownerProfile":null,"authorContacts":null,"sourceUrl":"https://github.com/posit-dev/skills/tree/main/open-source/release-post","license":"MIT","category":"writing","lang":"en","tokens":2144,"stars":0,"calls30d":2,"claimed":false,"visibility":"public","origin":"crawler","version":"0.1.0","createdAt":"2026-08-22","updatedAt":"2026-08-22","files":[{"path":"references/content-guidelines.md","size":12141,"sha256":"b4f2960a87352918abd232d86a5a7754f903842a9d8f1e578f5f6b9657a88bae"},{"path":"references/shiny-formatting.md","size":12096,"sha256":"30dd05e615eb46fa7db21d20bb02739abe0a7324a524105cf62c21627ca1e014"},{"path":"references/tidyverse-formatting.md","size":7314,"sha256":"6f9d8aae3c24f9a81827b89ca3dd05f5817e2e783abdd8d02b1bbdf51f2fec10"},{"path":"scripts/get_contributors.R","size":1411,"sha256":"93a03708015bf7ea7af2478004817892b5f11e65c92f934d0f73cd1481109f1b"}],"requires":{"mcp":[],"tools":[]},"safety":{"flags":[],"scannedAt":"2026-08-22","hasScripts":false,"networkEndpoints":["packagename.tidyverse.org","pexels.com","posit-dev.github.io","quarto.org","rstudio.github.io","shiny.posit.co","shinylive.io","unsplash.com","www.tidyverse.org"]}}