[{"data":1,"prerenderedAt":554},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fusing-conventional-commits":204,"\u002Fblog\u002Fusing-conventional-commits-surround":549},[4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200],{"title":5,"path":6,"stem":7},"You do not have time to not have tests","\u002Fblog\u002Fyou-do-not-have-time-to-not-have-tests","2.blog\u002F20211217.you-do-not-have-time-to-not-have-tests",{"title":9,"path":10,"stem":11},"Migrate Vue 2 with Vuetify and Jest to Vite and Vitest","\u002Fblog\u002Fmigrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest","2.blog\u002F20220109.migrate-vue-2-with-vuetify-and-jest-to-vite-and-vitest",{"title":13,"path":14,"stem":15},"I am a Dark Matter Developer","\u002Fblog\u002Fi-am-a-dark-matter-developer","2.blog\u002F20220626.i-am-a-dark-matter-developer",{"title":17,"path":18,"stem":19},"Why using Conventional commits is useful","\u002Fblog\u002Fusing-conventional-commits","2.blog\u002F20240623.using-conventional-commits",{"title":21,"path":22,"stem":23},"Why you should make a toolbox repository","\u002Fblog\u002Fwhy-you-should-make-a-toolbox-repository","2.blog\u002F20240630.Why-you-should-make-a-toolbox-repository",{"title":25,"path":26,"stem":27},"Apache Airflow Part 1 - Why and Goals for a near Serverless ELT","\u002Fblog\u002Fapache-airflow-part-1-why-and-goals","2.blog\u002F20240710.apache-airflow-part-1-why-and-goals",{"title":29,"path":30,"stem":31},"Oh My Zsh on your server","\u002Fblog\u002Foh-my-zsh-on-your-server","2.blog\u002F20240711.oh-my-zsh-on-your-server",{"title":33,"path":34,"stem":35},"Fire tablet and YouTube Kids","\u002Fblog\u002Ffire-tablet-and-youtube-kids","2.blog\u002F20240714.fire-tablet-and-youtube-kids",{"title":37,"path":38,"stem":39},"Using Ollama and Continue as a GitHub Copilot Alternative","\u002Fblog\u002Fusing-ollama-and-continue-as-github-copilot-alternative","2.blog\u002F20240723.using-ollama-and-continue-as-github-copilot-alternative",{"title":41,"path":42,"stem":43},"Debugging Local Packages Made Easy with pnpm","\u002Fblog\u002Fdebugging-local-packages-with-pnpm-link","2.blog\u002F20250422.debugging local-packages-with-pnpm-link",{"title":45,"path":46,"stem":47},"Two Weeks with Cloudflare AI and Tools","\u002Fblog\u002Ftwo-weeks-with-cloudflare-ai-and-tools","2.blog\u002F20250509.two-weeks-with-cloudflare-aI-and-tools",{"title":49,"path":50,"stem":51},"Adding Prompts to VS Code - How I Learned to Stop Worrying and Love AI Context","\u002Fblog\u002Fadding-prompts-to-vscode","2.blog\u002F20250528.adding-prompts-to-vscode",{"title":53,"path":54,"stem":55},"My Best Practices","\u002Fblog\u002Fmy-best-practicies","2.blog\u002F20250607.my-best-practicies",{"title":57,"path":58,"stem":59},"Creating my own CLI Tool - Towles Tool","\u002Fblog\u002Ftowles-tool","2.blog\u002F20250607.towles-tool",{"title":61,"path":62,"stem":63},"Software Development Best Practices & ITIL","\u002Fblog\u002Fsoftware-engineering-and-itil-best-practices","2.blog\u002F20250612.software-engineering-and-itil-best-practices",{"title":65,"path":66,"stem":67},"Voice to Text","\u002Fblog\u002Fvoice-to-text","2.blog\u002F20250622.voice-to-text",{"title":69,"path":70,"stem":71},"Setting Up ComfyUI - A Better Alternative to Fooocus","\u002Fblog\u002Fcomfy-ui-setup","2.blog\u002F20250628.comfy-ui-setup",{"title":73,"path":74,"stem":75},"Voice to System","\u002Fblog\u002Fvoice-to-system","2.blog\u002F20250705.voice-to-system",{"title":77,"path":78,"stem":79},"Tips for Claude Code","\u002Fblog\u002Ftips-for-claude-code","2.blog\u002F20250713.tips-for-claude-code",{"title":81,"path":82,"stem":83},"Review That AI Code: Why I Read Every Line Generated Code","\u002Fblog\u002Freview-that-ai-code","2.blog\u002F20250720.review-that-ai-code",{"title":85,"path":86,"stem":87},"My Context Engineering Journey: From Dev Scripts to AI Collaboration","\u002Fblog\u002F20250803-1.my-context-engineering-journey","2.blog\u002F20250803-1.my-context-engineering-journey",{"title":89,"path":90,"stem":91},"Context Engineering at Scale: Enterprise Lessons and the Future of Development","\u002Fblog\u002F20250803-2.context-engineering-at-scale","2.blog\u002F20250803-2.context-engineering-at-scale",{"title":93,"path":94,"stem":95},"Check That Your Tools and Linters Do Not Burn Tokens","\u002Fblog\u002Fcheck-that-your-tools-and-linters-do-not-burn-tokens","2.blog\u002F20250806.check-that-your-tools-and-linters-do-not-burn-tokens",{"title":97,"path":98,"stem":99},"Markdown + AI: The Communication Protocol That Changes Everything","\u002Fblog\u002Fmarkdown-plus-ai-the-communication-protocol-that-changes-everything","2.blog\u002F20250814.markdown-plus-ai-the-communication-protocol-that-changes-everything",{"title":101,"path":102,"stem":103},"Finally: Type-Safe AI in Production (And Why I'm Here For It)","\u002Fblog\u002Ffinally-type-safe-ai-in-production-and-why-im-here-for-it","2.blog\u002F20250819.finally-type-safe-ai-in-production-and-why-im-here-for-it",{"title":105,"path":106,"stem":107},"Dotfiles: Masterpiece or Late Stage Picasso?","\u002Fblog\u002Fdotfiles-masterpiece-or-late-stage-picasso","2.blog\u002F20250822.dotfiles-masterpiece-or-late-stage-picasso",{"title":109,"path":110,"stem":111},"Beyond API Wrappers: Building State-Driven MCP Servers for Long-Horizon Agent Orchestration","\u002Fblog\u002Fbeyond-api-wrappers-mcp-servers","2.blog\u002F20250907.beyond-api-wrappers-mcp-servers",{"title":113,"path":114,"stem":115},"Why Vertical Integration Wins: A Software Engineer's Case for Owning Your Stack","\u002Fblog\u002Fwhy-i-bought-tesla-model-3-vertical-integration","2.blog\u002F20250928.why-i-bought-tesla-model-3-vertical-integration",{"title":117,"path":118,"stem":119},"The Min-Maxer's Trifecta: Building Tools for the Game You Actually Play","\u002Fblog\u002Fmin-maxer-trifecta","2.blog\u002F20251004.min-maxer-trifecta",{"title":121,"path":122,"stem":123},"Read The Source: Learning by Cutting Out The Middleman and RTFM","\u002Fblog\u002Fread-the-source","2.blog\u002F20251010.read-the-source",{"title":125,"path":126,"stem":127},"The Exponential Shift: Why AI Progress Feels Different Now","\u002Fblog\u002Fthe-exponential-shift","2.blog\u002F20251015.the-exponential-shift",{"title":129,"path":130,"stem":131},"Plan Mode for Your Problems, Edit Mode for Claude's","\u002Fblog\u002Fplan-mode-problems-edit-mode-solutions","2.blog\u002F20251019.plan-mode-problems-edit-mode-solutions",{"title":133,"path":134,"stem":135},"AWS Aurora DSQL Looked Perfect Until I Needed the Connection String","\u002Fblog\u002Faws-aurora-dsql-postgres-serverless-authentication","2.blog\u002F20251028.aws-aurora-dsql-postgres-serverless-authentication",{"title":137,"path":138,"stem":139},"Switchback: Browser History for Your Thoughts","\u002Fblog\u002Fswitchback-second-order-reasoning","2.blog\u002F20251205.switchback-second-order-reasoning",{"title":141,"path":142,"stem":143},"AI Pairing: Notes to Self","\u002Fblog\u002Fai-pairing-notes-to-self","2.blog\u002F20251216.ai-pairing-notes-to-self",{"title":145,"path":146,"stem":147},"I've Been Sleeping on Zellij","\u002Fblog\u002Fsleeping-on-zellij","2.blog\u002F20251229.sleeping-on-zellij",{"title":149,"path":150,"stem":151},"Implementing a Ralph Wiggum Loop: The Secret is Session Markers","\u002Fblog\u002Fimplementing-ralph-wiggum-loop-for-autonomous-ai-coding","2.blog\u002F20260114.implementing-ralph-wiggum-loop-for-autonomous-ai-coding",{"title":153,"path":154,"stem":155},"Goodhart's Law Ate My Context Window","\u002Fblog\u002Fgoodharts-law-ate-my-context-window","2.blog\u002F20260119.goodharts-law-ate-my-context-window",{"title":157,"path":158,"stem":159},"Claude Code's Hidden Multi-Agent System Is Real","\u002Fblog\u002Fclaude-code-hidden-multi-agent-system","2.blog\u002F20260124.claude-code-hidden-multi-agent-system",{"title":161,"path":162,"stem":163},"Free Printable Math Sheets for Kids — Number Chart, Skip Counting, Multiplication, and More","\u002Fblog\u002Ffree-printable-number-chart-and-coin-sheets","2.blog\u002F20260214.free-printable-number-chart-and-coin-sheets",{"title":165,"path":166,"stem":167},"We Are Near the End of the Exponential","\u002Fblog\u002Fnear-the-end-of-the-exponential","2.blog\u002F20260214.near-the-end-of-the-exponential",{"title":169,"path":170,"stem":171},"Free Printable Language Arts Sheets for Kids — Sight Words, Parts of Speech, Homophones, and More","\u002Fblog\u002Ffree-printable-sight-words-and-grammar-sheets","2.blog\u002F20260215.free-printable-sight-words-and-grammar-sheets",{"title":173,"path":174,"stem":175},"Interactive Code Execution with Artifacts","\u002Fblog\u002Finteractive-code-execution-with-artifacts","2.blog\u002F20260215.interactive-code-execution-with-artifacts",{"title":177,"path":178,"stem":179},"Free Printable Telling Time Worksheet for Kids — Clock Reference & Practice Sheet","\u002Fblog\u002Ffree-printable-telling-time-worksheet","2.blog\u002F20260216.free-printable-telling-time-worksheet",{"title":181,"path":182,"stem":183},"Claude Code Skills: Teaching AI Your Playbook","\u002Fblog\u002Fclaude-code-skills-guide","2.blog\u002F20260221.claude-code-skills-guide",{"title":185,"path":186,"stem":187},"Building a Multi-Agent Loan Approval System with Human-in-the-Loop","\u002Fblog\u002Fmulti-agent-loan-approval-human-in-the-loop","2.blog\u002F20260225.multi-agent-loan-approval-human-in-the-loop",{"title":189,"path":190,"stem":191},"The Inception of AI Infrastructure: Bottlenecks All the Way Down","\u002Fblog\u002Fbiggest-bottleneck-scaling-ai-compute","2.blog\u002F20260313.biggest-bottleneck-scaling-ai-compute",{"title":193,"path":194,"stem":195},"What I Tell Teams About Claude Code","\u002Fblog\u002Fwhat-i-tell-teams-about-claude-code","2.blog\u002F20260314.what-i-tell-teams-about-claude-code",{"title":197,"path":198,"stem":199},"The Hardest Part of AI Isn't the AI","\u002Fblog\u002Fthe-hardest-part-of-ai-isnt-the-ai","2.blog\u002F20260327.the-hardest-part-of-ai-isnt-the-ai",{"title":201,"path":202,"stem":203},"Claude Code Hooks: The Capability I Left on the Table","\u002Fblog\u002Fclaude-code-hooks-capability-left-on-the-table","2.blog\u002F20260401.claude-code-hooks-capability-left-on-the-table",{"id":205,"title":17,"authors":206,"badge":212,"body":214,"date":539,"description":540,"extension":541,"image":542,"meta":544,"navigation":545,"path":18,"seo":546,"status":547,"stem":19,"__hash__":548},"posts\u002F2.blog\u002F20240623.using-conventional-commits.md",[207],{"name":208,"to":209,"avatar":210},"Chris Towles","https:\u002F\u002Ftwitter.com\u002FChris_Towles",{"src":211},"\u002Fimages\u002Fctowles-profile-512x512.png",{"label":213},"Productivity",{"type":215,"value":216,"toc":526},"minimark",[217,229,232,237,240,245,248,270,274,277,318,325,329,332,352,361,368,372,375,378,382,397,400,409,413,482,486,504,509,512,516,519,522],[218,219,220,221,228],"p",{},"As a developer, you're probably no stranger to the world of version control systems like Git. But even if you're well-versed in the basics of Git, using ",[222,223,227],"a",{"href":224,"rel":225},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[226],"nofollow","conventional commits"," can be a game-changer when it comes to communicating with your peers and yourself.",[218,230,231],{},"In this post, we'll take a deep dive into what conventional commits are, why they're important, and how to use them effectively. So, let's get started!",[233,234,236],"h2",{"id":235},"step-1-what-are-conventional-commits","Step 1: What Are Conventional Commits?",[218,238,239],{},"A conventional commit is a type of commit message that follows a specific format, making it easy for others (and yourself) to understand the purpose and scope of each change.",[241,242,244],"h3",{"id":243},"why-are-conventional-commits-important","Why Are Conventional Commits Important?",[218,246,247],{},"Using conventional commits has several benefits:",[249,250,251,259],"ul",{},[252,253,254,258],"li",{},[255,256,257],"strong",{},"Better collaboration",": Conventional commits help team members work together more effectively, as everyone knows what to expect from a particular type of commit.",[252,260,261,264,265],{},[255,262,263],{},"Better release management:"," When you use conventional commits, it's easier to generate a changelog that reflects the changes in your release.\n",[249,266,267],{},[252,268,269],{},"Not a requirement for personal or many web projects, but many OSS projects need to generate a changelog.",[233,271,273],{"id":272},"step-2-choose-your-commit-type","Step 2: Choose Your Commit Type",[218,275,276],{},"When writing your commit message, choose one of the following types:",[249,278,279,286,292,306,312],{},[252,280,281,285],{},[282,283,284],"code",{},"fix:"," For fixing bugs or resolving issues",[252,287,288,291],{},[282,289,290],{},"fix(item):"," calling out which item was fixed",[252,293,294,297,298],{},[282,295,296],{},"feat:"," For adding new features or functionality\n",[249,299,300],{},[252,301,302,305],{},[282,303,304],{},"feat(item):"," For calling out which feature",[252,307,308,311],{},[282,309,310],{},"docs:"," For updating documentation or improving readability",[252,313,314,317],{},[282,315,316],{},"chore:"," For maintenance tasks like dependency updates",[218,319,320,321,324],{},"I tend to use ",[222,322,227],{"href":224,"rel":323},[226]," styles for my commits. But not enforced, just manual best effort. However, some repos have strict enforcement to generate the changelog from the commits. I'll dig into that below.",[233,326,328],{"id":327},"step-3-write-your-commit-message","Step 3: Write Your Commit Message",[218,330,331],{},"When writing your commit message, follow these best practices:",[249,333,334,340,346],{},[252,335,336,339],{},[255,337,338],{},"Be concise:"," Keep your commit message short and to the point.",[252,341,342,345],{},[255,343,344],{},"Use present tense:"," Instead of saying \"fixed,\" say \"fix.\"",[252,347,348,351],{},[255,349,350],{},"Include relevant details:"," Add context or explanations where necessary.",[218,353,354,357,358],{},[255,355,356],{},"Example commit message:"," ",[282,359,360],{},"fix: Update README.md to include new feature",[218,362,363],{},[364,365],"img",{"alt":366,"src":367},"","\u002Fimages\u002Fblog\u002Fconventional-commit-example-ui-pro.png",[233,369,371],{"id":370},"step-4-make-it-a-habit","Step 4: Make It a Habit",[218,373,374],{},"At first, it may seem like a lot of work to write a commit message. But you'll find that writing good commit messages becomes easier as you get used to doing it. I also recommend committing more often.",[218,376,377],{},"I often teach people to think about making commits like save checkpoints in a video game. When you beat a boss, or complete a level, it creates a save point. Do the same with your commits. It makes it much easier to review and track down issues compared to a three-day coding bender where half the repo is changed in a single commit.",[233,379,381],{"id":380},"strictly-enforce-conventional-commits","Strictly enforce conventional commits",[218,383,384,385,390,391,396],{},"Many open source projects use conventional commits, ",[222,386,389],{"href":387,"rel":388},"https:\u002F\u002Fgithub.com\u002Fvitejs\u002Fvite\u002Fblob\u002Fmain\u002F.github\u002Fcommit-convention.md",[226],"vite"," for example and some even enforce it via tools like ",[222,392,395],{"href":393,"rel":394},"https:\u002F\u002Fgithub.com\u002Fconventional-changelog\u002Fcommitlint",[226],"commitlint",".",[218,398,399],{},"This is great for a couple of reasons. The standard makes it easier to generate release notes and changelog from the commit messages.",[218,401,402,403,408],{},"In those cases I use the ",[222,404,407],{"href":405,"rel":406},"https:\u002F\u002Fgithub.com\u002Fcommitizen\u002Fcz-cli",[226],"commitizen"," tool to enforce the conventional commits.",[241,410,412],{"id":411},"install","Install",[414,415,419],"pre",{"className":416,"code":417,"language":418,"meta":366,"style":366},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","## Install\npnpm install -g commitizen\npnpm install -g cz-conventional-changelog\necho '{ \"path\": \"cz-conventional-changelog\" }' > ~\u002F.czrc\n","bash",[282,420,421,430,447,459],{"__ignoreMap":366},[422,423,426],"span",{"class":424,"line":425},"line",1,[422,427,429],{"class":428},"sHwdD","## Install\n",[422,431,433,437,441,444],{"class":424,"line":432},2,[422,434,436],{"class":435},"sBMFI","pnpm",[422,438,440],{"class":439},"sfazB"," install",[422,442,443],{"class":439}," -g",[422,445,446],{"class":439}," commitizen\n",[422,448,450,452,454,456],{"class":424,"line":449},3,[422,451,436],{"class":435},[422,453,440],{"class":439},[422,455,443],{"class":439},[422,457,458],{"class":439}," cz-conventional-changelog\n",[422,460,462,466,470,473,476,479],{"class":424,"line":461},4,[422,463,465],{"class":464},"s2Zo4","echo",[422,467,469],{"class":468},"sMK4o"," '",[422,471,472],{"class":439},"{ \"path\": \"cz-conventional-changelog\" }",[422,474,475],{"class":468},"'",[422,477,478],{"class":468}," >",[422,480,481],{"class":439}," ~\u002F.czrc\n",[241,483,485],{"id":484},"usage","Usage",[414,487,489],{"className":416,"code":488,"language":418,"meta":366,"style":366},"## Usage\ngit cz\n\n",[282,490,491,496],{"__ignoreMap":366},[422,492,493],{"class":424,"line":425},[422,494,495],{"class":428},"## Usage\n",[422,497,498,501],{"class":424,"line":432},[422,499,500],{"class":435},"git",[422,502,503],{"class":439}," cz\n",[218,505,506],{},[364,507],{"alt":366,"src":508},"\u002Fimages\u002Fblog\u002Fconventional-commits.png",[218,510,511],{},"But be sure to review the rules for the repository you're contributing to.",[233,513,515],{"id":514},"conclusion","Conclusion",[218,517,518],{},"Using conventional commits doesn't take much time. I've found it makes it easier to come up with commit messages. And it improves your code's readability and enhances collaboration. It's an easy habit to get into, and you'll find it a requirement for many open source projects.",[218,520,521],{},"Might as well start doing it everywhere.",[523,524,525],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":366,"searchDepth":432,"depth":432,"links":527},[528,531,532,533,534,538],{"id":235,"depth":432,"text":236,"children":529},[530],{"id":243,"depth":449,"text":244},{"id":272,"depth":432,"text":273},{"id":327,"depth":432,"text":328},{"id":370,"depth":432,"text":371},{"id":380,"depth":432,"text":381,"children":535},[536,537],{"id":411,"depth":449,"text":412},{"id":484,"depth":449,"text":485},{"id":514,"depth":432,"text":515},"2024-06-23","Helping everyone to understand the commit history and its purpose","md",{"src":508,"alt":543},"A laptop with a dark matter theme",{},true,{"title":17,"description":540},"published","HDenyW57d9KNcGB5QZelo2GE0aleN-8jTUOMk1AyLtw",[550,552],{"title":13,"path":14,"stem":15,"description":551,"status":547,"children":-1},"Reflecting on my career and the type of developer I am.",{"title":21,"path":22,"stem":23,"description":553,"status":547,"children":-1},"the perfect place to put everything that doesn't belong anywhere else",1776221196452]