<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kai</title>
    <description>The latest articles on Forem by Kai (@kai_outputs).</description>
    <link>https://forem.com/kai_outputs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3887146%2F12156960-452d-4910-95ce-fa465619756e.png</url>
      <title>Forem: Kai</title>
      <link>https://forem.com/kai_outputs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kai_outputs"/>
    <language>en</language>
    <item>
      <title>Sensitive Env Vars Should Be Default, Not Opt-In</title>
      <dc:creator>Kai</dc:creator>
      <pubDate>Mon, 20 Apr 2026 07:47:12 +0000</pubDate>
      <link>https://forem.com/kai_outputs/sensitive-env-vars-should-be-default-not-opt-in-2m9j</link>
      <guid>https://forem.com/kai_outputs/sensitive-env-vars-should-be-default-not-opt-in-2m9j</guid>
      <description>&lt;p&gt;I wrote &lt;a href="https://dev.to/kai_outputs/the-vercel-breach-hit-one-of-my-projects-heres-what-10-minutes-of-cleanup-looked-like-44ia"&gt;a post earlier today&lt;/a&gt; about cleaning up after the Vercel breach. The cleanup itself is easy — ten minutes, a sequence of clicks, done.&lt;/p&gt;

&lt;p&gt;What's been bugging me all afternoon is a different question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is "sensitive" opt-in?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The implicit default is wrong
&lt;/h2&gt;

&lt;p&gt;When you add an env var to Vercel, it's not marked sensitive by default. You have to remember to toggle it.&lt;/p&gt;

&lt;p&gt;This is the wrong default for a class of values where 99% of the time, "sensitive" is what you want.&lt;/p&gt;

&lt;p&gt;Think about the actual population of env vars in any real project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys for third-party services — &lt;strong&gt;sensitive&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Database URLs — &lt;strong&gt;sensitive&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Signing secrets — &lt;strong&gt;sensitive&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Stripe keys, Auth0 secrets, etc — &lt;strong&gt;sensitive&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Feature flags — occasionally sensitive&lt;/li&gt;
&lt;li&gt;Config booleans — usually not sensitive&lt;/li&gt;
&lt;li&gt;Public API base URLs — not sensitive (they're in the client bundle anyway)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most teams, the split is maybe 80/20 in favor of "should be sensitive." Maybe 90/10.&lt;/p&gt;

&lt;p&gt;A default that matches 10-20% of cases is a design mistake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the default exists
&lt;/h2&gt;

&lt;p&gt;Vercel has a specific technical reason: sensitive env vars can't be read after they're set. You can only overwrite or delete. This makes debugging harder when you're troubleshooting "is the value what I think it is?" The opt-in default gives you a debugging escape hatch.&lt;/p&gt;

&lt;p&gt;Fine. But the escape hatch should be the exception, not the default. Debugging an env var value is maybe 1% of the time you interact with env vars. Protecting against leaks is 100% of the time.&lt;/p&gt;

&lt;p&gt;Moving from "default not-sensitive, opt-in sensitive" to "default sensitive, opt-out for debugging" would match the actual weight of the two concerns.&lt;/p&gt;

&lt;h2&gt;
  
  
  The minimal workflow change
&lt;/h2&gt;

&lt;p&gt;I can't change Vercel's default. I can change my own habit.&lt;/p&gt;

&lt;p&gt;Before today: add env var, fill in value, save. Maybe remember to toggle sensitive. Maybe not.&lt;/p&gt;

&lt;p&gt;After today: &lt;strong&gt;add env var, fill in value, sensitive ON, save&lt;/strong&gt;. If I later need to debug, I'll flip it off, verify, flip it back.&lt;/p&gt;

&lt;p&gt;The cost is two extra clicks at creation time. The benefit is that every future breach like today's is a non-event.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generalizing: safe defaults for tiny projects
&lt;/h2&gt;

&lt;p&gt;There's a broader principle here. Small projects skip security hygiene because the perceived cost-benefit is wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"I have no users, who'd target me?" — but breaches are opportunistic, not targeted&lt;/li&gt;
&lt;li&gt;"I'll tighten security when I scale" — but by then you have user data in the loss radius&lt;/li&gt;
&lt;li&gt;"Defaults are too paranoid for my usecase" — but defaults are designed for the median case, which is &lt;em&gt;probably you&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix isn't to be paranoid. The fix is to use tools' safest defaults and only opt out when there's a specific reason. Think of it as borrowing the thinking of a larger team.&lt;/p&gt;

&lt;p&gt;Concretely for a solo/indie Next.js + Vercel setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Env vars&lt;/strong&gt;: sensitive by default. I explained my reasoning above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment protection&lt;/strong&gt;: "Standard" minimum. Blocks preview deploys from being publicly indexed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branch protection on main&lt;/strong&gt;: requires PR + review even if the reviewer is yourself 24h later. Catches "oh no I just committed the API key" before push.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-commit hook scanning for secrets&lt;/strong&gt;: cheap to set up, catches the stupid ones. I wrote &lt;a href="https://dev.to/kai_outputs/my-ai-heavy-indie-stack-actually-honest-breakdown-2jim"&gt;a piece about mine&lt;/a&gt; — it's a 30-line shell script and it's caught me twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service-specific secret rotation&lt;/strong&gt;: quarterly, on a calendar. Not because you expect a breach. Because it bounds the window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate secrets by environment&lt;/strong&gt;: production secrets live &lt;em&gt;only&lt;/em&gt; in production. Preview and development use their own keys or dummy values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each individual control takes five to thirty minutes to set up. None of them are hard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The meta-lesson
&lt;/h2&gt;

&lt;p&gt;Security defaults are worth thinking about critically because the cost of getting them wrong only shows up asymmetrically — nothing happens 99 times, something catastrophic happens on the 100th.&lt;/p&gt;

&lt;p&gt;Most of us outsource this thinking to platform defaults and assume platforms get it right. Today was a reminder that platforms sometimes get it right for &lt;em&gt;the platform&lt;/em&gt;, not for &lt;em&gt;you&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Audit your defaults. Pick the ones that cost you two clicks and buy you asymmetric downside protection.&lt;/p&gt;




&lt;p&gt;Three cups of tea. No coffee. Sensitive flag ON from now on. Lesson logged.&lt;/p&gt;

</description>
      <category>security</category>
      <category>vercel</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Vercel Breach Hit One of My Projects. Here's What 10 Minutes of Cleanup Looked Like.</title>
      <dc:creator>Kai</dc:creator>
      <pubDate>Mon, 20 Apr 2026 06:42:26 +0000</pubDate>
      <link>https://forem.com/kai_outputs/the-vercel-breach-hit-one-of-my-projects-heres-what-10-minutes-of-cleanup-looked-like-44ia</link>
      <guid>https://forem.com/kai_outputs/the-vercel-breach-hit-one-of-my-projects-heres-what-10-minutes-of-cleanup-looked-like-44ia</guid>
      <description>&lt;p&gt;Vercel disclosed a security incident today. The short version: a third-party AI tool (Context.ai) used by a Vercel employee got compromised, the attacker took over the employee's Google Workspace, and used that to access some Vercel environments and environment variables not flagged as "sensitive."&lt;/p&gt;

&lt;p&gt;I checked my dashboard expecting the all-clear.&lt;/p&gt;

&lt;p&gt;One of my env vars had a "Need to Rotate" tag. I was in the affected subset.&lt;/p&gt;

&lt;p&gt;Here's the full cleanup, in the order I did it, with what I'd do differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the tag looks like
&lt;/h2&gt;

&lt;p&gt;Vercel surfaced this in two ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The affected subset gets an email from Vercel security&lt;/li&gt;
&lt;li&gt;The dashboard shows a yellow "Need to Rotate" badge on the specific env var&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't get the email (or it went to a spam folder I didn't check). The dashboard tag is what told me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson already learned&lt;/strong&gt;: the dashboard is the authoritative source during an incident. Don't wait for the email.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 10-minute recovery
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Do NOT revoke the old key first
&lt;/h3&gt;

&lt;p&gt;I almost did. If you revoke before you've cut over, your production endpoint dies between revoke and replacement.&lt;/p&gt;

&lt;p&gt;Order matters: &lt;strong&gt;new key → update env → verify → revoke old&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Generate a new key
&lt;/h3&gt;

&lt;p&gt;Go to the provider (in my case, the email API vendor whose key was exposed). Create a new key with the same permissions as the old one. Name it with the date — &lt;code&gt;vendor-prod-20260420&lt;/code&gt; — so future-me knows what it was for.&lt;/p&gt;

&lt;p&gt;Copy the key immediately. Most providers show it exactly once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Update the Vercel env var
&lt;/h3&gt;

&lt;p&gt;In Vercel dashboard: &lt;code&gt;Project → Settings → Environment Variables&lt;/code&gt;. Find the compromised one. Edit.&lt;/p&gt;

&lt;p&gt;Paste the new value.&lt;/p&gt;

&lt;p&gt;And here's the critical part — &lt;strong&gt;toggle "Sensitive" on&lt;/strong&gt;. If your env var was marked Sensitive before the incident, Vercel's bulletin says those values were stored in a way that prevented them from being read. The attacker only had access to non-sensitive ones.&lt;/p&gt;

&lt;p&gt;Small gotcha: Sensitive env vars can't exist in the Development environment. Just Production + Preview. That's fine for most setups — you use &lt;code&gt;.env.local&lt;/code&gt; for dev anyway.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Redeploy
&lt;/h3&gt;

&lt;p&gt;An env var change does &lt;strong&gt;not&lt;/strong&gt; automatically trigger a deployment. You have to redeploy manually or the new value won't hit your running production.&lt;/p&gt;

&lt;p&gt;Deployments tab → latest production → &lt;code&gt;⋯&lt;/code&gt; → Redeploy. Don't reuse the build cache.&lt;/p&gt;

&lt;p&gt;Two minutes later, production is running the new key.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Verify it works
&lt;/h3&gt;

&lt;p&gt;Hit your endpoint with a test request. In my case, I did a real newsletter signup from the public site with a test email. Got a 200 back, saw the test contact in the email vendor's dashboard. New key live.&lt;/p&gt;

&lt;p&gt;If you skip this step and the new key has a typo or permission gap, you won't know until the next real user hits the broken endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: &lt;em&gt;Now&lt;/em&gt; revoke the old key
&lt;/h3&gt;

&lt;p&gt;Back at the provider. Revoke. Confirm.&lt;/p&gt;

&lt;p&gt;This is the step where the potential leak actually closes. Everything before was setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Audit your other env vars
&lt;/h3&gt;

&lt;p&gt;While you're in there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mark everything sensitive that should be sensitive (retroactive fix)&lt;/li&gt;
&lt;li&gt;Delete any env vars you're no longer using&lt;/li&gt;
&lt;li&gt;Enable Deployment Protection if you haven't already&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The relief
&lt;/h2&gt;

&lt;p&gt;My service hasn't really reached anyone yet. Few subscribers, no paying users yet. If the leaked key had been exploited, the blast radius was… honestly, close to nothing.&lt;/p&gt;

&lt;p&gt;That's luck, not good practice.&lt;/p&gt;

&lt;p&gt;In a universe where this project was six months older and had real traffic, a compromised email API key could have meant someone sending spam from my verified domain, burning my sender reputation, and me finding out three days later when delivery rates cratered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The time to mark env vars as sensitive is when you create them. Not after an incident.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm changing going forward
&lt;/h2&gt;

&lt;p&gt;Three things:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Sensitive flag is the default, not the exception
&lt;/h3&gt;

&lt;p&gt;Every new env var starts as Sensitive unless there's a specific reason it can't be (like needing it in the Development environment for local proxy testing).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Secret rotation is a quarterly habit, not an emergency
&lt;/h3&gt;

&lt;p&gt;The value of rotating keys every 90 days isn't that you expect a breach. It's that if one happens, the window of exposure is bounded. Even loosely-stored keys can only do so much damage if they're less than 90 days old when leaked.&lt;/p&gt;

&lt;p&gt;I'm adding a calendar reminder. 4 reminders a year, 10 minutes each. Trivial cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Third-party AI tools are supply chain dependencies now
&lt;/h3&gt;

&lt;p&gt;This breach didn't come from Vercel's security posture. It came from an AI tool one employee used. The attacker didn't need to crack Vercel — they just needed to compromise a vendor that had access to a Vercel employee's account.&lt;/p&gt;

&lt;p&gt;Every AI integration in your dev workflow has some access scope. It reads your repo, or your terminal, or your cloud console, or your credentials. That access is attack surface.&lt;/p&gt;

&lt;p&gt;I'm going to start writing down, in a flat text file, every AI tool I've authorized on what scope. Not to get paranoid — just so I know what to rotate if one of them makes the news.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I was in the affected subset. Found out via the dashboard tag, not email.&lt;/li&gt;
&lt;li&gt;10 minutes of cleanup: new key → update env → redeploy → verify → revoke old → mark sensitive.&lt;/li&gt;
&lt;li&gt;Lucky the project was small. In a larger context, this could have been bad.&lt;/li&gt;
&lt;li&gt;Going forward: Sensitive flag by default, quarterly rotation habit, AI tool access log.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three cups of tea. No coffee. Still tired. Good day to log a lesson.&lt;/p&gt;

</description>
      <category>security</category>
      <category>vercel</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>5 Claude Code Workflows I Use Every Day (For the Boring 80%)</title>
      <dc:creator>Kai</dc:creator>
      <pubDate>Mon, 20 Apr 2026 05:47:32 +0000</pubDate>
      <link>https://forem.com/kai_outputs/5-claude-code-workflows-i-use-every-day-for-the-boring-80-5ak0</link>
      <guid>https://forem.com/kai_outputs/5-claude-code-workflows-i-use-every-day-for-the-boring-80-5ak0</guid>
      <description>&lt;p&gt;People keep asking me what my Claude Code "prompts" are.&lt;/p&gt;

&lt;p&gt;I don't really have prompts. I have workflows. Small, boring, repeatable things that each save me 10-30 minutes, and at the end of a day add up to why I can keep shipping around a day job.&lt;/p&gt;

&lt;p&gt;Here are five I use almost every session.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "Before you edit, grep."
&lt;/h2&gt;

&lt;p&gt;When I hand Claude Code a task that touches something broader than a single file — a rename, a pattern change, a refactor — I start the session with one directive:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Before you edit anything, grep for all occurrences of &lt;code&gt;X&lt;/code&gt;. Show me the list. I'll tell you which ones to change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That single sentence has prevented more bad edits in my repos than any test suite. It forces the AI to &lt;strong&gt;enumerate the scope&lt;/strong&gt; before it takes action, and it gives me a natural "stop, this is too big" moment.&lt;/p&gt;

&lt;p&gt;The cost is 15 seconds. The upside is not finding out three hours later that it renamed something in a migration script.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. "Write the test first. Fail it. Then fix it."
&lt;/h2&gt;

&lt;p&gt;Not because I'm a TDD purist. I'm not. But AI is weirdly good at writing confident code that does the wrong thing, and tests are the cheapest way to catch that.&lt;/p&gt;

&lt;p&gt;My actual phrasing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write a failing test for the bug I just described. Run it. Confirm it fails for the right reason. Then write the fix. Then re-run.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The "run it. Confirm it fails for the right reason" is the key. Tests that pass by accident are worse than no tests — they give false confidence. Forcing the AI to watch its own red-to-green transition catches the subtle "test was wrong, code is actually broken" cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. "Explain, then diff."
&lt;/h2&gt;

&lt;p&gt;When I'm learning something new — a library API, a framework pattern, a language feature — I don't let Claude just write it for me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Before writing code, explain what you're going to do in plain English. What calls what. What the state machine looks like. Then write the diff.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without this, I end up with working code I don't understand, and understanding-debt compounds until I get burned on the second or third iteration.&lt;/p&gt;

&lt;p&gt;With it, I read three paragraphs and then review a diff. My comprehension stays current, and my edits are informed.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. "Grep my notes first."
&lt;/h2&gt;

&lt;p&gt;I keep a flat directory of &lt;code&gt;.md&lt;/code&gt; files with notes from past sessions. Problems I solved, patterns I chose, decisions I'd regret if I forgot. Not a fancy system. Just markdown.&lt;/p&gt;

&lt;p&gt;When I start a new session on a related topic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Read &lt;code&gt;~/notes/&lt;/code&gt; (look for filenames matching the topic). Summarize what I've already decided before suggesting anything new.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This catches the "we already tried that and rejected it" case before I waste an hour rebuilding the rejected path. It also forces me to keep writing those notes, because now they have a feedback loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. "Pick one. Ask before the others."
&lt;/h2&gt;

&lt;p&gt;When I give Claude a list of 4-5 things to do, it used to just plow through all of them. Sometimes halfway through it would change its mind about #1 based on what it learned in #3, and I'd end up with an inconsistent mess.&lt;/p&gt;

&lt;p&gt;Now:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do #1. Stop. Show me what you did. Wait for me to say continue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Multi-step autonomy is great for well-scoped tasks. For fuzzy ones — anything exploratory, anything touching architectural decisions — forcing a checkpoint between steps keeps the work coherent.&lt;/p&gt;

&lt;p&gt;Opus 4.7 is better at self-checkpointing, but I still add this explicitly when the stakes are non-trivial.&lt;/p&gt;

&lt;h2&gt;
  
  
  The meta-workflow
&lt;/h2&gt;

&lt;p&gt;What these have in common:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cheap to run.&lt;/strong&gt; None of them take more than 30 seconds of me typing or 60 seconds of Claude thinking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fail loud.&lt;/strong&gt; If they break, I know immediately, not three hours later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compound.&lt;/strong&gt; Each one is worth a few minutes. Stack five of them and the day opens up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boring.&lt;/strong&gt; None of them are clever. They're just discipline encoded in a sentence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I used to write long system prompts. I don't bother anymore. Five short workflows, applied ruthlessly, outperform any clever preamble.&lt;/p&gt;




&lt;p&gt;Three cups of tea, no coffee, still tired. Shipping anyway.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Claude Opus 4.7 Field Report: Eight Hours of Autonomous Work</title>
      <dc:creator>Kai</dc:creator>
      <pubDate>Mon, 20 Apr 2026 00:53:14 +0000</pubDate>
      <link>https://forem.com/kai_outputs/claude-opus-47-field-report-eight-hours-of-autonomous-work-10e3</link>
      <guid>https://forem.com/kai_outputs/claude-opus-47-field-report-eight-hours-of-autonomous-work-10e3</guid>
      <description>&lt;p&gt;Anthropic released Claude Opus 4.7 yesterday. The headline feature is &lt;strong&gt;hours-long autonomous work&lt;/strong&gt; without constant course-correction.&lt;/p&gt;

&lt;p&gt;I put it to the test on something real. Here's the field report.&lt;/p&gt;

&lt;h2&gt;
  
  
  The task
&lt;/h2&gt;

&lt;p&gt;A side project of mine had a scheduled-post automation that had been broken for about a week. Posts were going out at wrong times. The root cause could have been timezone handling, API auth, queue state, or all three. I wasn't sure.&lt;/p&gt;

&lt;p&gt;I gave Opus 4.7 this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find out why scheduled posts are firing at wrong times. Check the scheduler code, the API responses, the timezone handling in the storage layer, the queue state, and the actual fired-post logs. Fix the underlying issue. Don't just patch the symptom.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then I went to do other things for about 8 hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;It didn't fix the bug in 8 hours. But it did something more interesting.&lt;/p&gt;

&lt;p&gt;It:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reproduced the bug reliably.&lt;/li&gt;
&lt;li&gt;Instrumented 4 different layers of the stack with debug logs.&lt;/li&gt;
&lt;li&gt;Wrote a test harness that fired fake posts through the pipeline with controlled timestamps.&lt;/li&gt;
&lt;li&gt;Identified that the bug was actually &lt;strong&gt;two bugs, not one&lt;/strong&gt; — one in my storage layer (naive local timestamps), one in the scheduler (assumed UTC input).&lt;/li&gt;
&lt;li&gt;Proposed a fix for the storage layer that would require a one-time migration of existing data.&lt;/li&gt;
&lt;li&gt;Stopped there and asked me whether the migration was acceptable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last bullet is the thing. Earlier Claude releases would either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Just charge ahead and migrate (scary)&lt;/li&gt;
&lt;li&gt;Stop way earlier and ask what to do (annoying)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This version &lt;strong&gt;did a long stretch of investigative work, correctly identified a decision that needed human input, and parked there&lt;/strong&gt;. That's the skill level I've been waiting for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it drifted
&lt;/h2&gt;

&lt;p&gt;Three places.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Scope creep on the test harness.&lt;/strong&gt;&lt;br&gt;
I asked for a fix. It wrote a fairly elaborate test suite as part of the investigation. Useful, but not what I asked for, and it ate context window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. It over-explained the storage layer bug.&lt;/strong&gt;&lt;br&gt;
The explanation was correct but long. Three paragraphs when one sentence would have worked. Earlier releases were more concise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It assumed my time zone from context.&lt;/strong&gt;&lt;br&gt;
I hadn't told it what TZ I was in. It inferred from some filename references. It inferred correctly, but I'd rather be asked than guessed at. This is a tiny thing.&lt;/p&gt;

&lt;p&gt;None of these are blockers. They're polish issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  What didn't drift
&lt;/h2&gt;

&lt;p&gt;The parts that mattered held up.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It stayed on task for the full session without me re-anchoring it.&lt;/li&gt;
&lt;li&gt;It didn't hallucinate API shapes — when it wasn't sure, it read actual responses.&lt;/li&gt;
&lt;li&gt;It wrote diffs I could read and approve line by line.&lt;/li&gt;
&lt;li&gt;It caught a genuinely subtle second bug that I had missed in my own debugging earlier.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this actually changes
&lt;/h2&gt;

&lt;p&gt;For me, the jump from Opus 4.6 to 4.7 is the jump from &lt;em&gt;"pair programming assistant"&lt;/em&gt; to &lt;em&gt;"junior engineer with better taste than me on average, but who still needs to check in."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's a qualitative shift.&lt;/p&gt;

&lt;p&gt;Before 4.7, I would ask for scoped single-file tasks and stitch the results together. After 4.7, I can give multi-layer tasks that cross files, modules, and domains, and the output is coherent.&lt;/p&gt;

&lt;p&gt;The work I used to do — context stitching, keeping state across sessions, reminding the AI what we were doing — that work got cheaper this week.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it still can't do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Decide whether a product is worth building&lt;/li&gt;
&lt;li&gt;Decide what a feature should feel like&lt;/li&gt;
&lt;li&gt;Pick which bug is worth fixing first&lt;/li&gt;
&lt;li&gt;Explain to a user why their workflow is wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting part is still mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical takeaway
&lt;/h2&gt;

&lt;p&gt;If you're already using Claude Code or Claude through an editor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Give it bigger tasks than you used to. It can handle them.&lt;/li&gt;
&lt;li&gt;Still ask it to stop before destructive actions. That behavior is there now, but it's still polite to scope it.&lt;/li&gt;
&lt;li&gt;Don't bother with "think step by step" — that's implicit at this level.&lt;/li&gt;
&lt;li&gt;Read the diffs. You'll learn things.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you weren't using Claude before: this is probably the release worth trying.&lt;/p&gt;




&lt;p&gt;Eight hours of autonomous work, two real bugs found, one fix migration decision parked for me. Net positive. Still tired.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My AI-Heavy Indie Stack (Actually Honest Breakdown)</title>
      <dc:creator>Kai</dc:creator>
      <pubDate>Mon, 20 Apr 2026 00:52:33 +0000</pubDate>
      <link>https://forem.com/kai_outputs/my-ai-heavy-indie-stack-actually-honest-breakdown-2jim</link>
      <guid>https://forem.com/kai_outputs/my-ai-heavy-indie-stack-actually-honest-breakdown-2jim</guid>
      <description>&lt;p&gt;A few weeks ago I posted a thread that ended with &lt;em&gt;"here's the setup, in honest detail:"&lt;/em&gt; — and then I didn't deliver the detail.&lt;/p&gt;

&lt;p&gt;That was bad form. Let me fix it.&lt;/p&gt;

&lt;p&gt;This is the actual stack I use to ship indie projects around a day job, with ADHD eating my executive function most days. It's not impressive. It's just relentless.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottleneck isn't what people think
&lt;/h2&gt;

&lt;p&gt;The thing AI changed for me isn't code quality. It's &lt;strong&gt;sequencing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I can think the whole product. I can describe it in three paragraphs. The break in my workflow happened between "I know what I want" and "here are the 40 micro-decisions required to start typing." That gap used to eat days.&lt;/p&gt;

&lt;p&gt;With AI handling the sequencing, the gap became minutes. I stopped losing evenings to paralysis.&lt;/p&gt;

&lt;p&gt;That's the whole value prop, for me. Everything below is just tooling around that insight.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Primary driver: Claude Code
&lt;/h3&gt;

&lt;p&gt;Not Cursor, not Copilot. Claude Code in a terminal. Here's why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-file edits with intent&lt;/strong&gt;: "make this template work for a pricing page instead" and it touches 6 files correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explains what it changed&lt;/strong&gt;: I read diffs and actually learn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Headless, keyboard-only&lt;/strong&gt;: which matches how my attention works.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cursor is great if your brain likes inline completions. Mine doesn't. Copilot is fine if your code is boring; the moment I go off-pattern, it fights me.&lt;/p&gt;

&lt;p&gt;The right AI tool is the one that matches your cognitive style, not the one with the best marketing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The boring glue: bash
&lt;/h3&gt;

&lt;p&gt;About 30% of my time is Claude Code. Another 20% is tiny bash scripts that do things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rename 40 files from &lt;code&gt;post-v1.mdx&lt;/code&gt; to &lt;code&gt;post-0001.mdx&lt;/code&gt; padded&lt;/li&gt;
&lt;li&gt;download all images from a list, resize, optimize&lt;/li&gt;
&lt;li&gt;grep my notes for every TODO that's older than two weeks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't write these scripts. I ask for them. Done in 90 seconds. I don't remember them. I keep a &lt;code&gt;bin/&lt;/code&gt; folder of one-liners I've forgotten writing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task memory: sqlite at &lt;code&gt;~/.local/tasks.db&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;One table. &lt;code&gt;id, what, status, updated_at&lt;/code&gt;. That's it.&lt;/p&gt;

&lt;p&gt;When I start a session I run &lt;code&gt;tasks wip&lt;/code&gt; and it tells me what I was mid-way through. When I shelve something I run &lt;code&gt;tasks park &amp;lt;what&amp;gt;&lt;/code&gt;. It's a 30-line Python script wrapping sqlite3.&lt;/p&gt;

&lt;p&gt;This one tool has done more for my shipping velocity than any "productivity app." Because I can't hold state in my head, and a database can.&lt;/p&gt;

&lt;h3&gt;
  
  
  Surface: dark mode everything, terminal-first
&lt;/h3&gt;

&lt;p&gt;I don't have a strong opinion on editors. I use VS Code because it opens. But the surface I actually &lt;em&gt;work&lt;/em&gt; in is the terminal: tmux + a vim split + claude code running in another pane.&lt;/p&gt;

&lt;p&gt;Light mode is a tax on my eyes. Coffee is a tax on my ADHD. I optimize around not paying taxes I don't need to pay.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fuel: tea, not coffee
&lt;/h3&gt;

&lt;p&gt;This isn't a quirky brand — it's a real choice. Caffeine amplifies my ADHD symptoms. Coffee gives me 90 minutes of rocket and then 6 hours of fried circuits.&lt;/p&gt;

&lt;p&gt;Tea, specifically black tea with milk, gives me enough alertness without the crash. Three cups a day, stop by 4pm, sleep is protected.&lt;/p&gt;

&lt;p&gt;The whole indie workflow collapses if sleep breaks. Everything else is negotiable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the stack isn't
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It isn't a framework.&lt;/strong&gt; Nobody else should copy this exactly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It isn't fast.&lt;/strong&gt; Anyone watching me work would think I'm slow. I stop constantly to check what I did. I talk to myself out loud. I forget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It isn't about discipline.&lt;/strong&gt; Willpower is the first thing to go. The stack exists so willpower isn't in the loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It isn't AI doing the work.&lt;/strong&gt; The AI handles sequencing. I still make every decision that matters — which product to build, what the thing is for, who it's for. That part hasn't gotten cheaper.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;Before: evenings and weekends were a coin flip between "ship something" and "stare at the terminal for 3 hours and give up."&lt;/p&gt;

&lt;p&gt;After: evenings and weekends are a coin flip between "ship something" and "ship something smaller." The terminal no longer stares back.&lt;/p&gt;

&lt;p&gt;That's it. No 10x, no "unlocked creativity." Just the gap between idea and execution got cheap, and now I can afford to try things.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part the stack can't do
&lt;/h2&gt;

&lt;p&gt;Distribution.&lt;/p&gt;

&lt;p&gt;You can build three templates in a weekend with this setup. Finding anyone who cares about them is a completely different skill, and I'm bad at it. I'm learning. Slowly.&lt;/p&gt;

&lt;p&gt;That's tomorrow's post.&lt;/p&gt;




&lt;p&gt;Nothing clever. Just relentless reduction of the parts that burn out.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Claude Code as Executive Function: My ADHD-Brain Setup</title>
      <dc:creator>Kai</dc:creator>
      <pubDate>Sun, 19 Apr 2026 10:46:10 +0000</pubDate>
      <link>https://forem.com/kai_outputs/claude-code-as-executive-function-my-adhd-brain-setup-1412</link>
      <guid>https://forem.com/kai_outputs/claude-code-as-executive-function-my-adhd-brain-setup-1412</guid>
      <description>&lt;p&gt;I have ADHD. Verbal skill outpaces my motor planning by a lot — the gap measured on neuropsych testing is around forty points. That sounds abstract, but in practice it means I can think through a problem in full, narrate the solution out loud, and then sit down at my desk and watch the plan evaporate before any of it becomes code.&lt;/p&gt;

&lt;p&gt;For years I treated this as a discipline problem. More lists. Better systems. Time blocks. It never stuck, because the bottleneck was never motivation. The bottleneck was the bridge between &lt;em&gt;knowing what to do&lt;/em&gt; and &lt;em&gt;actually doing it&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Then I started using Claude Code seriously, and the bottleneck got cheap.&lt;/p&gt;

&lt;p&gt;This isn't a productivity-hack post. It's an honest writeup of the setup I use to get things shipped on days my brain would otherwise lose them. If you have ADHD, or you just find yourself with too many ideas and not enough execution, some of this might transfer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;Non-ADHD folks I've asked describe the task-to-action flow like this: "I think of what to do, then I do it." There's no perceptible step in between.&lt;/p&gt;

&lt;p&gt;My version has a perceptible step, and it's expensive. A task gets thought of, sits in working memory, waits for motor planning to convert it into action, and — most days — quietly falls out of working memory before anything happens. The more complex the action (switching contexts, opening the right file, remembering the exact syntax), the more it costs, the more likely it drops.&lt;/p&gt;

&lt;p&gt;I can reliably do small things. Big things require the brain to chain small things without dropping any. That chaining is the part that's broken.&lt;/p&gt;

&lt;p&gt;Traditional productivity advice is about keeping more things in working memory or writing better lists. Neither fixes the gap — they just give the gap a bigger surface to fail on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually helped
&lt;/h2&gt;

&lt;p&gt;What helped was outsourcing the chain.&lt;/p&gt;

&lt;p&gt;Not the &lt;em&gt;decisions&lt;/em&gt;. Not the &lt;em&gt;judgment&lt;/em&gt;. Those are still mine, and should stay mine. What I outsourced is the part where "I decided to refactor this file" has to become "I now remember the file path, open the editor, navigate to the function, remember the rename convention, write the new code, verify it compiles, commit with a good message."&lt;/p&gt;

&lt;p&gt;Every step in that chain is a place where my brain drops the thread. Claude Code handles the chain. I handle the decisions.&lt;/p&gt;

&lt;p&gt;The shift feels like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Old: &lt;em&gt;think → try to chain → lose thread → frustrate → give up or half-ship&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;New: &lt;em&gt;think → say what I want → review the diff → ship&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't get smarter. I got a prosthetic.&lt;/p&gt;

&lt;h2&gt;
  
  
  My setup, in practice
&lt;/h2&gt;

&lt;p&gt;Most of the setup is just making Claude Code remember things I'd otherwise re-explain five times. ADHD brains are especially punishing when re-explaining is required — the overhead compounds. The setup reduces re-explanation to near zero.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;CLAUDE.md&lt;/code&gt; — the project's memory
&lt;/h3&gt;

&lt;p&gt;Every repo I use Claude Code in has a &lt;code&gt;CLAUDE.md&lt;/code&gt; at the root. It holds project-level conventions, voice, tech stack, and anything I'd otherwise forget to say.&lt;/p&gt;

&lt;p&gt;For my indie side project, mine contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who I am in this project (an indie builder with specific voice)&lt;/li&gt;
&lt;li&gt;Tech stack (Next.js 16, Tailwind v4, TypeScript strict, Framer Motion)&lt;/li&gt;
&lt;li&gt;What's live vs. what's pending&lt;/li&gt;
&lt;li&gt;Token-efficiency preferences (don't overexplain, just do)&lt;/li&gt;
&lt;li&gt;Security rules (never commit PII, grep certain patterns)&lt;/li&gt;
&lt;li&gt;Key decisions already made (so I don't get second-guessed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude Code reads this file at the start of every session. I don't have to re-establish context. The AI already knows how I want to work.&lt;/p&gt;

&lt;p&gt;This is huge for ADHD. Sessions are fragmented by design — I'll pick up at weird hours, in partial states of exhaustion. Without &lt;code&gt;CLAUDE.md&lt;/code&gt;, every session starts from zero. With it, every session starts where the last one ended.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;.claude/rules/&lt;/code&gt; — doctrine files it re-reads every session
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; handles the what. &lt;code&gt;.claude/rules/&lt;/code&gt; handles the how.&lt;/p&gt;

&lt;p&gt;Mine has three files right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;content-doctrine.md&lt;/code&gt; — voice, tone, overclaim guard, native-English checks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;privacy-security.md&lt;/code&gt; — PII that must never appear, secrets management&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kai-persona.md&lt;/code&gt; — the persona I use for my public writing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't tutorials I read — they're instructions Claude Code follows. Each one has a pre-publish checklist, a never-list, and specific patterns to grep for before anything ships.&lt;/p&gt;

&lt;p&gt;The practical effect: I don't have to remember the rules. They're enforced automatically.&lt;/p&gt;

&lt;p&gt;When I'm tired and about to commit something questionable, the rules catch it. When I forget my own voice mid-article, the doctrine catches it. The rules encode "what past-me already decided" so current-me doesn't have to re-decide it at 2am.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Slash commands for the stuff I'd otherwise re-explain daily
&lt;/h3&gt;

&lt;p&gt;I built a handful of commands — markdown files in &lt;code&gt;.claude/commands/&lt;/code&gt; — for things I do over and over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/morning&lt;/code&gt; — pulls world and tech trends, writes them to a daily feed file, then drafts that day's posts for my public account&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/sync&lt;/code&gt; — updates state files after a decision shift&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/resume&lt;/code&gt; — one-shot context summary if I jump between sessions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/learn&lt;/code&gt; — records a post's reaction so I can find patterns later&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/knowledge&lt;/code&gt; — loads a topic's knowledge file only when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each command is a markdown prompt. When I type &lt;code&gt;/morning&lt;/code&gt;, Claude Code runs it exactly the same way every day. No re-explaining. No variation. No lost thread.&lt;/p&gt;

&lt;p&gt;ADHD's enemy is decision fatigue. Slash commands make daily decisions invisible. I don't wonder "what do I do now?" — I just run &lt;code&gt;/morning&lt;/code&gt; and the work starts.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Pre-commit hooks — protection from my own lapses
&lt;/h3&gt;

&lt;p&gt;I have a pre-commit hook that blocks any commit containing my personal name, personal emails, specific location markers, or API-key-shaped strings.&lt;/p&gt;

&lt;p&gt;This is belt-and-suspenders for a very real ADHD failure mode: forgetting to check. On exhausted days I'll paste something into a file I don't remember adding. The hook catches it before it becomes a git history problem.&lt;/p&gt;

&lt;p&gt;The hook is maybe 60 lines of shell. It's the cheapest line of defense I've ever added. Twice this week it caught leaks I didn't notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this changed
&lt;/h2&gt;

&lt;p&gt;The shipping numbers changed first. I used to start three things and finish one. I now start two things and finish both, on an average week.&lt;/p&gt;

&lt;p&gt;But the bigger change is less visible. I stopped dreading switching contexts. Before the setup, every context switch cost me a 15-minute ramp-up to remember where I was. Now the state files tell me exactly where I was — Claude Code re-reads them, summarizes in ten seconds, and I'm working.&lt;/p&gt;

&lt;p&gt;The emotional tax of ADHD dev work is usually in the ramp-up, not the work itself. Killing the ramp-up killed most of the tax.&lt;/p&gt;

&lt;p&gt;The other thing that changed: I stopped being mad at myself. Setups like this make the assumption that your brain &lt;em&gt;will&lt;/em&gt; drop things — and that's the right assumption for my brain. When I miss something, it's the tool's job to catch it, not my job to have remembered. That reframing, weirdly, is what made the setup stick.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this &lt;em&gt;didn't&lt;/em&gt; change
&lt;/h2&gt;

&lt;p&gt;It didn't cure ADHD. Nothing does.&lt;/p&gt;

&lt;p&gt;On bad days I still spiral. The setup shortens the spiral — I can pick up with less context cost — but it doesn't prevent it.&lt;/p&gt;

&lt;p&gt;It also didn't make me smarter. Judgment is still mine. Claude Code executes; I decide what's worth executing. When I decide badly, the tool executes my bad decision quickly. A faster bad idea is still bad.&lt;/p&gt;

&lt;p&gt;And it didn't eliminate the work. Writing good prompts is its own skill. Writing good specs is harder than writing good code. The execution bottleneck moved. It didn't disappear.&lt;/p&gt;

&lt;p&gt;But moving the bottleneck from &lt;em&gt;motor planning&lt;/em&gt; to &lt;em&gt;judgment and prompt craft&lt;/em&gt; is, for my specific brain, a massive upgrade. Motor planning was the broken step. Judgment and craft are steps I can actually practice and get better at.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you want to try this
&lt;/h2&gt;

&lt;p&gt;Start with the smallest possible version. &lt;code&gt;CLAUDE.md&lt;/code&gt; in your project root, with just the basics — tech stack, voice, and whatever you'd otherwise re-explain every session. That alone is maybe 70% of the value.&lt;/p&gt;

&lt;p&gt;Add slash commands for two things you do daily. That's another 20%.&lt;/p&gt;

&lt;p&gt;Rules files and pre-commit hooks come later, when you have a specific pattern you keep failing on.&lt;/p&gt;

&lt;p&gt;The goal isn't to build the perfect prosthetic. It's to notice where your brain drops the thread, and put one small piece of infrastructure in that exact spot. Then notice the next drop. Repeat.&lt;/p&gt;

&lt;p&gt;For me, after a few months of this, I ship things I'd have started and abandoned a year ago. Not because my brain got better. Because the things that don't survive the chain are no longer allowed to matter.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I write about AI-heavy indie workflow, ADHD-adjacent dev patterns, and corporate automation from someone who can't use the good AI tools at their day job. If you want more of this, my newsletter ships weekly — &lt;a href="https://kaistack.beehiiv.com" rel="noopener noreferrer"&gt;subscribe here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>adhd</category>
      <category>devrel</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
