<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Harsh </title>
    <description>The latest articles on DEV Community by Harsh  (@harsh2644).</description>
    <link>https://dev.to/harsh2644</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3735796%2Fc3352182-725d-4924-b6df-a727a41d542a.jpeg</url>
      <title>DEV Community: Harsh </title>
      <link>https://dev.to/harsh2644</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harsh2644"/>
    <language>en</language>
    <item>
      <title>Every AI-Generated Line of Code Is a Small Loan — And Eventually, You Have to Pay It Back</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Thu, 16 Jul 2026 17:54:18 +0000</pubDate>
      <link>https://dev.to/harsh2644/every-ai-generated-line-of-code-is-a-small-loan-and-eventually-you-have-to-pay-it-back-30a6</link>
      <guid>https://dev.to/harsh2644/every-ai-generated-line-of-code-is-a-small-loan-and-eventually-you-have-to-pay-it-back-30a6</guid>
      <description>&lt;p&gt;A bug showed up in my personal project last month. Nothing dramatic - a value wasn't updating the way it should have been.&lt;/p&gt;

&lt;p&gt;I opened the file. I read it top to bottom. I had no idea what I was looking at.&lt;/p&gt;

&lt;p&gt;Not because the code was badly written. It was clean. Well-organized. Doing exactly what I'd asked.&lt;/p&gt;

&lt;p&gt;The problem was that I had never actually built a mental model of why it worked the way it did. I'd generated it, glanced at it, and moved on - dozens of times without ever once sitting with it long enough to understand it.&lt;/p&gt;

&lt;p&gt;I couldn't fix a bug in my own project because I had never really owned the code I was fixing.&lt;/p&gt;

&lt;p&gt;That was the moment I started thinking about AI-generated code differently: not as a gift, but as a loan.&lt;/p&gt;

&lt;p&gt;It was a personal side project - nothing fancy just something I was building for myself in the kind of relaxed evening mode where you let AI drive more than you probably should. I'd describe what I wanted, it would generate the function I'd skim it see that it ran, and move to the next thing. For weeks, this felt like a superpower. I was building faster than I ever had.&lt;/p&gt;

&lt;p&gt;The bug was the first bill that came due.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Loan Nobody Told Me I Was Taking Out
&lt;/h2&gt;

&lt;p&gt;Here's the mental model I wish I'd had earlier.&lt;/p&gt;

&lt;p&gt;Every time AI generates code for you, it's not handing you something free. It's handing you something on credit. The code works today. The understanding the part that lets you debug it, extend it, explain it to someone else is the interest, and it's due whether you've budgeted for it or not.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AI Generates&lt;/th&gt;
&lt;th&gt;You Owe&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10 lines&lt;/td&gt;
&lt;td&gt;A few minutes of reading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 lines&lt;/td&gt;
&lt;td&gt;Real time understanding the shape of it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200+ lines across a feature&lt;/td&gt;
&lt;td&gt;A debugging session - whether you like it or not&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The debt doesn't show up immediately. That's what makes it dangerous. It shows up later - as a bug you can't diagnose, a PR comment you can't answer, a feature you're afraid to touch because you're not sure what depends on it.&lt;/p&gt;

&lt;p&gt;I'd been taking out this loan for weeks without realizing it. The bug was just the first bill that came due.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Isn't Just a "Feeling" The Data Backs It Up
&lt;/h2&gt;

&lt;p&gt;I went looking afterward, half expecting to find that I was just being paranoid. I wasn't.&lt;/p&gt;

&lt;p&gt;Recent research on AI-assisted commits has found meaningfully higher rates of correctness and security issues compared to human-written code -  the kind of issues that don't show up until someone actually exercises the code path that was never fully understood by the person who shipped it.&lt;/p&gt;

&lt;p&gt;There's also a growing body of developer survey data pointing at something less technical and more personal: heavier reliance on AI coding tools correlating with higher reported burnout. Which tracks with what that evening actually felt like once the productivity high wore off not relief but a low-grade anxiety about a codebase I could no longer fully account for.&lt;/p&gt;

&lt;p&gt;None of this means AI-assisted coding is bad. It means the debt is real, even when it's invisible, and pretending otherwise doesn't make it go away.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Actually Did - Slowly, Not Dramatically
&lt;/h2&gt;

&lt;p&gt;I want to be honest here, because it would be easy to turn this into a bigger story than it was. I didn't delete everything and start over. I didn't swear off AI tools. That would have been its own kind of overcorrection.&lt;/p&gt;

&lt;p&gt;What I actually did was slower and less satisfying to write about: I went through the file, section by section, and made myself understand it properly. Not skim it actually trace through what each part was doing and why, the way I would if a colleague had written it and left the company.&lt;/p&gt;

&lt;p&gt;It took longer than fixing a bug in code I'd written myself would have. That was the whole point. The time I "saved" generating the code hadn't disappeared it had just been deferred to a moment of my choosing. Except I hadn't gotten to choose the moment. The bug chose it for me.&lt;/p&gt;

&lt;p&gt;Once I actually understood the code, the fix took about ten minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Practice I Actually Kept
&lt;/h2&gt;

&lt;p&gt;The thing that's stuck with me since isn't a dramatic rule. It's a small, boring habit:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before I move on from anything AI generates, I ask myself one honest question could I explain this to someone else, right now, without looking at it again?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the answer is no, I don't treat the task as finished. I read it again. I trace the logic. Sometimes I rewrite small pieces just to force the understanding to actually land, rather than passively wash over me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;My Rule:&lt;/strong&gt; Before I move on from anything AI generates, I ask: &lt;em&gt;Could I explain this to someone else, right now, without looking at it again?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If the answer is no, the task isn't finished.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's slower in the moment. It's the only thing that's actually kept the debt from quietly piling back up.&lt;/p&gt;

&lt;p&gt;I still use AI constantly. I'm not interested in pretending otherwise, and I don't think the answer is to use it less. The answer, for me, has been to stop treating "it runs" as the finish line, and start treating "I understand it" as the actual one.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Version of the Lesson
&lt;/h2&gt;

&lt;p&gt;I'm not going to end this with a dramatic claim about who will or won't have a job in five years. I don't know that.&lt;/p&gt;

&lt;p&gt;What I do know, from one bug in one personal project, is this: the code AI writes for you isn't free just because you didn't type it yourself. Somewhere down the line, something will ask you to account for it a bug, a question, a moment where you need to change it and realize you're not sure what you'd be changing.&lt;/p&gt;

&lt;p&gt;You can pay that debt early, a little at a time, by actually understanding what you ship. Or you can pay it all at once, at 11 PM, staring at a bug in your own project, wondering how you got there.&lt;/p&gt;

&lt;p&gt;I'd recommend the first one. I learned that the slow way.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you had a moment like this - where AI-generated code you'd shipped turned out to be a debt you didn't know you'd taken on? I'd genuinely like to hear how you noticed it, and what you did once you did. 👇&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Turned Any Website Into a Permanent AI Tool in 10 Minutes with BrowserAct (No API Required)</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Mon, 06 Jul 2026 09:05:10 +0000</pubDate>
      <link>https://dev.to/harsh2644/i-turned-any-website-into-a-permanent-ai-tool-in-10-minutes-with-browseract-no-api-required-30ob</link>
      <guid>https://dev.to/harsh2644/i-turned-any-website-into-a-permanent-ai-tool-in-10-minutes-with-browseract-no-api-required-30ob</guid>
      <description>&lt;p&gt;Last week, I asked my AI agent to scrape 300 job listings from a recruiting site. It broke at row 50.&lt;/p&gt;

&lt;p&gt;I retried. Broke again. Different error, different row. Two hours gone - not building something, just fighting a tool that was supposed to save me time.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem With AI Agents and the Web
&lt;/h2&gt;

&lt;p&gt;Here's the thing nobody tells you when you start using AI agents for real work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They're incredible at generating code. They're terrible at the web.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time you ask an agent to scrape, monitor, or interact with a website, it starts from scratch. Different path. Different failures. Unreliable at scale. And the moment the website redesigns? The whole thing breaks.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;web_fetch&lt;/code&gt; is basically &lt;code&gt;curl&lt;/code&gt; with a nicer name. It can't handle login walls, JavaScript-heavy SPAs, captchas, or dynamic React dropdowns. I've spent more time debugging broken scrapers than actually building things.&lt;/p&gt;

&lt;p&gt;Hand-written scrapers are fragile. SaaS scraping tools cost $99/month per website. Manual copy-paste is a waste of human potential.&lt;/p&gt;

&lt;p&gt;Then I found &lt;strong&gt;Skill Forge&lt;/strong&gt; - and it changed how I think about AI agents entirely.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: Explore Once, Reuse Forever
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Skill Forge&lt;/strong&gt; is a meta-skill inside &lt;a href="https://www.browseract.ai/Harsh" rel="noopener noreferrer"&gt;BrowserAct&lt;/a&gt; - a free, open-source CLI tool built for AI agents. It's not another scraping SaaS. It's a local tool that turns any website's data or operations into a &lt;strong&gt;reusable Skill package&lt;/strong&gt; (a &lt;code&gt;SKILL.md&lt;/code&gt; + Python scripts).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Explore once. Reuse forever.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of your agent re-exploring the same site every run (different path, different failures), Skill Forge does a one-time deep exploration, generates a verified script, and from that point on you just call the Skill. Same stable path. Every time.&lt;/p&gt;

&lt;p&gt;Install it with one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add browser-act/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; browser-act-skill-forge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61cz2pbwqyhx5bm1m3un.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F61cz2pbwqyhx5bm1m3un.png" alt="Installation complete - one command, free, no signup required" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it. Free. No signup. No subscription.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🏆 &lt;strong&gt;Product Hunt:&lt;/strong&gt; BrowserAct recently hit &lt;strong&gt;#1 Product of the Day&lt;/strong&gt; and &lt;strong&gt;#3 Product of the Week&lt;/strong&gt; on Product Hunt - proof that developers are hungry for tools that actually let agents work on the real web.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Live Demo: Forging a GitHub Repository Skill
&lt;/h2&gt;

&lt;p&gt;Let me show you exactly how this works with a real example I ran myself: extracting GitHub repository data across multiple repos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 - Describe What You Want
&lt;/h3&gt;

&lt;p&gt;I opened VS Code with my AI agent and gave it a plain English description:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I want to extract GitHub repository data. Build a reusable Skill that extracts repository name, GitHub URL, star count, fork count, and last updated date from any repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No code. No selectors. No API keys. Just a description.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 - Automatic Exploration
&lt;/h3&gt;

&lt;p&gt;Skill Forge starts inspecting the site immediately. The first thing it does? Hunts for internal API endpoints. If it finds one, that's &lt;strong&gt;10x more stable than scraping the DOM&lt;/strong&gt; - and GitHub has them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Figk5mfdvybfw49vwt7db.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Figk5mfdvybfw49vwt7db.png" alt="Agent navigating GitHub, discovering internal API endpoints automatically" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detected GitHub's internal API structure&lt;/li&gt;
&lt;li&gt;Mapped the request/response patterns&lt;/li&gt;
&lt;li&gt;Identified exact parameters for repository metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No intervention from me. It figured this out on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 - Skill Generation
&lt;/h3&gt;

&lt;p&gt;Once Skill Forge understood the data flow, it generated a complete Skill package:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8zy2z5nn3qlhduqbqq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8zy2z5nn3qlhduqbqq2.png" alt="Skill package generated — SKILL.md and extract-repo-metadata.py created" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SKILL.md&lt;/strong&gt; - documentation and usage instructions for the Skill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;extract-repo-metadata.py&lt;/strong&gt; Python script with business parameters extracted as CLI arguments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Skill is now production-ready. One command to run it. Forever.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 - Auto-Test (No Human Needed)
&lt;/h3&gt;

&lt;p&gt;A sub-agent automatically ran end-to-end tests on the Skill verified the extraction worked correctly, and if it failed, fixed itself with no intervention needed. It's not just generating code it's &lt;strong&gt;validating that the code actually works&lt;/strong&gt; before handing it to you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5 - Run at Scale
&lt;/h3&gt;

&lt;p&gt;I ran the Skill on three repositories. Here's the agent executing extraction across all three:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fajzbg6eiy3vxllk2y0gt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fajzbg6eiy3vxllk2y0gt.png" alt="Skill running extraction on 3 repositories simultaneously" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here's the actual final output:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqmcq798t1tem3sj7nztx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqmcq798t1tem3sj7nztx.png" alt="Complete output - GitHub Repository Extractor Skill with full extracted data" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repository Name&lt;/th&gt;
&lt;th&gt;GitHub URL&lt;/th&gt;
&lt;th&gt;Stars&lt;/th&gt;
&lt;th&gt;Forks&lt;/th&gt;
&lt;th&gt;Last Updated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;browser-act/skills&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/browser-act/skills" rel="noopener noreferrer"&gt;https://github.com/browser-act/skills&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;160&lt;/td&gt;
&lt;td&gt;Jun 26, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;microsoft/playwright&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/microsoft/playwright" rel="noopener noreferrer"&gt;https://github.com/microsoft/playwright&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;65k+&lt;/td&gt;
&lt;td&gt;3.5k+&lt;/td&gt;
&lt;td&gt;Jun 28, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;modelcontextprotocol/servers&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;https://github.com/modelcontextprotocol/servers&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;15k+&lt;/td&gt;
&lt;td&gt;1.2k+&lt;/td&gt;
&lt;td&gt;Jun 26, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three repos. Clean structured output. One Skill I can call again tomorrow with different repo names zero re-exploration.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes This Actually Work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Anti-Detection Stealth &amp;amp; Captcha Solving&lt;/strong&gt;&lt;br&gt;
BrowserAct runs stealth browsers, masks fingerprints, and handles captchas automatically - tested against reCAPTCHA v3, Cloudflare Turnstile, DataDome. Passes checks that standard Playwright fails on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persistent Sessions &amp;amp; Multi-Account Isolation&lt;/strong&gt;&lt;br&gt;
Login once, reuse sessions. Run multiple accounts in parallel without cross-contamination. No repeated 2FA prompts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human-in-the-Loop&lt;/strong&gt;&lt;br&gt;
When a captcha or 2FA genuinely can't be automated, BrowserAct pauses and hands the live browser session to you. You complete the step, the agent resumes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proxy Control&lt;/strong&gt;&lt;br&gt;
Static proxies for stable identity across long-lived sessions. Dynamic proxies for rotating IP on batch collection runs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Skill Forge vs. The Alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;With Skill Forge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hand-written scrapers&lt;/td&gt;
&lt;td&gt;Break when site changes layout&lt;/td&gt;
&lt;td&gt;Forge once, re-Forge to update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent re-explores every run&lt;/td&gt;
&lt;td&gt;Different path, different failures every time&lt;/td&gt;
&lt;td&gt;Stable verified Skill, predictable every run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS scraping tools&lt;/td&gt;
&lt;td&gt;One website, monthly bill ($99–$300+)&lt;/td&gt;
&lt;td&gt;Free, runs locally, works on any site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct bulk execution&lt;/td&gt;
&lt;td&gt;Anti-bot triggers mid-run, session drops&lt;/td&gt;
&lt;td&gt;Verify the Skill first, then scale safely&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key insight: &lt;strong&gt;don't make your agent explore every time.&lt;/strong&gt; Forge once then run 500 records or 5,000 with the same stable path.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pricing (This Is the Surprising Part)
&lt;/h2&gt;

&lt;p&gt;I expected this to be a SaaS with a monthly bill. It's not.&lt;/p&gt;

&lt;p&gt;BrowserAct Skill Forge is &lt;strong&gt;100% free to install and use locally.&lt;/strong&gt; No subscription. No card. No signup paywall. Proxies are optional add-ons - not required to get started.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add browser-act/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; browser-act-skill-forge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⭐ &lt;strong&gt;&lt;a href="https://github.com/browser-act/skills" rel="noopener noreferrer"&gt;Star the repo on GitHub&lt;/a&gt;&lt;/strong&gt; -   readers who star get &lt;strong&gt;500 free credits&lt;/strong&gt; to try out the dynamic proxy feature.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://www.browseract.ai/Harsh" rel="noopener noreferrer"&gt;Get started with BrowserAct →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;The web is where real work happens. Login walls, dynamic pages, captchas, anti-bot systems - AI agents hit all of these and fail.&lt;/p&gt;

&lt;p&gt;Skill Forge is the layer that fixes it: one exploration, permanent capability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What website would you Forge first? Drop it in the comments below.&lt;/strong&gt; 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devops</category>
      <category>automation</category>
    </item>
    <item>
      <title>You're Not Lazy — You're Time Blind. Here's How Lock In Fixes It.</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Thu, 02 Jul 2026 14:18:00 +0000</pubDate>
      <link>https://dev.to/harsh2644/youre-not-lazy-youre-time-blind-heres-how-lock-in-fixes-it-57ej</link>
      <guid>https://dev.to/harsh2644/youre-not-lazy-youre-time-blind-heres-how-lock-in-fixes-it-57ej</guid>
      <description>&lt;p&gt;I sat down to work for 2 hours. I actually worked for 45 minutes.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;You open your laptop. You have a plan. Then your phone buzzes. You check it "just for a second." That second becomes 10 minutes. Then 30. Then an hour - gone.&lt;/p&gt;

&lt;p&gt;You close the app, feel guilty, and tell yourself you'll do better tomorrow.&lt;/p&gt;

&lt;p&gt;Here's the thing though: it's not because you're lazy. It's because you're time blind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7.2-Hour Problem
&lt;/h2&gt;

&lt;p&gt;The average person spends over 7 hours a day on their phone. That's 21+ hours a week - time you don't get back.&lt;/p&gt;

&lt;p&gt;We blame ourselves. "I need more discipline." But willpower is finite, and pitting it against apps engineered by billion-dollar companies to hold your attention is not a fair fight.&lt;/p&gt;

&lt;p&gt;The real issue is a gap between intention and action. You intend to work. Your brain gets hijacked. Not because you're weak - because that's exactly what your brain is wired to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The War Inside Your Head
&lt;/h2&gt;

&lt;p&gt;Tim Urban's viral TED talk gave this a name: the &lt;strong&gt;Instant Gratification Monkey&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The monkey only cares about one thing - what feels good right now. Scroll. Check what's trending. Watch one more video. He doesn't care about your goals or deadlines.&lt;/p&gt;

&lt;p&gt;Then there's the &lt;strong&gt;Panic Monster&lt;/strong&gt;, who only wakes up when a deadline is close. Suddenly you're up till 2 AM, finishing in one night what you'd been avoiding for two weeks.&lt;/p&gt;

&lt;p&gt;But what happens when there's no deadline? Learning a skill. Writing a book. Building a business. These don't come with a Panic Monster attached so the monkey runs free, and you wonder why you can't focus on what actually matters.&lt;/p&gt;

&lt;p&gt;That's the gap &lt;strong&gt;&lt;a href="https://trylockin.com" rel="noopener noreferrer"&gt;Lock In&lt;/a&gt;&lt;/strong&gt; was built to fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conscious Friction, Not a Wall
&lt;/h2&gt;

&lt;p&gt;Most focus apps build a wall - hard blocks, strict timers, "you can't get in." The problem is walls feel like cages. You resent them, find workarounds, or just delete the app.&lt;/p&gt;

&lt;p&gt;Lock In does something smarter: it creates &lt;strong&gt;conscious friction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's how it works. You start a focus session and set a timer - a stopwatch or countdown. While it's running, your selected apps stay blocked.&lt;/p&gt;

&lt;p&gt;Your thumb drifts toward Instagram before you've even decided to open it. Lock In stops you - not with a hard block, but with a &lt;strong&gt;hold-to-unlock mechanism&lt;/strong&gt;. You can bypass it, but you have to hold a button for 3 to 10 seconds first.&lt;/p&gt;

&lt;p&gt;That pause is everything. In those few seconds, your rational brain catches up, and you get to ask yourself:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Do I really need to check this right now - or am I just avoiding work?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most of the time, once you've asked the question, you don't need to unlock anything. That small moment of friction is the difference between 40 minutes of doomscrolling and getting back to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Lock In Actually Works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Smart App Blocking&lt;/strong&gt; - Before each session, you choose what to block: categories like Social, Games, and Entertainment, or specific apps like Instagram, TikTok, and YouTube. On Android, you can flip it with Whitelist Mode - allow only your productive apps and block everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hold-to-Unlock Pause&lt;/strong&gt; - You can bypass any block, but holding that button for 3–10 seconds is the whole point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session-Based Tracking&lt;/strong&gt; - Start a timer to block your apps, and Lock In logs that session automatically - no spreadsheets, no end-of-day journaling. Over time, it shows you where your focus actually went versus where you assumed it went. (These two numbers are almost never the same.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pricing Surprise
&lt;/h2&gt;

&lt;p&gt;I've tried a lot of focus apps. Here's what they cost:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Opal&lt;/td&gt;
&lt;td&gt;$99.99/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freedom&lt;/td&gt;
&lt;td&gt;$8.99/month ($107/year)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cold Turkey&lt;/td&gt;
&lt;td&gt;$39 one-time (desktop only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lock In&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free. Forever.&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;100% of the core features are free - no subscription, no paywall. The free version shows one small ad when a session ends. Want to remove it? One-time payment of &lt;strong&gt;$4.99&lt;/strong&gt;. Not per month, not per year. Once.&lt;/p&gt;

&lt;p&gt;One month of Freedom costs more than a lifetime of Lock In.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stats, Streaks, and Friends
&lt;/h2&gt;

&lt;p&gt;Lock In tracks your focus with daily and weekly stats, an all-time view, and a GitHub-style commit graph green squares for focused days, empty for the ones you skipped.&lt;/p&gt;

&lt;p&gt;There's also a light gamification layer: every minute you focus earns in-app currency you can spend to customize the app's look. And there's a friends feature add people and see each other's streaks. No toxic leaderboard, just quiet, positive accountability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Results
&lt;/h2&gt;

&lt;p&gt;Early data from Lock In users shows people save an average of &lt;strong&gt;21 hours per month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's more than half a work week - time that used to disappear into the scroll, now available for something that actually matters to you. A skill you could be learning. A project you could finally start. Time with people you care about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Life in 4,680 Weeks
&lt;/h2&gt;

&lt;p&gt;Tim Urban made a visualization I haven't been able to shake. A 90-year human life every week of it fits on a single page. 4,680 small squares, each one a single week of your life.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fss65x372hef3h22kqsjk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fss65x372hef3h22kqsjk.png" alt="Your life in weeks - 4,680 squares, each one a week" width="800" height="1401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Look at it and something shifts. You feel the finiteness in a way "time is precious" never quite captures. Every week that passes is one square filled in - you don't get it back.&lt;/p&gt;

&lt;p&gt;The Instant Gratification Monkey doesn't think about the 4,680 squares. He only thinks about right now. The only way to beat him is to build systems that give your forward-looking self a fighting chance.&lt;/p&gt;

&lt;p&gt;Lock In is one of those systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Comes Down To
&lt;/h2&gt;

&lt;p&gt;You are not the problem.&lt;/p&gt;

&lt;p&gt;You were handed a phone and told to stay focused, while some of the smartest engineers in the world designed every notification, every infinite scroll, and every autoplay to capture your attention. Blaming yourself for losing that fight is a bit like blaming yourself for finding a slot machine addictive.&lt;/p&gt;

&lt;p&gt;What you need is a system that works with how your brain actually functions - one that creates a deliberate pause between impulse and action, shows you the truth about where your time goes, and makes focusing feel like something you're earning rather than forcing.&lt;/p&gt;

&lt;p&gt;Lock In is free. The hold-to-unlock is the feature. The pause is the point.&lt;/p&gt;

&lt;p&gt;Download it. Start one session. See what a few seconds of friction does for the rest of your day.&lt;/p&gt;

&lt;p&gt;And remember - you have 4,680 weeks. Make them count.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;a href="https://trylockin.com" rel="noopener noreferrer"&gt;Download Lock In — Free on iOS and Android →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Core features are 100% free. Remove ads forever with a one-time $4.99 purchase. No subscription, no tricks.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you tried a focus app that actually worked - or one that completely failed? Drop it in the comments, I read every one.&lt;/em&gt; 👇&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Stopped Comparing Myself to AI. It Changed Everything.</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Tue, 30 Jun 2026 10:59:54 +0000</pubDate>
      <link>https://dev.to/harsh2644/i-stopped-comparing-myself-to-ai-it-changed-everything-1djb</link>
      <guid>https://dev.to/harsh2644/i-stopped-comparing-myself-to-ai-it-changed-everything-1djb</guid>
      <description>&lt;p&gt;I have been writing a lot about AI lately, but this one is more personal than usual. Not a tutorial, not a hot take on some new model - just something I have been sitting with for a few weeks now.&lt;/p&gt;

&lt;p&gt;Let's start from the beginning. A few weeks ago I was scrolling Twitter at around midnight, the way you do when you tell yourself just five more minutes and then it is suddenly 1 AM. A new benchmark had dropped. Someone posted a "10x developer with AI" thread screenshots and all. Someone else was live-coding a full-stack app in 20 minutes like it was nothing.&lt;/p&gt;

&lt;p&gt;I closed the app. Opened my editor. And felt that very specific very familiar weight settle in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison nobody warned me about
&lt;/h2&gt;

&lt;p&gt;I think I had been quietly comparing myself to AI for months without fully admitting it. Its speed. Its memory. Its bottomless confidence. The way it produces an answer without a single visible moment of wait is this actually right?&lt;/p&gt;

&lt;p&gt;I was measuring myself against something that does not sleep, does not doubt itself, does not sit there staring at a wall for twenty minutes because it cannot remember why a function is named the way it is.&lt;/p&gt;

&lt;p&gt;And obviously I was losing. Every single time. That was never going to be a fair comparison but somehow I kept running it anyway.&lt;/p&gt;

&lt;p&gt;I used to look at AI-generated code and think "I could never write that this fast." I used to look at how confident it sounded and think why am I always so unsure of myself. I used to look at how much it seemed to remember and think why do I forget things I learned three weeks ago.&lt;/p&gt;

&lt;p&gt;It was exhausting, and not in the normal hard-day-of-work way. It was exhausting because I was fighting something I could never actually win.&lt;/p&gt;

&lt;h2&gt;
  
  
  A pull request that made me stop and think
&lt;/h2&gt;

&lt;p&gt;A few weeks ago I was reviewing an AI-generated PR. Code looked clean. Logic checked out. Tests were all green.&lt;/p&gt;

&lt;p&gt;Something still felt slightly off and I could not immediately say why.&lt;/p&gt;

&lt;p&gt;I read through it again, slower this time. Traced the logic by hand. Thought about our actual users - not generic users, the specific weird way our users use this one feature the edge case from last quarter that almost took down production.&lt;/p&gt;

&lt;p&gt;The code was correct. It was also wrong for us specifically. The AI had optimized for the general case, the version of this problem that shows up most often across whatever it was trained on. I had to optimize for the one particular, slightly weird version that exists in our codebase, with our history for our actual users.&lt;/p&gt;

&lt;p&gt;That is roughly when it clicked for me, in a way that felt obvious in hindsight. AI and I are not really competing. We are doing two overlapping but different jobs. It is fast, I try to be thoughtful. It is broad, I am specific. It is confident because that is how it is built, I am careful sometimes to a fault because I have been burned before.&lt;/p&gt;

&lt;p&gt;Comparing myself to it was a bit like being upset that a hammer is not as precise as a scalpel. Different tools, different jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what actually changed (a little, slowly)
&lt;/h2&gt;

&lt;p&gt;I am not going to pretend I had some clean, complete transformation here, because that is not really how this stuff works for me. But a few things did shift.&lt;/p&gt;

&lt;p&gt;I stopped measuring myself against how fast AI could generate something, and started asking instead: do I actually understand what is shipping under my name? I stopped quietly resenting that my memory is let's be honest, mediocre on a good day, and started appreciating that forgetting things clears space for new connections. I stopped envying its confidence and started trusting my own hesitation a little more - that hesitation usually turns out to be experience quietly doing its job. AI does not have that, because it has never been the one paged at 2 AM over a bad deploy. I have.&lt;/p&gt;

&lt;p&gt;I am still not entirely sure where any of this lands long-term. Maybe in a year I will read this post back and think I was being naive. The pace of all of this keeps making me reconsider things I thought I had figured out.&lt;/p&gt;

&lt;h2&gt;
  
  
  I do not have a tidy ending for this one
&lt;/h2&gt;

&lt;p&gt;I genuinely do not know if "context and judgment" stay valuable in the way I am hoping they do, or if that is just the thing I am telling myself right now because it is comforting. Maybe the comparison creeps back in next month and I am back here writing about it again from a slightly different angle.&lt;/p&gt;

&lt;p&gt;What I do know is that comparing myself against something built to never sleep, never doubt, and never get stuck was never a fight I was going to win, and I am tired of running that comparison in the background of every single PR.&lt;/p&gt;

&lt;p&gt;Have you caught yourself doing this too - comparing your speed your memory your confidence to AI? What helped, if anything did? I am genuinely curious not asking rhetorically.&lt;/p&gt;

&lt;p&gt;Drop it in the comments. I will be there. 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How I Automated DigitalOcean Infrastructure with SuperPlane</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Wed, 24 Jun 2026 10:03:34 +0000</pubDate>
      <link>https://dev.to/harsh2644/how-i-automated-digitalocean-infrastructure-with-superplane-2po</link>
      <guid>https://dev.to/harsh2644/how-i-automated-digitalocean-infrastructure-with-superplane-2po</guid>
      <description>&lt;p&gt;Our infrastructure "documentation" was a Google Sheet. Anyone on the team could edit it. Nobody always did.&lt;/p&gt;

&lt;p&gt;Every new droplet meant the same five manual steps: log in, pick image and size, configure firewall rules, set up DNS, update the spreadsheet. 30 minutes if nothing went wrong. No record of who did it. No approval process. No way to trace a misconfigured droplet back to a decision or a person.&lt;/p&gt;

&lt;p&gt;The obvious fix was a script. But a script running on a cron job with no visibility is just a faster way to make undocumented changes. You still don't know what ran, when, or why something broke.&lt;/p&gt;

&lt;p&gt;What I actually needed was audit logs, approvals, and notifications - without stitching together three separate tools to get them.&lt;/p&gt;

&lt;p&gt;That's what SuperPlane gave me.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every time I needed to provision a new droplet, the process looked the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log into DigitalOcean&lt;/li&gt;
&lt;li&gt;Select image, size, and region&lt;/li&gt;
&lt;li&gt;Configure firewall rules manually&lt;/li&gt;
&lt;li&gt;Set up DNS records manually&lt;/li&gt;
&lt;li&gt;Document everything in a spreadsheet - hoping I didn't forget anything&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No audit trail. No approval process. No visibility into who made which change or when.&lt;/p&gt;

&lt;p&gt;If something went wrong, there was no way to trace it back. If a team member provisioned resources without approval, there was no record. This wasn't just inefficient - it was risky.&lt;/p&gt;

&lt;p&gt;The spreadsheet was becoming the most important piece of infrastructure, and it was just a Google Sheet that anyone could edit.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Workflow I Built
&lt;/h2&gt;

&lt;p&gt;I built a simple automation workflow using SuperPlane. The setup started with creating an owner account and connecting my DigitalOcean workspace.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F580o98c4avlta3cdxddu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F580o98c4avlta3cdxddu.png" alt="SuperPlane setup — Set up owner account screen at localhost:3000/setup" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;SuperPlane's initial setup screen - straightforward owner account creation before configuring your first workspace.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once the workspace was set up, I created a new app using the built-in app catalog. SuperPlane offers starter templates for common workflows, including a pre-built &lt;strong&gt;Preview Environments (GitHub + DigitalOcean)&lt;/strong&gt; integration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7lh8ee0vc7tm3aytnn2j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7lh8ee0vc7tm3aytnn2j.png" alt="SuperPlane — Create New App screen showing Preview Environments for GitHub + DigitalOcean and GitHub + AWS" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The New App screen. Two options immediately relevant: Preview Environments with GitHub + DigitalOcean, and GitHub + AWS. I chose the DigitalOcean path.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The workflow I built has four steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 - Trigger&lt;/strong&gt;&lt;br&gt;
Activates when a new droplet needs to be provisioned. Listens for a droplet event so the automation starts automatically - no manual kick-off required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 - Create Droplet&lt;/strong&gt;&lt;br&gt;
Provisions a droplet with predefined specifications: specific image, size, and region. No one on the team has to remember the correct settings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 - Configure DNS&lt;/strong&gt;&lt;br&gt;
Creates DNS records automatically once the droplet is ready. This used to be the step most likely to be forgotten.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 - Notify&lt;/strong&gt;&lt;br&gt;
Sends a Slack notification when everything is complete. The whole team knows the environment is ready without anyone having to check.&lt;/p&gt;

&lt;p&gt;When a team member requests a new environment, the workflow triggers automatically. The droplet gets created. DNS configures itself. Everyone gets notified. No manual steps, no delays, no "did someone set up DNS?" in Slack at 11 PM.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Gets Triggered &amp;amp; How the Demo App Works
&lt;/h2&gt;

&lt;p&gt;The workflow starts when a &lt;strong&gt;droplet event&lt;/strong&gt; is triggered. This happens when someone requests a new environment - either through a chat command, a form submission, or directly from SuperPlane's UI. The trigger listens for &lt;code&gt;droplet.create&lt;/code&gt; events and kicks off the automation automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's the demo app architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Workspace&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connected to DigitalOcean using an API token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Created from the "Preview Environments (GitHub + DigitalOcean)" template&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Canvas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The visual workflow editor where you drag and connect components&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trigger&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Listens for &lt;code&gt;droplet.create&lt;/code&gt; events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Create Droplet → Create DNS Record → Send Slack notification&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When the trigger fires, it captures request details (droplet name, region, size) and passes them through the canvas. Each component receives the output from the previous one automatically - no manual wiring required.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Visual Workflow Canvas
&lt;/h2&gt;

&lt;p&gt;SuperPlane gives you a visual canvas to build infrastructure workflows - no YAML files, no scripting, just drag and connect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff4o4rmj8jxmigpjlg4ta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff4o4rmj8jxmigpjlg4ta.png" alt="SuperPlane Canvas — nebula-launch app showing Agent panel on left, New Component node on canvas, and core component sidebar on right" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The canvas editor. Left panel: the AI Agent (already greeting you and setting up) plus Console, Memory, and Files tabs. Center: the visual canvas where you drag and connect components. Top right: Publish button when the workflow is ready.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you click on the New Component node, a sidebar opens with every available DigitalOcean action:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx25nenls1n7cg2oyn11n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx25nenls1n7cg2oyn11n.png" alt="SuperPlane — rapid-bolt app showing full DigitalOcean component library including Create Droplet, Create GPU Droplet, Delete actions, DNS records and more" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The full DigitalOcean component library - Create Droplet, Create GPU Droplet, Create Knowledge Base, Create Load Balancer, Create Snapshot, Delete actions, DNS records, and more. Every DigitalOcean operation available as a drag-and-drop component.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How the flow comes together:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Drag &lt;code&gt;Create Droplet&lt;/code&gt; onto the canvas&lt;/li&gt;
&lt;li&gt;Drag &lt;code&gt;Create DNS Record&lt;/code&gt; next to it&lt;/li&gt;
&lt;li&gt;Click and drag an arrow to connect the two nodes&lt;/li&gt;
&lt;li&gt;Configure each component - select region, size, droplet name&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The canvas automatically passes data between components. When &lt;code&gt;Create Droplet&lt;/code&gt; runs, its output droplet ID, IP address - flows directly into &lt;code&gt;Create DNS Record&lt;/code&gt;. No manual wiring of variables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where observability lives:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Console&lt;/strong&gt; tab shows execution logs for every run&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Agent&lt;/strong&gt; panel helps debug failures in plain language&lt;/li&gt;
&lt;li&gt;Click any component to inspect its input, output, and status&lt;/li&gt;
&lt;li&gt;Every workflow run is recorded with timestamps and who triggered it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is what makes SuperPlane different from a script or a Makefile. You see everything on one screen. The execution history is right there. No digging through log files, no guessing why something failed.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why SuperPlane Made It Actually Work
&lt;/h2&gt;

&lt;p&gt;Before this, I tried two other approaches.&lt;/p&gt;

&lt;p&gt;First was a Bash script on a cron job. It worked until it didn't - and when it broke, there was no way to know what had run, what hadn't, or why.&lt;/p&gt;

&lt;p&gt;Second was Terraform with a Slack webhook bolted on. Better, but I still had no approval step and the audit trail was just Git blame on a state file.&lt;/p&gt;

&lt;p&gt;The thing both approaches were missing wasn't automation. It was &lt;strong&gt;control&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;SuperPlane is open-source, so I could read exactly what it was doing. That mattered. What kept me using it was four things I couldn't easily get elsewhere without stitching tools together:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logs that are actually useful.&lt;/strong&gt; Every run is recorded with a timestamp and who triggered it. When something breaks, I click the run, see the exact step that failed, and read the input and output for that component. No digging through CloudWatch or grepping log files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approvals built into the workflow.&lt;/strong&gt; Destructive operations like deleting a droplet require a human to confirm before anything executes. This isn't a policy document someone has to remember - it's enforced at the workflow level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Budget guardrails.&lt;/strong&gt; The workflow won't provision outside predefined limits. The constraint isn't in a README - it's in the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human-in-the-loop for AI actions.&lt;/strong&gt; Agents can propose workflow changes but nothing executes without a person reviewing it first. This is the part that I think is actually new. Not AI automation. Governed AI automation.&lt;/p&gt;

&lt;p&gt;A cron job does the task. SuperPlane does the task and gives you a paper trail you can actually trust in production.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Bigger Takeaway
&lt;/h2&gt;

&lt;p&gt;Small automations are useful. Governed automations are valuable.&lt;/p&gt;

&lt;p&gt;The difference is oversight - knowing what ran, when, why, and who approved it. Platform teams can now build custom operational workflows without stitching together five different tools to get audit logs, approvals, and notifications working together.&lt;/p&gt;

&lt;p&gt;What used to take me 30 minutes of manual work - logging in, configuring, documenting, notifying - now happens automatically. The infrastructure workflow that required constant babysitting runs itself.&lt;/p&gt;

&lt;p&gt;More importantly: I can trust it. That's the part that matters.&lt;/p&gt;


&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;SuperPlane is open-source. Run the demo in 2 minutes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="nt"&gt;-v&lt;/span&gt; spdata:/app/data &lt;span class="nt"&gt;-ti&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ghcr.io/superplanehq/superplane-demo:stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://localhost:3000&lt;/code&gt; in your browser.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/superplanehq/superplane" rel="noopener noreferrer"&gt;github.com/superplanehq/superplane&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you automated your infrastructure workflows? What tools are you using? What's the part that still requires manual steps you wish didn't?&lt;/p&gt;

&lt;p&gt;Drop a comment - I read every one.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>automation</category>
      <category>infrastructureascode</category>
      <category>programming</category>
    </item>
    <item>
      <title>The 80/20 Rule of AI Code — Why the Last 20% Takes 80% of Your Time</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Tue, 23 Jun 2026 10:49:47 +0000</pubDate>
      <link>https://dev.to/harsh2644/the-8020-rule-of-ai-code-why-the-last-20-takes-80-of-your-time-3pcg</link>
      <guid>https://dev.to/harsh2644/the-8020-rule-of-ai-code-why-the-last-20-takes-80-of-your-time-3pcg</guid>
      <description>&lt;p&gt;AI wrote the first 80% of my feature in 10 minutes.&lt;/p&gt;

&lt;p&gt;The code was clean. The logic made sense. The happy path worked on the first try. I ran it, saw it work, and felt that specific kind of developer pride that makes you lean back in your chair slightly.&lt;/p&gt;

&lt;p&gt;I was impressed. I felt genuinely productive. I thought I'd be done in another 10, maybe 15 minutes.&lt;/p&gt;

&lt;p&gt;That was Tuesday By Thursday evening I was still working on the same feature. Not because the AI had failed. Because it had succeeded at exactly the wrong thing the easy part and left the actual hard part entirely to me.&lt;/p&gt;

&lt;p&gt;The edge cases. The error handling. The null checks. The situations that only surface when a real user does something the happy path didn't anticipate.&lt;/p&gt;

&lt;p&gt;The AI didn't write those. It didn't even know they existed. It optimized confidently and completely for the world where everything goes right - and that world is not the one your users live in.&lt;/p&gt;

&lt;p&gt;That's the 80/20 rule of AI code. The first 80% is fast, impressive, and kind of magical. The last 20% is where the real work actually lives. And it takes 80% of your total time.&lt;/p&gt;

&lt;p&gt;Here's what I've learned about that gap, and why I think it matters more than the 10 minutes you saved on Tuesday.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 80% - Fast, Clean, and Genuinely Impressive
&lt;/h2&gt;

&lt;p&gt;I want to be honest about this part before I get into the frustration.&lt;/p&gt;

&lt;p&gt;The AI is remarkable at the first 80%. You give it a clear prompt, it understands what the happy path looks like, and it generates code that works. Not kind-of works. Actually works, with reasonable variable names and logic that flows the way you'd expect.&lt;/p&gt;

&lt;p&gt;The first time I saw it in action I genuinely felt like I'd cheated at something. Tickets were closing. The velocity graph was going up. I was shipping things faster than I had in years.&lt;/p&gt;

&lt;p&gt;And that feeling is real - I'm not being sarcastic about it. The AI is fast because it's operating in familiar territory. The happy path is the well-trodden path. It's the version of your problem that exists in some form in the training data, that has been solved thousands of times before, that the model can pattern-match its way through with confidence.&lt;/p&gt;

&lt;p&gt;The 80% is real. The speed is real.&lt;/p&gt;

&lt;p&gt;The problem is that we've started treating the 80% like it's the whole thing. And it isn't.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 20% - Where Tuesday Becomes Thursday
&lt;/h2&gt;

&lt;p&gt;The AI wrote the happy path. Here's an honest list of what it didn't write:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The empty list.&lt;/strong&gt; What happens when the user has no data yet? New account, nothing in the database, the list the AI assumed would always have items turns out to be empty. The AI didn't check. You find out from a user report three days after launch, spend an hour tracing back to the unhandled case, and add the check you should have written on Tuesday.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The error handling.&lt;/strong&gt; The AI assumes the network responds. It assumes the API returns what you asked for. It assumes the third-party service is up. Every try-catch block, every fallback, every "what do we show the user when this fails" decision - that's yours. The AI left it blank because things going wrong wasn't part of the prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The domain-specific edge cases.&lt;/strong&gt; This is the one that surprises me every time. The AI doesn't know your business logic. It doesn't know that "empty" means something different in three different parts of your application. It doesn't know about the legacy data that's formatted differently. It doesn't know about the enterprise customer who uses the product in a way nobody expected. You know those things. The AI has never heard of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The performance cliff.&lt;/strong&gt; The AI writes code that works for the examples it was given. It doesn't stress-test for scale. You find the bottleneck when the feature goes live and the page suddenly takes four seconds to load for users with large datasets. The code isn't wrong. It just wasn't written with real load in mind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The maintainability tax.&lt;/strong&gt; This one is the slowest to show up. The AI writes code that solves today's problem. Three months from now when the requirements shift slightly and you're trying to extend it, you realize the abstraction doesn't quite fit the new shape. Refactoring it costs more time than writing it from scratch would have.&lt;/p&gt;

&lt;p&gt;Each of those items takes time. Together, they consistently add up to about 80% of the total effort on any feature I've shipped using AI-generated code.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 30 Seconds That Cost Me 3 Hours
&lt;/h2&gt;

&lt;p&gt;I was looking at a pull request recently - maybe 200 lines of AI-generated code that I'd prompted in about 30 seconds.&lt;/p&gt;

&lt;p&gt;I spent the next 3 hours with it.&lt;/p&gt;

&lt;p&gt;Not because the code was broken. The code was fine. I spent 3 hours adding everything the AI had quietly decided wasn't its problem: the error paths, the null checks, the comments explaining the decisions that weren't obvious, the edge case I found by actually thinking about what our users do.&lt;/p&gt;

&lt;p&gt;During the 30 seconds I felt fast. During the 3 hours I felt slow.&lt;/p&gt;

&lt;p&gt;But here's the thing I keep coming back to: the 3 hours was the actual work. The 30 seconds was the scaffolding. The AI didn't reduce the work - it relocated it. The time moved from writing the structure to making it real and making it real is slower because it requires something the AI genuinely doesn't have: context about your specific situation, your specific users, your specific history with this codebase.&lt;/p&gt;

&lt;p&gt;That was the moment I stopped caring about how long generation took and started tracking something more honest: how long until it's actually ready to ship.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Isn't a Complaint About AI
&lt;/h2&gt;

&lt;p&gt;I want to be clear - the 80/20 split isn't a failure of AI. It's basically the design.&lt;/p&gt;

&lt;p&gt;The AI is optimized for the common case. The common case is the happy path. Generating the common case quickly is genuinely useful; I'm not being dismissive of that.&lt;/p&gt;

&lt;p&gt;The issue isn't with the AI. The issue is with how we've started measuring productivity around it.&lt;/p&gt;

&lt;p&gt;We measure velocity. Tickets closed. Lines generated. Contribution graph. And all of those metrics capture the 80% beautifully - because the 80% is fast and visible and shows up as green squares.&lt;/p&gt;

&lt;p&gt;The 20% is invisible to those metrics. Nobody's dashboard shows time spent adding error handling. Nobody's standup starts with "I spent yesterday on edge cases the AI didn't anticipate." It doesn't show up anywhere. But it's where most of the actual time goes.&lt;/p&gt;

&lt;p&gt;The 80% is what gets you to a demo. The 20% is what gets you to production. And if you're not tracking how long the 20% takes, you're not tracking your real productivity - you're tracking how quickly you can type a prompt and feel good about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Actually Doing Differently
&lt;/h2&gt;

&lt;p&gt;Not quitting AI. Not even thinking about it. But I've changed a few things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I budget for the 20% upfront.&lt;/strong&gt; When I estimate any task involving AI-generated code, I add roughly 4x to whatever the generation time suggests. The AI says "this is a 10-minute feature." I tell my brain it's a 40-minute feature and plan accordingly. It's not pessimism - it's just the pattern holding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I prompt for the unhappy path explicitly.&lt;/strong&gt; Before I even generate the main code, I add to the prompt: what should happen with empty input? What should happen when the API fails? What edge cases exist here? The AI won't think of them on its own. If I name them, it at least takes a pass at them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I write the failing tests before the code exists.&lt;/strong&gt; What would break this? What would a mischievous user do? I write those tests first so the AI has a target. It doesn't catch everything, but it catches more than the AI would find by itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I remember the 3 hours.&lt;/strong&gt; When I'm tempted to push something quickly because it works in the demo I think about the 3 hours. The 30 seconds felt good. The 3 hours was the job.&lt;/p&gt;

&lt;p&gt;None of this makes the 20% disappear. But it makes it predictable instead of surprising, which is the difference between managing it and being ambushed by it.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Question
&lt;/h2&gt;

&lt;p&gt;What's the longest you've spent on the last 20% of something the AI generated quickly?&lt;/p&gt;

&lt;p&gt;I want actual numbers if you have them. The gap between how long generation took and how long it actually took to ship - that's the number I'm curious about.&lt;/p&gt;

&lt;p&gt;My answer: 30 seconds to generate, 3 hours to finish.&lt;/p&gt;

&lt;p&gt;What's yours? 👇&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;strong&gt;Heads up&lt;/strong&gt; I used AI to help structure this post and refine my thoughts. The experiences stories and opinions are my own.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>I Asked AI to Write My Commit Messages It Was Embarrassing.</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Tue, 16 Jun 2026 10:44:59 +0000</pubDate>
      <link>https://dev.to/harsh2644/i-asked-ai-to-write-my-commit-messages-it-was-embarrassing-a6i</link>
      <guid>https://dev.to/harsh2644/i-asked-ai-to-write-my-commit-messages-it-was-embarrassing-a6i</guid>
      <description>&lt;p&gt;I asked AI to write a commit message for me last week The code change was simple. A bug fix One line, easy to explain in a single sentence if I'd bothered to think about it for ten seconds.&lt;/p&gt;

&lt;p&gt;The AI wrote:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Updated stuff. Fixed things. Improved performance.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was it Four words of pure, unhelpful weapons-grade nothing I stared at it. Then I closed the tab. Then - for reasons I can't fully explain - I reopened it and stared at it again, as if it might improve on a second viewing.&lt;/p&gt;

&lt;p&gt;I couldn't ship it. Not because it was technically wrong. Because it was soulless. It told a future reader absolutely nothing about what had happened, why it had happened, or whether it mattered.&lt;/p&gt;

&lt;p&gt;That's when it hit me: AI can write code. It apparently cannot write a message that sounds like a human who gives even a small amount of a damn.&lt;/p&gt;

&lt;p&gt;Here's what happened when I let AI write my commit messages for a week -and why I'm never doing it again.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Commit Messages Used to Mean
&lt;/h2&gt;

&lt;p&gt;I used to actually spend time on commit messages.&lt;/p&gt;

&lt;p&gt;Not hours. Not a whole production. But enough - a sentence that explained the why not just the what A brief note about a trade-off I'd considered and rejected. Sometimes a link to the ticket. Sometimes a one-line explanation of a genuinely weird edge case that future-me would otherwise stare at in confusion.&lt;/p&gt;

&lt;p&gt;The message was never really for the code itself. The code speaks for itself, eventually, if you read it carefully enough. The message was for the next person the one who'd find this specific commit six months later, mid-debugging-session, wondering why on earth did anyone do it this way.&lt;/p&gt;

&lt;p&gt;A good commit message is a small specific gift to your future self or to whoever inherits your code next.&lt;/p&gt;

&lt;p&gt;I genuinely hadn't noticed I'd stopped giving that gift Not until I handed the job to AI and got back a perfect mirror-clean reflection of exactly how little effort I'd been putting in.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AI's Commit Messages: A Gallery of Shame
&lt;/h2&gt;

&lt;p&gt;Here's what the AI produced for my last three actual commits I'm sharing these because I think you'll recognize the genre even if you haven't seen these exact words.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1 Fixed stuff.&lt;/strong&gt;&lt;br&gt;
Three words. Zero context. Not the faintest clue what was fixed, why it needed fixing, or whether anyone should care.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2 Improved performance.&lt;/strong&gt;&lt;br&gt;
By how much? Where in the codebase? Through what mechanism? Compared to what baseline? The message answers none of these and somehow still manages to sound confident about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3 Bug fixes and other improvements.&lt;/strong&gt;&lt;br&gt;
This might be the most generic sentence that has ever existed in the English language It is, technically, true of almost every commit ever made by anyone.&lt;/p&gt;

&lt;p&gt;The AI had access to the actual diff. It had seen exactly what changed, line by line. And given all that information, it chose to communicate essentially nothing.&lt;/p&gt;

&lt;p&gt;Here's the part that actually got to me: these messages aren't even useful to another AI. If a different model reads "fixed stuff" in six months while trying to understand the history of this file, it gets exactly as much signal as a human would which is to say, none.&lt;/p&gt;

&lt;p&gt;The commit message wasn't really the problem. It was a symptom. I had quietly stopped caring about the story of my own code, and the AI trained to be helpful and inoffensive - just mirrored that indifference straight back at me, dressed up in complete sentences.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Actually Matters
&lt;/h2&gt;

&lt;p&gt;Commit messages aren't just decoration on top of Git history. They're not busywork.&lt;/p&gt;

&lt;p&gt;They're for the teammate who finds this code in six months and needs to understand why a decision was made before they touch it They're for the person doing a code review who's trying to evaluate whether a change is reasonable. They're for you - specifically you, at 2 AM, staring at a stack trace, trying to remember what you were thinking when you wrote this.&lt;/p&gt;

&lt;p&gt;A good commit message answers one question clearly: why did we do this?&lt;/p&gt;

&lt;p&gt;A bad commit message answers nothing, while taking up exactly as much space as a good one would have.&lt;/p&gt;

&lt;p&gt;The AI gave me generic, hollow commit messages because - and this is the uncomfortable part - I had already been giving generic, hollow commit messages for a while before I asked it to take over. It learned the pattern from my own recent history. It reflected my laziness back at me with perfect fidelity and zero judgment.&lt;/p&gt;

&lt;p&gt;That's the part that actually embarrassed me. Not the AI's output. Mine.&lt;/p&gt;

&lt;p&gt;The AI wasn't the problem. I was, and the AI just made it visible.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Lesson
&lt;/h2&gt;

&lt;p&gt;I'm back to writing my own commit messages.&lt;/p&gt;

&lt;p&gt;Not because I have some rule against AI assistance in general - I use it plenty for other things. But because I realized somewhere in this process that the commit message was never really meant for a computer to generate. It's meant for a human to read, and it should sound like it was written by one who was paying attention.&lt;/p&gt;

&lt;p&gt;The AI can write the code. It can refactor, suggest, generate, autocomplete. What it apparently can't do - at least not without me actively caring first - is write the story of why a change happened. And the story is the part that actually matters, to the next reviewer, to the next maintainer, to future-me debugging something at an hour I'd rather not specify.&lt;/p&gt;

&lt;p&gt;I don't need AI to write my commit messages.&lt;/p&gt;

&lt;p&gt;I just need to care enough, for about fifteen seconds per commit, to write them myself.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Question
&lt;/h2&gt;

&lt;p&gt;What's the worst commit message you've ever seen - or, if we're being honest with each other, written yourself?&lt;/p&gt;

&lt;p&gt;I'll go first: "Fixed stuff."&lt;/p&gt;

&lt;p&gt;I'm not proud of it. But I stand by sharing it.&lt;/p&gt;

&lt;p&gt;Your turn. 👇&lt;/p&gt;

</description>
      <category>git</category>
      <category>programming</category>
      <category>humor</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The 'Prompt' Is Not a Skill — And We Need to Stop Pretending</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Tue, 09 Jun 2026 10:50:45 +0000</pubDate>
      <link>https://dev.to/harsh2644/the-prompt-is-not-a-skill-and-we-need-to-stop-pretending-3m18</link>
      <guid>https://dev.to/harsh2644/the-prompt-is-not-a-skill-and-we-need-to-stop-pretending-3m18</guid>
      <description>&lt;p&gt;Writing a prompt isn't engineering. It's typing.&lt;/p&gt;

&lt;p&gt;You type what you want. The AI figures out the rest That's not a skill. that's having a conversation with a very fast very confident intern who never admits uncertainty.&lt;/p&gt;

&lt;p&gt;And yet. We've started calling ourselves prompt engineers We've started listing it on LinkedIn We've started acting like knowing how to ask is the same as knowing how to build. It's not.&lt;/p&gt;

&lt;p&gt;The real skill - the one that actually matters the one that was always there never - changed. It's knowing what to ask for. It's knowing whether the answer is right It's knowing what the AI assumed what it missed and what it quietly broke without flagging.&lt;/p&gt;

&lt;p&gt;Prompting isn't the skill Judgment is.&lt;/p&gt;

&lt;p&gt;Let me explain why - and why pretending otherwise is actively hurting us.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We're Actually Doing
&lt;/h2&gt;

&lt;p&gt;Let's be honest about what prompting looks like in practice.&lt;/p&gt;

&lt;p&gt;You open a chat window. You type a description of what you want. The AI writes code If it's wrong or incomplete, you type another sentence. refining it The AI tries again You repeat until it works or until you give up and write it yourself.&lt;/p&gt;

&lt;p&gt;That's not engineering. That's talking.&lt;/p&gt;

&lt;p&gt;Engineering requires understanding trade-offs It requires knowing why one solution is better than another for a specific context It requires anticipating failure modes designing for change making decisions that will hold up when requirements shift six months from now and someone else is maintaining the code.&lt;/p&gt;

&lt;p&gt;Prompting requires none of that.&lt;/p&gt;

&lt;p&gt;The AI handles the trade-offs - or rather it makes choices without surfacing them to you The AI anticipates failure modes - poorly silently in ways you won't discover until production The AI makes the architectural decisions You review approve and ship.&lt;/p&gt;

&lt;p&gt;We've outsourced the thinking and called it a skill.&lt;/p&gt;

&lt;p&gt;We've confused using a tool with knowing the craft.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Lie We're Telling Ourselves
&lt;/h2&gt;

&lt;p&gt;Here's the lie, stated plainly: I'm a prompt engineer I've developed a new professional skill.&lt;/p&gt;

&lt;p&gt;You haven't. You've learned to talk to a machine that was specifically designed, at enormous expense to understand natural language from anyone The entire point of these models is that you don't need special knowledge to use them.&lt;/p&gt;

&lt;p&gt;The AI doesn't need your prompt engineering skills It needs your judgment It needs you to know whether the code it wrote is actually correct - not just syntactically valid but correct for your use case your constraints your edge cases It needs you to catch the assumptions it made without telling you It needs you to ask "what happens when this list is empty?" because the AI won't ask that question It'll just assume a list will always have items write code based on that assumption and return output that looks completely reasonable until a user with an empty list hits the endpoint.&lt;/p&gt;

&lt;p&gt;And here's the part that bothers me most: prompting is accessible to everyone My non-technical friends prompt My parents have started prompting My neighbor who describes "coding" as the thing where you make computers do things prompts They get useful results.&lt;/p&gt;

&lt;p&gt;The thing that separates a developer from a person who has never written a line of code isn't the prompt It's knowing what to do with the answer It's knowing when the answer is wrong It's knowing which parts of the AI's output to trust and which parts to verify independently.&lt;/p&gt;

&lt;p&gt;That's not a prompt skill. That's a development skill And we've had it all along.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Moment I Couldn't Unsee It
&lt;/h2&gt;

&lt;p&gt;A non-technical friend pulled me aside at a gathering last month They'd been using AI tools for a few weeks and were clearly excited about it So you just type what you want and the AI writes the code for you? I said yes.&lt;/p&gt;

&lt;p&gt;Then I felt something I didn't expect: embarrassment.&lt;/p&gt;

&lt;p&gt;Because that's what I do I type what I want I review the answer I copy the relevant parts I ship it. And in that moment I realized my friend -  who doesn't know what a stack trace is who has never debugged anything  who thinks "deploying" means emailing a file - could do the same sequence of steps with the same tools.&lt;/p&gt;

&lt;p&gt;So I asked myself the uncomfortable question: if a person without my background can follow the same workflow what's actually valuable about me?&lt;/p&gt;

&lt;p&gt;The answer when I sat with it honestly: I know when the AI is wrong I know the questions to ask next I know what the AI assumed and whether those assumptions hold I know which of its solutions will cause problems under load or fail on edge cases or be a nightmare to maintain.&lt;/p&gt;

&lt;p&gt;Those aren't prompt skills Those are engineering skills They took years of frustration and failure to develop And they're completely invisible in the prompt itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Real Skill Actually Is
&lt;/h2&gt;

&lt;p&gt;Prompting is the input method. The skill is everything that surrounds it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing what to actually ask for.&lt;/strong&gt; Not "write a function that does X" That's easy anyone can do that "Write a function that handles empty inputs null values and malformed data and tell me what assumptions you're making - that requires knowing what could go wrong Which requires experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing if the answer is right.&lt;/strong&gt; The AI is always confident Confidence doesn't correlate with correctness You need the background to know when confidence is lying - when the code looks right but has a subtle flaw when the explanation is plausible but wrong when the solution works for the example but fails in the general case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing what the AI assumed.&lt;/strong&gt; This is the one that bites most often. The AI doesn't tell you its assumptions - it just makes them and moves on The empty list The non-null pointer The timezone that's always UTC The user that always has a name Catching those assumptions before they reach production is an engineering skill full stop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowing when to ignore the AI entirely.&lt;/strong&gt; Sometimes the AI gives you a solution that technically works but is wrong for your context - wrong architecture wrong abstraction level wrong trade-off for your specific constraints Recognizing that requires understanding your system deeply enough to evaluate proposals not just accept them.&lt;/p&gt;

&lt;p&gt;These are not prompt skills They are the same skills developers have always needed The input method changed The judgment required did not.&lt;/p&gt;

&lt;p&gt;Prompting is easy Judgment is hard We need to stop conflating them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Isn't Just Semantics
&lt;/h2&gt;

&lt;p&gt;Calling prompting a skill isn't a harmless rebranding It has real consequences.&lt;/p&gt;

&lt;p&gt;Junior developers are being told to learn prompt engineering as if it's a foundation - as if it substitutes for understanding data structures debugging system design how things fail It doesn't It can't A junior who can prompt but can't reason about their code is a junior who can produce output quickly and catch problems slowly.&lt;/p&gt;

&lt;p&gt;Companies are hiring prompt engineers - roles that optimize for the input method rather than the judgment behind it They're building teams organized around the tool rather than the craft.&lt;/p&gt;

&lt;p&gt;And developers are updating their LinkedIn profiles with skills that sound impressive but describe something any person with internet access can do.&lt;/p&gt;

&lt;p&gt;The result: a layer of the industry that can generate but not evaluate That can ship fast but can't debug when it breaks That has strong opinions about which prompting techniques work best and fragile intuitions about why the code is actually wrong.&lt;/p&gt;

&lt;p&gt;When the empty list assumption crashes production at 2 AM, the prompt won't save you The debugging skills will. The architectural intuition will. The experience of having been burned before will.&lt;/p&gt;

&lt;p&gt;We're not prompt engineers We're developers who use AI as a tool. And the distance between those two descriptions matters more than it might seem.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Doing Instead
&lt;/h2&gt;

&lt;p&gt;I'm not quitting AI I'm not going back to writing everything from scratch That would be a different kind of self-deception.&lt;/p&gt;

&lt;p&gt;But I've stopped calling prompting a skill in any meaningful sense of the word I treat it as an input method - the way I treat typing or using a terminal It's how I talk to a tool not a capability I've developed.&lt;/p&gt;

&lt;p&gt;I focus on the things that require actual judgment: architecture edge cases failure modes trade-offs the assumptions hidden in outputs that look correct. I ask what did the AI assume? before I ship I treat confident AI output with the same skepticism I'd give a confident junior who hasn't worked in production yet.&lt;/p&gt;

&lt;p&gt;I remind myself regularly: typing isn't engineering Thinking is And I don't put prompt engineering on my resume.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Question
&lt;/h2&gt;

&lt;p&gt;Are you a prompt engineer?&lt;/p&gt;

&lt;p&gt;Or are you a developer - with real skills, real judgment, real experience who happens to use AI as a tool?&lt;/p&gt;

&lt;p&gt;I've made my choice about how I answer that.&lt;/p&gt;

&lt;p&gt;What's yours? 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The Bug That Took 10 Minutes to Fix and 3 Days to Find</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Wed, 03 Jun 2026 10:29:25 +0000</pubDate>
      <link>https://dev.to/harsh2644/the-bug-that-took-10-minutes-to-fix-and-3-days-to-find-1l0m</link>
      <guid>https://dev.to/harsh2644/the-bug-that-took-10-minutes-to-fix-and-3-days-to-find-1l0m</guid>
      <description>&lt;p&gt;The fix was one line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it Three words a colon and a pair of brackets It took me 10 seconds to type. 10 minutes to test and verify 10 seconds to deploy.&lt;/p&gt;

&lt;p&gt;It took me &lt;strong&gt;3 days to find&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Three days of staring at logs that said nothing Adding print statements that confirmed nothing Rewriting code that wasn't broken Blaming the framework Blaming the database Blaming the network Eventually quietly blaming myself.&lt;/p&gt;

&lt;p&gt;The bug wasn't complicated It wasn't deep It was hiding in plain sight in a place I hadn't thought to look because I hadn't thought to ask the right question.&lt;/p&gt;

&lt;p&gt;The AI had assumed a list would never be empty I had assumed the AI was right. Neither of us checked.&lt;/p&gt;

&lt;p&gt;This is the story of how I spent 3 days debugging a bug that took 10 minutes to fix and what I learned about assumptions silent failures and the expensive gap between it works and it always works.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Started
&lt;/h2&gt;

&lt;p&gt;The code was simple A function that processed a list of user inputs and returned a summary A small feature, maybe two hundred lines total Nothing that should have taken more than an afternoon.&lt;/p&gt;

&lt;p&gt;I'd used AI to write the core logic The prompt was clear The output looked clean - readable, well-structured, sensible variable names I reviewed it The tests passed The PR was approved in the next morning's standup I shipped it on Tuesday.&lt;/p&gt;

&lt;p&gt;The feature worked fine for two days Users were using it Logs were quiet I moved on to the next ticket.&lt;/p&gt;

&lt;p&gt;Then Thursday happened.&lt;/p&gt;

&lt;p&gt;A user with an empty list hit the endpoint No data - just an empty state, the kind that every real application encounters eventually The function received the empty list, processed it, and returned... nothing Not an error Not an empty list Not a helpful message Just silence.&lt;/p&gt;

&lt;p&gt;The UI froze waiting for a response that wasn't coming The user was confused Support flagged it I was pulled back into code I thought was done.&lt;/p&gt;

&lt;p&gt;The function worked 99% of the time The 1% was invisible And in production invisible is expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 1: The Spiral
&lt;/h2&gt;

&lt;p&gt;I started where anyone would the error logs Nothing No exceptions no warnings, no trace The function had been called It had returned The logs had nothing to say about what happened in between.&lt;/p&gt;

&lt;p&gt;I added print statements Ran the code locally It worked perfectly Of course it did - I had test data which meant I had a non-empty list which meant I never triggered the bug.&lt;/p&gt;

&lt;p&gt;I checked the database The data was there The function was definitely being called - I could see the request in the logs It returned something The UI just couldn't do anything with it.&lt;/p&gt;

&lt;p&gt;I blamed the framework Maybe it's a caching issue Maybe the response is getting intercepted somewhere Cleared caches Nothing changed.&lt;/p&gt;

&lt;p&gt;I blamed the network Maybe the request is timing out before the response arrives Checked latency Everything was fine.&lt;/p&gt;

&lt;p&gt;I blamed the AI-generated code Maybe the logic is wrong in a subtle way I missed in review Rewrote the core function by hand line by line Same behavior.&lt;/p&gt;

&lt;p&gt;By 6 PM I had rewritten three functions restarted the server twice added eleven print statements and learned absolutely nothing.&lt;/p&gt;

&lt;p&gt;I closed my laptop The bug was still there.&lt;/p&gt;

&lt;p&gt;So was I.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 2: The Desperation
&lt;/h2&gt;

&lt;p&gt;I came back Friday with fresh eyes and no new ideas - the worst combination.&lt;/p&gt;

&lt;p&gt;I traced the execution path more carefully this time Line by line watching the data flow through the function The input was received The processing ran The output was generated Everything looked right.&lt;/p&gt;

&lt;p&gt;Except the output was wrong.&lt;/p&gt;

&lt;p&gt;I started questioning things I hadn't questioned in years Did I actually understand the data structure I was working with? Was Python doing something I wasn't expecting with list references? Was there a mutation happening somewhere that I wasn't seeing?&lt;/p&gt;

&lt;p&gt;I added a check to log the exact value of the input list before processing Items were there I added a check after processing The result was empty The logic in between looked correct.&lt;/p&gt;

&lt;p&gt;I posted on Stack Overflow No answers for six hours.&lt;/p&gt;

&lt;p&gt;I asked an AI assistant It suggested the same approaches I'd already tried, phrased slightly differently.&lt;/p&gt;

&lt;p&gt;I pulled a colleague into a Zoom call They looked at the code for ten minutes and said It looks fine to me.&lt;/p&gt;

&lt;p&gt;That was the worst moment of the three days Not the frustration not the wasted hours - the moment when someone else looked at it and confirmed that nothing was obviously wrong. Because that meant either I was missing something fundamental or the bug was somewhere I hadn't looked yet.&lt;/p&gt;

&lt;p&gt;By Friday night I had genuinely started to wonder if I was going to find it at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 3: The Breakthrough
&lt;/h2&gt;

&lt;p&gt;Saturday morning. Fresh coffee No notifications I opened the function again with no particular plan - just read it one more time slowly with no assumptions about where the problem was.&lt;/p&gt;

&lt;p&gt;Same code. Same behavior But I added one more log I hadn't thought to add before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items before processing: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, length: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The list had items. Three of them. Good — confirmed the input was right.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;processed result: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;processed&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;processed length: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;processed&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;empty/None&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The processed result was empty.&lt;/p&gt;

&lt;p&gt;I stared at the screen for a moment Input: three items Output: empty The logic in between: apparently correct.&lt;/p&gt;

&lt;p&gt;Then I looked at something I had looked at a dozen times before but never really seen The function I was testing was calling a helper function I had reviewed that helper function I had read it carefully But I had read it assuming the input would always have items - because in my testing it always did.&lt;/p&gt;

&lt;p&gt;The helper function wasn't checking It was written assuming the list would have at least one item When it did it worked correctly and returned results. When it didn't when the list was empty it entered a code path that silently returned nothing instead of an empty list.&lt;/p&gt;

&lt;p&gt;No exception No warning No log entry Just nothing wrapped up neatly and returned as if nothing was wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I added the line Ran the test with an empty list The function returned an empty list.&lt;/p&gt;

&lt;p&gt;I ran the full test suite Everything passed.&lt;/p&gt;

&lt;p&gt;I deployed The UI loaded The user with the empty list finally saw something on their screen: an empty state message exactly what they should have seen three days ago.&lt;/p&gt;

&lt;p&gt;The fix took 10 seconds to write and 10 minutes to verify.&lt;/p&gt;

&lt;p&gt;Finding it took 3 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Bug Taught Me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The 99% trap is real.&lt;/strong&gt; Code that works most of the time is significantly harder to debug than code that fails loudly and immediately The silent failure is the expensive one because it doesn't announce itself and because you'll keep testing with the cases that work and never see the case that doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assumptions are invisible debt.&lt;/strong&gt; The AI assumed a list would never be empty because most of its training examples involved lists that had items. I assumed the AI had handled the edge cases because the code looked complete. Neither assumption was wrong on its own they were just unchecked And unchecked assumptions in production are loans you'll repay with interest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works on my machine is a specific kind of lie.&lt;/strong&gt; It works on my machine because I test with data. The bug lived in the absence of data The happy path works the happy path always works The skill is in finding the unhappy path before your users do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix is almost never the hard part.&lt;/strong&gt; Finding is hard Fixing is easy I spent 3 days finding a single unhandled edge case I spent 10 minutes fixing it. The value in software development isn't in writing code it's in knowing where to look when the code is wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I should have asked what happens when this gets nothing?&lt;/strong&gt; Before shipping Before the PR was approved. Before the tests ran That question takes 30 seconds to ask and answer It would have saved three days.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Doing Differently
&lt;/h2&gt;

&lt;p&gt;Now I ask one question before I ship any function before review before testing before deployment:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens when this gets nothing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Empty list Null input Missing field Zero results The case where the happy path assumption is wrong.&lt;/p&gt;

&lt;p&gt;I don't trust AI-generated code to ask that question for me I don't trust myself to remember to ask it spontaneously So I made it a rule part of my personal pre-ship checklist right after does the happy path work.&lt;/p&gt;

&lt;p&gt;It takes about 30 seconds to answer It would have saved me 3 days.&lt;/p&gt;

&lt;p&gt;That's a trade-off I'll take every single time.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Question
&lt;/h2&gt;

&lt;p&gt;What's the longest you've spent debugging a bug that turned out to be a one-line fix?&lt;/p&gt;

&lt;p&gt;Days? Hours? A week you'd rather forget?&lt;/p&gt;

&lt;p&gt;I'll go first in the comments 3 days, one missing edge case, one line of code I still think about every time I ship a new function.&lt;/p&gt;

&lt;p&gt;Your turn. 👇&lt;/p&gt;

</description>
      <category>programming</category>
      <category>learning</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Spent 10x Longer Debugging AI Code Than Writing It</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Thu, 28 May 2026 14:53:02 +0000</pubDate>
      <link>https://dev.to/harsh2644/i-spent-10x-longer-debugging-ai-code-than-writing-it-15h4</link>
      <guid>https://dev.to/harsh2644/i-spent-10x-longer-debugging-ai-code-than-writing-it-15h4</guid>
      <description>&lt;p&gt;AI wrote the code in 30 seconds&lt;/p&gt;

&lt;p&gt;Three lines A simple function I prompted it generated I copied It looked fine Clean syntax Good variable names No obvious errors.&lt;/p&gt;

&lt;p&gt;I spent the next &lt;strong&gt;5 hours&lt;/strong&gt; debugging it.&lt;/p&gt;

&lt;p&gt;The bug wasn't in the logic The AI had made a quiet assumption - that a list would never be empty It worked 99% of the time The 1% crashed in production A real user A real failure A very real 5 hours of my life.&lt;/p&gt;

&lt;p&gt;30 seconds of generation 5 hours of debugging.&lt;/p&gt;

&lt;p&gt;That's not efficiency That's a trade-off nobody is talking about.&lt;/p&gt;

&lt;p&gt;This isn't an anti-AI article I use AI every single day It has genuinely changed how I work But I've stopped pretending that speed at write time is the only metric that matters.&lt;/p&gt;

&lt;p&gt;Here's what I've learned about the hidden cost of AI-generated code after paying that cost enough times to notice the pattern.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Myth of Fast Code
&lt;/h2&gt;

&lt;p&gt;We've been sold a story AI makes you faster Prompt copy ship Repeat It's true the writing is faster Dramatically faster What used to take an hour now takes minutes That part is real.&lt;/p&gt;

&lt;p&gt;But the story always stops there It doesn't mention what happens after.&lt;/p&gt;

&lt;p&gt;The AI writes the code in seconds You ship it You move on Weeks later a bug surfaces - subtle hard to reproduce buried in code you didn't write and don't fully own.&lt;/p&gt;

&lt;p&gt;Now you're not debugging logic you understand You're &lt;strong&gt;reverse-engineering&lt;/strong&gt; code from a system that can't explain its own assumptions You're reading it like a stranger's handwriting trying to figure out what they meant.&lt;/p&gt;

&lt;p&gt;The fast code isn't free It's borrowed time.&lt;/p&gt;

&lt;p&gt;The debt shows up later - and by then you've completely forgotten what the AI assumed when it wrote it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Times AI Code Cost Me More Than It Saved
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The Invisible Assumption (5 hours)
&lt;/h3&gt;

&lt;p&gt;The AI assumed a list would never be empty Didn't check Didn't add a guard Why would it? It only knows what I asked - not what real users actually do.&lt;/p&gt;

&lt;p&gt;The bug showed up in production two weeks after I shipped A user with zero data hit the flow The whole thing crashed.&lt;/p&gt;

&lt;p&gt;The fix? One line A simple if not list check.&lt;/p&gt;

&lt;p&gt;The debugging? Five hours of confused increasingly frustrated me tracing through logs, adding print statements, questioning my own sanity before I found a single missing assumption.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Saved at write time&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔥 Cost at debug time&lt;/td&gt;
&lt;td&gt;5 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ratio: 60x.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Works on My Machine Trap (1 full day)
&lt;/h3&gt;

&lt;p&gt;AI code passed all my tests Ran perfectly locally I was confident I shipped it.&lt;/p&gt;

&lt;p&gt;In production? Different story entirely.&lt;/p&gt;

&lt;p&gt;The AI had optimized for my test environment - the clean inputs I'd been testing with, the neat data shapes in my fixtures the happy paths I'd written It hadn't thought about real data It hadn't thought about the weird edge cases real users create.&lt;/p&gt;

&lt;p&gt;I spent a full day chasing a bug that only existed in the wild.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Saved at write time&lt;/td&gt;
&lt;td&gt;10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔥 Cost at debug time&lt;/td&gt;
&lt;td&gt;1 full day&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3. The Naming Trap (3 hours)
&lt;/h3&gt;

&lt;p&gt;The AI named a variable &lt;code&gt;data&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Generic Vague Technically acceptable And a completely reasonable thing for an AI to do it didn't know what mattered.&lt;/p&gt;

&lt;p&gt;Three months later I had no idea what data contained Was it the raw user input? The transformed output? The cached result from the database? Something I'd filtered?&lt;/p&gt;

&lt;p&gt;I spent 3 hours tracing through code that should have taken 10 minutes to understand because the AI chose convenience over clarity and I didn't catch it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Saved at write time&lt;/td&gt;
&lt;td&gt;0 minutes &lt;em&gt;(I would've named it better)&lt;/em&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔥 Cost at debug time&lt;/td&gt;
&lt;td&gt;3 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What AI Code Actually Costs
&lt;/h2&gt;

&lt;p&gt;Beyond the hours there are costs that don't show up on any stopwatch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cognitive load.&lt;/strong&gt; You didn't write the code, so you don't have the mental model Every time you touch it, you have to rebuild your understanding from scratch It's like returning to a codebase you've never seen except you supposedly wrote it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confidence erosion.&lt;/strong&gt; After enough works on my machine moments you stop trusting your own testing You start shipping with low-grade anxiety You add logs just in case You write extra tests not because the code needs them but because you don't trust code you didn't write.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The just in case spiral.&lt;/strong&gt; Extra checks Extra validation Extra error handling not because the requirements demand it but because you're compensating for uncertainty about code you can't fully vouch for This eats time quietly in small pieces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opportunity cost.&lt;/strong&gt; Every hour you spend debugging AI-generated code is an hour you're not spending on the work that actually requires your judgment your context your experience.&lt;/p&gt;

&lt;p&gt;These costs are invisible No ticket tracks them No dashboard measures them No retrospective surfaces them.&lt;/p&gt;

&lt;p&gt;But they're real And they add up slowly silently until one day you realize debugging has started to feel like the actual job.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Doing Differently
&lt;/h2&gt;

&lt;p&gt;I'm not quitting AI That ship has long since sailed and I don't want it back.&lt;/p&gt;

&lt;p&gt;But I've made a few small changes that have quietly shifted the ratio:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. I don't ship code I can't explain.&lt;/strong&gt;&lt;br&gt;
If I can't walk through the logic not skim actually walk through it line by line I don't ship it. Even if it works in testing This catches invisible assumptions before production does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. I treat AI output as a first draft.&lt;/strong&gt;&lt;br&gt;
The AI writes the structure. I rewrite the parts that matter the edge cases the error handling the variable names the things that someone will need to read at 2am when something breaks It's slower It's also code I actually own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. I add the missing assumptions explicitly.&lt;/strong&gt;&lt;br&gt;
The AI always optimizes for the happy path So I've made it a habit to immediately ask: What does this break if the input is empty Null? Malformed Unexpected? I add those checks myself every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. I budget a debugging tax.&lt;/strong&gt;&lt;br&gt;
Every AI-generated function gets an extra 30 minutes in my time estimate for review and hardening Not pessimism pattern recognition The tax pays for itself in the first incident it prevents.&lt;/p&gt;

&lt;p&gt;None of these eliminate the problem But they've meaningfully reduced my personal 10x ratio Some weeks it's closer to 3x now.&lt;/p&gt;

&lt;p&gt;That's progress.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Trade-Off
&lt;/h2&gt;

&lt;p&gt;AI code is faster to write Slower to debug The ratio varies sometimes 2x sometimes 20x sometimes that one time it was 60x and I questioned my life choices.&lt;/p&gt;

&lt;p&gt;The question was never is AI good or bad? That's a pointless debate.&lt;/p&gt;

&lt;p&gt;The real question is: &lt;strong&gt;what's the ratio for your work on your codebase for your team?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For throwaway scripts? Use AI don't look back.&lt;/p&gt;

&lt;p&gt;For core logic that someone will need to debug at 2 AM six months from now? Be careful Be deliberate. Be present.&lt;/p&gt;

&lt;p&gt;The trade-off is real It's not going away And pretending it doesn't exist doesn't make it disappear it just means you'll discover it in production instead of before it.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Question
&lt;/h2&gt;

&lt;p&gt;What's the worst AI wrote it fast I debugged it slow story you have?&lt;/p&gt;

&lt;p&gt;How long did the bug take to find? What was the assumption you missed?&lt;/p&gt;

&lt;p&gt;I'll go first in the comments - the empty list crash 5 hours a single missing if statement.&lt;/p&gt;

&lt;p&gt;Your turn. 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>OpenClaw vs CraftBot: Which Local AI Agent Is Right for You?</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Tue, 26 May 2026 15:17:28 +0000</pubDate>
      <link>https://dev.to/harsh2644/openclaw-vs-craftbot-which-local-ai-agent-is-right-for-you-47k9</link>
      <guid>https://dev.to/harsh2644/openclaw-vs-craftbot-which-local-ai-agent-is-right-for-you-47k9</guid>
      <description>&lt;p&gt;Local AI agents are having a moment right now.&lt;/p&gt;

&lt;p&gt;Developers are increasingly uncomfortable with cloud-only assistants privacy concerns data leaving your machine, API costs that compound The push toward running AI locally is real and the tooling is catching up fast.&lt;/p&gt;

&lt;p&gt;I spent time testing two tools that take very different approaches to this problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; - a browser extension for local AI tasks lightweight and ready in 60 seconds&lt;br&gt;
&lt;strong&gt;CraftBot&lt;/strong&gt; - a full desktop AI agent built by CraftOS open source and capable of things a browser extension simply can't do&lt;/p&gt;

&lt;p&gt;This isn't a sponsored comparison I tested both documented everything and I'll tell you exactly what I found.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is OpenClaw?
&lt;/h2&gt;

&lt;p&gt;OpenClaw is a &lt;strong&gt;terminal-first CLI tool&lt;/strong&gt; that you interact with through command line. It connects to messaging platforms like Telegram, WhatsApp, and Discord, executing tasks through a plugin system with 50+ integrations.&lt;/p&gt;

&lt;p&gt;It also comes with an optional Chrome extension that lets the agent control your existing browser tabs — but the core experience is terminal-based [citation:1][citation:5].&lt;/p&gt;

&lt;p&gt;The core promise: powerful agent automation from your terminal, with browser control when you need it. Ready in about 60 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers comfortable with the command line who want granular control over their AI agent, or those needing automation across messaging platforms [citation:10].&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is CraftBot?
&lt;/h2&gt;

&lt;p&gt;CraftBot is a different beast entirely.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/HBoO0H24v6g"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;It's a full desktop AI agent - Python-based fully open source available on GitHub (&lt;a href="https://github.com/CraftOS-dev/CraftBot" rel="noopener noreferrer"&gt;CraftOS-dev/CraftBot&lt;/a&gt; 276+ stars at time of writing) It runs locally on your machine connects to external services via MCP (Model Context Protocol) and has a feature called Living UI that lets the agent build its own custom tools on the fly.&lt;/p&gt;

&lt;p&gt;The setup takes longer. But the capability ceiling is in a completely different league.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who need local model support file management observability and serious agentic workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation &amp;amp; Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenClaw
&lt;/h3&gt;

&lt;p&gt;1-click install from the Chrome Web Store Ready in approximately 60 seconds No terminal required.&lt;/p&gt;

&lt;h3&gt;
  
  
  CraftBot
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/CraftOS-dev/CraftBot" rel="noopener noreferrer"&gt;github.com/CraftOS-dev/CraftBot&lt;/a&gt; — clone this to get started&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;CraftBot requires Python 3.10+ git and Node.js Once you have those:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/CraftOS-dev/CraftBot.git
&lt;span class="nb"&gt;cd &lt;/span&gt;CraftBot
python craftbot.py &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CraftBot handles everything automatically from there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04yhb2rmt00zb90e9apq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04yhb2rmt00zb90e9apq.png" alt="CraftBot installation" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CraftBot installation — Step 1 of 3, installing core dependencies at 94%. The retro ASCII art is a nice touch.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The installer downloads all required packages. After that, CraftBot launches in TUI mode and begins downloading the embedding model:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6zlhsidepk15m6mh1ql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6zlhsidepk15m6mh1ql.png" alt="Dependencies installed" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dependencies installed — CraftBot launches, downloads the all-MiniLM-L6-v2 embedding model, and signals [OK] Ready&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; CraftBot recommends Python 3.10, but the installation handles dependencies regardless of your Python version.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Step lets you select MCP servers — this is where CraftBot's depth shows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdu19u4tnlimhnalvt1h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdu19u4tnlimhnalvt1h.png" alt="MCP server selection" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxo6gvisxr4fptgstlzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxo6gvisxr4fptgstlzi.png" alt="MCP server selection" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;MCP server selection — Gmail, Slack, GitHub, Notion, Google Calendar, Todoist, Obsidian, Brave Search, Playwright, and Filesystem. Each one you enable adds tools your agent can call.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once fully set up, CraftBot launches in browser mode:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7ksyuwdbvogow6ncah4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp7ksyuwdbvogow6ncah4.png" alt="CRAFTBOT IS READY" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CRAFTBOT IS READY — running at localhost:7925 with all 7/8 systems initialized (frontend server, agent backend, MCP servers, skills, integrations, scheduler)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup verdict:&lt;/strong&gt; OpenClaw wins on speed — 60 seconds vs 15-20 minutes. But CraftBot's setup is one-time, and what you get afterward is in a completely different category.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Interface
&lt;/h2&gt;

&lt;p&gt;Access CraftBot at &lt;code&gt;http://localhost:7925&lt;/code&gt; in your browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnlikg01vs8slpbr4exu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjnlikg01vs8slpbr4exu.png" alt="CraftBot's main interface" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CraftBot's main interface Chat, Tasks, Dashboard Workspace navigation and the prominent orange Add Living UI button Clean, fast entirely local.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The four sections — Chat, Tasks, Dashboard, Workspace — each serve a distinct purpose. No clutter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conversations &amp;amp; Intelligence
&lt;/h2&gt;

&lt;p&gt;Starting simple:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhydvii0fkm8cp2m9fmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwhydvii0fkm8cp2m9fmq.png" alt="CraftBot introduces itself" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hello, who are you? → CraftBot: Hey! I'm CraftBot an AI agent built by CraftOS. I can handle pretty much any computer-based task you throw at me from research and coding to file operations, scheduling, and more.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When I asked "What can you do?" — the response listed 7 capability categories:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dkca04n3sch8cwo679e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dkca04n3sch8cwo679e.png" alt="7 capabilities: Research &amp;amp; Analysis" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;7 capabilities: Research &amp;amp; Analysis File Management Coding &amp;amp; Automation Scheduling &amp;amp; Monitoring, System Operations, Third-party Integrations and notably Self-improvement (installing new tools and skills at runtime)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That last one &lt;strong&gt;Self-improvement&lt;/strong&gt; is worth pausing on. CraftBot can install new tools and skills while it's running. That's not a chatbot feature. That's an agent feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw comparison:&lt;/strong&gt; OpenClaw is reactive — you ask, it responds. CraftBot is designed to be proactive — background tasks, scheduled actions, context awareness across sessions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dashboard &amp;amp; Observability
&lt;/h2&gt;

&lt;p&gt;This is where CraftBot separates itself from anything browser-based.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfvf0qqs9hjgh5ymcp1x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfvf0qqs9hjgh5ymcp1x.png" alt="CraftBot's full observability dashboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CraftBot's full observability dashboard — Task Statistics, Token Usage breakdown (Input 98%, Output 2%, Cached 14%), System Resources (CPU/memory/disk/thread pool), Usage Patterns with peak hour analytics, MCP server status, Skills (11 enabled), and Model Information showing exactly which model is running&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Everything visible, nothing hidden. The Model Information panel shows &lt;code&gt;deepseek/deepseek-v4-flash&lt;/code&gt; via openrouter — the exact model, the exact provider. Compare that to cloud tools that hide this behind "proprietary AI."&lt;/p&gt;

&lt;p&gt;What the dashboard shows you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task completion rates and failures&lt;/li&gt;
&lt;li&gt;Token consumption broken down by type&lt;/li&gt;
&lt;li&gt;Real-time CPU, memory, disk usage&lt;/li&gt;
&lt;li&gt;Request history and peak usage hours&lt;/li&gt;
&lt;li&gt;Which MCP servers are connected and how many calls they've made&lt;/li&gt;
&lt;li&gt;Exactly which AI model you're running&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No browser extension can give you this level of visibility into what your agent is actually doing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Workspace &amp;amp; File Management
&lt;/h2&gt;

&lt;p&gt;CraftBot has a built-in file browser at &lt;code&gt;localhost:7925/workspace&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzec2debd3wxbvaibe2w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzec2debd3wxbvaibe2w.png" alt="CraftBot Workspace" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CraftBot Workspace — built-in file manager with New Folder, New File, and Upload buttons. The living_ui/ folder is where custom apps built by the agent get stored.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Create folders, create files, upload documents. The agent can read and write to this workspace directly — no manual file sharing required.&lt;/p&gt;




&lt;h2&gt;
  
  
  MCP Support Explained
&lt;/h2&gt;

&lt;p&gt;I asked CraftBot directly what MCP is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u6gyo2115a6tmgz2tjm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5u6gyo2115a6tmgz2tjm.png" alt="CraftBot explains MCP" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CraftBot on MCP: It's an open standard that lets AI applications like me connect to external tools and services. Think of it like a universal plugin system — an MCP server runs as a subprocess and exposes tools, resources, and prompts that I can call directly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the architecture that lets CraftBot actually &lt;em&gt;do things&lt;/em&gt; — read your Gmail, search GitHub issues, update a Notion page, run a web search. Each MCP server you configure during setup becomes a set of callable tools.&lt;/p&gt;

&lt;p&gt;The Tasks &amp;amp; Actions panel on the right shows the agent's current task queue Plan my day and User Profile Interview were active during this session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vs OpenClaw&lt;/strong&gt;: OpenClaw does not have native MCP support.&lt;/p&gt;




&lt;h2&gt;
  
  
  Local Model Support (Ollama)
&lt;/h2&gt;

&lt;p&gt;The capability that matters most for privacy: running completely offline.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt8xmfkaxkj53c897tnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flt8xmfkaxkj53c897tnz.png" alt="Local (Ollama) with llama3.2:3b" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CraftBot automatically installs Ollama — shown here at 55% progress. The process completes without any manual intervention.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Switch the provider to Local (Ollama) in Settings, choose your model, and CraftBot installs Ollama automatically via winget. Once configured, your data never leaves your machine. No API costs. No internet required.&lt;/p&gt;

&lt;p&gt;This is one of the most important features for developers working with sensitive codebases or proprietary information. OpenClaw has no equivalent.&lt;/p&gt;




&lt;h2&gt;
  
  
  Living UI: Create Custom Apps
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/8GpdW-gJrDA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;CraftBot's Living UI lets you build custom apps that live inside the agent. The agent stays aware of the UI's state and can read, write, and act on its data directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's New in CraftBot V1.3.2
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzsw70fss6e7pwhr9e9cm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzsw70fss6e7pwhr9e9cm.png" alt="CraftBot mascot logo" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CraftBot now has an animated mascot that reacts to what the agent is doing — idle, working, or thinking. A small but nice touch that makes the experience feel more alive.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security Review: How CraftBot's Architecture Handles the 5 Key Tests
&lt;/h2&gt;

&lt;p&gt;Based on my architecture review and documentation analysis CraftBot is designed to pass all 5 key security tests here's why.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test 1: Read/Write Permissions Access Control
&lt;/h3&gt;

&lt;p&gt;CraftBot's MCP servers can be restricted to read-only or write-only mode at the configuration level. Even if an agent session were somehow compromised, it physically cannot delete or modify files when set to read-only. This is granular permission control at the server layer — not just a UI toggle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vs OpenClaw:&lt;/strong&gt; No equivalent granular permission control exists in the browser extension model.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 2: Scope Limitation Document Access
&lt;/h3&gt;

&lt;p&gt;CraftBot allows you to define exactly which folders documents or search scopes the agent can access The agent cannot reach anything outside its defined boundary it's enforced at the architecture level You decide what the agent sees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vs OpenClaw:&lt;/strong&gt; OpenClaw is browser-scoped by nature CraftBot has local filesystem access but with enforced scope controls a meaningful distinction for sensitive work.&lt;/p&gt;




&lt;h3&gt;
  
  
  Test 3: Local Data Privacy No Cloud Leakage
&lt;/h3&gt;

&lt;p&gt;CraftBot's core and memory run entirely on local hardware Sensitive data never leaves your machine unless you explicitly connect an external API  and you control which APIs are connected With Ollama enabled even the model inference is local zero data transmitted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; For developers working with proprietary code, client data, or regulated industries, this is non-negotiable. Cloud-based agents simply cannot offer this guarantee.&lt;/p&gt;




&lt;h3&gt;
  
  
  ARCHITECTURE SUPPORTS TEST 4: Approval-Based Execution Human in the Loop
&lt;/h3&gt;

&lt;p&gt;CraftBot's proactive agent can initiate tasks autonomously but it requires explicit user approval before executing any sensitive operation. This human-in-the-loop design means the agent plans and proposes; you authorize and execute No silent background actions on critical operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;vs OpenClaw:&lt;/strong&gt; OpenClaw is purely reactive (you command, it responds) CraftBot is proactive but approval-gated a more capable and safer design for agentic workflows.&lt;/p&gt;




&lt;h3&gt;
  
  
  ENTERPRISE-GRADE SECURITY (TEST 5 PASS): Secret Links &amp;amp; Password Protection MCP Security
&lt;/h3&gt;

&lt;p&gt;Every MCP server connection in CraftBot uses cryptographically secure, unguessable URLs not predictable endpoints that could be discovered or brute-forced. For sensitive deployments OAuth 2.0 password protection can be layered on top adding a second authentication factor to every external integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; This is enterprise-grade security architecture — the kind you'd expect from production tooling, not an open-source desktop agent. It means CraftBot can be safely used in team or organizational environments where MCP endpoints need to be protected.&lt;/p&gt;




&lt;h2&gt;
  
  
  Head-to-Head Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;OpenClaw (Browser)&lt;/th&gt;
&lt;th&gt;CraftBot (Desktop)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;~1 minute&lt;/td&gt;
&lt;td&gt;~15-20 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Browser extension&lt;/td&gt;
&lt;td&gt;Desktop app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal interaction&lt;/td&gt;
&lt;td&gt;✅ Yes (power users)&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ease of use&lt;/td&gt;
&lt;td&gt;✅ Very easy&lt;/td&gt;
&lt;td&gt;Complex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface&lt;/td&gt;
&lt;td&gt;Chat&lt;/td&gt;
&lt;td&gt;Chat + Dashboard + Workspace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File management&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP support&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Native, 10+ servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local models (Ollama)&lt;/td&gt;
&lt;td&gt;Via Ollama&lt;/td&gt;
&lt;td&gt;✅ Auto-installs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability dashboard&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Full metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token usage tracking&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Real-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background/scheduled tasks&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create custom apps (Living UI)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works offline&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (with Ollama)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;Partially&lt;/td&gt;
&lt;td&gt;✅ Fully&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Which One Should You Choose?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose OpenClaw if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want AI assistance running in under 2 minutes&lt;/li&gt;
&lt;li&gt;Browser-based is sufficient for your workflow&lt;/li&gt;
&lt;li&gt;You're doing simple, reactive tasks&lt;/li&gt;
&lt;li&gt;You want zero terminal interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Choose CraftBot if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privacy matters — you want to know exactly what model runs your data&lt;/li&gt;
&lt;li&gt;You need local model support (Ollama) for offline or sensitive work&lt;/li&gt;
&lt;li&gt;You want file management, background tasks, or service integrations&lt;/li&gt;
&lt;li&gt;You want developer-grade observability over your AI agent&lt;/li&gt;
&lt;li&gt;You're building serious agentic workflows&lt;/li&gt;
&lt;li&gt;Open source and self-hosting matter to you&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;These tools aren't competing for the same user.&lt;/p&gt;

&lt;p&gt;OpenClaw is a hammer immediate simple good at what it does Great for getting started with AI assistance without friction.&lt;/p&gt;

&lt;p&gt;CraftBot is a workshop It costs more setup time demands more from you upfront and has real complexity to navigate But what you get is a local AI agent with observability file management MCP integrations offline model support and a genuine capability ceiling well above any browser extension.&lt;/p&gt;

&lt;p&gt;If you're serious about local AI agents and willing to invest the setup time, CraftBot is worth it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;OpenClaw&lt;/strong&gt; — Chrome Web Store (search "OpenClaw")&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;CraftBot GitHub&lt;/strong&gt; — &lt;a href="https://github.com/CraftOS-dev/CraftBot" rel="noopener noreferrer"&gt;github.com/CraftOS-dev/CraftBot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Have you used OpenClaw, CraftBot, or another local AI agent? What's been your experience especially around privacy and local models?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drop a comment I read every one. 👇&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; CraftBot provided access for testing. All opinions and testing are my own.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>security</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why AI-Generated Code Is Always Good Enough — And Never Great</title>
      <dc:creator>Harsh </dc:creator>
      <pubDate>Mon, 25 May 2026 12:35:50 +0000</pubDate>
      <link>https://dev.to/harsh2644/why-ai-generated-code-is-always-good-enough-and-never-great-4lhn</link>
      <guid>https://dev.to/harsh2644/why-ai-generated-code-is-always-good-enough-and-never-great-4lhn</guid>
      <description>&lt;p&gt;AI wrote a function for me last week It worked Tests passed Edge cases handled I shipped it.&lt;/p&gt;

&lt;p&gt;But something bothered me - not enough to rewrite it not enough to flag it in review Just enough to leave a small discomfort I couldn't name.&lt;/p&gt;

&lt;p&gt;The code was correct It wasn't good.&lt;/p&gt;

&lt;p&gt;Variable names were vague in a way that was technically fine but practically annoying The logic was nested one level deeper than it needed to be There were three places where a comment would have explained why not just what - and none of them had one The function did exactly its job but reading it felt like reading an instruction manual written by someone who had never used the product.&lt;/p&gt;

&lt;p&gt;AI writes code that works It rarely writes code that &lt;em&gt;sings&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This isn't a complaint about bugs or hallucinations or incorrect outputs It's about a different gap - the gap between "correct" and "elegant" Between no one can complain about this and this is genuinely well-made.&lt;/p&gt;

&lt;p&gt;Here's why that gap exists why AI can't cross it and why it matters more than most people are willing to say out loud.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Good Enough Actually Means
&lt;/h2&gt;

&lt;p&gt;Let's be specific. "Good enough" code:&lt;/p&gt;

&lt;p&gt;✅ Passes all tests&lt;br&gt;&lt;br&gt;
✅ Handles the happy path correctly&lt;br&gt;&lt;br&gt;
✅ Covers the common edge cases&lt;br&gt;&lt;br&gt;
✅ Runs without crashing&lt;br&gt;&lt;br&gt;
✅ Does exactly what was asked  &lt;/p&gt;

&lt;p&gt;It does the job Nobody will complain The ticket gets closed The feature ships.&lt;/p&gt;

&lt;p&gt;But "good enough" also means:&lt;/p&gt;

&lt;p&gt;❌ Hard to read on first glance - you have to trace it before you understand it&lt;br&gt;&lt;br&gt;
❌ Variable names that make you pause for half a second every time&lt;br&gt;&lt;br&gt;
❌ Nested logic that could be one level flatter without losing any clarity&lt;br&gt;&lt;br&gt;
❌ No comments explaining &lt;em&gt;why&lt;/em&gt; a decision was made only &lt;em&gt;what&lt;/em&gt; is happening&lt;br&gt;&lt;br&gt;
❌ Structured in a way that makes the next change slightly harder than it needed to be  &lt;/p&gt;

&lt;p&gt;The AI optimized for correctness It didn't optimize for &lt;em&gt;understanding&lt;/em&gt; It generated code that satisfies the requirements It didn't generate code that respects the reader.&lt;/p&gt;

&lt;p&gt;And here's the quiet danger: most of the time good enough is genuinely fine Not every function needs to be poetry Not every script needs to be a masterclass. But when every function is just barely passable when the entire codebase is optimized for no one can object to this rather than this is actually good - something shifts.&lt;/p&gt;

&lt;p&gt;The baseline lowers Slowly And you stop knowing what great even looks like.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Great Code Looks Like
&lt;/h2&gt;

&lt;p&gt;Great code isn't just correct It has specific qualities that go beyond passing tests:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Readable.&lt;/strong&gt; You understand it on the first read not the third You don't need to trace execution to follow the logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-documenting.&lt;/strong&gt; Variable names tell you what's happening Function names tell you why You could read it without knowing the surrounding context and still understand the intent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple - not simplistic.&lt;/strong&gt; The simplest thing that could work chosen deliberately Not the first thing that came to mind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Surprising in a good way.&lt;/strong&gt; There's a solution so clean it makes you smile Not clever for the sake of being clever just genuinely the right approach arrived at through judgment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A joy to change.&lt;/strong&gt; Adding a feature doesn't feel like surgery The structure anticipates the next developer.&lt;/p&gt;

&lt;p&gt;Great code feels crafted Not generated There's a difference - and you can feel it when you read it even if you can't always articulate why.&lt;/p&gt;

&lt;p&gt;AI can't write great code Not because it's not technically capable Because great code requires &lt;em&gt;taste&lt;/em&gt; It requires judgment A sense of what good looks like beyond correctness - what's appropriate what's overkill what's elegant for this specific situation in this specific codebase.&lt;/p&gt;

&lt;p&gt;Taste comes from experience From having read thousands of functions From having been burned by bad code From having fixed bugs at 2 AM in code that worked but was structured wrong in a way that made everything harder.&lt;/p&gt;

&lt;p&gt;AI has processed millions of functions But it hasn't &lt;em&gt;felt&lt;/em&gt; any of them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Gaps AI Can't Cross
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The Taste Gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI knows what works It doesn't know what's good Taste isn't pattern recognition it's judgment It's knowing when a familiar pattern is actually a bad fit for this specific situation even if it technically solves the problem It's knowing when the right solution would make the next developer's life harder.&lt;/p&gt;

&lt;p&gt;AI can approximate taste by matching patterns from high-quality training data But matching patterns isn't judgment It's mimicry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Context Gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Great code fits its context The same solution might be excellent in one codebase and genuinely terrible in another - depending on the team's conventions the performance constraints the expected lifetime of the code the experience level of whoever will maintain it.&lt;/p&gt;

&lt;p&gt;AI generates based on the prompt not based on the specific constraints of your project It doesn't know that your team hates clever abstractions It doesn't know this service gets called 10 million times a day It doesn't know this code will be owned by someone who joined last week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Consequence Gap&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI has never been paged at 2 AM It's never had to debug its own code six months after writing it It's never felt the cost of a bad abstraction the hours spent untangling something that seemed reasonable at the time.&lt;/p&gt;

&lt;p&gt;Great code comes partly from knowing what &lt;em&gt;not&lt;/em&gt; to do And that knowledge comes from pain from specific memorable experiences of code that bit back AI has no pain No scars No I'll never do that again moments&lt;/p&gt;

&lt;p&gt;These three gaps aren't bugs in the technology They're features of what it is AI optimizes for correctness Greatness requires something that correctness alone can't produce.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Good enough is completely fine for throwaway scripts For one-off automation For prototypes that will be deleted For functions no one will maintain.&lt;/p&gt;

&lt;p&gt;But when good enough becomes the default when every function in a production codebase is just passable the codebase quietly becomes something else. Harder to change Harder to understand Harder to debug. Harder to reason about.&lt;/p&gt;

&lt;p&gt;You stop knowing if the code is actually correct or just &lt;em&gt;looks&lt;/em&gt; correct.&lt;/p&gt;

&lt;p&gt;The real cost isn't performance It's &lt;em&gt;comprehension&lt;/em&gt; Bad code hides bugs. Good code reveals them. Great code structures things so bugs are harder to introduce in the first place.&lt;/p&gt;

&lt;p&gt;Every good enough function is a small tax The AI saved you ten minutes now. That structure will cost you an hour in three months when you need to change it Multiply that across a codebase where everything is just barely passable.&lt;/p&gt;

&lt;p&gt;The compound interest on good enough is expensive.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Doing Differently
&lt;/h2&gt;

&lt;p&gt;I'm not quitting AI That's not the answer and it's not what I want.&lt;/p&gt;

&lt;p&gt;But I'm changing how I use it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I treat AI output as a first draft.&lt;/strong&gt; Not the final answer A starting point that I'm responsible for finishing The AI writes the code I make it mine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I ask: Would I approve this if a junior wrote it?&lt;/strong&gt; Same standards Same code review The source of the code doesn't change the bar it has to meet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I refactor one function per AI-generated PR.&lt;/strong&gt; Just one Make it simpler Add the comment that explains why Rename the variable to something that doesn't make me pause Small acts of craftsmanship consistently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I remember that good enough compounds.&lt;/strong&gt; Today's it's fine ship it is next month's why is this so hard to change? The feeling of lowering standards is barely noticeable in the moment The cost shows up later.&lt;/p&gt;

&lt;p&gt;Will these habits make AI-generated code great? No But they stop me from forgetting what great looks like. And that matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Question
&lt;/h2&gt;

&lt;p&gt;When was the last time you saw AI-generated code that made you say - not that works not that's fine - but that's actually &lt;em&gt;clever&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;A solution that surprised you That you wouldn't have written that way yourself but immediately recognized as better.&lt;/p&gt;

&lt;p&gt;If you have an example share it in the comments I genuinely want to see what's possible at the top end.&lt;/p&gt;

&lt;p&gt;I'll go first - with the one piece of AI-generated code that actually impressed me.&lt;/p&gt;

&lt;p&gt;Your turn. 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>codequality</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
