<?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: Gaurang Bhatt</title>
    <description>The latest articles on DEV Community by Gaurang Bhatt (@gaurang_bhatt_b6d91a19879).</description>
    <link>https://dev.to/gaurang_bhatt_b6d91a19879</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3868890%2Ff4952372-07c6-4307-afef-ed8434cfd0d7.png</url>
      <title>DEV Community: Gaurang Bhatt</title>
      <link>https://dev.to/gaurang_bhatt_b6d91a19879</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gaurang_bhatt_b6d91a19879"/>
    <language>en</language>
    <item>
      <title>EcoSnap — I Built an AI That Reads Waste Photos and Tells You Exactly What to Do 🌍</title>
      <dc:creator>Gaurang Bhatt</dc:creator>
      <pubDate>Sun, 31 May 2026 16:55:32 +0000</pubDate>
      <link>https://dev.to/gaurang_bhatt_b6d91a19879/ecosnap-i-built-an-ai-that-reads-waste-photos-and-tells-you-exactly-what-to-do-4a0o</link>
      <guid>https://dev.to/gaurang_bhatt_b6d91a19879/ecosnap-i-built-an-ai-that-reads-waste-photos-and-tells-you-exactly-what-to-do-4a0o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;EcoSnap&lt;/strong&gt; is an AI-powered environmental assistant that turns any photo of waste or pollution into instant, actionable intelligence.&lt;/p&gt;

&lt;p&gt;You snap a photo. EcoSnap tells you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What kind of waste it is and how severe the damage is&lt;/li&gt;
&lt;li&gt;How much CO₂ impact it creates&lt;/li&gt;
&lt;li&gt;How many years it will take to decompose&lt;/li&gt;
&lt;li&gt;An emotional story from the waste's own perspective&lt;/li&gt;
&lt;li&gt;5 concrete things you can do about it &lt;strong&gt;right now&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;An AI coach you can chat with for more guidance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core insight behind EcoSnap came from a real observation in Vadodara, Gujarat, India 🇮🇳 — &lt;strong&gt;people see environmental problems every day but don't act because they simply don't know what to do.&lt;/strong&gt; EcoSnap bridges that gap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🔍 Eco-Detection&lt;/strong&gt;&lt;br&gt;
Upload any photo — plastic, garbage, polluted water, dead plants — and Google Gemini Vision AI instantly identifies the waste type, damage level (Low / Medium / High / Critical), CO₂ impact in kg, and years to decompose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📖 Waste Story&lt;/strong&gt; &lt;em&gt;(The feature I'm most proud of)&lt;/em&gt;&lt;br&gt;
Every piece of waste gets an emotional first-person narrative — told from the perspective of the waste itself. This makes the invisible impact visible and human.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I was once a vibrant part of the river, teeming with life, but now I am choked by the refuse of humanity. My waters, once clear and life-giving, now bear the scars of neglect and indifference..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;⚡ 5-Minute Action Plan&lt;/strong&gt;&lt;br&gt;
Not just awareness — action. 5 concrete steps tailored to the specific waste detected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌱 Eco Score&lt;/strong&gt;&lt;br&gt;
A 0–100 environmental health score with a visual progress bar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💬 AI Eco Coach&lt;/strong&gt;&lt;br&gt;
A conversational AI coach that answers your environmental questions in plain language.&lt;/p&gt;


&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/exedistrict-ux/ecosnap" rel="noopener noreferrer"&gt;https://github.com/exedistrict-ux/ecosnap&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Detection Tab — Waste analysis with CO₂ impact and Eco Score:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EcoSnap Detection - Mixed solid waste detected near Taj Mahal river, Critical damage, 5000kg CO2, 500 years to decompose, Eco Score 10/100&lt;br&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%2Fd3gb5doroqsdn68aypn7.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%2Fd3gb5doroqsdn68aypn7.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Story Tab — Emotional narrative from the waste's perspective:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EcoSnap Story - I was once a vibrant part of the river...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fats8anaq29a5x38h2mt3.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%2Fats8anaq29a5x38h2mt3.jpg" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Action Tab — 5-Minute Action Plan:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EcoSnap Action Plan - 5 concrete steps to tackle the detected pollution&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl6fkb66e5tuovckml49r.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%2Fl6fkb66e5tuovckml49r.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coach Tab — AI conversation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EcoSnap AI Coach - Conversational environmental guidance&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnuek45hgef4m2zzacp30.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%2Fnuek45hgef4m2zzacp30.jpg" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;This project started during the &lt;strong&gt;DEV Weekend Challenge for Earth Day 2026&lt;/strong&gt;. I had the idea, I had the passion — but I ran out of time before I could finish it properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it was before:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Just a basic photo upload with a broken Gemini API call&lt;/li&gt;
&lt;li&gt;No real UI, no tabs, no styled components&lt;/li&gt;
&lt;li&gt;The "Waste Story" feature existed only as an idea in my notes&lt;/li&gt;
&lt;li&gt;API key was accidentally committed to GitHub (classic mistake 😅)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I changed, fixed, and added to finish it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built the complete 4-tab UI from scratch (Detection, Story, Action, Coach)&lt;/li&gt;
&lt;li&gt;Fixed the Gemini Vision API integration with proper base64 encoding&lt;/li&gt;
&lt;li&gt;Added the Waste Story feature — the emotional narrative that makes EcoSnap unique&lt;/li&gt;
&lt;li&gt;Built the full AI Coach chat with conversation history&lt;/li&gt;
&lt;li&gt;Designed a complete green nature theme with custom typography (Syne + DM Sans)&lt;/li&gt;
&lt;li&gt;Fixed the GitHub secret scanning violation and properly secured the API key&lt;/li&gt;
&lt;li&gt;Wrote a professional README with full documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The transformation from broken prototype to working, polished app happened in 3 days — with GitHub Copilot making a huge difference.&lt;/p&gt;


&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot was genuinely essential to finishing EcoSnap. Here is exactly how it helped:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Gemini API Integration&lt;/strong&gt;&lt;br&gt;
The trickiest part was formatting the vision API request correctly — base64 encoding the image, structuring the &lt;code&gt;inline_data&lt;/code&gt; object, and handling the response. Copilot suggested the correct structure on the first try, saving me hours of debugging documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. JSON Response Parsing&lt;/strong&gt;&lt;br&gt;
Gemini sometimes returns JSON wrapped in markdown backticks. Copilot suggested the clean regex strip pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/``&lt;/span&gt;&lt;span class="err"&gt;`
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;endraw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="s2"&gt;```/g, "").trim();
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Chat History Management&lt;/strong&gt;&lt;br&gt;
Building the conversational AI coach required managing message history arrays correctly across re-renders. Copilot's suggestions for the state management pattern were clean and worked immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. CSS Animations&lt;/strong&gt;&lt;br&gt;
The loading spinner, fadeUp animations, and score bar transition — Copilot generated these CSS keyframes faster than I could have written them manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Error Handling&lt;/strong&gt;&lt;br&gt;
Copilot consistently suggested try/catch patterns and fallback states that made the app resilient, not just functional.&lt;/p&gt;

&lt;p&gt;Without Copilot, this project would have taken a week. With it, I shipped in 3 days — solo, from a small room in Vadodara in 42°C summer heat. 🌡️&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React.js 18&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI:&lt;/strong&gt; Google Gemini 1.5 Flash (Vision + Text)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coding Assistant:&lt;/strong&gt; GitHub Copilot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fonts:&lt;/strong&gt; Syne + DM Sans (Google Fonts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; GitHub&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next for EcoSnap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📍 Nearby recycling center locator&lt;/li&gt;
&lt;li&gt;🏆 Community leaderboard&lt;/li&gt;
&lt;li&gt;🌐 Multi-language support (Gujarati, Hindi, English)&lt;/li&gt;
&lt;li&gt;📱 PWA for direct camera access on mobile&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built for Earth 🌍 | Solo builder from Vadodara, Gujarat, India 🇮🇳&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Every photo you snap is a step toward a cleaner planet.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
    </item>
    <item>
      <title>Hermes Agent vs. The Cloud: A Developer's Guide to Local AI Agents</title>
      <dc:creator>Gaurang Bhatt</dc:creator>
      <pubDate>Sat, 30 May 2026 11:55:24 +0000</pubDate>
      <link>https://dev.to/gaurang_bhatt_b6d91a19879/hermes-agent-vs-the-cloud-a-developers-guide-to-local-ai-agents-51e0</link>
      <guid>https://dev.to/gaurang_bhatt_b6d91a19879/hermes-agent-vs-the-cloud-a-developers-guide-to-local-ai-agents-51e0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hermes-agent-2026-05-15"&gt;Hermes Agent Challenge&lt;/a&gt;: Write About Hermes Agent&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you've been watching the AI agent space, you've probably noticed a frustrating trend: the most capable systems are locked behind APIs you don't control. That's what makes &lt;strong&gt;Hermes Agent&lt;/strong&gt; different. It's an open-source agentic framework designed to run entirely on your own infrastructure.&lt;/p&gt;

&lt;p&gt;In this guide, I'll walk you through setting up Hermes Agent locally and connecting it to real tools — no cloud dependencies required.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Hermes Agent?
&lt;/h2&gt;

&lt;p&gt;Hermes Agent is an open-source agentic system built for developers who want AI agents capable of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Planning&lt;/strong&gt; multi-step tasks autonomously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using tools&lt;/strong&gt; (APIs, databases, file systems)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reasoning&lt;/strong&gt; across complex, dynamic workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike closed-source alternatives, everything runs on your hardware. You own the model, the data, and the execution environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Run an Agent Locally?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt; — Your data never leaves your machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt; — No per-token API fees for inference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control&lt;/strong&gt; — Fine-tune behavior without vendor lock-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization&lt;/strong&gt; — Modify the reasoning loop and tool integrations&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setting Up Hermes Agent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;GPU with 8GB+ VRAM (or CPU with sufficient RAM)&lt;/li&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 1: Clone the Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash
git clone https://github.com/hermes-agent/hermes-agent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;hermes-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Install Dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Configure Your Model
&lt;/h3&gt;

&lt;p&gt;Create a config.yaml:&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="s"&gt;yaml&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;llama-cpp"&lt;/span&gt;
  &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./models/hermes-3-llama-3.1-8b-Q4_K_M.gguf"&lt;/span&gt;
  &lt;span class="na"&gt;context_length&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8192&lt;/span&gt;

&lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;max_iterations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Define Your First Tool
&lt;/h3&gt;

&lt;p&gt;Create tools/search.py:&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="n"&gt;Python&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;web_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Search the web for information.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.search.example?q=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&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;Register it in tools/&lt;strong&gt;init&lt;/strong&gt;.py:&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="n"&gt;Python&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.search&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;web_search&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;web_search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;web_search&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;h3&gt;
  
  
  Step 5: Run Your First Task
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; hermes_agent &lt;span class="nt"&gt;--task&lt;/span&gt; &lt;span class="s2"&gt;"Find the latest news about open-source AI agents"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How It Works: The ReAct Loop
&lt;/h3&gt;

&lt;p&gt;Hermes Agent follows a Reasoning + Acting cycle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Observation — Receives input or feedback&lt;/li&gt;
&lt;li&gt;Thought — Reasons about next steps&lt;/li&gt;
&lt;li&gt;Action — Selects and executes a tool&lt;/li&gt;
&lt;li&gt;Repeat — Until task completion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This loop enables true multi-step problem solving, not just text generation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical Tool Integrations
&lt;/h3&gt;

&lt;h3&gt;
  
  
  File System Operations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Database Queries&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="n"&gt;Python&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data.db&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetchall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tips for Better Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tip&lt;/th&gt;
&lt;th&gt;Why It Helps&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Write detailed tool descriptions&lt;/td&gt;
&lt;td&gt;The agent uses docstrings to choose tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start with narrow tasks&lt;/td&gt;
&lt;td&gt;Complex tasks may need custom planning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use structured output formats&lt;/td&gt;
&lt;td&gt;JSON schemas improve parsing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitor the reasoning loop&lt;/td&gt;
&lt;td&gt;Add logging to see step-by-step thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;p&gt;Hardware requirements — Local models need significant compute&lt;br&gt;
Tool reliability — The agent depends on tool quality&lt;br&gt;
Planning complexity — Long-horizon tasks may need custom orchestration&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Hermes Agent represents something important: a capable, open alternative in a space increasingly dominated by closed systems. Whether you're building a research assistant or experimenting with agentic AI, running it locally gives you freedom that API-only solutions can't match.&lt;br&gt;
The project is actively developed, and the community is growing. If you're curious about the future of open AI agents, Hermes Agent is worth your time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hermes Agent GitHub&lt;/li&gt;
&lt;li&gt;DEV Hermes Agent Challenge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Have you tried Hermes Agent? Share your setup experience in the comments!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
    </item>
    <item>
      <title>How I Added dbt Cloud to Coral — My Open Source Hackathon Journey</title>
      <dc:creator>Gaurang Bhatt</dc:creator>
      <pubDate>Thu, 28 May 2026 09:20:30 +0000</pubDate>
      <link>https://dev.to/gaurang_bhatt_b6d91a19879/how-i-added-dbt-cloud-to-coral-my-open-source-hackathon-journey-4gg3</link>
      <guid>https://dev.to/gaurang_bhatt_b6d91a19879/how-i-added-dbt-cloud-to-coral-my-open-source-hackathon-journey-4gg3</guid>
      <description>&lt;h2&gt;
  
  
  What is Coral?
&lt;/h2&gt;

&lt;p&gt;Coral is an open-source tool that lets you query any API, database, &lt;br&gt;
or file as SQL — no ETL, no warehouse, no glue code.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem I Solved
&lt;/h2&gt;

&lt;p&gt;dbt Cloud is used by thousands of data engineers. But there was no &lt;br&gt;
way to query dbt Cloud jobs, runs, and environments via SQL. I built that.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PR #627 — dbt Cloud Community Source&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Added 3 tables to Coral:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dbt_cloud.jobs&lt;/code&gt; — all jobs with schedules and state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dbt_cloud.runs&lt;/code&gt; — run history with status codes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dbt_cloud.environments&lt;/code&gt; — deployment environments&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# manifest.yaml (simplified)&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;dbt_cloud&lt;/span&gt;
&lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;
&lt;span class="na"&gt;tables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&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;jobs&lt;/span&gt;
  &lt;span class="pi"&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;runs&lt;/span&gt;  
  &lt;span class="pi"&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;environments&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Live Demo
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Query 890 open PRs from Coral repo&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pulls&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'withcoral'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'coral'&lt;/span&gt; 
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'open'&lt;/span&gt; 
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Result: &lt;strong&gt;890 rows in ~10 seconds. No ETL. Just SQL.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Status Codes I Learned
&lt;/h2&gt;

&lt;p&gt;dbt Cloud run status codes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 = Queued&lt;/li&gt;
&lt;li&gt;2 = Starting
&lt;/li&gt;
&lt;li&gt;3 = Running&lt;/li&gt;
&lt;li&gt;10 = Success&lt;/li&gt;
&lt;li&gt;20 = Error&lt;/li&gt;
&lt;li&gt;30 = Cancelled&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pagination&lt;/strong&gt; — dbt Cloud uses offset pagination, had to implement correctly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timestamps&lt;/strong&gt; — ISO8601 format needed special handling in Coral DSL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Virtual columns&lt;/strong&gt; — filter echo columns needed for debugging&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How to write a Coral source manifest (DSL v3)&lt;/li&gt;
&lt;li&gt;HTTP backend configuration&lt;/li&gt;
&lt;li&gt;Open source contribution workflow — fork, branch, PR, review&lt;/li&gt;
&lt;li&gt;Real API pagination patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;PR #627 merged into &lt;code&gt;withcoral/coral&lt;/code&gt; ✅&lt;/p&gt;

&lt;p&gt;Now any Coral user can:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;started_at&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;dbt_cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;runs&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;dbt_cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;job_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;  &lt;span class="c1"&gt;-- Error&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;started_at&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;coral &lt;span class="nb"&gt;source &lt;/span&gt;add &lt;span class="nt"&gt;--file&lt;/span&gt; sources/community/dbt_cloud/manifest.yaml
coral sql &lt;span class="s2"&gt;"SELECT * FROM dbt_cloud.jobs LIMIT 10"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Merged PR: &lt;a href="https://github.com/withcoral/coral/pull/627" rel="noopener noreferrer"&gt;https://github.com/withcoral/coral/pull/627&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Coral repo: &lt;a href="https://github.com/withcoral/coral" rel="noopener noreferrer"&gt;https://github.com/withcoral/coral&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pirates of the Coral-bean hackathon: &lt;a href="https://wemakedevs.org/hackathons/coral" rel="noopener noreferrer"&gt;https://wemakedevs.org/hackathons/coral&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built during Pirates of the Coral-bean hackathon by @WeMakeDevs 🏴‍☠️&lt;/em&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>sql</category>
    </item>
    <item>
      <title>I Built Multi-Agent Systems Before NEXT '26 — Here's What the New ADK, MCP &amp; A2A Stack Actually Changes</title>
      <dc:creator>Gaurang Bhatt</dc:creator>
      <pubDate>Tue, 28 Apr 2026 12:07:27 +0000</pubDate>
      <link>https://dev.to/gaurang_bhatt_b6d91a19879/i-built-multi-agent-systems-before-next-26-heres-what-the-new-adk-mcp-a2a-stack-actually-3ek1</link>
      <guid>https://dev.to/gaurang_bhatt_b6d91a19879/i-built-multi-agent-systems-before-next-26-heres-what-the-new-adk-mcp-a2a-stack-actually-3ek1</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-cloud-next-2026-04-22"&gt;Google Cloud NEXT Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  I Built Multi-Agent Systems Before NEXT '26 — Here's What the New ADK, MCP &amp;amp; A2A Stack Actually Changes
&lt;/h1&gt;

&lt;p&gt;I'll be honest: when Google Cloud NEXT '26 started announcing updates to the agent platform, my first reaction wasn't excitement — it was relief.&lt;/p&gt;

&lt;p&gt;Over the past few months, I've been systematically building up on the Google Cloud agent ecosystem — starting from the &lt;strong&gt;Cloud Technical Series OnBoard Edition&lt;/strong&gt; (January 2026, hands-on AI Agents), then &lt;strong&gt;AI in Action&lt;/strong&gt; (March 2026, Gemini Enterprise &amp;amp; agentic CX), through &lt;strong&gt;Code Vipassana Season 14&lt;/strong&gt; ("Building Serverless Data Agents", Outstanding rating), and finally the &lt;strong&gt;Gen AI Academy APAC Edition&lt;/strong&gt; where I built and deployed a live &lt;strong&gt;Multi-Agent Productivity Assistant&lt;/strong&gt; on Cloud Run. I've written real code with ADK, integrated MCP tools, debugged agent routing issues at 11pm, and even submitted a &lt;a href="https://github.com/exedistrict-ux/mcp-toolbox-sdk-java/pull/1" rel="noopener noreferrer"&gt;PR to the MCP Toolbox Java SDK&lt;/a&gt; to fix a broken run command that was tripping up developers.(&lt;a href="https://github.com/exedistrict-ux/mcp-toolbox-sdk-java/pull/1" rel="noopener noreferrer"&gt;https://github.com/exedistrict-ux/mcp-toolbox-sdk-java/pull/1&lt;/a&gt;) to fix a broken run command that was tripping up developers.&lt;/p&gt;

&lt;p&gt;So when I say the announcements at NEXT '26 — specifically around &lt;strong&gt;ADK&lt;/strong&gt;, &lt;strong&gt;MCP becoming universal&lt;/strong&gt;, and the &lt;strong&gt;A2A Protocol&lt;/strong&gt; — are genuinely meaningful, I'm not speaking as someone who read a blog post. I'm speaking as someone who felt these pain points firsthand.&lt;/p&gt;

&lt;p&gt;Let me show you exactly what changed and why it matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pain I Was Solving (Before NEXT '26)
&lt;/h2&gt;

&lt;p&gt;In my Gen AI Academy project, I built a multi-agent system with a &lt;code&gt;ProductivityCoordinator&lt;/code&gt; primary agent that routed requests to three sub-agents: &lt;code&gt;TaskAgent&lt;/code&gt;, &lt;code&gt;NotesAgent&lt;/code&gt;, and &lt;code&gt;CalendarAgent&lt;/code&gt; — all deployed serverlessly on Google Cloud Run.&lt;/p&gt;

&lt;p&gt;The architecture worked. But building it was messier than it should have been.&lt;/p&gt;

&lt;p&gt;The biggest friction points were:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tool integration required too much manual wiring.&lt;/strong&gt; Connecting each sub-agent to its data source meant writing custom adapter logic every time. There was no standard interface — you just hoped your patterns were consistent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Agent-to-agent communication was hardcoded.&lt;/strong&gt; My &lt;code&gt;ProductivityCoordinator&lt;/code&gt; knew about &lt;code&gt;TaskAgent&lt;/code&gt;, &lt;code&gt;NotesAgent&lt;/code&gt;, and &lt;code&gt;CalendarAgent&lt;/code&gt; at &lt;em&gt;build time&lt;/em&gt;. If I wanted to add a new sub-agent, I had to modify the coordinator's routing logic manually. There was no discovery mechanism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. MCP tools existed, but weren't seamlessly integrated.&lt;/strong&gt; I integrated three MCP tools as sub-agents in my project. It worked, but it required explicit configuration for each one. The dream of "just point your agent at a service and it works" wasn't quite reality yet.&lt;/p&gt;

&lt;p&gt;Now look at what NEXT '26 announced.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. ADK: From Pattern to Platform
&lt;/h2&gt;

&lt;p&gt;When I built my multi-agent system, I was following the &lt;strong&gt;ADK pattern&lt;/strong&gt; — primary agent coordinating sub-agents, tools attached via function definitions, deployed on Cloud Run. It worked, but I was essentially implementing the pattern myself with Flask and Python.&lt;/p&gt;

&lt;p&gt;The ADK announced at NEXT '26 formalizes all of this. The &lt;code&gt;AgentRuntime&lt;/code&gt; handles what I was doing manually: session management, scaling, retry logic, state persistence across requests.&lt;/p&gt;

&lt;p&gt;Here's roughly what my coordinator looked like before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# My Gen AI Academy project — manual routing
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProductivityCoordinator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;task&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;task_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;note&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calendar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calendar_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dashboard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="c1"&gt;# Multi-step: call all three simultaneously
&lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;aggregate_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the new ADK, the &lt;code&gt;AgentRuntime&lt;/code&gt; handles the plumbing. You focus on defining skills and tools — not writing routing logic from scratch.&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.cloud.agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ADK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tool&lt;/span&gt;

&lt;span class="nd"&gt;@Tool&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;manage_tasks&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;Add, list, or complete tasks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;manage_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Your task logic here
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&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;ADK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_agent&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;productivity-coordinator&lt;/span&gt;&lt;span class="sh"&gt;"&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-2.0-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;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;manage_tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;manage_notes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;manage_calendar&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;This isn't a trivial improvement. The boilerplate I wrote for my Code Vipassana S14 project would shrink dramatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Universal MCP: The Integration Problem, Solved
&lt;/h2&gt;

&lt;p&gt;This is the announcement that made me stop and re-read twice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every Google Cloud service is now MCP-enabled by default.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Code Vipassana Season 14, one of the sessions I attended was specifically on building secure multiagent systems with &lt;strong&gt;Model Armor and MCP Toolbox for Databases&lt;/strong&gt;. I also attended the session on building a schema-aware agent with BigQuery. In both cases, MCP tools required explicit setup — you had to define the connection, configure credentials, and write the integration.&lt;/p&gt;

&lt;p&gt;That's now gone. Here's what the new model looks like:&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;"protocol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tool"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bigquery.query"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&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;"project_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SELECT * FROM productivity.tasks WHERE status = 'pending'"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your agent sends a standard MCP request. The Cloud service handles auth, execution, and returns a standardized response.&lt;/p&gt;

&lt;p&gt;I actually found the typo in the MCP Toolbox Java SDK's README while working through one of these integrations — the run command said &lt;code&gt;mvn sprint-boot:run&lt;/code&gt; instead of &lt;code&gt;mvn spring-boot:run&lt;/code&gt;. A small thing, but the kind of friction that breaks developer flow. I submitted a PR to fix it. The broader point: this tooling was still rough. Universal MCP support is Google acknowledging that and doing something about it.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. A2A Protocol: The Missing Piece in My Architecture
&lt;/h2&gt;

&lt;p&gt;This is the one that would have changed my Gen AI Academy project the most.&lt;/p&gt;

&lt;p&gt;My &lt;code&gt;ProductivityCoordinator&lt;/code&gt; was hardcoded. It knew its sub-agents at build time. That's fine for a bounded project, but it doesn't scale. If you want a genuinely modular agent architecture — where new specialists can be added without modifying the orchestrator — you need a discovery mechanism.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Agent-to-Agent (A2A) Protocol&lt;/strong&gt; and &lt;strong&gt;Agent Registry&lt;/strong&gt; are exactly that.&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="c1"&gt;# How my Gen AI Academy project COULD have been built
&lt;/span&gt;&lt;span class="n"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AgentRegistry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Coordinator dynamically discovers what's available
&lt;/span&gt;&lt;span class="n"&gt;available_agents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_agents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;productivity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Routes to the right specialist at runtime — not build time
&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;available_agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;session_context&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With A2A, adding a new sub-agent (say, an &lt;code&gt;EmailAgent&lt;/code&gt;) doesn't require touching the coordinator at all. It registers itself, announces its capabilities, and the orchestrator discovers it dynamically.&lt;/p&gt;

&lt;p&gt;This is what I was manually approximating. Now there's a protocol for it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Memory Bank: The Problem I Didn't Fully Solve
&lt;/h2&gt;

&lt;p&gt;In my productivity assistant, state was in-memory per session. Tasks, notes, and calendar events persisted within a session but not across them. That was fine for a demo, but in production it's a real limitation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory Bank&lt;/strong&gt; addresses this directly — agents can store and retrieve context across sessions using semantic similarity:&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="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_agent&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;productivity-coordinator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;MemoryBank&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;long_term&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;retrieve_strategy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic_similarity&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A user's task priorities, their preferred working style, their recurring meeting patterns — all of this can now persist. This is the difference between a demo and a product.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Still Watching
&lt;/h2&gt;

&lt;p&gt;A few honest caveats from someone who has been in the weeds:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Identity and IAM integration is the piece I'm most cautious about.&lt;/strong&gt; In my Code Vipassana S14 session on secure multiagent systems, we saw how quickly authorization complexity compounds when you have multiple agents accessing different data sources. The Agent Identity feature looks right architecturally — each agent gets its own service account — but I'll want to see how it handles cross-agent delegation in practice before trusting it in a production billing or HR system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "serverless" promise depends heavily on cold start behavior.&lt;/strong&gt; My Cloud Run deployment for the productivity assistant had noticeable cold starts. Agent Runtime inherits Cloud Run's runtime, so the same tradeoffs apply. For latency-sensitive agentic workflows, this matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A2A's Agent Registry is only as useful as what's registered in it.&lt;/strong&gt; The discovery mechanism is elegant, but in a real enterprise environment, you'll need governance around what gets registered and how capabilities are described. That's an organizational challenge as much as a technical one.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Full Picture
&lt;/h2&gt;

&lt;p&gt;Here's how the stack connects, from my perspective as someone who has built pieces of this manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Request
     │
     ▼
Orchestrator Agent (ADK + AgentRuntime)
     │
     ├── MCP ──► Any Google Cloud Service (BigQuery, Spanner, GCS...)
     │           [No custom adapters. Default on everything.]
     │
     ├── A2A ──► Agent Registry ──► Specialist Agents
     │           [Dynamic discovery. No hardcoded routing.]
     │
     ├── Memory Bank
     │   [Persistent context across sessions.]
     │
     └── Agent Gateway + Agent Identity
         [IAM at the agent level. Centralized policy.]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six months ago, I was building the middle three layers by hand. ADK gave me the pattern but not the platform. MCP tools existed but weren't universal. Agent-to-agent communication was ad-hoc.&lt;/p&gt;

&lt;p&gt;NEXT '26 is Google Cloud saying: we're making this the platform, not just a pattern.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where to Start
&lt;/h2&gt;

&lt;p&gt;If you want to get hands-on with this stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://rsvp.withgoogle.com/events/cv" rel="noopener noreferrer"&gt;Code Vipassana&lt;/a&gt;&lt;/strong&gt; — The lab series I went through. Season 14 covered serverless data agents end-to-end. Highly recommend the ADK and MCP sessions specifically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://hack2skill.com/event/apac-genaiacademy" rel="noopener noreferrer"&gt;Gen AI Academy APAC Edition&lt;/a&gt;&lt;/strong&gt; — Cohort 1 just wrapped. Watch for the next cohort if you want structured hands-on time with the full stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ADK Docs&lt;/strong&gt;: &lt;a href="https://cloud.google.com/agent-development-kit" rel="noopener noreferrer"&gt;cloud.google.com/agent-development-kit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A2A Protocol&lt;/strong&gt;: &lt;a href="https://cloud.google.com/a2a" rel="noopener noreferrer"&gt;cloud.google.com/a2a&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The NEXT '26 Developer Keynote sessions are available on the DEV homepage — the demos of ADK + MCP + A2A working together are worth watching even if you've read all the docs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Gaurang Bhatt — Code Vipassana Season 14 Troubleshooter, Gen AI Academy APAC participant. Currently building on Google Cloud and occasionally fixing typos in SDKs at odd hours. What are you building with the new agent stack? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>cloudnextchallenge</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Unnecessary Dark Mode™ — It Just Gets Darker (And That's It)</title>
      <dc:creator>Gaurang Bhatt</dc:creator>
      <pubDate>Thu, 09 Apr 2026 04:26:48 +0000</pubDate>
      <link>https://dev.to/gaurang_bhatt_b6d91a19879/unnecessary-dark-mode-it-just-gets-darker-and-thats-it-339e</link>
      <guid>https://dev.to/gaurang_bhatt_b6d91a19879/unnecessary-dark-mode-it-just-gets-darker-and-thats-it-339e</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A dark mode toggle that does exactly one thing: make your screen darker. And darker. And darker.&lt;/p&gt;

&lt;p&gt;No light mode comeback. No useful UI. No purpose. Just 10 levels of increasing darkness until you can't see anything at all — and a little message at the end congratulating you on achieving absolutely nothing.&lt;/p&gt;

&lt;p&gt;Level 0: "Perfectly usable. How boring."&lt;br&gt;
Level 10: "You have reached peak dark mode. Congratulations on nothing."&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;a href="https://codepen.io/Gaurang-Bhatt-the-scripter/pen/QwKVJzN" rel="noopener noreferrer"&gt;Live Demo on CodePen&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Core concept: a button that makes things worse --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"moreDark()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Make it darker ▾&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
` ` `

Full source: [CodePen](https://codepen.io/Gaurang-Bhatt-the-scripter/pen/QwKVJzN)

## How I Built It

Pure HTML + CSS + vanilla JavaScript. No frameworks. No libraries. No dependencies — because why add complexity to something this pointless?

- 10 dark levels using CSS classes
- Smooth `transition` animations between levels
- Stars appear as it gets darker (for atmosphere)
- Progress bar that tracks how deep into uselessness you've gone
- Messages that get increasingly philosophical as the screen dies

Total build time: ~1 hour. Time spent questioning my life choices: ongoing.

## Prize Category

**Community Favorite** — because sometimes the internet just wants to watch a screen go dark for no reason.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;બસ આ paste કરો અને &lt;strong&gt;Publish&lt;/strong&gt; દબાવો! All the best! 🏆&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
