<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Thomas Vilte</title>
    <description>The latest articles on DEV Community by Thomas Vilte (@butakero).</description>
    <link>https://dev.to/butakero</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3684869%2F3f54fa68-9c4b-4646-bc0d-f449cd22d9a8.jpg</url>
      <title>DEV Community: Thomas Vilte</title>
      <link>https://dev.to/butakero</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/butakero"/>
    <language>en</language>
    <item>
      <title>Stop writing 'fix' as your commit message: My journey automating a full Git workflow with Go 🧉</title>
      <dc:creator>Thomas Vilte</dc:creator>
      <pubDate>Mon, 29 Dec 2025 23:29:53 +0000</pubDate>
      <link>https://dev.to/butakero/stop-writing-fix-as-your-commit-message-my-journey-automating-a-full-git-workflow-with-go-54j7</link>
      <guid>https://dev.to/butakero/stop-writing-fix-as-your-commit-message-my-journey-automating-a-full-git-workflow-with-go-54j7</guid>
      <description>&lt;h1&gt;
  
  
  Why I Built MateCommit: Automating My Git Workflow with AI
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The 2 AM Commit Message Problem
&lt;/h2&gt;

&lt;p&gt;We've all been there. It's 2 AM. You've been coding for 4 hours straight. You finally solved that nasty bug or implemented that complex feature. Your brain is fried, and you're ready to commit and go to bed.&lt;/p&gt;

&lt;p&gt;Then you stare at the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"???"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbey414syeh70vnnjhrmy.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbey414syeh70vnnjhrmy.jpg" alt="Me staring at the terminal" width="439" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your mind goes blank. You end up writing something like &lt;code&gt;"fix bug"&lt;/code&gt;, &lt;code&gt;"changes"&lt;/code&gt;, or my personal favorite: &lt;code&gt;"oops"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I hated seeing my git history full of uninformative messages, but honestly, I also hated spending 5 minutes thinking of the perfect "Conventional Commit" when I was exhausted. So, I decided to automate the paperwork.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Journey Starts (as a Go learning project)
&lt;/h2&gt;

&lt;p&gt;I started the first version of this project about a year ago. To be honest, I was just starting to &lt;strong&gt;learn Go&lt;/strong&gt; at the time. I’ve always been fascinated by how tools like &lt;strong&gt;Terraform&lt;/strong&gt; or &lt;strong&gt;Docker&lt;/strong&gt; work, and I wanted to see if I could build something similarly robust.&lt;/p&gt;

&lt;p&gt;I built a basic version that worked, was happy with it, and actually stopped working on it for a while. But by September 2025, I noticed a frustrating pattern. My commit messages were great, but I was still losing a massive amount of time manually drafting PR descriptions and grouping commits for releases.&lt;/p&gt;

&lt;p&gt;My brain started racing: &lt;em&gt;"If the AI knows what I changed, why am I still doing the rest of the paperwork manually?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I got completely &lt;strong&gt;"cebado"&lt;/strong&gt; (an Argentinian way of saying I got over-excited and hyper-focused). What started as a small script quickly evolved into a complete Git workflow assistant.&lt;/p&gt;




&lt;h2&gt;
  
  
  The technical headache: From Brittle RegEx to JSON
&lt;/h2&gt;

&lt;p&gt;One of the most interesting technical hurdles was parsing the AI's response. In the early days, I asked the AI for Markdown. Parsing that with RegEx was a nightmare—one extra backtick or an unexpected sentence and the tool would crash.&lt;/p&gt;

&lt;p&gt;I eventually switched to a &lt;strong&gt;JSON-first approach&lt;/strong&gt;, but LLMs love to "chat" even when you ask for raw JSON. They often wrap everything in markdown backticks (&lt;br&gt;
&lt;br&gt;
&lt;code&gt;json ...&lt;/code&gt;&lt;br&gt;
&lt;br&gt;
) or add "thinking" paragraphs.&lt;/p&gt;

&lt;p&gt;To fix this, I had to write a &lt;strong&gt;Lenient JSON Parser&lt;/strong&gt; that strips away all that noise before the unmarshal step. It was a headache to debug, but it made the tool significantly more robust.&lt;/p&gt;


&lt;h2&gt;
  
  
  What MateCommit actually does
&lt;/h2&gt;

&lt;p&gt;I've been using it for a while now, and these are the parts that save me the most time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Meaningful Commits:&lt;/strong&gt; It follows &lt;a href="https://www.conventionalcommits.org/" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt; and looks at the whole diff. It's surprisingly good at catching &lt;em&gt;why&lt;/em&gt; a change was made.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;PR Summaries:&lt;/strong&gt; I hate writing PR descriptions. Now the CLI drafts the summary, test plan, and flags breaking changes for me.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Automated Releases:&lt;/strong&gt; It gathers changes between tags, categorizes them, and generates a SemVer-compliant release with a full changelog in seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbyizevv3xlhdjxcqw0l.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmbyizevv3xlhdjxcqw0l.gif" alt="MateCommit Suggest Demo" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Making it feel like a professional tool
&lt;/h2&gt;

&lt;p&gt;I didn't want this to be a "hacky" script. I wanted it to feel like something you'd use at work every day.&lt;/p&gt;
&lt;h3&gt;
  
  
  Going Global and Team Ready
&lt;/h3&gt;

&lt;p&gt;When I started, the tool was entirely in &lt;strong&gt;Argentinian Spanish&lt;/strong&gt;. But as the project grew, I realized that if I wanted others to use it, I had to go global. I implemented a full &lt;strong&gt;i18n&lt;/strong&gt; system. Now, the tool supports both English and Spanish, making it ready for international teams while still keeping its "Mate" roots in the config.&lt;/p&gt;

&lt;p&gt;But going global also meant respecting how teams work. I made sure the AI respects your project's &lt;strong&gt;GitHub or GitLab templates&lt;/strong&gt;. Whether it's an &lt;code&gt;.github/ISSUE_TEMPLATE&lt;/code&gt; or a &lt;code&gt;PULL_REQUEST_TEMPLATE.md&lt;/code&gt;, the CLI reads your specific format and ensures the AI-generated content follows your house rules. No more "AI-style" summaries that don't fit your team's convention.&lt;/p&gt;
&lt;h3&gt;
  
  
  Caching (and saving money)
&lt;/h3&gt;

&lt;p&gt;I added a &lt;strong&gt;local caching system&lt;/strong&gt; because I realized I was paying for the same analysis twice when tweaking small things. If you run &lt;code&gt;suggest&lt;/code&gt; on a diff you already analyzed, it's now instant and costs $0.&lt;/p&gt;
&lt;h3&gt;
  
  
  The "Doctor" command and DX
&lt;/h3&gt;

&lt;p&gt;I'm obsessed with DX (Developer Experience), so I added a few things I always miss in other tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Config Doctor&lt;/strong&gt;: Run &lt;code&gt;matecommit config doctor&lt;/code&gt; and it will check your API keys, Git permissions, and connectivity.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Shell Autocompletion&lt;/strong&gt;: Full support for Bash, Zsh, and Fish.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cost Awareness&lt;/strong&gt;: It tracks exact token usage and calculates the &lt;strong&gt;actual USD cost&lt;/strong&gt; of every call. I added a daily budget feature because I once accidentally burned $5 testing a loop... lesson learned.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  How it compares to other tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;MateCommit 🧉&lt;/th&gt;
&lt;th&gt;aicommits&lt;/th&gt;
&lt;th&gt;commitizen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Commits&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PR &amp;amp; Release Notes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost Tracking (USD)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (Real-time)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Single Binary (Go)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (Node)&lt;/td&gt;
&lt;td&gt;No (Node)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;The project is fully open source and I'm currently working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local LLMs (Ollama):&lt;/strong&gt; This is my top priority for privacy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitLab &amp;amp; Bitbucket support.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 2.0 Thinking:&lt;/strong&gt; Exploring how the new reasoning models can improve complex PR summaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;If you have Go installed, you can install it directly from the source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/thomas-vilte/matecommit/cmd/matecommit@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Check the repo here:&lt;/strong&gt; &lt;a href="https://github.com/thomas-vilte/matecommit" rel="noopener noreferrer"&gt;github.com/thomas-vilte/matecommit&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;What’s the worst commit message you’ve ever written? Mine was just a single dot &lt;code&gt;.&lt;/code&gt; because I was too tired to type. Let me know in the comments! 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built with 🧉 and passion in Argentina&lt;/em&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>ai</category>
      <category>git</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
