Release notes your customers read are notes that answer their questions ("what does this change for me?", "does anything break?") rather than notes that list your work. You don't get them by reformatting the git log: you get them by deriving the customer-visible impact from the actual content of the changes, then writing it in the customer's own vocabulary. One release is enough to see the difference.
Before: what your commits say
Here is the raw material of an ordinary release, straight out of git log. The example is illustrative; the noise level is faithful to most teams' reality.
fix
bump deps
feat: export v2 endpoint
PR feedback
refactor invoice numbering
fix again
wip pagination
Merge branch 'hotfix/csv-separator'
Eight commits: three that say nothing ("fix", "wip", "PR feedback"), one hotfix merge, and two titles that are accurate but written for developers. Publishing this list, even cleaned up and grouped by label, amounts to sending customers the team's logbook. They won't find what concerns them, or what they need to do. Two releases later, they stop reading.
After: the same release, in customer language
The note the customer was waiting for fits in four lines:
Accounting export v2. A new export endpoint is available; the old one keeps working. ⚠ CSV separator. Exports now use semicolons. If your import is configured for commas, adjust it before your next sync. Invoice numbering. Numbering stays identical; its internal mechanics were consolidated, no action needed on your side. Fixes. Two display errors were corrected in list pagination.
Compare line by line with the git log: the most important information in the release (the CSV separator change that can break imports) was buried in a hotfix merge with no description. It appears in no commit message. It appears in the diff.
The three rules of customer language
The example above applies three rules, and they are enough.
Speak impact, not implementation. "Refactor invoice numbering" describes the work; "numbering stays identical, no action needed" describes the consequence. Customers don't want to know what you did: they want to know what changes in their day, including when the answer is "nothing".
Use the vocabulary of the symptom. A customer says "my import fails", never "the default separator changed". A readable note uses their words (import, sync, invoice) because those are the words they'll search for, in your changelog and with your support team.
Say what to do. Every change that requires an action names it ("adjust your import before the next sync"); every change that requires none says so too. That precision is what turns the note into a tool, and what prevents the ticket.
None of these rules is a writing talent. They are operations on accurate information, which you first have to possess. A commit named "fix" carries neither the impact, nor the symptom, nor the action. Generators that read commit messages inherit that silence; the only layer that always contains the information is the content of the changes themselves.
Derive impact from diffs, not messages
This is DeployIt's approach. DeployIt reads your real code (resynced on every push), your git history (commits + diffs) and your customer data through its own MCP servers, and checks the code before asserting anything. The CSV separator hotfix is invisible in the messages; in the diff, the changed constant, the touched file and the adjusted test point unambiguously to a customer-visible behavior change. From there, your project's product expert can write the impact line, in the right vocabulary, with the right instruction.
The payoff shows on the bad weeks. When commits are well named, a good template generator does fine; when they're called "fix again" (crunch week, Friday hotfix, an AI agent's commit), a note derived from diffs stays complete. The quality of your release notes stops depending on the naming discipline of the worst day of the month.
"Does anything break?"
That's the question customers put to your notes before any other, and the real test of "customer language": the answer must be visible at a glance, not deduced. Hence the flagged line at the top of the note, reserved for changes that require action. A release with no breaking change says so as well ("nothing to do on your side"): silence forces the customer to re-read the whole list to make sure.
For integrators and APIs the question has its own depth; we devoted a full article to breaking changes detected from diffs. At the release-notes level, keep the contract: the breaking change first, the action to take, then the rest.
Your customers are no longer the only readers
AI agents connected to your product (your support bot, a customer's internal assistant, an integration agent) read your release notes to know whether anything changed since their last answer. A vague note makes them answer wrong; an accurate note becomes a machine interface. DeployIt's MCP server, in early access through its design partner program, goes one step further: instead of reading a page, the agent queries the same source your notes come from and gets a fresh, dated answer, sourced from the diffs.
Same logic on the human side: a help center regenerated from code describes the current release, not the one from three months ago. Notes, help center, agent answers: three readings of the same history, none rewritten by hand.
"We paste the git log into ChatGPT and it rewrites it"
It's the most tempting setup, and for a one-off release it helps: a language model rephrases well, groups by theme, adopts a customer tone. Keep that reflex for emergencies. Its limits are its input's limits: the model only sees your commit messages, so it rephrases their silences ("fix" becomes "various fixes", the CSV hotfix disappears), and it has no way to verify a claim in the code. You also start over every release: paste the right range, proofread closely. A generation wired to the repository reads the diffs, verifies before writing, and runs on every deploy without anyone thinking about it.
"So this tool reads my whole repository"
Yes, reading the repository is its raw material, and the perimeter is bounded by four guardrails. The GitHub connection is read-only; it is revocable at any time. Each project gets its own server, blind to the others. And what comes out is a derivation (notes, answers, impact lines), not raw source code handed to whoever asks. Your customers read that the separator changed; the export pipeline never leaves the repository. To place the offer among its neighbors: Context7 and DeepWiki cover libraries and public repos, Mintlify generates an MCP server from written docs; DeployIt covers your private product, derived from the code itself, fresh on every deploy.
Mini-FAQ
Should we rewrite our old notes? No need: start with the next release. Derived notes coexist fine with a hand-written archive.
Can we review before publishing? Of course, and that's the right setting: generation supplies material derived from the diffs, your review keeps control of tone and visibility. Reviewing takes minutes when there's nothing to reconstruct.
What if a release changes nothing for customers? The note says so in one line. That's information in itself: a customer who knows there's nothing to check trusts you more on the next release, the one that carries an instruction.
Do these notes replace the multi-audience work? They're its first view. Customer changelog, internal note and support answers can all derive from the same source, each at its own altitude.
The note customers read is the one nobody drafted
The paradox isn't one: the readable note is the one that starts from complete information (the diffs) rather than declared memory (the messages). Derive the impact, write it in the customer's words, flag the breaking change on top. DeployIt is free during early access; paid plans arrive in January 2027. And if your agents should answer from the same source, the design partner program is open.
Continue reading
How Do You Write Release Notes for Multiple Audiences Without Rewriting Them Three Times?
Customer changelog, internal note, support answers: three rewrites of the same release. The way out: derive those views from one source — your git history.
MCP vs RAG: Which Approach for Codebase Knowledge?
RAG indexes a snapshot of your code; MCP lets the agent explore the repository at question time. What each approach sees, what it misses, and when to combine them.
Did the API Change This Week? Spotting Breaking Changes in Real Diffs
The integrator's weekly question: where breaking changes hide when the changelog says nothing, and how to answer from the real diffs.