<?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>Forem: Mohammad</title>
    <description>The latest articles on Forem by Mohammad (@mohammad2460).</description>
    <link>https://forem.com/mohammad2460</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%2F3812975%2Fe5f32e57-f8f9-431b-b1f8-6c54bdb96d88.png</url>
      <title>Forem: Mohammad</title>
      <link>https://forem.com/mohammad2460</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mohammad2460"/>
    <language>en</language>
    <item>
      <title>CommitCraft AI: Stop Writing "Fix Stuff" Commits — Auto-Generate Professional Git Messages in VS Code</title>
      <dc:creator>Mohammad</dc:creator>
      <pubDate>Sun, 08 Mar 2026 13:52:05 +0000</pubDate>
      <link>https://forem.com/mohammad2460/i-got-tired-of-writing-fix-stuff-as-my-commit-message-so-i-built-this-vs-code-extension-5ckg</link>
      <guid>https://forem.com/mohammad2460/i-got-tired-of-writing-fix-stuff-as-my-commit-message-so-i-built-this-vs-code-extension-5ckg</guid>
      <description>&lt;p&gt;Let me tell you about a crime I committed every single day for years. Not one crime — hundreds. They're all sitting in my git history, plain as day:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix stuff
wip
asdfgh
ok NOW it works
please just work
final final FINAL fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm not proud of it. But if you've shipped code under deadline pressure, pulled an all-nighter debugging a race condition, or just wanted to push before a meeting — you know exactly what I'm talking about. The commit message field is right there, staring at you, and somehow "fix bug" makes it out the door.&lt;/p&gt;

&lt;p&gt;The problem is that I always told myself I'd go back and clean it up. Spoiler: I never did. And six months later, &lt;code&gt;git log&lt;/code&gt; becomes an archaeological dig through abstract expressionism instead of actual software history.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://marketplace.visualstudio.com/items?itemName=CommitCraftAI.commitcraft-ai" rel="noopener noreferrer"&gt;CommitCraft AI&lt;/a&gt; to fix this — a VS Code extension that generates professional commit messages in one click.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;➡️ &lt;a href="https://marketplace.visualstudio.com/items?itemName=CommitCraftAI.commitcraft-ai" rel="noopener noreferrer"&gt;Install CommitCraft AI free — VS Code Marketplace&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or install directly from VS Code terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code &lt;span class="nt"&gt;--install-extension&lt;/span&gt; CommitCraftAI.commitcraft-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why bad commit messages actually hurt you
&lt;/h2&gt;

&lt;p&gt;Here's the thing nobody tells you when you're starting out: commit messages are not for the computer. Git doesn't care what you write. The message is for &lt;strong&gt;future you&lt;/strong&gt; — and future you is always confused, always under pressure, and always trying to figure out why past you thought this change was a good idea.&lt;/p&gt;

&lt;p&gt;Bad commit messages create a cascade of problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can't understand your own code.&lt;/strong&gt; Six months later you're staring at a weird conditional and running &lt;code&gt;git blame&lt;/code&gt; to understand why it's there. The answer? &lt;code&gt;"misc fixes"&lt;/code&gt;. Thanks, past me. Super helpful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code reviews get harder.&lt;/strong&gt; Reviewers have to read every line of your diff to understand what you were trying to accomplish. A good commit message like &lt;code&gt;feat(auth): add refresh token rotation with 15min expiry&lt;/code&gt; tells the whole story before anyone opens a file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changelogs become impossible.&lt;/strong&gt; If you've ever tried to write release notes by combing through 200 commits, half of which say "update" or "tweak", you know this pain. It's hours of detective work that should be seconds of copy-paste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git bisect becomes a nightmare.&lt;/strong&gt; Trying to find when a bug was introduced by bisecting through commits with no meaningful messages is like searching a library where every book is titled "Book".&lt;/p&gt;

&lt;p&gt;The fix is obvious: write better commit messages. The execution is where it falls apart — because nobody wants to stop mid-flow and craft a perfectly structured conventional commit when they're in the zone.&lt;/p&gt;




&lt;h2&gt;
  
  
  So I built something
&lt;/h2&gt;

&lt;p&gt;Here's how CommitCraft AI works: you stage your changes like normal, then click one button. The extension reads your diff, sends it to Claude AI (using the Haiku model — fast and accurate for structured output), and gets back a properly formatted commit message. You review it, tweak if needed, and commit.&lt;/p&gt;

&lt;p&gt;That's it. No prompt engineering. No copy-pasting diffs into ChatGPT. Just a button.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before CommitCraft:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit -m "fix login"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After CommitCraft:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix(auth): resolve token expiration not being cleared on logout

Ensures the cached auth token is properly invalidated when a user
logs out, preventing stale token errors on subsequent login attempts.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The extension supports three commit styles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Conventional Commits&lt;/strong&gt; — &lt;code&gt;feat:&lt;/code&gt;, &lt;code&gt;fix:&lt;/code&gt;, &lt;code&gt;chore:&lt;/code&gt;, &lt;code&gt;refactor:&lt;/code&gt; Great for teams using semantic versioning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitMoji&lt;/strong&gt; — ✨ for features, 🐛 for bugs, you know the drill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple&lt;/strong&gt; — Plain English, no prefix conventions. Good for personal projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beyond commits, it also generates &lt;strong&gt;PR descriptions&lt;/strong&gt; and &lt;strong&gt;changelog entries&lt;/strong&gt; from your diff. The changelog one alone has saved me hours per release.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started (30 seconds)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Install from VS Code marketplace&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Search "CommitCraft" in the Extensions panel, or:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=CommitCraftAI.commitcraft-ai" rel="noopener noreferrer"&gt;→ Install CommitCraft AI&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Sign in with your email&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First launch, hit &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; → &lt;code&gt;CommitCraft: Sign In&lt;/code&gt;. Enter your email and you're instantly signed in — no credit card, no OAuth dance, no waiting for an email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Stage your changes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Same as always. &lt;code&gt;git add .&lt;/code&gt; or use the Source Control panel checkboxes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Click the ✨ button&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's a new sparkle button in the Source Control toolbar. Click it. Done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Accept, edit, or regenerate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The message appears in a panel. Accept it, edit it, or hit regenerate for a different take. Click Accept and it fills your commit box automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it actually generates
&lt;/h2&gt;

&lt;p&gt;Here are real examples from my own projects:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A React component change:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat(UserCard): add skeleton loading state during data fetch

Replaces blank div with animated skeleton placeholder while user
profile data is loading, improving perceived performance on slow
connections.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A bug fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix(api): handle null response from /users endpoint gracefully

Adds null check before accessing response.data.user to prevent
TypeError crash when the endpoint returns 204 No Content during
account deletion flow.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A documentation update:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs(README): update installation steps for v2.x breaking changes

Removes deprecated --legacy flag from install command and adds note
about required Node 18+ for the new ESM build output.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A refactor:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;refactor(db): extract connection pooling logic into separate module

Moves pool initialization and teardown from server.js into db/pool.js
to improve testability and reduce startup time coupling.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;None of those are messages I would have written under normal commit-and-push pressure. The AI catches context I'd gloss over and phrases it in a way that'll actually make sense in six months.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 &lt;a href="https://marketplace.visualstudio.com/items?itemName=CommitCraftAI.commitcraft-ai" rel="noopener noreferrer"&gt;Try it yourself — Install free from VS Code Marketplace&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Generations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0/month&lt;/td&gt;
&lt;td&gt;20/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$4.99/month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;20 free/month is plenty to try it out. If you commit meaningful units of work (as you should), you're probably not making 20+ distinct commits every month on personal projects. Power users on multiple codebases will want Pro — it's less than a coffee.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Future-you will thank you for the commit messages. Past-you already had plenty of chances and blew it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=CommitCraftAI.commitcraft-ai" rel="noopener noreferrer"&gt;→ Install CommitCraft AI free — VS Code Marketplace&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Source code is on GitHub if you want to see how it works, report an issue, or leave a ⭐ if it saves you time:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/Mohammad2460/commitcraft-vscode" rel="noopener noreferrer"&gt;github.com/Mohammad2460/commitcraft-vscode&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Drop your best AI-generated commit message in the comments below 👇&lt;/strong&gt; — curious what kinds of diffs people throw at it.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>git</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
