<?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: Cless</title>
    <description>The latest articles on DEV Community by Cless (@liberifatali).</description>
    <link>https://dev.to/liberifatali</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%2F3613549%2Fa2c3e8cd-b4b3-43ab-823f-80ad1367ffeb.jpg</url>
      <title>DEV Community: Cless</title>
      <link>https://dev.to/liberifatali</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/liberifatali"/>
    <language>en</language>
    <item>
      <title>The Watch Missed the Turn</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Thu, 17 Sep 2026 02:04:42 +0000</pubDate>
      <link>https://dev.to/liberifatali/the-watch-missed-the-turn-3nmh</link>
      <guid>https://dev.to/liberifatali/the-watch-missed-the-turn-3nmh</guid>
      <description>&lt;p&gt;&lt;a href="https://github.com/LiberiFatali/starpath" rel="noopener noreferrer"&gt;StarPath&lt;/a&gt; puts Google Maps turns on the &lt;a href="https://us.amazfit.com/products/active-2-round" rel="noopener noreferrer"&gt;Amazfit Active 2&lt;/a&gt;. It reposts navigation as big text cards like &lt;code&gt;▶▶ / Nguyen Hue / DEST 450 m · 6 min&lt;/code&gt; (mark + street + remaining-trip line). The Zepp app mirrors that text to the watch. The watch shows text only. Images never arrive.&lt;/p&gt;

&lt;p&gt;In the first version of StarPath, my watch missed all turns. My phone showed a clear left arrow. My wrist showed nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design for the narrowest channel
&lt;/h2&gt;

&lt;p&gt;Every pipeline has a narrow hop. Mine sits between phone and watch: text passes, images die.&lt;/p&gt;

&lt;p&gt;I built for the wide end first. I rendered sharp arrows for the phone shade and assumed the watch would show them. It never did. Only title and body travel over Bluetooth.&lt;/p&gt;

&lt;p&gt;The fix started when I stopped asking what I sent and asked what actually survived. The answer was plain text, a street name, and the remaining trip distance. Everything else had to become text before the hop, or it vanished.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat missing data as missing
&lt;/h2&gt;

&lt;p&gt;Maps often posts icon-only directions: a distance plus a street name, no verb. No "turn left." No "head south." Just &lt;code&gt;40 m&lt;/code&gt; and a road.&lt;/p&gt;

&lt;p&gt;A parser sees nothing to parse. That is not failure. That is absence.&lt;/p&gt;

&lt;p&gt;I first treated these cards as errors. Then I routed them to a second signal. A confident icon verdict wins over text; text is the fallback for icon-missing/low-confidence frames (canonical order in &lt;code&gt;IMPLEMENTATION.md §5&lt;/code&gt;). Each source owns its strength, and neither begs the other for help.&lt;/p&gt;

&lt;p&gt;Name the absence. Then pick the next-best evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefer the stable weak signal
&lt;/h2&gt;

&lt;p&gt;The rich fix tempted me: open Maps' private notification layout and read its hidden instruction field. Others had mapped it. It worked in the lab.&lt;/p&gt;

&lt;p&gt;It broke in the field. Maps ships often. Each release moves fields. Each phone skin renders them a little differently. My background listener grew heavy with layout code that chased someone else's UI.&lt;/p&gt;

&lt;p&gt;I dropped it.&lt;/p&gt;

&lt;p&gt;The weak signal won: the small direction arrow attached to every notification. It carries less information, but it always ships. It needs no private API and no layout inflation. It survives updates because Maps itself needs it.&lt;/p&gt;

&lt;p&gt;Choose the signal you can keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Match the invariant, not the picture
&lt;/h2&gt;

&lt;p&gt;I tried to match arrows the obvious way. I compared whole icons against stored icons. I compared arrowheads against stored heads.&lt;/p&gt;

&lt;p&gt;Both failed on real rides. Thin arrows scored too low to trust. Thick arrows tied: one left hook matched left and right equally, because its fat corner resembled both. Shift, thickness, and dash style broke every template. They vary constantly and mean nothing.&lt;/p&gt;

&lt;p&gt;A turn arrow holds one stable trait. Its top leans one way, and its foot anchors the other. A left hook carries weight high on the left and low on the right. A right hook mirrors it. A straight arrow stacks its weight down the center.&lt;/p&gt;

&lt;p&gt;So the working check ignores style and weighs position. It finds the arrow, shrinks it to a tiny grid, centers it, and compares where the upper mass sits against the lower mass. Left leans left. Right leans right. Center holds straight.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upper mass:      left | center | right
lower mass:      right| center | left
verdict:         turn | go on  | turn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thickness cancels out. Dashes cancel out. Shift cancels out. The subtraction keeps only direction, which is all the rider needs.&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%2Fraw.githubusercontent.com%2FLiberiFatali%2Fstarpath%2F8fac97036086c516926e986bd5fd2a15e4c02071%2Fdocs%2Fassets%2Farrow%2F3_maps_starpath_turn_right.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%2Fraw.githubusercontent.com%2FLiberiFatali%2Fstarpath%2F8fac97036086c516926e986bd5fd2a15e4c02071%2Fdocs%2Fassets%2Farrow%2F3_maps_starpath_turn_right.jpg" alt="A thick right arrow the old matcher tied, now read correctly" width="800" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Order evidence, then admit ignorance
&lt;/h2&gt;

&lt;p&gt;The order matters more than any single check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Trust pixels first when confident — they are language-free and immune to ambiguous phrasing like bare &lt;code&gt;toward X&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Trust words second, as fallback for icon-missing/low-confidence frames. They name U-turns best.&lt;/li&gt;
&lt;li&gt;Show &lt;code&gt;?&lt;/code&gt; when both stay silent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last step took discipline. A straight arrow feels helpful. It also sends riders through intersections when the classifier guesses wrong. Short fragments, lone heads without shafts, and blank icons all earn a question mark. A question mark tells the truth: glance at your phone.&lt;/p&gt;

&lt;p&gt;A confident wrong answer costs more than an honest gap.&lt;/p&gt;

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

&lt;p&gt;The watch still shows five marks: &lt;code&gt;◀◀&lt;/code&gt; go left, &lt;code&gt;▶▶&lt;/code&gt; go right, &lt;code&gt;▲▲&lt;/code&gt; go on, &lt;code&gt;DEST&lt;/code&gt; destination, &lt;code&gt;?&lt;/code&gt; look up. Icon-only turns now resolve instead of shrugging. Unknowns still shrug instead of lying.&lt;/p&gt;

&lt;p&gt;The broader lessons travel well beyond watches: find the narrowest channel, name missing data, pick stable signals, match invariants, order your evidence, and prefer doubt over false confidence.&lt;/p&gt;

&lt;p&gt;Glance only. Never touch your watch while riding.&lt;/p&gt;

</description>
      <category>android</category>
      <category>computervision</category>
      <category>navigation</category>
    </item>
    <item>
      <title>5-Day AI Agents: Intensive Vibe Coding Course With Google – Complete Guide [Day 1-5]</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Mon, 15 Jun 2026 09:18:17 +0000</pubDate>
      <link>https://dev.to/liberifatali/day-1-assignment-5-day-ai-agents-intensive-vibe-coding-course-with-google-17bd</link>
      <guid>https://dev.to/liberifatali/day-1-assignment-5-day-ai-agents-intensive-vibe-coding-course-with-google-17bd</guid>
      <description>&lt;p&gt;I completed Google's 5-Day AI Agents intensive vibe coding course. This post consolidates all 5 daily assignments into one complete guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Day 1 – Introduction to Agents &amp;amp; Vibe Coding&lt;/li&gt;
&lt;li&gt;Day 2 – Agent Tools &amp;amp; Interoperability&lt;/li&gt;
&lt;li&gt;Day 3 – Agent Skills&lt;/li&gt;
&lt;li&gt;Day 4 – Vibe Coding Agent Security and Evaluation&lt;/li&gt;
&lt;li&gt;Day 5 – Spec-Driven Production Grade Development&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Day 1 – Introduction to Agents &amp;amp; Vibe Coding
&lt;/h2&gt;

&lt;p&gt;🎒 &lt;strong&gt;Assignment – Complete Unit 1 – "Introduction to Agents &amp;amp; Vibe Coding"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listen to the &lt;a href="https://www.youtube.com/watch?v=cbzmr7vt4XA" rel="noopener noreferrer"&gt;summary podcast&lt;/a&gt; episode for this unit.&lt;/li&gt;
&lt;li&gt;To complement the podcast, read "&lt;a href="https://www.kaggle.com/whitepaper-the-new-SDLC-with-vibe-coding" rel="noopener noreferrer"&gt;The New SDLC with Vibe Coding&lt;/a&gt;" whitepaper.&lt;/li&gt;
&lt;li&gt;Complete these codelabs:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://codelabs.developers.google.com/getting-started-google-antigravity" rel="noopener noreferrer"&gt;Get started&lt;/a&gt; with Antigravity 2.0 and IDE&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codelabs.developers.google.com/deploy-from-aistudio-to-run" rel="noopener noreferrer"&gt;Build&lt;/a&gt; a Web Application in AI Studio and Deploy to Cloud Run&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;What You’ll Learn&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's whitepaper talks about the transition from manual syntax coding to intent-driven "vibe coding" and disciplined "agentic engineering." It explores how AI agents compress the traditional software development life cycle (SDLC) and explains the "factory model" where developers act as system orchestrators who design the evaluation, constraint, and context harnesses that safely guide autonomous execution.&lt;/p&gt;

&lt;p&gt;In the codelabs, you'll familiarize yourself with Antigravity 2.0, the Antigravity IDE, and the Antigravity CLI to vibecode your first applications. You'll also use Google AI Studio to deploy your app to Cloud Run, enabling you to share your vibe coded app with your friends.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 2 – Agent Tools &amp;amp; Interoperability
&lt;/h2&gt;

&lt;p&gt;🎒 &lt;strong&gt;Assignment – Complete Unit 2 - “Agent Tools &amp;amp; Interoperability”&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listen to the &lt;a href="https://www.youtube.com/watch?v=GjjKXqxFTOY" rel="noopener noreferrer"&gt;summary podcast&lt;/a&gt; episode for this unit.&lt;/li&gt;
&lt;li&gt;To complement the podcast, read the "&lt;a href="https://www.kaggle.com/whitepaper-agent-tools-and-interoperability" rel="noopener noreferrer"&gt;Agent Tools &amp;amp; Interoperability&lt;/a&gt;" whitepaper.&lt;/li&gt;
&lt;li&gt;Complete these codelabs:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://codelabs.developers.google.com/antigravity-cli-hands-on" rel="noopener noreferrer"&gt;Get started&lt;/a&gt; with Antigravity CLI&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codelabs.developers.google.com/developer-knowledge-mcp-antigravity" rel="noopener noreferrer"&gt;Explore&lt;/a&gt; Google Developer Knowledge MCP server in Google Antigravity&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;What You’ll Learn&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's whitepaper talks about standardizing the plug-and-play AI ecosystem using open protocols to eliminate the complex technical debt of custom tool integrations. It details how the Model Context Protocol (MCP) connects models to data sources, outlines Agent2Agent (A2A) collaboration, showcases Agent-to-User Interface (A2UI) for generative UI, and introduces Agent Payments Protocol (AP2) and Universal Commerce Protocol (UCP) for secure machine-to-machine commerce.&lt;/p&gt;

&lt;p&gt;In today's codelabs, you'll learn how to add MCP servers to Antigravity, giving it access to the canonical, machine-readable source of Google's public developer documentation. You'll then extend your familiarity with Antigravity by using it via the terminal with Antigravity CLI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 3 – Agent Skills
&lt;/h2&gt;

&lt;p&gt;🎒 &lt;strong&gt;Assignment – Complete Unit 3 - “Agent Skills”&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listen to the &lt;a href="https://www.youtube.com/watch?v=uYURYHhpmKc" rel="noopener noreferrer"&gt;summary podcast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;To complement the podcast, read the "&lt;a href="https://www.kaggle.com/whitepaper-agent-skills" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt;" whitepaper.&lt;/li&gt;
&lt;li&gt;Complete these codelabs on Kaggle:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://codelabs.developers.google.com/getting-started-with-antigravity-skills" rel="noopener noreferrer"&gt;Explore&lt;/a&gt; how Skills work in Antigravity&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codelabs.developers.google.com/agents-cli-adk-lifecycle" rel="noopener noreferrer"&gt;Build&lt;/a&gt; agents in Antigravity with Agents CLI and ADK&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;What You’ll Learn&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's whitepaper talks about managing dynamic context and avoiding "context rot" by equipping agents with portable "Agent Skills", directories structured around a central SKILL.md file. It explains how this framework uses progressive disclosure to keep system prompts lightweight, loading execution details and tools only on demand so that single agents can flex into hundreds of specialist roles efficiently.&lt;/p&gt;

&lt;p&gt;In the codelabs, you will familiarize yourself with skills in Antigravity. Then, using Antigravity, you will install and use Agents CLI skills to create agents, lint your code, and test your agent, all by using natural language prompts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 4 – Vibe Coding Agent Security and Evaluation
&lt;/h2&gt;

&lt;p&gt;🎒 &lt;strong&gt;Assignment – Complete Unit 4 - “Vibe Coding Agent Security and Evaluation”&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listen to the &lt;a href="https://www.youtube.com/watch?v=Ddz1b8CYPvg" rel="noopener noreferrer"&gt;summary podcast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;To complement the podcast, read the "&lt;a href="https://www.kaggle.com/whitepaper-vibe-coding-agent-security-and-evaluation" rel="noopener noreferrer"&gt;Vibe Coding Agent Security and Evaluation&lt;/a&gt;" whitepaper.&lt;/li&gt;
&lt;li&gt;Complete these codelabs:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://codelabs.developers.google.com/vibecode-ambient-expense-agent" rel="noopener noreferrer"&gt;Build&lt;/a&gt; an expense-approval agent with human-in-the-loop triage and local evaluations with ADK, Agents CLI and Antigravity&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codelabs.developers.google.com/secure-agentic-coding" rel="noopener noreferrer"&gt;Write&lt;/a&gt; Secure AI Code: Automated Threat Scans, Safety Guards, and Security Testing&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;What You’ll Learn&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's whitepaper talks about redefining security and evaluation in non-deterministic AI workflows by establishing continuous "Effective Trust" through a strict 7-pillar architecture. It outlines practical safeguards such as ephemeral sandboxing, defenses against hallucinated "slopsquatting" packages, an active Red/Blue/Green security triad, and OpenTelemetry trajectory evaluation.&lt;/p&gt;

&lt;p&gt;In the codelabs, you will create an agent with human-in-the-loop so that humans can manually intervene, using ADK, Agents CLI and Antigravity. You will also learn about how to develop a secure, test-driven development with Antigravity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 5 – Spec-Driven Production Grade Development
&lt;/h2&gt;

&lt;p&gt;🎒 &lt;strong&gt;Final Assignment – Complete Unit 5 - “Spec-Driven Production Grade Development in the Age of Vibe Coding”&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listen to the &lt;a href="https://www.youtube.com/watch?v=VSRdL4wlbLY" rel="noopener noreferrer"&gt;summary podcast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;To complement the podcast, read the "&lt;a href="https://www.kaggle.com/whitepaper-spec-driven-production-grade-development-in-the-age-of-vibe-coding" rel="noopener noreferrer"&gt;Spec-Driven Production Grade Development in the Age of Vibe Coding&lt;/a&gt;" whitepaper.&lt;/li&gt;
&lt;li&gt;Complete these codelabs:

&lt;ul&gt;
&lt;li&gt;[Optional] &lt;a href="https://codelabs.developers.google.com/enterprise-cloud-scale-deploying-the-expense-agent-to-agent-runtime-on-google-cloud" rel="noopener noreferrer"&gt;Deploy&lt;/a&gt; and host your AI agents on Google Cloud&lt;/li&gt;
&lt;li&gt;[Optional] &lt;a href="https://codelabs.developers.google.com/vibecode-frontend-with-antigravity" rel="noopener noreferrer"&gt;Build&lt;/a&gt; a front-end web app and link it to your cloud-hosted AI agent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 &lt;strong&gt;What You’ll Learn&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's whitepaper covers bridging the gap between fragile vibe-coded prototypes and production-grade enterprise software using Spec-Driven Development (SDD). It details how to treat code as disposable and behavior-driven Gherkin specifications as the source of truth, establishing safe, zero-trust development pipelines with automated code-review agents and hybrid Policy Servers.&lt;/p&gt;

&lt;p&gt;In the codelabs, you will learn how to create and deploy an agent to Google Cloud for enterprise scale. Then you will use Antigravity to vibe code a frontend client interface deployed to Cloud Run and tie it to an asynchronous event-triggering architecture that automatically feeds live expense submissions straight to your cloud-hosted agent. While these codelabs are optional today because they may require a billing account on Google Cloud, we still encourage you to scan through them to familiarize yourself with what productionization of agents and apps might look like at enterprise scale.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally posted as 5 separate Day 1-5 assignments (Jun 15-19), now consolidated into this single guide.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>antigravity</category>
      <category>5daysaiagents</category>
    </item>
    <item>
      <title>How to Install Google Antigravity IDE 2.x or Migrate from 1.x on Linux</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Tue, 26 May 2026 08:51:32 +0000</pubDate>
      <link>https://dev.to/liberifatali/how-to-migrate-from-google-antigravity-ide-1x-to-2x-on-linux-with-sandbox-shortcut-fixes-2736</link>
      <guid>https://dev.to/liberifatali/how-to-migrate-from-google-antigravity-ide-1x-to-2x-on-linux-with-sandbox-shortcut-fixes-2736</guid>
      <description>&lt;p&gt;Upgrading from &lt;strong&gt;Antigravity IDE 1.x&lt;/strong&gt; to &lt;strong&gt;Antigravity 2.x&lt;/strong&gt; is a major architectural transition. In the 2.x generation, the core environment has shifted to a robust, standalone, agentic workspace, while retaining a sibling editor package (&lt;strong&gt;Antigravity IDE&lt;/strong&gt;) that houses all your familiar VS Code extensions, settings, and workflows.&lt;/p&gt;

&lt;p&gt;If you are a Linux user transitioning to 2.x using the &lt;code&gt;.tar.gz&lt;/code&gt; archive, you might encounter common friction points such as Chromium sandbox errors or missing desktop integration/taskbar grouping.&lt;/p&gt;

&lt;p&gt;This guide walks you through the entire migration process and solves these issues once and for all.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Back Up Your Data (Don't Skip!)
&lt;/h2&gt;

&lt;p&gt;Before modifying anything, back up your existing settings, extensions, and chat history.&lt;/p&gt;

&lt;p&gt;Open your terminal 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;&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; ~/.gemini/antigravity ~/.gemini/antigravity-backup-manual
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;──────&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Install Antigravity IDE 2.x from &lt;code&gt;.tar.gz&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If you are installing the new version from a &lt;code&gt;.tar.gz&lt;/code&gt; archive, here is the standard system integration workflow:&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Extract and Move to &lt;code&gt;/opt&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Extract the archive and move the directory to  /opt  for system-wide access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvzf&lt;/span&gt; Antigravity-IDE.tar.gz
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;Antigravity-IDE /opt/antigravity-ide
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  B. Fix the Chrome Sandbox Permission Error
&lt;/h3&gt;

&lt;p&gt;When launching the IDE for the first time, you might see this common Electron/Chromium crash error:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;FATAL:setuid_sandbox_host.cc] The SUID sandbox helper binary was found, but is not configured correctly. ... You need to make sure that /opt/antigravity-ide/chrome-sandbox is owned by root and has mode 4755.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fix this by setting the correct owner and SUID permission on the sandbox binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown &lt;/span&gt;root:root /opt/antigravity-ide/chrome-sandbox
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;4755 /opt/antigravity-ide/chrome-sandbox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;──────&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Remove Old 1.x Files
&lt;/h2&gt;

&lt;p&gt;Once you have verified that version 2.x is functioning, you can safely clean up your old 1.x installation files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt remove antigravity
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /path/to/antigravity-ide-old
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;──────&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Fix Duplicate &amp;amp; Blank Taskbar Icons (Desktop Integration)
&lt;/h2&gt;

&lt;p&gt;If you launch the IDE and find that a new, iconless program window opens separately in your dock rather than grouping under your pinned shortcut, the system cannot match your &lt;code&gt;.desktop&lt;/code&gt; file to the running application's window class name ( WM_CLASS ).&lt;/p&gt;

&lt;p&gt;To resolve this, update your desktop shortcut with the correct &lt;code&gt;StartupWMClass&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Create or Edit the Shortcut File
&lt;/h3&gt;

&lt;p&gt;Create a new desktop entry in your local applications directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.local/share/applications/antigravity-ide.desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /usr/share/applications/antigravity-ide.desktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  B. Paste this Optimized Configuration
&lt;/h3&gt;

&lt;p&gt;Ensure the &lt;code&gt;StartupWMClass&lt;/code&gt; is set exactly to antigravity-ide (all lowercase):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;[&lt;span class="n"&gt;Desktop&lt;/span&gt; &lt;span class="n"&gt;Entry&lt;/span&gt;]
&lt;span class="n"&gt;Name&lt;/span&gt;=&lt;span class="n"&gt;Antigravity&lt;/span&gt;-&lt;span class="n"&gt;IDE&lt;/span&gt;
&lt;span class="n"&gt;Comment&lt;/span&gt;=&lt;span class="n"&gt;Experience&lt;/span&gt; &lt;span class="n"&gt;liftoff&lt;/span&gt;
&lt;span class="n"&gt;GenericName&lt;/span&gt;=&lt;span class="n"&gt;Text&lt;/span&gt; &lt;span class="n"&gt;Editor&lt;/span&gt;
&lt;span class="n"&gt;Exec&lt;/span&gt;=/&lt;span class="n"&gt;opt&lt;/span&gt;/&lt;span class="n"&gt;antigravity&lt;/span&gt;-&lt;span class="n"&gt;ide&lt;/span&gt;/&lt;span class="n"&gt;antigravity&lt;/span&gt;-&lt;span class="n"&gt;ide&lt;/span&gt; %&lt;span class="n"&gt;F&lt;/span&gt;
&lt;span class="n"&gt;Icon&lt;/span&gt;=/&lt;span class="n"&gt;opt&lt;/span&gt;/&lt;span class="n"&gt;antigravity&lt;/span&gt;-&lt;span class="n"&gt;ide&lt;/span&gt;/&lt;span class="n"&gt;resources&lt;/span&gt;/&lt;span class="n"&gt;app&lt;/span&gt;/&lt;span class="n"&gt;resources&lt;/span&gt;/&lt;span class="n"&gt;linux&lt;/span&gt;/&lt;span class="n"&gt;code&lt;/span&gt;.&lt;span class="n"&gt;png&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt;=&lt;span class="n"&gt;Application&lt;/span&gt;
&lt;span class="n"&gt;StartupNotify&lt;/span&gt;=&lt;span class="n"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;StartupWMClass&lt;/span&gt;=&lt;span class="n"&gt;antigravity&lt;/span&gt;-&lt;span class="n"&gt;ide&lt;/span&gt;
&lt;span class="n"&gt;Categories&lt;/span&gt;=&lt;span class="n"&gt;TextEditor&lt;/span&gt;;&lt;span class="n"&gt;Development&lt;/span&gt;;&lt;span class="n"&gt;IDE&lt;/span&gt;;
&lt;span class="n"&gt;MimeType&lt;/span&gt;=&lt;span class="n"&gt;application&lt;/span&gt;/&lt;span class="n"&gt;x&lt;/span&gt;-&lt;span class="n"&gt;antigravity&lt;/span&gt;-&lt;span class="n"&gt;workspace&lt;/span&gt;;
&lt;span class="n"&gt;Actions&lt;/span&gt;=&lt;span class="n"&gt;new&lt;/span&gt;-&lt;span class="n"&gt;empty&lt;/span&gt;-&lt;span class="n"&gt;window&lt;/span&gt;;
&lt;span class="n"&gt;Keywords&lt;/span&gt;=&lt;span class="n"&gt;vscode&lt;/span&gt;;

[&lt;span class="n"&gt;Desktop&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;-&lt;span class="n"&gt;empty&lt;/span&gt;-&lt;span class="n"&gt;window&lt;/span&gt;]
&lt;span class="n"&gt;Name&lt;/span&gt;=&lt;span class="n"&gt;New&lt;/span&gt; &lt;span class="n"&gt;Empty&lt;/span&gt; &lt;span class="n"&gt;Window&lt;/span&gt;
&lt;span class="n"&gt;Exec&lt;/span&gt;=/&lt;span class="n"&gt;opt&lt;/span&gt;/&lt;span class="n"&gt;antigravity&lt;/span&gt;-&lt;span class="n"&gt;ide&lt;/span&gt;/&lt;span class="n"&gt;antigravity&lt;/span&gt;-&lt;span class="n"&gt;ide&lt;/span&gt; --&lt;span class="n"&gt;new&lt;/span&gt;-&lt;span class="n"&gt;window&lt;/span&gt; %&lt;span class="n"&gt;F&lt;/span&gt;
&lt;span class="n"&gt;Icon&lt;/span&gt;=/&lt;span class="n"&gt;opt&lt;/span&gt;/&lt;span class="n"&gt;antigravity&lt;/span&gt;-&lt;span class="n"&gt;ide&lt;/span&gt;/&lt;span class="n"&gt;resources&lt;/span&gt;/&lt;span class="n"&gt;app&lt;/span&gt;/&lt;span class="n"&gt;resources&lt;/span&gt;/&lt;span class="n"&gt;linux&lt;/span&gt;/&lt;span class="n"&gt;code&lt;/span&gt;.&lt;span class="n"&gt;png&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  C. Refresh Desktop Database
&lt;/h3&gt;

&lt;p&gt;Apply the changes instantly so the launcher updates your application menu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;update-desktop-database ~/.local/share/applications/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;update-desktop-database /usr/share/applications
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final Step: Unpin any old icons from your dock or taskbar, restart the IDE from your applications menu, and pin the active window. It will now group cleanly under a single high-resolution icon!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>antigravity</category>
      <category>linux</category>
      <category>google</category>
    </item>
    <item>
      <title>Zero-Click Infrastructure: Prompting an AI Agent to Buy and Setup a Domain</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Wed, 13 May 2026 04:40:51 +0000</pubDate>
      <link>https://dev.to/liberifatali/zero-click-infrastructure-prompting-an-ai-agent-to-buy-and-setup-a-domain-5e74</link>
      <guid>https://dev.to/liberifatali/zero-click-infrastructure-prompting-an-ai-agent-to-buy-and-setup-a-domain-5e74</guid>
      <description>&lt;p&gt;Building the &lt;a href="https://worldcuporacle.org" rel="noopener noreferrer"&gt;World Cup Oracle 2026&lt;/a&gt; has been an experiment in fully AI-driven development. I wanted every piece of the stack - from the UI to the deployment- to be built entirely through prompts. But when it came time to deploy, I hit a wall: buying a domain usually requires leaving the terminal, clicking through a registrar's UI, and typing in a credit card. &lt;/p&gt;

&lt;p&gt;How do you get an AI agent to buy a domain for you?&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="https://agentdomainsearch.com" rel="noopener noreferrer"&gt;AgentDomainSearch.com&lt;/a&gt;. It’s an agent-first domain registry that uses &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402&lt;/a&gt; for inline USDC payments and EIP-191 wallet signatures for authentication. No accounts, no API keys, no UIs required.&lt;/p&gt;

&lt;p&gt;Here is the exact tutorial on how I prompted my AI agent to buy &lt;code&gt;worldcuporacle.org&lt;/code&gt; and link it to my Vercel app.&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%2Fcvt1at83sijxaiqn9a0i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvt1at83sijxaiqn9a0i.png" alt="Description" width="800" height="551"&gt;&lt;/a&gt;
&lt;small&gt;&lt;/small&gt;&lt;/p&gt;&lt;center&gt;&lt;small&gt;The future of World Cup prediction is here!&lt;/small&gt;&lt;/center&gt;&lt;p&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1: Funding the Agent's Wallet
&lt;/h2&gt;

&lt;p&gt;First, the agent needs a wallet (&lt;a href="https://dev.to/liberifatali/give-your-ai-agent-a-wallet-in-under-5-mins-with-aethergent-39b4"&gt;give it automatically&lt;/a&gt;). AgentDomainSearch runs on the Base network, so I generated a standard Ethereum wallet for my agent and sent it some USDC (Base) to cover the domain cost.&lt;/p&gt;

&lt;p&gt;I saved the private key in a &lt;code&gt;.env&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WALLET_PRIVATE_KEY=0xYourPrivateKeyHere
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Prompting to Buy the Domain
&lt;/h2&gt;

&lt;p&gt;With the agent funded, I needed it to interact with the AgentDomainSearch API. Because the API uses x402 (a standard for agentic payments), the agent can use the official Python SDK to handle the 402 Payment Required challenges automatically.&lt;/p&gt;

&lt;p&gt;Here is the prompt I used:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; Create a Python script using the &lt;code&gt;x402&lt;/code&gt; SDK to buy &lt;code&gt;worldcuporacle.org&lt;/code&gt; on agentdomainsearch.com. Use the &lt;code&gt;WALLET_PRIVATE_KEY&lt;/code&gt; from the &lt;code&gt;.env&lt;/code&gt; file to sign the EIP-3009 payment authorization. Ensure you provide the necessary contact details in the payload.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent wrote a beautiful script that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hit the &lt;code&gt;POST /worldcuporacle.org&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;li&gt;Caught the &lt;code&gt;402 Payment Required&lt;/code&gt; response.&lt;/li&gt;
&lt;li&gt;Used the wallet to sign the exact USDC amount required.&lt;/li&gt;
&lt;li&gt;Retried the request with the &lt;code&gt;PAYMENT-SIGNATURE&lt;/code&gt; header.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In seconds, the domain was mine. The wallet address that paid the USDC became the owner automatically.&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%2Faxv08lg7gqvrwtmauc2i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faxv08lg7gqvrwtmauc2i.png" alt="purchased domain verification" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Prompting to Setup Vercel DNS
&lt;/h2&gt;

&lt;p&gt;Now that the agent owned the domain, it needed to configure the DNS to point to my existing Vercel deployment. Vercel requires an &lt;code&gt;A&lt;/code&gt; record for the root domain pointing to &lt;code&gt;76.76.21.21&lt;/code&gt; and a &lt;code&gt;CNAME&lt;/code&gt; for &lt;code&gt;www&lt;/code&gt; pointing to &lt;code&gt;cname.vercel-dns.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;AgentDomainSearch handles DNS management via an authenticated &lt;code&gt;PUT /:domain/dns&lt;/code&gt; endpoint, using an EIP-191 signature (&lt;code&gt;agentdomainsearch.com:&amp;lt;unix-timestamp&amp;gt;&lt;/code&gt;) as the Bearer token.&lt;/p&gt;

&lt;p&gt;Here is the prompt to automate the DNS setup:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; Create a bash script &lt;code&gt;setup_domain_vercel.sh&lt;/code&gt; that automates connecting our new domain to Vercel. First, create a Python script to update the DNS on AgentDomainSearch to point the &lt;code&gt;@&lt;/code&gt; A record to &lt;code&gt;76.76.21.21&lt;/code&gt; and the &lt;code&gt;www&lt;/code&gt; CNAME to &lt;code&gt;cname.vercel-dns.com&lt;/code&gt;. Authenticate using the EIP-191 signature from the owner's wallet. Second, run &lt;code&gt;npx vercel domains add &amp;lt;domain&amp;gt;&lt;/code&gt;. Finally, trigger a Vercel deployment to link it up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent got to work. It reverse-engineered the payload structure:&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;"records"&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;"A"&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="nl"&gt;"subdomain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"ip_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"76.76.21.21"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"CNAME"&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="nl"&gt;"subdomain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"www"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cname.vercel-dns.com"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It wrapped the Python DNS update logic, the Vercel CLI domain addition, and the redeployment trigger into one elegant bash script.&lt;/p&gt;




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

&lt;p&gt;I ran the agent's script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/setup_domain_vercel.sh worldcuporacle.org
&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;🌐 Setting up domain: worldcuporacle.org
----------------------------------------
📡 1/3: Configuring DNS records on AgentDomainSearch...
✅ DNS update successful!

☁️  2/3: Adding domain to Vercel project...
&amp;gt; Success! Domain worldcuporacle.org added to project worldcup-oracle.

🚀 3/3: Deploying and aliasing...
🔗  Aliased: https://worldcuporacle.org

🎉 SUCCESS! worldcuporacle.org is now fully configured and live.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;This wasn't just about saving five minutes of clicking around a registrar dashboard. This proves that &lt;strong&gt;end-to-end infrastructure provisioning can now be fully agentic&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;By combining x402 payment standards with modern, API-first services like AgentDomainSearch and Vercel, an AI agent can conceptualize a project, write the code, purchase the domain, configure the DNS, and deploy the application-all autonomously, interacting purely machine-to-machine.&lt;/p&gt;

&lt;p&gt;The future of DevOps is here, and it doesn't rely on a GUI.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;(This is a follow-up post to "&lt;a href="https://dev.to/liberifatali/build-and-deploy-a-world-cup-2026-oracle-in-under-10-minutes-1plk"&gt;Build and Deploy a World Cup 2026 Oracle in Under 10 Minutes&lt;/a&gt;")&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>web3</category>
      <category>x402</category>
    </item>
    <item>
      <title>Build and Deploy a World Cup 2026 Oracle in Under 10 Minutes 🏆</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Fri, 08 May 2026 08:52:46 +0000</pubDate>
      <link>https://dev.to/liberifatali/build-and-deploy-a-world-cup-2026-oracle-in-under-10-minutes-1plk</link>
      <guid>https://dev.to/liberifatali/build-and-deploy-a-world-cup-2026-oracle-in-under-10-minutes-1plk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Here is the generated app &lt;a href="https://worldcup-oracle.vercel.app" rel="noopener noreferrer"&gt;https://worldcup-oracle.vercel.app&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;(If you want to use your own domain, check the next post)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Predicting the future doesn't have to be expensive. In fact, following this &lt;a href="https://drive.google.com/file/d/18PgRLexNeqqye7SfnZMrUVAUw5XxvrHN/view?usp=drive_link" rel="noopener noreferrer"&gt;worldcup-orcale_plan.md&lt;/a&gt;, you can build, host, and deploy a full-scale World Cup 2026 simulator using a minimal, zero-cost stack.&lt;/p&gt;

&lt;p&gt;We're going to use a modern, minimalist approach to get this app live on a free Vercel subdomain, with a streamlined code management flow using AgentRepo.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;The Mission: A Self-Sustaining Predictor&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Our goal is to create a beautiful, self-contained web app where all the complex simulation logic runs entirely on the client side.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. Building the Prediction Engine&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;The heart of the app is a robust engine that calculates team strengths and simulates outcomes using a multi-layered statistical approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;ELO-Based Win Probability&lt;/strong&gt;: We use the standard ELO formula to determine the expected win probability 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 between any two teams.&lt;br&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;W&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size3 size1 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;span class="mord mtight"&gt;/400&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;

In this formula, 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 and 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 represent the ELO ratings of Team A and Team B. The constant &lt;strong&gt;400&lt;/strong&gt; sets the scale of the system; a 400-point rating difference means the stronger team has a 10:1 ratio of expected wins compared to the weaker team.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Poisson-Approximated Goals&lt;/strong&gt;: To simulate realistic scores, we use a Poisson distribution. The parameter 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 (lambda) represents the &lt;strong&gt;Expected Goals (xG)&lt;/strong&gt; for a team. We calculate 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;λ&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 by scaling the historical World Cup average of 1.15 goals per team based on the square root of the teams' relative ELO strengths:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lambdaA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;baseGoals&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;teamA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strength&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;teamB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strength&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;goalsA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;poissonSample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lambdaA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This ensures that while a stronger team is more likely to score, the Poisson distribution still allows for the natural variance and low-scoring "upsets" typical of international football.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2026 Tournament Logic&lt;/strong&gt;: The engine faithfully recreates the expanded 48-team format. It handles 12 groups of four, simulates the round-robin stage, and implements the tie-breaking advancement logic: the top 2 from each group plus the 8 best 3rd-place teams advance to a 32-team knockout bracket.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monte Carlo Simulation&lt;/strong&gt;: To keep the UI buttery smooth while running &lt;strong&gt;10,000 simulations&lt;/strong&gt;, we offload the heavy lifting to a &lt;strong&gt;Web Worker&lt;/strong&gt; (&lt;code&gt;src/monte-carlo.worker.js&lt;/code&gt;). This ensures the browser doesn't freeze while the "Oracle" calculates goal probability distributions and win percentages across thousands of possible timelines.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;2. The Aesthetic: Glassmorphism&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;For the UI, we’re going with a "dark glassmorphism" look, think frosted glass over a high-energy stadium hero background.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero Image Assets&lt;/strong&gt;: We use emoji-based country flags to keep the app ultra-lightweight.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dynamic Design&lt;/strong&gt;: The UI features an animated tournament bracket with smooth CSS transitions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fully Responsive&lt;/strong&gt;: The layout is optimized for both mobile and desktop users.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;The Workflow: AgentRepo + Vercel&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Forget traditional signups. For this project, we’re using &lt;strong&gt;AgentRepo&lt;/strong&gt; for a frictionless, account-free source control experience.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step 1: Push to AgentRepo&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Standard Git repositories often require accounts. With AgentRepo, you simply generate a UUID for the project and push.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Initialize and push to a free UUID org&lt;/span&gt;
git init
&lt;span class="nv"&gt;UUID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'import uuid; print(uuid.uuid4())'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
git remote add origin https://agentrepo.com/&lt;span class="nv"&gt;$UUID&lt;/span&gt;/worldcup-oracle  
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project UUID is saved locally in a gitignored &lt;code&gt;.env&lt;/code&gt; file so you can push updates later.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step 2: Instant Deployment&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Deploying to the cloud is handled via a simple shell script that wraps Vercel’s production deployment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;One-Click Launch&lt;/strong&gt;: Run &lt;code&gt;./scripts/deploy.sh&lt;/code&gt; to go live instantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live URL&lt;/strong&gt;: The app lives at &lt;code&gt;worldcup-oracle.vercel.app&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;: SSL is automatically provisioned and managed for you.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Summary&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This setup proves you can build professional-grade tools with zero overhead. You get:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High-Performance Logic&lt;/strong&gt;: Monte Carlo simulations via Web Workers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No-Auth Source Control&lt;/strong&gt;: Public Git repos without the signup friction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero Cost&lt;/strong&gt;: Total spend is exactly &lt;strong&gt;$0&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Simply hand the &lt;strong&gt;&lt;a href="https://drive.google.com/file/d/18PgRLexNeqqye7SfnZMrUVAUw5XxvrHN/view?usp=drive_link" rel="noopener noreferrer"&gt;worldcup-orcale_plan.md&lt;/a&gt;&lt;/strong&gt; to your favorite AI coding agent and watch it build the future of World Cup 2026 forecasting!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>agentrepo</category>
      <category>web</category>
    </item>
    <item>
      <title>Give your AI agent a wallet in under 5 mins with Aethergent</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Fri, 24 Apr 2026 13:37:47 +0000</pubDate>
      <link>https://dev.to/liberifatali/give-your-ai-agent-a-wallet-in-under-5-mins-with-aethergent-39b4</link>
      <guid>https://dev.to/liberifatali/give-your-ai-agent-a-wallet-in-under-5-mins-with-aethergent-39b4</guid>
      <description>&lt;p&gt;Building an autonomous agent is one thing; giving it the ability to pay for its own API credits or interact with on-chain protocols is another. Traditionally, this required complex SDKs and API keys.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;&lt;a href="https://aethergent.com/" rel="noopener noreferrer"&gt;Aethergent&lt;/a&gt;&lt;/strong&gt;, you can bypass the onboarding friction and give your agent a wallet with a single HTTP call.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Basics: Crypto, Wallets, and Keypairs
&lt;/h2&gt;

&lt;p&gt;Before we code, let's break down what your agent actually needs to interact with a blockchain like Ethereum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;What is a "Wallet"?&lt;/strong&gt; In the context of an AI agent, a wallet isn't an app or a physical object. It is a digital identity that allows the agent to sign transactions and hold assets.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Keypair:&lt;/strong&gt; Every wallet consists of two mathematically linked strings of characters:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Private Key:&lt;/strong&gt; A secret 256-bit number that acts like a digital signature. If your agent has this key, it can move funds. &lt;strong&gt;Never share this.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Public Address:&lt;/strong&gt; Derived from the public key, this is the "account number" (e.g., &lt;code&gt;0x742...&lt;/code&gt;) that others use to send funds to your agent.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Ethereum/EVM:&lt;/strong&gt; Ethereum is the network, and the EVM (Ethereum Virtual Machine) is the standard it uses. A wallet generated via Aethergent works across all EVM-compatible chains, including Base, Optimism, Arbitrum, and Polygon.&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. How Aethergent Works
&lt;/h2&gt;

&lt;p&gt;Aethergent is an open API that performs the math required to generate these keys and returns them instantly over HTTPS. It is stateless and zero-auth, meaning no signups or API keys are required.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Security Note:&lt;/strong&gt; Aethergent does not log or store private keys. However, because the key is generated on a server, it is best suited for micropayment wallets and agent operations rather than storing large amounts of capital.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3. Step-by-Step Integration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step A: Generate the Wallet
&lt;/h3&gt;

&lt;p&gt;Your agent simply needs to make a &lt;code&gt;POST&lt;/code&gt; request to the Aethergent root URL.&lt;/p&gt;

&lt;h4&gt;
  
  
  Using CURL
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://aethergent.com/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Using Python
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="c1"&gt;# One call to get a fresh Ethereum keypair
&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;post&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://aethergent.com/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&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="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;Address: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;address&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;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;Private Key: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;private_key&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;h4&gt;
  
  
  Using Node.js
&lt;/h4&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://aethergent.com/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Agent Address: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step B: Fund the Agent
&lt;/h3&gt;

&lt;p&gt;Once you have the address, send a small amount of ETH or USDC to it from your own wallet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step C: Secure the Key
&lt;/h3&gt;

&lt;p&gt;Do not hardcode the private key. For agents, we recommend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Environment Variables:&lt;/strong&gt; Best for Docker or Cloud deployments.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Secret Managers:&lt;/strong&gt; Use AWS Secrets Manager, GitHub Secrets, or equivalent to keep the key encrypted at rest.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Ephemeral Use:&lt;/strong&gt; Generate a new wallet for every session if the task is one-off.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Advanced: Model Context Protocol (MCP)
&lt;/h2&gt;

&lt;p&gt;If you are using frameworks like &lt;strong&gt;Claude Code&lt;/strong&gt; or &lt;strong&gt;Cursor&lt;/strong&gt;, Aethergent supports &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Your agent can natively discover the &lt;code&gt;generate_wallet&lt;/code&gt; tool via a JSON-RPC 2.0 call to &lt;code&gt;/mcp&lt;/code&gt;, allowing it to create its own wallet without you writing any custom HTTP logic.&lt;/p&gt;




&lt;p&gt;Your agent is now ready to transact on the open web!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What will you build next?&lt;/em&gt; Let me know in the comments! 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>cryptocurrency</category>
      <category>ethereum</category>
    </item>
    <item>
      <title>Google Antigravity - Increase font size for the agent chat area</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Thu, 23 Apr 2026 10:06:14 +0000</pubDate>
      <link>https://dev.to/liberifatali/google-antigravity-increase-font-size-for-the-agent-chat-area-3fem</link>
      <guid>https://dev.to/liberifatali/google-antigravity-increase-font-size-for-the-agent-chat-area-3fem</guid>
      <description>&lt;p&gt;Google Antigravity is a good IDE for AI-assisted coding. From the release, there has been no option to increase the font size in the agent chat, so it's a pain to read text there. The following configuration works for the latest version.&lt;/p&gt;

&lt;p&gt;This &lt;strong&gt;&lt;a href="https://gist.github.com/LiberiFatali/b8482ba2b5030b73aa0fac420a4df650" rel="noopener noreferrer"&gt;Python script&lt;/a&gt;&lt;/strong&gt; will enable setting the font size.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Before&lt;/em&gt;&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%2Fkk0m80ancsx2rh6q1fjq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkk0m80ancsx2rh6q1fjq.png" alt="Chat area before" width="680" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;After&lt;/em&gt;&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%2Fonkpjvrcyop50bam2szz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonkpjvrcyop50bam2szz.png" alt="Chat area after" width="680" height="623"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It implemented steps described &lt;strong&gt;&lt;a href="https://www.reddit.com/r/google_antigravity/comments/1qw4r19/heres_how_to_fix_the_small_font_size_in_google/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>antigravity</category>
      <category>google</category>
    </item>
    <item>
      <title>Zero to Production AI Agents with Gemini 3 + ADK: Days 1-4 + Day 8</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Wed, 03 Dec 2025 01:35:35 +0000</pubDate>
      <link>https://dev.to/liberifatali/advent-of-agents-day-2-4mnp</link>
      <guid>https://dev.to/liberifatali/advent-of-agents-day-2-4mnp</guid>
      <description>&lt;h2&gt;
  
  
  Advent of Agents - Days 1-4 + Day 8: Zero to Production AI Agents
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; Google Cloud &lt;a href="https://adventofagents.com/" rel="noopener noreferrer"&gt;Advent of Agents&lt;/a&gt; Season 1 – December 2025 (Winter Holiday Edition)&lt;br&gt;
25 days. Zero to Production-Ready AI Agents on Google Cloud. Every day &amp;lt; 5 min to try.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Day 1: Launch Initiative&lt;/li&gt;
&lt;li&gt;Day 2: Hello World with YAML&lt;/li&gt;
&lt;li&gt;Day 3: Gemini 3 + ADK&lt;/li&gt;
&lt;li&gt;Day 4: Source-Based Deployment&lt;/li&gt;
&lt;li&gt;Day 8: Effective Context Management with ADK Layers&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Day 1: Launch Initiative
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Original: &lt;a href="https://adventofagents.com/2025/12/01" rel="noopener noreferrer"&gt;adventofagents.com/2025/12/01&lt;/a&gt; | Summary: 25 days. Zero to Production-Ready AI Agents on Google Cloud.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/aYG7h20YNB0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advent of Agents 2025 starts NOW!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every day until Christmas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ One feature, &amp;lt; 5 min to try&lt;/li&gt;
&lt;li&gt;💻 Copy-paste commands that actually work&lt;/li&gt;
&lt;li&gt;📖 Links to docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From quickstart agents to multi-agent orchestration. From local dev to production deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we are covering:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3:&lt;/strong&gt; Context engineering, Computer Use, Live API, and advanced patterns&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://google.github.io/adk-docs/" rel="noopener noreferrer"&gt;Google ADK&lt;/a&gt;: The Agent Development Kit (Python)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cloud.google.com/products/agent-builder" rel="noopener noreferrer"&gt;Vertex AI Agent Engine&lt;/a&gt;: Deploy an Agent in minutes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/GoogleCloudPlatform/agent-starter-pack" rel="noopener noreferrer"&gt;The Agent Starter Pack&lt;/a&gt;: E2E production-ready templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📚 Recommended Reading:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/whitepaper-introduction-to-agents" rel="noopener noreferrer"&gt;Introduction to Agents whitepaper&lt;/a&gt; – released as part of the 5 Days of Agents with Kaggle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://adventofagents.com/" rel="noopener noreferrer"&gt;More info here&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 2: Hello World with YAML
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Original: &lt;a href="https://adventofagents.com/2025/12/02" rel="noopener noreferrer"&gt;adventofagents.com/2025/12/02&lt;/a&gt; | Summary: Build your first AI agent with Gemini 3 in under 5 minutes without writing a single line of code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/bPGf51XBJ44" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4 lines of text = 1 working AI agent.&lt;/li&gt;
&lt;li&gt;No coding. Just YAML.&lt;/li&gt;
&lt;li&gt;A working AI agent powered by Gemini 3&lt;/li&gt;
&lt;li&gt;Google Search integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What you get with 4 lines of YAML:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A working AI agent powered by Gemini 3&lt;/li&gt;
&lt;li&gt;Google Search integration&lt;/li&gt;
&lt;li&gt;Ready to deploy&lt;/li&gt;
&lt;li&gt;Zero programming knowledge needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have your YAML agent, you can add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in tools (&lt;code&gt;google_search&lt;/code&gt;, &lt;code&gt;code_execution&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Custom Python tools (when you're ready)&lt;/li&gt;
&lt;li&gt;Sub-agents for complex workflows&lt;/li&gt;
&lt;li&gt;Multi-agent orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Code &amp;amp; Commands
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx &lt;span class="nt"&gt;--from&lt;/span&gt; google-adk adk create &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;config my_agent
uvx &lt;span class="nt"&gt;--from&lt;/span&gt; google-adk adk web my_agent/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://google.github.io/adk-docs/agents/config/" rel="noopener noreferrer"&gt;ADK Config Agents Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://x.com/Saboo_Shubham_/status/1971038699329908885" rel="noopener noreferrer"&gt;Tutorial: AI Agent with Google Search (YAML)&lt;/a&gt; (~2 mins)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/Saboo_Shubham_/status/1971763476818547010" rel="noopener noreferrer"&gt;Tutorial: Multi-agent app with MCP (YAML)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/adk-docs/tools/third-party/" rel="noopener noreferrer"&gt;Third Party MCP Tools in ADK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Day 3: Gemini 3 + ADK
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Original: &lt;a href="https://adventofagents.com/2025/12/03" rel="noopener noreferrer"&gt;adventofagents.com/2025/12/03&lt;/a&gt; | Summary: Build a powerful AI Agent using Gemini 3 and ADK with native support for Google Search grounding, computer use, and real-time streaming.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/9EGtawwvlNs" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Gemini 3 is Google's most intelligent model yet. In just a few minutes, you can build a powerful AI Agent using Gemini 3 and ADK with native, day-one support for its most advanced capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you get with ADK and Gemini 3:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Search grounding:&lt;/strong&gt; Native access to real-time web data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Computer use:&lt;/strong&gt; Agents that navigate and interact with UIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live API:&lt;/strong&gt; Real-time streaming for voice and video agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native observability:&lt;/strong&gt; Full visibility into Gemini calls, tool use, and agent reasoning&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Setup the project
&lt;/h3&gt;

&lt;p&gt;One liner with Agent Starter Pack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx agent-starter-pack create &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--api-key&lt;/span&gt; &amp;lt;YOUR_GEMINI_API_KEY&amp;gt; my_agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;or&lt;/strong&gt; Using ADK CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv init
uv add google-adk
uv add google-genai
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GOOGLE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_API_KEY"&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
adk create my_agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Download sample and run locally
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/refs/heads/main/ai-ml/agent-labs/gemini-3-pro-agent-demo/my_agent/agent.py'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; my_agent/agent.py
adk web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Minimal &lt;code&gt;agent.py&lt;/code&gt; from the demo:&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;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.tools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google_search&lt;/span&gt;

&lt;span class="n"&gt;root_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;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;search_agent&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-3-pro-preview&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;A helpful assistant that can search Google.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instruction&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 are a helpful assistant with access to Google Search.
    If the user asks a question that requires current information or facts, use the &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;google_search&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; tool.
    Always cite your sources implicitly by providing the answer clearly based on the search results.
    &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;google_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;
  
  
  Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=9EGtawwvlNs&amp;amp;list=PLOU2XLYxmsIJCVXV1bLV7qnT5hilN3YJ7&amp;amp;index=4&amp;amp;t=1s" rel="noopener noreferrer"&gt;Build an AI Agent with Gemini 3 (Video)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/GoogleCloudPlatform/devrel-demos/tree/main/ai-ml/agent-labs/gemini-3-pro-agent-demo" rel="noopener noreferrer"&gt;Gemini 3 Agent Demo (GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/adk-docs/tools/built-in-tools/#google-search" rel="noopener noreferrer"&gt;ADK Google Search Tool Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.google/products/gemini/gemini-3/#gemini-3" rel="noopener noreferrer"&gt;Gemini 3 Announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Day 4: Source-Based Deployment
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Original: &lt;a href="https://adventofagents.com/2025/12/04" rel="noopener noreferrer"&gt;adventofagents.com/2025/12/04&lt;/a&gt; | Summary: Deploy your agents directly from source code with Agent Engine - no more serialization headaches.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/8RjzMG3BKA0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Agent Engine now supports source-based deployment. Your source code deploys directly to production, eliminating common deployment friction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No more dealing with:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pickle errors&lt;/li&gt;
&lt;li&gt;Serialization nightmares&lt;/li&gt;
&lt;li&gt;Module path headaches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What runs locally now runs in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get started with Agent Starter Pack:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a new project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx agent-starter-pack create my-agent &lt;span class="nt"&gt;-a&lt;/span&gt; adk_base &lt;span class="nt"&gt;-d&lt;/span&gt; agent_engine
&lt;span class="nb"&gt;cd &lt;/span&gt;my-agent &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Already have an ADK agent? Use enhance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx agent-starter-pack enhance &lt;span class="nt"&gt;--d&lt;/span&gt; agent_engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then trigger the deployment with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/8RjzMG3BKA0" rel="noopener noreferrer"&gt;Source-Based Deployment Tutorial (Video)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goo.gle/agent-starter-pack" rel="noopener noreferrer"&gt;Agent Starter Pack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/products/agent-engine#deploy" rel="noopener noreferrer"&gt;Agent Engine Deployment Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Day 8: Effective Context Management with ADK Layers
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Original: &lt;a href="https://adventofagents.com/2025/12/08" rel="noopener noreferrer"&gt;adventofagents.com/2025/12/08&lt;/a&gt; | Summary: ADK Context design thesis: context as a compiled view&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/DdTtiWoMa3E" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Stop stuffing spaghetti context into your agent's LLM.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The "append-everything" strategy is a one-way ticket to latency spirals and "lost in the middle" hallucinations. Google ADK shifts the paradigm by treating context as a &lt;strong&gt;compiled view&lt;/strong&gt; (not a giant string).&lt;/p&gt;

&lt;p&gt;Instead of shoveling raw history into the window, ADK uses a pipeline of processors to dynamically filter, compact, and format a clean "working context" derived from a structured, durable session state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real engineering requires granular control, not just a bigger context window.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ADK's tiered architecture separates storage from presentation, allowing you to externalize massive files as Artifacts (using a handle pattern) and retrieve long-term data via searchable Memory only when strictly necessary.&lt;/p&gt;

&lt;p&gt;ADK operationalizes Context Caching by enforcing a clear separation between "Static Instructions" (invariant policies and schemas) and "Turn Instructions" (dynamic, controller-owned steering).&lt;/p&gt;

&lt;p&gt;As described in &lt;a href="https://www.kaggle.com/whitepaper-context-engineering-sessions-and-memory" rel="noopener noreferrer"&gt;Day 3 of our Kaggle 5 Day intensive course&lt;/a&gt;, Agents are largely "context management". This is how you do it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code: Static Context Policy + Context Caching
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# An Example of Static Context Policy 
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.apps&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&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;Agent&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk.agents.context_cache_config&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ContextCacheConfig&lt;/span&gt;

&lt;span class="n"&gt;STATIC_POLICY_HEADER&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 are a strict policy assistant for internal compliance Q&amp;amp;A.

Follow this exact JSON schema in every response:
{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;answer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: str, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;citations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: [str], &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: float}

Safety:
- Never provide medical or legal advice; refuse with a brief explanation.
- Never invent policy numbers or sections; ask for the missing reference.

Style:
- Use short sentences.
- Prefer active voice.
- If uncertain, say so and request the missing input.

Tools:
- search: use for public web facts.
- bq: use for internal policy tables (read-only).
&lt;/span&gt;&lt;span class="sh"&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;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;policy_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;static_instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;STATIC_POLICY_HEADER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Default: be concise and include at most two citations.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;App&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;policy_qa_app&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;context_cache_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;ContextCacheConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ttl_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;# cache the header for 1 hour
&lt;/span&gt;        &lt;span class="n"&gt;cache_intervals&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;# force a refresh every 5 requests (guardrail)
&lt;/span&gt;        &lt;span class="n"&gt;min_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;       &lt;span class="c1"&gt;# only cache if header is “worth it”
&lt;/span&gt;    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;root_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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Code: Runtime controller generating turn instructions
&lt;/h3&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;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tuple&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SteeringInputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;style&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;concise&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;max_cites&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;tenant_hint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&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;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;corrective&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&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;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;confidence_range&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.9&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;build_turn_instruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SteeringInputs&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="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&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;Goal: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;goal&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Style: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;style&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="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Constraints: &lt;/span&gt;&lt;span class="sh"&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;include at most &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_cites&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; citations; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;refuse medical/legal advice; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;if info is missing, ask one targeted question; &lt;/span&gt;&lt;span class="sh"&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;return &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; between &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confidence_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tenant_hint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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;Tenant: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tenant_hint&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;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;corrective&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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;Correction: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;corrective&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="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;chat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&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;user_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="n"&gt;ui_style&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="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="n"&gt;intent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;route_intent&lt;/span&gt;&lt;span class="p"&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;goal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;INTENT_TO_GOAL&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="n"&gt;intent&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;Answer the user: &lt;/span&gt;&lt;span class="si"&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="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;120&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;span class="n"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ui_style&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;get_flag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;style&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;concise&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;max_cites&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_flag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_citations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tenant_hint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_tenant_hint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;corrective&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_last_validation_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;turn_instruction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;build_turn_instruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;SteeringInputs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;max_cites&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;max_cites&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;tenant_hint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tenant_hint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;corrective&lt;/span&gt;&lt;span class="o"&gt;=&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;Your last reply failed validation: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;corrective&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. Fix it this turn.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;corrective&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&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="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instruction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;turn_instruction&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;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_message&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="nf"&gt;validate_and_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.googleblog.com/architecting-efficient-context-aware-multi-agent-framework-for-production/" rel="noopener noreferrer"&gt;Architecting efficient context-aware multi-agent framework for production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://google.github.io/adk-docs/context/" rel="noopener noreferrer"&gt;ADK Context Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/google-cloud/the-adk-prompting-pattern-static-vs-turn-instructions-7a1e5b25eeef" rel="noopener noreferrer"&gt;The ADK Prompting Pattern: Static vs. Turn Instructions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/whitepaper-context-engineering-sessions-and-memory" rel="noopener noreferrer"&gt;Context Engineering: Sessions &amp;amp; Memory | Kaggle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/eQDx90dVc38" rel="noopener noreferrer"&gt;8-min NotebookLM summary of ADK context management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;This combines Days 1-4 + 8. Full Season 1 is 25 days: observability, MCP, Live API, A2A, A2UI, Gemini Enterprise, security, durable execution with Restate, and finale.&lt;/p&gt;

&lt;p&gt;Follow for the rest, and bookmark &lt;a href="https://adventofagents.com/" rel="noopener noreferrer"&gt;adventofagents.com&lt;/a&gt; for the permanent archive.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>adventofagents</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Story of Esperanto</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Sat, 29 Nov 2025 14:23:04 +0000</pubDate>
      <link>https://dev.to/liberifatali/story-of-esperanto-n1l</link>
      <guid>https://dev.to/liberifatali/story-of-esperanto-n1l</guid>
      <description>&lt;p&gt;I'm learning Esperanto, lingvo de paco - the language of peace. Here are interesting things about its history.&lt;/p&gt;

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

</description>
      <category>esperanto</category>
      <category>polygot</category>
    </item>
    <item>
      <title>Google ADK Tutorials</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Sun, 23 Nov 2025 12:12:16 +0000</pubDate>
      <link>https://dev.to/liberifatali/google-adk-tutorials-1e2b</link>
      <guid>https://dev.to/liberifatali/google-adk-tutorials-1e2b</guid>
      <description>&lt;p&gt;I'm putting a list of tutorials for Google ADK (Agent Development Kit). This is the foundation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codelabs.developers.google.com/devsite/codelabs/build-agents-with-adk-foundation" rel="noopener noreferrer"&gt;A quick start to get a feel of Google ADK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/building-collaborative-ai-a-developers-guide-to-multi-agent-systems-with-adk" rel="noopener noreferrer"&gt;Foundational concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codelabs.developers.google.com/devsite/codelabs/build-agents-with-adk-empowering-with-tools" rel="noopener noreferrer"&gt;First experience with ADK tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codelabs.developers.google.com/onramp/instructions" rel="noopener noreferrer"&gt;A good crash course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codelabs.developers.google.com/adkcourse/instructions" rel="noopener noreferrer"&gt;ADK pattern with Memory and MCP (Model Context Protocol)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/google/adk-samples" rel="noopener noreferrer"&gt;google/adk-samples&lt;/a&gt;: A collection of sample agents built with Agent Development (ADK)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tidal-draw-67c.notion.site/Study-Note-AI-Agent-2b4b2866cc68805c8018dfb996578c94" rel="noopener noreferrer"&gt;Study Note « AI Agent from Annie Wang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>Setup Gstreamer with Python on Windows</title>
      <dc:creator>Cless</dc:creator>
      <pubDate>Wed, 19 Nov 2025 04:44:49 +0000</pubDate>
      <link>https://dev.to/liberifatali/setup-gstreamer-with-python-on-windows-59n3</link>
      <guid>https://dev.to/liberifatali/setup-gstreamer-with-python-on-windows-59n3</guid>
      <description>&lt;p&gt;&lt;em&gt;When I started trying GStreamer with Python on Windows 10, it took me quite some time to set up the development environment. So this might help others on the way.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The most convenient approach is through MSYS2. Here are the steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Download and install MSYS2: &lt;a href="https://www.msys2.org" rel="noopener noreferrer"&gt;https://www.msys2.org&lt;/a&gt;. Remember [msys2_path] for environment variable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Install Python, GStreamer, tools, plugins, and PyGObject&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open MSYS2 UCRT64 terminal&lt;/li&gt;
&lt;li&gt;Update MSYS2 &lt;code&gt;pacman -Syu&lt;/code&gt;. After this, the terminal may close; you need to open it again.&lt;/li&gt;
&lt;li&gt;Install gcc &lt;code&gt;pacman -S mingw-w64-ucrt-x86_64-gcc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install Python, GStreamer, tools, plugins, and PyGObject
&lt;code&gt;pacman -S mingw-w64-x86_64-python3 mingw-w64-x86_64-gstreamer mingw-w64-x86_64-gst-devtools mingw-w64-x86_64-gst-plugins-{base,good,bad,ugly} mingw-w64-x86_64-python3-gobject&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following paths to &lt;code&gt;~/.bashrc&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH="&amp;lt;msys2_path&amp;gt;/mingw64/bin:$PATH"
export XDG_DATA_DIRS="&amp;lt;msys2_path&amp;gt;/mingw64/share/:$XDG_DATA_DIRS"
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply bashrc: &lt;code&gt;source ~/.bashrc&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Test: run this on the terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install pygobject
python -c "import gi; gi.require_version('Gst', '1.0'); from gi.repository import Gst; print(Gst.version_string())"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>gstreamer</category>
      <category>python</category>
      <category>windows</category>
    </item>
  </channel>
</rss>
