<?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: YK</title>
    <description>The latest articles on DEV Community by YK (@ykdap).</description>
    <link>https://dev.to/ykdap</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%2F4027521%2Fbdd03eb5-e5cc-491f-8bae-855f60ee750d.jpg</url>
      <title>DEV Community: YK</title>
      <link>https://dev.to/ykdap</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ykdap"/>
    <language>en</language>
    <item>
      <title>How I drive a cloud coding agent from my phone through the browser</title>
      <dc:creator>YK</dc:creator>
      <pubDate>Mon, 27 Jul 2026 16:10:20 +0000</pubDate>
      <link>https://dev.to/ykdap/how-i-drive-a-cloud-coding-agent-from-my-phone-through-the-browser-5cij</link>
      <guid>https://dev.to/ykdap/how-i-drive-a-cloud-coding-agent-from-my-phone-through-the-browser-5cij</guid>
      <description>&lt;p&gt;&lt;strong&gt;tl;dr:&lt;/strong&gt; I put Google's Identity-Aware Proxy in front of a Cloud Run service&lt;br&gt;
running a coding agent in a web terminal. Now I open a URL on my phone, sign in&lt;br&gt;
with my Google account, and I'm talking to the agent.&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%2Flid5tyfjx5npww4lo02c.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%2Flid5tyfjx5npww4lo02c.png" alt="Driving an agy session from my phone: asking it to summarize the latest three episodes of a podcast, and watching it search" width="800" height="1734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/ykdojo/antigravity-cloud-run" rel="noopener noreferrer"&gt;github.com/ykdojo/antigravity-cloud-run&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This builds on my &lt;a href="https://ykdojo.github.io/antigravity-cloud-run/posts/ephemeral-dev-environments.html" rel="noopener noreferrer"&gt;containerized dev environments&lt;br&gt;
setup&lt;/a&gt;: the agent runs with&lt;br&gt;
&lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; inside a container on Cloud Run, reachable&lt;br&gt;
through a web terminal. The missing piece was using it away from my laptop.&lt;/p&gt;

&lt;p&gt;This particular setup was done for Antigravity CLI, but it should work for&lt;br&gt;
pretty much any other CLI coding agent.&lt;/p&gt;
&lt;h2&gt;
  
  
  Two ways to reach a session from a phone, and why I picked IAP
&lt;/h2&gt;

&lt;p&gt;My sessions already join my Tailscale network, so the obvious route was the&lt;br&gt;
Tailscale app on the phone. It works, but there's a catch: tailnet traffic&lt;br&gt;
bypasses Cloud Run's front end entirely, so the autoscaler thinks the service&lt;br&gt;
is idle and reclaims the instance after about 15 minutes, mid-use. The only fix&lt;br&gt;
is pinning the instance with min-instances=1, which costs money around the&lt;br&gt;
clock whether I'm using it or not.&lt;/p&gt;

&lt;p&gt;IAP flips that. Identity-Aware Proxy is Google Cloud's managed sign-in gate:&lt;br&gt;
you put it in front of a service, and only the Google accounts you allowlist&lt;br&gt;
get through. You open the service's regular &lt;code&gt;run.app&lt;/code&gt; URL, sign in, and you're&lt;br&gt;
at the terminal. The terminal's&lt;br&gt;
WebSocket is a real ingress request, so opening the tab wakes the instance,&lt;br&gt;
keeps it alive while you're connected, and lets it scale back to zero when you&lt;br&gt;
close the tab.&lt;/p&gt;

&lt;p&gt;If you want the instance to never die, deploy with min-instances=1 and it&lt;br&gt;
never scales down to zero.&lt;/p&gt;
&lt;h2&gt;
  
  
  The stack, layer by layer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IAP&lt;/strong&gt; decides who gets in. Only the Google accounts you allowlisted can
access it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ttyd&lt;/strong&gt; turns the browser into a terminal. The agent is a TUI and the
browser speaks HTTP/WebSocket; ttyd bridges the two.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tmux&lt;/strong&gt; keeps the session alive when the connection drops, and you can
attach to the same session from multiple devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;agy&lt;/strong&gt; does the work.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Setting it up
&lt;/h2&gt;

&lt;p&gt;Enabling IAP on the service itself is three commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud run services update SERVICE &lt;span class="nt"&gt;--region&lt;/span&gt; REGION &lt;span class="nt"&gt;--iap&lt;/span&gt;

gcloud run services add-iam-policy-binding SERVICE &lt;span class="nt"&gt;--region&lt;/span&gt; REGION &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--member&lt;/span&gt; serviceAccount:service-PROJECT_NUMBER@gcp-sa-iap.iam.gserviceaccount.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--role&lt;/span&gt; roles/run.invoker

gcloud beta iap web add-iam-policy-binding &lt;span class="nt"&gt;--resource-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;cloud-run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--service&lt;/span&gt; SERVICE &lt;span class="nt"&gt;--region&lt;/span&gt; REGION &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--member&lt;/span&gt; user:YOU@gmail.com &lt;span class="nt"&gt;--role&lt;/span&gt; roles/iap.httpsResourceAccessor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your project lives in a Google Cloud organization, you may be done. Mine&lt;br&gt;
doesn't, so I needed to take a long detour. In case you need to go through the&lt;br&gt;
same thing, here is what I went through.&lt;/p&gt;
&lt;h2&gt;
  
  
  The 502 detour: no organization, no automatic OAuth client
&lt;/h2&gt;

&lt;p&gt;After enabling IAP, every request returned a 502 with this body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Empty Google Account OAuth client ID(s)/secret(s).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The reason: IAP's Google-managed OAuth client only authenticates&lt;br&gt;
users &lt;strong&gt;inside your organization&lt;/strong&gt;. A personal project has no organization, so&lt;br&gt;
there is no client at all, which is why it says "empty". External users need a custom OAuth&lt;br&gt;
client handed to IAP. Four steps, mostly console clicks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Branding&lt;/strong&gt; (console, Google Auth Platform → Overview → Get started): app
name, support email, audience External, agree to the API user-data policy.&lt;/li&gt;
&lt;/ol&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%2Fay65rftke84z9q6ggi7t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fay65rftke84z9q6ggi7t.jpg" alt="The Auth Platform branding wizard" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test users&lt;/strong&gt; (Audience page): while the consent screen is in Testing,
only listed test users can sign in. Add every account you granted the
accessor role to. Testing mode also expires sign-ins after about 7 days;
publishing the app removes that if the weekly re-sign-in bothers you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom OAuth client&lt;/strong&gt; (Clients page): type Web application. Add this
authorized redirect URI, with your new client's ID substituted in:
&lt;code&gt;https://iap.googleapis.com/v1/oauth/clientIds/CLIENT_ID:handleRedirect&lt;/code&gt;.
Note that Google now shows the secret only at creation time, so grab it
then.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hand the client to IAP&lt;/strong&gt;, at the project level so every IAP service in
the project inherits it:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;   &lt;span class="c1"&gt;# iap_settings.yaml&lt;/span&gt;
   &lt;span class="na"&gt;access_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
     &lt;span class="na"&gt;oauth_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
       &lt;span class="na"&gt;client_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CLIENT_ID&lt;/span&gt;
       &lt;span class="na"&gt;client_secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CLIENT_SECRET&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   gcloud iap settings &lt;span class="nb"&gt;set &lt;/span&gt;iap_settings.yaml &lt;span class="nt"&gt;--project&lt;/span&gt; PROJECT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Delete the yaml afterwards. IAP stores the secret as a hash.&lt;/p&gt;

&lt;p&gt;The change takes effect in seconds: the 502 is gone, and the service URL&lt;br&gt;
redirects to a Google sign-in instead. On the phone: open&lt;br&gt;
the service URL, pick your Google account, and the terminal loads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What IAP breaks
&lt;/h2&gt;

&lt;p&gt;One thing stops working: &lt;code&gt;gcloud run services proxy&lt;/code&gt;, which is how my&lt;br&gt;
dashboard embeds cloud terminals locally on my laptop. IAP rejects the proxy's tokens, and&lt;br&gt;
on a no-organization project there's no clean way around it.&lt;/p&gt;

&lt;p&gt;So it's a per-session choice, and I made it a flag: my deploy script takes&lt;br&gt;
&lt;code&gt;-i&lt;/code&gt; to bring a session up with IAP, and the dashboard shows those sessions&lt;br&gt;
as an "open in browser" link instead of an embedded terminal. Default is no&lt;br&gt;
IAP.&lt;/p&gt;

&lt;p&gt;Here's a &lt;code&gt;phone&lt;/code&gt; session with IAP next to a &lt;code&gt;laptop&lt;/code&gt; session without it. The&lt;br&gt;
IAP one opens in a browser tab; the other one connects through the local&lt;br&gt;
proxy and gets embedded in the dashboard:&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%2F2shqm8oytsysxp6ti910.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2shqm8oytsysxp6ti910.jpg" alt="The dashboard listing a laptop session with a connect button and a phone session with an iap badge and an open-in-browser link" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a checkbox when creating a session too, off by default:&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%2Fy8noqvskn0efwndnp3tc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8noqvskn0efwndnp3tc.jpg" alt="The new cloud session dialog with a phone access via IAP checkbox" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;The basic functionality works: I can open a session from my phone, type a&lt;br&gt;
task, and watch it run. A couple of rough edges I'm hoping to address later.&lt;/p&gt;

&lt;p&gt;Scrolling isn't great. It's a terminal in a browser tab, so scrolling back&lt;br&gt;
through output on a touchscreen is fiddlier than it should be.&lt;/p&gt;

&lt;p&gt;Font size is the other one. I can't get it to set properly on the phone. It&lt;br&gt;
works in every other browser I tried, so I'm not sure what's different there&lt;br&gt;
yet.&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>ai</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>For coding agents, real-time collaboration beats the "wisdom of the crowd"</title>
      <dc:creator>YK</dc:creator>
      <pubDate>Sat, 25 Jul 2026 22:43:04 +0000</pubDate>
      <link>https://dev.to/ykdap/for-coding-agents-real-time-collaboration-beats-the-wisdom-of-the-crowd-1kj0</link>
      <guid>https://dev.to/ykdap/for-coding-agents-real-time-collaboration-beats-the-wisdom-of-the-crowd-1kj0</guid>
      <description>&lt;p&gt;&lt;strong&gt;tl;dr:&lt;/strong&gt; I ran AI coding agents on 30 &lt;a href="https://projecteuler.net/" rel="noopener noreferrer"&gt;Project Euler&lt;/a&gt; problems in two ways: five agents working separately, and five agents collaborating in real time. For both, I also computed the majority vote across the five answers at the end. The collaborating agents beat both the separate agents and their majority vote. Average accuracy without the vote went from 72% to 87%.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I had AI coding agents, specifically Gemini 3.5 Flash running through Antigravity, tackle 30 math and programming problems from Project Euler: all problems published this year except one (&lt;a href="https://projecteuler.net/problem=983" rel="noopener noreferrer"&gt;983&lt;/a&gt;), whose answer I could not verify on the website.&lt;/p&gt;

&lt;p&gt;For each problem, five agents ran in &lt;a href="https://github.com/ykdojo/antigravity-cloud-run" rel="noopener noreferrer"&gt;five concurrent containers&lt;/a&gt;. I ran them in two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Solo:&lt;/strong&gt; no ability to communicate with each other as they solved the problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaborative:&lt;/strong&gt; extra prompts letting them know they can collaborate, and an MCP server that lets any agent broadcast a message to the rest, kind of like sending each other emails.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In both cases I also took the majority vote across the five answers at the end. So in total there are four methods to compare: solo individuals, solo with vote, collaborative individuals, and collaborative with vote.&lt;/p&gt;

&lt;p&gt;Each agent had 30 minutes of working time, plus up to 10 extra minutes to wrap up and submit a final answer, so a single run can take up to about 40 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foiznghzize900s3wvh4g.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%2Foiznghzize900s3wvh4g.png" alt="Accuracy: individual agents and majority vote, solo vs collaborative" width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Individually, solo agents got 108 of 150 runs correct (72%). With real-time collaboration, the same setup got 130 of 150 (87%). The majority vote went from 24 of 30 problems (80%) to 27 of 30 (90%). As you can see, both real-time collaboration and the "wisdom of the crowd", aka majority voting, are effective, but real-time collaboration had a stronger effect on the overall accuracy.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;solo&lt;/th&gt;
&lt;th&gt;collaborative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;average run time&lt;/td&gt;
&lt;td&gt;14m&lt;/td&gt;
&lt;td&gt;10m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;median worst-of-5 time&lt;/td&gt;
&lt;td&gt;31m&lt;/td&gt;
&lt;td&gt;11m&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The worst-of-5 time is relevant because if you wait for all five answers, that is when you get the final answer through the vote. The average time is relevant in a different way: it is a proxy for measuring the tokens and compute you use. Antigravity unfortunately does not give you exact token counts, but tokens and compute scale with the time it takes to solve a problem.&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%2Fxlyl6fmpc8zrndj8z8r2.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%2Fxlyl6fmpc8zrndj8z8r2.png" alt="Distribution of time to a correct answer, all 150 runs per method" width="799" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More collaborative runs end inside the first five minutes (97 vs 77), and fewer of them run past the 30 minute mark (23 vs 38).&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%2F9bih9irwv8zyuvcqu1a2.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%2F9bih9irwv8zyuvcqu1a2.png" alt="Distribution of run time, worst-of-5 per problem" width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On worst-of-5 time, solo sets pile up at the 30 to 40 minute end because many problems left at least one agent running until the cap. Collaborative sets most often finish within the first five minutes because once one agent solves the problem and shares its findings, the rest can finish quickly too, though the harder ones still run long.&lt;/p&gt;

&lt;p&gt;Three individual problems are worth calling out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The rescue.&lt;/strong&gt; On &lt;a href="https://projecteuler.net/problem=989" rel="noopener noreferrer"&gt;problem 989&lt;/a&gt;, solo agents went 0 for 5, and two of them submitted confident wrong answers. In the collaborative run, one agent shared a verified characterization of the problem's structure at minute 5, two others confirmed intermediate values against an example given in the problem statement, and all five agents converged on the correct answer, unanimously. Collaboration solved a problem that no individual agent solved in any run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The speedup.&lt;/strong&gt; On &lt;a href="https://projecteuler.net/problem=993" rel="noopener noreferrer"&gt;problem 993&lt;/a&gt;, solo went 3 of 5 with one agent falling into a subtle extrapolation trap. The collaborative run went 5 of 5, about 4 times faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The failure.&lt;/strong&gt; On &lt;a href="https://projecteuler.net/problem=1006" rel="noopener noreferrer"&gt;problem 1006&lt;/a&gt;, nobody solved it in either setup. But in the collaborative run, a correctly verified &lt;em&gt;intermediate&lt;/em&gt; value circulated between agents, and two of them submitted it as the final answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Disclaimers
&lt;/h2&gt;

&lt;p&gt;These agents are not deterministic. If you try to reproduce the results you might get slightly different numbers, but in principle you should be able to get similar results.&lt;/p&gt;

&lt;p&gt;Per Project Euler's rules, no numeric answers are published here or in the repo. Runs were scored against privately held answers that were verified on the site itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open questions
&lt;/h2&gt;

&lt;p&gt;The insights here were drawn from experiments with only 5 agents, so there are still many unknowns.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What about 25 agents, 50, 100? Does it scale to solving harder and harder problems?&lt;/li&gt;
&lt;li&gt;With 100 agents, is it better to have one big group chat, or ten separate group chats of ten, with some way to communicate between the groups as well?&lt;/li&gt;
&lt;li&gt;Does it work as well with other models?&lt;/li&gt;
&lt;li&gt;Does it work with other harnesses?&lt;/li&gt;
&lt;li&gt;Is it better to let them collaborate freely as we did here, or assign them specific roles?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of open questions, but I believe this is a decent start.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prior art
&lt;/h2&gt;

&lt;p&gt;One of the closest things currently in production is xAI's Grok Heavy line: Grok 4 Heavy ran multiple agents in parallel that compare notes like a study group, and the newer versions make a multi-agent setup the default for complex queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix
&lt;/h2&gt;

&lt;p&gt;The exact prompts, the Dockerfile, and the full per-run outcome data (correct or not, and time taken, for all 300 runs) are in the &lt;a href="https://github.com/ykdojo/antigravity-cloud-run/blob/main/experiments/collaboration-vs-wisdom-of-the-crowd/appendix.md" rel="noopener noreferrer"&gt;appendix&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>experiment</category>
    </item>
    <item>
      <title>How I set up containerized dev environments you can spin up in seconds for Antigravity CLI</title>
      <dc:creator>YK</dc:creator>
      <pubDate>Sat, 25 Jul 2026 22:42:26 +0000</pubDate>
      <link>https://dev.to/ykdap/how-i-set-up-containerized-dev-environments-you-can-spin-up-in-seconds-for-antigravity-cli-45lp</link>
      <guid>https://dev.to/ykdap/how-i-set-up-containerized-dev-environments-you-can-spin-up-in-seconds-for-antigravity-cli-45lp</guid>
      <description>&lt;p&gt;&lt;strong&gt;tl;dr:&lt;/strong&gt; I set up a way to spin up containerized dev environments for AI agents with limited, controlled access. They only get the credentials and network access they need, so they can keep working without asking for permission, and without compromising security. Local sessions start in seconds, and the same image deploys to Cloud Run when I want it off my laptop.&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%2F86wx9kjxnc1zx8yk8jzm.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%2F86wx9kjxnc1zx8yk8jzm.png" alt="The dashboard running five cloud sessions in parallel, with live terminals" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/ykdojo/antigravity-cloud-run" rel="noopener noreferrer"&gt;github.com/ykdojo/antigravity-cloud-run&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoiding permission fatigue
&lt;/h2&gt;

&lt;p&gt;With Antigravity CLI you have a few options. You can approve each request manually. You can configure it in such a way that certain types of requests are accepted automatically. Or you can run it with &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; and skip approval entirely.&lt;/p&gt;

&lt;p&gt;The third option is convenient, but it is risky. Running on your main machine with your credentials, it could do a lot of damage, not just to your local environment but to your accounts: GitHub, email, whatever else you are signed into.&lt;/p&gt;

&lt;p&gt;So I decided to put it in a container instead, so I can run it with &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; without approving every single request. It gets a separate GitHub account and only the specific keys it needs. For example, you can give it read-only keys for your accounts if you don't want it to be able to post by itself. That way, its blast radius is limited.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it gets access to
&lt;/h2&gt;

&lt;p&gt;First, it gets my OAuth token for Antigravity, so that it's able to use my subscription's usage quota. There is no API key option today, only that token file. Until this feature is implemented (&lt;a href="https://github.com/google-antigravity/antigravity-cli/issues/78" rel="noopener noreferrer"&gt;related&lt;/a&gt; &lt;a href="https://github.com/google-antigravity/antigravity-cli/issues/592" rel="noopener noreferrer"&gt;requests&lt;/a&gt;), this is what I decided to go with. You log in once inside a container, and every session after that is seeded from that token, locally and in the cloud.&lt;/p&gt;

&lt;p&gt;You also give it a list of environment variables, and they get injected into the container automatically every time you spin up a session, locally or in the cloud.&lt;/p&gt;

&lt;p&gt;I also built a dashboard to manage sessions, so I can spin one up, stop it, or delete it in a few seconds. That is the nice thing about containers. It is easy to throw one away and start fresh.&lt;/p&gt;

&lt;p&gt;Conversation history carries across sessions, as long as you name the session the same way. Locally it lives on my machine through a volume mount.&lt;/p&gt;

&lt;p&gt;On Cloud Run it works pretty much the same way. The keys are synced to Secret Manager and wired into the service as environment variables, and conversation history goes to a Cloud Storage bucket, one per session, synced every 60 seconds and again on shutdown. So a session you restart picks up where it left off, same as local.&lt;/p&gt;

&lt;p&gt;Cloud sessions are IAM-gated and never public. You reach one by running &lt;code&gt;gcloud run services proxy&lt;/code&gt;, which opens a local port on your machine and tunnels it to the container, so you open &lt;code&gt;localhost&lt;/code&gt; in your browser and talk to the agent and its shell from there. The dashboard does this for you per session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding it to your Tailscale network
&lt;/h2&gt;

&lt;p&gt;This part is optional, but if you already use Tailscale I recommend it for this.&lt;/p&gt;

&lt;p&gt;The reason you need it is that Cloud Run only lets one port per service be reachable from outside, and that port is already taken by the web terminal. So if the agent starts a server inside the session and you want to look at it, there is no way in. Tailscale is the workaround.&lt;/p&gt;

&lt;p&gt;Each session joins my private network as its own node, so a server on port 3000 is at &lt;code&gt;http://&amp;lt;session-name&amp;gt;:3000&lt;/code&gt; from my laptop, or from any machine on my tailnet. Because of how the access rules are set up it only works one way: I can reach the container, and the container cannot reach my machines.&lt;/p&gt;

&lt;p&gt;When the Tailscale key is present, the session also writes its own address into the agent's &lt;code&gt;AGENTS.md&lt;/code&gt; on startup, so the agent knows where it lives and can hand you a working URL instead of &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is it good for?
&lt;/h2&gt;

&lt;p&gt;People have asked me this, and the assumption behind the question is usually that I want something running 24/7. I don't, not really.&lt;/p&gt;

&lt;p&gt;What I do want is somewhere I can let an agent go free, for long running tasks and for tasks I would rather not run on my main machine. Research is one: going through a bunch of YouTube videos, or a bunch of Reddit threads. I don't necessarily want that running from my main machine.&lt;/p&gt;

&lt;p&gt;Building a feature on a side project is another one. I don't necessarily want it using my main machine's resources, so it's convenient to run it in a container. For example, I like to have it create a draft PR on its own, take screenshots using Playwright, and attach them to that PR and send it to me so I can approve it and merge it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>docker</category>
      <category>devops</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>15 Antigravity CLI tips</title>
      <dc:creator>YK</dc:creator>
      <pubDate>Fri, 17 Jul 2026 20:03:43 +0000</pubDate>
      <link>https://dev.to/ykdap/15-antigravity-cli-tips-4iik</link>
      <guid>https://dev.to/ykdap/15-antigravity-cli-tips-4iik</guid>
      <description>&lt;p&gt;I've been using Antigravity CLI since it was launched, and along the way I've been writing down tips for myself. I figured I'd share them here in case they're useful to others. I originally put them in &lt;a href="https://github.com/ykdojo/antigravity-cli-tips" rel="noopener noreferrer"&gt;this repo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 1: Set up terminal aliases for quick access &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;To help you launch Antigravity CLI quickly, you can alias &lt;code&gt;agy&lt;/code&gt; to just &lt;code&gt;a&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To set this up, add this line to your shell config file (such as &lt;code&gt;~/.zshrc&lt;/code&gt; or &lt;code&gt;~/.bashrc&lt;/code&gt;):&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;alias &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'agy'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I personally like to set up aliases for other tools I use often too, not just Antigravity. For example:&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;alias &lt;/span&gt;&lt;span class="nv"&gt;gb&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'github'&lt;/span&gt;  &lt;span class="c"&gt;# GitHub Desktop&lt;/span&gt;
&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;co&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'code'&lt;/span&gt;    &lt;span class="c"&gt;# VS Code&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tip 2: Set up your custom status line
&lt;/h2&gt;

&lt;p&gt;You can customize the status line at the bottom of Antigravity CLI to show useful info (see the &lt;a href="https://antigravity.google/docs/cli-statusline" rel="noopener noreferrer"&gt;official docs&lt;/a&gt;). For example, I built &lt;a href="https://github.com/ykdojo/antigravity-cli-tips/blob/main/scripts/context-bar.sh" rel="noopener noreferrer"&gt;this script&lt;/a&gt; that shows the model, current directory, git branch, uncommitted file count, sync status with origin, and a visual progress bar for token usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Claude Opus 4.6 &lt;span class="o"&gt;(&lt;/span&gt;Thinking&lt;span class="o"&gt;)&lt;/span&gt; | 📁antigravity-cli-tips | 🔀main &lt;span class="o"&gt;(&lt;/span&gt;scripts/color-preview.sh uncommitted, synced 14m ago&lt;span class="o"&gt;)&lt;/span&gt; | █▄░░░░░░░░ 15% of 250k tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To set this up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy the script to your Antigravity CLI config directory:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.gemini/antigravity-cli
   curl &lt;span class="nt"&gt;-o&lt;/span&gt; ~/.gemini/antigravity-cli/statusline.sh https://raw.githubusercontent.com/ykdojo/antigravity-cli-tips/main/scripts/context-bar.sh
   &lt;span class="nb"&gt;chmod&lt;/span&gt; +x ~/.gemini/antigravity-cli/statusline.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Add the following to your &lt;code&gt;~/.gemini/antigravity-cli/settings.json&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"statusLine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"~/.gemini/antigravity-cli/statusline.sh"&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;The script supports 10 color themes (orange, blue, teal, green, lavender, rose, gold, slate, cyan, or gray). Edit the &lt;code&gt;COLOR&lt;/code&gt; variable at the top of the script to change it.&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%2Fov2uxl1pq6z5is3u4nb3.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%2Fov2uxl1pq6z5is3u4nb3.png" alt="Color preview options" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It also adapts to narrow terminals by wrapping at natural breakpoints instead of getting cut off:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Claude Opus 4.6 &lt;span class="o"&gt;(&lt;/span&gt;Thinking&lt;span class="o"&gt;)&lt;/span&gt; | 📁antigravity-cli-tips
 | 🔀main &lt;span class="o"&gt;(&lt;/span&gt;scripts/context-bar.sh uncommitted, synced 11m ago&lt;span class="o"&gt;)&lt;/span&gt;
 | ░░░░░░░░░░ 0% of 250k tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tip 3: Create a folder for your projects
&lt;/h2&gt;

&lt;p&gt;I find it convenient to start Antigravity CLI from a single parent folder that contains my projects. That way, the agent automatically has access to any directory within it.&lt;/p&gt;

&lt;p&gt;For example, I use a folder like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;~/Desktop/antigravity-projects $&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With my projects inside it, I can say things like "create a new project here," "clone a new project here," or "look at project A and apply certain features to project B" - all without extra permission prompts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 4: Set up AGENTS.md
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AGENTS.md&lt;/code&gt; is a file you place in your project root to give Antigravity CLI persistent instructions. Anything you write in it gets included in every prompt within that directory. It's great for things like coding conventions, project-specific rules, or how you want the agent to behave in general.&lt;/p&gt;

&lt;p&gt;If you also use Claude Code, you can symlink &lt;code&gt;CLAUDE.md&lt;/code&gt; to point to the same file so both tools share the same instructions:&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;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; AGENTS.md CLAUDE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also set up a global &lt;code&gt;AGENTS.md&lt;/code&gt; at &lt;code&gt;~/.gemini/AGENTS.md&lt;/code&gt; for instructions that apply across all projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 5: Talk to Antigravity CLI with your voice
&lt;/h2&gt;

&lt;p&gt;I found that you can communicate much faster with your voice than typing with your hands. Using a voice transcription system on your local machine is really helpful for this.&lt;/p&gt;

&lt;p&gt;On my Mac, I've tried a few different options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://superwhisper.com/" rel="noopener noreferrer"&gt;superwhisper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goodsnooze.gumroad.com/l/macwhisper" rel="noopener noreferrer"&gt;MacWhisper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ykdojo/super-voice-assistant" rel="noopener noreferrer"&gt;Super Voice Assistant&lt;/a&gt; (open source, supports Parakeet v2/v3)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can get more accuracy by using a hosted service, but I found that a local model is strong enough for this purpose. Even when there are mistakes or typos in the transcription, the AI is smart enough to understand what you're trying to say. Sometimes you need to say certain things extra clearly, but overall local models work well enough.&lt;/p&gt;

&lt;p&gt;I think the best way to think about this is like you're trying to communicate with your friend. Of course, you can communicate through texts. But if you want to communicate faster, why wouldn't you get on a quick phone call? You can just send voice messages. It's faster, at least for me.&lt;/p&gt;

&lt;p&gt;A common objection is "what if you're in a room with other people?" In that case, I just whisper using earphones - I personally like Apple EarPods (not AirPods). They're affordable, high quality enough, and you just whisper into them quietly. I've done it in front of other people and it works fine. In offices, people talk anyway - instead of talking to coworkers, you're talking quietly to your voice transcription system. This method works so well that it even works on a plane. It's loud enough that other people won't hear you, but if you speak close enough to the mic, your local model can still understand what you're saying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 6: Master different ways of verifying its output
&lt;/h2&gt;

&lt;p&gt;One way to verify its output if it's code is to have it write tests and make sure the tests look good and don't just hardcode true. That's one way, but you can of course check the code it generates as it goes. You can also use a visual Git client like GitHub Desktop for checking changes quickly. And having it generate a PR is a great way as well - have it create a draft PR, check the content before marking it as ready for review.&lt;/p&gt;

&lt;p&gt;In addition, you can set up different ways for the agent to test your code in different formats. For example, if you're building a web app, you can set up Playwright MCP and it'll be able to use the browser to test your app all on its own. To set it up, add this to &lt;code&gt;~/.gemini/config/mcp_config.json&lt;/code&gt;:&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;"mcpServers"&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;"playwright"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"@playwright/mcp"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="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;With this, the agent gets browser automation tools like &lt;code&gt;browser_navigate&lt;/code&gt;, &lt;code&gt;browser_click&lt;/code&gt;, and &lt;code&gt;browser_take_screenshot&lt;/code&gt;, so it can open your app, interact with it, and visually check the result on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 7: Learn to use various CLI tools from the agent
&lt;/h2&gt;

&lt;p&gt;For example, you can create a draft PR through the &lt;code&gt;gh&lt;/code&gt; command, and once it's created, you can ask the agent to open it in your browser with the &lt;code&gt;open&lt;/code&gt; command so you can review it yourself. If you have a change you want to check quickly or fix manually, you can use the &lt;code&gt;code&lt;/code&gt; command to open it in VS Code, or use the &lt;code&gt;github&lt;/code&gt; command to open GitHub Desktop and see a visual diff. You can use &lt;code&gt;ffmpeg&lt;/code&gt; for quick video editing, or ImageMagick for quick image editing and conversion. There are a lot of things you can do if you're familiar with these CLI tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 8: Attach images with Ctrl+V
&lt;/h2&gt;

&lt;p&gt;You can attach an image from your clipboard to your prompt by simply pressing Ctrl+V.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 9: Cmd+A and Ctrl+A are your friends
&lt;/h2&gt;

&lt;p&gt;Sometimes you want to give Antigravity CLI a bunch of text from a webpage or terminal output. You can give it a URL, but another method is to just select all (Cmd+A on Mac, Ctrl+A on Windows/Linux), copy, and paste it directly into the CLI.&lt;/p&gt;

&lt;p&gt;Some pages don't lend themselves well to select all by default - but there are tricks to get them into a better state first. For example, with Gmail threads, click Print All to get the print preview (but cancel the actual print). For YouTube videos, click "Show transcript" and then Cmd+A or Ctrl+A.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 10: Manage your to-do list in AGENTS.md
&lt;/h2&gt;

&lt;p&gt;It's convenient to keep a to-do list or project status in your &lt;code&gt;AGENTS.md&lt;/code&gt; file. Since the agent reads it with every prompt, you can just ask "what's on the to-do list?" and it'll know exactly where things stand. You can also ask it to update the list as you make progress.&lt;/p&gt;

&lt;p&gt;For example, you might have a section like this in your &lt;code&gt;AGENTS.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="gu"&gt;### Done&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [x] Unity 3D URP project scaffold
&lt;span class="p"&gt;-&lt;/span&gt; [x] Card hand UI with 7 cards at bottom of screen
&lt;span class="p"&gt;-&lt;/span&gt; [x] Card hover effect (scale + blue outline highlight)
&lt;span class="p"&gt;-&lt;/span&gt; [x] Card drag with placeholder in hand

&lt;span class="gu"&gt;### Up Next&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] 3D world view - camera at an angled perspective looking down at a game field/board
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can just ask "what do we have for the to-do list" and it'll give you a summary of what's done and what's next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 11: Pre-allow directories outside your project
&lt;/h2&gt;

&lt;p&gt;By default, Antigravity CLI auto-allows reading and writing files inside your current project directory. But if you ask it to access files in a different directory, it'll prompt you for permission every time.&lt;/p&gt;

&lt;p&gt;You can fix this by adding those directories to the &lt;code&gt;allow&lt;/code&gt; list in your &lt;code&gt;~/.gemini/antigravity-cli/settings.json&lt;/code&gt; (see the &lt;a href="https://antigravity.google/docs/cli-permissions" rel="noopener noreferrer"&gt;official docs&lt;/a&gt;):&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;"permissions"&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;"allow"&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="s2"&gt;"read_file(/Users/yk/Desktop/projects/massive-coop-roguelike)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Path matching is recursive, so allowing a directory covers all files and folders inside it. If you also want write access, add &lt;code&gt;write_file&lt;/code&gt; too - and &lt;code&gt;write_file&lt;/code&gt; implies &lt;code&gt;read_file&lt;/code&gt;, so you don't need both for the same path.&lt;/p&gt;

&lt;p&gt;This also comes up when the agent edits its own config. For example, setting up an MCP server writes to &lt;code&gt;~/.gemini/config/mcp_config.json&lt;/code&gt;, which is outside your workspace, so it triggers a permission prompt. You can pre-allow it the same way:&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;"permissions"&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;"allow"&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="s2"&gt;"write_file(/Users/yk/.gemini/config/mcp_config.json)"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tip 12: Use realpath to point it at files in a different location
&lt;/h2&gt;

&lt;p&gt;When you want to tell Antigravity CLI about files in a different folder, use &lt;code&gt;realpath&lt;/code&gt; to get the full absolute path:&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;realpath &lt;/span&gt;some/relative/path
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then paste that absolute path into your prompt so it knows exactly where to look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip 13: Skip permissions in isolated environments
&lt;/h2&gt;

&lt;p&gt;If you're working in an isolated environment - like a container, a VM, or a dedicated test machine - where you're okay with the agent doing anything without asking, you can launch Antigravity CLI with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agy &lt;span class="nt"&gt;--dangerously-skip-permissions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This auto-approves all tool permission requests without prompting.&lt;/p&gt;

&lt;p&gt;For convenience, you can even add an alias like in Tip 1:&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;alias &lt;/span&gt;&lt;span class="nv"&gt;ad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'agy --dangerously-skip-permissions'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tip 14: Continue from a previous conversation
&lt;/h2&gt;

&lt;p&gt;Two ways to pick up where you left off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agy -c&lt;/code&gt; (or &lt;code&gt;--continue&lt;/code&gt;) continues the most recent conversation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/resume&lt;/code&gt; inside a session opens an interactive picker of your past conversations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tip 15: Agentify your entire SDLC
&lt;/h2&gt;

&lt;p&gt;It's common to over-rely on agents like Antigravity to generate code, but it's just as important to use them for the other parts of the software development lifecycle: understanding issues, designing solutions, reviewing PRs, and testing.&lt;/p&gt;

&lt;p&gt;I made a video about this for the Google Cloud Tech YouTube channel, and there's also a &lt;a href="https://dev.to/ykdap/agentifying-your-entire-software-development-lifecycle-dn9"&gt;blog post version&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/K3YYr6yauAw" rel="noopener noreferrer"&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%2F1afplo2qm3my0aqpvnoi.jpg" alt="Agentify SDLC with Antigravity (video)" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>antigravity</category>
    </item>
    <item>
      <title>7 advanced Claude Code tips from 17 months of intense use</title>
      <dc:creator>YK</dc:creator>
      <pubDate>Wed, 15 Jul 2026 19:30:13 +0000</pubDate>
      <link>https://dev.to/ykdap/7-advanced-claude-code-tips-from-17-months-of-intense-use-13ik</link>
      <guid>https://dev.to/ykdap/7-advanced-claude-code-tips-from-17-months-of-intense-use-13ik</guid>
      <description>&lt;p&gt;I've been using Claude Code intensely for about 17 months now, and I've ramped it up significantly over the past few months. So I wanted to share some of the more advanced tips I've learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Use auto mode
&lt;/h2&gt;

&lt;p&gt;Auto mode lets Claude decide whether a command is safe to run in context, instead of asking you to approve every single one. (You can cycle to it with shift+tab.) I've been using it for the past month or so and it's been working really well so far.&lt;/p&gt;

&lt;p&gt;The main thing it fixes is mindless approving. When a command is too long to read carefully, or you're getting tired, you end up approving things without really thinking about them. Auto mode takes that pressure off, so I think it's a good default.&lt;/p&gt;

&lt;p&gt;Over the past month or so, using auto mode has allowed me to be a lot more productive while still feeling safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Use Claude Code from your phone
&lt;/h2&gt;

&lt;p&gt;Remote Control lets you drive Claude Code from your phone, which pairs really well with auto mode - you can kick something off, walk away, and check on it from anywhere.&lt;/p&gt;

&lt;p&gt;The way I personally like to use it: whenever I need to do something, I start up a thread and run &lt;code&gt;/remote-control&lt;/code&gt; (or &lt;code&gt;/rc&lt;/code&gt; for short), and drive that same session from my phone. Because it's the same session, you can go back and forth between your phone and your computer.&lt;/p&gt;

&lt;p&gt;On your phone, you can use the transcription feature to talk to it quickly. Even if there are transcription mistakes, Claude is pretty much always able to figure them out.&lt;/p&gt;

&lt;p&gt;One of my favorite workflows with this: let the agent do the development and testing, take screenshots, and show them to me through a draft PR. That way I'm able to delegate a lot more, and it's able to achieve a lot more on its own than a traditional AI assistant.&lt;/p&gt;

&lt;p&gt;There's also a server mode (&lt;code&gt;claude remote-control --spawn=worktree --capacity=N&lt;/code&gt;) that lets you start brand new sessions from your phone, but I prefer the &lt;code&gt;/rc&lt;/code&gt; method, and I turn it off when I'm not using it. A potential attacker who gets access to your Claude Code session essentially has access to everything on your computer, so I'd rather be careful. The exception is when I have a completely isolated environment - then it's super convenient to be able to start a Claude Code session from anywhere from your phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Use Fable 5 as much as you can
&lt;/h2&gt;

&lt;p&gt;I've found that it's just generally a more capable model than Opus 4.6 or 4.8, and it's more friendly and easier to deal with than Opus 4.8. It feels like the best of both worlds: the ease of working with Opus 4.6, but also the intelligence of Opus 4.8.&lt;/p&gt;

&lt;p&gt;By no means is it a perfect model, but it is the best model we've seen. So I think it's an advantage to use it as much as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Give it a separate machine to control
&lt;/h2&gt;

&lt;p&gt;As an experiment, I decided to &lt;a href="https://github.com/ykdojo/claude-controls-mac" rel="noopener noreferrer"&gt;give Claude Code full access to one of my spare machines&lt;/a&gt; so that it could control it, and I could start new sessions from my phone without worrying about leaked data.&lt;/p&gt;

&lt;p&gt;So far, it's been working well. It's able to do anything on my spare laptop through computer use: it can click and drag things, and it can use the browser through Playwright and Claude in Chrome. I give it separate accounts so it doesn't mess things up. And the freedom of just letting it do everything it needs to do with &lt;code&gt;--dangerously-skip-permissions&lt;/code&gt; - I've found that to be great. This is another way for me to enable agents to do a lot more on their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Master the loop: investigate, design, implement, verify
&lt;/h2&gt;

&lt;p&gt;After implementing many features and fixing many bugs with Claude Code, I found a simple loop like this to be pretty effective.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Investigate&lt;/strong&gt;: ask it questions about the problem and try to understand it as much as you can. Pull related issues, Slack threads, and all the relevant context so you can get the full context of the problem. If it's a bug, create reproducible steps so you can verify your solution later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design&lt;/strong&gt;: discuss potential solutions, trade-offs, and what might be the best way forward. Have a long conversation if necessary, and build prototypes if necessary as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implement&lt;/strong&gt;: this is kind of a straightforward path once you've done solid investigation and design. But try to keep the code simple - it might create overly complex code, or touch other parts of the codebase or things you haven't asked for. So ask it to keep it concise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify&lt;/strong&gt;: review the changes by asking it about specific parts of what it's made. You can have it create a draft PR and make sure it looks good. Go back and forth. Have it test everything thoroughly by writing tests, running them, and through Playwright if relevant.&lt;/p&gt;

&lt;p&gt;This is a good way to ensure you move quickly, but with quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Use Claude in Chrome, if you haven't yet
&lt;/h2&gt;

&lt;p&gt;Claude in Chrome has been around for a while, but I've noticed that not a lot of people use it still, so that's why I wanted to mention it here.&lt;/p&gt;

&lt;p&gt;You could use Playwright for browser-related tasks. But what makes Claude in Chrome convenient is that it runs in your own browser profile, so you can give it access to logged-in state.&lt;/p&gt;

&lt;p&gt;It does its job well most of the time, but it sometimes still makes mistakes. For example, I was trying to search something on Slack, but instead it sent a message publicly. That was a little bit frustrating, but luckily not fatal. So you want to either be super careful about it and watch it closely, or give it separate accounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Use it to learn faster, not to replace understanding
&lt;/h2&gt;

&lt;p&gt;If it produces complex code that you don't understand, sometimes that's fine for a casual project. But if it's a more serious project and you want to understand what's going on, ask questions about it.&lt;/p&gt;

&lt;p&gt;If there's a draft PR you want to review, or maybe someone else's PR, ask it to walk you through the changes so you can understand them well. If you don't understand specific parts, don't be afraid to ask basic questions - you can ask deeper and deeper questions until you understand it fully. You can ask it to simplify things, or to summarize its responses.&lt;/p&gt;

&lt;p&gt;Really, work with it as a learning partner.&lt;/p&gt;




&lt;p&gt;Originally posted on &lt;a href="https://github.com/ykdojo/claude-code-tips" rel="noopener noreferrer"&gt;this repo&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>claude</category>
    </item>
    <item>
      <title>Agentifying your entire software development lifecycle</title>
      <dc:creator>YK</dc:creator>
      <pubDate>Mon, 13 Jul 2026 16:17:27 +0000</pubDate>
      <link>https://dev.to/ykdap/agentifying-your-entire-software-development-lifecycle-dn9</link>
      <guid>https://dev.to/ykdap/agentifying-your-entire-software-development-lifecycle-dn9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an adapted version of &lt;a href="https://youtu.be/K3YYr6yauAw" rel="noopener noreferrer"&gt;this video&lt;/a&gt; on the Google Cloud Tech YouTube channel. The slides are available &lt;a href="https://ykdojo.github.io/antigravity-cli-tips/content/sdlc-slides.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A common complaint about agentic coding is that people write more features with it, but they end up creating more bugs too. More code tends to naturally lead to more tech debt. Part of the reason we have this problem is that we tend to over-rely on agents to generate code, but not enough for maintaining it, reviewing it, or testing it.&lt;/p&gt;

&lt;p&gt;That's the motivation behind this post. It walks through a simplified version of the software development lifecycle (SDLC):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify and understand the issue&lt;/li&gt;
&lt;li&gt;Design a solution&lt;/li&gt;
&lt;li&gt;Implement it&lt;/li&gt;
&lt;li&gt;Review and test it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This doesn't cover all of SDLC, but it should be sufficient for this discussion. Let's go through these steps one by one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Identifying and understanding the issue
&lt;/h2&gt;

&lt;p&gt;I have two example issues to cover here.&lt;/p&gt;

&lt;p&gt;The first one is simple enough that it doesn't have to be agentified, but it'll be important later. For context: if you go to gitfut.com/yourusername, you get a card with a score for your GitHub contributions and stats like commits and stars earned, similar to a football (soccer) trading card. The nice thing about it is that it's open source. I was looking through it and found an issue, which I &lt;a href="https://github.com/ykdojo/gitfut/issues/1" rel="noopener noreferrer"&gt;copied to my own fork&lt;/a&gt; so I could work on it there. The problem this person had was that his last name is "De Ruwe" in two words, but his player card was only showing "Ruwe". It's short enough to just read yourself; we'll come back to it in step 3.&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%2Fmmr09i3tu97b8n0hlj3e.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%2Fmmr09i3tu97b8n0hlj3e.png" alt="My GitFut card page" width="800" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second example is &lt;a href="https://github.com/Eventual-Inc/Daft/issues/6296" rel="noopener noreferrer"&gt;an issue on Daft&lt;/a&gt;, an open source data processing library I've been part of for a while. This one is fairly complex, and there's an attached discussion that's also complex on its own.&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%2Fk91cyb54u151brn5np7l.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%2Fk91cyb54u151brn5np7l.png" alt="The Daft issue about supporting the LeRobot format" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I could read it sentence by sentence myself, but a faster way to handle this part of the process is to hand it to a tool like Antigravity:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you summarize this issue as well as the attached discussion and tell me what's going on? What's the problem exactly? What's the status?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This speeds up the process of identifying and understanding the issue. It's especially useful when there are a lot of discussions going on and a lot of attached PRs and issues.&lt;/p&gt;

&lt;p&gt;Once the agent comes back with a summary, I go back and forth with it to dig into specific parts. For example, if the summary is long:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You gave me a lot of information. It's a lot for me to read, so can you summarize it further? And also give me a summary of this PR that you mentioned, &lt;a href="https://github.com/Eventual-Inc/Daft/pull/7184" rel="noopener noreferrer"&gt;7184&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a process I use a lot: going back and forth with the agent to dig into certain issues or materials. I might also ask it to open certain pages so I can look into them myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Designing the solution
&lt;/h2&gt;

&lt;p&gt;Back to the GitFut example (I'm not associated with the project in any way, just a fan). When I looked at my own card, I wondered: how good is this score really? What does the number actually mean? It would be convenient to see a distribution of GitHub users and where you rank in relation to them. So I decided to implement this feature and &lt;a href="https://github.com/Younesfdj/gitfut/pull/37" rel="noopener noreferrer"&gt;sent a PR&lt;/a&gt;. The idea is to add a new distribution tab, so you can see that you're in the top X% of all GitHub users and the top X% of active devs.&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%2F8ltak8uqx0wa9dmqqkdd.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%2F8ltak8uqx0wa9dmqqkdd.png" alt="The distribution section on my GitFut card" width="361" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This required designing a couple of things. The visual look was relatively trivial compared to the system side: how do you gather this data in a privacy-friendly way? How do you store it? How do you show it?&lt;/p&gt;

&lt;p&gt;For that, I had a long conversation with a coding agent, asking questions like: what's a good way to fetch all the data? Can I fetch 20,000 accounts? It turns out I could. In the end, I fetched about 20,000 accounts and stored them in a privacy-friendly, anonymized way in the code itself, so it's efficient. I also looked at how many of those accounts were active in the past year. You can look at the PR itself to see how it was implemented. This bleeds a little into implementation, but it's an example where an agentic process for this part of the SDLC was really helpful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Implementing it
&lt;/h2&gt;

&lt;p&gt;Now let's go back to the name issue from step 1 and implement a fix.&lt;/p&gt;

&lt;p&gt;To recap: this person's last name is "De Ruwe" in two words, but the card only showed "Ruwe", because the app assumed the last word of your full name is your last name. The original project ended up fixing this by treating the last two words as the last name instead. But that heuristic isn't always right either. I have a middle name, for example, so if I had my full name on my GitHub account, the card would incorrectly show my middle name as part of my last name.&lt;/p&gt;

&lt;p&gt;I would solve it differently: instead of guessing, make the name customizable. The issue reporter actually suggested this approach himself. GitHub only has a single setting for your full name, so let the user change how their name appears on the card, the same way they can already pick a country. The country selector works through a URL parameter: if I pick Canada on my card, the URL gets &lt;code&gt;?country=CA&lt;/code&gt;, and anyone opening that URL sees the card with a Canadian flag. Remove the parameter and the flag is gone. The name can work exactly the same way, which I think is a reasonable approach.&lt;/p&gt;

&lt;p&gt;At this point, I've identified the problem and designed a solution, so I can start implementing. I take the URL of the repo I'm working on (in this case my fork, so I don't affect the original project) and prompt something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm working on this repository. It is a fork, so make sure to stay on this fork. I'm not sure if it's cloned yet. If not, you can clone it. If it's already cloned, pull the latest version and switch to the main or master branch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I keep all my Antigravity projects in a single projects folder, so it knows where to look for them. Then I describe the issue:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm working on this issue. The way I want to work on it is I want it to be like the country selector. If you look at the country selector, you can hover over it on anyone's card, select a country, and that's stored in the URL parameter. Can we do the same thing for the name? For the name within the card, maybe there's an overlay element I can hover over and edit the name to whatever I want, so that it's also stored in the URL parameter.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the kind of prompt I would use for this task. One small tip: I didn't remember the command for running the project locally, so I just asked Antigravity:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I've been working on this project, but I forgot how to run it. Was it npm run dev? Remind me, and actually run it for me so I can check it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It looked at package.json, confirmed the command, and ran it for me.&lt;/p&gt;

&lt;p&gt;The end result: there's now an edit option on the card itself, and the custom name is stored in a URL parameter, just like the country. If the person from the issue wants his full last name to show up, he can simply set it. To me, this is the most flexible and comprehensive solution, instead of trying to be smart about which part is the last name exactly. Maybe I just want to use my first name only, or my nickname.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Reviewing and testing
&lt;/h2&gt;

&lt;p&gt;For this step, I have &lt;a href="https://github.com/ykdojo/gitfut/pull/2" rel="noopener noreferrer"&gt;the complete version of the PR&lt;/a&gt; I was just working on. The title and description were all generated agentically, and there are quite a few changed files.&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%2F6jtsej0ygd6byxr5updn.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%2F6jtsej0ygd6byxr5updn.png" alt="The PR with the card name picker changes" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suppose someone else on my team created this PR, or I created it and forgot about it a little bit, and I want to review it before sending it out. You could review everything manually, but I've found an interactive way of reviewing to be pretty effective:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I have this PR that I want to review. I see that there are a lot of files that changed. Can you summarize each one for me so I can review them one by one? Keep each summary to one or two sentences so that it's easy to review.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Antigravity fetches the information from GitHub (or wherever you host your code) directly and summarizes each file. Then I go through them one by one. If a summary is good enough and the change makes sense, I mark that file as viewed. If something surprises me, like a sharing utility file that changed for reasons I don't quite understand when I look at it manually, I can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I don't quite understand this part. Can you explain this line by line?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then I copy and paste the relevant parts of the codebase.&lt;/p&gt;

&lt;p&gt;There's a question about craft here: how much of the code do you need to understand? How much do you want to understand? To me, this is the answer. You don't necessarily have to understand everything manually, but you have to know there's always an option to dig in with however much depth you need, line by line if necessary. Tools like Antigravity are helpful for speeding up the process. It doesn't mean you lose control of your code. On the contrary, I think you gain more control by being able to dig into any part of the codebase more easily.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;That's the entire (simplified) SDLC, agentified.&lt;/p&gt;

&lt;p&gt;If you want more tips like this, check out the rest of &lt;a href="https://github.com/ykdojo/antigravity-cli-tips" rel="noopener noreferrer"&gt;this repo&lt;/a&gt;, and you can watch the full video version of this post &lt;a href="https://youtu.be/K3YYr6yauAw" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

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