[{"data":1,"prerenderedAt":535},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fi-am-a-dark-matter-developer":204,"\u002Fblog\u002Fi-am-a-dark-matter-developer-surround":530},[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":13,"authors":206,"badge":212,"body":214,"date":519,"description":520,"extension":521,"image":522,"meta":525,"navigation":526,"path":14,"seo":527,"status":528,"stem":15,"__hash__":529},"posts\u002F2.blog\u002F20220626.i-am-a-dark-matter-developer.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},"Blog",{"type":215,"value":216,"toc":502},"minimark",[217,221,229,234,244,250,259,262,272,275,280,288,297,327,330,340,343,355,358,367,371,379,389,392,395,399,402,405,408,412,433,436,440,443,446,452,456,459,464,468,471,474,478,481,485,499],[218,219,220],"p",{},"So a few things have happened lately that have made me reflect on my career and the type of developer I am.",[218,222,223,224,228],{},"And the conclusion I've come to is that I have become a ",[225,226,227],"strong",{},"Dark Matter Developer",".",[230,231,233],"h2",{"id":232},"let-me-try-to-explain","Let me try to explain",[218,235,236,237,228],{},"Way back in 2012 I remember a post by Scott Hanselman called ",[238,239,243],"a",{"href":240,"rel":241},"https:\u002F\u002Fwww.hanselman.com\u002Fblog\u002Fdark-matter-developers-the-unseen-99",[242],"nofollow","Dark Matter Developers: The Unseen 99%",[245,246,247],"blockquote",{},[218,248,249],{},"You can't see dark matter, but we're pretty sure it's there. Not only is it there, but it's MOST of what's there. We know it and we can't see it. It never shows up.",[218,251,252,253,258],{},"The analogy was a good one. But at the time I had a ",[238,254,257],{"href":255,"rel":256},"https:\u002F\u002Fchristowles.blogspot.com\u002F",[242],"Blogspot blog"," with about half a million views. I was active in the developer community and even attended a VMWorld as a speaker on a panel.",[218,260,261],{},"But over time I stopped growing publicly.",[218,263,264,265,268],{},"I stopped posting at the request of a new employer.",[266,267],"br",{},[269,270,271],"em",{},"PS. I should have left that job that second but I didn't.",[218,273,274],{},"I've been thinking about my software career, not the Craftsmanship. Not just do I write tests or refactor but am I a good developer for the community and for my career.",[276,277,279],"h3",{"id":278},"tweet-reply-and-re-tweet-from-a-programming-hero","Tweet reply and Re-tweet from a programming hero",[218,281,282,283,287],{},"First, you need to know that I never ",[238,284,286],{"href":209,"rel":285},[242],"tweet",". I think less than ten times in my life.",[218,289,290,291,296],{},"Anyway, after using and reading the source code of ",[238,292,295],{"href":293,"rel":294},"https:\u002F\u002Fgithub.com\u002Fglideapps\u002Fglide-data-grid",[242],"glide data grid"," I just tweeted thanks, it deserved it.",[245,298,301,322,323],{"className":299},[300],"twitter-tweet",[218,302,305,306,310,311,315,316,318,319],{"lang":303,"dir":304},"en","ltr","Thank You ",[238,307,309],{"href":308},"https:\u002F\u002Ftwitter.com\u002Fglideapps?ref_src=twsrc%5Etfw","@glideapps"," and ",[238,312,314],{"href":313},"https:\u002F\u002Ftwitter.com\u002Fjassmith87?ref_src=twsrc%5Etfw","@jassmith87","! Your Glide Data Grid is without a doubt the best data grid on the internet. I'm even using it in a vue app because its just that much better than everything else! ",[266,317],{},"And trust me I looked. ",[238,320,321],{"href":321},"https:\u002F\u002Ft.co\u002FdPsxTYuF2Z","— Chris Towles (@Chris_Towles) ",[238,324,326],{"href":325},"https:\u002F\u002Ftwitter.com\u002FChris_Towles\u002Fstatus\u002F1539814088666238976?ref_src=twsrc%5Etfw","June 23, 2022",[218,328,329],{},"To my shock I got a reply from Jason himself.",[245,331,333,336,337],{"className":332},[300],[218,334,335],{"lang":303,"dir":304},"Thank you so much amigo :) Let me know if you have any problems.","— Jason Smith (@jassmith87) ",[238,338,326],{"href":339},"https:\u002F\u002Ftwitter.com\u002Fjassmith87\u002Fstatus\u002F1539816474054840320?ref_src=twsrc%5Etfw",[218,341,342],{},"And he even retweeted my tweet.",[245,344,346,336,352],{"className":345},[300],[218,347,348,349],{"lang":303,"dir":304},"Shameless retweet because I'm proud. ",[238,350,351],{"href":351},"https:\u002F\u002Ft.co\u002Ft23VqcI7Mq",[238,353,326],{"href":354},"https:\u002F\u002Ftwitter.com\u002Fjassmith87\u002Fstatus\u002F1539816533261619200?ref_src=twsrc%5Etfw",[218,356,357],{},"I was really surprised. It made my day and more importantly made me think. I use Open Source all the time and never give back. I learn so much by standing on the shoulders of giants. I have the skills to help, to contribute to the open source community, and never find the time. And to Jason it's not a Shameless retweet, you should be proud. Thanks for sharing your code with the rest of us.",[245,359,360],{},[218,361,362,363,366],{},"TODO: I will do another post about just the amazing ",[238,364,295],{"href":293,"rel":365},[242],". It's basically a fully functional, easy to use data grid with really similar Excel or Google Sheets-like functionality for things like keyboard navigation, filling, filtering, copying, and pasting. It is a really great library considering how historically bad data grid libraries are.",[276,368,370],{"id":369},"the-github-copilot-debate","The Github Copilot Debate",[218,372,373,374,378],{},"So while everyone I follow on Twitter had a take on ",[375,376,377],"code",{},"Microsoft\u002FGithub"," beginning to charge for the service.",[245,380,382,385,386],{"className":381},[300],[218,383,384],{"lang":303,"dir":304},"It would have been very simple for github to be ethical when they made copilot. All they had to do was add an opt-in to github where you could mark your project as allowing copilot or not. Whether or not what they're doing turns out to be legal, they eschewed the ethical option.","— Casey Muratori (@cmuratori) ",[238,387,326],{"href":388},"https:\u002F\u002Ftwitter.com\u002Fcmuratori\u002Fstatus\u002F1540078652246749184?ref_src=twsrc%5Etfw",[218,390,391],{},"Every developer I follow had code that had been used in training github copilot.",[218,393,394],{},"I had a different take, I had already got my credit card and was quick to pay for the GitHub copilot service. I should have been more impacted by the problem. It didn't hurt me and it should have.",[276,396,398],{"id":397},"career-direction","Career Direction",[218,400,401],{},"At work, at times I'm not sure how much I contribute to the big picture. I work on my projects and help others but can not always tell if the work I do is impacting the future of the company.",[218,403,404],{},"I think most people feel this way and we all have some impostor syndrome.",[218,406,407],{},"The issue is I have some ideas on how to change that but wasn't sure if the work that would require is the direction I want my career to go. It would mean a lot more systems architecture and maybe DevOps than strict development. I concluded that I am ok with that.",[230,409,411],{"id":410},"solution","Solution",[218,413,414,415,420,421,426,427,432],{},"I follow people like ",[238,416,419],{"href":417,"rel":418},"https:\u002F\u002Ftwitter.com\u002Fjassmith87",[242],"jassmith87",", ",[238,422,425],{"href":423,"rel":424},"https:\u002F\u002Ftwitter.com\u002Fantfu7",[242],"antfu7"," (maybe the most productive developer on the planet), and ",[238,428,431],{"href":429,"rel":430},"https:\u002F\u002Ftwitter.com\u002Fremi_rousselet",[242],"remi_rousselet",". I learn from these giants and stand on their shoulders. I should try to let some others stand on mine.",[218,434,435],{},"I'm going to break the problem into a few weekly and monthly tasks. The goal is to change my habits, not to set impossible goals.",[276,437,439],{"id":438},"goal-commit-publicly-at-least-twice-per-week","Goal: Commit Publicly at least twice per week",[218,441,442],{},"So this should hopefully be clear.",[218,444,445],{},"I constantly write code, at work, on weekends, and late nights but tend to continue working on whatever work project I found interesting. I've done this for the last 25 years.... (another post on realizing I've been doing this a long time later.)",[218,447,448,451],{},[225,449,450],{},"Rules:"," Two public commits per week, only one of which can be a blog post.",[276,453,455],{"id":454},"goal-at-least-one-pr-merged-into-an-open-source-project-quarterly","Goal: at least one PR merged into an Open Source Project quarterly",[218,457,458],{},"I use tons of Open Source and it's time I started giving back to the community that has given me and the world so much. This career lets me live a comfortable life with my wife and kids and I should help others do the same.",[218,460,461,463],{},[225,462,450],{}," Must have more than 100 Stars.",[276,465,467],{"id":466},"goal-finish-a-certification","Goal: Finish a Certification",[218,469,470],{},"I am a jack of all trades. I haven't focused in any one area, and considering how much AWS work I do, I'm going to focus there, completing a certification as a measurable task.",[218,472,473],{},"This seems like a good habit to improve my skills.",[276,475,477],{"id":476},"results","Results",[218,479,480],{},"The plan is to follow up on this post next month and see if I changed. I set a calendar event to update this post next month.",[230,482,484],{"id":483},"follow-up-on-2022-07-14","Follow up on 2022-07-14",[218,486,487,488,493,494,228],{},"So I have been committing publicly more and even got a simple PR merged into ",[238,489,492],{"href":490,"rel":491},"https:\u002F\u002Fgithub.com\u002Fvitest-dev\u002Fvitest\u002Fpull\u002F1558",[242],"Vitest"," and opened another one for ",[238,495,498],{"href":496,"rel":497},"https:\u002F\u002Fgithub.com\u002Fvuejs\u002Fvitepress\u002F",[242],"Vitepress",[218,500,501],{},"It is a start!",{"title":503,"searchDepth":504,"depth":504,"links":505},"",2,[506,512,518],{"id":232,"depth":504,"text":233,"children":507},[508,510,511],{"id":278,"depth":509,"text":279},3,{"id":369,"depth":509,"text":370},{"id":397,"depth":509,"text":398},{"id":410,"depth":504,"text":411,"children":513},[514,515,516,517],{"id":438,"depth":509,"text":439},{"id":454,"depth":509,"text":455},{"id":466,"depth":509,"text":467},{"id":476,"depth":509,"text":477},{"id":483,"depth":504,"text":484},"2022-06-26","Reflecting on my career and the type of developer I am.","md",{"src":523,"alt":524},"\u002Fimages\u002Fblog\u002Fdark-matter-closing-laptop.jpg","A laptop with a dark matter theme",{},true,{"title":13,"description":520},"published","TZcYJ_ng60cwsuck6FA9Qeau8VF5Q4b1QrwUA4kRxAo",[531,533],{"title":9,"path":10,"stem":11,"description":532,"status":528,"children":-1},"So my main project at work is a Vue 2 and Vuetify 2 site, but privately I have been playing with Vue 3 and loved the Composition API to avoid mixins. Due to some new features, we are planning to build soon. I wanted to write it in Vue 3, to prevent needing to migrate it later.",{"title":17,"path":18,"stem":19,"description":534,"status":528,"children":-1},"Helping everyone to understand the commit history and its purpose",1776221196452]