AI as a Tool, Not a Substitute for Thought
AI can amplify judgment or replace it. The difference is intentionality—which skills we delegate, which we strengthen, and how we spend the time we save.
Read moreThinking, documented. Writing on AI, engineering, integrations, and product craft.
AI can amplify judgment or replace it. The difference is intentionality—which skills we delegate, which we strengthen, and how we spend the time we save.
Read more →Pre-commit hooks, GitHub Actions, and SonarQube—three free layers that catch secrets, CVEs, and Django footguns without a sales call.
Read more →Send default SMS replies with Twilio TwiML Bins—no webhook server, no deploy. Welcome messages and acknowledgements straight from the Console.
Read more →NVM_SYMLINK fails when C:\\Program Files\\nodejs is a real folder, not a symlink. Here is a guaranteed step-by-step fix for the activation error.
Read more →How I moved a Django app from MySQL to PostgreSQL safely—and the open-source toolkit I built with dry-run, connection checks, and type mapping.
Read more →Instead of giant terminal prompts, leave @implement and @docs comment directives in your code—breadcrumbs your AI can follow right where the work lives.
Read more →We used to plan before we typed. Now we prompt, push, and patch. Are we trading craftsmanship for the fleeting high of a green pipeline?
Read more →We've all reached for `any` as a quick fix, but it comes at a steep cost. Discover why `unknown` is the safer, smarter alternative that will save you from future headaches.
Read more →AI can amplify judgment or replace it. The difference is intentionality—which skills we delegate, which we strengthen, and how we spend the time we save.
Read more →Instead of giant terminal prompts, leave @implement and @docs comment directives in your code—breadcrumbs your AI can follow right where the work lives.
Read more →We used to plan before we typed. Now we prompt, push, and patch. Are we trading craftsmanship for the fleeting high of a green pipeline?
Read more →On a machine with more than one GitHub account, "Repository not found" usually means the wrong identity is cached—not a bad remote URL.
Read more →Instead of giant terminal prompts, leave @implement and @docs comment directives in your code—breadcrumbs your AI can follow right where the work lives.
Read more →A short, practical walkthrough of diagnosing slow SonarQube scans on Docker Desktop for Windows, fixing it with a .wslconfig file, and validating the change against Microsoft's official spec.
Read more →NVM_SYMLINK fails when C:\\Program Files\\nodejs is a real folder, not a symlink. Here is a guaranteed step-by-step fix for the activation error.
Read more →On a machine with more than one GitHub account, "Repository not found" usually means the wrong identity is cached—not a bad remote URL.
Read more →Don't disable the linter or ignore yellow squiggles. The humble underscore `_` signals intentional unused vars—and keeps `@typescript-eslint/no-unused-vars` earning its keep.
Read more →AI can amplify judgment or replace it. The difference is intentionality—which skills we delegate, which we strengthen, and how we spend the time we save.
Read more →Pre-commit hooks, GitHub Actions, and SonarQube—three free layers that catch secrets, CVEs, and Django footguns without a sales call.
Read more →How I moved a Django app from MySQL to PostgreSQL safely—and the open-source toolkit I built with dry-run, connection checks, and type mapping.
Read more →A short, practical walkthrough of diagnosing slow SonarQube scans on Docker Desktop for Windows, fixing it with a .wslconfig file, and validating the change against Microsoft's official spec.
Read more →On a machine with more than one GitHub account, "Repository not found" usually means the wrong identity is cached—not a bad remote URL.
Read more →On a machine with more than one GitHub account, "Repository not found" usually means the wrong identity is cached—not a bad remote URL.
Read more →Someone asked me a question I thought I could answer in a sentence. I gave them my job title instead.
Read more →Send default SMS replies with Twilio TwiML Bins—no webhook server, no deploy. Welcome messages and acknowledgements straight from the Console.
Read more →Don't disable the linter or ignore yellow squiggles. The humble underscore `_` signals intentional unused vars—and keeps `@typescript-eslint/no-unused-vars` earning its keep.
Read more →NVM_SYMLINK fails when C:\\Program Files\\nodejs is a real folder, not a symlink. Here is a guaranteed step-by-step fix for the activation error.
Read more →How I moved a Django app from MySQL to PostgreSQL safely—and the open-source toolkit I built with dry-run, connection checks, and type mapping.
Read more →Someone asked me a question I thought I could answer in a sentence. I gave them my job title instead.
Read more →Pre-commit hooks, GitHub Actions, and SonarQube—three free layers that catch secrets, CVEs, and Django footguns without a sales call.
Read more →A short, practical walkthrough of diagnosing slow SonarQube scans on Docker Desktop for Windows, fixing it with a .wslconfig file, and validating the change against Microsoft's official spec.
Read more →Send default SMS replies with Twilio TwiML Bins—no webhook server, no deploy. Welcome messages and acknowledgements straight from the Console.
Read more →Don't disable the linter or ignore yellow squiggles. The humble underscore `_` signals intentional unused vars—and keeps `@typescript-eslint/no-unused-vars` earning its keep.
Read more →Someone asked me a question I thought I could answer in a sentence. I gave them my job title instead.
Read more →A short, practical walkthrough of diagnosing slow SonarQube scans on Docker Desktop for Windows, fixing it with a .wslconfig file, and validating the change against Microsoft's official spec.
Read more →