<?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>DEV Community: Kairi</title>
    <description>The latest articles on DEV Community by Kairi (@kairi_outputs).</description>
    <link>https://dev.to/kairi_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%2F171404d3-7cc4-4fc6-930f-f8664d66cfc3.png</url>
      <title>DEV Community: Kairi</title>
      <link>https://dev.to/kairi_outputs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kairi_outputs"/>
    <language>en</language>
    <item>
      <title>Zazen for ADHD devs: what 20 minutes of sitting still does to my brain</title>
      <dc:creator>Kairi</dc:creator>
      <pubDate>Mon, 20 Apr 2026 14:35:24 +0000</pubDate>
      <link>https://dev.to/kairi_outputs/zazen-for-adhd-devs-what-20-minutes-of-sitting-still-does-to-my-brain-361d</link>
      <guid>https://dev.to/kairi_outputs/zazen-for-adhd-devs-what-20-minutes-of-sitting-still-does-to-my-brain-361d</guid>
      <description>&lt;h1&gt;
  
  
  Zazen for ADHD devs: what 20 minutes of sitting still does to my brain
&lt;/h1&gt;

&lt;p&gt;My brain is loud.&lt;/p&gt;

&lt;p&gt;I have ADHD. That's the short version. The long version is that my brain runs roughly seventeen tabs at once, half of them muted, all of them unfinished, and any attempt to close one spawns three more. If you know, you know. The thing I was going to do five minutes ago is being narrated over three other things I was also going to do, one of which I have already forgotten.&lt;/p&gt;

&lt;p&gt;I've tried most of the usual tooling to manage this. Timers, lists, apps, hyperfocus-bait, productivity systems that last exactly until the novelty wears off. Some help a little. None of them give me &lt;em&gt;quiet&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is a post about the one practice that reliably does — and it's probably not what you expect. I sit on the floor in a temple for twenty minutes and stare at a wall. That's it. I'm going to tell you why a very old practice turned out to be the most effective thing I've found for an ADHD brain trying to do software work.&lt;/p&gt;

&lt;p&gt;I'll cover: how I stumbled into this as a teenager, why I came back to it in college when the noise got unbearable, what twenty minutes of zazen actually feels like from the inside of an ADHD head, how it's changed my dev work specifically, and — most importantly — how you can just &lt;em&gt;go&lt;/em&gt;, wherever you live.&lt;/p&gt;

&lt;h2&gt;
  
  
  The field trip I wasn't supposed to like
&lt;/h2&gt;

&lt;p&gt;I grew up in Japan. At some point in high school my class got marched onto a bus and taken to a temple for a full day of Zen practice. This was not a spa day. It was a religious training school, and the schedule was: zazen (seated meditation), samu (cleaning work), shakyo (copying sutras by hand), and shojin ryori (vegetarian monastic food). No phones. No talking unless instructed.&lt;/p&gt;

&lt;p&gt;Important context: I was at peak teenage &lt;em&gt;everything is terrible&lt;/em&gt; mode. Boyfriend stuff, friend stuff, existential stuff. I had seen the temple's one-day trial flyer earlier and thought, only half joking, &lt;em&gt;maybe I can get enlightened and skip the next three years of this feeling&lt;/em&gt;. So when the school trip landed on that same temple, I showed up ready.&lt;/p&gt;

&lt;p&gt;We did the full day. We copied sutras with brushes. We got hit on the shoulder with a wooden stick (the &lt;em&gt;kyosaku&lt;/em&gt;, it's a real thing, they ask if you want it first, it's not as scary as it sounds but you &lt;em&gt;feel&lt;/em&gt; it). We scrubbed floors in silence. We ate rice and pickles with the kind of attention you normally reserve for a one-time thing.&lt;/p&gt;

&lt;p&gt;And the weird part: something shifted. Not enlightenment, obviously. But the noise came down. It was a hot summer afternoon and normally my brain would have been complaining about the heat while simultaneously spinning on social drama and unfinished homework. That day, I just... noticed it was hot. The cicadas were piercingly loud in a way they usually aren't, because nothing else was competing for audio bandwidth. I walked out of that temple lighter than I walked in, even though I had just scrubbed a floor for an hour.&lt;/p&gt;

&lt;p&gt;Fifteen-year-old me didn't have vocabulary for what had happened. I didn't have an ADHD diagnosis yet. I just remembered that for a few hours, my head had been quiet for the first time I could remember.&lt;/p&gt;

&lt;h2&gt;
  
  
  The noise got worse before I came back
&lt;/h2&gt;

&lt;p&gt;Years passed. I went to university. My brain got &lt;em&gt;louder&lt;/em&gt;, not quieter. ADHD in your late teens and twenties has a way of compounding — the stakes go up, the stimulation goes up, the number of tabs goes up, and the strategies that kind of worked when you were sixteen stop working when you have to manage your own schedule.&lt;/p&gt;

&lt;p&gt;At some point in college, I hit a wall. Not a depression wall, more of a cognitive traffic jam. Too many open loops, no way to close any of them, and everything I tried — more coffee, more lists, more structure, louder music to drown out the inside noise — was a variation of "push harder against the chaos." Pushing harder is the default ADHD response and it mostly makes things worse.&lt;/p&gt;

&lt;p&gt;I remembered the temple. I remembered walking out of it with a quiet head.&lt;/p&gt;

&lt;p&gt;I looked up a drop-in zazen session near my university. I went alone. I was nervous, which was funny in retrospect because the thing I was nervous about was &lt;em&gt;sitting still&lt;/em&gt;, which for an ADHD brain is a reasonable thing to be nervous about.&lt;/p&gt;

&lt;p&gt;That was years ago. I now do it every few weeks. Not as discipline. Closer to brushing teeth for the mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  What twenty minutes of zazen actually feels like in an ADHD brain
&lt;/h2&gt;

&lt;p&gt;I want to describe this honestly because meditation gets talked about in two broken registers online. Either it's mystical (you will achieve inner peace), or it's clinical (studies show a 12% cortisol reduction). Neither is what it's actually like, especially not for ADHD brains.&lt;/p&gt;

&lt;p&gt;Here's what it's like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First few minutes&lt;/strong&gt;: you sit cross-legged. Immediately, your knees protest. Your back, which has been slumped at a laptop all week, sends a formal complaint. Your brain, sensing stillness and interpreting it as threat, produces a surge of thoughts. You will at this point believe you are "bad at meditation." You are not. This is what happens to everyone. For ADHD brains, the surge is just louder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minutes five to ten&lt;/strong&gt;: the thought storm. I think about: whether I sent that email, a joke I meant to tell someone three days ago, the weird noise my fridge makes, a conversation I had in middle school, the PR I haven't reviewed, whether I locked the door, the side project, the thing my coworker said in a meeting, the snack I want later. I cannot stop any of them. The practice isn't stopping thoughts — it's noticing each one and not following it down the staircase.&lt;/p&gt;

&lt;p&gt;My personal hack for this: I imagine a tiny trash icon floating in the corner of my mind, and I drag each thought into it. &lt;em&gt;Fridge noise&lt;/em&gt; — trash. &lt;em&gt;Middle school memory&lt;/em&gt; — trash. &lt;em&gt;Did I lock the door&lt;/em&gt; — trash (I did). Is this the authentic traditional technique? No. Does it work for a software-shaped ADHD brain? Yes, remarkably well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minutes ten to fifteen&lt;/strong&gt;: something gives. Not always, but often. Some of the thoughts stop arriving. The ones that do arrive feel less urgent. My body, which has been broadcasting pain from my knees, goes quieter. Time stops being linear. Five minutes can feel like fifteen, or like two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The last five minutes&lt;/strong&gt;: genuine quiet. Not the zero-thought state the mystical framing promises — there are still thoughts. But they pass through without sticking. My chest unclenches. I become aware of small physical details: the breath, the floor, ambient sound. This is, I think, the part that ADHD brains rarely get to. We are usually too loud to notice we are in a body.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bell rings, session ends.&lt;/strong&gt; You try to stand up. Your legs remember they have been cross-legged for twenty minutes and briefly refuse to participate. I have come close to falling over more than once. This is normal and nobody judges you.&lt;/p&gt;

&lt;p&gt;And then — the thing I keep coming back for — you walk out and the air feels different. Not magical. Just: the background hum has been muted. My head is quieter, my chest is lighter, and I can look at my inbox without the preemptive clench.&lt;/p&gt;

&lt;p&gt;Twenty minutes. That's it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters for dev work (especially if you have ADHD)
&lt;/h2&gt;

&lt;p&gt;I don't want to claim zazen makes me a better engineer. That would be the kind of productivity-bro framing I actively avoid, and it's also not what's actually going on. What it does is more specific:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It gives me a hard context reset.&lt;/strong&gt; Most of my job, corporate and after-hours, is multi-threaded. ADHD brains do not naturally release context between tasks — we carry every open thread with us, invisibly, taxing cognitive bandwidth. A zazen session is the closest thing I've found to running &lt;code&gt;/clear&lt;/code&gt; on my own head. Not a break. Not a nap. An actual state reset.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It lowers the fake-urgency floor.&lt;/strong&gt; The ADHD trap is that every stimulus feels equally urgent because the brain's priority-sorting is garbage. After a session, my nervous system stops treating every Slack ping and every side-project idea as DEFCON 1. I can triage more honestly for a few hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's training in coming back.&lt;/strong&gt; You sit down intending to focus. You immediately don't. You notice, you come back. You immediately don't again. You come back. This is, unexpectedly, the exact skill ADHD people need all day: notice the drift, come back, without shame. Zazen is literally structured practice in that move.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It builds tolerance for being still without feeling lazy.&lt;/strong&gt; ADHD brains have a vicious internal narrator that equates stillness with failure. Practicing stillness in a structured, sanctioned, &lt;em&gt;traditional&lt;/em&gt; context — where sitting still is the point, not the problem — slowly rewires that narrator. Sometimes the correct move on a hard problem is to close the laptop and sit. I used to fight this. Now I budget for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's medication-friendly.&lt;/strong&gt; I'm not going to tell you to replace anything with meditation. That's a personal decision between you and a medical professional. But zazen plays well with stimulant medication for me — it gives the medicated focus a quieter room to operate in. Your mileage may vary; please don't tweet at me.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to actually go to a session
&lt;/h2&gt;

&lt;p&gt;This is the part that feels intimidating and doesn't need to. You don't need to convert, become a monk, learn Japanese, or buy special clothes. You need to find a temple that runs a public &lt;em&gt;zazenkai&lt;/em&gt; (zazen gathering) and show up.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you're in Tokyo
&lt;/h3&gt;

&lt;p&gt;Search &lt;code&gt;東京 座禅 初心者&lt;/code&gt; or &lt;code&gt;Tokyo zazen drop-in&lt;/code&gt;. Several major temples run weekly public sessions, usually early morning, often free or donation-based. A few practical notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Large tourist-facing temples are your best bet for English support.&lt;/strong&gt; If you don't speak Japanese, aim for temples that already host international visitors. They're used to beginners and will walk you through the mechanics (how to sit, how to bow, what the bells mean).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Translate is fine.&lt;/strong&gt; Bring a phone, use the camera feature on any written instructions. The monks running these sessions have seen every awkward-foreigner situation. They are kind about it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smaller neighborhood temples often hold zazenkai too&lt;/strong&gt; — they just don't advertise it in English. If there's a temple near your apartment, it's worth walking in on a weekday afternoon and asking. Many do, quietly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  If you're anywhere else
&lt;/h3&gt;

&lt;p&gt;Good news: zazen is not a Tokyo thing. Zen traveled. There are Zen centers in New York, London, Berlin, Paris, Portland, Barcelona, and probably within an hour of wherever you live. Search &lt;code&gt;[your city] zazen&lt;/code&gt; or &lt;code&gt;[your city] Zen center&lt;/code&gt;. Most will have a weekly beginner-friendly drop-in.&lt;/p&gt;

&lt;p&gt;They will usually have a fifteen-minute orientation before the session. They will show you how to sit. Nobody expects you to know what you're doing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logistics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Loose, comfortable clothes. Something you can sit cross-legged in without a waistband cutting off circulation.&lt;/li&gt;
&lt;li&gt;Socks.&lt;/li&gt;
&lt;li&gt;Phone on silent, out of sight. Don't bring a notebook to "journal insights" — this is a thing people try and it misses the point.&lt;/li&gt;
&lt;li&gt;Eat something small an hour before. Don't go hungry, don't go full.&lt;/li&gt;
&lt;li&gt;Expect awkwardness the first time. Stay for the whole session. Leave better than you arrived.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest pitch for ADHD brains specifically
&lt;/h2&gt;

&lt;p&gt;I'm not going to tell you this will fix your ADHD. It won't. What it will do is give you occasional access to a quality of quiet that ADHD brains don't get to often — and that quiet has downstream effects on how you code, how you triage, how you carry context, and how gently you talk to yourself during a bad focus day.&lt;/p&gt;

&lt;p&gt;Twenty minutes is short enough that even the most restless ADHD brain can get through it with a trash-icon hack and some patience. It's structured, it's external, it's low-technology. You don't have to configure anything. You just sit.&lt;/p&gt;

&lt;p&gt;If you try it, I'd genuinely love to hear how it goes for your brain. Drop me a note.&lt;/p&gt;

&lt;p&gt;And if you don't — that's also fine. The cicadas are still loud somewhere.&lt;/p&gt;

</description>
      <category>adhd</category>
      <category>wellness</category>
      <category>mentalhealth</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Sensitive Env Vars Should Be Default, Not Opt-In</title>
      <dc:creator>Kairi</dc:creator>
      <pubDate>Mon, 20 Apr 2026 07:47:12 +0000</pubDate>
      <link>https://dev.to/kairi_outputs/sensitive-env-vars-should-be-default-not-opt-in-2m9j</link>
      <guid>https://dev.to/kairi_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>Kairi</dc:creator>
      <pubDate>Mon, 20 Apr 2026 06:42:26 +0000</pubDate>
      <link>https://dev.to/kairi_outputs/the-vercel-breach-hit-one-of-my-projects-heres-what-10-minutes-of-cleanup-looked-like-44ia</link>
      <guid>https://dev.to/kairi_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>Kairi</dc:creator>
      <pubDate>Mon, 20 Apr 2026 05:47:32 +0000</pubDate>
      <link>https://dev.to/kairi_outputs/5-claude-code-workflows-i-use-every-day-for-the-boring-80-5ak0</link>
      <guid>https://dev.to/kairi_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>Kairi</dc:creator>
      <pubDate>Mon, 20 Apr 2026 00:53:14 +0000</pubDate>
      <link>https://dev.to/kairi_outputs/claude-opus-47-field-report-eight-hours-of-autonomous-work-10e3</link>
      <guid>https://dev.to/kairi_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>Kairi</dc:creator>
      <pubDate>Mon, 20 Apr 2026 00:52:33 +0000</pubDate>
      <link>https://dev.to/kairi_outputs/my-ai-heavy-indie-stack-actually-honest-breakdown-2jim</link>
      <guid>https://dev.to/kairi_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>Kairi</dc:creator>
      <pubDate>Sun, 19 Apr 2026 10:46:10 +0000</pubDate>
      <link>https://dev.to/kairi_outputs/claude-code-as-executive-function-my-adhd-brain-setup-1412</link>
      <guid>https://dev.to/kairi_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>
