Changelog validator, for Keep a Changelog.
Paste a CHANGELOG.md or a GitHub link. Every problem gets its line number and a one-sentence fix, and you get a corrected copy with the safe fixes already made. Checked against Keep a Changelog 2.0.0.
What it checks
The format, rule by rule.
The structure people, release tools and coding agents rely on. Your wording is yours; the check never judges it.
Version headings
## [1.2.0] - 2024-05-01 at level 2, the version in square brackets, no duplicates, newest first.
Release dates
YYYY-MM-DD only. Dates that can be read one way are rewritten; ambiguous ones, missing ones and dates in the future are flagged.
Types of change
Added, Changed, Deprecated, Removed, Fixed and Security, spelled that way, at level 3, with every entry under one and none empty or repeated.
Breaking changes and deprecations
2.0.0's in-place “**Breaking:**” marker instead of a separate section, and the version that will remove each deprecated item.
Unreleased and [YANKED]
An Unreleased section at the top, and pulled releases marked [YANKED] the way the format writes it.
Links and the file itself
A link for every version (written for you when it knows the repository), no stray links, a # Changelog title, a preamble and the CHANGELOG.md name.
In CI and from agents
Catch it before it ships.
One step in your pipeline runs the same free check on every pull request. No key, no account.
- Prints every findingWith its line number and fix, right in the job log.
- Fails only on errorsWarnings and tips are shown, never block. A busy or rate-limited service lets the job pass.
- Agents ask directlyCoding agents connected to the LogPulse MCP server call validate_changelog.
# .github/workflows/changelog.yml
name: Changelog
on: [pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Check CHANGELOG.md
run: |
curl -sS -X POST "https://release-ripple-roadmap.lovable.app/api/public/v1/validate" -H "Content-Type: text/markdown" --data-binary @CHANGELOG.md -o report.json
jq -r '.error.message // (.issues[]? | "\(.severity) line \(.line // "-"): \(.message) Fix: \(.fix)")' report.json
jq -e '.valid != false' report.json > /dev/nullcurl -X POST "https://release-ripple-roadmap.lovable.app/api/public/v1/validate?format=text" \
-H "Content-Type: text/markdown" \
--data-binary @CHANGELOG.mdclaude mcp add --transport http logpulse https://release-ripple-roadmap.lovable.app/mcp
# then ask:
# "Check our CHANGELOG.md against
# Keep a Changelog and fix it"Endpoint: https://release-ripple-roadmap.lovable.app/api/public/v1/validate · POST JSON { markdown | url } or a raw text/markdown body · format=text for a readable report. Read the docs.