AI-powered changelog generator from GitHub Pull Requests
Gazette automatically generates well-structured changelogs from your GitHub Pull Requests, enriched with Jira context and summarized by a LLM.
- π GitHub Integration β Fetches merged PRs from your repositories
- π« Jira Context β Automatically extracts and enriches changelogs with Jira ticket information
- π€ AI-Powered β Uses Claude, OpenAI, Google Gemini or Ollama to generate concise, well-structured changelogs
- β±οΈ Configurable Time Periods β Filter PRs by last hour, 6h, 12h, 24h, or custom periods
- π¦ Repository Subscriptions β Subscribe to multiple repos and generate changelogs in batch
curl -fsSL https://raw.githubusercontent.com/gventino/gazette/main/install.sh | bashRequires Rust (edition 2026).
git clone https://github.com/gventino/gazette.git
cd gazette
cargo build --release
cp target/release/gazette /usr/local/bin/Download the latest binary from the Releases page and add it to your PATH.
On first run, Gazette will prompt you for the required API credentials:
| Credential | Required | Description |
|---|---|---|
GITHUB_TOKEN |
β | GitHub Personal Access Token with repo scope |
GEMINI_API_KEY |
β | Google Gemini API key |
JIRA_BASE_URL |
β | Your Jira instance URL (e.g., https://company.atlassian.net) |
JIRA_EMAIL |
β | Jira account email |
JIRA_API_TOKEN |
β | Jira API token |
Credentials are stored in a .env file in your working directory.
- Go to GitHub Settings β Developer settings β Personal access tokens
- Generate a new token with
reposcope
- Visit Google AI Studio
- Create a new API key
- Go to Atlassian Account Settings
- Create a new API token
Run the CLI:
gazette| Option | Description |
|---|---|
| Subscribe to a repo | Add a repository to track (format: owner/name) |
| Unsubscribe from a repo | Remove a repository from tracking |
| List subscribed repos | Show all tracked repositories |
| Configure time period | Set the time window for PR filtering |
| Generate changelog | Create a changelog for one or all subscribed repos |
| Update credentials | Modify stored API tokens |
- Last hour
- Last 6 hours
- Last 12 hours
- Last 24 hours (default)
- Custom (format:
HH:MM:SS)
Changelogs are saved as Markdown files in the current directory:
changelog_<repo-name>_<date>.md
# Changelog for acme/backend - 2026-02-10
## Features
- Add user authentication via OAuth2 ([#142](https://github.com/acme/backend/pull/142))
- Implement rate limiting for API endpoints ([#138](https://github.com/acme/backend/pull/138))
## Bug Fixes
- Fix memory leak in connection pool ([#141](https://github.com/acme/backend/pull/141))
## Improvements
- Refactor database queries for better performance ([#139](https://github.com/acme/backend/pull/139))Gazette stores repository subscriptions and settings in config.json:
{
"repos": [
{ "owner": "acme", "name": "backend" },
{ "owner": "acme", "name": "frontend" }
],
"time_period": { "type": "Last24Hours" }
}- clap β Command-line argument parsing
- inquire β Interactive prompts
- reqwest β HTTP client
- tokio β Async runtime
- serde β Serialization
- chrono β Date/time handling
- crossterm β Terminal manipulation
- owo-colors β Terminal colors
# Run in development
cargo run
# Run tests
cargo test
# Build release binary
cargo build --release
# Format code
cargo fmt
# Lint
cargo clippyThis project uses pre-commit to ensure code quality before each commit.
Install pre-commit:
# macOS
brew install prekEnable hooks:
prek installThe following checks run automatically on each commit:
cargo fmt --checkβ Code formattingcargo clippy -- -D warningsβ Linting with warnings as errorscargo buildβ Build verification (no warnings allowed)
MIT License β see LICENSE for details.
Contributions are welcome! Please open an issue or submit a pull request.
Made with β€οΈ and π¦ βοΈ
