A central changelog service that aggregates releases and commits across multiple repositories (public and private) into one user-facing changelog page.
- Unified release feed across services
- Multi-provider Git support: GitHub, GitLab, Bitbucket (Cloud + Server commits), and Gitea
- Multi-changelog pages with unique path names (for example
/payments,/infra,/mobile) - Landing page + configurable root mode (
/can point to landing or changelog) - Automatic commit-derived entries when a repository has no managed releases
- Persistent changelog snapshot storage in SQLite (survives restarts)
- Private repo support via admin-managed tokens
- Admin UI for source management
- JSON API endpoint:
/api/changelog - Optional "Sign in with PipeOps" CTA for landing and admin auth screens
- Modern dark theme inspired by PipeOps
npm install
npm run devnpm run dev now prewarms key routes/assets to avoid first-load _next/static 404s in dev mode.
Use npm run dev:raw if you want plain next dev.
Open:
http://localhost:3000root page (landing by default)http://localhost:3000/changelogfor the unified changelog feedhttp://localhost:3000/adminfor source management
Create .env.local in the project root:
ADMIN_PASSWORD=change-me
ADMIN_SESSION_SECRET=replace-with-long-random-secret
TOKEN_ENCRYPTION_KEY=replace-with-long-random-secret
CHANGELOG_API_KEY=replace-with-api-key-for-json-endpoint
PIPEOPS_SIGNIN_URL=https://pipeops.example.com/oauth/authorize?redirect_uri={returnTo}
APP_BASE_URL=http://localhost:3000Notes:
ADMIN_PASSWORDprotects/admin. If unset, admin is open (development mode).TOKEN_ENCRYPTION_KEYencrypts stored provider access tokens at rest.CHANGELOG_API_KEYprotects/api/changelog. Send it inx-api-keyorAuthorization: Bearer ....PIPEOPS_SIGNIN_URLoverrides the default PipeOps sign-in URL.{returnTo}is replaced automatically, orreturn_tois appended when missing.- If
PIPEOPS_SIGNIN_URLis not set, the app defaults tohttps://pipeops.sh/auth/signin. APP_BASE_URLdefines the absolute callback base used when building PipeOps sign-in redirects.
curl http://localhost:3000/api/changelog
curl http://localhost:3000/api/changelog?path=changelog
curl http://localhost:3000/api/changelog?force=1
curl -H "x-api-key: $CHANGELOG_API_KEY" http://localhost:3000/api/changelog
curl -H "Authorization: Bearer $CHANGELOG_API_KEY" http://localhost:3000/api/changelog?force=1