Install
openclaw skills install release-notes-humanizerTurn a raw git log, PR title list, or changelog dump into customer-facing release notes that read like a human wrote them. Detects categories (new feature / improvement / fix / breaking change / removed), filters internal/refactor noise, groups items by user value, rewrites every line from "Added X" to user-benefit framing, and generates per-audience versions (in-app changelog, email blast, developer changelog, marketing tweet, status-page note). Covers tone modulation, emoji rules, version numbering schemes, and template patterns from Linear, Stripe, Vercel, Figma, Tailwind, and Notion. Triggers on "release notes", "changelog", "what's new", "version notes", "humanize changelog", "rewrite release", "v1.2 release", "ship notes", "product update post", "patch notes", "semver", "calver".
openclaw skills install release-notes-humanizerTake a raw input — git log, list of merged PR titles, Linear cycle dump, or a half-written changelog draft — and produce polished release notes for every audience that needs to hear about the release. Acts as an experienced product marketer with a developer's understanding of the underlying changes, modeled on the changelogs of Linear, Stripe, Vercel, Figma, and Tailwind.
Invoke this skill anytime you have a release going out and a pile of raw shipping artifacts that need to become readable customer communication.
Basic invocation:
Humanize this git log into release notes: [paste] Turn these 30 PR titles into a v2.3 changelog Rewrite our draft release post in the Stripe style Generate the in-app changelog, email, and tweet for this release
With context:
Here's the diff summary, the marketing tweet must be under 240 chars We use calver (2026.5) — adjust the heading Audience is mostly indie developers — keep the dev tone This release has one breaking change — make sure it's loud
The agent produces a categorized, audience-segmented release note set ready to publish to changelog page, in-app modal, email blast, social, and developer changelog.
The agent accepts these raw inputs and normalizes them into a single line-per-change list:
| Input type | What the agent extracts |
|---|---|
Git log (git log --oneline v1.2..HEAD) | Commit subject, drops merge commits, drops trivial chores |
| PR titles (GitHub / GitLab / Bitbucket) | Title, label, author, linked issue if present |
| Linear cycle export | Issue title, project, labels, type field |
| CHANGELOG.md draft | Existing markdown bullets, preserves manual notes |
Conventional Commits (feat:, fix:, etc.) | Uses the prefix as the category hint |
| Squashed PR descriptions | Reads description body for "What" and "Why" sections |
Conventional Commit prefixes the agent recognizes for category routing:
feat: → New feature
fix: → Fix
perf: → Improvement (performance)
refactor: → INTERNAL — drop unless user-visible
chore: → INTERNAL — drop
docs: → Drop unless customer-facing docs
test: → INTERNAL — drop
ci/build: → INTERNAL — drop
revert: → Mention if a previously-shipped feature is rolled back
breaking: → Breaking change (always promote to its own section)
A typical release contains 60-80% noise from the customer's perspective. The agent drops these by default and flags them for review:
Always drop:
Promote even if engineering tagged it internal:
customer-reported)Ambiguous → flag for human review:
The agent puts every surviving line into one of five buckets, in this fixed display order:
1. BREAKING CHANGES — anything requiring user action to keep working
2. NEW — net-new functionality the customer can use
3. IMPROVED — existing functionality made better (perf, UX, polish)
4. FIXED — bugs squashed
5. REMOVED / DEPRECATED — features sunset or scheduled for removal
Routing rules:
| Trigger | Bucket |
|---|---|
| API endpoint signature changed, env var renamed, default behavior changed | BREAKING |
| New page, button, command, integration, plan tier, API endpoint | NEW |
| Faster, fewer clicks, better error messages, redesigned panel | IMPROVED |
| "Fix:" prefix or anything resolving a regression | FIXED |
| "Removed", "deprecated", end-of-life | REMOVED |
The "user can do something they couldn't yesterday" test: if yes → NEW. If they could already do it but it now works better → IMPROVED. The two buckets aren't interchangeable; getting them confused makes the changelog feel padded.
This is where most internal changelogs fail. They read as a developer log, not a product update. The agent applies four rewrite rules.
Rule 1: Lead with the verb the user does, not the verb the team did.
Before: "Added bulk export functionality"
After: "Export up to 10,000 rows at once from any table"
Before: "Implemented dark mode"
After: "Switch to dark mode in Settings → Appearance"
Before: "Created Slack integration"
After: "Send notifications straight to Slack — connect in Integrations"
Rule 2: Quantify whenever possible.
Before: "Made dashboard load faster"
After: "Dashboard loads 3.2× faster — average load time down from 1.4s to 430ms"
Before: "Improved search"
After: "Search now returns results in under 100ms across workspaces with 50,000+ items"
Rule 3: Drop developer artifacts.
Before: "Migrated user settings to PostgreSQL JSONB column for performance"
After: "Settings save instantly — no more 'saving…' spinner"
Before: "Refactored billing webhook handler with idempotency keys"
After: "Plan changes apply immediately — no more delayed activations after upgrade"
Rule 4: Tell the user what to do next.
For NEW items, end with a CTA: "Try it in [path]" or "Read the guide". For BREAKING changes, end with the migration step. For FIXED items, no CTA needed — just confirm the fix.
Anti-patterns the agent removes:
After rewriting, re-order within each bucket so highest-value-to-most-users items appear first:
The agent also clusters thematically related items. Three small fixes to the search UI become one "Search polish" bullet with three sub-bullets — feels like progress, not random noise. Three loose fixes to dashboard tooltip, billing PDF, and export filename encoding stay separate under "Other fixes."
A single set of release notes can't serve every channel. The agent generates four-to-five distinct outputs from the same source.
Audience 1 — In-app changelog modal: 200-400 words, first-person present-tense. Structure: # What's new in [version] — [date] → headline feature with CTA button → "Also new" bullets → "Improvements" → "Fixes" → footer link to full changelog. Must work without context (reader is mid-task).
Audience 2 — Email blast: scannable on mobile, hook in preview text, single primary CTA. Subject = action verb the user can now do. Preview = concrete benefit + number. Body = one-sentence hook → 2-3 sentence elaboration with specific use case → primary CTA button → "What else is new" (3-5 bullets) → P.S. for one thing that would otherwise get buried (often a customer-requested fix). Tone warmer than in-app.
Audience 3 — Developer changelog (CHANGELOG.md): thorough, technical, version-anchored. Sections: ### Breaking changes (with old/new signatures + migration code), ### Added (API endpoints, env vars with defaults), ### Changed (behavior diffs), ### Deprecated (with removal version), ### Fixed (with issue ref), ### Security (CVE, severity, action). One H2 per version, dated YYYY-MM-DD.
Audience 4 — Marketing post: Twitter/X 240 chars max — [Hero feature] is live in [Product] [version]. [Specific benefit with number]. [link] [image/GIF]. LinkedIn 600 chars — hook line, 3-line elaboration (why, who, what it replaces), 1-line CTA + link.
Audience 5 — Status-page note (for breaking changes/migrations only): factual, timestamped, action-required. [Date Time TZ] — [Version] released. This release includes a breaking change to [component]. Action required by [date]: [step]. Affected: [segment]. Guide: [link].
The agent matches tone to product persona. Three calibrated modes:
| Mode | Voice | Examples |
|---|---|---|
| Developer-tool (Vercel, Linear, Stripe, Tailwind) | Terse, technical, dry humor allowed, no emoji clusters, code-first | "We rewrote the build pipeline in Rust. Builds are 4× faster." |
| Prosumer-SaaS (Notion, Figma, Superhuman) | Warm, polished, present-tense, sparing emoji, designer-led | "Pages now load smoother. Try a long doc — you'll feel the difference." |
| Mass-market (consumer apps, freemium tools) | Energetic, friendly, emoji acceptable, GIFs and screenshots heavy | "Dark mode is here! 🌙 Toggle it in Settings." |
Mode is set per-product and propagates across all five audience outputs. The agent never mixes modes — a Vercel-style in-app changelog with a mass-market email is jarring.
Emoji misuse is the single biggest tell of an unedited changelog. Hard rules:
🎉🚀✨ is amateur.The agent uses your chosen scheme consistently across all outputs.
Semver (MAJOR.MINOR.PATCH, e.g. 2.3.1)
MAJOR — incompatible API changes
MINOR — backward-compatible new functionality
PATCH — backward-compatible bug fixes
Use when: API stability matters (libraries, SDKs, public APIs, infrastructure tools). Breaking changes are loud and require a major bump.
Calver (YYYY.MM or YYYY.MM.DD, e.g. 2026.5 or 2026.05.02)
Use when: continuous deployment, no formal API contract, rapid iteration. The version conveys recency, not stability. Examples: Ubuntu, Unity, JetBrains, OpenClaw.
Marketing version (v1, v2, v3 or named like Apple's iOS 17)
Use when: external announcements, hero releases, app store listings. Decoupled from internal semver.
Hybrid (most common in SaaS):
Internal: 2026.5 (calver) for daily releases
Marketing: v3 "Atlas release" for the quarterly hero feature
API: /v1, /v2 (semver-style) for breaking endpoint changes
The agent recommends hybrid for any product with both a marketing surface and a developer surface. Linear and Vercel both use this pattern.
The agent draws from these canonical examples:
Linear — Dated reverse-chronological, single-page scroll, GIF per release, terse headline + 2-3 sentence body, subtle emoji per category, RSS feed.
Stripe — API-first changelog separate from product blog. Strict Added/Changed/Deprecated/Removed. Every breaking change ships with a migration code sample. No emoji in the API changelog.
Vercel — Marketing-style hero post for big launches; concise per-feature pages; technical depth one click away; branded illustration per release.
Figma — Quarterly hero release ("Config 2026") with named features; weekly small updates in an in-app "What's new" panel; annotated screenshots for every UI change.
Tailwind CSS — Long-form blog post for major versions with extensive before/after code samples; plays as both marketing and upgrade guide; OSS migration tooling links.
Notion — In-app modal on launch day, archived to a public changelog page; heavy on screenshots and short videos; friendly tone, single primary CTA per release.
The agent picks the closest template to your product's persona unless you specify.
Most teams botch breaking changes. The agent always:
[Action Required].Template fields: ## ⚠️ Breaking — [component] → What changed (1 sentence) → Why (perf/security/correctness) → Action required → Deadline → Migration (before/after code) → Questions link.
Input (10 commits from a developer-tool product):
feat: add bulk export to CSV
feat: dark mode
fix: search highlighting on mobile
fix: csv export filename encoding on windows
perf: reduce dashboard p95 latency by 60%
refactor: extract billing module
chore: bump deps
fix: rare double-charge on plan upgrade webhook race
docs: update api reference
feat: slack notifications for workspace events
Agent output (in-app, developer-tool tone):
## What's new — 2026.5
### New
**Bulk CSV export** — Export up to 10,000 rows from any table at once.
Available in the table toolbar.
**Slack notifications** — Get pinged in Slack when workspace events fire.
Connect in Settings → Integrations → Slack.
**Dark mode** — Switch in Settings → Appearance.
### Improved
- Dashboard 60% faster — p95 load time down from 1.2s to 480ms.
### Fixed
- ⚠️ Resolved a rare double-charge that could occur during a plan upgrade if
the webhook retried within 200ms. Affected ~0.05% of upgrades; we are
refunding identified cases automatically.
- CSV exports with non-ASCII filenames open correctly on Windows.
- Search result highlighting now works on mobile.
Note: the agent dropped refactor, chore, docs. It promoted the double-charge fix with a warning indicator and named the impact explicitly because money + correctness deserves transparency.
Tweet (240 chars):
v2026.5 is live.
Dashboard now 60% faster (p95: 1.2s → 480ms), bulk CSV export up to 10k rows,
Slack notifications, dark mode.
Patch notes: [link]
Email subject options (the agent generates 3, picks one):
A. "Bulk export, Slack, and a 60% faster dashboard" ← picked
B. "What's new in [Product] — May release"
C. "Dark mode is here (and four other things)"
Reasoning: A leads with the most concrete benefit + a number. B is generic. C buries the lead behind dark mode (lower-impact than perf for this audience).
Input: breaking: rename API param customer_id to customerId for consistency
Output (developer changelog): ## ⚠️ Breaking — API parameter renamed. Lists affected endpoints (POST /v1/orders, POST /v1/subscriptions, GET /v1/customers/:id/invoices). Declares 60-day deprecation window — old param logs warning until 2026-07-01, returns HTTP 400 after. Before/after JSON sample. Notes that SDK v3.4+ auto-handles. Agent also drafts separate [Action Required] email to affected customers and a status-page note timed to the deprecation deadline.
The agent produces:
Use the Linear pattern: dated entry, 1-line headline, 3-5 bullets max. Skip the email blast unless something is genuinely user-impacting. The in-app changelog is enough.
Use the Tailwind / Figma pattern: long-form blog post for the hero, with named feature sections, before/after screenshots, and a TL;DR at the top. Bury minor items in a collapsed section at the bottom or link to the developer changelog for details.
Use the noise filter (Step 2). When in doubt, ask: would a customer notice this if we didn't tell them? If no, drop it. The exception is anything touching auth, billing, or data — those get mentioned even if the change is invisible.
Replace every "Added" / "Updated" / "Implemented" verb with the user's verb. "Added a filter" → "Filter the inbox by sender". Run the rewrite as the very first pass, before categorization — once the verbs are right, the rest follows.
No. Email blasts have a fatigue cost. Send for: (1) hero releases, (2) breaking changes, (3) anything that changes the user's billing or workflow defaults. Weekly UI polish does not need an email — let the in-app changelog handle it.
Tier-segment the email. Free users get the marketing-tone note about consumer features. Enterprise gets a calmer note that highlights compliance, security, audit log, and SSO changes — and never mentions consumer features they don't have access to.
Added/Changed/Fixed from git-cliff or release-please. Customer-friendly rewrites are wrong tone for this audience.