What are the real benefits and risks of vibe coding?
Vibe coding lets you build software fast with AI, no code required. But is it ready for production? Here’s what you need to know.

Tiago Coelho
CTO

One of said ways can be to implement a dynamic CHANGELOG file.
A Changelog is generally a file where we keep all the changes made in an app or project such as bug fixes, new features, etc.
The use of a record file like this is for anyone who wants to be up to speed on which features are truly implemented in a project. Another great use for this is when the client asks “Where did this change?” or “When did we add that amazing feature?” we can pinpoint the where and when of the changes.
If you’d like some tips on how to develop an easy to read changelog you can check this small post: How to write a changelog
The issue with changelogs is that it takes the developers from their tasks to go write the changes they committed in a file and can be distracting. So we do what developers do best: we automate. 😎
This section assumes you know what Git is and the basics on how it works.
If you read the first section you may have noticed that the way we write our commit messages can allow a machine to interpret it. This is possible by following a set of rules during our commit process.
Let’s assume we have a few changes in our code to commit and we stage them:
<br>$ git add .</p><p id=""></p><p id="">When we’re ready to commit we’ll call the commit command with a message parameter where the magic will happen:</p><p id="">-- CODE language-code line-numbers --<br>$ git commit -m "feat(homepage): Add alternative footer to the homepage<br><br></p><p id=""></p><p id="">Implement the alternative version of the footer<br><br>Add alternate icons in the mobile version of the footer<br><br><br>Fixes issue #3"</p><p id="">For the sake of clarity let’s break this message down to its structure:</p><p id="">-- CODE language-code line-numbers --<br><type>[optional scope]: <description><br><br>[optional body]<br><br>[optional footer]<br></p><p id=""></p><p id="">By structuring our messages this way machines can grab every single element — <type>, <description>, etc - and use it for the good of humanity-- I mean for the good of your project!</p><p id="">In the next section, we will list what we can use in our commit messages.</p><h2 id="">Usage</h2><p id="">type: <strong id="">feat</strong> [ X.1.X - Minor] | <strong id="">fix</strong> [ X.X.1 - Patch]<br>chore | docs | refactor | improvement [X.X.X - N/A]<br><em id="">(There are other optional types but we’ll stick with these to keep things simple)</em></p><p id="">It’s important to notice the <strong id="">feat</strong> and <strong id="">fix</strong> <em id="">types</em> bump up the version of the project correlating to a MINOR and PATCH (accordingly) in semantic versioning. The other <em id="">types</em> have no semantic versioning effect unless BREAKING CHANGE is specified.</p><p id="">scope: <strong id="">(homepage):</strong><br>Short description of a section of the codebase enclosed in parenthesis followed by a colon and a space</p><p id="">description: <strong id="">Add alternative footer to the homepage</strong><br>Short description of the code changes</p><p id="">body: <strong id="">Implement the alternative version of the footer</strong>(…)<br>A longer description of the commit, providing additional context about the changes.<br>Must be placed <strong id="">one empty line after the description</strong></p><p id="">BREAKING CHANGE: <strong id="">BREAKING CHANGE</strong> [1.X.X - Major]<br>Must be indicated at the very beginning of the footer or body section of a commit and consist of the uppercase text BREAKING CHANGE, followed by a colon and a space.<br>It bumps up the version of the project correlating to a MAJOR in semantic versioning</p><p id="">footer: <strong id="">Fixes issue #3</strong><br>The footer should only contain additional <strong id="">issue references</strong> about the changes</p><h2 id="">What if I want to use custom names?</h2><p id="">Since this convention relies heavily on well-established keywords to increment the semantic versions of our app, using our own personal convention and still get the use of <em id="">Conventional Commits</em> is not an option at the moment.</p><h2 id="">Dynamic Changelog</h2><p id="">To dynamically update our changelog we’re going to be using a package called <a href="https://github.com/conventional-changelog/standard-version" target="_blank" id="">standard-version</a></p><p id="">First we install it:</p><p id="">-- CODE language-code line-numbers --<br>$ npm i --save-dev standard-version</p><p id=""></p><p id="">Next we add a custom command in our package.json so it’s easier to use:</p><p id="">-- CODE language-code line-numbers --<br>"scripts": {<br><br> &nbsp;"release": "standard-version"<br><br>}</p><p id=""></p><p id="">Now we can use npm run release in place of npm version to update our app’s version and tags based on our CHANGELOG records</p><h2 id="">Extra tool (optional)</h2><p id="">If you don’t feel like memorizing the convention, commitizen has got you covered! It’s a command line utility that prompts you to fill out the required fields for each commit - which is pretty neat 👌</p><figure id="" class="w-richtext-figure-type-image w-richtext-align-center" data-rt-type="image" data-rt-align="center"><div id=""><img alt="Image for post" src="https://cdn.prod.website-files.com/5f3fdb4ac2968afe2a89c98b/5f4f89b67a5c9b6c165aca2f_0*OmsGq1e9vwi4dlFw.png" width="auto" height="auto" loading="auto" id=""></div></figure><p id="">First we install commitizen globally.</p><p id="">-- CODE language-code line-numbers --<br>$ npm install -g commitizen</p><p id=""></p><p id="">Then we install the necessary adapter:</p><p id="">-- CODE language-code line-numbers --<br>$ npm install -g cz-conventional-changelog</p><p id=""></p><p id="">Now we create a .czrc file in our home directory</p><p id="">-- CODE language-code line-numbers --<br>nano ~/.czrc</p><p id=""></p><p id="">And add a path property referring to the, globally installed, commitizen adapter:</p><p id="">-- CODE language-code line-numbers --<br>{ "path": "cz-conventional-changelog" }</p><p id=""></p><p id="">We can now run git cz instead of git commit to be greeted by the prompt! 👏</p><h2 id="">Video demo</h2><p id="">You check a video demo of the whole process working using the commitizen CLI below:</p><figure id="" class="w-richtext-figure-type-video w-richtext-align-fullwidth" style="padding-bottom:61.016949152542374%" data-rt-type="video" data-rt-align="fullwidth" data-rt-max-width="" data-rt-max-height="61.016949152542374%" data-rt-dimensions="590:360" data-page-url="https://vimeo.com/326551977"><div id=""><iframe allowfullscreen="true" frameborder="0" scrolling="no" src="https://player.vimeo.com/video/326551977"></iframe></div></figure>Share this article