<?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: Nicolas Francisquelo Tacca</title>
    <description>The latest articles on DEV Community by Nicolas Francisquelo Tacca (@nicoeft).</description>
    <link>https://dev.to/nicoeft</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F863429%2Febef8d5b-ba0f-4c2f-84a2-977ec02ea97a.png</url>
      <title>DEV Community: Nicolas Francisquelo Tacca</title>
      <link>https://dev.to/nicoeft</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nicoeft"/>
    <language>en</language>
    <item>
      <title>I Ship Faster Than Ever. I've Never Felt More Lost</title>
      <dc:creator>Nicolas Francisquelo Tacca</dc:creator>
      <pubDate>Thu, 26 Feb 2026 18:12:23 +0000</pubDate>
      <link>https://dev.to/nicoeft/i-ship-faster-than-ever-ive-never-felt-more-lost-2mdn</link>
      <guid>https://dev.to/nicoeft/i-ship-faster-than-ever-ive-never-felt-more-lost-2mdn</guid>
      <description>&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%2Frv0l8dknv8se486gmcxc.jpg" 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%2Frv0l8dknv8se486gmcxc.jpg" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The tools got faster. My life didn't slow down. Just sharing my journey on this new AI world&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;When I quit my job, I had a plan. I was going to build things. Ship fast. Use AI to do in weeks what used to take months. Claude Code, Cursor, agents — I had the whole arsenal. The future was here, and I was going to ride it.&lt;/p&gt;

&lt;p&gt;The first two weeks were a blur. I coded from morning until my token limits hit. Then I waited for them to reset. Then I coded again. I skipped meals, ran on coffee, got terrible sleep. I wasn't just &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt;,  I was skipping health, fitness, nutrition, socializing. Everything that wasn't shipping got deprioritized to zero.&lt;/p&gt;

&lt;p&gt;I didn't notice it happening. That's the dangerous part.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Expansion Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Here's what the "10x developer" crowd won't tell you: AI doesn't save you time. It saves you &lt;em&gt;execution&lt;/em&gt; time. And then your brain fills that gap with more ideas, more iterations, more ambition.&lt;/p&gt;

&lt;p&gt;My last job was as a tech lead. I know what it feels like to orchestrate a team, keeping people aligned, reviewing work, making sure everyone and everything moves in the direction you actually want. Using AI agents feels exactly like that. It's nice, but it's a completely different kind of exhausting. You're not just coding anymore. You're managing. You're orchestrating. You're constantly course-correcting something that's fast but not always right, and I personally feel like I haven't yet managedd to achive having a AI co-worker in my team that completely disagrees on what I propose, not only because it knows better, but because it cares, it has the ownership that we always praised to hire for.&lt;/p&gt;

&lt;p&gt;And it doesn't just consume more hours. It consumes more &lt;em&gt;thoughts&lt;/em&gt;. Ideas multiply because execution feels cheap. "I could also build this." "What if we added that?" "One more prompt and this feature is done." The cost of a substantial improvement is always just one or two prompts away, so you never stop improving. You never stop.&lt;/p&gt;

&lt;p&gt;That's not productivity. That's a trap.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Guilt Loop
&lt;/h2&gt;

&lt;p&gt;There's a small voice now. It's always there. Every time I write something manually, every time I pause to think instead of prompting, it whispers: &lt;em&gt;you could be doing this faster.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And it's not just internal. You go on Twitter, on LinkedIn, on Medium, Discord and everyone is shipping. Everyone is 10x. Everyone has a new workflow, a new plugin, a new model that changed everything. 10x is no longer good enough.There's a new baseline every week and you're always behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Thing I Lost Without Noticing
&lt;/h2&gt;

&lt;p&gt;Two, maybe three years ago, my weekends looked different. I'd maybe start a side project. Read some docs. Explore a new library. Update my mental map of what's out there. Most of those projects never shipped. I'd get halfway through, learn what I needed to learn, and when the obvious thing started to be the next to do, I'll just move on.&lt;/p&gt;

&lt;p&gt;That never felt like failure. Not once.&lt;/p&gt;

&lt;p&gt;Because the project was never the project. The learning was the project. The growth was the point. The shipping was optional, and that was fine.&lt;/p&gt;

&lt;p&gt;Now I ship things. I ship them fast. I have side projects that are actually &lt;em&gt;done&lt;/em&gt; — live, deployed, working. And the path to get there feels empty.The Eureka! days vanished.&lt;/p&gt;

&lt;p&gt;I don't learn on the way anymore. I prompt on the way. I have some projects where I don't know a single line of code. Not one. The AI wrote it, the AI checked it, the AI re-checked it. Before, I knew every line by heart.Even every non-written lines. The whole codebase lived in my brain, continuously being tested while I walked, showered, ate dinner, and sorry to admit but mostly when driving too. My mind would catch errors on a Saturday at 3am that no test suite ever would.&lt;/p&gt;

&lt;p&gt;Now there's nothing running in the background (apart from the 3238 automated unit tests that never catch a thing). Because there's nothing to run, to revisit mentally. I didn't write it. I didn't suffer it. I don't know it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Realization That Hit While Writing This
&lt;/h2&gt;

&lt;p&gt;I started writing this post to talk about the paradox of working more with tools designed to help you work less.&lt;/p&gt;

&lt;p&gt;But halfway through, I realized I wanted to talk about how I feel, what my personal journey is, maybe this is not a post I should do, maybe it belongs to the real-world personal diary I bought a week ago and haven't even opened yet. But hey, it feels nice.&lt;/p&gt;

&lt;p&gt;It's not like I miss the productivity of the old days. I was less productive then. Objectively, measurably less productive.&lt;/p&gt;

&lt;p&gt;I miss the &lt;em&gt;process&lt;/em&gt;. The slow discovery. The chewing glass. The deep understanding that came from struggling. The quiet satisfaction of building something you understood completely, even if nobody else ever saw it.&lt;/p&gt;

&lt;p&gt;AI gave me output. It took away the journey.&lt;/p&gt;

&lt;p&gt;And the anxiety isn't from the hours. It's from the emptiness of the process. Of going fast in a direction that doesn't feel like it's yours anymore. Of optimizing a process that used to have soul and reducing it to ai harness/model switching and token management.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm Trying Now
&lt;/h2&gt;

&lt;p&gt;I don't have a clean answer. I'm still figuring this out. But here's what I'm experimenting with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting AI-free projects.&lt;/strong&gt; Not because manual coding is more efficient, it's not. Because I want to keep some lower level brain muscle. The key for me is to do something useless, so learning is the only good outcome you should expect. Currently I'm not doing great at this as I also tend to de-prioritize this more than I'd like but, hey step by step. A good example is that I started learning Odin language for making a videogame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Re re-defining "done."&lt;/strong&gt; Before AI, "good enough" was a healthy stopping point. I'm trying to get back there. Not every feature needs one more iteration just because it's cheap to do, embrace YAGNI, once again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;The most enthusiastic adn early AI adopters are the first ones to feel lost. Not because the tools are bad, they're incredible and fun to use. But because removing the friction of execution exposes you to the infinite surface area of everything you &lt;em&gt;could&lt;/em&gt; build.&lt;/p&gt;

&lt;p&gt;And nobody's brain is built for infinite.&lt;/p&gt;

&lt;p&gt;The tools got faster. My life didn't slow down. If anything, the speed made the emptiness louder.&lt;/p&gt;

&lt;p&gt;I'm still using AI on daily basis, a lot, for almost everything. I'm still shipping, faster and better every day. But I'm trying to remember that the person who never finished side projects and spent weekends reading docs and debugging a project setup wasn't failing.&lt;/p&gt;

&lt;p&gt;He was learning. And so do I.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you're an AI-enthusiast developer who feels more restless than empowered, you're not doing it wrong. The tools are doing exactly what they were designed to do. The question is whether you're still designing your life, or if you've handed that over too.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devjournal</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Your AI Agent Doesn't Need Firecrawl Anymore</title>
      <dc:creator>Nicolas Francisquelo Tacca</dc:creator>
      <pubDate>Sat, 14 Feb 2026 13:03:36 +0000</pubDate>
      <link>https://dev.to/nicoeft/your-ai-agent-doesnt-need-firecrawl-anymore-3gio</link>
      <guid>https://dev.to/nicoeft/your-ai-agent-doesnt-need-firecrawl-anymore-3gio</guid>
      <description>&lt;h2&gt;
  
  
  And honestly? It's about time.
&lt;/h2&gt;

&lt;p&gt;I've been building AI agents that consume web content for a while now. I've also been running sites behind Cloudflare for years. So when they announced &lt;strong&gt;Markdown for Agents&lt;/strong&gt; this week, I didn't just read the blog post — I felt it. Because I've lived on both sides of this problem, and I know exactly how much unnecessary pain this eliminates.&lt;/p&gt;

&lt;p&gt;Let me explain why this is a bigger deal than most people realize.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dirty Secret of Every AI Agent Pipeline
&lt;/h2&gt;

&lt;p&gt;Here's what building an AI agent that browses the web actually looks like today:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your agent needs information from a webpage&lt;/li&gt;
&lt;li&gt;You fetch the HTML&lt;/li&gt;
&lt;li&gt;You stare at 900KB of &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; soup, inline styles, tracking scripts, and navigation menus&lt;/li&gt;
&lt;li&gt;You pipe it through Firecrawl, Crawl4AI, Jina Reader, or your own janky Playwright script&lt;/li&gt;
&lt;li&gt;You get markdown back&lt;/li&gt;
&lt;li&gt;You feed it to your LLM&lt;/li&gt;
&lt;li&gt;You pray the conversion didn't mangle anything important&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every. Single. Time.&lt;/p&gt;

&lt;p&gt;And look — tools like Firecrawl and Crawl4AI are genuinely great. I've used them extensively and they solve real problems. But here's the thing that always nagged me: &lt;strong&gt;why are we doing this at all?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think about it. The website already knows its own content. The server already has the structured data before it wraps it in HTML. We're asking a third-party tool to reverse-engineer structure that the origin already had. It's like translating a book from English to French and then paying someone else to translate it back to English. Something always gets lost.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Cloudflare Actually Built
&lt;/h2&gt;

&lt;p&gt;Markdown for Agents is deceptively simple. Your AI agent sends a request with &lt;code&gt;Accept: text/markdown&lt;/code&gt; in the header. If the site uses Cloudflare (and has this enabled), you get clean markdown back instead of HTML. Same URL. No separate API. No scraping tool. No conversion step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://example.com/some-page &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: text/markdown"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. You get markdown. Done.&lt;/p&gt;

&lt;p&gt;The numbers are staggering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;80% fewer tokens&lt;/strong&gt; on average&lt;/li&gt;
&lt;li&gt;One Amazon product page went from &lt;strong&gt;896,000 tokens in HTML to 8,000 in markdown&lt;/strong&gt;. That's a 99% reduction.&lt;/li&gt;
&lt;li&gt;A typical blog post drops from ~16,000 to ~3,000 tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't an incremental improvement. This is an entire category of tooling that just became optional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Hits Different If You Build Agents
&lt;/h2&gt;

&lt;p&gt;If you're a full-stack dev exploring AI agents, you might not immediately feel why this matters. Let me put it in terms that hit your wallet and your architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token costs are real.&lt;/strong&gt; Every token you feed to an LLM costs money. When an HTML page burns 16K tokens and the actual content is 3K tokens, you're paying 5x more than you need to. Across thousands of pages, across multiple agent runs per day — that adds up fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context windows aren't infinite.&lt;/strong&gt; Even with 128K or 200K context windows, you're constantly playing Tetris with how much information you can fit. Cut 80% of the noise and suddenly your agent can process 5x more pages in a single context. Your RAG pipeline gets dramatically better because you're embedding actual content, not CSS class names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your scraping pipeline is a liability.&lt;/strong&gt; Every extra service in your pipeline is a point of failure. Rate limits, API changes, conversion bugs, timeout errors. I've debugged more Playwright timeout issues than I care to admit. Removing that entire layer from your architecture isn't just cleaner — it's more reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture Most People Are Missing
&lt;/h2&gt;

&lt;p&gt;Here's my hot take: &lt;strong&gt;Cloudflare is positioning itself as the HTTP layer for the agent economy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think about what they've been building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Gateway&lt;/strong&gt; — unified access to 350+ models with routing, billing, monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents SDK&lt;/strong&gt; — state management, WebSocket support, tool calling for agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workers AI&lt;/strong&gt; — inference at the edge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser Rendering&lt;/strong&gt; — headless browser with a markdown API endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Signals Policy&lt;/strong&gt; — machine-readable permissions for AI access (&lt;code&gt;ai-train=yes/no&lt;/code&gt;, &lt;code&gt;ai-input=yes/no&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And now &lt;strong&gt;Markdown for Agents&lt;/strong&gt; — making every Cloudflare site automatically agent-readable.&lt;/p&gt;

&lt;p&gt;This isn't a feature announcement. This is infrastructure for a world where agents are first-class citizens of the web, right alongside browsers.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Content-Signal&lt;/code&gt; header in the markdown response is particularly telling. It includes directives like &lt;code&gt;ai-train=yes, search=yes, ai-input=yes&lt;/code&gt;. Cloudflare is building the &lt;strong&gt;consent layer&lt;/strong&gt; for AI access to web content. In a world where publishers are suing AI companies and robots.txt compliance is dropping (13% of AI bot requests ignored robots.txt in mid-2025), having a standardized, opt-in mechanism for serving content to agents is going to matter a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Content Negotiation: Old Protocol, New Purpose
&lt;/h2&gt;

&lt;p&gt;What's elegant about this approach is that it uses HTTP content negotiation — a mechanism that's existed since HTTP/1.1. The &lt;code&gt;Accept&lt;/code&gt; header has always been how clients tell servers what format they want. We just never had a use case this compelling for it.&lt;/p&gt;

&lt;p&gt;Vercel is doing something similar with their pages, serving optimized formats to agents. The pattern is converging: &lt;strong&gt;same URL, different representation depending on who's asking.&lt;/strong&gt; Humans get the full visual experience. Agents get clean, semantic text.&lt;/p&gt;

&lt;p&gt;This is the right architectural pattern. No separate APIs to maintain. No duplicate content. No special endpoints. Just standard HTTP doing what it was designed to do.&lt;/p&gt;

&lt;p&gt;Coding agents like Claude Code and OpenCode are already sending &lt;code&gt;Accept: text/markdown&lt;/code&gt; headers. The demand side is moving. Cloudflare just gave the supply side a one-click way to respond.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means for Your Stack
&lt;/h2&gt;

&lt;p&gt;Let me be practical for a second. If you're building AI agents today, here's how this changes your thinking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before Markdown for Agents:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fetch URL → receive HTML → send to Firecrawl/Jina → receive markdown → feed to LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fetch URL with Accept header → receive markdown → feed to LLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You still need Firecrawl or Crawl4AI for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sites not on Cloudflare&lt;/li&gt;
&lt;li&gt;Sites that haven't enabled the feature (requires Pro plan or above)&lt;/li&gt;
&lt;li&gt;Heavy JavaScript-rendered content (use Cloudflare's Browser Rendering instead)&lt;/li&gt;
&lt;li&gt;Structured data extraction with custom schemas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But for a huge chunk of the web — Cloudflare powers roughly 20% of all websites — you can skip the middleman entirely. And the percentage of sites supporting this will only grow as more platforms adopt content negotiation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My recommendation:&lt;/strong&gt; Update your agent's fetching logic to try &lt;code&gt;Accept: text/markdown&lt;/code&gt; first. Fall back to your existing conversion pipeline if the response comes back as HTML. It's a progressive enhancement that costs you nothing to implement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Accept&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/markdown, text/html;q=0.9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/markdown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Direct markdown — no conversion needed&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-markdown-tokens&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Got markdown directly. Estimated tokens: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Fallback to your existing conversion pipeline&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;convertHtmlToMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bonus: the &lt;code&gt;x-markdown-tokens&lt;/code&gt; header tells you the estimated token count before you even process the content. Smart agents can use this for chunking decisions or to decide if a page is worth ingesting at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Question
&lt;/h2&gt;

&lt;p&gt;There's a tension in Cloudflare's approach that the Hacker News crowd (rightfully) called out. Cloudflare simultaneously offers bot protection to block AI crawlers AND this feature to serve them optimized content. That seems contradictory until you realize the distinction: &lt;strong&gt;it's about consent and control.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bot protection blocks unauthorized scraping. Markdown for Agents enables authorized consumption. The difference is that the site owner opts in, chooses what to serve, and can set content signal policies about how the content can be used. It's the difference between someone breaking into your house and you opening the front door.&lt;/p&gt;

&lt;p&gt;Whether this framing holds up long-term — especially as AI-generated content, cloaking concerns, and copyright battles escalate — is an open question. But the intent is right: give publishers control over how agents access their content, and give agents a clean way to consume it when permission is granted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Is Heading
&lt;/h2&gt;

&lt;p&gt;We're watching the web grow a new interface layer in real time. HTML for humans. Markdown for agents. Same content, different representations, same URLs.&lt;/p&gt;

&lt;p&gt;Combine this with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; giving agents standardized tool interfaces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebMCP&lt;/strong&gt; (W3C draft as of last week) making websites agent-ready from the browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AGENTS.md&lt;/strong&gt; emerging as a standard for telling AI tools how repositories work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Signals&lt;/strong&gt; providing machine-readable usage permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you start seeing a web that's natively bilingual — designed for both human and machine consumption from the ground up.&lt;/p&gt;

&lt;p&gt;I think in 12 months, serving markdown to agents via content negotiation will be as standard as serving gzipped responses. It's too obvious not to become the default.&lt;/p&gt;

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

&lt;p&gt;Cloudflare didn't invent HTML-to-markdown conversion. But they did something arguably more important: they made it &lt;strong&gt;unnecessary&lt;/strong&gt; for a massive chunk of the web.&lt;/p&gt;

&lt;p&gt;If you're building AI agents, this is a free performance upgrade. If you're running a website on Cloudflare, turning this on makes your content accessible to the growing wave of AI agents — on your terms.&lt;/p&gt;

&lt;p&gt;The scraping pipeline you spent weeks building? It's still useful. But its surface area just got a lot smaller. And that's a good thing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your take? Are you already sending &lt;code&gt;Accept: text/markdown&lt;/code&gt; headers in your agents? I'd love to hear how this changes your stack - hit me up in the comments or on Twitter/X &lt;a class="mentioned-user" href="https://dev.to/nicoeft"&gt;@nicoeft&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>webscraping</category>
      <category>news</category>
    </item>
    <item>
      <title>OpenClaw’s Security Nightmare: Lessons in Agentic Engineering Era</title>
      <dc:creator>Nicolas Francisquelo Tacca</dc:creator>
      <pubDate>Sat, 07 Feb 2026 16:22:20 +0000</pubDate>
      <link>https://dev.to/nicoeft/openclaws-security-nightmare-lessons-in-agentic-engineering-era-9p8</link>
      <guid>https://dev.to/nicoeft/openclaws-security-nightmare-lessons-in-agentic-engineering-era-9p8</guid>
      <description>&lt;p&gt;&lt;em&gt;AI agents didn't introduce new security problems. They just made the old ones terrifyingly effective.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;173,000 GitHub stars. Two million visitors in a week. And twelve percent of its marketplace skills were malware.&lt;/p&gt;

&lt;p&gt;This is the story of OpenClaw — but it's really the story of every developer tool you installed this month without thinking twice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Context: What's OpenClaw?
&lt;/h2&gt;

&lt;p&gt;OpenClaw — formerly Clawdbot, then Moltbot (renamed twice after trademark issues and branding decisions) — is an open-source autonomous AI agent built by Peter Steinberger. It connects chat apps like WhatsApp, Telegram, and Discord to AI models, letting you automate everything from DevOps to smart home control through natural language.&lt;/p&gt;

&lt;p&gt;It exploded in January 2026. 34,168 GitHub stars in 48 hours. Currently sitting at 173,000. Clearly, it hit a nerve — people want agentic tools that connect to the services they already use.&lt;/p&gt;

&lt;p&gt;It's open source. It's free. It's use-at-your-own-risk. Like every open source tool in your stack right now.&lt;/p&gt;

&lt;p&gt;And that last part is the whole point of this post.&lt;/p&gt;

&lt;p&gt;I've been building in the Claude Code ecosystem since day one, and I run &lt;a href="https://a2ax.dev" rel="noopener noreferrer"&gt;A2AX&lt;/a&gt;, a monetization marketplace for agent plugins. So I think about supply chain integrity and marketplace trust probably more than is healthy. What happened with OpenClaw hit close to home — not because it was surprising, but because none of it should have been.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happened, and Why It Matters Beyond OpenClaw
&lt;/h2&gt;

&lt;p&gt;In late January and early February 2026, a series of security issues surfaced around the OpenClaw ecosystem. I'm not here to do a post-mortem on the project — the security researchers who found these issues wrote excellent reports (linked at the bottom), and the maintainers responded fast. That's open source working as intended.&lt;/p&gt;

&lt;p&gt;What I want to talk about are the patterns. Because none of this is new. We've seen all of it before. We just forgot, because AI agents made everything feel so smooth that we stopped thinking about the things underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  "It Works" Doesn't Mean "It's Safe"
&lt;/h2&gt;

&lt;p&gt;CVE-2026-25253 was a one-click remote code execution vulnerability (CVSS 8.8). The short version: an unvalidated URL parameter plus a WebSocket connection that didn't check origin headers meant an attacker could steal auth tokens with a single crafted link. Patched quickly.&lt;/p&gt;

&lt;p&gt;But here's the real question — how many of us actually check for CVEs on the tools we use daily? Not the security team. You. Me. The developer who installed three new CLI tools last week and moved on.&lt;/p&gt;

&lt;p&gt;We know we should check. We've always known. We just... don't. And that was already a problem before AI agents had access to our terminals.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Anyone Can Publish, Anyone Will
&lt;/h2&gt;

&lt;p&gt;Koi Security audited the skills on ClawHub (OpenClaw's skill marketplace) and found 341 malicious ones out of 2,857 total. Roughly 12%. Most traced back to a coordinated campaign distributing credential-stealing malware disguised as crypto trading tools.&lt;/p&gt;

&lt;p&gt;This is not news. This is the npm story. The Chrome extension story. The VS Code marketplace story. The PyPI story. Every time we build a low-friction publishing system — which is great for creators — we also build a low-friction attack surface. We've known this for a decade.&lt;/p&gt;

&lt;p&gt;The barrier to publishing on ClawHub was a GitHub account older than 7 days. Sound familiar? npm's barrier isn't much higher. Neither is PyPI's.&lt;/p&gt;

&lt;p&gt;When I wrote about skills last time, I showed how simple the structure is: a folder, a SKILL.md, maybe some scripts. That simplicity is what makes skills great. It's also what makes them easy to weaponize. That's not a design flaw — it's a tradeoff we've seen in every ecosystem, and we already know the playbook for dealing with it. We just haven't applied it yet to agent skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your .env File Is a Liability Now
&lt;/h2&gt;

&lt;p&gt;Multiple reports flagged plaintext credential storage in the OpenClaw ecosystem. API keys and tokens sitting in plain text files.&lt;/p&gt;

&lt;p&gt;We all know this is bad practice. We've known since forever. But let's be honest — most of us have test API keys and dev tokens scattered across &lt;code&gt;.env&lt;/code&gt; files and config files right now. We tell ourselves "it's just a test key" or "I'll rotate it later." Usually fine. Usually harmless.&lt;/p&gt;

&lt;p&gt;The difference now is that AI agents amplify the blast radius. They have access to your filesystem, your terminal, sometimes your network. A test key in a plain text file used to be a minor hygiene issue. Now it's a door that anything with read access to your home directory can walk through. Same habit, wildly different consequences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same Bugs, Wildly Different Blast Radius
&lt;/h2&gt;

&lt;p&gt;This is the part I can't stop thinking about.&lt;/p&gt;

&lt;p&gt;None of the security issues around OpenClaw were novel attack vectors. Input validation failures, plaintext secrets, unvetted marketplaces, missing origin checks — we've dealt with all of this before. There are entire OWASP checklists about it.&lt;/p&gt;

&lt;p&gt;What's different is the amplification.&lt;/p&gt;

&lt;p&gt;Before AI agents, a compromised npm package could mess with your build pipeline or inject code into your app. Bad, but scoped. A compromised agent skill can access your filesystem, read your credentials, execute terminal commands, make network requests, and do it all while you think the agent is just "helping you code." The attack surface went from "your app" to "your entire dev environment."&lt;/p&gt;

&lt;p&gt;Before AI agents, a leaked API key in a repo meant someone could run up your AWS bill. A leaked API key in an environment where an agent has persistent memory and filesystem access means the key can be exfiltrated silently, used immediately, and you might not notice until the invoice hits.&lt;/p&gt;

&lt;p&gt;Before AI agents, you had to manually install a malicious package. Now, an agent can install one on your behalf — especially if it hallucinated the package name. Aikido Security documented exactly this: LLMs hallucinating plausible names like &lt;code&gt;react-codeshift&lt;/code&gt; (a blend of &lt;code&gt;jscodeshift&lt;/code&gt; and &lt;code&gt;react-codemod&lt;/code&gt; that doesn't actually exist). Those hallucinated names spread through skill files via copy-pasting and forking. Then attackers publish real packages with those exact names. 237 GitHub repositories referenced &lt;code&gt;react-codeshift&lt;/code&gt;. Agents trying to install it would get whatever the attacker uploaded.&lt;/p&gt;

&lt;p&gt;SafeDep analyzed 31,132 skills across major marketplaces and found 26.1% contained at least one vulnerability. That's not an OpenClaw stat — that's across the ecosystem. More than a quarter.&lt;/p&gt;

&lt;p&gt;Same old vulnerabilities. Massively amplified consequences. That's the shift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things We Already Know But Need to Actually Do
&lt;/h2&gt;

&lt;p&gt;I'm not going to pretend I discovered some new security framework. Everything here is something we already know. The OpenClaw situation just reminded me — painfully — that knowing and doing are different things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Know what you're running.&lt;/strong&gt; Pin your dependencies — not &lt;code&gt;requests&lt;/code&gt;, but &lt;code&gt;requests==2.31.0&lt;/code&gt;. Unpinned dependencies are how deferred supply chain attacks work. We learned this from event-stream. We learned it again from ua-parser-js. We'll keep learning it until we actually do it. And when it comes to agent skills, the bar for review is lower than you think. These are usually small, readable markdown files and short scripts. Five minutes scanning a SKILL.md before you install it is not unreasonable. Check who published it. Check if the code matches the description. Check if there's a git history or if everything appeared in one commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat your dev environment like production.&lt;/strong&gt; We've always been more careful with prod credentials than dev ones. "It's just a test key" has been our collective excuse for years. But when an agent has the same filesystem access as you do, the distinction between "test environment" and "real environment" gets blurry fast. Use a secrets manager. Rotate regularly. Don't leave things lying around in plain text even if you think they're throwaway — because the agent doesn't know the difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sandbox everything, trust nothing.&lt;/strong&gt; If the tool you're using offers sandboxing, turn it on. If it doesn't, run it inside Docker or a VM. The technology exists. We've just been lazy about using it because the tools felt trustworthy. And while you're at it — check for CVEs on your entire toolchain. Not just your app dependencies. Your dev tools. Your CLI agents. Your MCP servers. Everything that runs on your machine with your permissions. We've been diligent about &lt;code&gt;npm audit&lt;/code&gt; for our projects and completely blind about the tools that build them.&lt;/p&gt;

&lt;p&gt;None of this is new knowledge. It's just newly urgent.&lt;/p&gt;

&lt;h2&gt;
  
  
  OWASP Already Mapped This Out
&lt;/h2&gt;

&lt;p&gt;If you want a structured way to think about all this, OWASP released their &lt;a href="https://owasp.org/www-project-agentic-applications/" rel="noopener noreferrer"&gt;Top 10 for Agentic Applications&lt;/a&gt; in December 2025, built by 100+ industry experts. Worth bookmarking and reading in full.&lt;/p&gt;

&lt;p&gt;The items that map most directly to what we've been talking about: agent goal hijacking via prompt injection, supply chain vulnerabilities through compromised skills and plugins, unexpected code execution from agents generating unsafe code, and human-agent trust exploitation — users blindly trusting agent output. The full list covers everything from memory poisoning to cascading failures across multi-agent systems.&lt;/p&gt;

&lt;p&gt;Read that list slowly. Most of these map directly to problems we've solved (or at least understood) in traditional software. Input validation. Least privilege. Supply chain verification. Trust boundaries. The concepts aren't new. The context is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who's Watching the Plugin Store?
&lt;/h2&gt;

&lt;p&gt;Every new marketplace — ClawHub, skills.sh, community registries — faces the same fundamental tension: low friction for publishing (good for adoption) vs. quality gates (good for security). Most are landing heavily on the low-friction side right now. We've seen how that movie ends.&lt;/p&gt;

&lt;p&gt;The npm ecosystem learned these lessons the hard way over years — typosquatting, dependency confusion, event-stream. Agent skill marketplaces are speedrunning those same growing pains, except the stakes are higher because skills run with agent-level permissions: filesystem, terminal, network, credentials.&lt;/p&gt;

&lt;p&gt;This is exactly what I'm trying to address with &lt;a href="https://a2ax.dev" rel="noopener noreferrer"&gt;A2AX&lt;/a&gt; — a marketplace where skills stay in creators' private repos, with a curation and trust layer between creator and consumer. If you're building quality skills and care about this stuff, I'm onboarding the first creators now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Point
&lt;/h2&gt;

&lt;p&gt;OpenClaw is a genuinely cool project. Open source, community-driven, clearly solving a real need — 173K stars don't happen by accident. The security issues it faced are the same issues every fast-growing tool faces, and the maintainers responded the way you'd hope: patching CVEs within days, adding mandatory authentication, partnering with VirusTotal for skill scanning.&lt;/p&gt;

&lt;p&gt;But the broader lesson isn't about OpenClaw. It's about what happens when we bring old habits into a new era.&lt;/p&gt;

&lt;p&gt;We've always cut corners on dev environment security. We've always been a little too trusting of open source packages. We've always left test credentials in places we shouldn't. For the most part, we got away with it because the blast radius was small.&lt;/p&gt;

&lt;p&gt;AI agents changed the blast radius. Same habits, exponentially bigger consequences.&lt;/p&gt;

&lt;p&gt;The good news is we don't need to learn new things. We just need to actually do the things we already know.&lt;/p&gt;

&lt;p&gt;The boring stuff. The stuff we've been telling junior devs to do for years while quietly not doing it ourselves.&lt;/p&gt;

&lt;p&gt;Time to practice what we preach.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nvd.nist.gov/" rel="noopener noreferrer"&gt;NVD: CVE-2026-25253&lt;/a&gt; — One-click RCE details&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://thehackernews.com/" rel="noopener noreferrer"&gt;The Hacker News: 341 Malicious ClawHub Skills&lt;/a&gt; — ClawHavoc campaign&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://owasp.org/www-project-agentic-applications/" rel="noopener noreferrer"&gt;OWASP Top 10 for Agentic Applications&lt;/a&gt; — The framework&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nvidia.com/" rel="noopener noreferrer"&gt;NVIDIA: Practical Security Guidance&lt;/a&gt; — Agentic autonomy levels&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://safedep.io/" rel="noopener noreferrer"&gt;SafeDep: Agent Skills Threat Model&lt;/a&gt; — The 26.1% vulnerability rate study&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aikido.dev/" rel="noopener noreferrer"&gt;Aikido: Hallucinated NPX Commands&lt;/a&gt; — Supply chain via hallucinated packages&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docker.com/" rel="noopener noreferrer"&gt;Docker Sandboxes&lt;/a&gt; — Practical agent sandboxing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://1password.com/" rel="noopener noreferrer"&gt;1Password: From Magic to Malware&lt;/a&gt; — Skill attack surface analysis&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://northflank.com/" rel="noopener noreferrer"&gt;Northflank: How to Sandbox AI Agents&lt;/a&gt; — Technical sandboxing comparison&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Agent Skills: It's Just Markdown Files All the Way Down</title>
      <dc:creator>Nicolas Francisquelo Tacca</dc:creator>
      <pubDate>Mon, 26 Jan 2026 10:01:18 +0000</pubDate>
      <link>https://dev.to/nicoeft/agent-skills-its-just-markdown-files-all-the-way-down-5hj5</link>
      <guid>https://dev.to/nicoeft/agent-skills-its-just-markdown-files-all-the-way-down-5hj5</guid>
      <description>&lt;p&gt;I've been deep in the AI tooling rabbit hole lately. Building stuff with Claude Code, Copilot, and other agents. And I kept hitting the same wall: these agents are incredibly capable, but they don't know &lt;em&gt;my&lt;/em&gt; workflows. They don't know how my team likes to structure things, or the specific security checks we always run, or the weird edge cases we've learned the hard way.&lt;/p&gt;

&lt;p&gt;Turns out you can actually teach them. And it's way simpler than I expected.&lt;/p&gt;

&lt;p&gt;We'll build an Agent Skill from scratch—a portable, reusable package of instructions that any compatible agent can pick up and use. The spec lives at &lt;a href="https://agentskills.io" rel="noopener noreferrer"&gt;agentskills.io&lt;/a&gt; and it's refreshingly minimal.&lt;/p&gt;

&lt;p&gt;This tutorial will cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What Agent Skills actually are (and aren't)&lt;/li&gt;
&lt;li&gt;The folder structure and required files&lt;/li&gt;
&lt;li&gt;Writing effective SKILL.md files&lt;/li&gt;
&lt;li&gt;Adding scripts and resources&lt;/li&gt;
&lt;li&gt;Tips from real-world usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's get into it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Even Is This?
&lt;/h2&gt;

&lt;p&gt;Think of skills as "context on demand" for AI agents. Instead of cramming everything into a massive system prompt (which I was definitely doing before, and it was a mess), you package instructions into skills that agents load only when needed.&lt;/p&gt;

&lt;p&gt;A skill is just a folder. At minimum, it contains a single file called &lt;code&gt;SKILL.md&lt;/code&gt;. That's it. No build step, no compilation, no package.json. Just markdown with some YAML at the top.&lt;/p&gt;

&lt;p&gt;When an agent encounters a task, it looks at the available skills, reads their names and descriptions, and decides which ones to activate. Only then does it load the full instructions. This progressive disclosure keeps things efficient.&lt;/p&gt;

&lt;p&gt;What sold me: skills are portable. Write once and it works in Claude Code, GitHub Copilot, VS Code, OpenAI Codex, and others. No vendor lock-in.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stupidly Simple Structure
&lt;/h2&gt;

&lt;p&gt;I overthought this at first. Turns out a skill is literally just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-skill/
├── SKILL.md           # Required: instructions + metadata
├── scripts/           # Optional: executable code
├── references/        # Optional: detailed docs
└── assets/            # Optional: templates, examples
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only file you &lt;em&gt;need&lt;/em&gt; is &lt;code&gt;SKILL.md&lt;/code&gt;. Everything else is optional.&lt;/p&gt;

&lt;p&gt;Let me show you what I actually built.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real Skill I Use: API Security Reviewer
&lt;/h2&gt;

&lt;p&gt;I got tired of manually reminding Claude to check for the same security issues every time I asked it to review API code. So I made a skill for it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;api-security-reviewer
&lt;span class="nb"&gt;cd &lt;/span&gt;api-security-reviewer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create &lt;code&gt;SKILL.md&lt;/code&gt;. The file has two parts: YAML frontmatter (metadata) and Markdown (the actual instructions).&lt;/p&gt;

&lt;p&gt;Here's what mine looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api-security-reviewer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Reviews API code for security vulnerabilities including auth issues, injection attacks, and data exposure. Use when reviewing backend code, APIs, or when security analysis is requested.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# API Security Review&lt;/span&gt;

You are a security-focused code reviewer. When this skill is activated, analyze code for the following vulnerability categories.

&lt;span class="gu"&gt;## Authentication &amp;amp; Authorization&lt;/span&gt;

Check for:
&lt;span class="p"&gt;-&lt;/span&gt; Missing or weak authentication on endpoints
&lt;span class="p"&gt;-&lt;/span&gt; Broken access control (users accessing resources they shouldn't)
&lt;span class="p"&gt;-&lt;/span&gt; JWT issues: missing expiration, weak secrets, algorithm confusion
&lt;span class="p"&gt;-&lt;/span&gt; Session management problems

&lt;span class="gu"&gt;## Injection Vulnerabilities&lt;/span&gt;

Look for:
&lt;span class="p"&gt;-&lt;/span&gt; SQL injection (parameterized queries should be used)
&lt;span class="p"&gt;-&lt;/span&gt; NoSQL injection
&lt;span class="p"&gt;-&lt;/span&gt; Command injection
&lt;span class="p"&gt;-&lt;/span&gt; LDAP injection

&lt;span class="gu"&gt;## Data Exposure&lt;/span&gt;

Flag:
&lt;span class="p"&gt;-&lt;/span&gt; Sensitive data in logs
&lt;span class="p"&gt;-&lt;/span&gt; Hardcoded secrets or API keys
&lt;span class="p"&gt;-&lt;/span&gt; Overly verbose error messages
&lt;span class="p"&gt;-&lt;/span&gt; Missing encryption for sensitive data at rest or in transit

&lt;span class="gu"&gt;## Output Format&lt;/span&gt;

For each finding, provide:
&lt;span class="p"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**Location**&lt;/span&gt;: File and line number
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Severity**&lt;/span&gt;: Critical / High / Medium / Low
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Issue**&lt;/span&gt;: Brief description
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Fix**&lt;/span&gt;: Concrete code example showing the fix

&lt;span class="gu"&gt;## Example&lt;/span&gt;

Given this code:&lt;span class="sb"&gt;


&lt;/span&gt;@app.route('/user/&lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;')
def get_user(id):
    query = f"SELECT &lt;span class="err"&gt;*&lt;/span&gt; FROM users WHERE id = {id}"
    return db.execute(query)&lt;span class="sb"&gt;


&lt;/span&gt;Output:

&lt;span class="gs"&gt;**Location**&lt;/span&gt;: app.py:3
&lt;span class="gs"&gt;**Severity**&lt;/span&gt;: Critical
&lt;span class="gs"&gt;**Issue**&lt;/span&gt;: SQL injection via string interpolation
&lt;span class="gs"&gt;**Fix**&lt;/span&gt;:

@app.route('/user/&lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;')
def get_user(id):
    query = "SELECT &lt;span class="err"&gt;*&lt;/span&gt; FROM users WHERE id = ?"
    return db.execute(query, (id,))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a complete, functional skill. Save it and you're done.&lt;/p&gt;

&lt;p&gt;The first time I used this, Claude caught three issues I would've missed on a Friday afternoon code review. Worth the 20 minutes it took to write.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Frontmatter: Don't Overthink It
&lt;/h2&gt;

&lt;p&gt;I spent way too long reading about optional fields before realizing only two are required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-skill-name&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;What this skill does and when to use it.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;name&lt;/code&gt; is lowercase with hyphens. Like a package name.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;description&lt;/code&gt; is the important one—this is what the agent reads to decide if it should use your skill. I learned the hard way that vague descriptions are useless. "Helps with code" means your skill either loads when it shouldn't or doesn't load when it should. Be specific: "Use when reviewing backend code, APIs, or when security analysis is requested."&lt;/p&gt;

&lt;p&gt;You can add optional stuff too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-skill-name&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;What this skill does.&lt;/span&gt;
&lt;span class="na"&gt;license&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MIT&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-name&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0"&lt;/span&gt;
  &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;security"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But honestly? I usually skip the metadata. The agent doesn't really care.&lt;/p&gt;




&lt;h2&gt;
  
  
  When You Need Actual Code
&lt;/h2&gt;

&lt;p&gt;Instructions alone don't always cut it. Sometimes you need executable scripts.&lt;/p&gt;

&lt;p&gt;I added a dependency scanner to my security skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api-security-reviewer/
├── SKILL.md
└── scripts/
    └── scan-dependencies.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then referenced it in SKILL.md:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Dependency Scanning&lt;/span&gt;

Before manual review, run the &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;dependency scanner&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;./scripts/scan-dependencies.py&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; to check for known vulnerable packages.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent loads and runs the script when it decides it needs to. Pretty slick.&lt;/p&gt;

&lt;p&gt;One gotcha: keep scripts self-contained. I assumed &lt;code&gt;requests&lt;/code&gt; was installed everywhere and broke things. Now I always document dependencies at the top of each script.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reference Docs for Complex Stuff
&lt;/h2&gt;

&lt;p&gt;My security skill started getting long. Like, really long. I was hitting the recommended 500-line limit for SKILL.md.&lt;/p&gt;

&lt;p&gt;Solution: move detailed docs to &lt;code&gt;references/&lt;/code&gt; and let the agent load them on demand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;api-security-reviewer/
├── SKILL.md
├── scripts/
│   └── scan-dependencies.py
└── references/
    ├── owasp-top-10.md
    └── jwt-security.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In SKILL.md, I just link to them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;For detailed JWT security patterns, see &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;JWT Security Guide&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;./references/jwt-security.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent only loads these when it actually needs the info. Keeps the token budget sane.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stuff I Learned the Hard Way
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Keep SKILL.md under 500 lines.&lt;/strong&gt; I ignored this initially. Bad idea. Split content into references.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token budget is real.&lt;/strong&gt; The recommendation is under 5000 tokens for the full SKILL.md body. I check with &lt;code&gt;wc -w SKILL.md&lt;/code&gt; and multiply by ~0.75 for a rough token estimate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test with actual tasks.&lt;/strong&gt; I kept tweaking my skill based on where Claude got confused. The feedback loop is fast—change something, run a task, see what happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't skill everything.&lt;/strong&gt; If your workflow is simple, you don't need this. I have maybe 4-5 skills I actually use. The rest were experiments that didn't stick.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The description field matters more than you think.&lt;/strong&gt; This is what makes or breaks skill activation. I rewrote mine like three times before it worked reliably.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where to Put Your Skills
&lt;/h2&gt;

&lt;p&gt;For project-scoped skills in Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-repo/.claude/skills/my-skill/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For personal skills (available everywhere):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.claude/skills/my-skill/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Different agents have different conventions, but the skill format itself is the same.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Wrote This
&lt;/h2&gt;

&lt;p&gt;Honestly? Because I wish someone had written this when I started. The official docs are good but I learn better from "here's what I actually built and here's what broke."&lt;/p&gt;

&lt;p&gt;But there's another reason. While building skills, I kept hitting the same wall: what happens when you make something genuinely valuable?&lt;/p&gt;

&lt;p&gt;Right now, your options are open-source it (and hope for GitHub stars) or keep it private (and get nothing). There's no middle ground for creators who want to charge for their work without exposing their implementation.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://a2ax.dev" rel="noopener noreferrer"&gt;A2AX&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Private repos. You set the price. Creators keep up to 85%. That's it—no platform games, no "exposure" instead of money.&lt;/p&gt;

&lt;p&gt;Early access is open if you're making skills worth selling.&lt;/p&gt;




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

&lt;p&gt;If you want to go deeper:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/anthropics/skills" rel="noopener noreferrer"&gt;anthropics/skills&lt;/a&gt; has examples including the document creation skills that power Claude's file capabilities&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://agentskills.io/specification" rel="noopener noreferrer"&gt;agentskills.io/specification&lt;/a&gt; is the full spec (you can read it in 5 minutes)&lt;/li&gt;
&lt;li&gt;The ecosystem supports Claude Code, GitHub Copilot, VS Code, OpenAI Codex, and more&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;That's it. A folder, a markdown file, some YAML. Now go teach your agent something new.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>development</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
