跳到内容

面向开发者工具和 API 公司的 changelog 工具。

一个 闭环的 changelog。

用户提出需求。你的团队交付。提出需求的人得知结果。条目由合并的 pull request 生成,等待你的审核,然后发布到 JSON feed 或产品内的两行 widget 中。

1 个仓库免费。无需信用卡。

acme.dev/changelog
  1. 外观

    深色模式上线了

    在设置中开启,或让它跟随系统主题。

    已在提出需求的 issue #482 中发布

  2. API

    Webhook 失败后会在 24 小时内重试

    投递失败会按退避策略重试,每次尝试都会显示在仪表盘中。

  3. 修复

    CSV 导出保留你的时区

    导出中的时间戳现在与应用内一致。

这就是你的用户读到的内容。由合并的 pull request 起草,经你批准后发布。

  • 每个套餐都有公开 JSON feed
  • 两行代码嵌入 widget
  • 草稿默认等待审核
  • 1 个仓库免费,无需信用卡
JSON FEED

你的 changelog,用你自己的代码渲染

feed 是一个简单的公开端点,对任何来源都开放 CORS,因此你可以从页面、构建步骤或 curl 中读取它。十行 React 代码就足够了,你的 changelog 会成为产品的一部分,而不是一个链接之外的东西。

  • 按仓库过滤,用游标分页,每次调用最多返回 50 条条目
  • 强 ETag 加 60 秒的 Cache-Control,未变化的 feed 会返回 304
  • 还有一个 roadmap feed,包含三个固定列:planned、building、shipped
开发者文档中列出了每个端点、字段和状态码
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

或用两行代码嵌入

一个渲染在 shadow root 中的自定义元素,既不会继承你的样式,也不会泄漏到其中。它有三个标签页:你的更新、roadmap,以及一个供用户填写的输入框。

  • 两个属性,你的 feed ID 和 API 来源
  • 固定一个版本以确保字节永不改变,或自动获取最新构建
  • 无需 npm 包,无需构建步骤,无需轮换密钥
更新路线图反馈
  1. 外观

    深色模式上线了

  2. API

    Webhook 失败后会在 24 小时内重试

  3. 修复

    CSV 导出保留你的时区

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>
草稿

合并时生成,专为一人保留

一个 pull request 被合并到你的默认分支。Changeloop 读取其标题和描述,为使用你产品的人撰写一条条目。你的源代码始终不会参与其中。

  • 依赖更新、CI 任务和重构会在任何内容生成之前被过滤掉
  • 草稿在审核收件箱中等待,你可以在那里编辑文本、批准或丢弃
  • 自动发布按仓库设置,在你打开之前默认关闭
yourteam/webapp
Pull request 已合并
草稿已生成
审核中
已发布
feat(ui): add dark theme toggle (#517)
草稿 · 审核

深色模式上线了

在设置中开启,或让它跟随系统主题。

批准编辑跳过
反馈

请求以 issue 的形式进入,以条目的形式离开

在 GitHub 上,widget 的反馈框会在你自己的仓库中打开一个带标签的 issue,因此会进入你已有的分类流程。合并一个写有 fixes #12 的 pull request,批准该条目,我们就会在该 issue 上添加一条带链接的评论,指向已交付的内容。

  • 每个 issue 有三个标签:bug 或 feature-request、一个优先级和 from-widget
  • 发送者的邮箱地址永远不会到达 issue 或对其进行分类的模型
  • 他们会自己在 widget 中查看状态。我们目前还不会给他们发送邮件。
acme/web · issue #482

请加入深色模式

feature-requestpriority:mediumfrom-widget

自动从反馈 widget 提交。

已交付:收件箱中已保存的浏览记录

每个套餐都包含

changelog 的 JSON feed

已发布的条目按从新到旧排列,可按仓库过滤,并用不透明的游标分页。

roadmap 的 JSON feed

始终按 planned、building、shipped 的顺序排列,由你自己 GitHub issue 上的标签驱动。

可嵌入的 widget

一个位于 shadow root 中的自定义元素,用三个标签页展示更新、roadmap 和反馈。

托管页面,作为备用方案

一个展示你 feed 的简单页面,适合在你搭好自己的界面之前使用,也是我们在 issue 上留下的链接所指向的地方。

根据已合并的 pull request 起草

合并的标题和描述会变成一条面向用户的条目。不涉及代码。

审核收件箱

修改措辞,然后批准或丢弃。丢弃的草稿之后还可以恢复。

过滤掉内部变更

依赖升级、CI 变更、重构和拼写修正永远不会进入队列。

反馈进入你自己的 GitHub 仓库

在 GitHub 上,widget 提交的内容会在你的仓库中打开带标签的 issue,并去掉发送者的邮箱地址。GitLab 和 Bitbucket 项目只为 changelog 提供内容。

团队统一定价

Team 套餐一个价格,仓库数量不限。不按仓库额外收费。

开发者最先会问的问题

我能在自己的 UI 中渲染 changelog 吗?

可以,这正是设计初衷。每条已发布的条目都通过一个公开 JSON feed 提供,CORS 对任何来源开放,无需密钥,也无需登录,所以十行 React 代码就足以在你自己的组件中渲染它。开发者文档中列出了每个端点、字段和状态码。

使用 widget 需要我做什么?

一个 script 标签,加上一个带两个属性的元素:你的 feed ID 和 API 来源。它渲染在 shadow root 中,因此你的 CSS 和它的 CSS 互不干扰。它会展示更新、roadmap 和一个反馈框。

Changeloop 会从我的仓库中读取什么?

在 GitHub 上,是合并到默认分支的 pull request 的标题和描述,以及仓库元数据。GitHub App 没有读取你仓库文件的权限,Changeloop 的每次构建都会经过检查,确保它从不请求 diff,任何看起来像密钥的内容都会在撰写草稿之前被移除。它通过短期有效的安装令牌运行,而不是个人访问令牌。GitLab 和 Bitbucket 则通过你添加的 webhook 发送同类数据。

会不会在我不知情的情况下发布内容?

除非你主动开启,否则不会。草稿会在审核收件箱中等待,直到有人批准;自动发布是按仓库设置的开关,在你打开之前一直关闭。

用户发送的反馈会怎样处理?

在 GitHub 上,它会在你自己的仓库中打开一个带标签的 issue,带有 bug 或 feature-request 标签、一个优先级和 from-widget 标签,因此会进入你已有的分类流程。GitLab 或 Bitbucket 项目可以为你的 changelog 提供内容,但不支持这一功能:创建 issue 需要一个我们有意不索取的访问令牌,而且 Bitbucket 已于 2026 年 8 月移除了其 issue 跟踪器。发送者的邮箱地址会在消息到达该 issue 或对其进行分类的模型之前被去除。当你批准交付该内容的条目时,我们会在该 issue 上添加一条评论,附上已交付内容的链接,发送者可以在 widget 中查看状态。我们不会给他们发送邮件,这部分功能尚未构建。

哪些免费,哪些收费?

Free 套餐包含一个仓库,每月 20 次 AI 生成,并包括 changelog feed、roadmap feed、widget 和托管页面。Team 套餐以一个固定价格提供不限数量的仓库。

把你的 changelog 放进你的产品中。

创建一个免费账户,连接一个仓库,并将你自己的界面指向该 feed。