Stop writing 'improved the experience': writing release notes for vibe projects
'Improved the experience, fixed known issues' says nothing wrong and tells users nothing. This guide gives a five-section structure for three reader groups, good-versus-bad examples, a four-step workflow from code changes to notes, five common pitfalls, a ten-phrase ban list, and a copy-ready template.

Start with a real release note, then decide whether to keep reading

"Improved the experience and fixed known issues." You have certainly seen this sentence, and at some point certainly felt frustrated by it: nothing in it is wrong, but it tells you nothing. You do not know which feature "the experience" refers to, whether the "known issues" include the bug you reported last week, or whether this update requires you to reconfigure anything, retest anything, or worry about features you already use. Release notes written this way are not lazy writing; they come from never thinking through whom release notes are for and what they are for. This guide solves that problem: writing release notes for your vibe project that users can understand, act on, and trust.
First, the boundaries, because several neighbouring guides on this site are easy to confuse. The developer-documentation guide is about "how to explain the product clearly," aimed at developers who want to understand the product in depth. The last-hour launch runbook is about "what to execute at the moment of release," aimed at the release-day operator. The CHANGELOG mentioned in the solo Git workflow is about "what was recorded at the code level," aimed at the repository's internal change record. This guide is about a third thing: user-facing release notes — the few lines users see in update prompts, website announcements, and in-app banners. Its readers are not developers or release operators but users deciding "should I update, should I retest, should I contact support?" Different readers mean completely different writing.
Three readers, three different questions
Release notes usually have to answer three groups of readers at once. Ordinary users care about one thing: what does this update change for me? They do not need to know which module you refactored, only which feature changed, which bug was fixed, and whether they need to do anything. Power users and administrators care about something else: are there breaking changes? Do I need to change configuration? Do I need to retest integrations? They have more patience than ordinary users but far less tolerance for vagueness. Support staff care about a third thing: when users ask about this update, can I answer directly from the release notes? If the notes are vague, support must dig through code and ask developers, and support costs rise immediately.
What the three groups share is that none of them cares about "what you did," only about "what I should do." The writing principle for release notes can be compressed into one sentence: start from the user's action, not from the developer's work. Do not write "refactored the payments module"; write "the payments page loads faster, and the occasional duplicate-charge warning has been fixed." Do not write "upgraded dependencies"; write "this update needs no action from you and works immediately after updating." Every sentence should be able to answer "so what?": so what should the user do? "Nothing" is itself valuable information, because stating "no action needed" explicitly is better than leaving users to guess.
A structure you can copy: five sections
Below is a recommended five-section structure, to be followed in order; any missing section should be a deliberate decision, not an accidental omission. Section one is a one-sentence summary: the single most important thing users should know about this update, in no more than two lines. For example: "This update mainly fixes garbled Chinese filenames in exports and adds filtering boards by owner." Section two is "Added": new features users can use directly, one sentence each, stating where to find them. Section three is "Improved": places that became faster, steadier, or easier to use, again tied to specific features — never an unverifiable claim like "overall performance improved." Section four is "Fixed": problems users reported, described in terms users can recognise, not internal ticket numbers. Section five is "Please note": breaking changes, configuration changes, and places needing retesting. If this section is empty, write explicitly "this update contains no breaking changes" rather than omitting it, because omission will be read as "the author forgot."
Security fixes need separate handling. A security update should not be buried in "Fixed" as a passing line but given its own section stating the affected scope, whether users must update immediately, and whether they must change passwords or sign in again. If security details cannot yet be disclosed, write clearly "details will be published once the fix has reached most users" rather than being vague. Security release notes are read not only by users but by security researchers and administrators, who need an accurate scope, not reassuring wording.
Version numbers and dates matter equally. Every release note should carry a version number, a release date, and an applicability scope: is this update for all users or rolling out in stages? Is it a forced update or an optional one? For staged rollouts, state the rollout pace and how users can confirm whether they have received it. These details look trivial, but they are the only basis on which users can judge "is the version I see the latest?" Release notes without a version number are like news without a date: readers cannot tell whether they still apply.
Good versus bad: the same change, two versions
Start with bad versions, then their good counterparts. Bad: "Improved the export feature, fixed several issues, increased stability." The problem is not that it is wrong but that it cannot be verified, acted on, or asked about. Users do not know what changed in exports, support does not know which "several issues" are meant, and administrators do not know whether the stability improvement means they must retest.
Good: "Exports: fixed garbled Chinese filenames when exporting as a compressed file; exported filenames now match exactly what you see in the project. Boards: added filtering by owner, via the filter button at the top right of the board. Stability: fixed a save-failure message that occasionally appeared on weak networks; failures now state clearly which content was not saved. This update contains no breaking changes and needs no configuration changes from you." Every sentence here can be verified, acted on, and quoted directly by support. It is not much longer, but its information density is completely different.
Now breaking changes. Bad: "Some interfaces have been adjusted, please note." That says nothing: which interfaces, how adjusted, how long the old ones will work? Good: "From 2.4.0, the export interface's date parameter uses ISO format; the old format will stop working in 2.6.0. If your scripts call the export interface, switch to the new format before 2.6.0; a migration example is linked in the documentation." Breaking-change notes must contain four elements: what changed, whom it affects, how long the old behaviour remains available, and where the migration method lives. Missing any one means users discover the problem only after upgrading, when the release note has already lost its purpose.
Another common mistake is writing release notes as marketing copy. Phrases like "a brand-new experience, arriving with a bang" belong in promotional material, not release notes. Release-note readers are people making decisions, not people to be persuaded. Marketing language lowers the credibility of release notes: once users discover that a "groundbreaking update" fixed only a small bug, they will skip your notes next time. Trust is the only asset release notes have, and marketing language is the fastest way to spend it.
From code changes to release notes: a workflow
Good release notes should not depend on recalling everything on release day but should flow through a pipeline from code changes to notes. The recommended workflow has four steps. Step one, label during development: every merged request is tagged as Added, Improved, Fixed, Security, or Breaking, and requests with unclear tags are not merged. This feels cumbersome at first, but it spreads the cost of writing release notes across the whole development cycle instead of concentrating it on release day. Step two, summarise before release: the owner collects tagged changes into a draft, removes internal changes users do not care about (such as dependency upgrades and formatting changes), and arranges the rest in the five-section structure. Step three, read it as someone else: find a person who did not work on this release and ask three questions — do you know what this update changes for you? Do you know whether you need to do anything? Is there any term you do not understand? If any question cannot be answered, revise. Step four, archive after release: store the notes with their version number so users can look up historical notes by version rather than seeing only the latest entry.
For a solo team this process can be compressed but the "read it as someone else" step cannot be skipped. The biggest risk for a solo team is "author equals reader": when you write, you know the background, so every sentence feels clear, but users do not share your background. The substitute reader need not be a professional editor; it can be a real user, a friend, or simply yourself three months later: if the future you reading this sentence can still tell which feature it refers to, keep it; if not, change it now.
On tooling, no complex system is needed. A simple template file suffices: copy the template for each release, fill in the five sections, have the owner review it once, then publish the same content to update prompts, website announcements, and in-app banners. Content must stay consistent across channels; a website saying one thing and the app saying another damages trust more than incomplete content, because users no longer know which one to believe.
The five most common pitfalls
First, listing features without impact. Release notes list ten new features but never say whether users must reconfigure or retest. The fix is to add an "impact on you" line at the end of each section — including "no impact" where that is true.
Second, writing for outsiders in insider terms. Ticket numbers, module names, and abbreviations mean nothing to users. The fix is to translate terms into phenomena users can recognise: not "fixed ticket 3842" but "fixed garbled Chinese filenames on export." Internal numbers may sit in parentheses as supplements but cannot replace the phenomenon description.
Third, hiding breaking changes in the last paragraph. Users often read only the first two sections, so a breaking change buried at the end is effectively unannounced. The fix is to put breaking changes first, or to state directly in the summary that "this update contains breaking changes; please read the 'Please note' section before upgrading."
Fourth, being vague about security updates. A security fix without scope or urgency leaves users unable to judge priority. The fix is a dedicated security section stating scope, recommended action, and when details will be published.
Fifth, failing to archive. Users wanting to check what changed three months ago can find only the latest note. The fix is to archive every release note by version, keep a history list on the website, and keep at least the last five notes reachable inside the app.
A language checklist: ten sentences to delete, and their replacements
The language quality of release notes often depends on what you delete. Ten sentences below should be removed from your template outright and replaced as follows. First, "improved the experience" becomes a specific feature plus a specific change, such as "board loading time dropped from an average of 3 seconds to under 1 second." Second, "fixed known issues" becomes a user-recognisable phenomenon, such as "fixed garbled Chinese filenames on export." Third, "increased stability" becomes a verifiable fix, such as "fixed save-failure messages not appearing on weak networks." Fourth, "a brand-new experience" becomes the new feature's entry point and usage. Fifth, "some features have been adjusted" becomes a list of adjustments and their scope. Sixth, "please note" becomes a concrete action, such as "please back up your export scripts before upgrading." Seventh, "stay tuned" belongs in previews, not release notes — delete it. Eighth, "we have been working hard" belongs in acknowledgements, not change descriptions — delete it. Ninth, any subject-less passive sentence such as "has been fixed" becomes "we fixed [specific problem]." Tenth, any note without a version number or date gets both added before publishing. This checklist can sit beside your release template, ticked item by item at review: if any banned sentence remains unrevised, the note is not finished.
A template you can copy directly
Version: 2.4.0. Release date: October 25, 2026. Scope: all users, rolling out over three days. Summary: this update mainly fixes garbled Chinese filenames in exports and adds board filtering by owner. Added: boards now support filtering by owner, via the filter button at the top right of the board. Improved: save-failure messages on weak networks are now clearer and state which content was not saved. Fixed: garbled Chinese filenames when exporting as a compressed file; boards occasionally not refreshing after filtering. Please note: this update contains no breaking changes and needs no configuration changes from you; if your scripts call the export interface, its format is unchanged and you can upgrade directly. Security: this update contains no security fixes. This template has no fancy wording, but it answers every question users actually ask: what changed, what it means for me, whether I must do anything, and whether it is safe. Save it as your release template and fill it in each time — that alone is an acceptable release note.
Closing: release notes are the cheapest trust you have with users
Users will not pay extra because your release notes are well written, but they will trust you a little less each time the notes are vague. Trust drains cumulatively: after one "improved the experience," users still explore on their own; after three, they stop reading your notes, stop preparing for upgrades, and blame you first when something breaks. Conversely, notes that consistently state "what changed, whom it affects, and what you must do" quietly become an information source users are willing to rely on. Writing release notes is not the finishing chore of a release process but the cheapest trust investment you have with users: twenty minutes of clarity saves support ten explanations, users three mistaken operations, and yourself one emergency fix.
Comments (0)
Related articles

Merging an agent change untested outsources verification to your users. This guide sets a merge gate for vibe projects: static gates, contract tests, golden paths, migration rehearsal, visual spot checks, and performance smoke — unfinished means no merge — plus a lightweight ten-check starter version.

Switch sessions or models and an agent forgets your project all over again. The fix is not more patient explanations but a handover pack in the repo: a one-pager, architecture map, decision records, no-go list, verification commands, task queue, and a handover ritual — readable in ten minutes, actionable immediately.

When an agent changes 23 files and breaks 4 tests, the worst response is asking it to fix things again right away. This guide gives a field-triage flow: freeze and preserve evidence in five minutes, grade changes rather than files, rescue in a worktree quarantine zone, roll back at file, hunk, or branch level, and re-admit the agent under three constraints.