Summary
I'd like to suggest adopting release-please to automate versioning, changelog generation, and release tagging. Given the project's high release cadence and already-structured CHANGELOG, this feels like a natural next step.
Current release workflow (as I understand it)
- Maintainer writes a CHANGELOG.md entry by hand
- Decides the next version number manually
- Pushes a
v* tag
- The
release.yaml workflow fires, runs GoReleaser, builds cross-platform binaries and the UI archive, then publishes the GitHub release and updates the Homebrew tap
This works well — but as the project scales, the manual steps become the highest-friction part of the loop.
The problem at current release velocity
Looking at the changelog, skillshare ships very frequently — v0.20.5 through v0.20.9 landed across just three days (2026-06-02 to 2026-06-05). At that pace:
- Handwritten changelog entries accumulate fast. The
CHANGELOG.md is already ~195KB / 2700+ lines, and every entry is manually authored.
- Version decisions are a constant interruption. For each release someone has to reason about whether it's a
patch, minor, or major bump.
- Tag pushes are easy to forget or mistype. A mis-tagged commit means a wrong release name is published to all install methods (Homebrew, install.sh, PowerShell, GitHub Actions).
What release-please would change
release-please reads Conventional Commits and does three things automatically:
| Today (manual) |
With release-please (automated) |
| Write CHANGELOG.md entry |
Generated from commit messages, same structured format |
| Decide semver bump |
Derived automatically: feat: → minor, fix: → patch, breaking change footer → major |
| Push git tag |
Happens when the Release PR is merged |
Concretely, the workflow becomes:
- Commits land on
main using Conventional Commit messages (e.g. feat: add zed target, fix: respect .skillignore in audit)
- release-please opens (or updates) a Release PR — a single PR titled "chore(main): release v0.20.10" — that contains the bumped version and generated changelog diff
- When you're ready to ship, merge the PR — release-please creates the tag
- The existing
release.yaml fires on the new tag, GoReleaser does everything it already does today
Step 4 requires zero changes to your GoReleaser setup or existing release.yaml.
Why this fits skillshare particularly well
- You're already close. Your
.goreleaser.yaml changelog.filters already excludes docs:, test:, ci: — the conventional-commit vocabulary is informally in use. release-please just formalises it.
- The CHANGELOG format maps cleanly. Your current headings (
### New Features, ### Bug Fixes, ### Breaking Changes, ### Performance) correspond directly to how release-please renders its sections (feat, fix, feat!/BREAKING CHANGE, perf).
- Release PRs give a review moment. At your shipping pace, having a pending PR that accumulates all changes before a release gives you a natural gate — merge it when you're ready, skip it when you're not.
- Single-maintainer friendly. The entire release is a PR merge. No local commands, no tag pushes, no manual version arithmetic.
Rough migration path
This is just for illustration — happy to adapt based on your preferred approach:
# .github/workflows/release-please.yaml
name: Release Please
on:
push:
branches:
- main
permissions:
contents: write
pull-requests: write
jobs:
release-please:
runs-on: ubuntu-latest
steps:
- uses: googleapis/release-please-action@v4
with:
release-type: go
The existing release.yaml (which triggers on v* tags) would continue to work without modification.
A release-please-config.json can also tell it to skip bumping the Go module path if needed, and the changelog sections can be customised to match the existing headings exactly.
What I'm not proposing
- Replacing GoReleaser — it stays exactly as-is for artifact building and Homebrew publishing
- Enforcing commit message linting via CI (though that's a natural follow-on)
- Any change to the development setup or devcontainer
Happy to put together a draft proposal in proposals/ if that's the right next step per the contributing guide. Let me know if this is something worth exploring or if there's a reason the current manual flow is intentional that I've missed.
Summary
I'd like to suggest adopting release-please to automate versioning, changelog generation, and release tagging. Given the project's high release cadence and already-structured CHANGELOG, this feels like a natural next step.
Current release workflow (as I understand it)
v*tagrelease.yamlworkflow fires, runs GoReleaser, builds cross-platform binaries and the UI archive, then publishes the GitHub release and updates the Homebrew tapThis works well — but as the project scales, the manual steps become the highest-friction part of the loop.
The problem at current release velocity
Looking at the changelog, skillshare ships very frequently —
v0.20.5throughv0.20.9landed across just three days (2026-06-02 to 2026-06-05). At that pace:CHANGELOG.mdis already ~195KB / 2700+ lines, and every entry is manually authored.patch,minor, ormajorbump.What release-please would change
release-please reads Conventional Commits and does three things automatically:
feat:→ minor,fix:→ patch, breaking change footer → majorConcretely, the workflow becomes:
mainusing Conventional Commit messages (e.g.feat: add zed target,fix: respect .skillignore in audit)release.yamlfires on the new tag, GoReleaser does everything it already does todayStep 4 requires zero changes to your GoReleaser setup or existing
release.yaml.Why this fits skillshare particularly well
.goreleaser.yamlchangelog.filtersalready excludesdocs:,test:,ci:— the conventional-commit vocabulary is informally in use. release-please just formalises it.### New Features,### Bug Fixes,### Breaking Changes,### Performance) correspond directly to how release-please renders its sections (feat,fix,feat!/BREAKING CHANGE,perf).Rough migration path
This is just for illustration — happy to adapt based on your preferred approach:
The existing
release.yaml(which triggers onv*tags) would continue to work without modification.A
release-please-config.jsoncan also tell it to skip bumping the Go module path if needed, and the changelog sections can be customised to match the existing headings exactly.What I'm not proposing
Happy to put together a draft proposal in
proposals/if that's the right next step per the contributing guide. Let me know if this is something worth exploring or if there's a reason the current manual flow is intentional that I've missed.