Skip to content

A changelog tool for dev tool and API companies.

A changelog that closes the loop.

Your users ask for something. Your team ships it. The person who asked gets told. Entries are drafted from merged pull requests, held for your review, and published to a JSON feed or a two-line widget inside your product.

Free for one repository. No card required.

acme.dev/changelog
  1. Appearance

    Dark mode is here

    Turn it on in Settings, or let it follow your system theme.

    Posted to issue #482, where it was asked for

  2. API

    Webhooks retry for 24 hours

    Failed deliveries retry with backoff, and every attempt shows in the dashboard.

  3. Fix

    CSV exports keep your time zone

    Timestamps in an export now match the ones in the app.

What your users read. Drafted from the merged pull request, published once you approve it.

  • Public JSON feed on every plan
  • Widget embed is two lines
  • Drafts wait for review by default
  • Free for one repository, no card
JSON FEED

Your changelog, rendered by your own code

The feed is a plain public endpoint with CORS open to any origin, so you can read it from a page, a build step or curl. Ten lines of React and your changelog is part of your product instead of a link away from it.

  • Filter by repository, page with a cursor, up to 50 entries a call
  • Strong ETag and a 60 second Cache-Control, so an unchanged feed answers 304
  • A roadmap feed too, in three fixed columns: planned, building, shipped
Every endpoint, field and status code is in the developer docs
Changelog.tsx
const ID = 'YOUR_ID';
const API = 'https://api.changeloop.dev';

export function Changelog() {
  const [entries, setEntries] = useState([]);
  useEffect(() => {
    fetch(`${API}/v1/public/${ID}/changelog.json`)
      .then((r) => r.json())
      .then((feed) => setEntries(feed.data));
  }, []);
  return entries.map((e) => <Entry key={e.id} {...e} />);
}
WIDGET

Or embed it in two lines

A custom element that renders into a shadow root, so it neither inherits your styles nor leaks into them. It carries three tabs: your updates, your roadmap, and a box your users can write in.

  • Two attributes, your feed id and the API origin
  • Pin a version and its bytes never change, or take the newest build automatically
  • No npm package, no build step, no key to rotate
UpdatesRoadmapFeedback
  1. Appearance

    Dark mode is here

  2. API

    Webhooks retry for 24 hours

  3. Fix

    CSV exports keep your time zone

index.html
<script src="https://api.changeloop.dev/widget.js"
        defer></script>

<changelogapp-widget
  data-public-id="YOUR_ID"
  data-api="https://api.changeloop.dev"
></changelogapp-widget>
DRAFTING

Drafted on merge, held for a human

A pull request merges into your default branch. Changeloop reads its title and description and writes an entry for the people who use your product. Your source code is never part of that.

  • Dependency bumps, CI work and refactors are filtered out before anything is drafted
  • Drafts sit in the review inbox, where you edit the wording, approve, or discard
  • Auto-publish is there per repository, off until you switch it on
yourteam/webapp
Pull request merged
Draft written
In review
Published
feat(ui): add dark theme toggle (#517)
DRAFT · REVIEW

Dark mode is here

Turn it on in Settings, or let it follow your system theme.

ApproveEditSkip
FEEDBACK

A request arrives as an issue and leaves as an entry

On GitHub, the widget's feedback box opens a labelled issue in your own repository, so it lands in the triage you already do. Merge a pull request that says fixes #12, approve the entry, and we comment on that issue with a link to what shipped.

  • Three labels on every issue: bug or feature-request, a priority, and from-widget
  • The sender's email address never reaches the issue, or the model that classifies it
  • They check the status themselves in the widget. We do not send them an email yet.
acme/web · issue #482

Dark mode, please

feature-requestpriority:mediumfrom-widget

Filed automatically from the feedback widget.

Shipped: Saved views on the inbox

What every plan includes

Changelog JSON feed

Published entries, newest first, filterable by repository and paged with an opaque cursor.

Roadmap JSON feed

Planned, building and shipped, always in that order, driven by labels on your own GitHub issues.

Embeddable widget

A custom element in a shadow root, with updates, roadmap and feedback in three tabs.

A hosted page, as a fallback

A plain page for your feed, for before you have built your own and for the links we leave on issues.

Drafted from merged pull requests

The title and description of a merge become a customer-facing entry. Not the code.

Review inbox

Edit the wording, approve, or discard. A discarded draft can be restored later.

Internal changes filtered out

Dependency bumps, CI changes, refactors and typo fixes never reach the queue.

Feedback in your own GitHub repository

On GitHub, widget submissions open labelled issues in your repo, with the sender's email address stripped out. GitLab and Bitbucket projects feed the changelog only.

Flat team pricing

One price for unlimited repositories on the Team plan. No per-repository tax.

Questions an engineer asks first

Can I render the changelog in my own UI?

Yes, and that is the point. Every published entry is served from a public JSON feed with CORS open to any origin, no key and no sign-in, so ten lines of React is enough to render it in your own components. The developer docs carry every endpoint, field and status code.

What does the widget need from me?

A script tag and one element with two attributes, your feed id and the API origin. It renders into a shadow root, so your CSS and its CSS never meet. It shows updates, roadmap and a feedback box.

What does Changeloop read from my repository?

On GitHub, the title and description of pull requests that merge into your default branch, plus repository metadata. The GitHub App has no permission to read your repository's files, every Changeloop build is checked to make sure it never requests a diff, and anything that looks like a secret is removed before a draft is written. It works through short-lived installation tokens rather than a personal access token. GitLab and Bitbucket send the same kind of data through a webhook you add.

Does anything publish without me?

Not unless you ask for it. Drafts wait in the review inbox until someone approves them, and auto-publish is a per-repository switch that stays off until you turn it on.

What happens to feedback my users send?

On GitHub, it opens a labelled issue in your own repository, tagged bug or feature-request with a priority and a from-widget label, so it lands in the triage you already do. A GitLab or Bitbucket project feeds your changelog, but not this. Filing an issue needs an access token we deliberately do not ask for, and Bitbucket removed its issue tracker in August 2026. The sender's email address is stripped before the message reaches that issue or the model that classifies it. When you approve the entry that ships it, we comment on the issue with a link to what shipped, and the sender can see the status in the widget. We do not send them an email, that part is not built yet.

What is free and what is paid?

The free plan covers one repository with 20 AI generations a month, and it includes the changelog feed, the roadmap feed, the widget and the hosted page. The Team plan is one flat price for unlimited repositories.

Put your changelog inside your product.

Create a free account, connect one repository, and point your own UI at the feed.