<?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>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'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'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 "Forgetting" 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-orange-500 hover:text-orange-400">
      The Developer'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-orange-500 hover:text-orange-400">
      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'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>
    
      <item>
        <title>Will Software Engineers Disappear Due to AI?</title>
        <link>https://devmystify.com/blog/will-software-engineers-disappear-due-to-ai</link>
        <pubDate>Thu, 19 Mar 2026 09:27:09 GMT</pubDate>
        <description><![CDATA[<p>Probably not, but the job is definitely changing.</p>
<p>I personally spend much less time writing code these days. Most of my time is spent managing AI agents and reviewing their work, almost like working with a team of engineers.</p>
<p>That shift matters more than the “AI will replace developers” debate, because writing code was never the most important part of the job.</p>
<p>The real value was always somewhere else: understanding the problem, thinking through the architecture, and translating messy requirements into something that actually works.</p>
<p>And that part hasn’t gone away.</p>
<p>But engineers who refuse to adapt probably will, and junior developers who rely entirely on AI without understanding what they’re building won’t last very long either.</p>
<p>There is a right way to use AI in 2026 if you want to stay productive, and a very wrong way.</p>
<p>Let’s dive in.</p>

    <h2 id="what-everyone-is-actually-arguing-about" class="scroll-mt-24">What Everyone Is Actually Arguing About</h2>
  <p>When people say &quot;AI will replace developers&quot; they usually mean one of three different things.</p>
<p>They either mean that junior roles will disappear, the whole profession is going away, or that AI will make engineers so efficient that companies will simply need fewer of them.</p>
<p>These are three completely different claims, and most of the debate online mixes all of them together. So before we go anywhere, let&#39;s be honest about what&#39;s real.</p>
<p>Yes, AI can write code. Good code, sometimes. It can scaffold a feature, write tests, handle boilerplate, and explain an error faster than any Stack Overflow thread. That part is not hype. If you&#39;ve used these tools daily, you know they genuinely change the pace of work.</p>
<p>But here&#39;s the part that gets left out of the conversation.</p>
<p>Very few layoffs in recent years were actually tied to direct AI automation. Most were companies correcting for overhiring during the boom years between 2020 and 2022. Saying &quot;we&#39;re going AI-first&quot; is a better headline than &quot;we hired 30 engineers when we only needed 10.&quot; Same layoffs. Better story.</p>
<p>AI didn&#39;t kill the job market. The job market corrected itself, and AI got the credit or the blame, depending on where you sit.</p>
<p>But that still doesn&#39;t answer the deeper question. Even if developers aren&#39;t being replaced right now, what about the work itself? Is the job changing in ways that matter?</p>
<p>Yes. And this is where it gets interesting.</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/276/original-techlayoffs.png"
          alt="Tech Employees Impaced by Layoffs Char"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>

    <h2 id="ai-fixes-the-code-not-the-problem" class="scroll-mt-24">AI Fixes the Code, Not the Problem</h2>
  <p>A while back, I ran into a bug in the staging environment of an app I help maintain, and it stuck with me. Not because it was complicated, but because of how simple the real fix turned out to be and how AI completely missed it.</p>
<p>You see, in that app, we have a job scheduled to run daily. Its job is straightforward: check documents and expire the ones that have passed their expiration date. </p>
<p>But at some point, we disabled it: development had been paused, costs needed to be cut, and staging wasn’t really needed for a while. It stayed off for about four months.</p>
<p>When we turned staging back on, something was wrong. Many users were showing incorrect expiration states. The data looked off and I wasn’t sure why.</p>
<p>So I asked Codex, which looked at the code, analyzed the logic, and started suggesting fixes: </p>
<ul>
<li>Change this condition</li>
<li>Adjust that check</li>
<li>Add this validation</li>
</ul>
<p>The suggestions looked reasonable, but really, the code was completely fine.</p>
<p>The real problem was that the scheduled job only looked back four days when checking for expired documents. After four months of not running, there was a massive gap. The fix wasn&#39;t a code change at all. It was just running a script to backfill the last four months of missed processing. There was no need to change any code, since there was no bug. </p>
<p>AI never got there… It kept staring at the code because that&#39;s all it can see. You could argue that if Codex had full access to that Heroku account, it would have likely seen that the scheduled job was missing, but giving full access to infrastructure to any AI is still something where I draw the line.</p>
<p>At the end of the day, the problem wasn’t in the code. It was based on a human decision dictated by business needs.</p>

    <h2 id="the-knowledge-ai-cannot-access" class="scroll-mt-24">The Knowledge AI Cannot Access</h2>
  <p>This is worth sitting with for a moment.</p>
<p>Good engineers carry context that isn&#39;t written anywhere. They remember the cost-cutting decision from last quarter. They know why a certain table is structured the way it is, even though the original developer left two years ago. They know which parts of the system are fragile and why. It&#39;s not because it&#39;s documented, but because they were there when it broke.</p>
<p>AI works from what it can see: the code, the error, the prompt you gave it. It has no access to the meeting that never got written down. It can&#39;t ask the right question because it doesn&#39;t know the right question exists.</p>
<p>This gap doesn&#39;t disappear just because models get better. Even a much smarter AI still only knows what it&#39;s been told. The institutional memory of a system lives in the people who built and maintained it. That&#39;s not a limitation of today&#39;s tools. </p>
<p>That&#39;s a structural reality.</p>

    <h2 id="translation-is-still-a-human-job" class="scroll-mt-24">Translation Is Still a Human Job</h2>
  <p>Here&#39;s the other side of this.</p>
<p>Clients can use AI to build apps now. That&#39;s real. You can describe what you want, generate something functional, and ship it without writing a single line of code yourself. The tools exist. People are doing it.</p>
<p>But most clients still hire engineers. And the reason isn&#39;t that they can&#39;t use AI themselves. It&#39;s the same reason most people still call a plumber even though they could theoretically fix a leaky pipe themselves.</p>
<p>They don&#39;t want to think about it or deal with it. After all, they don&#39;t know what they don&#39;t know, and when something goes wrong in a way they didn&#39;t expect, they don&#39;t know where to start to fix it.</p>
<p>Software is the same. A client can prompt an AI to build an app, but they often can&#39;t communicate exactly what they want. They describe the surface, not the system. They say &quot;I want users to be able to track their orders&quot; without knowing that this single feature touches authentication, database design, notification logic, and mobile layout. Getting from &quot;here&#39;s what I want&quot; to &quot;here&#39;s what you actually need&quot; is a translation job. It requires someone who understands both the business and the technology well enough to bridge them.</p>
<p>That&#39;s why business analysts still exist. That&#39;s why good engineers ask questions before they write code. The requirement-gathering process, figuring out what a system needs to do before deciding how to build it, is something AI cannot replace, because the client often doesn&#39;t know how to tell it what they need.</p>
<p>And there&#39;s one more piece to this. A good engineer doesn&#39;t just build what the client asks for. They push back when something doesn&#39;t make sense. They suggest a simpler approach. They flag a technical decision that sounds reasonable on paper but will create problems at scale. That judgment comes from experience and business understanding. It&#39;s not in the prompt.</p>
<p>AI is lazy. It will create features that work, but the code will often be messy, unmaintainable, or poorly structured unless you guide it properly.</p>

    <h2 id="what-actually-gets-displaced" class="scroll-mt-24">What Actually Gets Displaced</h2>
  <p>Let&#39;s be honest here too, because the picture isn&#39;t all good news.</p>
<p>Some of what junior engineers used to do is genuinely getting automated. Repetitive boilerplate, simple helper functions, basic test generation, straightforward refactoring, and tons of UI work. </p>
<p>AI handles these faster and with less friction than a person would.</p>
<p>This means the learning path has changed. Before AI, juniors built experience by writing repetitive, simple code. That code taught them patterns, structure, and how things connect. Now AI writes that code instantly. What&#39;s left is understanding it, debugging it, and knowing when it&#39;s wrong.</p>
<p>That&#39;s harder to learn passively. And it&#39;s worth being honest that many juniors lose the repetitive practice that used to teach them how systems work. That&#39;s a real cost, but for the ones who push through it, it&#39;s actually a better foundation. The engineers who grow in this environment skip the surface-level work and go straight to the thinking.</p>
<p>The floor is rising. </p>
<p>What used to require a team of five can now be done by two people with the right tools. That creates real pressure at the entry level, but it also means engineers who develop genuine depth, who understand systems, not just syntax, will have more leverage than ever before.</p>

    <h2 id="the-question-that-actually-matters" class="scroll-mt-24">The Question That Actually Matters</h2>
  <p>The engineers who will struggle in this environment are the ones who let AI do the thinking entirely. Who accept the first output, ship it, and move on without understanding what they built. They&#39;ll feel productive for a while, but when something breaks in a way AI can&#39;t diagnose like a cron job that&#39;s been off for four months, they won&#39;t know where to look.</p>
<p>The engineers who will thrive are the ones who ask the right questions before touching the code. What problem are we actually solving? Does this approach make sense for the business? What context am I missing?</p>
<p>I&#39;ve seen this play out enough times to believe it. The value of a good engineer was never just in writing code quickly. It was in knowing which problem to solve, understanding the system well enough to ask the right question, and having enough business sense to know when the requirement itself is wrong.</p>
<p>AI didn&#39;t change that. It just made it more visible.</p>

    <h2 id="the-question-most-developers-skip" class="scroll-mt-24">The Question Most Developers Skip</h2>
  <p>Most developers are asking: <em>will I still have a job?</em></p>
<p>That&#39;s not the most useful question.</p>
<p>The better question is: <em>what does good engineering look like when the repetitive work gets automated?</em></p>
<p>The answer has always been the same. Understand the business. Own the context. Ask why before asking how. Know enough about the system&#39;s history to recognize when the problem isn&#39;t in the code.</p>
<p>AI changed the pace of the work. It didn&#39;t change what the work is actually for.</p>
<p>The developers who bring business thinking, institutional memory, and the ability to translate between what clients say and what systems need, those developers aren&#39;t disappearing.</p>
<p>They&#39;re just harder to replace, which was always the goal.</p>

    <h2 id="dont-want-to-be-left-behind" class="scroll-mt-24">Don’t want to be left behind?</h2>
  <p>If you want to build a real workflow around AI instead of just experimenting with tools, I’m working on a course that will be released in the coming weeks: 
    <a href="https://devmystify.com/courses/ai-productivity-blueprint"
       
       target="_blank" rel="noopener noreferrer"
       class="text-orange-500 hover:text-orange-400">
      The Developer’s AI Productivity Blueprint
    </a>
  .</p>
<p>It contains everything I’ve learned over the past few months, starting all the way from the basics, to the role shift we’re seeing, as well as more advanced topics like multi-agent workflows.</p>
<p>Check out the course’s page for more details and join the waitlist. I’ll be selecting a few people that will get the course for free in exchange for feedback.</p>]]></description>
      </item>
    
      <item>
        <title>Side Hustles for Developers, Devmystified</title>
        <link>https://devmystify.com/blog/side-hustles-for-developers-devmystified</link>
        <pubDate>Thu, 12 Mar 2026 03:59:51 GMT</pubDate>
        <description><![CDATA[<p>Most developers think about doing something on the side at some point in their career:</p>
<ul>
<li>Creating a small product</li>
<li>Building an app</li>
<li>Doing some freelancing to earn more</li>
</ul>
<p>Something that doesn’t depend on the whims of your boss.</p>
<p>I was one of them, but as a developer, I wasn’t really sure how to get started. </p>
<p>I tried writing books first, before eventually switching to freelancing. At the time, it turned out to be a much better fit for me… but I didn’t know that beforehand.</p>
<p>So I thought it might be a good idea to compile everything I’ve learned about starting businesses as developers safely (i.e. without quitting your job), along with the patterns I’ve seen other developers follow.</p>
<p>That eventually turned into an ebook, <strong>Side Hustles For Developers</strong>.</p>

    <h2 id="whats-side-hustles-for-developers" class="scroll-mt-24">What’s “Side Hustles For Developers”?</h2>
  <p>It’s the ebook I wish I had when I first got started… before spending a decade learning things the hard way. </p>
<p>And it’s free.</p>
<p>It’s a practical breakdown of the real ways developers build income outside their job, organized in a way that makes sense depending on where you are right now and what actually fits your style.</p>
<p>Inside you’ll find:</p>
<ul>
<li>How developers actually start side hustles without quitting their job</li>
<li>Which paths work at different stages of your career</li>
<li>How to avoid the traps that waste months of effort</li>
<li>How to choose the right starting point based on your time and skills</li>
</ul>
<hr>

    <h2 id="the-side-hustle-ladder" class="scroll-mt-24">The Side Hustle Ladder</h2>
  <p>The core of the ebook is a framework I call the <strong>Side Hustle Ladder</strong>.</p>
<p>The idea is simple. Not every hustle fits every person at every stage. Some take a weekend to start, while others take months of consistent work. Some need an audience, while others need nothing but a skill and a willingness to show up.</p>
<p>The Ladder helps you choose your next realistic step.</p>
<p>Not the dream scenario, but something you can actually start this week, based on your time, energy, and what you already know.</p>
<p>Here is a quick overview of the options we cover in the book:</p>

    <h3 id="freelancing-and-consulting-the-honest-version" class="scroll-mt-24">Freelancing and Consulting (The Honest Version)</h3>
  <p>This is where most developers start, and trust me, it works.</p>
<p>But most developers who try freelancing either undercharge (I was one of them), take on the wrong clients, or burn out because they traded one boss for five.</p>

    <h3 id="digital-products" class="scroll-mt-24">Digital Products</h3>
  <p>Templates, tools, open-source projects with a paid tier, courses… These are the ones that sound passive, but honestly, nothing is ever truly passive. </p>
<p>And they’re certainly not at the start as they take real work to build and real effort to promote. What changes is the economics: you build once and sell many times, which is a very different model from billing by the hour or by the project.</p>

    <h3 id="content-creation" class="scroll-mt-24">Content Creation</h3>
  <p>Creating content such as tutorials, articles, videos, or podcasts can be an amazing way to build authority as a developer, and eventually turn that authority into real revenue.</p>
<p>My main concern with freelancing is that it doesn’t create much long-term leverage. Each project or hour you work generates revenue, and sometimes leads to more clients through recommendations. But it doesn’t really compound over time.</p>
<p>Content does.</p>

    <h3 id="building-a-saas" class="scroll-mt-24">Building a SaaS</h3>
  <p>Building a SaaS or small product means creating something that solves a clear problem for a clear audience, and I’m going to be honest. </p>
<p>While this has one of the lowest barriers to entry for developers, it’s also one of the hardest paths to break into. Most developers start building right away, only to realize later that there isn’t a real need for what they built, or that they have no idea where to find customers.</p>
<hr>

    <h2 id="one-thing-i-want-to-be-clear-about" class="scroll-mt-24">One Thing I Want to be Clear About</h2>
  <p>Not every side hustle is right for every person. We’re all different, and we all approach work in different ways, so it’s important to identify the kind of hustle that fits you and your lifestyle.</p>
<p>That’s why the ebook talks about tradeoffs, not just opportunities.</p>
<p>Because the goal is not to hustle harder. The goal is to build something that fits, and potentially can replace your full-time job (if you want it to), like it did for me.</p>
<hr>

    <h2 id="start-where-you-are" class="scroll-mt-24">Start Where You Are</h2>
  <p>The ebook is free. All of it.</p>
<p>If you are a developer who has been sitting on the idea of building something on the side, this is a good place to start. Not because it has all the answers, but because it will help you figure out the right next step for where you actually are right now.</p>]]></description>
      </item>
    
      <item>
        <title>How to Migrate a Rails App from Heroku to DigitalOcean App Platform</title>
        <link>https://devmystify.com/blog/how-to-migrate-a-rails-app-from-heroku-to-digitalocean-app-platform</link>
        <pubDate>Wed, 04 Mar 2026 07:56:01 GMT</pubDate>
        <description><![CDATA[<p><em>We earn commissions when you shop through the links below.</em></p>

    <h2 id="table-of-contents" class="scroll-mt-24">Table of Contents</h2>
  <ul>
<li>
    <a href="#why-consider-moving-now"
       
       
       class="text-orange-500 hover:text-orange-400">
      Why Consider Moving Now?
    </a>
  </li>
<li>
    <a href="#what-were-assuming-about-your-app"
       
       
       class="text-orange-500 hover:text-orange-400">
      What We're Assuming About Your App
    </a>
  </li>
<li>
    <a href="#why-digitalocean-app-platform"
       
       
       class="text-orange-500 hover:text-orange-400">
      Why DigitalOcean App Platform?
    </a>
  </li>
<li>
    <a href="#before-you-touch-anything-the-migration-checklist"
       
       
       class="text-orange-500 hover:text-orange-400">
      Before You Touch Anything: The Migration Checklist
    </a>
  </li>
<li>
    <a href="#steps-to-migrate-from-heroku-to-digitalocean-app-platform"
       
       
       class="text-orange-500 hover:text-orange-400">
      Steps to Migrate from Heroku to DigitalOcean App Platform
    </a>
  </li>
</ul>
<p>On February 6, 2026, 
    <a href="https://www.heroku.com/blog/an-update-on-heroku/"
       
       target="_blank" rel="noopener noreferrer"
       class="text-orange-500 hover:text-orange-400">
      Heroku officially announced
    </a>
   it is transitioning to a &quot;sustaining engineering model.&quot; In plain English: no new features, just keeping the lights on. For developers who have relied on Heroku for years, this is a signal worth paying attention to. </p>
<p>For many Rails developers, that marks the end of an era. When Ruby on Rails was thriving, Heroku was the default. It meant you didn’t have to configure nginx on an Ubuntu server just to ship.</p>
<p>If you&#39;re still on Heroku, now is a good time to plan your exit before something forces your hand.</p>
<p>This guide walks you through migrating a standard Rails app from Heroku to 
    <a href="https://tidd.ly/4ndcJ1H"
       
       target="_blank" rel="noopener noreferrer"
       class="text-orange-500 hover:text-orange-400">
      DigitalOcean App Platform
    </a>
  , a fully managed PaaS with a similar push-to-deploy workflow.</p>

    <h2 id="why-consider-moving-now" class="scroll-mt-24">Why Consider Moving Now?</h2>
  <p>Before we get into the migration steps, here’s a quick comparison between Heroku and DigitalOcean App Platform as of early 2026:</p>
<table>
<thead>
<tr>
<th></th>
<th>DigitalOcean App Platform</th>
<th>Heroku</th>
</tr>
</thead>
<tbody><tr>
<td>Pricing model</td>
<td>Flat monthly pricing</td>
<td>Per-dyno + add-ons</td>
</tr>
<tr>
<td>Platform direction</td>
<td>Active development</td>
<td>Maintenance mode</td>
</tr>
<tr>
<td>Managed databases</td>
<td>Included &amp; integrated</td>
<td>Add-ons (extra cost)</td>
</tr>
<tr>
<td>Bandwidth overage</td>
<td>$0.01/GiB flat rate</td>
<td>Higher at scale</td>
</tr>
</tbody></table>
<p>Heroku still works. But pricing becomes harder to predict as you scale, especially with add-ons and bandwidth. DigitalOcean App Platform keeps things simpler and more predictable, which is why it’s a practical landing spot if you&#39;re planning a migration.</p>

    <h2 id="what-were-assuming-about-your-app" class="scroll-mt-24">What We're Assuming About Your App</h2>
  <p>This guide is written for a typical Rails setup:</p>
<ul>
<li>Your code lives in a <strong>GitHub repository</strong></li>
<li>You&#39;re using <strong>PostgreSQL</strong> as your database (hosted on Heroku)</li>
<li>You&#39;re using <strong>Sidekiq</strong> and Redis for background jobs</li>
<li>You have scheduled Rake tasks running via <strong>Heroku Scheduler</strong></li>
</ul>
<p>Even if your stack is slightly different, most of this still applies.</p>

    <h2 id="why-digitalocean-app-platform" class="scroll-mt-24">Why DigitalOcean App Platform?</h2>
  <p>DigitalOcean is straightforward, well-documented, and affordable, a natural landing spot for developers leaving Heroku.</p>
<p>App Platform is DigitalOcean&#39;s managed PaaS, and it&#39;s the closest thing to a Heroku replacement you&#39;ll find. It uses the same Cloud Native Buildpacks as Heroku, so most apps migrate with little to no code changes. You get fully managed PostgreSQL, MySQL, Redis, and MongoDB built in, free internal service routing between components (no Private Spaces fees), SSL provisioning, and zero-downtime deploys out of the box. You connect your GitHub repo, push code, and it deploys.</p>
<p>No servers to manage, no DevOps overhead, just your app running.</p>

    <h2 id="before-you-touch-anything-the-migration-checklist" class="scroll-mt-24">Before You Touch Anything: The Migration Checklist</h2>
  <p>Before setting up your new server, collect everything you need from Heroku and prepare the migration. Do this while your app is still running. For production apps, enable maintenance mode before exporting the database so no new data is written during the backup.</p>
<p>Most migrations run both platforms in parallel, then cut over at the DNS level once everything is confirmed stable. That&#39;s exactly the approach this guide follows, so downtime is minimal to zero.</p>
<p><strong>On Heroku’s side:</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Export all config vars: <code>heroku config -a your-app-name</code></li>
<li><input disabled="" type="checkbox"> Dump your database: <code>heroku pg:backups:capture &amp;&amp; heroku pg:backups:download</code></li>
<li><input disabled="" type="checkbox"> Note your custom domain (if any)</li>
<li><input disabled="" type="checkbox"> Note all Heroku Scheduler tasks (command + schedule)</li>
</ul>

    <h2 id="steps-to-migrate-from-heroku-to-digitalocean-app-platform" class="scroll-mt-24">Steps to Migrate from Heroku to DigitalOcean App Platform</h2>
  <ol>
<li><p><strong>Create an App on DigitalOcean App Platform</strong></p>
<p> Get started with DigitalOcean 
    <a href="https://tidd.ly/4ndcJ1H"
       
       target="_blank" rel="noopener noreferrer"
       class="text-orange-500 hover:text-orange-400">
      here
    </a>
  .</p>
<p> Once you’re in, go to App Platform and create a new app. Connect your GitHub repository and choose the branch you want to deploy.</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/274/original-connect-github-repo-to-do-app-platform.png"
          alt="Connecting a GitHub repository to DigitalOcean App Platform"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
<p> App Platform will detect your <code>Procfile</code> automatically and set the run command to <code>bundle exec puma -C config/puma.rb</code>. Leave the build command empty.</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/273/original-do-app-platform-run-command.png"
          alt="App Platform auto-detecting Procfile and setting Puma as the run"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
</li>
<li><p><strong>Add a Managed PostgreSQL Database</strong></p>
<p> In the same setup flow, go to the <strong>Add a Database</strong> tab, add a PostgreSQL database, and create an app.</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/272/original-do-add-postgresql-database.png"
          alt="Adding a managed PostgreSQL database in DigitalOcean App Platform setup"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
<blockquote>
<p><strong>Heads up:</strong> After adding the database, DO will show an environment variable reference like <code>${your-db-name.DATABASE_URL}</code>. This looks like it should work automatically, but in practice, you’ll want to replace it with the actual connection string so Rails and Sidekiq receive a proper <code>DATABASE_URL</code>. We&#39;ll do that in the next step.</p>
</blockquote>
</li>
<li><p><strong>Add a Managed Valkey Instance</strong></p>
<p> Add a second database and choose <strong>Valkey,</strong> DigitalOcean&#39;s Redis-compatible service. Your app and Sidekiq won&#39;t notice the difference.</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/271/original-do-add-db-engine.png"
          alt="Attach new database engine into the app"
          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/270/original-do-add-valkey-instance.png"
          alt="Selecting Valkey as a managed Redis-compatible database in DigitalOcean"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
</li>
<li><p><strong>Set Environment Variables</strong></p>
<p> This is the step that trips people up.</p>
<p> Go to <strong>Settings → Environment Variables</strong>. You&#39;ll see <code>DATABASE_URL</code> and <code>REDIS_URL</code> (If you set one) set to reference values like <code>${your-db.DATABASE_URL}</code>. Replace both with the actual connection strings.</p>
<p> To get the connection strings:</p>
<ul>
<li><strong>PostgreSQL</strong>: Go to your database → <strong>Connection Details</strong> → copy the <strong>Connection String</strong></li>
<li><strong>Valkey</strong>: Same thing, go to your Valkey instance → <strong>Connection Details</strong> → copy the connection string</li>
</ul>
<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/269/original-do-environment-variables-connection-strings.png"
          alt="PostgreSQL and Valkey connection strings"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
<p> Then add the rest of your environment variables from Heroku (<code>RAILS_MASTER_KEY</code>, any API keys, etc.).</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/268/original-do-all-env-vars-configured.png"
          alt="All environment variables configured in DigitalOcean App Platform"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  
 </p>
</li>
<li><p><strong>Restore Your Database</strong></p>
<p> Before you deploy, restore your data. If you deploy first, your app will 500 on every request until the database is ready. Run this from your local machine using the connection details from your new PostgreSQL database:</p>
<pre><code class="language-bash">PGPASSWORD=your_password pg_restore \\
  -U doadmin \\
  -h your-db-host.db.ondigitalocean.com \\
  -p 25060 \\
  -d defaultdb \\
  latest.dump
</code></pre><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/267/original-do-pg-restore-database-guide.png"
          alt="DigitalOcean managed PostgreSQL getting started guide showing the pg_restore command"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
<p> If you&#39;re starting fresh with no existing data, skip this and just run migrations after deploying instead.</p>
</li>
<li><p><strong>Deploy</strong></p>
<p> Deploy your app. Once it&#39;s live, if you skipped the restore above, open the web console and run:</p>
<pre><code class="language-bash">rails db:migrate
</code></pre><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/266/original-rails-db-migrate-console.png"
          alt="Running rails db migrate in DigitalOcean App Platform web console"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
</li>
<li><p><strong>Add Sidekiq as a Worker Component</strong></p>
<p> Sidekiq needs to run as a separate component so it has its own process and can be scaled or restarted independently from your web server. In DO App Platform, go to your app and create a new worker component:</p>
<ul>
<li><strong>Resource type</strong>: Worker</li>
<li><strong>Run command</strong>: <code>bundle exec sidekiq</code></li>
<li><strong>Environment variables</strong>: Make sure <code>DATABASE_URL</code> and <code>REDIS_URL</code> are set here too. The worker needs both</li>
</ul>
<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/265/original-do-sidekiq-worker-component-setup.png"
          alt="Creating a Sidekiq worker component in DigitalOcean App Platform"
          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/264/original-do-sidekiq-worker-deploy-config.png"
          alt="Configuring the Sidekiq worker run command in DigitalOcean App Platform"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
<p> Deploy the worker. Check the runtime logs, you should see Sidekiq boot up and connect to Valkey.</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/263/original-do-sidekiq-runtime-logs-connected.png"
          alt="Sidekiq runtime logs showing successful connection to Valkey"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
<blockquote>
<p><strong>Note:</strong> Running a separate worker component means paying for an additional instance. For low-traffic apps, you can start without it and add the worker only when you have actual background jobs that need processing.</p>
</blockquote>
</li>
<li><p><strong>Recreate Your CRON Jobs</strong></p>
<p> DigitalOcean App Platform handles scheduled tasks as Job components, configured the same way as the worker above but with a schedule attached. Follow the official guide here:</p>
<p> 
    <a href="https://docs.digitalocean.com/products/app-platform/how-to/manage-jobs/"
       
       target="_blank" rel="noopener noreferrer"
       class="text-orange-500 hover:text-orange-400">
      https://docs.digitalocean.com/products/app-platform/how-to/manage-jobs/
    </a>
  </p>
</li>
<li><p><strong>Point Your Domain to DigitalOcean</strong></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/262/original-do-custom-domain-dns-setup.png"
          alt="Configuring a custom domain and DNS record in DigitalOcean App Platform"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
<p> Once your app is deployed, you can connect your custom domain.</p>
<p> In App Platform, go to <strong>Settings → Domains</strong> and click <strong>Add domain</strong>.</p>
<p> DigitalOcean will show you the DNS record you need to configure. Add that record at your DNS provider (or inside DigitalOcean DNS if you’re using it).</p>
<p> After DNS propagates, 
    <a href="https://docs.digitalocean.com/support/how-do-i-generate-my-apps-ssl-certificate/"
       
       target="_blank" rel="noopener noreferrer"
       class="text-orange-500 hover:text-orange-400">
      App Platform will automatically provision SSL for your domain
    </a>
  .</p>
<p> If you want the full step-by-step walkthrough, DigitalOcean has an official guide 
    <a href="https://docs.digitalocean.com/products/app-platform/how-to/manage-domains/"
       
       target="_blank" rel="noopener noreferrer"
       class="text-orange-500 hover:text-orange-400">
      here
    </a>
  .</p>
</li>
</ol>

    <h2 id="youre-live" class="scroll-mt-24">You're Live</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/261/original-do-app-platform-live-dashboard.png"
          alt="Rails app successfully deployed and live on DigitalOcean App Platform"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </p>
<p>Once everything is running, confirm traffic is flowing to DigitalOcean and monitor the app for any unexpected issues.</p>
<p>You can run both environments in parallel for a day to be safe. When you&#39;re confident everything is stable, remove the Heroku app.</p>
<p>Heroku isn&#39;t going away tomorrow, but it&#39;s no longer moving forward either. DigitalOcean App Platform gives you the same push-to-deploy simplicity with a platform that&#39;s still actively growing.</p>
<p>
    <a href="https://tidd.ly/4ndcJ1H"
       
       target="_blank" rel="noopener noreferrer"
       class="text-orange-500 hover:text-orange-400">
      Get started on DigitalOcean with $200 credit
    </a>
   today.</p>
<p><a href="https://tidd.ly/4ndcJ1H" target="_blank" rel="noopener noreferrer">
    <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/260/original-do-migration-banner-get-200-credits.png"
          alt="Get $200 in DigitalOcean credits and start migrating from Heroku today"
          class="w-full h-auto object-contain"
        />
      </div>
    </figure>
  </a></p>]]></description>
      </item>
    
      <item>
        <title>Why Smart Builders Don’t Always Want to Build Startups: The Clawdbot Craze</title>
        <link>https://devmystify.com/blog/the-clawdbot-craze</link>
        <pubDate>Wed, 25 Feb 2026 10:43:40 GMT</pubDate>
        <description><![CDATA[<p>Not every great builder wants to build a company.</p>
<p>That may sound obvious. But when you watch something go viral, when the momentum builds and investors start paying attention, there is an invisible force that pulls you toward the default script: raise money, hire a team, scale fast.</p>
<p>Most people follow it without asking if they actually want to.</p>
<p>Peter Steinberger didn&#39;t. And the story of how he built OpenClaw and what he chose to do with it is a good lens for thinking about what it means to build something on your own terms.</p>
<hr>

    <h2 id="what-is-openclaw" class="scroll-mt-24">What is OpenClaw?</h2>
  <p>OpenClaw is a local AI framework. You install it directly on your machine, and if you let it, it has system-level access to do anything on your computer.</p>
<p>By itself, it is just a shell. The creator jokes it is like a &quot;space lobster harness&quot;, nothing happens until you plug in a brain. But once you connect it to a powerful LLM like Claude Opus 4.6 or GPT-5.3 Codex, it becomes something that can genuinely act. Not just answer questions, but do things. That is the official slogan: &quot;the AI that actually does things.&quot;</p>
<p>You can talk to it through WhatsApp, Telegram, or any chat app you already use. It can connect to your browser, translate an audio file you send from your phone, and remind you to buy milk at 2PM. That last feature runs on something called Heartbeat which is basically just a clever cron job but it lets OpenClaw reach out to you, instead of waiting for you to ask.</p>
<p>There is also a <code>soul.md</code> file. That is where you give it a real personality and values. The creator calls it the soul.</p>
<p>But here is the thing about a tool with full system access and a proactive heartbeat: the security concerns are massive. When a bot gets this level of permission, it becomes a real risk. </p>
<p>And the plugins that extend OpenClaw&#39;s power? You can never be totally sure what they contain. To address this, Peter partnered with VirusTotal so that every skill is automatically scanned for bad code. It is not a perfect fix, but it is a serious attempt.</p>
<hr>

    <h2 id="the-naming-drama-and-what-it-reveals" class="scroll-mt-24">The Naming Drama (And What It Reveals)</h2>
  <p>OpenClaw did not start as OpenClaw.</p>
<p>After some early prototype names, Peter landed on &quot;Clawdbot&quot; (spelled with a W), like a lobster claw. He thought it was clever. He owned the domain. It felt right.</p>
<p>Anthropic, the company behind Claude (spelled with a U), did not think so. An employee sent him a friendly but urgent message: change it before the lawyers get involved. There was no lawsuit. But the message was clear.</p>
<p>Under sleep deprivation and stress, he panic-renamed it to MoltBot because he already owned those domains and needed a fast solution. He hated it immediately. His exact words: &quot;the mold&#39;s not growing on me.&quot;</p>
<p>After sleeping on it, he came up with OpenClaw. And just to be safe, he actually called Sam Altman at OpenAI to confirm the name was okay to use before committing to it.</p>
<p>That detail matters. It is not just a funny anecdote. It shows someone who moves fast and figures things out under pressure but also someone who does the unglamorous work of getting it right, even when no one would notice if he skipped it.</p>
<hr>

    <h2 id="the-part-that-surprised-me" class="scroll-mt-24">The Part That Surprised Me</h2>
  <p>When something goes this viral, the expected move is a funding round.</p>
<p>OpenClaw had everything lined up for it. A strong technical foundation. A lot of buzz. A clear use case. The kind of momentum that usually ends in a hiring spree.</p>
<p>But Peter had already run a software company called PSPDFKit for 13 years. He knew what that path looked like, and not just the technical part but the people part. Managing employees, handling conflicts, navigating high-stress customers. That is what burned him out. And he is already financially comfortable, so making more money is not his main goal.</p>
<p>He also saw a conflict of interest. If OpenClaw became a SaaS startup, every cool community-built feature would become a temptation to lock behind an enterprise paywall. He did not want that pressure shaping his decisions. He believes OpenClaw should stay free.</p>
<p>So instead of starting another company, he joined OpenAI.</p>
<p>His reasoning was direct: &quot;What I want is to change the world, not build a large company, and teaming up with OpenAI is the fastest way to bring this to everyone.&quot; OpenAI gave him access to their latest tools and massive computing power. Sam Altman announced that Peter would &quot;drive the next generation of personal agents&quot; at OpenAI.</p>
<p>His one condition: OpenClaw stays open-source forever, similar to how Google treats Chrome. OpenAI agreed. The project will live on in a foundation.</p>
<hr>

    <h2 id="why-this-is-worth-thinking-about" class="scroll-mt-24">Why This Is Worth Thinking About</h2>
  <p>I will be honest: when I first read this, it felt strange.</p>
<p>If you build something valuable, aren&#39;t you supposed to scale it?</p>
<p>But the more I sat with it, the more I understood.</p>
<p>There is a shift that happens when something you built starts to grow. In the beginning, it is just you and the work, like writing code, shipping fast, and making decisions directly. It feels creative. It feels like building.</p>
<p>Then, if it works, things change. You hire. You manage. You sit in more meetings than you expected. Eventually, you are not building the thing anymore. You are running the thing.</p>
<p>Some people love that transition. Others realize they actually just want to keep building. That is a hard thing to admit in a culture that treats scale as the only real measure of success.</p>
<p>I have moved between freelancing, leading teams, running parts of companies, and building again. When I was in a Director of Engineering role, my days looked very different from when I was freelancing or writing books. Not worse just different. More coordination, more responsibility, less time in the codebase.</p>
<p>When I look at someone who ran a company for 13 years and chose not to spin up another one, I do not see a missed opportunity. I see clarity.</p>
<hr>

    <h2 id="growth-is-not-always-the-goal" class="scroll-mt-24">Growth Is Not Always the Goal</h2>
  <p>There is a quiet assumption in tech that if something works, you should maximize it. Staying small is often framed as lacking ambition.</p>
<p>But sometimes staying intentionally small is a strategic choice.</p>
<p>Growth changes the nature of the work. Once you raise money, you are no longer optimizing for what you find interesting. You are optimizing for revenue, retention, and returns. </p>
<p>That is not evil, that’s just how it works. The question is whether that is the deal you want.</p>
<p>The AI shift makes this question more interesting than it used to be. One developer with the right tools can now do what used to require a small team. If you can build meaningful things without hiring aggressively, you do not automatically need to scale headcount to scale your output.</p>
<p>Personally, I do not want a 50-person team and layers of management. I want something tight. Solid. Work that still feels like building. A small group of smart people who can achieve almost anything.</p>
<p>That does not mean avoiding impact, it just means choosing the shape of the impact.</p>
<hr>

    <h2 id="what-openclaw-actually-teaches-us" class="scroll-mt-24">What OpenClaw Actually Teaches Us</h2>
  <p>OpenClaw could have become a startup. Maybe a unicorn. Maybe it will still evolve in ways none of us expect, but what stood out to me was not the technology. It was the restraint.</p>
<p>Instead of following the predictable path, Peter asked a different question: what kind of work do I actually want to be doing?</p>
<p>That is the question most builders skip. Momentum is powerful, traction is addictive, and it’s easy to drift into growth because it feels like the responsible next step.</p>
<p>But that changes the job:</p>
<ul>
<li>You go from building to managing.</li>
<li>From designing systems to designing org charts.</li>
<li>From solving problems to absorbing them.</li>
</ul>
<p>Some people want that. They thrive on it.</p>
<p>I don’t.</p>
<p>I don’t want a giant company. I don’t want layers of management and constant operational weight. I want something tight. Small. A strong group of smart people building fun things deliberately.</p>
<p>That is not playing small. It is choosing the shape of the work.</p>
<p>OpenClaw is interesting because its creator made that choice consciously. He didn’t drift into scale. He decided what kind of work he wanted to keep doing.</p>
<p>Most builders never stop to ask that question, they just follow the script.</p>]]></description>
      </item>
    
  </channel>
</rss>