In modern Go projects, it's too easy for accidental API changes or subtle documentation edits to sneak through pull requests or release processes unnoticed. relimpact is a lightweight CLI tool that helps you understand what really changed between two Git refs — with clean, structured, human-friendly reports. relimpact what really changed Use it in CI pipelines, release PRs, or locally before tagging new versions. ✨ Features 🔍 API Diff — Track breaking public API changes (structs, interfaces, functions, constants, variables). 📝 Docs Diff — Section-aware Markdown diff to highlight meaningful content changes. 🗂️ Other Files Diff — Group file changes by extension (.sh, .sql, .json, etc.) to surface migrations and auxiliary files. 🚀 Designed for Release PR reviews — Quickly see the real impact of changes. 🖋️ Markdown Reports — Ready to paste into GitHub Releases, Slack, or changelogs. ⚙️ Works in GitHub Actions, GitLab CI, or locally — Integrates easily. 🔒 No server required — Pure CLI tool. 🔍 API Diff — Track breaking public API changes (structs, interfaces, functions, constants, variables). API Diff 📝 Docs Diff — Section-aware Markdown diff to highlight meaningful content changes. Docs Diff 🗂️ Other Files Diff — Group file changes by extension (.sh, .sql, .json, etc.) to surface migrations and auxiliary files. Other Files Diff 🚀 Designed for Release PR reviews — Quickly see the real impact of changes. Designed for Release PR reviews 🖋️ Markdown Reports — Ready to paste into GitHub Releases, Slack, or changelogs. Markdown Reports ⚙️ Works in GitHub Actions, GitLab CI, or locally — Integrates easily. Works in GitHub Actions, GitLab CI, or locally 🔒 No server required — Pure CLI tool. No server required 🚀 Quickstart Run on a GitHub PR: relimpact --old=v1.0.0 --new=HEAD > release-impact.md relimpact --old=v1.0.0 --new=HEAD > release-impact.md Example Output: ⚙️ GitHub Action Integration name: Release Impact on PR on: pull_request: branches: [ master ] types: [ opened, synchronize, reopened ] jobs: release-impact: name: Generate Release Impact Report runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Determine previous tag id: prevtag run: | git fetch --tags TAG_LIST=$(git tag --sort=-version:refname) PREV_TAG=$(echo "$TAG_LIST" | head -n2 | tail -n1) echo "Previous tag: $PREV_TAG" # Fallback to first tag if no previous if [ -z "$PREV_TAG" ]; then PREV_TAG=$(echo "$TAG_LIST" | head -n1) echo "Fallback to first tag: $PREV_TAG" fi echo "prev_tag=$PREV_TAG" >> $GITHUB_OUTPUT - name: Determine new ref id: newref run: | if [ "${{ github.event_name }}" = "pull_request" ]; then echo "new_ref=${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT else echo "new_ref=HEAD" >> $GITHUB_OUTPUT fi - uses: hashmap-kz/relimpact-action@main with: old-ref: ${{ steps.prevtag.outputs.prev_tag }} new-ref: ${{ steps.newref.outputs.new_ref }} output: release-impact.md - name: Upload Release Impact Report uses: actions/upload-artifact@v4 with: name: release-impact-${{ github.run_id }}-${{ github.run_attempt }} path: release-impact.md name: Release Impact on PR on: pull_request: branches: [ master ] types: [ opened, synchronize, reopened ] jobs: release-impact: name: Generate Release Impact Report runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Determine previous tag id: prevtag run: | git fetch --tags TAG_LIST=$(git tag --sort=-version:refname) PREV_TAG=$(echo "$TAG_LIST" | head -n2 | tail -n1) echo "Previous tag: $PREV_TAG" # Fallback to first tag if no previous if [ -z "$PREV_TAG" ]; then PREV_TAG=$(echo "$TAG_LIST" | head -n1) echo "Fallback to first tag: $PREV_TAG" fi echo "prev_tag=$PREV_TAG" >> $GITHUB_OUTPUT - name: Determine new ref id: newref run: | if [ "${{ github.event_name }}" = "pull_request" ]; then echo "new_ref=${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT else echo "new_ref=HEAD" >> $GITHUB_OUTPUT fi - uses: hashmap-kz/relimpact-action@main with: old-ref: ${{ steps.prevtag.outputs.prev_tag }} new-ref: ${{ steps.newref.outputs.new_ref }} output: release-impact.md - name: Upload Release Impact Report uses: actions/upload-artifact@v4 with: name: release-impact-${{ github.run_id }}-${{ github.run_attempt }} path: release-impact.md 📦 Installation Homebrew brew tap hashmap-kz/homebrew-tap brew install relimpact brew tap hashmap-kz/homebrew-tap brew install relimpact Manual Download 👉 Download latest release Download latest release Download latest release 🧠 How It Works 1️⃣ Go Source API Changes Uses Go type system & AST parsing: Detects breaking changes: method signatures, removed fields, new/removed types, etc. Ignores formatting & comment noise. Based on golang.org/x/tools/go/packages. Uses Go type system & AST parsing: Detects breaking changes: method signatures, removed fields, new/removed types, etc. Ignores formatting & comment noise. Based on golang.org/x/tools/go/packages. Detects breaking changes: method signatures, removed fields, new/removed types, etc. Ignores formatting & comment noise. Based on golang.org/x/tools/go/packages. Detects breaking changes: method signatures, removed fields, new/removed types, etc. Ignores formatting & comment noise. Based on golang.org/x/tools/go/packages. golang.org/x/tools/go/packages 2️⃣ Markdown Docs Changes Section-aware diff of .md files: Headings added/removed. Links and images changes. Section word count diffs. Based on goldmark parser. Section-aware diff of .md files: Headings added/removed. Links and images changes. Section word count diffs. Based on goldmark parser. .md Headings added/removed. Links and images changes. Section word count diffs. Based on goldmark parser. Headings added/removed. Links and images changes. Section word count diffs. Based on goldmark parser. goldmark 3️⃣ Other Files Changes Groups changes by file type: .sql, .sh, .json, .yaml, .conf, etc. Uses git diff --name-status. Groups changes by file type: .sql, .sh, .json, .yaml, .conf, etc. Uses git diff --name-status. .sql, .sh, .json, .yaml, .conf, etc. Uses git diff --name-status. .sql, .sh, .json, .yaml, .conf, etc. .sql .sh .json .yaml .conf Uses git diff --name-status. git diff --name-status Why Use It? Most release PRs include: ✅ API changes✅ Doc updates✅ Migration scripts✅ Other important config tweaks But raw git diffis noisy and hard to review.relimpact gives you a release-ready summary, focusing on what's important. raw git diff relimpact release-ready summary 📜 License MIT License. See LICENSE. LICENSE LICENSE 👉 Try it today: https://github.com/hashmap-kz/relimpact https://github.com/hashmap-kz/relimpact https://github.com/hashmap-kz/relimpact If you found this useful, leave a ⭐ on GitHub — it helps others discover the project! Happy releasing 🚀