Changelog as a service with an editor, a public page and a notification widget, aimed at teams who want release notes without touching their own site.
Build me a changelog that replaces Headway: what shipped, told to the people using the thing that shipped, without them going looking. STACK - Node 20+ with Fastify, server-rendered HTML - SQLite through better-sqlite3, WAL mode - One small widget script for the in-app badge, under 8KB - Caddy in front THE DATA MODEL - entries: id, slug, title, body_md, kind, published_at, created_at, author_id, cover_path, is_major - kinds: new, improved, fixed. Three, not seven — a taxonomy nobody can apply consistently is noise - tags: id, name, colour; entry_tags joining table - readers: id, key_hash, last_seen_entry_id, first_seen, last_seen — who has seen what, without an account - subscribers: id, email, verified_at, unsubscribed_at, digest_kind - views: id, entry_id, reader_key_hash, created_at, source — page, widget or email - reactions: id, entry_id, reader_key_hash, kind — a small set, and one per reader per entry WRITING - Markdown, images pasted in, a preview beside the editor - Draft, scheduled, published. A scheduled entry appears at its time without anybody being awake - An entry can be marked major, which is the only thing that triggers the widget's badge — otherwise every typo fix nags the whole user base - Templates for the three sentences you always write THE PUBLIC PAGE - Reverse chronological, one entry per block, filterable by kind and tag - Permalink per entry with its own OG card - RSS and JSON feeds, both complete rather than truncated - Fast and readable without JavaScript THE WIDGET - A script that renders a badge on a trigger element the host page already has - The badge counts entries newer than the reader's last seen, and only major ones if the host asks for that - Clicking opens a panel with the recent entries, rendered from a payload fetched once - The reader is identified by a hash the host application supplies, or by localStorage when it does not. No cookie - The panel must not trap focus, must close on Escape, and must be reachable by keyboard - Fails invisibly: if the changelog is down, the host page shows no badge and nothing else happens TELLING PEOPLE - Email subscription with double opt-in, per kind: everything, or major only - A digest option — weekly, monthly — so somebody can hear about it without a message per release - Every email carries the entries in full, not a teaser and a link - One-click unsubscribe that works without logging in WHAT THE TEAM SEES - Views per entry, split by page, widget and email - Reactions per entry - Reader reach: how many distinct readers saw an entry within a week of publication - The entries nobody read, which is usually a titling problem INTEGRATIONS THAT ARE NOT A PLATFORM - A webhook out on publish, so Slack or Discord get it without this project knowing what those are - An API to create an entry, so it can be published from a release script - Import from a Markdown folder, because most teams already have CHANGELOG.md THE INTERFACE - Writer: list, editor, schedule. Nothing else - Public: one column, generous type, dates on the left on desktop - Dark and light, one accent OPERATIONS - .env: DATABASE_PATH, BASE_URL, SMTP_URL, WIDGET_ORIGINS, HASH_SALT - Migrations on boot, each once - The widget payload endpoint is cached with an ETag and served from memory - Nightly backup off the machine plus restore - Health endpoint WHAT MATTERS MOST The widget and the major-only rule are the product. Build the entry model, the public page and the badge first, and put the badge on a real application — then ship five entries in a week and see whether the badge is useful or irritating. That answer decides the defaults. Give me the repository, the widget script, migrations, .env.example, a seed with ten entries, and a README with deploy steps behind Caddy.
What you lose
- A web editor so marketing can publish a release note without a pull request
- A hosted page, a widget and analytics on who read what
- Scheduled publishing, so a note goes out with the release rather than before it
If you would rather not build
- A static changelog in your repository
- Changefeed, for the hosted version
- GitHub releases with a feed
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $29/mo | — | — |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Astro
$0Content collections plus a Node adapter cover both the page and the admin.
withastro/astrofree · open source
Ghost
$0Overkill for a changelog, but gives a non-developer an editor immediately.
TryGhost/Ghostfree · open source
Why this verdict
our own opinion · changed only by a person
90/100
Verdict yes at 90. The one design decision is scheduled publishing by cron rather than by a person; everything else is a list and a feed.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Headway
answered from the record above
Is Headway free?
No — the plan we track is $29 a month. Around $29/month billed monthly for the standard plan with a custom domain.
Can you replace Headway by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 90 out of 100, build time one session. Read what you lose before you decide.
How much does Headway cost?
$29 a month on Standard — $348 a year. Recorded 10 Aug 2026.
What do you lose by replacing Headway?
A web editor so marketing can publish a release note without a pull request; A hosted page, a widget and analytics on who read what; Scheduled publishing, so a note goes out with the release rather than before it. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Headway?
Yes: Astro, Ghost. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

