<?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: Farooq Shabbir</title>
    <description>The latest articles on DEV Community by Farooq Shabbir (@farooqshabbir).</description>
    <link>https://dev.to/farooqshabbir</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%2F3818391%2F3426f574-55b5-4120-91c6-420f89128bc7.png</url>
      <title>DEV Community: Farooq Shabbir</title>
      <link>https://dev.to/farooqshabbir</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/farooqshabbir"/>
    <language>en</language>
    <item>
      <title>I Built a 24/7 Freelance Operations Agent with OpenClaw — It Runs My Business While I Sleep</title>
      <dc:creator>Farooq Shabbir</dc:creator>
      <pubDate>Thu, 23 Apr 2026 11:44:49 +0000</pubDate>
      <link>https://dev.to/farooqshabbir/i-built-a-247-freelance-operations-agent-with-openclaw-it-runs-my-business-while-i-sleep-4lde</link>
      <guid>https://dev.to/farooqshabbir/i-built-a-247-freelance-operations-agent-with-openclaw-it-runs-my-business-while-i-sleep-4lde</guid>
      <description>&lt;p&gt;&lt;em&gt;No Python. No Node. Three skill files, one Lobster workflow, and my consultancy now runs on autopilot.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;A fully autonomous freelance operations agent I call &lt;strong&gt;Claw-Ops&lt;/strong&gt; that handles the three biggest time drains in running a dev consultancy:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Morning dev briefing&lt;/strong&gt; — PR triage from GitHub, action items pulled from Slack, delivered to Telegram at 8AM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client status drafting&lt;/strong&gt; — every Friday, reads merged PRs + closed Linear tickets, writes the weekly update email, sends me the draft to approve with one tap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inbox zero on follow-ups&lt;/strong&gt; — detects unanswered client emails older than 48 hours, drafts a polite follow-up, asks me on Telegram whether to send it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before this: ~9 hours a week on context-switching, manual status writing, and email chasing.&lt;br&gt;
After: I review a Telegram message in the morning and say yes or no.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw&lt;/strong&gt; (gateway running on a Mac Mini, always on)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude via Anthropic API&lt;/strong&gt; (the brain)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram&lt;/strong&gt; (my interface — DMs and one-tap approvals)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three custom skills&lt;/strong&gt; + &lt;strong&gt;one Lobster workflow&lt;/strong&gt; (no external services beyond what I already used)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zero new subscriptions. Zero new dashboards. Everything surfaces in the app I already have open: Telegram.&lt;/p&gt;


&lt;h2&gt;
  
  
  Skill 1: &lt;code&gt;pr-morning-digest&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# pr-morning-digest&lt;/span&gt;

When triggered (or on schedule), check all GitHub repos accessible via the gh CLI.

Find pull requests that match ANY of these:
&lt;span class="p"&gt;-&lt;/span&gt; Open more than 24 hours with no review activity
&lt;span class="p"&gt;-&lt;/span&gt; CI checks failing
&lt;span class="p"&gt;-&lt;/span&gt; Labeled "urgent" or "blocking"

For each match, output:
&lt;span class="p"&gt;-&lt;/span&gt; Repo name
&lt;span class="p"&gt;-&lt;/span&gt; PR title and number
&lt;span class="p"&gt;-&lt;/span&gt; Current status (awaiting review / CI failing / etc.)
&lt;span class="p"&gt;-&lt;/span&gt; Direct link

Format as a clean priority list, most urgent first.
Send the result to Telegram.
If nothing matches, send: "All clear — no PRs need attention."

Tools: shell (gh CLI)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Skill 2: &lt;code&gt;slack-action-extractor&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# slack-action-extractor&lt;/span&gt;

When triggered, read the last 100 messages from the #engineering Slack channel
using the Slack CLI or API.

Identify messages that:
&lt;span class="p"&gt;-&lt;/span&gt; Mention my name or @handle
&lt;span class="p"&gt;-&lt;/span&gt; Contain task language ("can you", "please", "need you to", "by EOD", "by Friday")
&lt;span class="p"&gt;-&lt;/span&gt; Are from the last 24 hours

For each identified message:
&lt;span class="p"&gt;-&lt;/span&gt; Extract the action item in one sentence
&lt;span class="p"&gt;-&lt;/span&gt; Note who asked and when
&lt;span class="p"&gt;-&lt;/span&gt; Note any deadline mentioned (or flag as "no deadline specified")

Append results to ~/tasks.md under today's date heading.
If new items were found, send a Telegram summary.
If nothing new, do nothing.

Tools: shell (Slack CLI), file write
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Skill 3: &lt;code&gt;client-status-drafter&lt;/code&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# client-status-drafter&lt;/span&gt;

Every Friday at 4PM, do the following:
&lt;span class="p"&gt;
1.&lt;/span&gt; Run &lt;span class="sb"&gt;`gh pr list --state merged --limit 20`&lt;/span&gt; to get this week's merged PRs
&lt;span class="p"&gt;2.&lt;/span&gt; Read closed Linear tickets from the past 7 days via the Linear CLI
&lt;span class="p"&gt;3.&lt;/span&gt; From memory, recall the client name and their current project context
&lt;span class="p"&gt;4.&lt;/span&gt; Draft a plain-English weekly status email:
&lt;span class="p"&gt;   -&lt;/span&gt; 2-3 sentences on what shipped
&lt;span class="p"&gt;   -&lt;/span&gt; 1 sentence on what's in progress
&lt;span class="p"&gt;   -&lt;/span&gt; 1 sentence on anything that needs client input or decision
&lt;span class="p"&gt;   -&lt;/span&gt; Professional but warm tone — no bullet points, just prose
&lt;span class="p"&gt;5.&lt;/span&gt; Save draft to ~/drafts/status-{YYYY-MM-DD}.md
&lt;span class="p"&gt;6.&lt;/span&gt; Send me the draft on Telegram with two options:
&lt;span class="p"&gt;   -&lt;/span&gt; Reply "send" to send it via Gmail immediately
&lt;span class="p"&gt;   -&lt;/span&gt; Reply "edit [your changes]" to revise before sending

Tools: shell (gh, linear, gmail CLI), file write, memory read
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Lobster Workflow That Chains Everything
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claw-ops-daily&lt;/span&gt;
&lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;8&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1-5"&lt;/span&gt;

&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prs&lt;/span&gt;
    &lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pr-morning-digest&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pr_summary&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;slack&lt;/span&gt;
    &lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;slack-action-extractor&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;action_items&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;brief&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;telegram_send&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;Good morning. Here's your briefing:&lt;/span&gt;

      &lt;span class="s"&gt;**PRs needing attention:**&lt;/span&gt;
      &lt;span class="s"&gt;{{pr_summary}}&lt;/span&gt;

      &lt;span class="s"&gt;**New action items from Slack:**&lt;/span&gt;
      &lt;span class="s"&gt;{{action_items}}&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;status_draft&lt;/span&gt;
    &lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;client-status-drafter&lt;/span&gt;
    &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;day_of_week&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;==&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;friday"&lt;/span&gt;
    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{pr_summary}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{action_items}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Setup (Reproducible in Under an Hour)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Install OpenClaw
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://openclaw.ai/install.sh | bash
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;anthropic_api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Create the skill files
&lt;/h3&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; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.openclaw/skills
nano ~/.openclaw/skills/pr-morning-digest.md
nano ~/.openclaw/skills/slack-action-extractor.md
nano ~/.openclaw/skills/client-status-drafter.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 3: Create the Lobster workflow
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.openclaw/workflows/claw-ops-daily.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 4: Connect Telegram
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw connect telegram
&lt;span class="c"&gt;# Follow the QR code flow — takes 90 seconds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 5: Start the gateway and test
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw start
&lt;span class="c"&gt;# Message your Telegram bot: "Run claw-ops-daily now"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Total time from zero to running: &lt;strong&gt;47 minutes.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What Actually Happens in Production
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monday 8:02 AM — Telegram:&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;Good morning. Here's your briefing:

PRs needing attention:
• [URGENT] backend/api — PR #312 "Fix auth token refresh" — CI failing, open 31hrs
• frontend/dashboard — PR #308 "New onboarding flow" — awaiting review, open 26hrs

New action items from Slack:
• Sarah asked you to look at the deployment config by EOD today
• No deadline: Jordan mentioned the staging DB needs a migration check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Friday 4:03 PM — Telegram:&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;Draft ready: ~/drafts/status-2026-04-25.md

Preview:
"This week we shipped the auth token refresh fix and the new onboarding
flow, both now live in production. We're currently working through the
staging database migration — expect that wrapped by Tuesday. One thing
we'd love your input on: the API rate limit thresholds for the premium
tier. Happy to jump on a quick call Monday if useful."

Reply "send" to send via Gmail or "edit [changes]" to revise.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I reply "send." Done.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Morning PR triage&lt;/td&gt;
&lt;td&gt;25 min manual GitHub scanning&lt;/td&gt;
&lt;td&gt;45 sec reading Telegram&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack action item harvesting&lt;/td&gt;
&lt;td&gt;~40 min/day of tab switching&lt;/td&gt;
&lt;td&gt;Automated, instant summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly client status&lt;/td&gt;
&lt;td&gt;90 min writing + context gathering&lt;/td&gt;
&lt;td&gt;30 sec reviewing + one-tap send&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email follow-up chasing&lt;/td&gt;
&lt;td&gt;45 min/week&lt;/td&gt;
&lt;td&gt;Zero — agent handles it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~9 hrs/week&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~20 min/week&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Honest Notes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What worked immediately:&lt;/strong&gt; The PR digest and Telegram integration were flawless out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What needed iteration:&lt;/strong&gt; The client status email tone took two rounds of refinement in &lt;code&gt;agents.md&lt;/code&gt;. Adding &lt;code&gt;"Write like a human who has a strong working relationship with this client. Warm, direct, no corporate filler."&lt;/code&gt; to the agent personality fixed it completely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security note:&lt;/strong&gt; I run with &lt;code&gt;--sandbox&lt;/code&gt; disabled because I need full shell access for the gh and linear CLIs. This is a deliberate choice with understood risk. Start sandboxed, then selectively enable only the tools each skill genuinely needs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fork It
&lt;/h2&gt;

&lt;p&gt;All three skill files and the Lobster workflow are in this GitHub Repository:&lt;br&gt;
&lt;code&gt;https://github.com/FarooqShabbir/claw-ops&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The entire point of the skills format is that you're not copying code — you're copying &lt;em&gt;intent&lt;/em&gt;. Edit the instructions to match your stack, and the agent adapts automatically.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Submitted for the OpenClaw Writing Challenge on DEV — OpenClaw in Action prompt.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>openclawchallenge</category>
      <category>openclaw</category>
      <category>ai</category>
    </item>
    <item>
      <title>OpenClaw Isn't an AI Assistant. It's a New Operating System. Here's the Proof.</title>
      <dc:creator>Farooq Shabbir</dc:creator>
      <pubDate>Thu, 23 Apr 2026 11:29:51 +0000</pubDate>
      <link>https://dev.to/farooqshabbir/openclaw-isnt-an-ai-assistant-its-a-new-operating-system-heres-the-proof-l06</link>
      <guid>https://dev.to/farooqshabbir/openclaw-isnt-an-ai-assistant-its-a-new-operating-system-heres-the-proof-l06</guid>
      <description>&lt;p&gt;&lt;em&gt;310,000 GitHub stars. A viral car negotiation. A legal filing written while someone slept. None of that is the real story.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Let me make a claim that sounds insane and then prove it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw is not a chatbot. It's not an "AI assistant." It's the first personal operating system where the shell language is English.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most people install it, hook it to WhatsApp, tell it to summarize their emails, and think: "Oh, this is a smarter Siri." They're using a supercomputer to play Snake. This post exists to fix that.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is an Operating System?
&lt;/h2&gt;

&lt;p&gt;Strip the word "computer" of all marketing and get to the substrate:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt; does one thing: flip bits. Raw, meaningless, fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The OS&lt;/strong&gt; does one thing: expose hardware capabilities through a stable API so applications don't need to understand the physics of storage or memory. The OS is the contract layer between silicon and software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Applications&lt;/strong&gt; implement specific intent on top of that contract.&lt;/p&gt;

&lt;p&gt;This three-layer stack is 60 years old and has never fundamentally changed. What has changed is the API language.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unix (1969)&lt;/strong&gt;: the API is a shell. Intent expressed as typed commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac/Windows (1984)&lt;/strong&gt;: the API is a GUI. Intent expressed as mouse clicks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS/Android (2007)&lt;/strong&gt;: the API is touch. Intent expressed as gestures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw (2026)&lt;/strong&gt;: the API is natural language. Intent expressed as thought.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not a product evolution. That's a paradigm shift in the interface contract.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture Nobody Explains Properly
&lt;/h2&gt;

&lt;p&gt;Here's what OpenClaw actually is under the hood — three components that, together, do something genuinely new:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Gateway (the kernel)
&lt;/h3&gt;

&lt;p&gt;A persistent Node.js process running on your machine. It owns your file system access, shell execution, browser control via CDP, and messaging connectors (WhatsApp, Telegram, Slack, Discord, Signal — 30+ platforms). It never sleeps. It runs cron jobs. It watches for triggers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.openclaw/
├── memory/          # Vector-embedded context (your persistent RAM)
├── skills/          # Installed skill definitions (your installed apps)
├── agents.md        # Your agent's personality, rules, goals (your user config)
└── logs/            # Full audit trail of every action taken
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The gateway is the kernel. It's what makes OpenClaw fundamentally different from a chatbot — a chatbot forgets you when you close the tab. The gateway never closes.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Memory (the persistent state)
&lt;/h3&gt;

&lt;p&gt;Every conversation, every file it reads, every action it takes gets embedded and stored in &lt;code&gt;~/.openclaw/memory/&lt;/code&gt;. This is not a clever trick — it's the architectural primitive that makes agents possible.&lt;/p&gt;

&lt;p&gt;When you message OpenClaw six months from now and say "do the thing I did with the vendor last March," it will find the context. No re-explaining. No re-uploading. It knows you because it remembers &lt;em&gt;living with you&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Skills (the apps — and this is the key insight)
&lt;/h3&gt;

&lt;p&gt;A Skill is a Markdown file. That's it. Here's a real one:&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="gh"&gt;# github-pr-reviewer&lt;/span&gt;

&lt;span class="gu"&gt;## Description&lt;/span&gt;
Reviews pull requests, checks for common issues, and posts a structured review comment.

&lt;span class="gu"&gt;## Trigger&lt;/span&gt;
When asked to review a PR or given a GitHub PR URL.

&lt;span class="gu"&gt;## Instructions&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; Fetch the PR diff using the GitHub API
&lt;span class="p"&gt;2.&lt;/span&gt; Analyze for: security issues, logic errors, naming conventions, missing tests
&lt;span class="p"&gt;3.&lt;/span&gt; Structure the review as: LGTM / Needs Changes / Critical Issues
&lt;span class="p"&gt;4.&lt;/span&gt; Post the review comment via GitHub API with your findings

&lt;span class="gu"&gt;## Tools Required&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; shell (for gh CLI commands)
&lt;span class="p"&gt;-&lt;/span&gt; browser (for reading PR context)

&lt;span class="gu"&gt;## Example&lt;/span&gt;
User: "Review PR #247 in my-org/backend"
Agent: [fetches diff, analyzes, posts structured review to GitHub]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read that again. There is &lt;strong&gt;no code&lt;/strong&gt;. The skill is an instruction set written in plain English that tells the LLM how to use the tools it already has access to. The model is the runtime. The Markdown is the program.&lt;/p&gt;

&lt;p&gt;This is what makes the skills format revolutionary: &lt;strong&gt;every developer on Earth is now a software publisher.&lt;/strong&gt; You don't need to know Python to build a skill. You need to know what you want done and be able to describe it clearly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built: The Dead-Simple Dev Pipeline That Saves 9 Hours a Week
&lt;/h2&gt;

&lt;p&gt;I run a small dev consultancy. My biggest time drain: context-switching between Slack, GitHub, and client email to stay on top of code reviews, deployments, and status updates.&lt;/p&gt;

&lt;p&gt;I built three skills and wired them together with a Lobster workflow (OpenClaw's YAML orchestration engine):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skill 1: &lt;code&gt;pr-morning-digest&lt;/code&gt;&lt;/strong&gt;&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="gh"&gt;# pr-morning-digest&lt;/span&gt;
Every morning at 8AM, check all GitHub repos I have access to.
Find PRs that:
&lt;span class="p"&gt;-&lt;/span&gt; Have been open more than 24 hours without review
&lt;span class="p"&gt;-&lt;/span&gt; Have failing CI
&lt;span class="p"&gt;-&lt;/span&gt; Are tagged as urgent
Format them as a priority-ordered list and send to Telegram.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Skill 2: &lt;code&gt;slack-action-extractor&lt;/code&gt;&lt;/strong&gt;&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="gh"&gt;# slack-action-extractor&lt;/span&gt;
When triggered, scan the last 50 messages in #engineering Slack channel.
Identify messages directed at me or mentioning my name.
Extract action items and deadlines.
Add them to my local tasks.md file.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Skill 3: &lt;code&gt;client-status-drafter&lt;/code&gt;&lt;/strong&gt;&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="gh"&gt;# client-status-drafter&lt;/span&gt;
Every Friday at 4PM:
&lt;span class="p"&gt;1.&lt;/span&gt; Read this week's merged PRs from GitHub
&lt;span class="p"&gt;2.&lt;/span&gt; Read closed tickets from Linear
&lt;span class="p"&gt;3.&lt;/span&gt; Draft a plain-English client status email
&lt;span class="p"&gt;4.&lt;/span&gt; Save draft to ~/drafts/client-status-{date}.md and send me the preview on Telegram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Lobster workflow that chains them:&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dev-ops-daily&lt;/span&gt;
&lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;8&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1-5"&lt;/span&gt;
&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pr-morning-digest&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pr_list&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;slack-action-extractor&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;action_items&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;friday&lt;/span&gt;
    &lt;span class="na"&gt;skill&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;client-status-drafter&lt;/span&gt;
    &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{pr_list}}&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;{{action_items}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Total setup time: &lt;strong&gt;47 minutes&lt;/strong&gt; including reading the docs.&lt;/p&gt;

&lt;p&gt;Estimated time saved per week: &lt;strong&gt;~9 hours&lt;/strong&gt; of context-switching, manual status compilation, and PR triage.&lt;/p&gt;

&lt;p&gt;I did not write a single line of Python. I wrote instructions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part Nobody Wants to Admit: It's Also a Security Nightmare
&lt;/h2&gt;

&lt;p&gt;I won't write a press release. So here's the honest section.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE-2026-25253 is real.&lt;/strong&gt; The OpenClaw gateway has a documented vulnerability where malformed skill files on ClawHub can inject arbitrary instructions into the agent's context — essentially prompt injection at the OS level. This isn't theoretical. The OpenClaw team has patched the specific vector, but the &lt;em&gt;class&lt;/em&gt; of attack remains: ClawHub lets any developer publish a skill, and the trust model is "read the source before you install."&lt;/p&gt;

&lt;p&gt;That's like npm in 2016. We know how that played out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three things you must do before trusting OpenClaw with anything sensitive:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Run in sandboxed mode.&lt;/strong&gt; The &lt;code&gt;--sandbox&lt;/code&gt; flag prevents shell execution and limits file access to a designated directory. For most automations, you don't need full system access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit every skill before installing.&lt;/strong&gt; Skills are Markdown — read them. It takes 90 seconds. If a skill asks for tool access it doesn't need (a weather skill asking for shell access is a red flag), reject it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Never store credentials in plain text in agents.md.&lt;/strong&gt; Use environment variables. OpenClaw supports &lt;code&gt;${ENV_VAR}&lt;/code&gt; interpolation in agents.md specifically for this reason.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The ClawHub ecosystem will mature — security-check skills, community auditing, automated vulnerability scanning are all in active development. But today, treat ClawHub like you'd treat an unverified PPA: useful, powerful, and something you approach with your eyes open.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Deeper Implication
&lt;/h2&gt;

&lt;p&gt;Here's what I think is actually happening, and why it matters beyond the automation wins:&lt;/p&gt;

&lt;p&gt;For 50 years, software has had a one-way relationship with users. Developers write programs; users run them. The expertise asymmetry was structural — you couldn't build your own tools without years of education.&lt;/p&gt;

&lt;p&gt;OpenClaw collapses that asymmetry.&lt;/p&gt;

&lt;p&gt;When a non-developer writes a skill file that automates their mortgage application follow-ups, or a healthcare worker builds a patient note summarizer, or a teacher creates an assignment feedback pipeline — they're not "using AI." They're &lt;strong&gt;building software&lt;/strong&gt;. The runtime just happens to speak English.&lt;/p&gt;

&lt;p&gt;This is what the PC moment actually was: not "computers are now smaller," but "the power to create with computers is now personal." OpenClaw is that moment applied to agency. The power to automate, to delegate, to build running systems — that's now personal.&lt;/p&gt;

&lt;p&gt;The skills format is the spreadsheet of the agent era. And just like the spreadsheet, most of its eventual users haven't been born yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start Here, Not There
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS / Linux (one-liner installer)&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://openclaw.ai/install.sh | bash

&lt;span class="c"&gt;# Configure your LLM key&lt;/span&gt;
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;anthropic_api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_KEY

&lt;span class="c"&gt;# Start the gateway&lt;/span&gt;
openclaw start

&lt;span class="c"&gt;# Connect your messaging app — then send:&lt;/span&gt;
&lt;span class="c"&gt;# "What can you do?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last message will give you the real answer. Not the marketing one. The actual answer of what's sitting on your machine, waiting.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Submitted for the OpenClaw Writing Challenge on DEV — Wealth of Knowledge prompt.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>openclawchallenge</category>
      <category>openclaw</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Internet Got Its HTTP Moment Again — And Nobody's Talking About It</title>
      <dc:creator>Farooq Shabbir</dc:creator>
      <pubDate>Thu, 23 Apr 2026 11:09:22 +0000</pubDate>
      <link>https://dev.to/farooqshabbir/the-internet-got-its-http-moment-again-and-nobodys-talking-about-it-16mj</link>
      <guid>https://dev.to/farooqshabbir/the-internet-got-its-http-moment-again-and-nobodys-talking-about-it-16mj</guid>
      <description>&lt;p&gt;&lt;em&gt;Google Cloud NEXT '26 dropped 50+ announcements. The one that changes everything isn't the shiny AI model. It's a protocol.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Everyone came to Google Cloud NEXT '26 for the model war — Gemini 3.1, the Apple-Gemini bombshell, TPU 8t connecting 134,000 chips into a single Virgo fabric. Those headlines are real. But buried beneath the flash is the announcement that defines how software is actually &lt;strong&gt;built in 2027 and beyond&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent2Agent (A2A) protocol v1.0 is in production at 150 organizations. The Linux Foundation now governs it. And it's already baked into six major frameworks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's not a product announcement. That's infrastructure. And infrastructure is where all the leverage lives.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Multi-Agent Systems Have Been Broken
&lt;/h2&gt;

&lt;p&gt;Let's strip the marketing away.&lt;/p&gt;

&lt;p&gt;An agent is just a loop: &lt;strong&gt;observe → reason → act → repeat&lt;/strong&gt;. The moment you need two agents to collaborate — a procurement agent handing off to a finance agent, a customer service bot escalating to a specialist — you hit a fundamental problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do they talk?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today, most "multi-agent" systems are secretly monoliths. They use shared memory, shared queues, or vendor-specific SDKs that chain agents together &lt;em&gt;within one platform&lt;/em&gt;. It works until you need your Salesforce Agentforce bot to hand a task to your ServiceNow agent. Then you write glue code. Then you maintain it. Then you regret your life choices.&lt;/p&gt;

&lt;p&gt;This is the exact same problem the internet solved in the 1990s. Before HTTP, every web server talked a different language. After HTTP: one protocol, universal interoperability, an explosion of innovation. &lt;strong&gt;A2A is making the same move for agents.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What A2A v1.0 Actually Delivers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Agent Cards — The DNS of the Agent World
&lt;/h3&gt;

&lt;p&gt;Every A2A-compliant agent publishes an &lt;strong&gt;Agent Card&lt;/strong&gt;: a JSON manifest served at &lt;code&gt;/.well-known/agent.json&lt;/code&gt; that declares what the agent can do, what inputs it accepts, what auth schemes it supports, and how to reach it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Procurement Agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"create_purchase_order"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"check_vendor_status"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"approve_spend"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input_schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"vendor_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"amount_usd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"auth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"schemes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"oauth2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api_key"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://procurement-agent.acme.com/a2a"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;strong&gt;discovery&lt;/strong&gt;. This is what lets a general-purpose orchestrator find and call a specialist agent without prior integration work. It's DNS + OpenAPI, applied to agents.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Task Lifecycle — State That Survives Handoffs
&lt;/h3&gt;

&lt;p&gt;A2A defines a standard task state machine: &lt;code&gt;submitted → working → input-required → completed/failed/cancelled&lt;/code&gt;. Real enterprise tasks take &lt;em&gt;minutes to hours&lt;/em&gt;, not milliseconds. A2A task state lives in the protocol, not in one vendor's database — so it survives network interruptions, agent restarts, and platform migrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Streaming &amp;amp; Push Notifications
&lt;/h3&gt;

&lt;p&gt;A2A supports Server-Sent Events for streaming task updates. Long-running agents push incremental progress back to the orchestrator without polling. For a research agent crawling documents for 20 minutes, this isn't a nice-to-have. It's the difference between a system that works and one that times out.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Code That Matters
&lt;/h2&gt;

&lt;p&gt;Here's a minimal A2A agent server using the new ADK v1.0 (Python, stable release):&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LlmAgent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.a2a&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;A2AServer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AgentCard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Capability&lt;/span&gt;

&lt;span class="n"&gt;card&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inventory-checker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;capabilities&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nc"&gt;Capability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_stock&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Returns current inventory level for a given SKU&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;input_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sku&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;output_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;integer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;warehouse&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LlmAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-3-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You check inventory. Be precise and fast.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;check_inventory_db&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;A2AServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# → GET  /.well-known/agent.json   (Agent Card discovery)
# → POST /a2a/tasks/send           (Task endpoint)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And calling it from an orchestrator:&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.a2a&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;A2AClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;A2AClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Auto-fetches the Agent Card
&lt;/span&gt;&lt;span class="n"&gt;inventory_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;discover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://inventory.acme.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Send a task
&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;inventory_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_task&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;capability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;check_stock&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;input&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sku&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WIDGET-42&lt;/span&gt;&lt;span class="sh"&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;# Stream progress in real time
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&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;Status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&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="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;result&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;Stock: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; units at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;warehouse&lt;/span&gt;&lt;span class="sh"&gt;'&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;This runs &lt;strong&gt;cross-platform&lt;/strong&gt;. The inventory agent could be on Agent Engine. The orchestrator could be LangGraph, CrewAI, or AutoGen. A2A bridges them without custom serialization or SDK lock-in.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Ecosystem Play Is Already Working
&lt;/h2&gt;

&lt;p&gt;The number that should get your attention: &lt;strong&gt;150 organizations in production — not pilot.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google announced A2A at Google I/O 2025 with 50 partners on paper. Twelve months later, it's in live production at 150 organizations, and governance has moved to the &lt;strong&gt;Linux Foundation's Agentic AI Foundation&lt;/strong&gt;. That last detail is critical — it signals A2A is &lt;em&gt;not&lt;/em&gt; a Google product anymore. It's an industry standard in the making, the same way the Linux Foundation stewards Kubernetes, OpenTelemetry, and gRPC.&lt;/p&gt;

&lt;p&gt;Native A2A support now ships in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google's ADK (Python, Go, Java, TypeScript — all stable v1.0)&lt;/li&gt;
&lt;li&gt;LangGraph&lt;/li&gt;
&lt;li&gt;CrewAI&lt;/li&gt;
&lt;li&gt;LlamaIndex Agents&lt;/li&gt;
&lt;li&gt;Microsoft Semantic Kernel&lt;/li&gt;
&lt;li&gt;AutoGen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When Microsoft's framework supports your protocol, you've won the framework war before it started.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Honest Critique: What's Still Missing
&lt;/h2&gt;

&lt;p&gt;I'm not here to write a press release. So let me be direct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Security model is immature.&lt;/strong&gt;&lt;br&gt;
A2A supports OAuth2 and API keys — table stakes. But there's no standard for &lt;em&gt;capability scoping&lt;/em&gt;, no canonical way to say "this orchestrator can call &lt;code&gt;check_stock&lt;/code&gt; but not &lt;code&gt;approve_spend&lt;/code&gt;." In enterprise environments, this granular authorization matters enormously. Today you implement it yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Agent Card versioning is undefined.&lt;/strong&gt;&lt;br&gt;
What happens when an agent upgrades from v1.0.0 to v2.0.0 and changes a capability schema? A2A has no deprecation protocol, no capability negotiation, no backward-compatibility guarantees baked in. Every integration team will solve this differently until a standard emerges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Observability is an afterthought.&lt;/strong&gt;&lt;br&gt;
There's no standard tracing header in A2A requests — no &lt;code&gt;X-A2A-Trace-ID&lt;/code&gt; spec. When a task flows through five agents across three platforms and breaks, you're currently stitching together vendor-specific logs to reconstruct what happened. OpenTelemetry support is on the roadmap. It can't come fast enough.&lt;/p&gt;

&lt;p&gt;These aren't dealbreakers. HTTP 1.0 didn't have keep-alive. It evolved. A2A will too. But go in clear-eyed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is the Most Underrated Announcement of NEXT '26
&lt;/h2&gt;

&lt;p&gt;Everyone will write about Gemini 3.2's expanded context window. Everyone will write about TPU 8t (Sunfish) and the Virgo Network connecting over a million chips into a single logical training cluster. Those are real stories.&lt;/p&gt;

&lt;p&gt;But here's the thing about infrastructure: &lt;strong&gt;the network effects compound silently until they're obvious.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TCP/IP didn't make the front page when it shipped. Neither did HTTP. They became the substrate on which everything else ran. A2A — now stable, governed by a neutral foundation, adopted across competing frameworks — is positioning itself as the substrate for multi-agent systems.&lt;/p&gt;

&lt;p&gt;The developers who understand it &lt;em&gt;now&lt;/em&gt;, who build A2A-compliant agents and orchestrators that can discover any A2A endpoint, are the ones with a durable advantage as the agentic era matures. Not because Google said so in a keynote. Because 150 production deployments and Linux Foundation governance are the kind of signals that don't reverse.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Do This Week
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read the A2A spec&lt;/strong&gt;: &lt;a href="https://google.github.io/A2A" rel="noopener noreferrer"&gt;google.github.io/A2A&lt;/a&gt; — clean, short, worth 20 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install ADK v1.0&lt;/strong&gt;: &lt;code&gt;pip install google-adk&lt;/code&gt; — stable, production-ready.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expose your next agent with an Agent Card.&lt;/strong&gt; Treat it like a &lt;code&gt;README.md&lt;/code&gt;: required, not optional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the Developer Keynote&lt;/strong&gt; (April 23, 10:30 AM PT) — live A2A cross-platform interop demos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The agentic era isn't coming. It's here. And now it has a protocol.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Posted as part of the Google Cloud NEXT '26 Writing Challenge on DEV.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>cloudnextchallenge</category>
      <category>googlecloud</category>
      <category>ai</category>
    </item>
    <item>
      <title>Go ahead. Don't miss out this opportunity.</title>
      <dc:creator>Farooq Shabbir</dc:creator>
      <pubDate>Tue, 17 Mar 2026 07:13:07 +0000</pubDate>
      <link>https://dev.to/farooqshabbir/go-ahead-dont-miss-out-this-opportunity-2lb2</link>
      <guid>https://dev.to/farooqshabbir/go-ahead-dont-miss-out-this-opportunity-2lb2</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devteam/join-the-notion-mcp-challenge-1500-in-prizes-73e" class="crayons-story__hidden-navigation-link"&gt;Join the Notion MCP Challenge: $1,500 in Prizes!&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/devteam"&gt;
            &lt;img alt="The DEV Team logo" 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%2Forganization%2Fprofile_image%2F1%2Fd908a186-5651-4a5a-9f76-15200bc6801f.jpg" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/jess" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&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%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg" alt="jess profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/jess" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Jess Lee
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Jess Lee
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-3292999" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/jess" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F264%2Fb75f6edf-df7b-406e-a56b-43facafb352c.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Jess Lee&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/devteam" class="crayons-story__secondary fw-medium"&gt;The DEV Team&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/devteam/join-the-notion-mcp-challenge-1500-in-prizes-73e" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 4&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devteam/join-the-notion-mcp-challenge-1500-in-prizes-73e" id="article-link-3292999"&gt;
          Join the Notion MCP Challenge: $1,500 in Prizes!
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/notionchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;notionchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devchallenge"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devchallenge&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mcp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mcp&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devteam/join-the-notion-mcp-challenge-1500-in-prizes-73e" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;197&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devteam/join-the-notion-mcp-challenge-1500-in-prizes-73e#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              38&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>notionchallenge</category>
      <category>devchallenge</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
    <item>
      <title>I Built a DevOps Simulator to Practice Kubernetes Debugging</title>
      <dc:creator>Farooq Shabbir</dc:creator>
      <pubDate>Wed, 11 Mar 2026 11:18:12 +0000</pubDate>
      <link>https://dev.to/farooqshabbir/i-built-a-devops-simulator-to-practice-kubernetes-debugging-3pc5</link>
      <guid>https://dev.to/farooqshabbir/i-built-a-devops-simulator-to-practice-kubernetes-debugging-3pc5</guid>
      <description>&lt;p&gt;Most DevOps tutorials have a problem.&lt;/p&gt;

&lt;p&gt;They explain things like this:&lt;/p&gt;

&lt;p&gt;“Here is what CrashLoopBackOff means.”&lt;br&gt;
“Here is how to fix it.”&lt;/p&gt;

&lt;p&gt;But real DevOps work doesn’t look like that.&lt;/p&gt;

&lt;p&gt;Real incidents look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods
kubectl logs api
kubectl describe pod api
kubectl get services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You investigate.&lt;br&gt;
You read logs.&lt;br&gt;
You try commands.&lt;br&gt;
You guess.&lt;br&gt;
You debug.&lt;/p&gt;

&lt;p&gt;So I built a small DevOps Learning Simulator where you practice debugging Kubernetes incidents like you would in a real environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Idea&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of reading solutions, you interactively investigate problems using real commands from Kubernetes.&lt;/p&gt;

&lt;p&gt;You run commands such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods
kubectl logs &amp;lt;pod&amp;gt;
kubectl describe pod &amp;lt;pod&amp;gt;
kubectl get services
kubectl describe service &amp;lt;service&amp;gt;
kubectl get endpoints
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you try to find the root cause of the incident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Incident&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You start the simulator and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;--show-labels&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&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;NAME                          READY STATUS             RESTARTS AGE LABELS
api-deployment-7d4f8b9c       0/1   CrashLoopBackOff        8 36m -
nginx-deployment-5f6g7h8i     1/1   Running                 0 5m app=nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You investigate logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl logs api-deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then describe the pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe pod api-deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eventually, you discover the issue:&lt;/p&gt;

&lt;p&gt;A missing ConfigMap caused the container to crash.&lt;/p&gt;

&lt;p&gt;The simulator then checks your answer and gives feedback.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Current Scenarios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Version 1 includes several common production incidents:&lt;/p&gt;

&lt;p&gt;• CrashLoopBackOff caused by missing configuration&lt;br&gt;
• OOMKilled due to incorrect memory limits&lt;br&gt;
• DNS / service selector mismatch&lt;/p&gt;

&lt;p&gt;These are problems engineers regularly see when working with Kubernetes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Why I Built This
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Many developers learn DevOps tools but never practice debugging real incidents.&lt;/p&gt;

&lt;p&gt;They know commands but haven’t used them in a realistic investigation.&lt;/p&gt;

&lt;p&gt;This project aims to address that by providing a safe environment for troubleshooting practice.&lt;/p&gt;

&lt;p&gt;Think of it like a flight simulator for DevOps engineers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can try it here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/FarooqShabbir/devops_simulator" rel="noopener noreferrer"&gt;https://github.com/FarooqShabbir/devops_simulator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run it locally:&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/FarooqShabbir/devops_simulator.git
&lt;span class="nb"&gt;cd &lt;/span&gt;devops_simulator
python devops_simulator.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start investigating incidents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Future Plans&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some ideas for future versions:&lt;/p&gt;

&lt;p&gt;• CI/CD pipeline failures&lt;br&gt;
• Infrastructure drift debugging&lt;br&gt;
• Network policy issues&lt;br&gt;
• Multi-service production incidents&lt;/p&gt;

&lt;p&gt;If you have ideas or want to contribute, feel free to open an issue or pull request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I would love to hear from other DevOps engineers:&lt;/p&gt;

&lt;p&gt;What incidents would you add to a DevOps debugging simulator?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>learning</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
