<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Devmystify Blog</title>
    <link>https://devmystify.com</link>
    <description>Latest updates and insights from Devmystify</description>
    <language>en</language>
    
      <item>
        <title>I Thought I Had 30 Days of Work Left. So I Started Refactoring Everything.</title>
        <link>https://devmystify.com/blog/i-thought-i-had-30-days-of-work-left-so-i-started-refactoring-everything</link>
        <pubDate>Mon, 10 Aug 2026 11:38:32 GMT</pubDate>
        <description><![CDATA[<p>A while ago, I found out I had about a couple of months of consulting work left with my primary client. By the time I found out that it wasn’t actually the case, I&#39;d already started refactoring my entire business. Honestly? Best scare I&#39;ve had in years.</p>
<p>Let me back up.</p>
<p>In a recent newsletter email, I mentioned my steady US work might dry up. That worried me more than I let on. The backups I&#39;d been &quot;working on&quot; weren&#39;t nearly ready, my last course launch sold exactly 3 copies (I published the 
    <a href="https://devmystify.com/blog/course-launch-post-mortem" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      full autopsy
    </a>
  ), and I&#39;d just spent a month in France feeling stuck, unable to move forward on anything.</p>
<p>The break itself was worth it: cutting off from everything in July, a family trip to Italy… highly recommended. But when I got back at the end of July, the math was simple: maybe a month of consulting left, then I&#39;d need new clients or new revenue. </p>
<p>We have runway, but I wasn&#39;t going to sit around burning it.</p>
<p>Here&#39;s something I&#39;ve learned about myself: my best ideas only show up when my back is against the wall. When things are comfortable, I coast. When they&#39;re not… I finally start seeing what&#39;s wrong.</p>
<p>And the first thing I saw was YouTube.</p>
<p>I&#39;ve spent a stupid number of hours this past year on my channel, Tibo Denz, where I learn things, build things, and take on slightly insane challenges. Nothing to do with software (except the ESP32 code inside my 
    <a href="https://youtu.be/TotY_OqeQuA?si=l1HFGKj9go5_m14g" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      Factorio build
    </a>
  ). I finally nearly got monetized, passing 1,000 subs and getting close to 4,000 watch hours. But total revenue so far? $6 in affiliate sales. </p>
<p>The hourly rate on that &quot;business&quot; is abysmal.</p>
<p>BUT. I love it. It&#39;s the long-term play and I&#39;m not stopping. It’s also opening opportunities I never dreamed of. But I just had to be honest with myself: I can only afford to pour hours into it when I know work is coming, else the stress just kills my creativity. So it went to the back of the line while I fixed two other things.</p>
<p><strong>Thing one: 
    <a href="https://azkyconsulting.com/" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      Azky Consulting
    </a>
  .</strong></p>
<p>I took the thing I&#39;m actually good at, software consulting, and packaged it so I could find new clients without billing hourly this time. That meant productized services: One page, four offers. </p>
<p>That&#39;s the whole company. </p>
<p>I&#39;ll write a dedicated breakdown soon, because pricing judgment instead of hours deserves its own article. I’m collecting testimonials and got my first client booked for next week. Hopefully, that goes well.</p>
<p><strong>Thing two: Finally figuring out Devmystify.</strong></p>
<p>Since reviving Devmystify last year, I tried to make it about everything. Tutorials, AI workflows, career tips. I didn&#39;t want to let go of the technical roots… so we kept publishing tutorials, and built a technical AI course... which didn&#39;t do very well.</p>
<p>That forced the realization: you guys don&#39;t need more tutorials. You can already build, AI made sure of that, and you can ask Claude for everything you don’t know yet. </p>
<p>But one thing that’s harder to learn with AI is the business half. </p>
<p>Don’t get me wrong, you can definitely pick up some useful knowledge from LLMs, but starting a business is about more than following predefined steps. It’s about accountability and understanding human beings. What to build, who it&#39;s for, how to get paid for it. That&#39;s the one direction where I actually have receipts, so that&#39;s the direction I want to take Devmystify towards… Which meant a complete rebrand with a clear promise: helping developers start businesses.</p>
<p>And then, the twist.</p>
<p>Last week, my US client told me the steady work is… continuing after all. The wave I&#39;d been sprinting away from turned out to be fake.</p>
<p>I&#39;m keeping everything the scare built anyway. The consulting practice is packaged and Devmystify finally knows what it is. The machine exists now, and next time the wave might be real.</p>
<p>If your only plan is &quot;hope the work keeps coming&quot; like me, you don&#39;t have a plan…. You have hope.</p>
<p>One more thing, and it&#39;s the part I&#39;m most nervous about.</p>
<p>I&#39;m building something I&#39;ve never done before: a cohort. Live, eight weeks, a small group of developers.</p>
<p>It&#39;s called Full Stack Founder, and the promise is simple: you pick your path (consulting, digital products, or SaaS), and by week 8 your offer is live and in front of real buyers, hopefully making money outside your full-time job.</p>
<p>Weekly deliverables, real volume floors, group calls, two private 1-on-1s with me, and me in the room the whole way. It&#39;s the thing I wish existed when I was writing tutorials into the void hoping something would stick.</p>
<p>I&#39;m not opening it yet. I want to run the first one small, with the right people in the room, so I&#39;m not setting a date until the waitlist is ready. Your numbers get published on the site, wins and zeros, receipts culture from day one.</p>
<p>If you&#39;re unhappy with your current job or salary, or you&#39;ve been thinking about starting a side business, get on the list. You&#39;ll be first in line, with first pick of the seats, when it opens.</p>
<p><strong>
    <a href="https://devmystify.com/courses/full-stack-founder" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      Apply for a founding seat →
    </a>
  </strong></p>
<p>If you’re unhappy with your current job or salary, or have been thinking about starting a side business, this is the perfect opportunity. Don&#39;t wait for the scare like I did.</p>]]></description>
      </item>
    
      <item>
        <title>I Launched a Course to 2,700 People and Sold 3 Copies (launch post-mortem)</title>
        <link>https://devmystify.com/blog/course-launch-post-mortem</link>
        <pubDate>Thu, 23 Jul 2026 13:52:34 GMT</pubDate>
        <description><![CDATA[<p>I spent weeks building 
    <a href="https://devmystify.com/courses/ai-productivity-blueprint" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      The Developer&#39;s AI Productivity Blueprint
    </a>
   with my team. I ran the launch using the same principles I used 10 years ago for my two Ruby books, and while those launches went well, this one was a… complete failure.</p>
<p>What went wrong? Is it because times have changed? Or did I just make a massive mistake?</p>

    <h2 id="the-idea" class="scroll-mt-24">The Idea</h2>
  <p>AI is changing what &quot;productive developer&quot; means, very fast. The Blueprint we created is a practical course on working with AI while remaining a real engineer, not just an operator, by focusing on workflows, methodology, automation, and code reviews.</p>
<p>It&#39;s not vibe-coding or pure theory, but concrete techniques I use on real client work every day. I wanted to teach it the way I wish someone had taught me.</p>

    <h2 id="state-at-launch" class="scroll-mt-24">State at Launch</h2>
  <p>Here&#39;s the honest inventory of what I had on launch day:</p>
<ul>
<li>An email list of about 2,700 developers, built years ago around my Ruby and Rails content. To be honest, when I revived Devmystify last year, that list was above 3,000. So we&#39;ve lost quite a few people, that didn&#39;t get replaced. That was to be expected, and honestly better than I hoped.</li>
<li>A finished course at $199 with a brand-new sales page.</li>
<li>Zero reviews.</li>
<li>No content engine. No YouTube, no socials for Devmystify, no lead magnet, no nurture sequence. Just the mailing list.</li>
</ul>

    <h2 id="the-process-i-used" class="scroll-mt-24">The Process I Used</h2>
  <p>I used the textbook launch playbook: Announcement, then a warm-up sequence with tiered discounts: my earliest supporters got 50% off, past buyers got 40%, then the whole list got a launch price with a real deadline. Final-day email, final-hours email, countdown timer on the page. Everything that&#39;s supposed to happen, executed on schedule.</p>

    <h2 id="what-happened" class="scroll-mt-24">What Happened</h2>
  <p>The emails performed fine on paper. Open rates between 32% and 48% depending on the email, honestly better than I expected from a list this cold. Click rates in the double digits, which looked amazing until I dug in and realized a big chunk of the clicks might be bots. Mail clients may be clicking links in emails to verify them, because when your click-to-open ratio looks too good to be true, it probably is. Especially when your conversion rate is terrible.</p>
<p>By the end of the launch week, I had a whopping… 3 sales.</p>
<p>I refreshed my kit.com dashboard every morning… watching it not move at all. If you&#39;ve launched anything, you know that exact feeling.</p>
<p>Now for the number… those 3 sales made $417, which is great for a product I should have validated better.</p>

    <h2 id="where-it-went-wrong-maybe" class="scroll-mt-24">Where It Went Wrong… Maybe</h2>
  <p>So now I&#39;m going to make up some assumptions and come up with some theories about what I did wrong: three things specifically, and &quot;the product is bad&quot; isn&#39;t one of them. At least, I hope it isn&#39;t, which so far, has been reinforced by the feedback I got from early adopters.</p>
<p><strong>1. Wrong audience, not small audience.</strong> My 2,700 subscribers signed up for Ruby and Rails content years ago. They didn&#39;t join for an AI course. Audience size is not audience fit, and I confused the two. I assumed everyone else was going through the same AI adaptability issues as me, and might want some tips… which they can likely get from Claude itself directly. Which I still don&#39;t think is enough, since you don&#39;t know what you don&#39;t know, and if you don&#39;t prompt the right questions, you&#39;ll never find those tips.</p>
<p><strong>2. Zero social proof on a $199 decision.</strong> Every visitor saw an empty reviews box. That box quietly tells people &quot;nobody has bought this.&quot; For a considered purchase, that&#39;s not great. But even with the review of one of the early buyers for the last day reminder, things didn&#39;t improve.</p>
<p><strong>3. No engine, just a blast.</strong> I pointed a cold list at a page and hoped. Anyone who wasn&#39;t ready to buy that week had no reason to stick around, so they left and that was it.</p>
<p>I wasn&#39;t expecting too much honestly… but I was still expecting more than what I got. 100% my fault, and still a great lesson to learn from.</p>
<p>Plus, a failed launch doesn&#39;t mean that the product is a failure. It&#39;s there, it&#39;s available, and I can promote it going forward while I work on the next one. I&#39;m also going to experiment with paid ads, something I&#39;ve never really done before. I&#39;ll keep you updated on how that goes.</p>
<p>And that&#39;s not all.</p>

    <h2 id="why-im-not-giving-up" class="scroll-mt-24">Why I&#39;m Not Giving Up</h2>
  <p>Because a developer I&#39;d never met went through the course and left a genuine five-star review:</p>
<p>
    <figure class="my-8">
      <div class="relative w-full max-w-3xl mx-auto rounded-xl overflow-hidden">
        <img src="https://d3tgxfx23qkrig.cloudfront.net/uploads/media/279/original-screenshot-2569-07-23-at-16.png" alt="reviews" class="w-full h-auto object-contain" />
      </div>
    </figure>
  </p>
<p>Which means he found value in it. If that first review had been 1-star instead, I might have deleted the course or completely remade it. I&#39;m not someone who likes selling crap, I want people to get way more value than what they put in. That&#39;s always been my philosophy, be it for consulting or product creation.</p>
<p>So the plan is to build the missing link to get more sales:</p>
<ul>
<li>Running small ad tests now that the page has proof on it.</li>
<li>Publishing short and long form content on new Devmystify channels: on YouTube, Instagram, and TikTok. This should help me build an audience that actually signed up for this topic. I&#39;ve seen people talk about social media as a great source of leads, and I&#39;m going to put it to the test.</li>
</ul>

    <h2 id="whats-next-for-devmystify" class="scroll-mt-24">What&#39;s Next for Devmystify</h2>
  <p>AI changed the game for developers, and the way I see it you have two moves.</p>
<p>Move one: get so good with AI that you&#39;re the developer your team can&#39;t replace. That&#39;s 
    <a href="https://devmystify.com/courses/ai-productivity-blueprint" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      the Blueprint
    </a>
  , and it&#39;s live today. But even then, an uninformed decision by the executive team can still leave you stranded, in a job market that seems really, really tough right now. Which leads me to the second move, something I&#39;ve personally been working on: moving away from solely relying on software development as my source of revenue, just in case.</p>
<p>And that&#39;s move two: build something of your own before you need it. Start now, on the side, before it&#39;s too late.</p>
<p>That&#39;s the flagship course I&#39;m building next, which will combine the 3 courses that were live on the site. Freelance to Freedom, Master Digital Products, and the SaaS Blueprint will now become one: The Independent Developer.</p>
<p>Because fundamentally, a SaaS or a digital product are just products, which need an audience to work, something you should build before you write a single line of code or text. As for Freelance to Freedom, I will lightly cover it, but again, I do not recommend freelancing in the traditional way anymore. Productized services are the way to go instead.</p>
<p>This will be a complete guide for developers who want to go from employee to business owner because they&#39;re worried about where AI is taking their jobs, or aren&#39;t enjoying the new era of software development.</p>
<p>And honestly, now is the best window there&#39;s ever been to jump in: the models are still affordable, which might not last. Companies are already starting to limit AI usage internally after all. So if you want to build something with AI assistance, the time is now, while the door is wide open.</p>
<p>The course will cover building an online presence, before monetizing it. It will also touch on pivoting into a whole new field and building a business on that if you dislike the new normal.</p>
<p>The Independent Developer launches first as a founding cohort. The waitlist is open on the 
    <a href="https://devmystify.com/courses" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      courses page
    </a>
  .</p>]]></description>
      </item>
    
      <item>
        <title>The AI Wrote It. You Signed Off on It. Now It's Yours.</title>
        <link>https://devmystify.com/blog/the-ai-wrote-it-you-signed-off-on-it-now-it-s-yours</link>
        <pubDate>Mon, 06 Jul 2026 04:24:41 GMT</pubDate>
        <description><![CDATA[<p>Not long ago, a line of code broke in production. I didn&#39;t write it... Claude did.</p>
<p>The code looked completely fine. It ran and passed every test. It was clean, well-formatted, and reasonable. None of that mattered when it broke, because it shipped in my codebase, under my name. &quot;The AI wrote it&quot; was not something I could say when it came time to explain what happened.</p>
<p>We&#39;re at a point where AI is a baseline in the software industry. A ticket that used to take a couple of hours can now be fixed in a fraction of the time. But even though you don&#39;t have to write the code by hand anymore, you still have to understand it as if you did. The code that gets generated ships in your name, under your responsibility, and there&#39;s no way to argue with that.</p>

    <h3 id="the-excuse-that-never-worked" class="scroll-mt-24"><strong>The Excuse That Never Worked</strong></h3>
  <p>&quot;The AI did it this way&quot; should not be an excuse when something breaks.</p>
<p>This is not new. Stack Overflow used to be the holy grail for developers, the place you went when you were stuck on something you didn&#39;t know how to solve. Some people copied code from there and, when it broke, said &quot;I just copied it.&quot; That excuse didn&#39;t work then, and it doesn&#39;t work now. AI-generated code looks good, correct, and plausible. That will never be a reason to trust it blindly.</p>
<p>Authorship and accountability have never been the same thing. Somewhere along the way, AI made that easy to forget, because the code arrives so fast and looks so complete that it feels like it came from somewhere outside the normal process. It didn&#39;t. It came through the same door everything else does. You just opened it.</p>

    <h3 id="what-signing-off-actually-is" class="scroll-mt-24"><strong>What &quot;Signing Off&quot; Actually Is</strong></h3>
  <p>Accepting a suggestion. Merging a PR. Running a script someone else generated. These all feel like small actions. One click, one keystroke. Barely a decision at all.</p>
<p>But each click is the moment ownership changes hands. Before you accept the code, it belongs to the model. After you accept it, it belongs to you: in your codebase, under your name. Nothing about the code changes in that moment. What changes is who is responsible for it.</p>

    <h3 id="the-gap-between-looks-right-and-is-right" class="scroll-mt-24"><strong>The Gap Between &quot;Looks Right&quot; and &quot;Is Right&quot;</strong></h3>
  <p>Most developers do review AI-generated code. The problem is what review quietly turns into when the code in front of you already looks clean, well-formatted, and reasonable.</p>
<p>It&#39;s easy to scan for the obvious stuff: does it run, do the tests pass, does the syntax look sane. That&#39;s a real check, but it&#39;s a shallow one. It answers &quot;does this look like working code&quot; without ever asking &quot;does this do the right thing, in this system, for this problem.&quot; Those are two different questions, and only one of them matters when something breaks later.</p>
<p>That&#39;s exactly how my bug got through. The code ran. It passed the existing tests. It was also missing a condition that only mattered in a situation the tests never covered, one I would have caught if I had read it as carefully as I read code that feels less finished. The more finished code looks, the less carefully we read it... and that&#39;s the trap.</p>

    <h3 id="who-gets-the-blame" class="scroll-mt-24"><strong>Who Gets the Blame</strong></h3>
  <p>When something breaks in production, nobody asks who typed the original lines. They ask who approved the change, who merged it, who let it ship. That question has always pointed at a person, and it still does, even when a model generated every character of the code.</p>
<p>This was never really about blame. Responsibility never lived in the hands that typed the code. It lived in the decision to let that code represent your system to the rest of the world. AI changed who does the typing, but it did not change who makes that decision.</p>
<p>As Uncle Ben said, <em>&quot;With great power comes great responsibility.&quot;</em> AI gives us more power than we&#39;ve ever had. The best way to handle the responsibility that comes with it: keep AI tasks small enough that you can fully understand, review, and stand behind every change you ship.</p>

    <h3 id="it-was-never-about-who-typed-it" class="scroll-mt-24"><strong>It Was Never About Who Typed It</strong></h3>
  <p>I didn&#39;t write the line of code that broke. But I approved it, I ran it, and I let it ship. </p>
<p>That makes it mine, in every way that matters.</p>
<p>The uncomfortable part isn&#39;t that AI writes code you didn&#39;t write yourself. Developers have shipped code they didn&#39;t fully write for years: libraries, teammates&#39; code, templates. The uncomfortable part is how easy it became to treat the approval step as a formality instead of what it actually is, the point where you take ownership.</p>
<p>&quot;The AI wrote it&quot; was never going to be an explanation. It isn&#39;t one now. The explanation, if there is one, starts with what you did after the AI was done.</p>
<hr>
<p><em>If you want the mental models I use to work with AI to reduce issues like this one, that&#39;s exactly what I teach in</em> <em><strong>The Developer&#39;s AI Productivity Blueprint</strong></em><em>. It&#39;s out now, and 30% off through July 9.</em></p>
<p><em><strong>
    <a href="https://devmystify.com/courses/ai-productivity-blueprint" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      Get the Blueprint
    </a>
  </strong></em></p>
<p><em>It isn&#39;t about mastering a specific model that might be outdated next month. It&#39;s about building a way of working that stays useful no matter how the tools evolve.</em></p>]]></description>
      </item>
    
      <item>
        <title>AI Doesn't Crash. It Lies.</title>
        <link>https://devmystify.com/blog/ai-doesn-t-crash-it-lies</link>
        <pubDate>Thu, 02 Jul 2026 06:17:31 GMT</pubDate>
        <description><![CDATA[<p><em>The most dangerous code AI writes is the code that runs perfectly.</em></p>
<p>We&#39;ve all been trained to fear the crash. Red text, a stack trace, a build that won&#39;t pass. Those are the bugs we know how to handle, because they announce themselves.</p>
<p>The bugs that should actually scare you in the age of AI are the quiet ones. The code that runs. No error. No stack trace. Looks completely reasonable. And is quietly, confidently wrong.</p>
<p>I&#39;ve started calling these silent failures, and once you learn to see them, you can&#39;t unsee them in AI-generated code.</p>

    <h2 id="a-function-that-lied-to-me" class="scroll-mt-24">A function that lied to me</h2>
  <p>Here&#39;s a real one. I asked an AI to write a function that fetches a package&#39;s dependencies from a registry. This came back:</p>
<pre><code>async function fetchDependencies(packageName) {  
    try {    
        const res = await fetch(`https://registry.example.com/${packageName}`);    
        const data = await res.json();    
        return data.dependencies;  
    } catch (err) 
    {    
        return [];  
    }
}
</code></pre><p>Read it quickly and it looks fine. It even looks careful, there&#39;s error handling. Tests pass. You ship it.</p>
<p>Then one day the network hiccups. The fetch fails. The <code>catch</code> swallows it and returns an empty array. And somewhere downstream, your security scanner reports zero vulnerabilities, because as far as it can tell, this package has zero dependencies.</p>
<p>The code didn&#39;t break. It lied. And it lied in the most reassuring way possible: by handing back something that looks like a valid answer.</p>
<p>Here&#39;s what it should have done:</p>
<pre><code>async function fetchDependencies(packageName) {  
    const res = await fetch(`https://registry.example.com/${packageName}`);  

    if (!res.ok) {    
        throw new Error(`Registry request failed: ${res.status}`);  
    }  

    const data = await res.json();  
    return data.dependencies;
}
</code></pre><p>Let the failure be a failure. Let the caller decide what to do with it. An empty array should mean &quot;no dependencies,&quot; not &quot;something went wrong and I&#39;m hiding it from you.&quot;</p>

    <h2 id="why-ai-does-this-constantly" class="scroll-mt-24">Why AI does this constantly</h2>
  <p>AI is optimizing to complete the task you gave it. You said &quot;fetch the dependencies,&quot; so it returns dependencies, and it really doesn&#39;t want to hand you back an error, because an error looks like failure. So it reaches for the safe-looking default. Empty array. Null. Zero. <code>false</code>. Anything that makes the function &quot;work.&quot;</p>
<p>This is the difference between code that <em>looks</em> correct and code that <em>is</em> correct, and it&#39;s the gap that bites you in production. The naming is sensible, the structure is familiar, the happy path works. None of that tells you what happens when something goes wrong, and &quot;what happens when something goes wrong&quot; is most of what senior engineering actually is.</p>

    <h2 id="where-to-look" class="scroll-mt-24">Where to look</h2>
  <p>Once you know the pattern, silent failures hide in predictable places. When you review AI code, go straight to these:</p>
<ul>
<li>Any <code>try/catch</code> that doesn&#39;t log or re-throw. Ask: what does this swallow?</li>
<li>Functions that return <code>null</code>, <code>[]</code>, or <code>0</code> on a failure path. Ask: can the caller tell the difference between &quot;empty&quot; and &quot;broken&quot;?</li>
<li>Network or file calls that don&#39;t check the response status before using the result.</li>
<li>Any <code>if</code> with a branch that quietly does nothing.</li>
</ul>
<p>None of these are exotic. They&#39;re the boring, high-frequency ways AI-generated code goes wrong, and they&#39;re invisible if you read for &quot;does this look reasonable&quot; instead of &quot;what is this hiding.&quot;</p>

    <h2 id="the-skill-nobodys-teaching-yet" class="scroll-mt-24">The skill nobody&#39;s teaching yet</h2>
  <p>Here&#39;s the part that matters. Reading code AI wrote is not the same skill as writing code yourself. When you write it, you hold the failure modes in your head as you go. When AI writes it, you&#39;re handed a finished thing that looks done, and your brain wants to approve it and move on.</p>
<p>The developers who&#39;ll do well with AI aren&#39;t the ones who prompt the fastest. They&#39;re the ones who can look at a confident, clean-looking block of generated code and ask the uncomfortable question: where does this lie?</p>
<p>That&#39;s a learnable skill. It just isn&#39;t the one most &quot;AI for developers&quot; content teaches, because most of it stops at &quot;write better prompts.&quot; Prompts are the easy half. Knowing what to do with what comes back is the half that keeps your name off a production incident.</p>

    <h2 id="one-idea-from-a-bigger-system" class="scroll-mt-24">One idea from a bigger system</h2>
  <p>This silent-failure stuff is covered in more detail in a course I just released, The Developer&#39;s AI Productivity Blueprint. The whole thing is about exactly this: using AI to go faster without quietly handing over the judgment that makes you worth hiring. Eight modules, the real workflow I use on production code every day, including a full live build where you watch it all come together on one project, start to finish.</p>
<p>If &quot;where does this lie&quot; is a question you want to get fast at figuring out, the Blueprint is out now, and 30% off for launch week: <strong>$139 instead of $199.</strong> The discount ends in 1 week, on July 9.</p>
<p><strong>
    <a href="https://devmystify.com/courses/ai-productivity-blueprint" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      Get the Blueprint for $139
    </a>
  </strong></p>]]></description>
      </item>
    
      <item>
        <title>Software Agencies Are Not Sustainable</title>
        <link>https://devmystify.com/blog/software-agencies-are-not-sustainable</link>
        <pubDate>Fri, 29 May 2026 03:28:15 GMT</pubDate>
        <description><![CDATA[<p>Software agencies are not sustainable. Over the years, I&#39;ve seen countless ones close or struggle as they grew bigger.</p>
<p>The problem is usually the same: at some point, during a bad period, work dries up. Without new clients, there&#39;s no money to pay developers. Without enough reserves, lots of agencies end up being forced to close.</p>
<p>I myself run a tiny web agency, but I do not consider it the heart of the business. Yes, it generates 99% of our revenue right now, but I&#39;m working hard to add additional revenue channels because, in my gut, I know a recession could result in us closing down.</p>
<p>That said, I&#39;m not planning to shut it down completely, even if our diversification efforts work. It&#39;s stable and predictable revenue, which lets me sleep better at night. The goal isn&#39;t to escape it. It&#39;s to stop depending on it exclusively.</p>
<hr>

    <h2 id="build-something-that-doesnt-depend-only-on-you" class="scroll-mt-24">Build Something That Doesn&#39;t Depend Only on You</h2>
  <p>The obvious move is to build something that doesn&#39;t need you in the room to generate money.</p>
<p>A product, a course, a small SaaS, something that people can pay for whether you&#39;re working or not. The agency is a time-for-money business. You stop working, the money stops. A product doesn&#39;t work like that.</p>
<p>This isn&#39;t a new idea. But most agency owners keep putting it off because client work always feels more urgent. The product never makes it past the idea stage.</p>
<p>The goal in year one isn&#39;t to replace your agency revenue. It&#39;s just to prove the model works. Pick one thing, give it a real time budget alongside your normal work, and build the habit.</p>
<hr>

    <h2 id="referrals-arent-a-strategy" class="scroll-mt-24">Referrals Aren&#39;t a Strategy</h2>
  <p>Most agencies grow through word of mouth. Someone recommends you, you do good work, they recommend you again. It feels like a system but it&#39;s not really.</p>
<p>Referral networks dry up. Industries slow down. The people who used to send you work move on.</p>
<p>Building a public presence is the highest-leverage thing most agency owners skip. A newsletter, a blog, a YouTube channel, even just posting consistently on LinkedIn. It doesn&#39;t need to be perfectly polished. It needs to be consistent and genuine.</p>
<p>The math is simple: even if 0.1% of people who follow you become clients, it compounds over time in a way that referrals never will. Being known is the foundation. Everything else builds on top of it.</p>
<p>Make it fun. Show your work. Be a human, not a corporate account.</p>
<hr>

    <h2 id="what-thoughtbot-and-basecamp-got-right" class="scroll-mt-24">What Thoughtbot and Basecamp Got Right</h2>
  <p>Two agencies worth studying here are Thoughtbot and Basecamp, both built products alongside their services businesses, and both ended up with the product becoming more significant than the agency itself.</p>
<p>Thoughtbot built and open-sourced tools that became central to the Rails ecosystem. The tools generated awareness, trust, and inbound leads that the agency alone never could have. Basecamp built project management software to solve their own internal problems, then sold it to the world.</p>
<p>The pattern is the same: solve a real problem you already have, build it properly, and offer it to others who have the same problem. The agency gives you the context to identify real problems. The product gives you leverage beyond your headcount.</p>
<hr>

    <h2 id="how-to-actually-do-it" class="scroll-mt-24">How to Actually Do It</h2>
  <p>There&#39;s a concept I keep coming back to: every small business should put 20% of its time into R&amp;D.</p>
<p>And when I say R&amp;D, I don&#39;t necessarily mean building a new product. It could be optimizing how you run projects so you actually have time for diversification. It could be figuring out where your margins really come from. It could be analyzing your services to find growth opportunities you&#39;re sitting on without knowing it.</p>
<p>The hard part is that client work always wins in the short term. A client with a deadline feels urgent. R&amp;D doesn&#39;t have a deadline, so it keeps getting pushed. The way to fight that is to treat it like a scheduled commitment, not something you do when things slow down. Things never slow down. If you don&#39;t put it on the calendar, it won&#39;t happen.</p>
<p>Keep the scope small too. A dedicated hour or two a few times a week beats a big sprint that burns out in a month. Finish your client work for the day, then switch. Keeping them separate means you&#39;re not context switching all day, which is where most of the time actually goes.</p>
<p>If you&#39;re starting from scratch, keep it simple.</p>
<p>Pick one direction. A productized offer, a course on something you know well, a small tool that solves a problem your clients keep running into. Give it a real time slot alongside your agency work, not a sprint you&#39;ll drop after two weeks.</p>
<p>Build in public if you can. The marketing and the building happen at the same time that way.</p>
<p>Year one isn&#39;t about replacing your agency revenue. It&#39;s just about proving the model works.</p>
<hr>

    <h2 id="wrap-up" class="scroll-mt-24">Wrap Up</h2>
  <p>Agencies are great when they&#39;re working. The problem is they&#39;re fragile by design. They depend on a constant flow of clients, on your team showing up, on your own energy holding up.</p>
<p>Diversification isn&#39;t about abandoning what&#39;s working. It&#39;s about building something alongside it so that a bad quarter stays a bad quarter, and doesn&#39;t turn into something worse.</p>
<p>Client work feels safe because you can see the money. R&amp;D feels risky because you can&#39;t. But that&#39;s exactly why most people never start, and why the ones who do end up somewhere different a few years later.</p>
<p>Nobody can tell you if it&#39;ll work. But you can&#39;t find out if you never try.</p>]]></description>
      </item>
    
      <item>
        <title>Setting up a Repo for Success with CLAUDE.md and AGENTS.md</title>
        <link>https://devmystify.com/blog/setting-up-a-repo-for-success-with-claude-md-and-agents-md</link>
        <pubDate>Thu, 21 May 2026 05:55:18 GMT</pubDate>
        <description><![CDATA[<p>Run <code>create-next-app</code> today and you&#39;ll notice something new. It doesn&#39;t just scaffold your project anymore. It creates a <code>CLAUDE.md</code> file for you automatically, with an import pointing at <code>AGENTS.md</code>.</p>
<p>That wasn&#39;t there before. And it&#39;s not a coincidence. It means the tooling now expects you to think about AI context the same way you think about <code>.gitignore</code> or <code>tsconfig.json</code>: something you set up before you write a single line of code, not something you patch in later when things are already messy.</p>
<p>Most developers still skip this step, and honestly it&#39;s not hard to understand why. It looks like extra setup before you&#39;ve even written a line of code. And if you&#39;ve never seen the difference it makes, it&#39;s hard to know whether it&#39;s actually worth it or just one more config file to maintain.</p>
<p>So instead of just explaining it, let&#39;s see what actually happens.</p>

    <h2 id="why-claude-keeps-forgetting-your-rules" class="scroll-mt-24">Why Claude Keeps &quot;Forgetting&quot; Your Rules</h2>
  <p>Every Claude Code session starts completely fresh. No memory of last week. No recall of the architecture decision from three months ago. No awareness that your team agreed to never use default exports.</p>
<p>What Claude has is a context window: everything it can see at once, which includes your files, your prompt, and the conversation so far. It holds a lot, but not forever.</p>
<p>The annoying part is that long sessions drift. As a conversation gets long, Claude starts compressing earlier context to make room for new messages, and small details disappear in that process. It gets dumber, to put it simply. The naming rule you mentioned at the start of the session gets fuzzy. The instruction about where server actions should live stops being applied consistently. You end up typing the same correction multiple times without really knowing why.</p>
<p><code>CLAUDE.md</code> sidesteps this because it&#39;s not part of the conversation at all. It&#39;s read directly from disk at the start of every session, before anything else happens. Your rules don&#39;t go through compaction because they never live in the conversation history in the first place.</p>

    <h2 id="three-layers-of-memory" class="scroll-mt-24">Three Layers of Memory</h2>
  <p>Before getting into what to put in <code>CLAUDE.md</code>, it helps to understand that Claude Code actually has three different ways to carry knowledge across sessions. Each one does something different.</p>
<p><strong><code>CLAUDE.md</code> files</strong> are what you write. Project conventions, build commands, architectural decisions, naming rules. Anything a new developer joining the team would need to know before touching the codebase. These load at the start of every session.</p>
<p><strong>Skills</strong> are on-demand files that Claude reads only when relevant. If you have detailed API documentation, component design guidelines, or a complex workflow that only applies to one part of the codebase, it doesn&#39;t need to be in <code>CLAUDE.md</code>. You reference it with <code>@path/to/file</code> syntax, and Claude pulls it in when needed. This is the right place for anything too long or too specific to load every session. It keeps your main <code>CLAUDE.md</code> short and your context window from filling up with things Claude doesn&#39;t need right now.</p>
<p><strong>Auto memory</strong> is what Claude writes for itself. As you work, Claude saves notes: build commands that kept failing, debugging patterns that worked, preferences it noticed you correcting. It stores these in a <code>MEMORY.md</code> file in a project-specific directory on your machine. You don&#39;t manage it manually. Claude updates it on its own, and the first 200 lines load automatically with every new session.</p>
<p>The separation is worth understanding. <code>CLAUDE.md</code> is for rules that apply every session without exception. Skills are for knowledge that&#39;s only needed sometimes. Auto memory is for things Claude picked up from working with you specifically.</p>

    <h2 id="what-actually-belongs-in-claudemd" class="scroll-mt-24">What Actually Belongs in CLAUDE.md</h2>
  <p>The official guidance from Anthropic is to keep it under 200 lines. That might sound like a lot, but it fills up faster than you&#39;d expect once you start dumping things in. And a bloated <code>CLAUDE.md</code> is almost as bad as no <code>CLAUDE.md</code> at all. When Claude has to scan 500 lines to find what applies, it starts missing things. A short file gets followed more consistently than a thorough one.</p>
<p>A quick way to think about what belongs: would Claude get this wrong without being told? If yes, and it applies to the whole project, it belongs here. Things like exact build and test commands, file naming conventions, structural rules about where things live, non-default choices like &quot;use named exports only&quot; or &quot;all server actions go in <code>app/actions/</code>.&quot;</p>
<p>What doesn&#39;t belong: vague guidance like &quot;write clean code&quot; (Claude already tries to do this), long documentation (that&#39;s what Skills are for), and anything that only applies to one corner of the codebase. For those, use path-scoped rules in <code>.claude/rules/</code> so the instructions only load when Claude is actually working on matching files.</p>
<p>If you&#39;re not sure where to start, just run <code>/init</code> inside Claude Code. It&#39;ll analyze your project and generate a starting file based on what it finds. Not perfect, but a much better baseline than a blank file.</p>

    <h2 id="agentsmd-and-claudemd-together" class="scroll-mt-24">AGENTS.md and CLAUDE.md Together</h2>
  <p>If your repo already has an <code>AGENTS.md</code> for other tools like Cursor or Copilot, you don&#39;t need to duplicate everything. Claude Code reads <code>CLAUDE.md</code>, not <code>AGENTS.md</code> directly. But you can import one into the other:</p>
<pre><code>@AGENTS.md

## Claude-Specific Instructions
Use plan mode for changes under `src/billing/`.
</code></pre><p>This way both tools read the same base conventions, and you add Claude-specific notes below the import. What <code>create-next-app</code> generates is already structured this way. The <code>CLAUDE.md</code> it creates imports <code>AGENTS.md</code> out of the box.</p>

    <h2 id="what-this-actually-changes-a-comparison" class="scroll-mt-24">What This Actually Changes: A Comparison</h2>
  <p>
    <figure class="my-8">
      <div class="relative w-full max-w-3xl mx-auto rounded-xl overflow-hidden">
        <img src="https://d3tgxfx23qkrig.cloudfront.net/uploads/media/278/original-scr-20260513-hvly.png" alt="normal todos" class="w-full h-auto object-contain" />
      </div>
    </figure>
  </p>
<p>
    <figure class="my-8">
      <div class="relative w-full max-w-3xl mx-auto rounded-xl overflow-hidden">
        <img src="https://d3tgxfx23qkrig.cloudfront.net/uploads/media/277/original-scr-20260513-hvjb.png" alt="todos using claude.md" class="w-full h-auto object-contain" />
      </div>
    </figure>
  </p>
<p>I ran a small experiment to see how much difference this actually makes in practice. Two fresh Next.js projects, same prompt, same version of Claude Code. The only difference: one had an <code>AGENTS.md</code> with explicit project conventions, the other had only the default warning about Next.js breaking changes that <code>create-next-app</code> puts there.</p>
<p>Here&#39;s the <code>AGENTS.md</code> I used for the second project:</p>
<pre><code class="language-markdown"># Project Conventions

## Package Manager
- Use `npm` for all package operations

## Router
- Use Next.js App Router only
- No Pages Router patterns

## Exports
- Always use named exports
- Never use default exports

## File Naming
- Component files must use kebab-case (e.g. `todo-item.tsx`, `add-todo-form.tsx`)
- Component names inside files remain PascalCase

## Styling
- Tailwind only
- No inline styles
- Use `clsx` for conditional class names, never template literals

## Project Structure
- All server actions must live in `app/actions/` directory
- Components go in `components/` directory at the project root

## Testing
- Use Playwright for end-to-end tests
- Test files go in `e2e/` directory
- Run tests with `npx playwright test`
</code></pre><p>The prompt I gave both was intentionally vague:</p>
<blockquote>
<p>Build a simple Todo app with the following features: add a new todo, mark a todo as complete, delete a todo. Use Next.js with Tailwind CSS.</p>
</blockquote>
<p>Without conventions, the first thing I noticed was the file structure. Claude put everything into a single <code>TodoApp.tsx</code> inside <code>app/components/</code>: state, handlers, UI, all of it in one place. Which, when you let it assume everything, is kind of the expected result. There&#39;s no reason for it to split things up if nobody told it to. The architecture was pure client-side too, <code>useState</code> for everything, which works fine but doesn&#39;t use any of what App Router is actually designed for.</p>
<p>With <code>AGENTS.md</code> in place, the output was structurally different from the first prompt. Components landed in <code>components/</code> at the project root, named in kebab-case. Server actions went into <code>app/actions/</code>. The page itself became a Server Component with client components underneath. <code>clsx</code> for conditional classes. <code>crypto.randomUUID()</code> instead of <code>Date.now()</code> for IDs. Named exports throughout.</p>
<p>Both apps looked nearly identical in the browser. That&#39;s what makes this easy to dismiss. But the code underneath was built completely differently. The difference wasn&#39;t just naming conventions. The architecture changed too.</p>
<p>In case the description isn&#39;t clear enough, here&#39;s the diff side by side:</p>
<table>
<thead>
<tr>
<th></th>
<th><code>todo</code> (no conventions)</th>
<th><code>todo-agent</code> (with <code>AGENTS.md</code>)</th>
</tr>
</thead>
<tbody><tr>
<td><strong>File structure</strong></td>
<td><code>app/components/TodoApp.tsx</code> (single file)</td>
<td><code>app/actions/todos.ts</code>, <code>components/add-todo-form.tsx</code>, <code>components/todo-item.tsx</code>, <code>lib/store.ts</code></td>
</tr>
<tr>
<td><strong>State</strong></td>
<td><code>useState</code> (client-side only)</td>
<td>In-memory store + Server Actions</td>
</tr>
<tr>
<td><strong>Rendering</strong></td>
<td>Pure Client Component</td>
<td>Server Component (page) + Client Components</td>
</tr>
<tr>
<td><strong>Server Actions</strong></td>
<td>None</td>
<td><code>&quot;use server&quot;</code> + <code>revalidatePath</code></td>
</tr>
<tr>
<td><strong>Export style</strong></td>
<td><code>default export</code></td>
<td><code>named export</code></td>
</tr>
<tr>
<td><strong>ID type</strong></td>
<td><code>number</code> (Date.now())</td>
<td><code>string</code> (crypto.randomUUID())</td>
</tr>
<tr>
<td><strong>Conditional CSS</strong></td>
<td>Template literals</td>
<td><code>clsx</code></td>
</tr>
</tbody></table>
<p>And maybe the more practical payoff: I stopped having to say the same things twice. Once the conventions are in the file, they&#39;re just there. Every session, every feature, every time. That alone saves more time than it sounds like it would.</p>
<p>Worth noting: this experiment only tested architecture and structure. Add a Skill on top of it and the gap widens further. If your <code>AGENTS.md</code> imports something like <code>@.claude/skills/component-design.md</code> with your color tokens, spacing scale, and component patterns, Claude starts producing UI that actually looks like it belongs in your codebase. The more context you give it, the more the output feels like yours.</p>

    <h2 id="the-file-that-outlasts-the-developer" class="scroll-mt-24">The File That Outlasts the Developer</h2>
  <p>There&#39;s a pattern that shows up in every codebase that&#39;s been around long enough. Some decisions are well-documented. Most aren&#39;t. The choice of a particular library, the reason a certain folder exists, the rule about never doing X in module Y: these things live in whoever made the decision, not in any file.</p>
<p>When that person leaves, the knowledge leaves with them.</p>
<p><code>CLAUDE.md</code> is an opportunity to change that habit. Not because it&#39;s the right place to dump all your institutional knowledge, but because it asks a useful question at the start of every project: what does Claude need to know to work the way we work?</p>
<p>Answering that question honestly tends to surface the things that were never written down. The non-obvious choices. The decisions that would confuse a new engineer. The rules that exist because something went wrong once and everyone agreed never to do it again.</p>
<p>When that knowledge lives in a file instead of in someone&#39;s head, it doesn&#39;t just help Claude. It helps the next developer who joins the project. It helps you six months from now when you&#39;ve forgotten why you made a choice. It becomes part of how the project explains itself.</p>
<p>AI made that useful in a new way. But the underlying habit, writing down what you know so the work can outlast any single person, was always worth having.</p>
<p>If you want to go deeper on building a real workflow around AI tools, I&#39;m working on a course: 
    <a href="https://devmystify.com/courses/ai-productivity-blueprint" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      The Developer&#39;s AI Productivity Blueprint
    </a>
  . It covers everything from the basics through multi-agent workflows. Join the waitlist and I&#39;ll select a few people to get early access in exchange for feedback.</p>]]></description>
      </item>
    
      <item>
        <title>Is "Prompt Engineering" Real?</title>
        <link>https://devmystify.com/blog/is-prompt-engineering-real</link>
        <pubDate>Thu, 14 May 2026 01:41:50 GMT</pubDate>
        <description><![CDATA[<p>Ask ten developers how they talk to AI and you&#39;ll get ten different answers.</p>
<p>Some write structured prompts with labeled sections and explicit constraints. Some just describe what they need in plain sentences. Some have settled on a format that works for them and stopped thinking about it. Most of them are getting decent results either way.</p>
<p>So the question is worth asking: does the structure actually matter, or have we been optimizing something that was already fine?</p>
<p>The answer is yes, it matters. But only for one of the two things people use AI for, and most of the advice online doesn&#39;t make that distinction.</p>

    <h2 id="the-research-says-one-thing-the-reality-is-more-specific" class="scroll-mt-24">The Research Says One Thing. The Reality Is More Specific.</h2>
  <p>
    <a href="https://aakashgupta.medium.com/i-studied-1-500-academic-papers-on-prompt-engineering-heres-why-everything-you-know-is-wrong-391838b33468" target="_blank" rel="noopener noreferrer" class="text-copper hover:text-flamebright">
      Someone recently did a meta-analysis of over 1,500 academic papers on prompt engineering
    </a>
   and found that the companies generating real revenue from AI aren&#39;t following the advice circulating on social media. They&#39;re doing something more systematic, and more boring.</p>
<p>But buried inside that finding is something more interesting than &quot;conventional wisdom is wrong.&quot;</p>
<p>The real distinction isn&#39;t between good prompts and bad prompts. It&#39;s between two completely different use cases that most people treat as the same thing.</p>

    <h2 id="two-ways-people-actually-use-ai" class="scroll-mt-24">Two Ways People Actually Use AI</h2>
  <p>The first is personal use. You need to draft something, debug a function, think through a decision. You open a chat window and describe what you want. Maybe you mention your role or give some context. You read the output, ask a follow-up, and move on.</p>
<p>The second is system use. An application calls an AI endpoint. It does this hundreds or thousands of times. Every call needs to return output in a specific format so the rest of the system can parse it. The response isn&#39;t being read by a human who can interpret variations. It&#39;s being consumed by code that expects consistency.</p>
<p>These are not the same problem. And the prompt engineering advice that applies to one doesn&#39;t necessarily apply to the other.</p>
<p>For personal use, a clearly scoped natural language prompt works fine. You don&#39;t need XML tags. You don&#39;t need a <code>&lt;role&gt;</code> block. You need to be clear about what you want, and modern models are good enough to handle the rest.</p>
<p>For system use, structure isn&#39;t a stylistic choice. It&#39;s a reliability requirement.</p>

    <h2 id="i-ran-the-same-prompt-three-times" class="scroll-mt-24">I Ran the Same Prompt Three Times</h2>
  <p>To make this concrete, I tested it.</p>
<p>I asked AI to write a JavaScript function that analyzes a user object and returns a structured report. The function needed to calculate days since last login, determine whether someone was a high-value customer, and return a specific status message based on that determination.</p>
<p>I ran the same request three times in natural language, then three times using a structured prompt. Fresh conversation each time.</p>
<p><strong>The natural language prompt:</strong></p>
<pre><code>I have a JavaScript object representing a user with fields like name, email, age,
subscription (which can be &quot;free&quot;, &quot;pro&quot;, or &quot;enterprise&quot;), lastLoginDate, and
totalPurchases. Write a function called generateUserReport that takes this user
object and returns a report object. The report should include the user&#39;s full name
and email, whether they&#39;re a high value customer (pro or enterprise subscribers
who have made more than 5 purchases), how many days since they last logged in,
and a status message that says something different depending on whether they&#39;re
high value or not. Return just the code.
</code></pre><p><strong>The structured prompt:</strong></p>
<pre><code class="language-xml">&lt;role&gt;Senior JavaScript Developer&lt;/role&gt;

&lt;task&gt;
Write a function called generateUserReport(user) that analyzes a user object
and returns a structured report.
&lt;/task&gt;

&lt;input_shape&gt;
{
  name: string,
  email: string,
  age: number,
  subscription: &quot;free&quot; | &quot;pro&quot; | &quot;enterprise&quot;,
  lastLoginDate: ISO date string,
  totalPurchases: number
}
&lt;/input_shape&gt;

&lt;output_shape&gt;
{
  fullName: string,
  email: string,
  isHighValue: boolean,
  daysSinceLogin: number,
  statusMessage: string
}
&lt;/output_shape&gt;

&lt;requirements&gt;
- isHighValue: true only if subscription is &quot;pro&quot; or &quot;enterprise&quot; AND totalPurchases &gt; 5
- daysSinceLogin: calculated from lastLoginDate to today
- statusMessage: &quot;Priority customer - schedule check-in&quot; if isHighValue,
  &quot;Standard account&quot; if not
&lt;/requirements&gt;

&lt;constraints&gt;
- Output ONLY valid executable JavaScript
- NO markdown formatting or backticks
- NO explanations or comments
&lt;/constraints&gt;
</code></pre><p>The natural language results all produced correct, working code. But look at what happened to <code>statusMessage</code> across three runs:</p>
<ul>
<li>Run 1: <code>&quot;Thank you for being a valued premium partner!&quot;</code></li>
<li>Run 2: <code>&quot;Check out our latest offers to upgrade your experience.&quot;</code></li>
<li>Run 3: <code>&quot;Priority account: This user is a key contributor to revenue.&quot;</code></li>
</ul>
<p>Three completely different strings. Different tone, different phrasing, different intent. The key name for days since login also drifted, appearing as <code>daysSinceLastLogin</code> in some runs. Some runs added JSDoc comments. Others didn&#39;t.</p>
<p>The structured prompt told a different story. Across all three runs, <code>statusMessage</code> was identical every time: <code>&quot;Priority customer - schedule check-in&quot;</code> or <code>&quot;Standard account&quot;</code>. Key names matched the <code>&lt;output_shape&gt;</code> exactly. No comments appeared unless specified.</p>
<p>The code quality wasn&#39;t meaningfully better. What changed was the predictability.</p>

    <h2 id="predictability-is-the-point" class="scroll-mt-24">Predictability Is the Point</h2>
  <p>This is the thing that most prompt engineering content misses.</p>
<p>When you&#39;re using AI yourself, variation is often fine. If the output is slightly different each time, you read it, evaluate it, and decide if it works. You&#39;re in the loop.</p>
<p>When AI is part of a system, variation becomes a bug. If a status message changes between calls, something downstream breaks. If a key name shifts, a parser fails. No one is reading the output before it gets used. Consistency isn&#39;t a nice-to-have. It&#39;s the requirement.</p>
<p>Structured prompts with explicit output definitions, clear constraints, and specific key names lock the model into a narrower range of responses. That&#39;s what makes them useful in production, not that they produce higher quality output, but that they produce the same output reliably.</p>
<p>For everything else, the overhead usually isn&#39;t worth it. Describing what you need in plain language, with clear scope and context, is enough. The model understands you. It doesn&#39;t need to be spoken to in a specific dialect.</p>

    <h2 id="so-is-it-real" class="scroll-mt-24">So Is It Real?</h2>
  <p>Prompt engineering is real, but it&#39;s a specific tool for a specific problem.</p>
<p>If you&#39;re building a system where AI output feeds into code, where consistency across calls matters, where no human is reviewing each response before it gets used, then the structure is worth it. The tags, the explicit schemas, the defined constraints, they exist to solve a reliability problem, not a quality problem.</p>
<p>If you&#39;re using AI to do your own work, spending an hour on prompt structure is probably not the best use of that hour. Be clear. Give context. Describe what you want. That&#39;s most of what matters.</p>
<p>The people selling magic templates have it backwards. The goal isn&#39;t to find the right words. The goal is to understand what you&#39;re actually trying to solve, and then use the right level of structure for that problem.</p>
<p>For most things, that level is lower than the internet would have you believe.</p>]]></description>
      </item>
    
      <item>
        <title>The New Skill That Will Matter More Than Coding</title>
        <link>https://devmystify.com/blog/the-new-skill-that-will-matter-more-than-coding</link>
        <pubDate>Fri, 24 Apr 2026 01:54:52 GMT</pubDate>
        <description><![CDATA[<p>Everyone is trying to get better at AI right now.</p>
<p>Better prompts. Better tools. Better workflows. The assumption is that if you can just squeeze more out of the model, you will stay ahead.</p>
<p>That is not the skill that matters.</p>

    <h2 id="before-we-get-into-it" class="scroll-mt-24">Before We Get Into It</h2>
  <p>I have written about this shift before. About how the bottleneck moved from writing code to understanding systems. About how AI does not know your business context, and why that gap does not close no matter how good the models get.</p>
<p>That is all still true. But there is a layer underneath it that I did not get to, and it is the part that actually changes what a good engineer looks like day to day.</p>

    <h2 id="what-everyone-gets-wrong-about-prompting" class="scroll-mt-24">What Everyone Gets Wrong About Prompting</h2>
  <p>When something goes wrong with AI-generated code, the instinct is to blame the prompt. The logic makes sense: better input, better output. So developers iterate on their prompts, add more context, write more detailed instructions, and sometimes it helps.</p>
<p>But there is a category of failure that prompting cannot fix. And it is the most common one.</p>
<p>AI works within a context window. It sees what you give it in that moment, and nothing else. It does not see the file you did not include. It does not see the service that runs in a separate repository. It does not see the architectural decision from eight months ago that constrained everything built after it. It generates something coherent based on what is in front of it, which can look exactly right while being completely wrong for the system it lives in.</p>
<p>This is not a knowledge problem you can solve by writing a better prompt. It is a structural limitation. The model is not missing information you forgot to provide. It is missing information that cannot be put into a prompt because it is distributed across your entire codebase, your team&#39;s history, and decisions that were never written down.</p>

    <h2 id="what-validation-actually-requires" class="scroll-mt-24">What Validation Actually Requires</h2>
  <p>Take a concrete example. You ask AI to build authentication for an app where users can be logged in across multiple devices. It produces token expiry logic, a refresh flow, tests that pass. Everything looks correct, because at the level the AI can see, it is.</p>
<p>What it cannot see is that this app handles financial data, and the business requirement is that changing a password must immediately invalidate every active session everywhere. That rule exists because of a specific incident that shaped how the team thinks about security. It is not in any file. It is in the institutional memory of the people who were there.</p>
<p>The AI built something that works. It did not build what the system needs. And nothing about the prompt would have changed that, because the person writing the prompt did not think to include it either.</p>
<p>This is where validation becomes something other than reviewing output. It is the act of bringing everything the AI cannot see into contact with everything it produced. Not skimming for syntax errors. Not checking whether the tests pass. Asking whether this code, in this system, with this history, actually does the right thing.</p>
<p>That requires knowing the system at a level that lives outside any single file or conversation. It requires knowing which decisions were made under constraint, which parts of the codebase are fragile for reasons that are not obvious, and which requirements look stable but are not. None of that is in the prompt. All of it determines whether the output is correct.</p>

    <h2 id="the-skill-nobody-is-training-for" class="scroll-mt-24">The Skill Nobody Is Training For</h2>
  <p>Most AI workflow advice focuses on the generation side. How to structure prompts. How to break down tasks. How to get better output faster.</p>
<p>The validation side gets treated as a review step. Read the code, check the tests, ship it.</p>
<p>But validation in the way I am describing is not a review step. It is the part of the job that requires the deepest understanding of the system. And it is the part that AI makes harder, not easier, because the volume of code being generated has outpaced the instincts most developers have built for evaluating it.</p>
<p>The engineers who will struggle are not the ones who prompt badly. They are the ones who can generate quickly but cannot hold the whole system in their head. Who can review a function but cannot see how it fits into something larger. Who treat a passing test suite as the end of the question rather than the beginning of it.</p>
<p>The engineers who will not are the ones who understand that generating the code was never the hard part. Knowing whether it belongs in the system is.</p>

    <h2 id="coding-still-matters" class="scroll-mt-24">Coding Still Matters</h2>
  <p>None of this means writing code stops mattering. Reading a diff, tracing logic, understanding what a piece of code actually does, that is still the foundation.</p>
<p>But it is no longer where the difficulty lives.</p>
<p>The difficulty is in carrying the system in your head clearly enough to know when something generated fits and when it only looks like it does. That is not a skill you can prompt your way into. It is built from time spent understanding how things connect, why decisions were made, and what the codebase is actually trying to do.</p>
<p>The developers who will matter are not the ones who generate the most. They are the ones who understand enough to know when to trust what was generated, and when to push back on it.</p>
<p>That has always been the job. It is just more visible now.</p>]]></description>
      </item>
    
      <item>
        <title>AI Made Me Faster. It Also Made Me Worse.</title>
        <link>https://devmystify.com/blog/ai-made-me-faster-it-also-made-me-worse</link>
        <pubDate>Thu, 09 Apr 2026 08:52:56 GMT</pubDate>
        <description><![CDATA[<p>When I started using AI tools daily, the speed was real. I was shipping faster, finishing tasks that used to take an afternoon in an hour. I felt amazing, but also… wrong.</p>
<p>Then I looked more carefully at what I was actually producing.</p>
<hr>

    <h2 id="the-good-part-is-real" class="scroll-mt-24">The Good Part Is Real</h2>
  <p>I want to be honest about this part, because the rest of this article will not make sense without it.</p>
<p>AI genuinely changed the pace of my work. Scaffolding a new feature used to take time — now it takes minutes. Boilerplate code is mostly gone, and when I hit an error, I get an explanation immediately instead of spending twenty minutes reading documentation I half-understand.</p>
<p>The speed is not hype. If you use these tools every day, you feel it.</p>
<p>And that is exactly where the problem starts.</p>
<hr>

    <h2 id="how-i-actually-used-to-work" class="scroll-mt-24">How I Actually Used to Work</h2>
  <p>Before AI, I was a &quot;paint on canvas&quot; developer. I didn&#39;t fully plan features before writing them. I liked to throw something quick and dirty at the wall to get a base layer down, something that roughly worked, and let the shape of the feature emerge as I went. Messy, hacked together, but complete. Once the whole thing was working end to end, I&#39;d step back. </p>
<p>Now I had full context and I could see exactly how the feature fit into the app, what was redundant, what needed cleaning up. That&#39;s when I&#39;d refactor. </p>
<p>That allowed me to be fast, because I wasn’t overthinking the feature: get it working first, then refactor it all. Simple.</p>
<p>The messy first pass wasn&#39;t a problem to fix, it was the method. Explore fast, understand fully, then clean. That two-stage process was doing most of the real work, and I didn&#39;t even realize it until AI quietly erased half of it.</p>
<hr>

    <h2 id="then-ai-broke-the-loop" class="scroll-mt-24">Then AI Broke the Loop</h2>
  <p>Here&#39;s what I didn&#39;t expect: AI didn&#39;t improve that process. It disrupted the part that made it work.</p>
<p>The first stage, fast and dirty exploration, got even faster with AI, and that part felt great. But the second stage quietly disappeared, and the reason is sneakier than you&#39;d think. AI-generated code <em>looks</em> clean. It&#39;s formatted, it&#39;s structured, it doesn&#39;t scream &quot;this needs another pass.&quot; </p>
<p>So I stopped doing the refactor… not consciously, there was no moment where I decided to skip it. The code just looked finished, so my brain treated it as finished.</p>
<p>The problem is that looking clean and being well-thought-through are not the same thing. The messy draft is supposed to be a phase. AI turned it into the final product.</p>
<hr>

    <h2 id="the-prompt-loop-trap" class="scroll-mt-24">The Prompt Loop Trap</h2>
  <p>Here is a scenario most developers will recognize.</p>
<p>You have a problem. You write a prompt. The output is almost right, but not quite, so you prompt again with a small correction. Still off. You try a different angle, add more context, rephrase. Fifteen minutes later, you are still working on a problem you could have solved in two minutes if you had just opened the file and fixed it yourself.</p>
<p>At some point, you are no longer solving the problem, you are negotiating with the model. This happens because prompting feels like progress. Every response is something, you are moving. But sometimes the fastest path is to stop prompting, close the chat, and just think.</p>
<p>AI was faster, until I used it to avoid thinking and became lazy. Then it was just slower in disguise.</p>
<hr>

    <h2 id="the-hidden-cost-thinking-less" class="scroll-mt-24">The Hidden Cost: Thinking Less</h2>
  <p>This is the part that is hard to see while it is happening.</p>
<p>I started reviewing AI output the same way I skim a news article: looking for obvious problems, checking that it roughly matched what I asked for, then moving on. What I stopped doing was asking harder questions. Not &quot;does it work?&quot; but &quot;is this actually right?&quot;</p>
<p>The code was not obviously bad. It worked, tests passed. But &quot;works right now&quot; is not the same as “clean and maintainable”. I was accepting outputs I would have pushed back on before, because the output was good enough and moving on was easy. Standards do not drop all at once, they slip one small acceptance at a time.</p>
<hr>

    <h2 id="ai-didnt-skip-steps-i-did" class="scroll-mt-24">AI Didn&#39;t Skip Steps. I Did.</h2>
  <p>The development process has not changed. You still need to understand the problem before you build, think about the architecture before you write code, refactor the output into clean and maintainable code, and review it all carefully before you ship.</p>
<p>AI does not skip those steps, it only does what you ask, making it way too easy to get complacent. No friction, no obvious cost. The cost shows up later, when something breaks in a way you do not understand, or when you have to modify code you never actually knew.</p>
<hr>

    <h2 id="the-fix-is-not-a-tool" class="scroll-mt-24">The Fix Is Not a Tool</h2>
  <p>When I recognized what was happening, my first instinct was to find a better workflow: a smarter way to prompt, a tool that would catch what I was missing. That was the wrong instinct.</p>
<p>The problem was not the tool. The problem was that I had let the tool collapse a two-stage process into one, without noticing. The fix had to happen at the same level. Not a new tool, but a clearer mental model for how to work.</p>
<p>A few things that actually helped:</p>
<p><strong>I kept the two stages explicit.</strong> Fast and dirty with AI is still fine, but I now treat that output the same way I used to treat my own messy first pass. It&#39;s a base layer, not a finished product.</p>
<p><strong>I still do the refactor pass.</strong> Once the feature is working end to end, I step back and ask: now that I can see the whole thing, what would I actually do differently? That question used to come naturally. Now I have to be deliberate about it. I’ll tell Claude or Codex exactly how I want things to be refactored until I’m satisfied.</p>
<p><strong>When I find myself reprompting the same thing more than twice, I stop.</strong> That is a signal that I need to think, not prompt. Sometimes, clearing the context and starting fresh also helps.</p>
<p><strong>When I already know the answer, I just write the code.</strong> Not everything needs AI. Knowing when not to reach for the tool is as important as knowing how to use it.</p>
<hr>

    <h2 id="the-real-skill" class="scroll-mt-24">The Real Skill</h2>
  <p>The developers I see getting the most out of AI are not the ones with the best prompts: they are the ones who know what their process actually is and protect the parts that matter.</p>
<p>For me, the first pass was never where the real work happened. The value was in the second pass, when I had full context and could see clearly. AI made me think I could skip it, but really, I couldn&#39;t.</p>
<p>Tools will change and the specific model you use today will look different in a year, but knowing which stages of your process are doing the real work, and refusing to let a tool quietly erase them, that is the skill that does not get replaced. It gets more important.</p>
<p>AI made me faster. It also made me worse, for a while. The difference between those two outcomes was not the tool. It was whether I still did the second pass.</p>]]></description>
      </item>
    
      <item>
        <title>I Stopped Writing Code (Mostly). Here's What I Do Instead</title>
        <link>https://devmystify.com/blog/i-stopped-writing-code-mostly-here-s-what-i-do-instead</link>
        <pubDate>Thu, 02 Apr 2026 06:50:31 GMT</pubDate>
        <description><![CDATA[<p>I have been writing code for over a decade.</p>
<p>Last week, I wrote maybe 10 lines myself, and I shipped more than I usually do.</p>
<p>It’s not a flex, you’re probably doing the same thing. But it took me a while to get comfortable with it because writing was always the part that felt like real work to me.</p>
<p>Something has shifted though, and I think a lot of experienced developers are feeling it without quite knowing what to do with it.</p>

    <h2 id="the-role-has-changed" class="scroll-mt-24">The Role Has Changed.</h2>
  <p>There is a version of this conversation that goes: &quot;AI writes code now, so developers are done.&quot; That is not what I am seeing.</p>
<p>What I am actually seeing is that the work itself has moved.</p>
<p>For a long time, writing software was the hard part. That is why you spent years getting good at your language, your stack, your mental models. Execution was where most of the effort went. That is no longer true.</p>
<p>And when execution stops being the constraint, everything that used to wait behind it becomes visible. Understanding the actual problem. Defining what the system should look like before a line gets written. Knowing which shortcuts will cost you six months from now. That stuff does not get easier just because the code writes itself. If anything, it matters more.</p>
<p>The job did not disappear. It just sits at a different point in the process now.</p>
<p>My days look different because of it. Less time writing, more time managing what AI produces. It feels less like craftsmanship and more like technical direction. And the catch with that is: a fast, capable system that makes mistakes in subtle ways requires more attention, not less. You still have to know enough to catch what it gets wrong.</p>

    <h2 id="what-i-actually-do-now" class="scroll-mt-24">What I Actually Do Now</h2>
  <p>Before I touch any AI tool, I think through what I am building. Not at the line level, but at the system level. </p>
<ul>
<li>What are the components?</li>
<li>How does data move between them?</li>
<li>What are the constraints?</li>
<li>What should this thing never do?</li>
</ul>
<p>This is the part that AI cannot do for you. Not because the models are not capable, but because the answers live in your head and in the business context around the project.</p>
<p>Then, I ask Claude to generate an implementation plan for the feature. I will review that part thoroughly, before asking for a list of TDD-style tests to be generated before any code gets written. </p>
<p>Starting with that allows me to define what “done” looks like for the current feature.</p>
<p>If you skip these steps, you end up reviewing code against a vague idea of what you wanted. That is where AI slop comes from, not from bad models, but from unclear input.</p>
<p>Once I’ve reviewed the tests, the implementation work can start. I’ll usually try to do it step by step, with smaller chunks of the feature that I can review as I go. </p>
<p>This matters more than people realize. When you let AI generate a large chunk at once, reviewing it becomes overwhelming. You end up skimming and you end up missing things. Breaking it down forces both the AI and you to think in sequence, and it keeps each review focused enough to actually catch problems.</p>
<p>Then a second AI reviews the output, then I review it myself one more time.</p>
<p>There is also something worth saying about the speed. I will be honest: there is something genuinely satisfying about watching an idea become working software faster than it used to. </p>
<p>Getting to the built thing faster just means more time for the parts that actually require a human.</p>

    <h2 id="what-you-still-have-to-bring" class="scroll-mt-24">What You Still Have to Bring</h2>
  <p>That last review step is where experience earns its place.</p>
<p>I am not only checking syntax. I am also asking whether this approach makes sense for the business and whether we are solving the right problem at all.</p>
<p>This is where AI has a specific blind spot worth understanding. It is very good at producing code that looks functional. Tests pass. The feature works. But &quot;works right now&quot; and &quot;holds up over time&quot; are different things. AI does not naturally think about what happens when requirements shift, when the codebase grows, or when another developer has to modify this six months from now. It optimizes for the output in front of it, not for the system around it. That gap is exactly where experienced judgment lives.</p>
<p>A junior developer might see the same output and think it looks fine, because it does look fine. What they cannot always see yet is how it will behave when something changes around it. That judgment is not something you can prompt your way into. It comes from having seen enough things break.</p>
<p>If you are earlier in your career, this is not a reason to panic, but it is a reason to be intentional. The repetitive work that used to teach you how things connect is being automated, which means you have to find other ways to build that understanding deliberately. The good news is that learning has also gotten easier. You can take a well-known open source project, something like Rails or Linux, and ask AI to walk you through how a specific part works. When you do, push further than the answer. Ask why it was built that way, not just how it works. That habit is what separates developers who are actually learning from the ones who are just collecting answers.</p>
<p>The developers who will grow in this environment are the ones who use AI to understand systems faster, not to avoid understanding them at all.</p>

    <h2 id="what-this-means" class="scroll-mt-24">What This Means</h2>
  <p>I did not stop being an engineer.</p>
<p>I stopped being a typist.</p>
<p>The craft is still there. It just looks different now. Less time at the keyboard, more time thinking about systems. Less writing, more reviewing. Less implementation, more direction.</p>
<p>If anything, the parts of the job I find most interesting, the architecture decisions, the problem framing, the moments where you push back and say &quot;I think we are solving the wrong problem&quot;, those parts have more space now.</p>
<p>The 10 lines I wrote last week? Those were the lines that actually needed a human.</p>]]></description>
      </item>
    
  </channel>
</rss>