laravel-client-changelog maintained by vepora
Laravel Client Changelog
Auto-generate a client-facing changelog from git commits via AI — delivered as a public page and email digest.
Every time you deploy, run one command. The package reads your recent git commits, strips the technical noise, and uses AI to produce plain-English summaries grouped into New Features, Improvements, and Fixed. Results are stored in your database, shown on a public /changelog page, and optionally emailed to your clients on a schedule you control.
Features
- AI-powered translation — turns
feat(auth): add oauth2 pkce flowinto "Users can now sign in with Google and GitHub." - Multiple AI providers — Groq (free, default), OpenAI, Claude, Gemini, Grok
- Public changelog page — zero-config timeline UI built with Tailwind CDN
- Email digest — per-deploy, daily, or weekly batching
- Pause/Resume — freeze generation before a sprint and catch up on resume
- Queue-friendly — dispatches a job by default;
--syncfor synchronous use
Requirements
- PHP 8.3+
- Laravel 11, 12, or 13
- A queue worker (or use
--sync)
Installation
composer require vepora/laravel-client-changelog
Publish the config and run migrations:
php artisan vendor:publish --tag=changelog-config
php artisan migrate
Add your AI key to .env:
CHANGELOG_AI_PROVIDER=groq # groq | openai | claude | gemini | grok
CHANGELOG_AI_KEY=your-key-here
Usage
Generating a changelog entry
Call this at the end of your deploy script:
php artisan changelog:generate
Options:
| Flag | Description |
|---|---|
--sync |
Process synchronously (no queue) |
--no-ai |
Skip AI; store raw commits directly (useful in CI) |
Pause & Resume
Freeze changelog generation before a planned maintenance window or sprint:
php artisan changelog:pause --until=2026-05-10 --reason="Refactor sprint"
php artisan changelog:resume --send-accumulated # sends a catch-up digest
php artisan changelog:resume --discard # drops accumulated commits
Status
php artisan changelog:status
Outputs a table showing pause state, last entry, pending digest count, and notify mode.
Configuration
// config/changelog.php
return [
'notify' => [
// per_deploy | daily | weekly
'mode' => env('CHANGELOG_MODE', 'daily'),
'send_at' => '18:00',
'timezone' => env('CHANGELOG_TZ', 'UTC'),
'skip_if_no_changes' => true,
// array of email addresses
'recipients' => [],
],
'ai' => [
// groq (default, free) | gemini | claude | openai | grok
'provider' => env('CHANGELOG_AI_PROVIDER', 'groq'),
'key' => env('CHANGELOG_AI_KEY'),
// groq: llama-3.3-70b-versatile
// gemini: gemini-2.0-flash
// grok: grok-3-mini
// claude: claude-haiku-4-5-20251001
// openai: gpt-4o-mini
'model' => env('CHANGELOG_AI_MODEL', 'llama-3.3-70b-versatile'),
// professional | friendly
'tone' => 'professional',
],
// Commit types silently dropped before AI sees them
'ignore_types' => ['chore', 'test', 'tests', 'docs', 'ci', 'style', 'build'],
// URL segment for the public changelog page
'page_url' => 'changelog',
// Laravel middleware applied to the page — empty = public
'page_middleware' => [],
];
Notify modes
| Mode | Behavior |
|---|---|
per_deploy |
Sends an email immediately after changelog:generate |
daily |
Batches entries and sends once per day at send_at |
weekly |
Batches entries and sends once per week on Monday at send_at |
For daily and weekly, add the Laravel scheduler to your crontab:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Customising the views
php artisan vendor:publish --tag=changelog-views
Views are published to resources/views/vendor/changelog/.
AI Providers
| Provider | Env key | Default model | Free tier |
|---|---|---|---|
| Groq | CHANGELOG_AI_KEY |
llama-3.3-70b-versatile |
Yes |
| OpenAI | CHANGELOG_AI_KEY |
gpt-4o-mini |
No |
| Claude | CHANGELOG_AI_KEY |
claude-haiku-4-5-20251001 |
No |
| Gemini | CHANGELOG_AI_KEY |
gemini-2.0-flash |
Yes (quota) |
| Grok | CHANGELOG_AI_KEY |
grok-3-mini |
No |
Set CHANGELOG_AI_PROVIDER and CHANGELOG_AI_MODEL to override defaults.
Changelog
See CHANGELOG.md.
License
MIT — see LICENSE.