You shipped something. Your users have no idea what changed.
WhatShipped turns your git history into a readable changelog — but the real question is: how do you actually get that changelog into your product?
Here's every way you can do it today, and what's coming.
The simplest path: Markdown export
Every changelog you generate on WhatShipped can be exported as a .md file.
Drop it in your repo, your docs folder, your Notion workspace — wherever your users look for updates.
/your-project
├── CHANGELOG.md ← just paste it here
├── src/
└── ...
Zero friction. Works with any stack, any deployment, any workflow. If you just want something out the door, this is your path.
One step up: the WhatShipped API
Generate your changelog programmatically. Hit the API, get structured output, render it however you want.
Your design system, your components, your branding. WhatShipped handles the content — you own the presentation.
A minimal example:
const res = await fetch('https://whatshipped.dev/api/v1/release-notes/generate', {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"provider": "github",
"repoFullName": "owner/repo-name",
"fromRef": "v1.0.0",
"toRef": "v1.1.0",
"versionTag": "v1.1.0",
"productName": "My App",
"tone": "professional"
}),
});
const { changelog } = await res.json();
You get back structured content you can render anywhere — a /changelog route, a modal, a sidebar widget. Whatever fits your product.
A pattern I like for Next.js projects
Here's a concrete integration that works well:
- Call the WhatShipped API at build time
- Store the response as a static JSON file
- Render a
/changelogroute from it
// scripts/fetch-changelog.js
import fs from 'fs';
const res = await fetch('https://whatshipped.dev/api/v1/release-notes/generate', { ... });
const data = await res.json();
fs.writeFileSync('./public/changelog.json', JSON.stringify(data));
// app/changelog/page.jsx
import changelog from '@/public/changelog.json';
export default function ChangelogPage() {
return (
<main>
{changelog.entries.map(entry => (
<article key={entry.version}>
<h2>{entry.version}</h2>
<p>{entry.date}</p>
<ul>
{entry.changes.map((change, i) => (
<li key={i}>{change}</li>
))}
</ul>
</article>
))}
</main>
);
}
Your changelog is always in sync with your latest release. No manual work, no copy-pasting.
Coming next: webhooks
The goal is full automation — push to main, changelog gets generated and delivered wherever you need it.
The planned webhook flow looks like this:
git push → WhatShipped webhook → your endpoint
↓
update your changelog page
post to Slack
update your docs site
...
No human in the loop. The changelog becomes a side effect of shipping, not a task on your to-do list.
If this would unblock your workflow, let me know — real demand shapes the roadmap.
Try it
👉 whatshipped.dev — 1 free generation on signup, no credit card required.
Connect your GitHub repo, point it at a date range or set of commits, and you'll have a changelog in under a minute.
What integration would unblock you the most? Drop a comment — I read everything and it directly influences what I build next.
Top comments (0)