[{"data":1,"prerenderedAt":460},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fdotfiles-masterpiece-or-late-stage-picasso":204,"\u002Fblog\u002Fdotfiles-masterpiece-or-late-stage-picasso-surround":455},[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":105,"authors":206,"badge":212,"body":214,"date":444,"description":445,"extension":446,"image":447,"meta":450,"navigation":451,"path":106,"seo":452,"status":453,"stem":107,"__hash__":454},"posts\u002F2.blog\u002F20250822.dotfiles-masterpiece-or-late-stage-picasso.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},"dotfiles",{"type":215,"value":216,"toc":427},"minimark",[217,221,233,238,241,244,251,254,257,261,264,283,286,289,293,296,299,303,306,311,314,318,321,335,339,342,356,360,363,367,370,373,377,404,408,411,414,417,420],[218,219,105],"h1",{"id":220},"dotfiles-masterpiece-or-late-stage-picasso",[222,223,224,225,232],"p",{},"You know what they say about ugly babies - only their parents could love them. Well, my ",[226,227,231],"a",{"href":228,"rel":229},"https:\u002F\u002Fgithub.com\u002FChrisTowles\u002Fdotfiles",[230],"nofollow","dotfiles repository"," was definitely that ugly baby. A chaotic collection of scripts, aliases, and configuration files that somehow worked but looked like... well, let's just say it had character.",[234,235,237],"h2",{"id":236},"the-masterpiece-incident","The \"Masterpiece\" Incident",[222,239,240],{},"A few months ago, I was pair programming with a colleague when I pulled out one of my custom scripts to solve a problem we were wrestling with. You know how it is - you've got that one shell script that does exactly what you need, even if it's held together with digital duct tape and good intentions.",[222,242,243],{},"This developer was impressed. Really impressed. They asked if they could see my dotfiles repository, and like a proud parent showing off baby photos, I shared the link.",[222,245,246,247],{},"A week later, they came back and said something that both flattered and horrified me: ",[248,249,250],"strong",{},"\"This is like a masterpiece! I took all of your scripts!\"",[222,252,253],{},"My immediate response? \"If it's a masterpiece, it's late stage Picasso.\"",[222,255,256],{},"You know what I mean - those paintings where you're not quite sure if it's genius or if someone just threw paint at a canvas. My dotfiles were functional chaos. They worked for me because I knew where everything was and how all the pieces fit together, but they were definitely not something you'd want to show your mother.",[234,258,260],{"id":259},"the-reality-check","The Reality Check",[222,262,263],{},"The truth was, my dotfiles repository was an organically grown mess. Over the years, I'd accumulated:",[265,266,267,271,274,277,280],"ul",{},[268,269,270],"li",{},"Shell scripts scattered across multiple directories",[268,272,273],{},"Aliases that only made sense to me",[268,275,276],{},"Configuration files with hardcoded paths",[268,278,279],{},"Dependencies that weren't documented",[268,281,282],{},"Installation processes that required tribal knowledge",[222,284,285],{},"It was the kind of repo where the README basically said \"good luck\" and you needed a PhD in Chris-ology to get anything working.",[222,287,288],{},"But here's the thing - someone else saw value in that chaos. They saw solutions to problems they had, patterns they could adapt, tools they could use. And that got me thinking: what if I could maintain the functionality but make it actually, you know, usable by other humans?",[234,290,292],{"id":291},"enter-claude","Enter Claude",[222,294,295],{},"This is where my relationship with AI tools really started paying dividends. I've been using Claude for code reviews and refactoring, but this felt like the perfect test case. Could Claude help me transform my chaotic collection of scripts into something modular and maintainable?",[222,297,298],{},"I started by having Claude analyze my existing setup. I explained what each script did, how they were interconnected, and what problems they solved. Claude helped me see patterns I hadn't noticed and identify opportunities for modularization.",[234,300,302],{"id":301},"the-transformation","The Transformation",[222,304,305],{},"Working with Claude, we completely restructured the repository:",[307,308,310],"h3",{"id":309},"modular-design","Modular Design",[222,312,313],{},"Instead of monolithic scripts, we broke everything down into focused, single-responsibility modules. Each script now does one thing well and can be composed with others.",[307,315,317],{"id":316},"automatic-installation","Automatic Installation",[222,319,320],{},"This was the game-changer. Claude helped me build an installation system that:",[265,322,323,326,329,332],{},[268,324,325],{},"Detects your operating system and shell",[268,327,328],{},"Checks for dependencies and installs them if needed",[268,330,331],{},"Backs up your existing configurations before making changes",[268,333,334],{},"Provides clear feedback about what's happening and why",[307,336,338],{"id":337},"better-documentation","Better Documentation",[222,340,341],{},"Each module now has clear documentation explaining:",[265,343,344,347,350,353],{},[268,345,346],{},"What it does",[268,348,349],{},"What dependencies it has",[268,351,352],{},"How to use it",[268,354,355],{},"How to customize it",[307,357,359],{"id":358},"dependency-management","Dependency Management",[222,361,362],{},"We created a proper dependency system that maps out what each tool needs and ensures everything gets installed in the right order.",[234,364,366],{"id":365},"the-result","The Result",[222,368,369],{},"What used to be a \"you need to know me to use this\" repository is now something that someone can actually clone and use. The installation process went from \"good luck figuring this out\" to running a single command and watching everything set itself up.",[222,371,372],{},"The best part? It's still my ugly baby, but now it's an ugly baby that other people can actually adopt.",[234,374,376],{"id":375},"lessons-learned","Lessons Learned",[378,379,380,386,392,398],"ol",{},[268,381,382,385],{},[248,383,384],{},"Sometimes you need an outside perspective"," - That colleague's enthusiasm helped me see potential I was blind to.",[268,387,388,391],{},[248,389,390],{},"AI excels at finding patterns"," - Claude was incredibly good at spotting opportunities for modularization that I missed.",[268,393,394,397],{},[248,395,396],{},"Automation is a gift to your future self"," - The time invested in the automatic installation system has already paid for itself.",[268,399,400,403],{},[248,401,402],{},"Documentation is love"," - If you care about your tools being useful to others (or your future self), document them properly.",[234,405,407],{"id":406},"whats-next","What's Next?",[222,409,410],{},"The repository is now actually something I'm proud to share. It's modular, well-documented, and includes an automatic installation system that makes onboarding new team members infinitely easier.",[222,412,413],{},"More importantly, it's taught me the value of taking a step back and looking at my tools with fresh eyes. Sometimes what seems like organized chaos to you is just chaos to everyone else.",[222,415,416],{},"And who knows? Maybe someone else will look at the new version and call it a masterpiece. This time, I'll take it as the compliment it was meant to be.",[418,419],"hr",{},[222,421,422,423,426],{},"If you're curious about the transformation, check out the ",[226,424,231],{"href":228,"rel":425},[230],". Whether you think it's a masterpiece or late stage Picasso, at least now you can actually install it without needing a decoder ring.",{"title":428,"searchDepth":429,"depth":429,"links":430},"",2,[431,432,433,434,441,442,443],{"id":236,"depth":429,"text":237},{"id":259,"depth":429,"text":260},{"id":291,"depth":429,"text":292},{"id":301,"depth":429,"text":302,"children":435},[436,438,439,440],{"id":309,"depth":437,"text":310},3,{"id":316,"depth":437,"text":317},{"id":337,"depth":437,"text":338},{"id":358,"depth":437,"text":359},{"id":365,"depth":429,"text":366},{"id":375,"depth":429,"text":376},{"id":406,"depth":429,"text":407},"2025-08-22","The story of how someone took all my scripts, called them a masterpiece, and how Claude helped me make them actually worth it","md",{"src":448,"alt":449},"\u002Fimages\u002Fblog\u002F20250822-dotfiles-masterpiece-or-late-stage-picasso.png","A cinematic split-screen composition showing transformation: on the left, a chaotic abstract Picasso-style painting made of tangled code snippets, terminal windows, and script files in warm oranges and reds; on the right, the same elements organized into clean, geometric modular blocks with cool blues and professional lighting. In the center, a subtle AI assistant presence (represented by a glowing neural network pattern) bridges the two sides. Professional photography quality with dramatic lighting contrast, contemplative mood, showing the journey from creative chaos to structured elegance.",{},true,{"title":105,"description":445},"published","dOP_0x9uzA_AUZyUDLuntGQs4K_oJz673q1-Nb7gyg8",[456,458],{"title":101,"path":102,"stem":103,"description":457,"status":453,"children":-1},"After years of unpredictable LLM outputs and runtime crashes, TypeScript is bringing the engineering discipline we've needed all along. Here's why I'm excited about type checking in production AI.",{"title":109,"path":110,"stem":111,"description":459,"status":453,"children":-1},"Explore how MCP servers can move beyond simple API wrappers to become sophisticated state machines that orchestrate complex, multi-phase projects with specialized agent teams",1776221196452]