<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>ReleasesHQ Blog</title>
    <link>https://releaseshq.com/blog</link>
    <description>Notes on shipping software and telling people about it, from the team building ReleasesHQ.</description>
    <language>en</language>
    <atom:link href="https://releaseshq.com/blog/rss.xml" rel="self" type="application/rss+xml" />
    <lastBuildDate>Sat, 19 Sep 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>How to automatically generate release notes</title>
      <link>https://releaseshq.com/blog/generate-release-notes</link>
      <guid isPermaLink="true">https://releaseshq.com/blog/generate-release-notes</guid>
      <description>Generating release notes from GitHub is solved. Here is what still is not, and why the drafts come out generic.</description>
      <dc:creator>Gagan Varma</dc:creator>
      <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Three ways, in order of effort.</p>
<p>GitHub’s own generator produces a list of merged pull request titles for a tag. A conventional-commit tool like release-please sorts those into categories. A language model reads the pull requests and writes prose a customer can understand. The third is the only one that gets you something close to publishable, and it’s already sitting in your terminal.</p>
<p>So the useful question isn’t how to generate release notes. It’s what to do about everything generation leaves behind.</p>
<h2 id="you-can-already-do-this-in-your-terminal">You can already do this in your terminal</h2>
<p>Open the agent you use for everything else and ask it to read the merged pull requests since last Tuesday and write release notes. It will. The output will be decent.</p>
<p>Pretending otherwise would be silly, so start there. Generation is free now. What you get back is a block of text on your screen, produced by a prompt you have to remember to write every time.</p>
<p>Everything difficult about release notes survives that prompt intact.</p>
<h2 id="what-the-terminal-version-does-not-know">What the terminal version does not know</h2>
<p><strong>Where the last one stopped.</strong> The unglamorous one, and probably the first to break. You ask for last week’s changes, and it gives you last week’s changes. But your previous update went out three weeks ago and only covered work merged up to that point. The fortnight in between is now unannounced, and nothing in the prompt knows that. Either you repeat yourself or quietly drop two weeks, and the only thing standing between you and both is a date you’re holding in your head.</p>
<p><strong>Which changes count.</strong> It will happily write you a paragraph about a dependency bump if the pull request was verbose enough, and agent-written pull requests are always verbose enough.</p>
<p><strong>Who is reading.</strong> Without that context, every draft is written for a generic software buyer, and every product’s update starts to sound the same.</p>
<p><strong>Where it goes next.</strong> Text in a terminal isn’t an update. Somebody still has to put it on a page, in the product, and in front of people who aren’t looking for it.</p>
<h2 id="the-input-stopped-being-the-problem">The input stopped being the problem</h2>
<p>All the advice from a few years ago said the same thing: write better pull request descriptions and the generated notes improve.</p>
<p>That advice is finished.</p>
<p>Agents write the descriptions now, and they write more than any human bothered to. What changed, what it touched, why, the edge cases, often a test plan. The raw material is richer than it has ever been.</p>
<p>What didn’t change is who it’s written for. All of that detail exists to help a reviewer approve a merge. None of it exists to help a customer decide whether they care.</p>
<p>A description can be thorough, accurate, four paragraphs long, and contain no sentence you could publish.</p>
<p>So the bottleneck moved. It used to be thin input. Now it’s volume. Forty well-documented pull requests are harder to sort than forty terse ones, because every one of them looks substantial.</p>
<h2 id="not-every-change-is-an-update">Not every change is an update</h2>
<p>Two filters, and most people only think about one.</p>
<p>The first is mechanical. Anything matching chore, ci, bump, deps, refactor, typo, wip, or merge is not an update. Deciding that takes no judgment. It’s a pattern list, so it should run before anything reads the changes properly, and it removes most of the pile on its own.</p>
<p>The second is editorial and can’t be patterned.</p>
<p><strong>Would this change what a user does tomorrow?</strong></p>
<p>If the answer is no, it stays in the repo. Leaving it there costs you nothing.</p>
<p>Six of forty going out is the system working. It isn’t a sign the week was thin.</p>
<h2 id="the-audience-is-the-part-everyone-skips">The audience is the part everyone skips</h2>
<p>A model that doesn’t know who your users are writes for a generic software buyer, which is nobody.</p>
<p>The same merged pull request isn’t the same update twice. A latency fix is real news for a developer tool and invisible to a scheduling app whose users never noticed the old latency. Write both the same way and one of them is wrong.</p>
<p>Your audience is already written down on your own homepage. Your positioning, who you say you sell to, the words you use for your own features. That context and your release notes are about the same product, but almost nobody connects them.</p>
<p>Generic output is the result, and it reads generic no matter how good the model is.</p>
<h2 id="what-still-needs-you">What still needs you</h2>
<p>A generated draft is roughly eighty percent right. The remaining twenty percent is the expensive part: the thing you merged but are holding back for a launch, the security fix you don’t want described in public, the change to your own admin tooling that has no business in a customer update.</p>
<p>You also decide what leads.</p>
<p>The model can tell you the export pipeline changed. It can’t know that three of your largest accounts have been complaining about exports for a month, and that this is the entry that goes at the top.</p>
<p>Eighty percent is an enormous amount of work removed. It is not a hundred, and treating it as a hundred is how a product announces something that doesn’t exist.</p>
<h2 id="a-setup-that-works-at-one-to-five-people">A setup that works at one to five people</h2>
<ol>
<li>Track where the last published update stopped, so the window picks up exactly there.</li>
<li>Cut the internal changes by pattern before anything reads them properly.</li>
<li>Generate a draft from what survives, with your audience as context.</li>
<li>Read it. Reorder so the thing that matters most is first. Cut what shouldn’t be public.</li>
<li>Publish to a page users can reach, then send it where your users already are.</li>
</ol>
<p>Step 4 is the only one that needs you, and it is the only one that should.</p>
<p>The gap between ten minutes and an hour isn’t about efficiency. It decides whether this happens at all.</p>
<p>A ten-minute task survives a bad week, a launch, a sick day. An hour-long one gets pushed to Friday, then to next week. After a few rounds of that, you’re not postponing a task anymore. You’re avoiding a backlog.</p>
<p>That’s how the six-week silence starts. Not with a decision. Just an hour you never had.</p>
<hr>
<p>ReleasesHQ does this end to end. It remembers where your last update stopped, strips the chore and refactor noise before anything reads the changes, and drafts the rest in plain language using your own site to work out who your users are and what they call things. You get the six that matter, not the forty, on your page and in your channels in one action. Review is on by default, and automatic publishing is a setting you turn on deliberately.</p>]]></content:encoded>
    </item>
    <item>
      <title>How to add a changelog page to your site without building one</title>
      <link>https://releaseshq.com/blog/add-a-changelog-page</link>
      <guid isPermaLink="true">https://releaseshq.com/blog/add-a-changelog-page</guid>
      <description>Five ways to get a changelog page live, what each one costs, and where each one breaks. Written for teams that move fast.</description>
      <dc:creator>Gagan Varma</dc:creator>
      <pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>You shipped something. Now you want a changelog page that lists it, and the ones before it, at a URL you can send people.</p>
<p>The obvious move is to build one. A route, a table, some markdown, a bit of styling. Two hours, maybe three. It’s genuinely not hard, which is kind of the problem. Because it’s not hard, it never gets prioritized. Six months later, the link in your footer still goes nowhere.</p>
<p>There are a few ways around this. They all have tradeoffs.</p>
<h2 id="option-1-a-markdown-file-in-your-repo">Option 1: a markdown file in your repo</h2>
<p>Create <code>CHANGELOG.md</code>, write entries newest first, commit it.</p>
<p><strong>Cost:</strong> zero. You already have the repo.</p>
<p><strong>Where it breaks:</strong> it’s for developers. The people reading a file in your repository are usually developers, and your users probably aren’t. It also doesn’t live on your marketing site, and the format naturally pushes you toward commit-level detail because that’s what a changelog file looks like.</p>
<p>You end up with a list of changes instead of a list of things a user would care about.</p>
<p>Keep it if you’re building a library. If you’re building software with a login screen, I’d look elsewhere.</p>
<h2 id="option-2-a-blog-category">Option 2: a blog category</h2>
<p>Tag posts as “updates” and point your footer at the tag page.</p>
<p><strong>Cost:</strong> near zero if you already have a blog.</p>
<p><strong>Where it breaks:</strong> blog posts feel like work. A blog post feels like it needs an intro, some structure, and a point. A release note might need two sentences.</p>
<p>Once the two get mixed together, every update starts feeling like a writing assignment. And writing assignments get skipped.</p>
<p>There’s another problem too. Your actual blog posts now sit next to things like “fixed a bug in exports.” Neither one gets the attention it deserves.</p>
<p>This can work if you ship rarely. For a product that’s shipping every week, I’d keep the two separate.</p>
<h2 id="option-3-a-hosted-doc">Option 3: a hosted doc</h2>
<p>Make a public page in a document tool, update it as you go, and link to it.</p>
<p><strong>Cost:</strong> ten minutes.</p>
<p><strong>Where it breaks:</strong> it doesn’t really feel like part of your product. It’s someone else’s domain, someone else’s design, and someone else’s branding. That’s probably fine for an internal document. It feels a little strange as the page you’re sending a prospect to.</p>
<p>It’s also easy to forget about. Anything that lives outside your normal working path tends to disappear from the routine.</p>
<p>Still, if you need something today, this is perfectly reasonable.</p>
<h2 id="option-4-build-the-page-yourself">Option 4: build the page yourself</h2>
<p>Add a route to your site. Store the entries in a database or markdown. Render them using your existing design system.</p>
<p><strong>Cost:</strong> a few hours to build. Then ongoing.</p>
<p><strong>Where it breaks:</strong> mostly after you’ve finished building it.</p>
<p>Someone has to add an editor, or you keep writing raw markdown. Someone has to deal with RSS when a user asks for it. Someone eventually has to fix the parser because a code block broke the page.</p>
<p>None of these things are particularly difficult. They’re just things you now have to maintain.</p>
<p>Build it yourself if the changelog is important enough to be part of your product experience. Otherwise, you’re probably spending time building infrastructure for something that isn’t your product.</p>
<h2 id="option-5-a-hosted-page-plus-an-embed">Option 5: a hosted page plus an embed</h2>
<p>Write the update once. It gets published to a hosted page, and the same content can appear inside your site through an embed.</p>
<p><strong>Cost:</strong> minutes to set up.</p>
<p><strong>Where it breaks:</strong> you depend on another service, and you may end up with a subdomain unless you configure your own.</p>
<p>Those are real tradeoffs. But for a small team, they’re usually less important than whether you’ll actually keep publishing.</p>
<p>The bigger advantage is that the same update can live in multiple places without being written multiple times.</p>
<h2 id="which-one-should-you-pick">Which one should you pick?</h2>
<p>I’d start with one question: <strong>is the page the destination, or is it the source?</strong></p>
<p>If it’s just a destination (a URL you send someone when they ask what’s new), pick whatever you’ll actually maintain. A simple page that’s updated every week is more useful than a beautiful one that’s been untouched for six months.</p>
<p>If the changelog is also supposed to reach existing users, things change. Now you need the same update to show up in more than one place. That’s where a hosted page plus an embed starts making more sense.</p>
<h2 id="the-embed-is-the-part-people-underrate">The embed is the part people underrate</h2>
<p>A changelog page gets read by people who go looking for it. That’s mostly prospects doing some research or existing users who already know the page exists.</p>
<p>Most users aren’t going to visit your changelog on their own. They’re inside your product trying to get something done. If you want them to see what’s new, the update needs to reach them there.</p>
<p>So think of the two as separate jobs: <strong>the page is the record, and the embed is the delivery.</strong> You want both if communication with existing users is part of the goal.</p>
<h2 id="three-things-to-get-right-on-day-one">Three things to get right on day one</h2>
<p>Whatever you choose, there are a few things that are annoying to change later.</p>
<p><strong>Pick a stable URL.</strong> <code>/changelog</code> is simple, memorable, and easy to share. Don’t put it behind a login or bury it three levels deep.</p>
<p><strong>Link to it from the right places.</strong> Put it in the footer for prospects. Put it somewhere inside the product for users.</p>
<p><strong>Set a minimum, not a maximum.</strong> Decide what the smallest acceptable update looks like. Two sentences and a date is enough.</p>
<p>The goal isn’t to create the world’s best changelog. It’s to still have one six months from now.</p>
<hr>
<p>ReleasesHQ gives you the hosted page and the embed from one publish, plus drafts generated from your merged pull requests. The script tag is one line and mounts itself.</p>]]></content:encoded>
    </item>
    <item>
      <title>Your repo moves faster than your users can follow</title>
      <link>https://releaseshq.com/blog/repo-moves-faster</link>
      <guid isPermaLink="true">https://releaseshq.com/blog/repo-moves-faster</guid>
      <description>AI agents raised how fast small teams merge code. Nothing after the merge got faster, and that gap is where products go quiet.</description>
      <dc:creator>Gagan Varma</dc:creator>
      <pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>Look at your merge history for the last month. Then look at the last thing you told your users.</p>
<p>For most teams shipping right now, those two timelines are not close. The repo is full of things that shipped. The user-facing side is probably one post from six weeks ago about a feature that has already changed twice.</p>
<p>That gap is not new. What is new is how quickly it is widening, because writing code is getting faster.</p>
<h2 id="the-merge-rate-went-up-and-nothing-else-did">The merge rate went up and nothing else did</h2>
<p>Small teams can ship a lot more code today than they could a year or two ago. A solo founder with an agent working in one window and a review queue in another can get through a pretty ridiculous amount of work.</p>
<p>But everything after the merge is still basically the same.</p>
<p>Writing the update is still manual. Figuring out what actually matters to a user is still a judgment call. Posting it in four places is still four separate things to remember.</p>
<p>The product gets faster. The communication around it doesn’t.</p>
<p>The result is a product that improves every week but still feels static from the outside.</p>
<h2 id="a-fast-product-with-no-signal-looks-abandoned">A fast product with no signal looks abandoned</h2>
<p>A product that ships slowly but communicates consistently feels like it’s moving. You see updates, you see what the team is working on, and you assume there’s more coming.</p>
<p>A product that ships constantly but says nothing feels very different.</p>
<p>You visit the website, see the same thing you saw last time, and start wondering if anyone is still working on it.</p>
<p>You end up paying for the same feature twice. Once when you build it, and again when someone emails six months later asking if the product can do something you shipped months ago.</p>
<p>Sometimes churn works the same way. People don’t necessarily leave because the product is bad. Sometimes it just stops feeling alive.</p>
<h2 id="the-problem-is-not-writing-it-is-deciding">The problem is not writing, it is deciding</h2>
<p>Most people can explain what they built in a couple of sentences.</p>
<p>The annoying part is figuring out which things are actually worth mentioning.</p>
<p>You might have forty PRs from the last month. Maybe six of them matter to a user. The rest are dependency updates, refactors, tests, migrations, and fixes that make the product better without meaning much to the person using it.</p>
<p>Someone has to sort through all of that.</p>
<p>And that’s exactly the kind of task that gets pushed to next week.</p>
<p>Then next week becomes next month.</p>
<p>Suddenly you’re looking at six weeks of changes and thinking, “Okay, I guess I need to figure out what happened.”</p>
<p>Nobody wants to do that.</p>
<p>This is why release notes pages die. Not because teams don’t care. Because starting again after a long silence is much harder than writing the update when you actually ship.</p>
<h2 id="what-actually-closes-the-gap">What actually closes the gap</h2>
<p>Three things.</p>
<p><strong>Shorten the loop to one release.</strong> Write the update close to the merge, not at the end of the month. One change is easy to understand. Twenty changes from the last six weeks are not.</p>
<p><strong>Let the machine do the sorting, not the deciding.</strong> Going through forty pull requests and figuring out which ones might matter to users is exactly the kind of work software can help with.</p>
<p>But deciding whether something is actually worth telling users? I’d keep that part human.</p>
<p>Otherwise you end up with a changelog that’s basically a Git log wearing nicer clothes.</p>
<p><strong>Publish before it is polished.</strong> An update that explains what changed and why it matters, posted the day it shipped, is more useful than a beautifully written one that never gets published.</p>
<p>That’s really the trick.</p>
<h2 id="what-good-looks-like-at-your-size">What good looks like at your size</h2>
<p>You don’t need a complicated release process.</p>
<p>If you’re one to five people, after a merge that a user would actually notice, write two sentences:</p>
<p>What changed?</p>
<p>Why should I care?</p>
<p>Put it somewhere permanent. Send it wherever your users already are. Move on.</p>
<p>The important part is doing it consistently instead of trying to reconstruct everything at the end of the month.</p>
<p>That permanent page becomes useful over time. It’s what you send when someone asks what’s new. It’s something a potential customer can look at before signing up. And eventually, it’s a record that the product has actually been moving.</p>
<p>One update doesn’t say much.</p>
<p>Fifty updates over a year says quite a lot.</p>
<h2 id="the-part-nobody-mentions">The part nobody mentions</h2>
<p>Writing the update changes how you build, too.</p>
<p>When you know you have to explain what you shipped this week, you start noticing which changes actually matter to users. It forces you to separate the work that made the product better from the work that just made the codebase better.</p>
<p>And that makes the next update a little easier.</p>
<hr>
<p>ReleasesHQ reads your merged pull requests and drafts the release notes, so the decision of what to include takes minutes instead of an afternoon. Review, publish, and it goes to your release notes page, your site, and the channels your users are already in.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
