<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ankur's Outer Monologue]]></title><description><![CDATA[I have been a software engineer for 30+ years. I'm passionate about technology, AI and software development.

I lead the Global Developer Relations team at Goog]]></description><link>https://blog.ankur.cc</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 09:44:48 GMT</lastBuildDate><atom:link href="https://blog.ankur.cc/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Vibe Coding to Production #2 - Secrets]]></title><description><![CDATA[In the previous blog post, we vibe coded a basic Gemini chatbot, deployed it to Google Cloud Run and configured CI/CD ensuring that every commit to the GitHub repo resulted in a new build being automa]]></description><link>https://blog.ankur.cc/vibe-to-production-2-secrets</link><guid isPermaLink="true">https://blog.ankur.cc/vibe-to-production-2-secrets</guid><dc:creator><![CDATA[Ankur Kotwal]]></dc:creator><pubDate>Mon, 09 Mar 2026 07:38:07 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/9f9eb869-35c8-432e-aeed-6c0d15ec0b9f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the <a href="https://blog.ankur.cc/vibe-coding-to-production">previous blog post</a>, we vibe coded a basic Gemini chatbot, deployed it to Google Cloud Run and configured CI/CD ensuring that every commit to the GitHub repo resulted in a new build being automatically deployed to Cloud Run.</p>
<p>We took an insecure shortcut! Our app needs a Gemini API key and we declared it as an environment variable. Although environment variables aren’t publicly readable in Cloud Run, they’re not the most secure option for storing API keys. This especially becomes an issue as you work with teams greater than 1, where not everyone should have access to sensitive data. But you still need a way for your app to access that sensitive data.</p>
<p><a href="https://cloud.google.com/security/products/secret-manager">Google Cloud Secret Manager</a> is a secure and centralized management system for storing, managing, and accessing sensitive information such as API keys, passwords, and certificates.</p>
<p>For our simple chat app, Secret Manager ensures that only the app has access to the API key and provides additional benefits such as key versioning and expiration, without requiring code changes to the app.</p>
<h2>Making the code changes</h2>
<p>We're going to migrate the app to use Secret Manager. We do so with the following prompt to my IDE of choice, <a href="http://antigravity.google">Google Antigravity</a>:</p>
<p><code>Instead of using an environment variable for the Gemini api key, use Google Cloud Secret Manager.</code></p>
<p>Antigravity provides the following implementation plan:</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/3b7bbe16-7eec-458b-93b0-fd422faf87dd.png" alt="" style="display:block;margin:0 auto" />

<p>After proceeding with Antigravity's implementation plan, we see the following code changes:</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/813872d1-c808-4249-ad69-2a68dd273e30.png" alt="" style="display:block;margin:0 auto" />

<p>We will accept the code changes, push the commit and merge it in GitHub. Once the code PR has been merged into the main branch, GitHub will kick off a build (as per our CI/CD setup in <a href="https://blog.ankur.cc/vibe-coding-to-production">Part 1 of this blog series</a>). GitHub indicates that a build is in progress with a yellow dot on the frontpage for the repo as follows.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/c545502b-2811-42de-bd8e-183735fddb62.png" alt="" style="display:block;margin:0 auto" />

<p>You can also view the build output while it is in progress by clicking that dot. The build is being carried out by Google Cloud Build but the status is synchronised with GitHub so progress can be viewed there.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/c9f2f0ba-d882-4f22-8269-b9971fa5e09c.png" alt="" style="display:block;margin:0 auto" />

<p>Due to our CI/CD setup, Cloud Run will deploy the newly created container image immediately. But we haven't actually configured Secret Manager yet!</p>
<h2>Create secret</h2>
<p>We now need to go to <a href="https://console.cloud.google.com/security/secret-manager/create">Google Cloud Secret Manager in the Google Cloud console</a> and create a key as follows:</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/a35ce8d4-dcf6-4828-a361-1571ac8cb76e.png" alt="" style="display:block;margin:0 auto" />

<p>We need to note the path to the secret as we will need this path to access it later. You can see the project ID and name of the secret below.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/de49ea4f-30fd-4b78-ae47-79bfe6fbe889.png" alt="" style="display:block;margin:0 auto" />

<p>Although we are now using Secret Manager to store our API key, we rely on two environment variables to point us to the key - the project ID (a number) and the name of the secret. We noted down the path from the screenshot above and it contained these pieces of information. Therefore we need to edit our Cloud Run deployment to declare these environment variables.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/2beefcb1-7c50-414f-9ccf-abdbf1425e0f.png" alt="" style="display:block;margin:0 auto" />

<p>Now let's check out the app!</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/c6390b6b-5d2b-4bdb-8157-a3cf32ac5bf4.png" alt="" style="display:block;margin:0 auto" />

<p>Uh oh! That was unexpected. The 403 error gives us a clue that this is a permissions problem. We created the secret but didn't allow it to be accessed by our Cloud Run instance. This is a feature! Secrets are access controlled such that only certain users have access to them.</p>
<p>Our Cloud Run app runs under a service account, a special type of Google account intended to represent a non-human user. We need to ensure that the service account has permission to read secrets. We will go to the <a href="https://console.cloud.google.com/iam-admin/iam">Identity and Access Management (IAM) permissions for our service account</a> and add the "Secret Manager Secret Accessor" permission as shown below.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/14cefbbd-6e2b-412e-b32a-160140748fde.png" alt="" style="display:block;margin:0 auto" />

<p>Ok now we should be good to go!</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/ac2beeff-50c7-4989-9662-6e83e3b4c5b9.png" alt="" style="display:block;margin:0 auto" />

<p>And there we have it. We have successfully migrated our code from using an environment variable to retrieve our Gemini API key to using Google Cloud Secret Manager. This is not only more secure but also far more flexible. Check out Secret Manager <a href="https://cloud.google.com/security/products/secret-manager">here</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Vibe Coding to Production]]></title><description><![CDATA[Vibe coding apps is great for prototyping but this can leave you short of a robust developer workflow with an integrated CI/CD. The following post covers in detail how to set up a codebase with GitHub]]></description><link>https://blog.ankur.cc/vibe-coding-to-production</link><guid isPermaLink="true">https://blog.ankur.cc/vibe-coding-to-production</guid><category><![CDATA[vibe coding]]></category><category><![CDATA[cloud run]]></category><category><![CDATA[gemini cli]]></category><category><![CDATA[#cloud-build]]></category><dc:creator><![CDATA[Ankur Kotwal]]></dc:creator><pubDate>Mon, 02 Mar 2026 17:30:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/8a8b5f21-3100-479a-ae45-52de781fb595.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Vibe coding apps is great for prototyping but this can leave you short of a robust developer workflow with an integrated CI/CD. The following post covers in detail how to set up a codebase with GitHub, integration with Google Cloud Build and deployment with Google Cloud Run.</p>
<h2>Creating the app</h2>
<p>For the example app, I will create a basic chat app (using <a href="http://geminicli.com">Gemini CLI</a>).</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/62319a01-5fca-426b-9c4d-b9b12950fc43.png" alt="" style="display:block;margin:0 auto" />

<p>You can see above that we've used the prompt <code>generate an attractive looking python webapp that is a gemini chatbot using the gemini 3 flash model</code> to build it. It was sufficiently capable but also very simple and it worked out of the box!</p>
<p>Note that the app is using the latest google-genai package. Gemini 3 has a knowledge cutoff of January 2025 and hence doesn't default to this package. To equip Gemini 3 with the latest knowledge, check out a previous blog post on <a href="https://blog.ankur.cc/upskilling-antigravity-for-the-gemini-api">Upskilling Antigravity and Gemini CLI for the Gemini API</a>.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/5a394ea5-15bb-49c8-aa63-53ca745917a1.png" alt="" style="display:block;margin:0 auto" />

<h2>Creating a GitHub repository</h2>
<p>Next, I want to push the code to GitHub - I will use the <a href="https://cli.github.com/">GitHub CLI</a>. The first step is to create a local git repo and commit the code. The next step is to push the code to GitHub in a new private repo called <code>simplechat</code>.</p>
<p>📝 Note: The app is only comprised of two files: <code>app.py</code> and <code>requirements.txt</code>.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/df4ee399-6987-492b-ba09-63493a07d3fa.png" alt="" style="display:block;margin:0 auto" />

<h2>Deploying to Cloud Run</h2>
<p>Cloud Run is a fully managed serverless platform that allows you to run containerised applications that automatically scale from zero to thousands of instances, ensuring you only pay for the exact resources your code consumes while it's active.</p>
<p>Let's now configure deployment to <a href="https://console.cloud.google.com/run">Google Cloud Run</a>. The steps are as follows:</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/0e7ee729-8d03-445a-b26c-fc72953d3259.png" alt="" style="display:block;margin:0 auto" />

<ol>
<li><p>[Screenshot 1] Navigate to <a href="https://console.cloud.google.com/run/overview">https://console.cloud.google.com/run/overview</a></p>
</li>
<li><p>[Screenshot 1] Select "Connect Repository"</p>
</li>
<li><p>[Screenshot 2] On the next screen, select "GitHub." Continuously deploy from a repository (source or function).</p>
</li>
<li><p>[Screenshot 2] Also select "Cloud Build".</p>
</li>
<li><p>[Screenshot 3] Click "Set up Cloud Build". This will expand a panel on the right-hand side of the window, where you can authenticate your GitHub account and connect your repository. Once you have done so, you will be on the third image below (bottom right).</p>
</li>
<li><p>[Screenshot 3] Give your Cloud Run service a name and region. I chose <code>simplechat</code> for the name and <code>us-central1</code>. For authentication, select "Allow public access" and click "Create".</p>
</li>
<li><p>[Screenshot 4] Under the "Creating service" section, you can see the status of creating the service, creating the build trigger, building and deploying from the repository. At the end of this, you'll have a URL to access the Cloud Run service.</p>
</li>
</ol>
<p>📝 I'd said earlier that the app is only two files <code>app.py</code> and <code>requirements.txt</code>. The neat thing about deploying through Cloud Run is that it uses <a href="https://buildpacks.io/">Buildpacks</a>. Because of Buildpacks, we don't even need to write a Dockerfile; it inspects the code, detects Python, and containerises it automatically.</p>
<h2>Configuring API keys securely</h2>
<p>After deploying the app, there's an error! The API key is missing.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/7518e758-50bd-44f9-a9e1-6ba760573c2e.png" alt="" style="display:block;margin:0 auto" />

<p>To fix this, the Cloud Run deployment needs to be edited to declare the GEMINI_API_KEY environment variable.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/5c22ff96-e949-4be6-93ab-ed44f1e56514.png" alt="" style="display:block;margin:0 auto" />

<p>The steps to do this are:</p>
<ol>
<li><p>[Screenshot 1] On the Cloud Run deployment page, click "Edit and Deploy New Revision".</p>
</li>
<li><p>[Screenshot 2] Select "Variables &amp; Secrets" and click "Add variable".</p>
</li>
<li><p>[Screenshot 3] Call the variable "GEMINI_API_KEY" and fill in its value. Click "Deploy".</p>
</li>
</ol>
<p>This will deploy a new revision of the app (using the previously built container image), where the environment variable will be accessible.</p>
<p>📝 We just injected our <code>GEMINI_API_KEY</code> as a plaintext environment variable. This is fine for our simple chat app, but as your app grows, you'll want to lock this down. The industry-standard next step is to use <strong>Google Cloud Secret Manager</strong>. You can store the key there and configure Cloud Run to pull it securely at runtime, ensuring your secrets are properly encrypted and access-controlled.</p>
<h2>Confirm that changing source code deploys automatically to Cloud Run</h2>
<p>Now I will update the heading to force a source code change, push to GitHub and observe the automated Cloud Run deployment. The source code change is:</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/d63aa3c7-ad0b-4d29-80c7-53fa2e2f37d3.png" alt="" style="display:block;margin:0 auto" />

<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/1561c9c4-11f5-4e62-a0e0-bf947c6b7924.png" alt="" style="display:block;margin:0 auto" />

<p>Pushing this code will immediately trigger a Cloud Build.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/633c8427-299c-4259-8e8f-319576417e6b.png" alt="" style="display:block;margin:0 auto" />

<p>Once this is finished, the updated app is instantly available on Cloud Run.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/64bbc0f1-e79b-4cb2-a7b1-5ce42ccb7692.png" alt="" style="display:block;margin:0 auto" />

<p>In this blog post, I created a simple Gemini chat app using Gemini CLI. I pushed the repository to GitHub, configured a new Cloud Run service that connects to the GitHub repo, added my secrets (through environment variables) and demonstrated the automated deployments through code pushes. I now have a production ready setup. As the app grows, this setup will allow me to quickly iterate.</p>
<img src="https://cdn.hashnode.com/uploads/covers/698d4c787a62b51e1541edd2/00e67f5a-d7ac-4ced-9315-eb1787e06456.png" alt="" style="display:block;margin:0 auto" />]]></content:encoded></item><item><title><![CDATA[Increasing test coverage with Antigravity & Gemini]]></title><description><![CDATA[AI tooling is resulting in a lot of code being written and you can also use it to write and expand test coverage. A few years ago, I wrote MetaRefCard, an app to help me map the complex controls of fl]]></description><link>https://blog.ankur.cc/increasing-test-coverage-with-antigravity-gemini</link><guid isPermaLink="true">https://blog.ankur.cc/increasing-test-coverage-with-antigravity-gemini</guid><dc:creator><![CDATA[Ankur Kotwal]]></dc:creator><pubDate>Mon, 23 Feb 2026 18:30:00 GMT</pubDate><enclosure url="https://cloudmate-test.s3.us-east-1.amazonaws.com/uploads/covers/698d4c787a62b51e1541edd2/83d512b9-34b4-40b7-9c79-105c497f0092.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>AI tooling is resulting in a lot of code being written and you can also use it to write and expand test coverage. A few years ago, I wrote <a href="http://github.com/ankurkotwal/metarefcard">MetaRefCard</a>, an app to help me map the complex controls of flight simulators like Elite Dangerous, Star Wars Squadrons and Microsoft Flight Simulator for my HOTAS (hands on throttle and stick) setup.</p>
<img src="https://cloudmate-test.s3.us-east-1.amazonaws.com/uploads/covers/698d4c787a62b51e1541edd2/b33ef70d-bad9-48a0-a40b-39ff12ea8906.jpg" alt="" style="display:block;margin:0 auto" />

<p>Over the years, I’ve maintained the codebase, mostly to update my dependencies in response to CVEs. I’ve recently been making these security changes using <a href="https://antigravity.google/">Antigravity</a> and Gemini 3 Pro. I would manually test all these changes between releases.</p>
<h2>Antigravity with Gemini gets you started quickly</h2>
<p>MetaRefCard is written in Go which has excellent tooling for building &amp; running tests. Antigravity and Gemini are able to utilise them very well.</p>
<p>To start, I asked Antigravity to build out a comprehensive set of tests. The result was a decent number of unit tests but I couldn't judge how comprehensive it was. Go’s testing framework can actually provide this data.</p>
<img src="https://cloudmate-test.s3.us-east-1.amazonaws.com/uploads/covers/698d4c787a62b51e1541edd2/5bf76739-284a-4ca2-b5d1-ad340047606a.png" alt="" style="display:block;margin:0 auto" />

<p>It’s easy to generate the output yourself.</p>
<pre><code class="language-plaintext">ankur@:~/devel/metarefcard$ go test -coverprofile=coverage.out ./... &amp;&amp; go tool cover -func=coverage.out
ok metarefcard              29.241s coverage: 0.0% of statements
ok metarefcard/mrc          0.584s  coverage: 0.0% of statements
ok metarefcard/mrc/common   0.003s  coverage: 1.3% of statements
ok metarefcard/mrc/fs2020   0.004s  coverage: 60.9% of statements
ok metarefcard/mrc/sws      0.011s  coverage: 77.3% of statements

main.go:13:               main                           0.0%
main.go:22:               parseCliArgs                   0.0%
mrc/common/devices.go:4:  LoadDevicesInfo                0.0%
mrc/common/game.go:40:    TitleCaser                     0.0%
mrc/common/game.go:86:    GameBindsAsString              0.0%
mrc/common/game.go:114:   Keys                           0.0%
mrc/common/image.go:17:   GenerateImages                 0.0%
mrc/common/image.go:69:   prepImgGenData                 0.0%
mrc/common/image.go:91:   populateImage                  0.0%
mrc/common/image.go:177:  decodeJpg                      0.0%
mrc/common/image.go:194:  measureString                  0.0%
mrc/common/image.go:201:  calcFontSize                   0.0%
mrc/common/image.go:250:  prepareContexts                0.0%
mrc/common/image.go:261:  getPixelMultiplier             0.0%
mrc/common/image.go:269:  drawTextWithBackgroundRec      0.0%
mrc/common/image.go:289:  addImageHeader                 0.0%
mrc/common/image.go:315:  addMRCLogo                     0.0%
mrc/common/logger.go:12:  Dbg                            0.0%
mrc/common/logger.go:17:  Msg                            0.0%
mrc/common/logger.go:24:  Err                            0.0%
mrc/common/logger.go:31:  Fatal                          0.0%
mrc/common/logger.go:36:  NewLog                         0.0%
mrc/common/model.go:10:   LoadGameModel                  0.0%
mrc/common/model.go:17:   FilterDevices                  0.0%
mrc/common/model.go:40:   GenerateContextColours         0.0%
mrc/common/model.go:66:   PopulateImageOverlays          0.0%
mrc/common/model.go:115:  GenerateImageOverlays          0.0%
mrc/common/util.go:18:    Keys                           100.0%
mrc/common/util.go:27:    LoadYaml                       0.0%
mrc/common/util.go:43:    YamlObjectAsString             0.0%
mrc/common/util.go:55:    loadFont                       0.0%
mrc/common/util.go:79:    loadFont                       0.0%
mrc/fs2020/fs2020.go:31:  GetGameInfo                    0.0%
mrc/fs2020/fs2020.go:36:  handleRequest                  0.0%
mrc/fs2020/fs2020.go:54:  loadInputFiles                 79.6%
mrc/fs2020/fs2020.go:234: matchGameInputToModel          0.0%
mrc/fs2020/fs2020.go:262: matchGameInputToModelByRegex   43.6%
mrc/metarefcard.go:36:    GetServer                      0.0%
mrc/metarefcard.go:94:    loadLocalFiles                 0.0%
mrc/metarefcard.go:106:   loadFormFiles                  0.0%
mrc/metarefcard.go:131:   sendResponse                   0.0%
mrc/metarefcard.go:195:   String                         0.0%
mrc/metarefcard.go:200:   Set                            0.0%
mrc/metarefcard.go:206:   GetFilesFromDir                0.0%
mrc/sws/sws.go:31:        GetGameInfo                    0.0%
mrc/sws/sws.go:36:        handleRequest                  0.0%
mrc/sws/sws.go:52:        loadInputFiles                 86.5%
mrc/sws/sws.go:181:       addAction                      100.0%
mrc/sws/sws.go:207:       getInputTypeAsField            85.7%
mrc/sws/sws.go:227:       interpretInput                 66.7%
mrc/sws/sws.go:302:       matchGameInputToModel          0.0%
total:                    (statements)                   29%
</code></pre>
<p>The initial test coverage wasn’t great at 29% but it was clear which files and functions had less coverage.</p>
<h2>Guiding the model to expand coverage</h2>
<p>One of the nice things about Go’s testing coverage report is that it can tell you test coverage per function. This way, I could see where my testing gaps were. I started asking Antigravity to increase coverage overall and when that had diminishing returns, I asked to increase coverage of specific functions.</p>
<img src="https://cloudmate-test.s3.us-east-1.amazonaws.com/uploads/covers/698d4c787a62b51e1541edd2/390971f5-a39e-42c2-9fa1-bc80a0811080.png" alt="" style="display:block;margin:0 auto" />

<p>I had to guide the process much more and ask questions about why it couldn’t go higher. This is a modern way of agentic engineering where my focus wasn’t on each line of code but instead it was about guiding the outcome.</p>
<h2>Completing test coverage</h2>
<p>Using this technique, I spent the next couple of hours having Antigravity eventually get my test coverage to <strong>99.7%</strong>, with the only code not covered by unit tests being the main function. Again, this required back and forth with the tool.</p>
<img src="https://cloudmate-test.s3.us-east-1.amazonaws.com/uploads/covers/698d4c787a62b51e1541edd2/8e06d808-85ed-4b71-8f1c-4aa85b1a27cf.png" alt="" style="display:block;margin:0 auto" />

<p>I’m really satisfied with where I ended up. In a few hours, I had a very comprehensive test suite and felt a lot more confident to automatically make changes in the future.</p>
<p>If you’ve got a codebase that could do with additional test coverage, it’s easy to get started with <a href="http://antigravity.google">Antigravity</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Upskilling Antigravity for the Gemini API]]></title><description><![CDATA[Google Antigravity is an agentic IDE that helps you build software. Antigravity offers a variety of models for agentic coding including the latest Gemini and Claude models. If you’re building an app that calls the Gemini API, you may find that the ge...]]></description><link>https://blog.ankur.cc/upskilling-antigravity-for-the-gemini-api</link><guid isPermaLink="true">https://blog.ankur.cc/upskilling-antigravity-for-the-gemini-api</guid><category><![CDATA[gemini]]></category><category><![CDATA[Google Antigravity]]></category><category><![CDATA[agent-skills]]></category><dc:creator><![CDATA[Ankur Kotwal]]></dc:creator><pubDate>Tue, 17 Feb 2026 02:53:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1771294717649/135201d1-7235-4ce9-952e-9e4ae1ade64e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a target="_blank" href="http://antigravity.google">Google Antigravity</a> is an agentic IDE that helps you build software. Antigravity offers a variety of models for agentic coding including the latest Gemini and Claude models. If you’re building an app that calls the Gemini API, you may find that the generated code is using old libraries or not calling the latest models - regardless of which models you use. In this post, we'll look at why this happens and how to easily fix it.</p>
<p>In the screenshot below, you can see that we are using “Gemini 3 Pro (High)” (currently Google’s best model) with the following prompt:</p>
<pre><code class="lang-plaintext">create a new python webapp that calls the gemini API using the latest gemini model
</code></pre>
<p>Immediately you can see a problem in the code. The app is using the deprecated <code>google-generativeai</code> package and we can see that the code is also calling the outdated <code>gemini-1.5-flash</code> model.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771294215444/060e8b65-fdba-49c9-b7dc-cdf6335d8b29.png" alt class="image--center mx-auto" /></p>
<p>Why does this happen? Shouldn’t Antigravity and Gemini 3 Pro write code that leverages the latest packages and models? Simply put, it has to do with the model’s knowledge cutoff. Even though Gemini 3 Pro was launched in December 2025, the model’s knowledge cutoff is January 2025. Gemini 3 Pro doesn’t know about models and packages that launched afterwards. Therefore, the model is defaulting to older packages and models. This issue is not unique to Gemini and all models face it.</p>
<p>Thankfully there’s a fix for this! Antigravity supports <a target="_blank" href="https://agentskills.io/what-are-skills">Agent Skills</a> to make this easier. “Agent Skills are a lightweight, open format for extending AI agent capabilities with specialized knowledge and workflows.” We can use Agent Skills to equip Antigravity and Gemini 3 Pro (or whichever model you use) with the latest knowledge.</p>
<p>The Google Gemini team recently launched the <a target="_blank" href="https://github.com/google-gemini/gemini-skills">Gemini Skills GitHub repository</a>.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771294291373/30deb393-65ee-4638-94ec-2716c6f9b723.png" alt class="image--center mx-auto" /></p>
<p>This repo contains a skill that Antigravity’s agents can use to guide the model towards using the latest Gemini API packages (across a range of languages) and the latest models.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771295446924/6bb1a113-6fbb-408d-b851-e405b4c038a4.png" alt class="image--center mx-auto" /></p>
<p>Once we’ve added this skill to <code>~/.gemini/antigravity/skills/gemini-api-dev/SKILL.md</code>, we can retry our prompt. We immediately see the desired results.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1771295876661/51b73ed4-fb09-41fe-a48a-0f98c0909767.png" alt class="image--center mx-auto" /></p>
<p>While AI models are incredibly powerful, their knowledge cutoffs will always be a limiting factor in the fast-paced world of software development. Fortunately, Agent Skills provide a lightweight and effective bridge. By giving Google Antigravity up-to-date context, you can ensure your agentic IDE is always writing modern, relevant code. Head over to the Gemini Skills GitHub repository to grab this skill, or try writing your own custom skills to tailor Antigravity to your specific needs.</p>
]]></content:encoded></item></channel></rss>