Examining the problems of manual release: deciding versions, writing changelogs, publishing, and tagging that are prone to error. Then how Conventional Commits turn commit history into machine-analyzable data, and why semantic-release beats ad-hoc semver scripts.

In episode 0 we set up the environment: Git, Node.js, VS Code, and GitHub CLI. Now let's pause to understand why all these tools are necessary. The big question: why is release still done manually, when the process wastes time and is error-prone?
Historically, release has always been the most stressful point in the development cycle. Versions can be forgotten to bump, changelogs can drift from reality, and tags can be left behind. Semantic-release was born precisely to remove that drama: by turning commit history into data, machines can decide versions, write changelogs, and release without human intervention.
There are four manual tasks that must be repeated every time you release:
v1.2.3 and making sure it is pushed.Each one has room for error. Versions can be forgotten to bump, changelogs can be incomplete, and tags can land in the wrong place — usually discovered only when users compare the versions in circulation.
$ npm version patch
$ npm run build
$ npm publish
$ git tag v1.2.3
$ git push --tags
$ # changelog? oh, forgot to write it...Every step relies on memory and team discipline. Skip one step and the result is a version that doesn't match reality.
The solution is not to remember harder, but to make commit history machine-readable. With a standardized commit format, machines can infer the type of change automatically: feat bumps minor, fix bumps patch, and BREAKING CHANGE: bumps major.
feat: add login page
fix: fix email validation
chore: update security dependencies
BREAKING CHANGE: replace auth APIBecause commits are canonical and permanent, the changelog no longer depends on human memory — it is regenerated from history on every release. The same changelog will be recomputed consistently at any time, by anyone, on any machine.
| Aspect | Manual Release | semver-script | semantic-release |
|---|---|---|---|
| Deciding the version | Manual, prone to forgetting | Auto-bump 1 patch | From commit type (semver) |
| Changelog | Written by hand | None | Auto from commit history |
| Git tag | Manual git tag | Manual | Auto per tagFormat |
| Registry publish | Manual | Manual | Auto via npm plugin |
| CI integration | No | No | Full pipeline |
| Version-to-commit traceability | No | No | Tag points to release commit |
A semver-script that keeps bumping the patch produces 1.0.0, 1.0.1, 1.0.2 even when there's a major new feature — the version becomes a lie. Semantic-release computes the version based on the impact of the changes, not the order of releases.
Warning
Manual version bumps are dangerous in both directions. Bumping patch when there's a breaking change tricks users into believing the API is still compatible. Conversely, bumping major for only a minor fix triggers unnecessary upgrade churn. Both destroy trust in the version — precisely the problem semantic-release removes.
The mindset shifts from "running a checklist" to "building a system". A checklist relies on people who follow along; a system relies on rules that are automatic. The philosophical difference is roughly this:
# manual era: 5 steps, 5 chances to go wrong
1. check package.json -> bump version manually
2. read git log -> write changelog
3. run build -> make sure it succeeds
4. publish to registry -> don't forget the token
5. git tag + push --tags -> don't forget to push
# automated era: 1 command, 0 manual decisions
npx semantic-releaseNotice how every step of the manual era carries a subjective decision: what version, what changelog format, which tag is correct. The automated era moves all of those decisions into configuration that can be reviewed, tested, and validated once — then used forever.
Semantic-release itself was born from the reality that large teams in the real world cannot stay manually disciplined at scale. It is used by thousands of open-source projects as living proof that version automation runs stably in truly production environments.
When the release process is automated, the impact ripples through the whole team workflow:
Let's be honest first: not every project needs this. A small single-person project with no external users might be fine with manual tags. Semantic-release only proves its value when users depend on versions, the changelog must be maintained, and more than one person touches the same branch. At that point, handing versions over to a machine is a huge saving.
npx semantic-release
# analyze commits -> compute version -> write changelog
# -> create tag -> publish -> create GitHub Release
# all from a structured commit historyNotice: there's no confirmation prompt, no subjective decision. The configuration in release.config.cjs determines everything, and commit history is the only input.
In episode 1 you learned:
In episode 2 we'll dissect core concepts and architecture: semver rules, how the commit analyzer works, and how the plugin pipeline assembles a release from start to finish. See you in episode 2!