Automated semantic versioning and release notification pipeline for a SaaS product with a Go backend and Svelte frontend, hosted on GitHub.
Every time a PR is merged to main, the release process is fully automated:
backend-vX.Y.Z or frontend-vX.Y.Z)feature/* → dev → main
devdev → main merges trigger release-pleasemain are not allowedBackend and frontend are versioned independently using Conventional Commits.
| Commit type | Version bump |
|---|---|
feat: |
minor (1.x.0) |
fix: |
patch (1.x.x) |
feat!: / BREAKING CHANGE |
major (x.0.0) |
chore:, docs:, test: |
none |
feat(auth): add OAuth2 login
fix(api): correct null pointer dereference
feat!: redesign payment flow
repo/
├── backend/ # Go
│ ├── version.go
│ └── CHANGELOG.md
├── frontend/ # Svelte
│ ├── package.json
│ ├── vite.config.js
│ ├── src/lib/WhatsNew.svelte
│ └── CHANGELOG.md
└── .github/
└── workflows/
├── release.yml # release-please
├── deploy-backend.yml # triggers on backend-v* tags
├── deploy-frontend.yml # triggers on frontend-v* tags
├── notify-release.yml # customer email on release publish
└── pr-lint.yml # enforce conventional commit PR titles
PR merged to main
↓
release-please opens Release PR
↓
Release PR merged → GitHub Release created
↓
notify-release.yml fires
↓
Customer email (Loops/Resend) — feat: entries only
↓
In-app "What's New" banner (fetches GitHub Releases API)
| Secret | Description |
|---|---|
LOOPS_API_KEY |
Loops (or Resend) API key for customer emails |
RELEASE_PLEASE_TOKEN |
GitHub PAT with repo write access for release-please |
| Tool | Purpose |
|---|---|
| release-please | Automates version bumps, Release PRs, GitHub Releases |
| action-semantic-pull-request | Enforces conventional commit PR titles |
| Loops / Resend | Customer email delivery |
| GitHub Releases API | Source of truth for in-app banner |