MCPInstall

writing-release-notes

Use when preparing anything that announces a release to the people who consume it — CHANGELOG entries, GitHub release descriptions, version announcements, upgrade or migration guides, or deprecation notices. Triggers include "write the changelog", "release notes for v2.3", "summarize what changed since the last release", "what do users need to know about this upgrade", and cutting a tag.

Installs
63
Last 24h
—
Trending rank
—
Security
Not audited

Install

Works with every agent the skills CLI supports.

npx skills add https://github.com/osmontero/opencode-skills --skill writing-release-notes
  1. 01

    Install

    Run the command in your project. The CLI asks which agents to install for.

  2. 02

    Describe the task

    Ask your agent for something this skill covers. It loads writing-release-notes automatically when relevant.

  3. 03

    Review the result

    The agent follows the SKILL.md steps, scripts and references bundled with the skill.

SKILL.md

The instructions your agent reads when the skill is triggered.

Writing Release Notes

Overview

The default failure is a pasted commit log. It is accurate, complete, and useless — because it describes what happened to the code, and the reader needs to know what happened to them.

Core principle: The reader is deciding two things — should I upgrade, and what will break if I do. Every line either serves one of those decisions or is noise.

Companion skills: writing-internal-comms for audiences inside the org, coauthoring-docs for the documentation an entry links to, evolving-apis-and-schemas when the release contains a breaking change.

The Iron Law

EVERY ENTRY STATES WHAT CHANGED FOR THE READER, NOT WHAT CHANGED IN THE CODE

Refactored the auth middleware to use the new token store is a commit message. Sessions now survive a server restart is a release note. Same change, and only one of them answers a question the reader has.

If an entry has no reader-visible effect, it does not go in release notes at all. The commit log already exists and is one click away.

Step 1: Know Which Document You Are Writing

Three different artifacts get called "release notes". Mixing them serves nobody.

DocumentAudienceShape
CHANGELOGAnyone auditing historyTerse, cumulative, one line per change, grouped by type, newest version first
Release notesPeople deciding whether to upgrade nowHighlights first, then the full list. Prose for the top items
Upgrade guidePeople who already decidedOnly breaking changes, each with before/after and steps

A small library needs only a CHANGELOG. A release with breaking changes needs all three, and the release notes link to the upgrade guide rather than inlining it.

Step 2: Gather, Then Translate

git log --oneline v1.4.0..HEAD
git log v1.4.0..HEAD --format='%s%n%b' | grep -iE 'BREAKING|deprecat'
git diff v1.4.0..HEAD --stat -- '*.proto' 'migrations/' 'openapi.yaml'

That last command is the one that matters most: it finds the interface changes that the commit subjects usually fail to mention.

Then translate every candidate through one question: what can the reader do now that they could not do before, or what will now behave differently? If there is no answer, drop it.

Step 3: Categorize

Use these six, in this order, and omit any that are empty. Breaking changes lead — always, regardless of how minor they seem relative to the rest.

CategoryContains
BreakingAnything requiring the reader to change code, config, or data
AddedNew capability
ChangedExisting behavior that is different but compatible
DeprecatedStill works, will be removed — with the version it goes away in
RemovedGone, previously deprecated
FixedBugs, described by the symptom the reader saw
SecurityAlways its own section, always near the top, never buried in Fixed

Deprecations need a date or a version, not "soon". A deprecation notice without a removal target gets ignored, and then removal is a surprise.

Security entries state severity and whether action is required. If a CVE is assigned, include it. If exploitation requires a specific configuration, say which — readers need to know if they were affected, not only that they should upgrade.

Step 4: Write the Entries

Each entry: what changed, for whom, and the link to detail. One line in a CHANGELOG; two or three sentences for a headline feature.

Instead ofWrite
Fix null pointer in handlerFixed a crash when uploading a file with no extension
Bump depsUpdated to OpenSSL 3.2.1, resolving CVE-2024-XXXX (no action required)
Add caching layerDashboard queries now return in under 200ms for workspaces with 10k+ documents
Refactor config parsing(omit — no reader-visible effect)
Change API responseBreaking: GET /documents now returns items instead of results. Update clients before upgrading; see the upgrade guide
Improve performanceImport of a 100MB CSV is roughly 4× faster (was ~90s, now ~22s on the reference dataset)

Rules that carry most of the quality:

  • Lead with the effect, not the mechanism. The reader cares about the restart, not the token store.
  • Quantify. "Faster" is unverifiable; "90s → 22s on a 100MB import" is a claim someone can check, and it is far more persuasive.
  • Name the symptom for bug fixes. Readers search release notes for the problem they hit, using the words they would use for it.
  • Say when action is required. Most entries need nothing; the ones that do must be unmissable.
  • Link, don't inline. Migration steps, benchmarks, and API details belong in linked docs.
  • Past tense, active voice, no marketing. "Sessions now survive a restart." Not "We're thrilled to announce a revolutionary new session experience."

Step 5: Breaking Changes Get Migration Steps

An entry that says something broke without saying what to do is an incomplete entry.

### Breaking

**`GET /documents` renames `results` to `items`**

The list envelope now matches every other collection endpoint.

Before:
```json
{ "results": [...], "total": 42 }
```

After:
```json
{ "items": [...], "total": 42 }
```

**Migration:** update clients to read `items`. The old field is still present
in 2.x and will be removed in 3.0. Clients reading `results` continue to work
until then, with a `Deprecation` header on every response.

Best case, the migration is a command — npx my-tool codemod v3 — and you say so. Second best, it is a diff. Worst acceptable case, it is prose. "Users should update their integrations" is not any of these.

Format

## [2.3.0] — 2026-03-14

### Security
- Fixed a path traversal in the archive importer that allowed writing outside
  the workspace directory (CVE-2026-XXXXX, high). Affects 2.0–2.2 with imports
  enabled. **Upgrade recommended.**

### Breaking
- `GET /documents` returns `items` instead of `results` ([upgrade guide](./UPGRADE.md#23))

### Added
- Full-text search across document bodies, with `search:` filters
- `--dry-run` on `import`, printing what would change without writing

### Changed
- Dashboard queries return in under 200ms for workspaces above 10k documents
- Default session lifetime is now 30 days (was 7); override with `SESSION_TTL`

### Deprecated
- `results` in list responses — removed in 3.0
- `POST /documents/bulk` — use `POST /documents` with an array; removed in 3.0

### Fixed
- Uploading a file with no extension no longer crashes the worker
- Timestamps in exports use the workspace timezone rather than UTC

**Full diff:** [v2.2.1...v2.3.0](https://github.com/org/repo/compare/v2.2.1...v2.3.0)

Keep dates in ISO form and versions in brackets — that combination is what makes a CHANGELOG mechanically parseable, which downstream tooling relies on.

Version Signaling

The number is part of the message. Under semver, a breaking change means a major bump — shipping one in a minor release costs more trust than the delay of doing it properly. If the project is pre-1.0 or uses a different scheme, say so at the top of the CHANGELOG so readers can calibrate.

Common Mistakes

Pasting the commit log. Complete, chronological, unreadable, and it leaks internal naming to people who have no idea what ToolGateway is.

Burying the breaking change in the middle of a list because it was a small diff. Diff size is unrelated to reader impact.

Omitting the fix nobody reported. Someone hit it and never filed. Release notes are how they find out it is fixed.

"Various bug fixes and improvements." Says nothing, and reads as a release nobody bothered to document.

Internal vocabulary. Module names, ticket numbers, and service names that mean nothing outside the team.

Listing dependency bumps individually. Group them, unless one carries a security fix or a behavior change — then it is its own entry.

No date. Readers use dates to reason about what they are running.

Writing it at tag time from memory. Add the entry with the change, while the reader-visible effect is still obvious.

FAQ

What does the writing-release-notes skill do?

Use when preparing anything that announces a release to the people who consume it — CHANGELOG entries, GitHub release descriptions, version announcements, upgrade or migration guides, or deprecation notices. Triggers include "write the changelog", "release notes for v2.3", "summarize what changed since the last release", "what do users need to know about this upgrade", and cutting a tag.

How do I install writing-release-notes?

Run npx skills add https://github.com/osmontero/opencode-skills --skill writing-release-notes in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/writing-release-notes/ (personal) or .claude/skills/writing-release-notes/ (project).

Which AI agents can use writing-release-notes?

Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.

Is writing-release-notes safe to install?

No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.

Who maintains writing-release-notes?

It is published by osmontero in osmontero/opencode-skills. It has 63 recorded installs.

More from osmontero/opencode-skills

View all →

designing-frontend-interfaces

osmontero/opencode-skills

Use when building or restyling any web interface — landing pages, dashboards, marketing sites, web apps, React/Vue components, HTML/CSS layouts, artifacts, posters — or when asked to make a UI look better, more polished, more distinctive, less generic, or less "AI-generated". Also use when a design brief, art direction, visual identity, type scale, or color system is needed before implementation.

Frontend & Design650 installs

designing-user-experience

osmontero/opencode-skills

Open the skill to read its SKILL.md instructions.

460 installs

reviewing-interface-quality

osmontero/opencode-skills

Open the skill to read its SKILL.md instructions.

363 installs

building-accessible-interfaces

osmontero/opencode-skills

Use when building or auditing any web UI for accessibility — keyboard navigation, screen readers, focus management, ARIA, color contrast, form labels and error announcements, reduced motion, or touch target size. Triggers include "is this accessible", "WCAG", "a11y", "screen reader", "keyboard navigation", "focus trap", "contrast ratio", "aria-label", or building modals, menus, tabs, comboboxes, toasts, and custom controls that must work without a mouse.

Frontend & Design350 installs

systematic-debugging

osmontero/opencode-skills

Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes

verifying-before-completion

osmontero/opencode-skills

Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always

157 installs

Popular docs & writing skills

View category →

grill-with-docs

mattpocock/skills

A relentless interview to sharpen a plan or design, which also creates docs (ADR's and glossary) as we go.

Docs & Writing1.2M installs

lark-markdown

open.feishu.cn

飞书 Markdown:查看、创建、上传、编辑和比较飞书中的原生 Markdown 文件。当用户要操作飞书 Markdown 文件,或比较其远端版本及本地草稿时使用。纯本地 Markdown 文件操作不触发本 skill。不负责将 Markdown 导入为飞书在线文档,也不负责文件搜索、权限、评论、移动、删除等云空间管理操作。

Docs & Writing778.7K installs

writing-beats

mattpocock/skills

Writing, exploit; assemble raw material into a journey of beats, grounding each term before a beat leans on it.

Docs & Writing490.7K installs

writing-shape

mattpocock/skills

Writing, exploit: shape raw material into an article, paragraph by paragraph.

Docs & Writing490.2K installs

writing-fragments

mattpocock/skills

Writing, explore: mine raw fragments, no structure yet.

Docs & Writing489.6K installs

writing-for-agents

mattpocock/skills

Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.

Docs & Writing479.3K installs