The short version
- Google launched Antigravity in November 2025 and opened its command line tool,
agy, to everyone in May 2026. Luminair runs agy as one engine among many. - agy is a native binary that updates itself. Luminair installs it into its own folder and never touches your PATH or shell profile.
- Google's sign-in ends on a page that prints a code. That code has to go back into the CLI. Since 1.0.150 Luminair watches the clipboard and types it in when you press Copy.
- Each Antigravity account gets its own folder with its own macOS keychain, which stops the “Keychain Not Found” dialog and lets several Google accounts live side by side.
- The model picker shows what
agy modelsactually listed for each account, not a list we guessed.
The year of the agent.
On 18 November 2025, alongside Gemini 3, Google wrote: “Today, we are introducing Google Antigravity, our new agentic development platform.” It launched in public preview “at no charge, with generous rate limits on Gemini 3 Pro usage.” Ars Technica's launch coverage put the pitch plainly: “Google says you should think of Antigravity as a “mission control” for creating and monitoring multiple development agents.” It also noted that “Antigravity also supports Claude Sonnet 4.5 and GPT-OSS agents.”
Antigravity was not alone. Luminair’s engines folder tells the story: it now holds files for Claude, Codex, Gemini, Kimi, Qwen, GLM, DeepSeek, Grok, Meta, Perplexity, Ollama and LM Studio, each with its own sign-in and its own idea of what a model list looks like. In May 2026 Google moved its terminal users over: “Starting today, Antigravity CLI is available to everyone.” The same post says: “Built in Go, Antigravity CLI is snappier and more responsive.”
For an app like Luminair, that pace is the whole point. Luminair is one window for many models, and each one arrives as an engine: a single file in desktop/engines/ that declares its models, how to sign in and how to run a turn. The registry loads every file in that folder by itself. The picker, the account menu and the run all come from what the file declares. Antigravity’s file gives it display order 41, one after Gemini’s 40, so the two Google lanes sit together.
The first version landed on 15 September 2026. It was rebuilt on 18 September after, in the words of the file's own header, “a day of sign-outs, browser tabs, misread meters and refused conversations.” The lessons below come from that week.
Leave the tool alone.
Some agents ship as a Node package. agy is different: a native, signed binary of roughly 180 MB that keeps itself current. Our audit on 18 September found it had quietly updated itself at 03:49 that morning.
That settles a few design choices. Luminair does not pin a version or patch the binary. When you add your first Antigravity account and agy is missing, Luminair runs Google's own installer (antigravity.google/cli/install.sh) with a target directory inside Luminair's app data. It never writes to your PATH or your shell profile. If you already installed agy yourself, the engine finds it: Luminair's copy first, then ~/.local/bin, then the usual Homebrew locations, then your PATH.
A 180 MB download takes a while, and a button that does nothing for a minute feels broken. So the app says what is happening: “Downloading the Antigravity tool (~180MB). The browser opens once it lands…”
Runs are headless. Each turn calls agy -p with --output-format stream-json and a long --print-timeout, because agy's own default of five minutes is far too short for a real task and Luminair's runner already decides when a run is stuck. Luminair's five effort levels map onto Antigravity's three: low, medium and high, with the three highest all sent as high.
A sign-in that ends on a page.
Most command line tools sign you in with a loopback redirect: the browser finishes, calls a tiny server the tool opened on your machine, and the tool knows you are in. agy's Google sign-in works differently, and it took a day to be sure.
After you approve, Google redirects to a static page, antigravity.google/oauth-callback. Our engine notes record what that page does: it “prints the code with a Copy button and never calls agy's localhost listener, so the code has to be handed back to the CLI (typed into its pty).” The pty is a pseudo-terminal: Luminair runs interactive agy inside one, where you cannot see it, answers “Select login method” with Enter for Google OAuth, and waits.
The first fix was a box: Luminair opened “Finish the Antigravity sign-in” and asked you to paste the code. It worked, but on 18 September we found an account signed out because a re-login had cleared its token and then timed out with no code pasted. Version 1.0.150 made the Copy button the whole gesture.
// A Google authorization code as the callback page prints it ("4/0A…", base64url). const AUTH_CODE_RE = /^4\/[0-9A-Za-z_-]{20,}$/; function looksLikeAuthCode(text) { return AUTH_CODE_RE.test(String(text || '').trim()); }
While a sign-in is live, the engine reads the clipboard every 600 milliseconds. It ignores whatever was there when the sign-in started, ignores anything that is not shaped like a Google authorization code, and stops the moment the sign-in settles. When a code appears, it types it into agy, closes the box and shows “Got the code from your clipboard. Finishing the Antigravity sign-in…”. The paste box stays open the whole time as a fallback.
Success is never assumed from a click. agy logs “authenticated successfully as” followed by the account's email, and Luminair then asks agy models under the new account's folder. Only a real model list counts. If Google refuses the code, agy says “token exchange failed” and the attempt ends within seconds with a plain message instead of a fifteen minute wait.
One more guard came out of the same day. A signed-out account's queued runs started Google OAuth on their own and opened a sign-in tab once a minute. Now a signed-out account is refused before a run starts, a small shim in front of PATH turns agy's open into a no-op for headless runs, and any run whose output asks for a sign-in is stopped at once and the account flagged for Re-login.
Where the token lives.
agy keeps its config, conversations and OAuth token under $HOME. To give every Antigravity account its own sign-in, Luminair points HOME at a separate folder per account. That worked for files, and immediately broke something else.
agy stores its token through a Go library that asks macOS for the default keychain of the current home. A bare folder has none. On 15 September the first sign-in popped the system's “Keychain Not Found” dialog, and agy fell back to a plain file. The fix is ensureKeychain: each account folder gets its own login.keychain-db, created once, set never to auto-lock and unlocked before each run. Every security command runs with HOME set to that folder, so your real keychain and your default keychain setting are never touched.
Moving HOME had a second cost we only found in a live audit: every command a model ran inside an Antigravity turn saw the bare folder. Git had no identity, gh had no login, and your shell config was missing. The home now links your own dotfiles in, never copying and never overwriting something the folder already has.
The payoff of all this is that the engine declares multiAccount: true. A personal and a work Google account can both be signed in, each with its own token, keychain and conversations.
Ask the tool, not the docs.
Which models does an Antigravity account have? That depends on the account and changes over time, so Luminair asks. agy models does two jobs. Signed out, it prints “Please sign in to view available models”. Signed in, it prints one line per model: a slug, a tab, a label.
agy models (one account)
gemini-3.8-flash-high ⇥ Label gemini-3.8-flash-low ⇥ Label another-slug ⇥ Label Please sign in to view…
This account's rows
The parser in auth.js keeps lines of the form slug, tab, label, lower-cases the slug and drops duplicates. Every build ships four static rows: “Antigravity · Google's current default”, which sends no model flag at all so it can never go stale, plus three Gemini Flash levels. Any slug an account lists beyond those becomes a new row labelled “· via Antigravity”, with its ids prefixed antigravity- so they never collide with the Gemini engine's own gemini-* ids.
The picker is per account. availableModelIds returns only what that sign-in listed, plus the default row, so you never pick a model your plan does not include. The list is refreshed about twenty seconds after every launch, and the same sweep flips an account's signed-in flag in either direction based on what agy says, with the reason written to the log.
Two limits we hit are Google's, not ours, and the engine works around them. Google refuses a resumed conversation once its history passes roughly 2 MB, with a message about an individual quota. Luminair rotates to a fresh thread at 1.6 MB, carrying a catch-up note, and retries a refused thread fresh once. And on a resumed thread, Luminair's static session rules are not sent again, because agy's transcript already holds them: we measured 44% of one 3.6 MB transcript as repeated boilerplate.
Add an account, press Copy.
- 1Open Settings › Models (the account menu's Add account lands there too) and add an Antigravity account. If agy is missing, Luminair downloads it first.
- 2Approve the Google sign-in in your browser, then click Copy to Clipboard on Google's page. Luminair types the code in by itself. Pasting it into the box works too.
- 3Pick a model from the session's model menu. Only the models your account listed appear. If a sign-in expires, use Re-login from the account menu; queued messages wait for it.
Checked, and not claimed.
What this post does not claim
- Why Google refused one sign-in code on 18 September. agy does not log a reason.
- That the model rows shown here match your account. They depend on your Google plan and change without a Luminair release.
- That agy's browser tools work inside a run. On 18 September they could not download a driver they need (the download returned 404), which only a Google update can fix.
Sources
- Google Antigravity · 18 November 2025Introducing Google Antigravity, a New Era in AI-Assisted Software Development
- Ars Technica · 18 November 2025Google unveils Gemini 3 AI model and AI-first IDE called Antigravity
- Google Developers Blog · 19 May 2026An important update: Transitioning Gemini CLI to Antigravity CLI
For the bigger picture of how Luminair holds many engines at once, read One window for every model.
Bring your Google agent
Add an Antigravity account, press Copy, and run it next to every other model you use.