Commits With Character

Last year, I posted how I was moving away from Conventional Commits in my projects. Whilst I still highly recommend Changesets for team-based or multi-contributor projects, I have started to realise the benefit of commit-lead changelogs for smaller projects. They are quick to learn, and can be easily automated.

However, I didn’t want to return to Conventional Commits for the following reasons:

  1. The prefixes take up a lot of characters.
  2. The prefixes become a chore (pun intended).
  3. Sometimes the prefixes don’t match one-to-one with SemVer.

It’s this last one that got me thinking: if all I want to know is when to trigger a major, minor, or patch release, why don’t I just state that in the commit? I explored prefixing commits with those words, but it started to feel like issue 1 again:

MINOR Add that feature
MAJOR Remove a different feature
Upgrade dev dependencies
MINOR Add another feature
PATCH Fix that bug
MINOR Add yet another feature

Taking inspiration from gitmoji, as they only take up two characters (emoji + space), I decided to try using special characters instead.

npm packages track patch versions using a tilde ~, and minor versions using a caret ^. All I needed was a character for major changes which, of course, is an exclamation mark ! (or exclamation point, or bang, depending on where you are from 🇺🇸).

^ Add that feature
! Remove a different feature
Upgrade dev dependencies
^ Add another feature
~ Fix that bug
^ Add yet another feature

And so the Commits With Character project was born!


A colleague of mine introduced me to Release It and Conventional Changelog, that they’d been using to automate releases using the Conventional Commits standard. I decided this was a good fit for my project too and wrote my own preset.

I’ve been using Commits With Character, with automated releases, in a few of my projects for a while now, and have really been enjoying its simplicity:


The benefit I’ve found over Conventional Commits and gitmoji is that it’s just less to think about when you make a commit. At time of writing, gitmoji has 73 different categories 🙈 (that one means “Add or update a .gitignore file”). I can imagine there’s plenty of arguments going on out there about which emojis or prefixes should have been used in certain commits. Whereas as long as you know SemVer, you know Commits With Character.