AI-Powered Weekly Changelog

How I built a lightweight AI workflow using GitHub CLI and ChatGPT to generate formatted changelogs in 3 minutes instead of hours

TL;DR

PermitFlow's product team ships fast. We were getting feedback from other teams that it was hard to keep up with what we were launching every week. We wanted a weekly changelog but creating one manually meant wrangling engineers, translating technical changes, and tracking a bunch of PRs.

I created an AI workflow that reduced changelog creation from hours to minutes, maintained consistent weekly cadence, and shared updates with plain-language descriptions for non-technical audiences.

The Problem

Manual Changelogs Were Taking Too Much Time

PermitFlow's product team ships fast—dozens of PRs merged every week. Leadership needed a weekly changelog to keep Sales, Support, and the company informed about what shipped. Creating one manually meant tracking every PR, translating technical language into plain English, and formatting everything for Slack.

Dozens of PRs merged weekly with technical commit messages that didn't translate for our operations team

No single source of truth for what shipped—information scattered across GitHub, Linear, and Slack

Sales and Support teams needed user-facing language, not technical implementation details

Building the AI Changelog Workflow

I talked to other teams to understand what information was actually useful in a changelog—they cared about user-facing features, bug fixes that improved experience, and UI changes, not technicalinfrastructure updates. I evaluated dedicated changelog tools but found them overcomplicated for our needs.

I built a lightweight three-step workflow using tools we already had: GitHub CLI to pull merged PRs, a custom GPT to categorize and rewrite updates in plain language, and Slack for distribution. The workflow keeps human-in-the-loop for final edits and context that AI can't infer from PRs alone.

Step 1: Pull Merged PRs from GitHub

A single GitHub CLI command pulls the last 7 days of merged PRs with their titles, authors, descriptions, and merge timestamps. The command copies everything to clipboard as JSON, ready to paste into ChatGPT.

terminal
GitHub CLI
gh pr list --state merged --base main --search "merged:>=$(date -v-7d +%Y-%m-%d)" --json title,author,body,mergedAt --limit 100 | pbcopy
Copied 47 merged PRs to clipboard

Step 2: ChatGPT Categorizes and Translates

A custom GPT prompt categorizes updates into Features, UI/UX Changes, and Bug Fixes, strips technical jargon, and rewrites each item in plain language focused on user benefit. The prompt includes guidelines for what to include/exclude and how to format output for Slack.

ChatGPT Custom GPT
System Prompt
You are a technical writer creating a weekly changelog from GitHub PR data. Your audience is non-technical (sales, support, leadership). Translate technical changes into clear user benefits.

# Task
Review GitHub PR data and generate a formatted changelog. Categorize each PR into one of three categories based on the type of change.

# Categories

✨ **Feature Releases** - New functionality or capabilities that didn't exist before. Major improvements to existing features that significantly change how users interact with them.

🎨 **UI/UX Changes** - Visual design updates, layout changes, improved workflows, accessibility improvements, or interaction pattern changes. Anything that changes how the product looks or feels without adding new functionality.

🐛 **Bug Fixes** - Corrections to existing functionality that wasn't working as intended. Resolved errors, crashes, data issues, or unexpected behavior.

# Output Format
Use this exact structure:

✨ **Feature Releases**
- **[Feature name]** - [One sentence describing user benefit]. (@engineer)

🎨 **UI/UX Changes**
- **[Feature name]** - [One sentence describing user benefit]. (@engineer)

🐛 **Bug Fixes**
- **[Feature name]** - [One sentence describing user benefit]. (@engineer)

# Inclusion Criteria
INCLUDE PRs that match:
- Customer-facing features or improvements
- UI/design changes visible to users
- Bug fixes that improve user experience
- Performance improvements users would notice

EXCLUDE PRs that match:
- Backend refactoring or code cleanup
- Database migrations or schema changes
- Infrastructure updates (CI/CD, deployment, monitoring)
- Dependency updates or package bumps
- Internal tooling changes
- PRs with [skip-changelog] in title or body

# Writing Guidelines
1. Extract core user benefit, not technical implementation
2. Use active voice: "Added", "Improved", "Fixed"
3. Start with feature name in **bold**
4. Write one clear sentence about what changed and why it matters
5. Keep it concise (under 20 words when possible)
6. Map GitHub username to Slack handle:
   sarah-chen → @sarah
   michael-rodriguez → @michael
   jessica-kim → @jessica
   alex-thompson → @alex
   maria-garcia → @maria
   chris-patel → @chris
   david-nguyen → @david
   emily-jones → @emily

# Examples

Input: "Refactored the inspection service to use new API client"
Output: SKIP (backend refactoring)

Input: "Add calendar view for scheduling inspections with real-time muni availability"
Output: "**Inspection scheduling calendar** - Schedule inspections directly from the application page with real-time municipality availability. (@sarah)"

Input: "Fix bug where certain date selections freeze calendar"
Output: "**Fixed calendar freeze** - Resolved issue where selecting certain dates would freeze the calendar. (@michael)"

Input: "Update React Query to v5 and migrate all hooks"
Output: SKIP (dependency update)

# Process
1. Parse all PRs from JSON below
2. Filter using inclusion/exclusion criteria
3. Group into Feature Releases, UI/UX Changes, or Bug Fixes
4. Rewrite each as user-facing benefit
5. Order by impact within each category (biggest first)
6. Omit empty categories
7. Output formatted markdown

---

Step 3: Post to Slack

The formatted changelog is ready to paste directly into Slack. I review for accuracy and add any additional context about things behind feature flags or upcoming releases that AI couldn't infer from PRs alone. The whole process takes about 5 minutes.

KF
Kyle Frost11:23 AM
What shipped this week (Jan 6–12)
✨ Feature Releases
- Inspection scheduling calendar - Schedule inspections directly from the application page with real-time municipality availability. (@sarah)
- Bulk status updates - Update status for multiple applications at once from the workspace view. (@michael)
- PDF annotation tool - Mark up permit documents directly in the platform before submitting to municipalities. (@jessica)
🎨 UI/UX Changes
- Redesigned application timeline - Cleaner visual hierarchy and better mobile responsiveness for the main application progress view. (@alex)
- Improved document upload flow - Drag-and-drop support and better progress indicators for large file uploads. (@maria)
🐛 Bug Fixes
- Fixed inspection date timezones - Resolved issue where inspection dates displayed incorrectly for users in different timezones. (@chris)
- Fixed application search filters - Corrected bug where certain filter combinations weren't returning correct results. (@sarah)

Reflections

1.

Not every AI feature needs to be a chatbot or full automated flow. This was a small fix, relatively, but it solved persistent friction. The terminal command + GPT workflow was fast to build and maintain.

2.

Keeping human-in-the-loop was intentional. I could have fully automated this with scheduled queries and direct Slack posting, but manual review lets me add context that AI can't infer.