# How to Generate App Store Changelogs from Git History

> Learn to generate App Store changelogs from git history using a Bash script. Extract commits, filter features, and rewrite messages for maximum impact.

- Repository: [Thomas Ricouard/Skills](https://github.com/Dimillian/Skills)
- Tags: how-to-guide
- Published: 2026-04-01

---

**You can generate App Store changelogs from git history by extracting commit ranges with a Bash script, filtering for user-visible changes according to guidelines, and rewriting messages into benefit-focused bullets suitable for the App Store.**

The Dimillian/Skills repository provides an open-source automation framework that transforms raw Git commits into polished "What’s New" text for iOS app releases. This workflow eliminates manual changelog writing by analyzing your repository history and applying structured filtering rules to highlight only customer-relevant updates.

## Understanding the Three-Layer Workflow

The App Store Changelog skill implements a pipeline that moves from raw data extraction to polished prose through three distinct stages.

### Data Collection with Git

The process begins with [`app-store-changelog/scripts/collect_release_changes.sh`](https://github.com/Dimillian/Skills/blob/main/app-store-changelog/scripts/collect_release_changes.sh), a Bash script that automatically determines the appropriate commit range and extracts relevant metadata. By default, the script compares the most recent Git tag against `HEAD`, though you can specify custom start and stop points.

The script outputs two structured sections:
- A chronological list of commits with hashes, dates, and messages
- A mapping of which files were modified by each commit

This raw data provides the foundational material for your release notes.

### Filtering and Triage

Not every commit deserves a place in your App Store listing. The [`app-store-changelog/references/release-notes-guidelines.md`](https://github.com/Dimillian/Skills/blob/main/app-store-changelog/references/release-notes-guidelines.md) file establishes strict inclusion criteria that filters out internal-only work such as CI configuration changes, dependency bumps, and code refactors.

The guidelines specify which changes are user-visible (features, performance improvements, bug fixes) versus infrastructure-only, ensuring your changelog communicates actual value to customers rather than implementation details.

### Draft Generation

The final layer converts the filtered commit list into customer-friendly language. The [`app-store-changelog/agents/openai.yaml`](https://github.com/Dimillian/Skills/blob/main/app-store-changelog/agents/openai.yaml) configuration defines the prompt template used by a language model to rewrite technical commit messages into benefit-focused bullets like "Search your library hands-free with the new voice input option."

## Extracting Changes with collect_release_changes.sh

The core utility resides at [`app-store-changelog/scripts/collect_release_changes.sh`](https://github.com/Dimillian/Skills/blob/main/app-store-changelog/scripts/collect_release_changes.sh). This script handles Git traversal and outputs a structured format that downstream tools can consume.

To generate changelog data using the default range (last tag to `HEAD`):

```bash
./app-store-changelog/scripts/collect_release_changes.sh

```

To specify a custom range between two tags:

```bash
./app-store-changelog/scripts/collect_release_changes.sh v2.5.0 v3.0.0

```

The script produces output in this format:

```text
Repo: /path/to/your/project
Range: v3.3..HEAD

== Commits ==
a1b2c3|2024-03-14|feat(search): add voice input to search bar
d4e5f6|2024-03-16|perf(timeline): lazy-load images to reduce scroll jank

== Files Touched ==
--- a1b2c3 Add voice input UI
SearchBar.swift
VoiceInputManager.swift
--- d4e5f6 Optimize timeline scrolling
TimelineView.swift
ImageCache.swift

```

This structured output separates metadata from file changes, making it straightforward to identify which features touched which components.

## Filtering for User-Facing Changes

The [`app-store-changelog/SKILL.md`](https://github.com/Dimillian/Skills/blob/main/app-store-changelog/SKILL.md) file documents the filtering philosophy that distinguishes changelog-worthy updates from invisible maintenance. According to the **Release Notes Guidelines** referenced in [`app-store-changelog/references/release-notes-guidelines.md`](https://github.com/Dimillian/Skills/blob/main/app-store-changelog/references/release-notes-guidelines.md), you should exclude:
- Continuous integration and deployment changes
- Dependency version bumps without feature changes
- Internal refactoring that doesn't alter user experience
- Code style and formatting updates

Retained changes typically include new features, performance optimizations, bug fixes, and UI improvements that customers can actually see or feel.

The guidelines also specify linguistic style: use active voice, focus on the benefit rather than the implementation, and keep bullets concise and readable.

## Automating the Final Draft

While the Bash script handles data extraction, the transformation into App Store-ready text relies on the configuration defined in [`app-store-changelog/agents/openai.yaml`](https://github.com/Dimillian/Skills/blob/main/app-store-changelog/agents/openai.yaml). This file contains the prompt template that instructs the AI to draft release notes from the raw script output.

The workflow documented in [`docs/skills.json`](https://github.com/Dimillian/Skills/blob/main/docs/skills.json) exposes this skill to the broader system, allowing automation tools to trigger the full pipeline: from Git history analysis to polished release notes ready for App Store Connect.

## Summary

- The **App Store Changelog** skill in Dimillian/Skills generates release notes by analyzing Git commit ranges via [`collect_release_changes.sh`](https://github.com/Dimillian/Skills/blob/main/collect_release_changes.sh).
- The script outputs structured commit data and file change mappings from the last tag to `HEAD` by default.
- **Release Notes Guidelines** in [`release-notes-guidelines.md`](https://github.com/Dimillian/Skills/blob/main/release-notes-guidelines.md) filter out internal changes and define customer-focused language rules.
- AI agents configured in [`openai.yaml`](https://github.com/Dimillian/Skills/blob/main/openai.yaml) transform the filtered commits into benefit-focused bullet points suitable for App Store listings.

## Frequently Asked Questions

### How do I specify a custom commit range for changelog generation?

Pass the start and end references as arguments to the script. For example, `./app-store-changelog/scripts/collect_release_changes.sh v2.5.0 HEAD` captures all changes between version 2.5.0 and the current branch tip. You can use any valid Git reference including tags, branch names, or commit SHAs.

### What types of commits should be excluded from App Store changelogs?

According to the [`release-notes-guidelines.md`](https://github.com/Dimillian/Skills/blob/main/release-notes-guidelines.md) in the Dimillian/Skills repository, you should exclude CI/CD configuration changes, dependency updates without user-facing features, internal code refactors, and style-only modifications. The guidelines emphasize keeping only changes that directly impact user experience such as new features, performance improvements, and bug fixes.

### Can I use this workflow without AI assistance?

Yes. The [`collect_release_changes.sh`](https://github.com/Dimillian/Skills/blob/main/collect_release_changes.sh) script functions independently as a standalone Bash utility. You can manually review its output and write your own release notes based on the filtered commit list and file changes. The AI agent defined in [`openai.yaml`](https://github.com/Dimillian/Skills/blob/main/openai.yaml) merely automates the rewriting step but is not required for the core functionality.

### Where are the filtering guidelines and workflow documented?

The primary documentation resides in [`app-store-changelog/SKILL.md`](https://github.com/Dimillian/Skills/blob/main/app-store-changelog/SKILL.md), which describes the high-level workflow and sample outputs. Detailed inclusion and exclusion rules are specified in [`app-store-changelog/references/release-notes-guidelines.md`](https://github.com/Dimillian/Skills/blob/main/app-store-changelog/references/release-notes-guidelines.md). The complete skill catalog entry is available in [`docs/skills.json`](https://github.com/Dimillian/Skills/blob/main/docs/skills.json) at the repository root.