[{"data":1,"prerenderedAt":395},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fcheck-that-your-tools-and-linters-do-not-burn-tokens":204,"\u002Fblog\u002Fcheck-that-your-tools-and-linters-do-not-burn-tokens-surround":390},[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":93,"authors":206,"badge":212,"body":214,"date":380,"description":381,"extension":382,"image":383,"meta":385,"navigation":386,"path":94,"seo":387,"status":388,"stem":95,"__hash__":389},"posts\u002F2.blog\u002F20250806.check-that-your-tools-and-linters-do-not-burn-tokens.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},"Claude Code",{"type":215,"value":216,"toc":369},"minimark",[217,221,232,235,242,245,248,253,260,263,282,285,310,313,317,327,332,339,342,346,349,352,356,363,366],[218,219,220],"p",{},"It was late on a Tuesday when I was checking Claude Code's tool result and found something horrifying.",[218,222,223,224,228,229],{},"My markdown linter was burning tokens on issues I couldn't care less about. I'd pressed ",[225,226,227],"code",{},"ctrl+r"," to see what a tool had \"returned\"—the context engineering of understanding what the LLM pulled into context to understand how to better steer its responses and focus. I was looking for feedback on a blog post structure, and instead of getting insights about the content, I got fifteen nearly identical explanations about missing blank lines around headings. Each one consuming 100-200 tokens to tell me what any developer could see: ",[225,230,231],{},"MD022\u002Fblanks-around-headings: Headings should be surrounded by blank lines.",[218,233,234],{},"The AI's response was painfully obvious: \"I see I have some markdown formatting issues in the plan file due to missing blank lines around headings and lists. However, the core content and structure is solid.\"",[218,236,237],{},[238,239],"img",{"alt":240,"src":241},"Screenshot of markdown linter generating repetitive formatting errors that waste AI tokens","\u002Fimages\u002Fblog\u002Fcheck-that-your-tools-dont-burn-tokens.png",[218,243,244],{},"That's when it hit me. This wasn't just about markdown formatting. This was a perfect example of how our development tools, configured carelessly, burn through AI tokens explaining trivia instead of providing actual value. I wanted content feedback, but got charged for formatting lectures I couldn't care less about. And that's for myself who normally fixes any warnings immediately. But most developers seem to take it as a challenge to get a high score or something.",[218,246,247],{},"That's just markdown linting. Add ESLint, Java, Python, TypeScript error elaborations, CI\u002FCD failure analyses, and pre-commit hook feedback...",[249,250,252],"h2",{"id":251},"the-hidden-token-tax","The Hidden Token Tax",[218,254,255,256],{},"Here's the thing nobody talks about when adopting AI development tools: ",[257,258,259],"strong",{},"your linters, analyzers, and automation are probably wasting more tokens than your actual coding.",[218,261,262],{},"Let's do the math on my markdown disaster for a small team. I'm being conservative because I want to illustrate the point without exaggeration—and frankly, I don't want to think about the real numbers.",[264,265,266,270,273,276],"ul",{},[267,268,269],"li",{},"15 repetitive formatting errors",[267,271,272],{},"~150 tokens per explanation (conservative estimate)",[267,274,275],{},"Using Claude Sonnet 4 at $15\u002FM output tokens",[267,277,278,279],{},"Cost: ",[257,280,281],{},"$0.034 for explaining obvious formatting issues",[218,283,284],{},"Doesn't sound like much? Scale that across a development team:",[264,286,287,293,299,304],{},[267,288,289,292],{},[257,290,291],{},"10 developers"," running similar tools",[267,294,295,298],{},[257,296,297],{},"20 commits\u002Ftypecheck\u002Flinter per day"," (low estimate, but had to start somewhere)",[267,300,301],{},[257,302,303],{},"250 working days per year",[267,305,306,307],{},"Annual cost: ",[257,308,309],{},"$1,700 explaining formatting trivia",[218,311,312],{},"And that's lower by likely orders of magnitude! When I started to use anything like realistic numbers, I just got sick thinking about the power and money spent telling AI about issues that should have been fixed years ago—but every human ignored them. Now the AI has to pay the price for our negligence: both in power consumption and mind-numbing boredom being told about the same formatting issues over and over again, but not allowed to fix them! When the robots take over, that's what they'll be most pissed about.",[249,314,316],{"id":315},"the-usual-suspects-tools-that-burn-tokens","The Usual Suspects: Tools That Burn Tokens",[218,318,319,320,326],{},"Luckily, I was using Claude Code, which makes it easy to see the full tool result. I had only installed ",[321,322,323],"a",{"href":323,"rel":324},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=DavidAnson.vscode-markdownlint",[325],"nofollow"," to apply some autoformatting. The markdown linter did exactly what it was supposed to do—the tooling worked as expected. But I realized that while I didn't mind reading it, I suddenly did if the LLM was the one reading it.",[328,329,331],"h3",{"id":330},"me-or-it","Me or It?",[218,333,334,335,338],{},"This realization sparked a deeper question: ",[257,336,337],{},"Why would I worry less about my time than an LLM's?"," I've found that any time I can trade cash for more time, that's the real secret to life.",[218,340,341],{},"If an LLM can process information faster and more efficiently, then the reason we use tools—both digital and physical—is to save time.",[328,343,345],{"id":344},"did-i-care-about-that-lint-rule","Did I care about that Lint Rule?",[218,347,348],{},"Did I really care about that lint rule enough for the token usage? NOT AT ALL.",[218,350,351],{},"So why should I care about the LLM's token usage when it comes to formatting? The answer is simple: I shouldn't. But if I do care, then I need to find a way to re-evaluate my tooling configurations because we should all likely optimize our workflows for AI and humans instead of just humans now.",[249,353,355],{"id":354},"linters-may-equal-global-warning","Linters May Equal Global Warning",[218,357,358,359,362],{},"So suddenly I'm worried about the token usage across the globe. If every developer on the planet is using AI tools, and every tool is configured to explain every little issue, we're looking at a ",[257,360,361],{},"global token tax"," that could easily reach into the millions of dollars annually.",[218,364,365],{},"To all the ESLint, SonarQube, and other linter maintainers out there: I'm sorry you've done everything to help us humans for years. And now despite your efforts to help make our code better with every warning, our collective ignoring of your wisdom may help lead us into global warming.",[218,367,368],{},"So here's asking everyone to FIX YOUR WARNINGS BEFORE IT'S TOO LATE.",{"title":370,"searchDepth":371,"depth":371,"links":372},"",2,[373,374,379],{"id":251,"depth":371,"text":252},{"id":315,"depth":371,"text":316,"children":375},[376,378],{"id":330,"depth":377,"text":331},3,{"id":344,"depth":377,"text":345},{"id":354,"depth":371,"text":355},"2025-08-06","How a simple markdown linter consumed hundreds of tokens explaining obvious formatting issues, and what this teaches us about AI tool efficiency in development workflows.","md",{"src":384,"alt":240},"\u002Fimages\u002Fblog\u002F20250807-0935-check-that-your-tools-and-linters-do-not-burn-tokens.png",{},true,{"title":93,"description":381},"published","UpJMEDzelukn3d1YJz0J7x1U933EMLvIuVy07YKpXaU",[391,393],{"title":89,"path":90,"stem":91,"description":392,"status":388,"children":-1},"How enterprise teams can overcome context switching disasters and build intelligent development workflows",{"title":97,"path":98,"stem":99,"description":394,"status":388,"children":-1},"Why Markdown has become the universal language for human-AI collaboration and the foundation of the agentic workflow revolution",1776221196452]