antigravity¶
Google Antigravity is three products under one catalog agent. The CLI, agy,
is a single Go binary. The desktop app (version 2.x, since 2.0) is an
Electron app, a desktop program built on Chromium and Node.js, whose bundle
calls the product "AGY Hub" (its internal name for the agent-first app, and
the --subclient_type hub argument it passes to its backend,
Data directories under ~/.gemini); it
describes itself to the user as "redesigned to put agents first". The
IDE, the VS Code fork that carried the Antigravity name before 2.0, is now
a separate download named "Antigravity IDE". The CLI and the desktop app run
the same Go backend, which the app calls the language server: it ships it as
language_server, the name it gives the process that serves its agent
conversations (the program that owns the conversation stores and runs the
agent), and starts it in standalone mode. Both write the same
SQLite-of-protobuf conversation databases, each into its own data directory
under ~/.gemini/. The app runs a scheduled task (an automation) as a
sidecar, a long-running helper process the language server supervises. The
CLI and desktop app transcripts are parsed by the antigravity parser
(Parser plan).
Source and evidence¶
Closed source; no public source exists. Evidence levels, tagged per claim:
- binary:
~/.local/bin/agyon the author's WSL (Windows Subsystem for Linux) workstation, the Google Antigravity CLI installed 2026-10-03, ELF x86-64 (the Linux executable format), 209,625,296 bytes (about 200 MB), sha256a759ce7c7a235d9b...,strings -n 8saved toscratchpad/agy_strings.txt(552,251 lines). The embedded changelog's newest heading is## 1.2.15(agy_strings.txt:310457; oldest## 1.0.0at 311213). Cited asstr:<line>or by quoted literal. It embeds 1300.protodescriptors; the relevant packages aregemini_coder(third_party/gemini_coder/proto/trajectory.proto),exa.cortex_pb(third_party/jetski/cortex_pb/cortex.proto),exa.codeium_common_pbandexa.jetski_cortex_pb. Thejetski,cascadeandcodeiumnames show the lineage from Windsurf's Cascade agent. The parser's tables were built from these descriptors. - descriptors: the protobuf descriptors embedded in
agy1.2.16 macOS arm64 (271 descriptor files) and in the desktop app'slanguage_server2.23.0 (484), extracted withanalyzer/tools/proto_descriptors.py extractand cited by message or enum name. - bundle: the desktop app's
Contents/Resources/app.asar(asar is Electron's archive format for an app's code), version 2.23.0, 4,486,221 bytes, sha2564e99093662d797ecba823e92823d352413e3bf2ca721257df4a255c045df1598, 738 packed files with the main-process code underdist/. Cited asapp.asar:<path>@<byte offset into the asar file>followed by a literal snippet; a reader of another version should grep for the snippet. Nothing from the bundle was executed. - live: names and sizes only under
~/.gemini/antigravity-cli,~/.gemini/configand~/.cache/antigravityon the Linux workstation where the ELF binary above was read. - observed: the macOS, Ubuntu and Windows real installs below, read for file names, sizes, key names, value types, counts and log-line templates with ids redacted only.
- docs: Antigravity CLI install, Antigravity settings, Antigravity CLI hands-on codelab; community: jazzyalex.github.io agent-sessions guide, dev.to ndondadaniel2020 restore write-up, Devilaiger/antigravity-chat-history-fix, marioalbu08/antigravity-sync, SavFil/antigravity-convo-manager, damadorPL/agent-memories (google/antigravity.md), discuss.ai.google.dev thread 167445.
The transcript schema rests on the shipped binaries (protobuf descriptors
extracted from agy and from the app's language_server), confirmed against
a real install on the author's WSL workstation (CLI), on the author's Mac
(CLI and desktop app), in the author's Ubuntu lab VM (CLI and desktop app)
and in the author's Windows 11 lab VM (CLI and desktop app), October 2026.
Extraction:
tools/proto_descriptors.py extract ~/.local/bin/agy descriptors.json, then
show on the message names of Record schema.
Observed¶
-
Windows, CLI (issue 83, issue 89 and issue 90):
agy1.3.5 (agy --version) at%LOCALAPPDATA%\agy\bin\agy.exe, onPATH, 184,062,616 B, sha256223953a7d64ad199bbeaae3cf84d634b0ec3917979c7a60feac6ade05d50888b, installed 2026-10-14T23:56:21Z in the author's Parallels lab VM, Windows 11 ARM64 build 26300 (verreports10.0.26300.9550; ARM64 is the 64-bit Arm architecture) with no WSL distribution installed, and observed the same evening (US Eastern daylight time; the UTC times below cross into 2026-10-15), read for file names, sizes, key names, value types and log lines with ids redacted only.%LOCALAPPDATA%is the per-userAppData\Localfolder,%APPDATA%the per-userAppData\Roamingfolder, and~is%USERPROFILE%,C:\Users\<user>. The executable's version resource (VersionInfo.ProductVersion, the version Windows shows in the file's properties) is empty; the embedded changelog's newest heading is## 1.3.4, with## 1.3.0to## 1.3.4present. The CLI created~/.gemini/antigravity-cli/at its first run, 00:22:29Z. Started from<home>\demo2, typed with a lower-caseusers(C:\users\<user>\demo2), it ran a coding task that wrote one source file per language into ten subdirectories and aREADME.md(00:25:07Z to 00:27:16Z), which left one conversation,conversations/<uuid>.db(983,040 B, 00:28:12Z, 38 steps,trajectory_meta.source17), and onehistory.jsonlline. The listings were taken after the tasks of both surfaces, so the mapping from task to file is by modification time only. What 1.3.5 wrote beyond 1.3.4, among it a copy of the app's conversation index, is in CLI data directory, its keyring use in Credentials and its project-path spellings in Where the project path is recorded. -
Windows, desktop app (issue 83, issue 84 and issue 91): version 2.23.1 (
main.log:Starting app (v2.23.1) with dynamic port…; the version resource ofAntigravity.exehasProductVersion2.23.1.0andFileVersion2.23.1), in the same VM, installed per user and first launched 2026-10-14T23:56:11Z (program files in Program files and install metadata). The user ran, in the app: a question with no file writes; a coding task in a project folder<home>\demo(C:\Users\sean\demo), which wrote six files there (a hello world in C, Go, JavaScript, Python and Rust, and aREADME.md, 00:01:44Z to 00:03:20Z); a research task that wrote a Markdown document to the app'sscratch/directory (00:10:29Z) and started a background task; and a task that set up a scheduled automation namedweekly-microsoft-security-bulletins(sidecar.json00:17:41Z to 00:20:16Z; Sidecar logs). The Google Docs plugingdocs0.0.6 was installed from the marketplace between 00:05:45Z and 00:08:51Z, when itstoken.jsonwas written. The four conversation databases under~/.gemini/antigravity/conversations/are 00:03:54Z (622,592 B), 00:06:55Z (589,824 B), 00:13:30Z (1,441,792 B) and 00:20:53Z (6,258,688 B), of 20, 10, 46 and 46 steps (the step counts are in the analyzer's session order, which was not matched to the file sizes), alltrajectory_meta.source1, each with abrain/<uuid>/directory, anannotations/<uuid>.pbtxtand a summaries row; the project file~/.gemini/config/projects/<uuid>.jsonis 23:59:53Z. The listings were taken after everything (00:29Z) and again after the collection (00:45Z), which showed no new file. The app wrote~/.gemini/antigravity/, files in~/.gemini/config/, the Electron user-data directory%APPDATA%\Antigravity\with itslogs\, and an empty%LOCALAPPDATA%\antigravity\staging\(23:56:15Z, before the CLI's first run), described in Per-user storage. It created no~/.gemini/antigravity-ide,~/.gemini/antigravity-backup,~/.antigravity,~/.config,~/.cacheor~/.antigravity-serverunder the profile, and no%APPDATA%\Antigravity IDE. -
Linux, CLI (issue 83, issue 89 and issue 90):
agy1.3.4 (agy --version) at~/.local/bin/agy, which is not on the non-interactivePATH, ELF aarch64, 204,492,984 bytes, sha25608d619ae3969c33b9cba5eac2a54f4566cbca1b5de68968167cb908ced5b4824, in the author's Ubuntu lab VM (Ubuntu 26.04.1 LTS, aarch64, Linux 7.0.0-38-generic), installed 2026-10-13 21:37 local time (EDT, US Eastern daylight time) and observed the same day, read for file names, sizes, key names, value types, SQLite schemas and enum values only, withfind,ls,analyzer/tools/shape.pyand a read-only schema script, all Python run withpython3 -I. The embedded changelog's newest heading is## 1.3.3. A few turns left one conversation (~/.gemini/antigravity-cli/conversations/<uuid>.db, 622,592 B, modified 21:43, 26 steps,trajectory_meta.source17 (cli) andtrajectory_type4) and a project folder the agent wrote files into,~/Antigravity/demo/, inside the app's install directory. The listings were taken after the tasks of both surfaces, so the mapping from task to file is by modification time only. What 1.3.4 writes beyond 1.2.x is in CLI data directory, and the file secret store its log names in Credentials. -
Linux, desktop app (issue 83 and issue 91): version 2.23.1 (
main.log:Starting app (v2.23.1) with dynamic port…), in the same VM, first run 2026-10-13 21:29 local time, unpacked by hand from a tarball (Program files and install metadata). The user ran a few tasks, among them a coding task and a scheduled automation, which left four conversations under~/.gemini/antigravity/conversations/(655,360 to 1,114,112 B, modified 21:45, 21:51, 21:55 and 22:00, alltrajectory_meta.source1 (cascade_client) andtrajectory_type4, of 14, 43, 30 and 38 steps, Conversation database), each with abrain/<uuid>/directory, anannotations/<uuid>.pbtxtand a summaries row; a project folder~/demo2/(21:53 to 21:54) whose project file is 21:47; the automation'ssidecar.json(21:58 to 21:59) and itssidecar_data/(22:00, Sidecar logs); the Google Docs plugin's token (21:49); and a Markdown report the agent wrote at the home root (21:59). No scheduled run fired. The app wrote~/.gemini/antigravity/(56 MB), files in~/.gemini/config/(320 KB), and the Electron user-data directory~/.config/Antigravity/(8.9 MB) with itslogs/inside it, as the bundle says (Per-user storage). It created no~/.config/antigravity(lower case),~/.antigravity,~/.antigravity-server,~/.gemini/antigravity-ideor~/.gemini/antigravity-backup. -
macOS, CLI (issue 83): two builds on the author's Mac (macOS 26.4, Darwin 25.4.0, Apple silicon, arm64).
agy1.2.16 (agy --version; the embedded changelog's newest heading is still## 1.2.15) at~/.local/bin/agy, Mach-O 64-bit arm64 (the macOS executable format), 175,966,448 bytes, sha2567dca095cfc1df2c057a385ed88a76c7ba98dc103258a80be87a8f42e484cb3aa, installed 2026-10-04, observed 2026-10-13 and read for file names, sizes, key names, value types and SQLite schemas only, withanalyzer/tools/shape.py: two conversations were on disk in~/.gemini/antigravity-cli/conversations/, each aconversations/<uuid>.dbwithtrajectory_meta.source17 (cli,CORTEX_TRAJECTORY_SOURCE_CLIin the descriptorexa.cortex_pb.CortexTrajectorySource) andtrajectory_type4, of 12 and 8 steps, each with itsbrain/<uuid>/logs (Transcript stores).agy1.3.6 (/Users/sean/.local/bin/agy, 183,407,440 bytes, sha256827ba22b4aa33557614a57aac2cc13f386e17db6b802febd3932226906ac05ab), observed 2026-10-15: one conversation of 17 steps in a project directory the agent was then told to delete. What the delete left is in What survives a delete, the mirror's line count in Brain mirror lines, and which of the fourhistory.jsonllines carryconversationIdin Joins and timestamps. -
macOS, desktop app (issue 83):
/Applications/Antigravity.app,CFBundleShortVersionStringandCFBundleVersionboth2.23.0, on the same Mac, first launched 2026-10-13 18:28 local time and observed the same day (itsapp.asaris the bundle source above, its other program files in Program files and install metadata). The user ran, in this order, a plain question-and-answer chat with no tool use, a coding task, an automation (a scheduled task the app runs as a sidecar, Shared configuration directory) and the Google Docs plugin ("gdocs", installed from the official plugin marketplace). The directory listings were taken after all four, so which conversation belongs to which task is not known, and the order below is by modification time only: the four conversation databases under~/.gemini/antigravity/conversations/, alltrajectory_meta.source1 (CORTEX_TRAJECTORY_SOURCE_CASCADE_CLIENT,cascade_client) andtrajectory_type4, are 12 steps (modified 18:37), 24 steps (18:43), 43 steps (18:50) and 31 steps (19:14), each with abrain/<uuid>/directory, anannotations/<uuid>.pbtxtand a row inconversation_summaries.db(Transcript stores); the automation'ssidecar.jsonis 18:41 to 18:42, the plugin'stoken.json18:46 and the agent's scratch document 18:47. No scheduled run fired. The app wrote~/.gemini/antigravity/(49 MB), files in the shared~/.gemini/config/, the Electron user-data directory~/Library/Application Support/Antigravity/(5.3 MB) and~/Library/Logs/Antigravity/(Per-user storage); it created no~/.gemini/antigravity-ide,~/.gemini/antigravity-backupor~/.antigravity, nothing under~/Library/Caches, and no LaunchAgent, launchd job or cron entry (~/Library/LaunchAgentshas none).
Source reviews¶
None.
Collection¶
Per-user storage¶
Everything the CLI and the app keep per user sits under ~/.gemini/; the
Go binary resolves it via os.UserHomeDir (binary) so Windows is
%USERPROFILE%\.gemini (community: Devilaiger, discuss 167445 quote
%USERPROFILE%\.gemini\antigravity-cli\brain). The app's main process
builds the same path from Node's os.homedir() (bundle,
Data directories under ~/.gemini).
os.UserConfigDir/os.UserCacheDir, XDG_CONFIG_HOME, XDG_CACHE_HOME,
APPDATA, LOCALAPPDATA also appear (binary), consistent with the
~/.cache/antigravity/staging dir (live, observed; empty) used as the
plugin "marketplace cache ... staging directories" (str changelog). On
Windows the same directory is %LOCALAPPDATA%\antigravity\staging
(observed, Windows 11 ARM64 build 26300, 2026-10-14; empty), since Go's
os.UserCacheDir() is %LOCALAPPDATA% there; the desktop app 2.23.1
created it during its first launch, before the CLI's first run. The
catalog line antigravity|AppData/Local/antigravity collects it.
Scratch directories¶
The desktop app's ~/.gemini/antigravity/scratch/<name>.md holds a Markdown
document the agent wrote during a conversation, user-level, not per
conversation (desktop app data directory);
each brain/<uuid>/scratch/ was an empty directory on every install
(brain directories). Both are collected
(Exclusions).
Program files and install metadata¶
The program files and install metadata of each install are binaries, not state, and have no catalog line (observed):
- The CLI is one executable:
~/.local/bin/agyon macOS and Linux, and%LOCALAPPDATA%\agy\bin\agy.exeon Windows (docs/cli/install; observed with CLI 1.3.5). Builds and hashes are in Observed. - macOS, app 2.23.0:
/Applications/Antigravity.app, an Electron app (Contents/Frameworks/Electron, 200,443,040 bytes) withContents/Resources/app.asar(the bundle of Source and evidence), its backendContents/Resources/bin/language_server(Mach-O arm64, 155,290,912 bytes, sha256c1dd0c9940f712adf2185e756470752d5f5afee15441e32879e4a0f127e18273) andContents/Resources/bin/webm_encoder. - Linux, app 2.23.1: downloaded as
~/Downloads/Antigravity.tar.gzand unpacked by hand to~/Antigravity/(285 MB), a binary install: the Electron binaryantigravity(220,466,568 B, sha256c543041069aa2e478235447cb636f9f09faab15003862029d226bb14b8dc655b), a setuid-rootchrome-sandbox, the Chromium libraries and resource packs,resources/app.asar(4,486,221 B, the size of the macOS 2.23.0 asar, with a different hash, sha256b8ec3628df2a12ee9deac5dc06367f238065af146bfe6298fdad6db5f9790d9c),resources/app-update.yml(keysprovider,url,updaterCacheDirName),resources/bin/language_server(181,358,800 B, sha256310ee8e0cba4c4ee05504ac8021cbd3544a79c06cc01c790536361625c5fffb3) andresources/bin/webm_encoder. It is not an AppImage (a self-contained Linux application package):main.logwarnsAPPIMAGE env is not defined, current application is not an AppImage. - Windows, app 2.23.1 (Windows 11 ARM64 build 26300, 2026-10-14): the
per-user installer was left at
%LOCALAPPDATA%\antigravity-updater\installer.exe(155,215,064 B, sha256428ad29354a12654db8be066cbce1fb307dca538b51176a584c1009cb59c3fbc, 23:55:21Z) and installed the app to%LOCALAPPDATA%\Programs\antigravity\(424 files, 574,823,898 B, 23:56:09Z):Antigravity.exe(226,382,336 B, sha25616febcd47a2a6823fe9ec4847b60f2fc766a46c8c355643185326a2879668243),Uninstall Antigravity.exe,resources\app.asar(4,486,221 B, sha256b8ec3628df2a12ee9deac5dc06367f238065af146bfe6298fdad6db5f9790d9c, byte-identical to the Linux 2.23.1 asar),resources\app.asar.unpacked\(Node modules, among themchrome-devtools-mcp),resources\app-update.yml(144 B),resources\elevate.exe(107,520 B),resources\bin\language_server.exe(160,643,584 B, sha25632d65353f033600274203137913207c02f636c214b8233c529a2afa0ee55ecf5),resources\bin\webm_encoder.exe(12,472,320 B, sha256e78f6cd6292baeb2d322cba9a5e66f2e42aed5589cba175fe4aa5dd6daea90fd) and the usual Electron and Chromium files (locales\,*.pak,icudtl.dat,ffmpeg.dll,vulkan-1.dll,d3dcompiler_47.dll,LICENSES.chromium.html). It also made a Start Menu shortcut,%APPDATA%\Microsoft\Windows\Start Menu\Programs\Antigravity.lnk, and an uninstall entry underHKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall(HKCU isHKEY_CURRENT_USER, the per-user registry hive) withDisplayNameAntigravity,DisplayVersion2.23.1and noInstallLocation. While the app ran, sixAntigravity.exeprocesses and onelanguage_server.exewere running: the same backend as on the other platforms. The catalog lineAppData/Local/antigravitynames a whole path component, so it matches neitherantigravity-updaternorPrograms\antigravity.
Data directories under ~/.gemini¶
~/.gemini/antigravity/is the desktop app's data directory on every OS. The name is the app name lower-cased without spaces (app.asar:dist/paths.js@4312548return electron_1.app.getName().toLowerCase().replace(/\s+/g, '');, insidefunction getAppDataDirName() {at @4312439;antigravity-devwhen the app runs unpackaged), joined to the home (app.asar:dist/paths.js@4312621function getAppDataDir() {...path_1.default.join(os_1.default.homedir(), '.gemini', getAppDataDirName())). The app passes the name to its backend (app.asar:dist/languageServer.js@4242293'--app_data_dir',(0, paths_1.getAppDataDirName)(),), which owns the directory, and starts the backend as subclient "hub" (app.asar:dist/languageServer.js@4241987'--subclient_type','hub',, beside'--override_ide_name', 'antigravity'and'--standalone'). Before 2.0 the IDE used the same directory,app.asar:dist/paths.js@4313608, commented "User data dir for the old IDE (source for copy)":
exports.IDE_OLD_DATA_DIR = path_1.default.join(os_1.default.homedir(), '.gemini', 'antigravity');
~/.gemini/antigravity-cli/is the CLI's (binary, live, observed on macOS, Linux and Windows).~/.gemini/antigravity-ide/is the separately installed IDE's,app.asar:dist/paths.js@4313784("User data dir for the separately installed IDE (destination for copy)"):
exports.IDE_NEW_DATA_DIR = path_1.default.join(os_1.default.homedir(), '.gemini', 'antigravity-ide');
The app's IDE install wizard copies pre-2.0 IDE data there when
antigravity-ide does not exist and antigravity does
(app.asar:dist/ideInstall/constants.js@4160197, exports.WIZARD_SHOWN_KEY
and the comment "2. ~/.gemini/antigravity-ide does NOT exist 3.
~/.gemini/antigravity DOES exist"); on the observed install main.log
records [IDE Wizard] <path> not found — user was not migrated, skipping.
Bundle-derived, not observed on any real install.
- ~/.gemini/antigravity-backup/ is the backup taken during that copy
(bundle-derived, not observed on any real install),
app.asar:dist/paths.js@4313949:
exports.IDE_BACKUP_DATA_DIR = path_1.default.join(os_1.default.homedir(), '.gemini', 'antigravity-backup');
The macOS, Linux (Ubuntu, CLI 1.3.4 and app 2.23.1) and Windows (CLI 1.3.5
and app 2.23.1) installs had .gemini/antigravity/,
.gemini/antigravity-cli/ and .gemini/config/, with the same file names
on each, and neither .gemini/antigravity-ide/ nor
.gemini/antigravity-backup/; on Windows under %USERPROFILE%\.gemini\
(the user's profile folder, the home on Windows).
Desktop app data directory¶
~/.gemini/antigravity/ (observed, macOS, app 2.23.0, 49 MB; the
Linux install of 2.23.1 had the same layout at 56 MB, with the additions
listed after the table):
| Path | Observed |
|---|---|
conversations/<uuid>.db x4 (688,128 to 1,409,024 B, no sidecar files) |
one SQLite database per conversation, the same schema as the CLI's (Record schema) |
conversation_summaries.db |
the conversation index, the CLI's table plus a full-text search table over titles, workspaces and message bodies (Summaries database) |
brain/<uuid>/ x4 |
per-conversation logs and tool output (Brain directories) |
annotations/<uuid>.pbtxt x4 (94 to 99 B) |
pbtxt is the protobuf text format, a human-readable serialisation of a protobuf message; each holds one title: field, the conversation title |
scratch/<name>.md (24,280 B) |
a Markdown document the agent wrote during a conversation; user-level, not per conversation |
plugin_data/gdocs/token.json (1,119 B, mode 0600) |
the Google Docs plugin's OAuth credential (Credentials) |
plugin_data/gdocs/bin/gdocs-<digits> (31,938,752 B) |
the plugin's binary |
bin/webm_encoder (12,699,266 B), bin/agentapi (100 B), bin/gdocs |
binaries; bin/gdocs is a symlink to ~/.gemini/config/plugins/gdocs/skills/gdocs/scripts/gdocs |
cache/marketplaces/antigravity-plugins-official/ (207,829 B) |
the plugin marketplace cache: marketplace.json (17 plugins, each with a name, version and archive URL and sha256), meta.json and plugins/gdocs/0.0.6/, a copy of the plugin the user installed |
builtin/skills/<name>/SKILL.md x8, builtin/.checksum, builtin/keep.txt |
bundled skills, the same set as antigravity-cli/builtin/ |
agyhub_summaries_proto.pb (1,436 B) |
the app's counterpart of the CLI's jetbox_summaries_proto.pb |
antigravity_state.pbtxt (850 B) |
install and onboarding state (keys installation_uuid, post_onboarding, agent_onboarding_completed, seen_nuxs (by its name, the new-user-experience tips already shown), migrate_convos_into_projects, migrate_retroactive_projects, migrations); the CLI's counterpart is jetski_state.pbtxt |
installation_id (36 B), presence/<uuid>.lock x4 (0 B), crashes/crash_<pid>_<uuid>.log (0 B) |
as in the CLI directory |
Jetski and Jetbox are internal names that appear in the CLI's file names and keyring service; the binary does not explain them.
Added on Linux (observed, app 2.23.1):
sidecar_data/<name>/(22:00):logs/sidecar.log(388 B), the scheduler log of the automation named<name>(Sidecar logs), and an emptydata/.lib/node_modules/sidecar_sdk/(5 files, 17,508 B:package.json,index.mjs,preload.js,esm_resolver.js,register_loader.js): the sidecar SDK, the JavaScript library the app installs for sidecar code; the same five files are in~/.gemini/config/node_modules/sidecar_sdk/. Code, not state, and excluded (Exclusions).brain/<uuid>/.system_generated/steps/<idx>/content.mdin one conversation (Transcript stores).conversation_summaries.db(167,936 B) with the macOS schema (Summaries database).scratch/<name>.md(675 B),plugin_data/gdocs/token.json(1,126 B, mode 0600) andplugin_data/gdocs/bin/gdocs-<digits>(36,320,890 B),bin/webm_encoder(15,860,003 B),bin/agentapi(84 B), thebin/gdocssymlink andcache/marketplaces/antigravity-plugins-official/(282,624 B) as on macOS.
On Windows (observed, app 2.23.1, Windows 11 ARM64 build 26300, 2026-10-14) the layout is the same, with these differences:
bin/holdsagentapi.bat(107 B),webm_encoder.exe(12,472,320 B) andgdocs.cmd(128 B), a.cmdlauncher where macOS and Linux have thebin/gdocssymlink.- No
sidecar_data/(Sidecar logs) and nolib/. conversations/<uuid>.dbx4 (589,824 to 6,258,688 B) andconversation_summaries.db(159,744 B), none with a-walor-shmsidecar when listed.- In the brain directories,
messages/undelivered/, a chunkedtranscript_full.jsonland a 2,682,163 Bcontent.md(Transcript stores). - Other sizes:
agyhub_summaries_proto.pb1,417 B,annotations/<uuid>.pbtxtx4 93 to 96 B,antigravity_state.pbtxt812 B,builtin/.checksum72 B,installation_id36 B,scratch/<name>.md23,305 B,plugin_data/gdocs/token.json1,122 B,plugin_data/gdocs/bin/31,200,920 B,cache/marketplaces/antigravity-plugins-official/207,829 B (marketplace.json17,664 B,meta.json48 B andplugins/gdocs/0.0.6/), andcrashes/crash_<pid>_<uuid>.logandpresence/<uuid>.lockx4 at 0 B. The running app holds the open conversation'spresence/<uuid>.locklocked against other readers.
Brain directories¶
brain/<uuid>/ (observed, app and CLI), one per conversation, holds the
step mirror (.system_generated/logs/transcript.jsonl,
transcript_full.jsonl and their chunks), the output of each tool step,
and in the app messages addressed to the conversation and background-task
logs. Its layout and sizes per platform are in
Transcript stores and its line shapes in
Record schema.
CLI data directory¶
~/.gemini/antigravity-cli/ (live, observed on macOS, with binary
literal where noted): antigravity-oauth-token (1,670 B, see
Credentials); bin/webm_encoder (17 MB on Linux);
brain/<uuid>/ (Brain directories; binary:
.system_generated/logs/transcript.jsonl, transcript_full.jsonl);
builtin/skills/<name>/, builtin/.checksum, keep.txt (bundled skills; binary also names
~/.gemini/<app-name>/builtin/sidecars/<id>/ and
builtin/plugins/<plugin>/sidecars/); cache/ with
default_project_id.txt (19 B, base64 text), last_conversations.json
(an object mapping an absolute workspace path to a conversation UUID) and
onboarding.json (three onboarding booleans) (observed), plus
cache/projects.json (binary: "stores workspace-to-project mappings in a
centralized ~/.gemini/antigravity-cli/cache/projects.json"; not present
on the macOS install).
The rest of the directory: cli.log symlink to
log/cli-<YYYYMMDD_HHMMSS>.log (binary cli.log);
conversation_summaries.db (+-wal, -shm; binary
conversation_summaries.db, ALTER TABLE conversation_summaries ...),
which has only the conversation_summaries table; conversations/<uuid>.db
(+wal/shm); crashes/ (empty); history.jsonl (binary);
implicit/<uuid>.pb; installation_id (binary);
jetbox_summaries_proto.pb (binary jetbox_summaries_pb.SummariesState);
jetski_state.pbtxt (binary; keys installation_uuid, post_onboarding,
migrations, observed); last_check.timestamp; presence/<uuid>.lock;
settings.json (docs: ~/.gemini/antigravity-cli/settings.json; binary
trustedWorkspaces tag); keybindings.json (docs/settings);
updater/{update.lock, update_status.json}; legacy hooks.json (binary:
"wrote configurations to ~/.gemini/antigravity-cli/hooks.json instead of
the shared ~/.gemini/config/hooks.json").
New in CLI 1.3.x (observed, Linux, 1.3.4): annotations/<uuid>.pbtxt
(37 B, one title: field, as in the app's directory);
cache/marketplaces/antigravity-plugins-official/ (marketplace.json
and meta.json, 32,768 B, excluded); a conversationId key on some
history.jsonl lines (Joins and timestamps); and
settings.json (156 B) with permissions {allow, an array of strings}
beside trustedWorkspaces (an array of 1 absolute path)
(Permission configuration files). The
log directory holds log/cli-<YYYYMMDD_HHMMSS>.log files (22,498 and
45,442 B) in glog format (glog is Google's logging library) with
cli.log linking to the newest; besides the secret-store line in Credentials,
they name ~/.gemini/config/config.json, ~/.gemini/extensions (Gemini
CLI's extension directory, absent on this install) and the workspace
paths.
Observed on Windows (CLI 1.3.5, Windows 11 ARM64 build 26300, 2026-10-14), against 1.3.4 on Linux:
cache/conversation_metadata.json(2,671 B), new: an entry for each of the desktop app's four conversations (Transcript stores).conversation_summaries.db(40,960 B, no sidecars) holds a row for each of the app's four conversations beside its own: CLI 1.3.5 copies the app's conversation index into its own (Summaries database).cli.log(41,122 B) is a hard link tolog/cli-20261014_202229.logon NTFS (the Windows file system), not a symlink:fsutil hardlink list(fsutilis the Windows file-system utility) names both paths, so the two names hold the same bytes.updater/update.lock(0 B) andupdater/update_status.json(59 B;messagestring,successbool).plugin_data/gdocs/, an empty directory; the plugin'stoken.jsonis in the app's directory.history.jsonl(230 B) has one line, withoutconversationId(Joins and timestamps).settings.json(172 B):permissions{allow} andtrustedWorkspaces(one absolute Windows path) (Permission configuration files).- Other files:
annotations/<uuid>.pbtxt(46 B),bin/agentapi.bat(68 B),bin/webm_encoder.exe(12,472,320 B),cache/default_project_id.txt(19 B),cache/last_conversations.json(70 B, one absolute path to a UUID),cache/marketplaces/(17,712 B),cache/onboarding.json(111 B;consumerOnboardingComplete,enterpriseOnboardingComplete,onboardingComplete, booleans),implicit/<uuid>.pb(226 B),installation_id(36 B),jetbox_summaries_proto.pb(430 B),jetski_state.pbtxt(503 B),last_check.timestamp(0 B),presence/<uuid>.lock(0 B), an emptycrashes/, and the samebuiltin/skills. There is noantigravity-oauth-token(Credentials).
Shared configuration directory¶
~/.gemini/config/, shared by the CLI and the app (binary changelog,
live names, observed 232 KB on macOS and 320 KB on Linux): mcp_config.json, hooks.json,
config.json, projects/<uuid>.json, skills/<name>/SKILL.md,
plugins/<name>/, rules/*.md, workflows/, global_workflows/,
sidecars/, GEMINI.md, AGENTS.md, skills.json, rules.json,
plugins.json, agents.json, workflows.json, .migrated. The binary
also reads ~/.gemini/GEMINI.md and ~/.gemini/AGENTS.md, and names
legacy ~/.gemini/jetski/brain and per-repo .antigravitycli workspace
dirs (both superseded). Observed on macOS:
config.json(657 B):plugins{gdocs{installedFrom{id,marketplace,version}}} anduserSettings{globalPermissionGrants{allow, an array of strings},permissionGrantsV2Migrated,remoteControlHostname,sandboxEnabledAtV2Migration}. On Linux (1,356 B, 22:00) it also hassidecars{<name>{argumentValues(null),enabled(bool),projectId(UUID),resolvedPermissions{accessGrants, an array of 2 strings},schemaVersion(number)}}, one entry per scheduled automation. On Windows (3,332 B, app 2.23.1) it haspluginsas on macOS anduserSettings{globalPermissionGrants{allow, an array of strings},remoteControlHostname}: nosidecarskey although an automation was saved, and neitherpermissionGrantsV2MigratednorsandboxEnabledAtV2Migration. The grant counts per install are in Permission configuration files.plugins/gdocs/: the installed plugin,plugin.json,README.md,skills/gdocs/SKILL.md, nine reference documents and the launcher scriptsskills/gdocs/scripts/gdocs(shell) andgdocs.cmd. On Windows:plugin.json429 B,README.md154 B,SKILL.md41,701 B,scripts/gdocs2,102 B andscripts/gdocs.cmd1,756 B.projects/<uuid>.json(283 B), written by the app when a project is created:id,isWorkspaceOnly,name,permissionGrants,projectResources{resources, an array of objects whosefolderUriis afile://URL},settings; andprojects/default-cli-project.json(84 B, from the CLI) with an emptyprojectResources. The file is pretty-printed: on Linux (293 B) thefolderUrikey is followed by a colon, two spaces and the quotedfile:///URL. Linux also had a second shape (382 B, 22:00) with no folder:id,name,permissionGrants{permissionGrants{allow, an array of 2 strings},v2Migrated}, an emptyprojectResourcesandsettings{artifactReviewMode}; by its time and its grants, the project the scheduled automation runs under (theconfig.jsonsidecarsentry has aprojectId). On Windows (243 B, app 2.23.1) the project file hasid,isWorkspaceOnly,name,projectResourcesand an emptysettings, with nopermissionGrants, and itsfolderUriisfile:///c%3A/Users/<user>/demo: a lower-case drive letter and a percent-encoded colon.default-cli-project.json(84 B) is as on macOS, and there is no folder-less automation project.sidecars/<name>/sidecar.json(725 B), the automation the user scheduled. A sidecar is the app's name for a long-running helper process that its language server supervises; the app starts the server with--enable_sidecars(app.asar:dist/languageServer.js@4242552'--enable_sidecars',). The file's keys arebuiltin("schedule", the built-in sidecar that runs an agent task on a schedule),display_name,description,args(an array of 5 strings),restart_policy("always") andagent_permissions{access_grants, an array of strings, counted in Permission configuration files}. The Linuxsidecar.json(791 B) has the same keys, and so does the Windows one,sidecars/weekly-microsoft-security-bulletins/sidecar.json(1,005 B, app 2.23.1). Nothing outside the app starts the schedule: no launchd job or cron entry on macOS; no~/.config/autostartentry, user systemd unit or crontab entry on Linux, wheresystemctl --usershowed only the running app's transientapp-antigravity-<pid>.scope; and noRunkey entry, scheduled task or Startup folder entry on Windows. So the schedule runs only while the app's language server runs. The scheduler's log, and what the Windows install wrote instead of one, are in Sidecar logs.mcp_config.jsonand.migrated, both empty (also on Windows).node_modules/sidecar_sdk/(observed, Linux, 5 files, 17,508 B): a copy of the sidecar SDK, excluded (Exclusions). Absent on Windows.
Electron user-data directory¶
Electron keeps each app's own state, Chromium's storage included, in a
per-user directory that app.getPath('userData') returns, named after the
app under the per-OS application-data root. The root is
~/Library/Application Support on macOS and %APPDATA% on Windows
(app.asar:node_modules/electron-log/src/node/NodeExternalApi.js@2235471
return path.join(home, 'Library/Application Support'); and @2235565
return process.env.APPDATA || path.join(home, 'AppData/Roaming');) and
$XDG_CONFIG_HOME or ~/.config on Linux
(Electron app API,
app.getPath('appData'), fetched 2026-10-13; the bundle snippets cover
macOS and Windows only). So the directory is
~/Library/Application Support/Antigravity (observed),
~/.config/Antigravity (observed on Linux, app 2.23.1) and
%APPDATA%\Antigravity (observed on Windows 11 ARM64 build 26300, app
2.23.1, 2026-10-14). The app stores UI state there
(app.asar:dist/paths.js@4313059 function getAppStoragePath() { ...
path_1.default.join(electron_1.app.getPath('userData'), 'app_storage.json'),
"lightweight key-value store for UI state") and a Node wrapper for plugin
scripts (app.asar:dist/utils.js@4399333 and @4399399):
const binPath = path_1.default.join(userDataPath, 'bin');
const nodeWrapperPath = path_1.default.join(binPath, os === 'win32' ? 'agy-node.cmd' : 'agy-node');
Observed on macOS (5.3 MB, created 18:28): app_storage.json (1,528 B;
string values under the keys antigravity-multi-conversation-layout-v3-<uuid>
x4 and -index, aux-pane-session, comments,
didAskForNotificationPermission, ide-install-wizard-shown,
jetski.onboarding.lastLoginIsGcpTos, jetski.onboarding.lastLoginUsername
(the signed-in account name), lastCreatedProjectId,
new-convo-last-selected-project, new-convo-magic-workspace-selected,
projectsOrder), bin/agy-node (a 152 B #!/bin/sh wrapper that runs
the bundled Antigravity Helper with ELECTRON_RUN_AS_NODE=1),
Preferences, Local State, Network Persistent State, .updaterId,
DevToolsActivePort, Cookies (SQLite, 0 rows), Local Storage/leveldb/
(16 KB), Session Storage/ (16 KB), DIPS + DIPS-wal (260 KB),
Trust Tokens, declarative_performance_observer.db, the symlinks
SingletonCookie, SingletonLock, SingletonSocket, and the Chromium
caches Cache (3.2 MB), Code Cache (52 KB), GPUCache,
DawnGraphiteCache, DawnWebGPUCache (548 KB each), Shared Dictionary
(52 KB) and blob_storage. There is no User/ and no logs/, the
subdirectories the pre-2.0 catalog lines named.
Observed on Linux (~/.config/Antigravity/, 8.9 MB, created 21:29):
app_storage.json (1,681 B; the macOS keys plus aux-pane-v2-session
and sidebar_collapsed_sections), bin/agy-node (80 B), logs/main.log
(2,128 B) and logs/language_server.log (135,703 B), Cookies
(20,480 B), Local Storage/leveldb/ (6 files, 628 B), Session Storage/
(6 files, 642 B), DIPS (36,864 B) and DIPS-wal (115,392 B),
Trust Tokens (36,864 B), declarative_performance_observer.db
(32,768 B), DevToolsActivePort, Local State (57 B;
uninstall_metrics.installation_date2), Network Persistent State
(944 B), Preferences (132 B; electron.media.device_id_salt,
spellcheck.dictionaries, spellcheck.dictionary), the Singleton*
symlinks, and the caches Cache (6,959,104 B), Code Cache
(114,688 B), GPUCache (614,400 B), DawnGraphiteCache and
DawnWebGPUCache (307,200 B each), Shared Dictionary (65,536 B),
blob_storage (8,192 B) and Crashpad/ (8,192 B; a 36 B client_id,
Crashpad being Chromium's crash reporter). New against macOS:
Dictionaries/en-US-10-1.bdic (451,968 B), the spell-check dictionary
Chromium downloads in its binary .bdic format, excluded
(Exclusions).
Observed on Windows (%APPDATA%\Antigravity\, created 23:56:11Z, app
2.23.1, Windows 11 ARM64 build 26300, 2026-10-14): app_storage.json
(1,545 B; the macOS key set, without the two Linux additions),
bin\agy-node.cmd (107 B, the Windows name the bundle predicts),
.updaterId (36 B), DevToolsActivePort (60 B), Preferences (132 B;
electron.media.device_id_salt, spellcheck.dictionaries (one string),
spellcheck.dictionary), Local State (490 B; os_crypt
{audit_enabled (bool), encrypted_key (a 380-character string)} and
uninstall_metrics {installation_date2}, see
Credentials), logs\main.log (4,751 B, 51 lines) and
logs\language_server.log (218,747 B), Network\Cookies (20,480 B) and
Cookies-journal, Network Persistent State (472 B),
NetworkDataMigrated (0 B), Network\Trust Tokens (36,864 B)
and its -journal, DIPS (4,096 B) and DIPS-wal (210,152 B),
declarative_performance_observer.db (32,768 B) and its -journal,
Local Storage\leveldb\ (000003.log 49 B, CURRENT, LOCK, LOG
251 B, MANIFEST-000001; LevelDB is the key-value store format Chromium
uses for web storage), Session Storage\ (000003.log 68 B and the
other LevelDB files), lockfile (0 B, the Windows form of the
Singleton* symlinks, which do not exist here), and the caches
Cache\Cache_Data and Cache\No_Vary_Search (9,368,215 B in all),
Code Cache (22,862 B), DawnGraphiteCache, DawnWebGPUCache and
GPUCache (557,424 B each), Shared Dictionary (45,128 B) and an empty
blob_storage\<uuid>\. There is no Crashpad\, no Dictionaries\, no
CachedData and no User\. While the app runs it holds
Network\Cookies, Cookies-journal and the LOCK files of
Local Storage\leveldb\ and Session Storage\ locked against other
readers, and keeps logs\language_server.log, DIPS-wal and the two
000003.log files open while it writes to them.
%APPDATA%\antigravity (lower case) is the same directory, as expected
on a case-insensitive filesystem, and there is no
%APPDATA%\Antigravity IDE.
Logs¶
Electron's logs directory is ~/Library/Logs/<name> on macOS
and <userData>/logs elsewhere
(app.asar:node_modules/electron-log/src/main/ElectronExternalApi.js@2216282
return this.getPath('logs') || super.getElectronLogPath(); and
app.asar:node_modules/electron-log/src/node/NodeExternalApi.js@2233256
return path.join(this.getAppUserDataPath(appName), 'logs');), and the
backend's log goes there too (app.asar:dist/paths.js@4313430
function getLsLogPath() { ...
path_1.default.join(electron_1.app.getPath('logs'), constants_1.LS_LOG_FILE_NAME);
app.asar:dist/constants.js@4136120
exports.LS_LOG_FILE_NAME = 'language_server.log';). So the logs are in
~/Library/Logs/Antigravity (observed), ~/.config/Antigravity/logs
(observed on Linux) and %APPDATA%\Antigravity\logs (observed on
Windows 11 ARM64 build 26300, app 2.23.1, 2026-10-14).
Observed on macOS: main.log (1,696 B; lines
[YYYY-MM-DD HH:MM:SS.mmm] [info] <message>, among them
Starting app (v2.23.0) with dynamic port…,
Host bridge server listening on http://127.0.0.1:<port>,
LS Logs: <path>, Electron Logs: <path>, the IDE wizard line of
Data directories under ~/.gemini,
[AutoUpdater] ... and an hourly Checking for update) and
language_server.log (160,403 B; lines in the format of glog, Google's
logging library: ERROR: logging before google.Init: I|E|W<MMDD HH:MM:SS.ffffff> ...).
The server log names ~/.gemini/config/projects/outside-of-project.json
174 times (the file does not exist),
~/.gemini/antigravity-cli/conversations/<uuid>.pb twice, and the plugin
script, the scratch document and the two bin/ entries once each.
Observed on Linux: main.log has the macOS lines with v2.23.1, plus the
AppImage warning
(Program files and install metadata)
and
Shutting down language server…; language_server.log names
~/.gemini/config/projects/outside-of-project.json 194 times (absent)
and ~/.gemini/antigravity-cli/conversations/<uuid>.pb once.
Observed on Windows: main.log (51 lines) has the
Starting app (v2.23.1) with dynamic port… line and, beyond the
templates above (digits and ids redacted):
Generated new staging user ID: <uuid>,
Host bridge server listening on http://127.0.0.1:<port>,
[Auto-Restart] Port changed! Reloading all windows with URL: https://127.0.0.1:<port>/,
Local: https://127.0.0.1:<port>/,
LS Logs: <home>\AppData\Roaming\Antigravity\logs\language_server.log,
Electron Logs: <home>\AppData\Roaming\Antigravity\logs\main.log,
[IDE Wizard] <home>\.gemini\antigravity not found — user was not migrated, skipping.,
Update for version 2.23.1 is not available (latest version: 2.23.1, downgrade is allowed).,
[AutoUpdater] Up to date (2.23.1), and three WSL errors (see
WSL). The sidecar lines of language_server.log are in
Sidecar logs.
macOS preferences file¶
~/Library/Preferences/com.google.antigravity.plist (916 B, observed)
holds only AppKit window and panel keys (AppleTextDirection,
NSForceRightToLeftWritingDirection, NSNavPanelExpandedSizeForOpenMode,
NSOSPLastRootDirectory, NSTreatUnknownArgumentsAsOpen) and has no
catalog line.
Antigravity IDE¶
The IDE (community, consistent across four sources):
~/.gemini/antigravity-ide/ with conversations/<uuid>.db,
brain/<uuid>/ (Markdown artifacts task.md, implementation_plan.md,
walkthrough.md, each with .metadata.json, plus
.system_generated/logs/transcript.jsonl),
knowledge/<ki-id>/{metadata.json, artifacts/}, knowledge.lock
(damadorPL); docs/settings calls ~/.gemini/antigravity-ide/ the "local
app data directory". The upgrade leftover ~/.gemini/antigravity-backup/brain
is reported by jazzyalex, and matches the bundle's backup directory. The
IDE's VS Code-fork app directory is named Antigravity IDE:
%APPDATA%\Antigravity IDE\User\globalStorage\state.vscdb (Devilaiger,
marioalbu08), ~/.config/Antigravity IDE/User/globalStorage/state.vscdb
(dev.to); macOS by convention ~/Library/Application Support/Antigravity IDE.
The IDE installs its program to /Applications/Antigravity IDE.app,
%LOCALAPPDATA%\Programs\Antigravity IDE\ and
~/.local/share/antigravity-ide (app.asar:dist/ideInstall/constants.js@4162112
function getIdeInstallPath() { with '/Applications/Antigravity IDE.app',
'Programs', 'Antigravity IDE', 'Antigravity IDE.exe' and
path.join(os.homedir(), '.local', 'share', 'antigravity-ide')); those are
binaries, not state, and have no catalog line.
WSL¶
On Windows the app can run its language server inside a WSL
(Windows Subsystem for Linux) distribution, installed at
~/.antigravity-server/bin/<version>/ in the Linux home
(app.asar:dist/wsl.js@4411665
return `$HOME/.antigravity-server/bin/${version}`;; bundle-derived,
not observed on any real install). The directory holds the server binary;
where that server keeps conversations is not determined. The Windows
install (app 2.23.1, Windows 11 ARM64 build 26300, 2026-10-14, no WSL
distribution installed) shows the app listing WSL distributions at
start-up and for a "connect" menu: main.log has twice
[error] Failed to list WSL distros: Error: wsl.exe --list --verbose failed: Command failed: C:\WINDOWS\System32\wsl.exe --list --verbose
with the OS text "The Windows Subsystem for Linux is not installed. You
can install by running 'wsl.exe --install'", from dist\wsl.js
(execWsl, listWslDistros), and once [error] wsl:get-state failed: ...
from dist\menu.js (addWslConnectMenu, wslConnectMenuTemplate) and
dist\ipcHandlers.js. The directory inside a distribution remains
unobserved.
System-level settings and environment variables¶
Enterprise admin_settings.json is system-level: /etc/antigravity/,
/Library/Application Support/Antigravity/, ...\Antigravity\ (binary).
Relocation env vars: none found for the home dir. ANTIGRAVITY_EXECUTABLE_DATA_DIR,
AGY_ACCOUNT, AGY_ADC_AUTH, ANTIGRAVITY_PROJECT_ID,
ANTIGRAVITY_CONVERSATION_ID exist (binary) but their effect on paths is
unknown.
Credentials¶
- Keyring first:
zalando/go-keyringwith Secret Service, service namejetski-standalone-oauth-token(binary); docs/cli/install: Apple Keychain, Linux Secret Service, Windows Credential Manager. File fallback when the keyring is "bypassed or unreachable" (binary changelog) is~/.gemini/antigravity-cli/antigravity-oauth-token(live, 1,670 B; the whole literal is not in the strings, so the name is assembled at runtime). Flagged by*.gemini/antigravity-cli/antigravity-oauth-token. The app's~/.gemini/antigravity/held no token file on the macOS install (observed). - On Windows the keyring is the Windows Credential Manager (observed, CLI
1.3.5, Windows 11 ARM64 build 26300, 2026-10-14).
cli.loghasauth.go:NNN] ChainedAuth: authenticated via keyring (effective: keyring)andkeyring.go:NN] keyringAuth: loaded token, expiry=<date> expired=false, and noUsing file-based secret storageline; there is noantigravity-oauth-tokenfile and noplugin-secrets.jsonanywhere under the profile (searched by name). An ASCII search over the 1.3.5 binary finds the literalsplugin-secrets.json,Using file-based secret storage,wincredandCredWrite, the last two the Go keyring's Windows backend and the Windows API call that writes a credential.cmdkey /list(the Windows command that lists Credential Manager entries), run from an SSH (remote shell) session, which is a different logon session, listed no entries, so the entry's name is not determined. plugin_data/<plugin>/token.jsonunder a.geminidata directory: the Google Docs plugin's OAuth credential (observed,~/.gemini/antigravity/plugin_data/gdocs/token.json, 1,119 B on macOS and 1,126 B on Linux, both mode 0600, and 1,122 B on Windows, app 2.23.1), its keys in Secrets.*.gemini/antigravity*/plugin_data/*/token.jsonflags it in every.gemini/antigravity*directory (issue 84).plugin-secrets.json, the CLI's file store for plugin secrets when no OS keychain is usable (issue 90). Each CLI 1.3.4 log on Linux has two lines (observed, home redacted)
I<MMDD HH:MM:SS.ffffff> <n> auth_store.go:136] Using file-based secret storage at ~/.config/antigravity/plugin-secrets.json
and the binary carries the literal
plugin-secrets.json beside keychain get %s: %w and
keychain set %s: %w (observed, agy 1.3.4 linux-arm64, sha256 in
Source and evidence). The file did not exist on
the install, since nothing was authorised from the CLI, and neither did
~/.config/antigravity. The lower-case directory under ~/.config is
Go's os.UserConfigDir() on Linux; the macOS and Windows paths,
~/Library/Application Support/antigravity/plugin-secrets.json and
%APPDATA%\antigravity\plugin-secrets.json, are inferred from
os.UserConfigDir(), not observed; the Windows install of CLI 1.3.5
used the Credential Manager and wrote no such file, though its binary
carries the literal. On those case-insensitive
filesystems the directory is the app's Electron user-data directory
when that exists. The three paths are catalog entries, and
.config/[Aa]ntigravity/plugin-secrets.json,
Library/Application Support/[Aa]ntigravity/plugin-secrets.json and
AppData/Roaming/[Aa]ntigravity/plugin-secrets.json flag them. The
class accepts either case because whichever product creates the
directory first fixes its spelling.
- GEMINI_API_KEY with modelProvider: "gemini" in settings.json
(binary changelog; docs/cli/install); the key is env-only.
- ~/.gemini/config/mcp_config.json can embed MCP env and headers
(binary McpStdioTransport.EnvEntry, McpHttpTransport.HeadersEntry), so
.gemini/config/mcp_config.json flags it.
- The Electron user-data directory's Cookies (SQLite, 0 rows on the
macOS install, 20,480 B on Linux and Windows, where it is
Network\Cookies), Trust Tokens (Chromium's store for
the Private State Tokens web API, 36,864 B on Linux and Windows) with their
-journal files, and Local Storage/leveldb/ (16 KB on macOS, 628 B on
Linux, contents not read) are collected unflagged; whether any of them
can hold a credential is not determined. The running app holds
Network\Cookies and its journal locked on Windows
(Electron user-data directory).
- Local State on Windows (490 B) has os_crypt.encrypted_key, a
380-character string: Chromium's key for the cookie store, wrapped with
DPAPI (the Windows Data Protection API, the per-user encryption the OS
provides). macOS keeps that key in the Keychain and Linux in the
Secret Service, so Local State holds key material on Windows only
(the Linux file is 57 B with only uninstall_metrics). It
is collected unflagged: the rest of the file is install metadata, and
the key is useless without the user's DPAPI context. Treat
encrypted_key as a key to redact before sharing, as
Credentials in claude-desktop.md
treats Claude Desktop's metadata_secret, not as a secret glob.
app_storage.json holds the signed-in account name
(jetski.onboarding.lastLoginUsername), which identifies the user but
is not a credential.
- IDE state.vscdb holds the conversation index
(antigravityUnifiedStateSync.trajectorySummaries, Devilaiger) and, as a
VS Code fork, probably auth state; collect unflagged.
Exclusions¶
Sizes are from the macOS install (observed) unless noted; the Linux install's are given where they were recorded.
.gemini/antigravity/bin,.gemini/antigravity-cli/bin,.gemini/antigravity-ide/bin,.gemini/antigravity-backup/bin: the encoder and launcher binaries (app 12,699,366 B in 2 files; CLI 12,787,712 B on macOS, 17 MB on Linux; on the Linux install of CLI 1.3.4 and app 2.23.1, 15,872,000 B and 15,876,096 B; on the Windows install of CLI 1.3.5 and app 2.23.1, 12,472,388 B and 12,472,555 B). One line per directory rather than.gemini/antigravity*/bin, because*in an exclusion crosses/and that form would also prune anybindirectory the agent writes underbrain/<uuid>/..gemini/antigravity*/plugin_data/*/bin: plugin binaries (the Google Docs plugin's, 31,938,752 B; 36,327,424 B on Linux; 31,200,920 B on Windows). The plugin'stoken.jsonbeside it stays collected..gemini/antigravity*/cache/marketplaces: the plugin marketplace cache (16 files, 207,829 B; on Linux 282,624 B in the app's directory and 32,768 B in the CLI's, which has one from 1.3.x; on Windows 207,829 B and 17,712 B), a copy of the marketplace index and of each downloaded plugin; the installed copy is in~/.gemini/config/plugins/. The rest ofcache/is collected..gemini/antigravity*/brain/*/.system_generated/worktrees(git worktrees of the project, binary)..gemini/antigravity*/lib/node_modulesand.gemini/config/node_modules: the sidecar SDK the app installs twice (observed on Linux, 5 files and 17,508 B in each), code rather than state. The*crosses/, so the first also prunes alib/node_modulesan agent writes underbrain/, which is a dependency tree as well.- The Chromium caches in the Electron user-data directory:
*/Antigravity/Code Cache,*/Antigravity/GPUCache,*/Antigravity/DawnGraphiteCache,*/Antigravity/DawnWebGPUCache,*/Antigravity/blob_storage,*/Antigravity/Shared Dictionary,*/Antigravity/CachedData,*/Antigravity/Crashpad(observed:Code Cache52 KB,GPUCache,DawnGraphiteCacheandDawnWebGPUCache548 KB each,Shared Dictionary52 KB;CachedDataandCrashpaddid not exist on macOS; on LinuxCode Cache114,688 B,GPUCache614,400 B,DawnGraphiteCacheandDawnWebGPUCache307,200 B each,Shared Dictionary65,536 B,blob_storage8,192 B,Crashpad8,192 B),*/Antigravity/Dictionaries(the spell-check dictionary, 451,968 B on Linux), andCache(3.2 MB; 6,959,104 B on Linux) as.config/Antigravity/Cache,Library/Application Support/Antigravity/CacheandAppData/Roaming/Antigravity/Cache.Cacheis named under each base because the PowerShell collector matches without regard to case, and*/Antigravity/Cachewould also prune.gemini/antigravity/cache. None of the other patterns matches the data directories' lower-casecache,crashesorbin. On Windows (observed, app 2.23.1) the set isCache9,368,215 B,Code Cache22,862 B,DawnGraphiteCache,DawnWebGPUCacheandGPUCache557,424 B each,Shared Dictionary45,128 B andblob_storage0 B; there is noCrashpad,DictionariesorCachedData. AppData/Local/agy(CLI install;bin\agy.exe184,062,616 B on Windows) and.antigravity/extensions..cache/antigravity(the marketplace staging directory) and its Windows formAppData/Local/antigravityare collected; they were empty on every install checked.Antigravity IDEElectron caches (Cache,CachedData,GPUCache,Code Cache, by VS Code convention) are outside the collectedUserandlogssubdirectories.
Kept: .system_generated/subagents (sub-conversation data), scratch/,
builtin/ (bundled skills, 176 KB in the CLI directory) and the Electron
Local Storage/, Session Storage/ and DIPS.
Project-local files¶
.agents/ workspace customizations (.agents/agents/, binary changelog;
damadorPL <project-root>\.agents\), .antigravityignore (binary),
.antigravity-plugin (binary), legacy .antigravitycli/ (binary, removed
in favour of cache/projects.json). No per-project database.
Where the project path is recorded¶
history.jsonl:workspaceper prompt (CLI only; the app writes nohistory.jsonl), see Transcript stores. On Windows it is the folder as the user typed it, with a lower-caseusers(C:\users\<user>\demo2, observed, CLI 1.3.5).settings.json:trustedWorkspacesarray (binary json tag; docs/settings).cache/projects.json: workspace to project map (binary changelog).history.jsonlalso carriesconversationIdon some lines from CLI 1.3.x (observed), which joins a prompt to its conversation (Joins and timestamps). The collectors read onlyworkspace.config/projects/<uuid>.json:projectResources.resources[].folderUri, afile://URL of the project folder (observed on macOS, Linux and Windows, written by the app; the folder-less shape in Shared configuration directory has none).Find-Projectsin the PowerShell collector anddiscover_projectsin the sh collector read these URLs. JSON tags present in the binary:workspace_uris,workspace_paths,workspace_uri,project_id,display_name,cwd.antigravity-cli/cache/last_conversations.json: an object whose keys are absolute workspace paths (observed). Not read by the collectors.- On Windows
trustedWorkspaces, thehistory.jsonlworkspaceand thelast_conversations.jsonkeys are Windows paths (C:\...), which the sh collector does not use for discovery (see which paths are used incollectors/docs/coverage.md). - The Windows install (observed, CLI 1.3.5 and app 2.23.1, 2026-10-14)
recorded its two project folders in three spellings:
file:///c%3A/Users/<user>/demoin the app'sfile:URIs, as the project file'sfolderUrirecords it (a percent-encoded colon and a lower-case drive letter); afile:URI ofC:/users/<user>/demo2in the CLI conversation'sconversation_summaries.workspace_uris; and the plain pathC:\users\<user>\demo2in thehistory.jsonlworkspace. The lower-caseusersis how the user typed the CLI's working folder. How the parser turns them into paths is in Joins and timestamps. conversation_summaries.db(workspace_uriscolumn) and the per-conversation*.db: SQLite only, read by the analyzer.
Parsing¶
Transcript stores¶
Conversations can be in any of the four data directories of
Data directories under ~/.gemini:
.gemini/antigravity-cli/ (the CLI), .gemini/antigravity/ (the desktop
app 2.x, and the IDE before 2.0), .gemini/antigravity-ide/ and
.gemini/antigravity-backup/. Only the first two were present on the
macOS, Linux and Windows installs (observed); the IDE's two are
bundle-derived, not observed on any real install.
Stores in each data directory (<dir> is one of the four above):
| Path | Content |
|---|---|
<dir>/conversations/<uuid>.db (+-wal, -shm) |
one SQLite database per conversation, WAL mode; the app's four had no sidecars when listed on macOS or Linux, nor did the app's four and the CLI's one on Windows (observed) |
<dir>/conversation_summaries.db |
one row per conversation; the app's copy adds a full-text search table, and the CLI 1.3.5 copy on Windows also held a row for each of the app's conversations (Summaries database) |
.gemini/antigravity-cli/history.jsonl |
{display, timestamp (ms), workspace} per prompt; CLI only, the app writes none (observed). From CLI 1.3.x some lines add conversationId, the conversation's UUID (observed, CLI 1.3.4 on Linux and 1.3.6 on macOS); which lines carry it is in Joins and timestamps |
.gemini/antigravity-cli/cache/conversation_metadata.json |
CLI 1.3.5 (observed, Windows, 2,671 B; not seen on macOS with 1.2.16 or Linux with 1.3.4): conversations {<uuid>: {is_internal (bool), last_modified_time (ISO 8601 date), summary {AgentName (empty string), AppDataDir (11 characters), GroupID (empty string), ID (UUID), Internal (bool), Loaded (bool), NumSteps (number), Preview (string), ProjectID (18 characters), Title (string), UpdatedAt (ISO 8601 date), WorkspaceURIs (null)}}}; its four entries were the desktop app's four conversations, and an 11-character AppDataDir is antigravity, the app's data directory. The parser does not read it |
.gemini/antigravity-cli/cache/last_conversations.json |
{<absolute path>: <uuid>} (observed, Windows, 70 B): by its name, the last conversation per working folder; the parser does not read it |
.gemini/antigravity-cli/jetbox_summaries_proto.pb |
jetbox_summaries_pb.SummariesState, same summaries as the database; the app's counterpart is .gemini/antigravity/agyhub_summaries_proto.pb (1,436 B, observed; 1,417 B on Windows) |
<dir>/annotations/<uuid>.pbtxt |
seen in the app's directory (observed, 94-99 B each on macOS, 93-101 B on Linux, 93-96 B on Windows) and, from CLI 1.3.x, in the CLI's (observed, Linux, 37 B; Windows, 46 B): pbtxt (Desktop app data directory), field: value lines, with a single title: field, the conversation title |
<dir>/brain/<uuid>/ |
per-conversation artifacts and logs, in the next table |
.gemini/antigravity-cli/antigravity-oauth-token |
credential, flagged secret by the collector; absent on the Windows install, where the CLI kept its token in the OS keyring (Credentials) |
.gemini/antigravity/plugin_data/<plugin>/token.json |
a plugin's OAuth credential (Secrets) |
<dir>/bin/ |
binaries, excluded |
.gemini/antigravity/sidecar_data/<name>/logs/sidecar.log, sidecar_data/<name>/data/ |
the scheduler log of the sidecar <name> and an empty data/ directory (observed, Linux; absent on Windows; Sidecar logs) |
The brain directory, <dir>/brain/<uuid>/, has the same layout for the CLI
and the app (observed, macOS, Linux and Windows):
| Path | Content |
|---|---|
.system_generated/logs/transcript.jsonl |
one JSON line per step, long fields shortened (17,832 to 155,131 B on the app; on Windows 12,720, 17,119, 56,481 and 55,052 B for the app's four conversations) |
.system_generated/logs/transcript_full.jsonl |
the same lines with nothing shortened (on Windows 12,357, 17,053, 163,340 and 63,094 B for the same four) |
.system_generated/logs/chunks/transcript/0000000N.jsonl, chunks/transcript_full/0000000N.jsonl |
the same lines split into chunks of about 100 KB; a line can be cut at a chunk boundary (one macOS app conversation had two transcript_full chunks, sizes not recorded, and shape.py counted one bad line in each). On Windows the 163,340 B transcript_full.jsonl was split into chunks/transcript_full/00000000.jsonl of 102,400 B (exactly 100 KiB) and 00000001.jsonl of 60,940 B |
.system_generated/steps/<idx>/output.txt |
the output of each tool step (10 to 4,426 B on macOS, 9 to 8,248 B on Linux) |
.system_generated/steps/<idx>/content.md |
Markdown beside that step's output.txt (observed, Linux: one file of 24,820 B, step 20 of the 30-step app conversation; Windows: one of 2,682,163 B beside a 336 B output.txt, step 26 of the app conversation that, by modification time, set up the automation); not seen on macOS |
.system_generated/messages/<uuid>.json, messages/read.json |
app only, seen in a 43-step conversation on each platform: three messages addressed to the conversation on macOS, two of them tied to a run_command tool call; two on Linux, one of them tied to run_command; two on Windows (1,400 and 2,010 B, with an 89 B read.json), in the conversation that by modification time was the research task; keys in Brain message files |
.system_generated/messages/undelivered/ |
an empty directory in that Windows conversation (observed, Windows only); by its name, messages not yet delivered to the conversation |
.system_generated/tasks/task-<idx>.log |
app only, same conversations: plain-text output of a background task started by step <idx> (two on macOS; one on Linux, task-10.log, 996 B; one on Windows, task-7.log, 988 B); the CLI's brain directories have no messages/ or tasks/ |
.system_generated/worktrees, .system_generated/subagents |
named by the binary (binary): git worktrees of the project, excluded, and sub-conversation data, kept (Exclusions) |
scratch/, .user_uploaded/ |
empty directories on every install so far |
What survives a delete¶
What Antigravity's own delete of a conversation removes, in the CLI or the
app, is not stated: no real install has deleted one, and whether the app
removes the conversation database before the brain directory is not
observed. Deleting the project directory removes none of it: on the macOS
CLI 1.3.6 install of 2026-10-15 the conversation database, its
brain/<uuid>/ mirror, the history.jsonl lines and the summaries row
stayed in place, and the whole session parsed after the directory was gone
(Observed).
The per-prompt history file, .gemini/antigravity-cli/history.jsonl, is the
CLI's alone: each line has the prompt, its time in milliseconds and the
workspace, and from CLI 1.3.x some lines also the conversation id. The
second copies are the brain mirror (transcript_full.jsonl,
transcript.jsonl and their chunks), which survives what the database
survives and is lost with the data directory; the summaries database with
the app's full-text search table; the protobuf summaries files; the title in
annotations/<uuid>.pbtxt; and, on the CLI 1.3.5 install, the CLI's summary
rows and cache/conversation_metadata.json entries for the app's
conversations (Summaries database). Whether a compaction or a
rewind rewrites the mirror is not observed, and no deletion marker is
stated. The analyzer reads history.jsonl and the brain mirror as secondary
sources and each summaries row as its own conversation summary row, and
does not read the annotations, the protobuf summaries, the full-text search
table or the CLI's cache (see
Secondary sources).
The mirror sits under brain/<uuid>/, beside conversations/<uuid>.db in
the same data directory. It is a second copy when the database alone is
lost, damaged or excluded: a database whose steps no longer decode, a
-wal sidecar the collection missed, a database file the collector skipped
for size, or a conversation the user deleted if the app removes the
database before the brain directory (not observed). The chunked copies
keep the transcript when transcript_full.jsonl itself was skipped for
size.
Record schema¶
Conversation database¶
CREATE TABLE trajectory_meta (trajectory_id text, cascade_id text, trajectory_type integer, source integer, PRIMARY KEY (trajectory_id));
CREATE TABLE steps (idx integer, step_type integer, status integer, has_subtrajectory numeric, metadata blob, error_details blob,
permissions blob, task_details blob, render_info blob, step_payload blob, step_format integer, PRIMARY KEY (idx));
CREATE TABLE gen_metadata (idx integer, data blob, size integer, PRIMARY KEY (idx));
CREATE TABLE executor_metadata (idx integer, data blob, PRIMARY KEY (idx));
CREATE TABLE parent_references (idx integer, data blob, PRIMARY KEY (idx));
CREATE TABLE trajectory_metadata_blob (id text DEFAULT "main", data blob, PRIMARY KEY (id));
CREATE TABLE battle_mode_infos (idx integer, data blob, PRIMARY KEY (idx));
The desktop app's databases have the identical schema (observed).
The tables mirror gemini_coder.Trajectory: steps (field 2),
generator_metadata (3), trajectory_type (4), parent_references (5),
cascade_id (6), metadata (7), source (8), executor_metadatas (9),
battle_mode_infos (10). cascade_id equals the conversation id and the
file name. source is a CortexTrajectorySource (Joins and timestamps);
trajectory_type 4 is CORTEX_TRAJECTORY_TYPE_CASCADE.
steps.step_payload is a serialized gemini_coder.Step:
| Field | Name | Type |
|---|---|---|
| 1 | type |
exa.cortex_pb.CortexStepType (14 USER_INPUT, 15 PLANNER_RESPONSE, 132 GENERIC, 2 FINISH, 23 CHECKPOINT, 28 COMMAND_STATUS, 17 ERROR_MESSAGE, 101 SYSTEM_MESSAGE, ...) |
| 4 | status |
CortexStepStatus (1 PENDING, 2 RUNNING, 3 DONE, 6 CANCELED, 7 ERROR, 9 WAITING, 12 INTERRUPTED) |
| 5 | metadata |
CortexStepMetadata |
| 7..159 | oneof step |
one message per step kind, field numbers in the parser's SCHEMA["Step"]; a protobuf oneof is a group of fields of which at most one is set, so the field present names the step kind |
| 133 | permissions |
exa.cortex_pb.TrajectoryPermissions, also stored in the steps.permissions column |
| 148 | task_details |
gemini_coder.TaskDetails, also stored in the steps.task_details column |
steps.metadata duplicates field 5. CortexStepMetadata: 1 created_at,
3 source (CortexStepSource: 2 MODEL, 3 USER_IMPLICIT, 4 USER_EXPLICIT,
5 SYSTEM), 4 tool_call (ChatToolCall: 1 id, 2 name, 3
arguments_json, 9 original_name), 7 finished_generating_at, 8
completed_at, 11 generator_model (enum), 12 execution_id, 20
source_trajectory_step_info, 26 internal_metadata.status_transitions,
30 tool_summary, 31 tool_action, 32 started_at. All timestamps are
google.protobuf.Timestamp (seconds, nanos).
Step kinds seen on a real install: user_input (19: 1 query, 2
user_response, 12 user_config), planner_response (20: 1 response,
3 thinking, 6 message_id, 7 tool_calls[], 12 stop_reason, 16
raw_thinking) and generic (140: 1 args[] key/value, 2 result
with 1 result text and 6 payload as google.protobuf.Any holding the
typed tool step, here view_file). The desktop app's conversations
(observed, macOS) also have system_message (step type 101, payload
field 114: 1 message, 3 event_type) and error_message (step type 17,
payload field 24: 3 error as CortexErrorDetails with 1
user_error_message, 2 short_error, 3 full_error). Counts across the
app's four conversations (110 steps): 7 user_input (14), 51
planner_response (15), 44 generic (132), 3 system_message (101, all
in the 43-step conversation) and 5 error_message (17, all in the 31-step
conversation). Every step had status 3 (DONE), has_subtrajectory 0 and
step_format 0. steps.permissions was set on 10 tool steps (52 to 1,174
B) and steps.task_details on 2 (239 and 764 B); error_details and
render_info were empty.
Step kinds other than user_input, planner_response, generic,
system_message and error_message are decoded from the descriptors but
have not been seen in real data.
The Linux installs (observed, CLI 1.3.4 and app 2.23.1) showed the
same three common kinds and system_message, and no error_message. The
app's four conversations (125 steps): 14 steps (2 user_input, 7
planner_response, 6 generic; permissions on none), 43 steps (1, 21,
19 and 2 system_message; permissions on 6, task_details on 1), 30
steps (1, 15, 13; permissions on 4) and 38 steps (1, 19, 18;
permissions on 9). The CLI's one conversation: 26 steps (2, 13, 11),
permissions on 9. In all five, gen_metadata had one row per planner
step (7, 21, 15, 19 and 13). The parser reads permissions (next) and not
task_details.
steps.permissions holds an exa.cortex_pb.TrajectoryPermissions, the
same message as gemini_coder.Step field 133, recording what the user
allowed or denied for that step's tool call. Its fields, from the
descriptors (third_party/jetski/cortex_pb/cortex.proto, identical in
agy 1.2.16 and language_server 2.23.0, macOS arm64):
| Message | Field | Name | Type |
|---|---|---|---|
TrajectoryPermissions |
1 | file_access_permissions[] |
FileAccessPermission |
TrajectoryPermissions |
2 | permission_grants[] |
PermissionGrant |
PermissionGrant |
1 | resource |
PermissionResource (1 action, 2 target, both string) |
PermissionGrant |
2 | allow |
bool |
PermissionGrant |
3 | scope |
PermissionScope |
PermissionGrant |
4 | user_deny_instruction |
string |
PermissionGrant |
5 | action |
string |
PermissionGrant |
6 | target |
string |
FileAccessPermission |
1 | path |
string |
FileAccessPermission |
2 | is_directory |
bool |
FileAccessPermission |
3 | allow |
bool |
FileAccessPermission |
4 | scope |
PermissionScope |
FileAccessPermission |
5 | from_current_step |
bool |
exa.cortex_pb.PermissionScope, how long a grant holds (each name prefixed
PERMISSION_SCOPE_): 0 UNSPECIFIED, 1 ONCE, 2 CONVERSATION, 3
WORKSPACE, 4 GLOBAL, 5 PROJECT. Protobuf 3 does not write a false
bool or a zero enum, so a grant with no allow is a denial and one with
no scope is UNSPECIFIED. The column was set on 10 tool steps of the
macOS app's conversations (52 to 1,174 B) and on 28 Ubuntu steps (0, 6, 4
and 9 in the app's four conversations, 9 in the CLI's one; observed);
which scope values and which action strings occur was not read. On
Windows (observed, CLI 1.3.5 and app 2.23.1) the parser yielded 50
permission grant rows across the five conversations, three of them for
PowerShell Get-ChildItem commands; their scopes were not recorded. The
same five conversations made 72 tool calls: run_command 36,
write_to_file 21, view_file 8, search_web 3, ask_question 3 and
read_url_content 1.
The tool executed by a step is in its metadata.tool_call; its id
matches the tool_calls[].id proposed by the preceding planner step. Tool
payload messages the parser understands: run_command (1 command, 2
cwd, 6 exit_code, 21 combined_output, 23 command_line, 14
user_rejected), command_status, shell_exec, view_file (1
absolute_path_uri), list_directory, grep_search, find,
write_to_file (1 target_file_uri, 4 file_created), file_change,
code_action (1 action_spec with command.file, create_file.path,
delete_file.path, sed.path as PathScopeItem 5 absolute_uri),
read_url_content, search_web, mcp_tool (1 server_name, 2
tool_call, 3 result_string), agency_tool_call, invoke_subagent (5
conversation_id, 10 results[].conversation_id), ask_question,
checkpoint, system_message, ephemeral_message, task_boundary,
notify_user, error_message, finish, memory, directory_rules,
conversation_history, send_command_input.
The paths inside action_spec sit at different field numbers per action:
ActionSpecCommand 4 file, ActionSpecCreateFile 2 path,
ActionSpecDeleteFile 1 path and ActionSpecSed 3 path, each a
PathScopeItem (descriptors of agy 1.2.16 and language_server 2.23.0,
macOS arm64), so delete_file does not share the create_file layout:
its path is field 1, not 2 (issue 88). No
code_action step has been seen in real data.
gen_metadata.data is CortexStepGeneratorMetadata: 1 chat_model
(ChatModelMetadata: 19 response_model such as gemini-3.8-flash, 21
model_display_name, 1 system_prompt, 2 message_prompts[]), 2
step_indices[] (packed). This is the only place the model name appears.
The app's databases have one gen_metadata row per planner step
(observed); executor_metadata had 1-3 rows, parent_references and
battle_mode_infos none, and trajectory_metadata_blob one row of 618-698
B.
Three tool-payload fields carry permission evidence
(issue 97), all bool and identical in the
agy 1.2.16 and language_server 2.23.0 descriptors (macOS arm64): CortexStepRunCommand 14
user_rejected and 34 ran_in_sandbox, and CortexStepMcpTool 7 user_rejected. None of the
three has been seen set in real data, since every observed tool step was a
generic step whose typed payload sits in a google.protobuf.Any the
parser does not unpack.
trajectory_metadata_blob.data is CortexTrajectoryMetadata: 1
workspaces[] (CortexWorkspaceMetadata: 1 workspace_folder_absolute_uri,
2 git_root_absolute_uri, 4 branch_name), 2 created_at, 5
parent_conversation_id, 6 root_conversation_id, 7 workspace_uris[],
17 nesting_depth, 18 project_id.
Brain mirror lines¶
Brain JSONL line shapes (both transcript.jsonl and
transcript_full.jsonl, app and CLI, observed): every line has
content, created_at, source, status, step_index and type, where
type is USER_INPUT, PLANNER_RESPONSE, GENERIC, SYSTEM_MESSAGE or
ERROR_MESSAGE. PLANNER_RESPONSE lines add thinking, tool_calls,
input_tokens, output_tokens and cache_read_tokens; ERROR_MESSAGE
lines add error; in transcript.jsonl (not _full) long GENERIC and
PLANNER_RESPONSE lines add truncated_fields. On Linux (CLI 1.3.4 and app
2.23.1, observed) every GENERIC line also has an error key, which on
macOS appeared only on ERROR_MESSAGE lines. The line count equals the
conversation database's step count; the Linux app's four transcripts had
14, 30, 38 and 43 lines and no bad line; the macOS CLI 1.3.6 conversation of
2026-10-15 had 16 transcript_full.jsonl lines for 17 database steps
(Observed), so the mirror can lag the database by
a step. The token counts appear nowhere the parser reads.
The value forms come from a format description the backend embeds for its
own agent, which is told to read past conversations from these files
(agy 1.3.6 macOS arm64, the binary of Observed,
sha256 827ba22b4aa33557614a57aac2cc13f386e17db6b802febd3932226906ac05ab,
read with strings and grep -b, never run):
agy 1.3.6 darwin-arm64 @54350700Transcripts are in JSON Lines (JSONL) format., one JSON object per step.@54350936`source`: The source of the action (e.g., `USER_EXPLICIT`, `MODEL`, `SYSTEM`).: the names ofexa.cortex_pb.CortexStepSourcewithout theCORTEX_STEP_SOURCE_prefix. The enum also hasCORTEX_STEP_SOURCE_USER_IMPLICIT(@52896931), the source of a prompt the backend injected rather than one the user typed, which the database reader turns into asystemrow; that a mirror line spells itUSER_IMPLICITis inferred from the other three names, not observed.@54351208`status`: The status of the step (e.g., `DONE`, `ERROR`).:CortexStepStatusnames without their prefix, the database'sSTEP_STATUSvalues upper-cased.@54351268`created_at`: The ISO 8601 timestamp of when the step occurred.: one time per line. The database step hascreated_atandcompleted_at(Conversation database); which of them the line repeats was not compared on a real install, and the parser takes it ascreated_at.@54351541`tool_calls`: An array of tool calls made in this step, including their arguments.: the element's keys are not given, and no real install has recorded them; the parser readsid,nameand the arguments asarguments_json,argsorarguments, the first present, an object or a JSON string (fixture only).@54351847`truncated_fields`: An array of field names that were truncated, followed by the examples["content"],["thinking"],["tool_calls"], and the statement that the key is never intranscript_full.jsonl.@53937489`<appDataDir>/brain/<conversation-id>/.system_generated/logs/transcript_full.jsonl`:<appDataDir>is the data directory (antigravity-cli,antigravity, and so on), the same name the app passes the language server.
A GENERIC line carries no tool name or call id: its content is the
tool's output. The database's tool steps on every real install so far were
generic steps whose metadata.tool_call names the call
(Joins and timestamps); a planner step's calls are run as the
steps after it.
Brain message files¶
messages/<uuid>.json (observed): content (string), id (UUID),
priority (upper-case enum-like string), recipient (UUID),
renderDetails {messageTitle}, sender (a 43-44 character string
containing a UUID), timestamp (ISO date), and on two of three
sourceMetadata {tool {conversationId (UUID), stepIndex (number),
toolCall {argumentsJson, id (call_ and digits), name
(run_command), thinkingSignature}}}. messages/read.json is
{<uuid>: bool} per message. On Linux the two messages had the same keys,
sender 44 characters.
Joins and timestamps¶
Conversation id = cascade_id = file name = conversation_summaries.
conversation_id = the brain/<uuid>/ and annotations/<uuid>.pbtxt
names. Subagent conversations are separate databases linked by
parent_conversation_id and by invoke_subagent.results[].conversation_id.
Git branch is available only when the trajectory metadata records a
workspace branch_name; the sample run from a non-git directory left it
empty. Up to CLI 1.2.x history.jsonl has no conversation id, so its rows
carry only the workspace. From CLI 1.3.x a line can carry conversationId
(observed, CLI 1.3.4 Linux, one of two lines), which is the
conversation id above; the parser puts it in the history row's
session_id (issue 89), so the prompt joins
to its conversation's rows, and a line without it keeps session_id empty. A macOS session with CLI
1.3.6 (observed, 2026-10-15) shows which lines get it: of four lines
for one conversation, the first prompt, written before the conversation
existed, had no conversationId, and the three prompts typed into the
running conversation all carried it. The two earlier observations fit
that pattern (one of two lines on Linux; the single first-prompt line on
Windows, CLI 1.3.5, had none), so a history row with an empty
session_id is a conversation's opening prompt, attributed to the
workspace only, and its conversation is the database whose first
USER_INPUT step has the same text and a timestamp within a second.
On Windows one folder can reach the parser under several spellings
(Where the project path is recorded), since the parser
passes a plain path through unchanged and turns a file: URI into a path
with uri_to_path, which keeps the drive letter's case and uses forward
slashes: on the Windows install (observed, CLI 1.3.5 and app 2.23.1,
2026-10-14) its rows carried c:/Users/sean/demo, C:/users/sean/demo2
and C:\users\sean\demo2. The timeline writes every Windows
project_path in one canonical form
(project_path in analyzer/docs/output.md);
the parser itself does not change them.
Which surface wrote a conversation is recorded twice: the data directory
the database sits in, and trajectory_meta.source, an
exa.cortex_pb.CortexTrajectorySource (each name prefixed
CORTEX_TRAJECTORY_SOURCE_; identical in agy 1.2.16 and
language_server 2.23.0):
0 UNSPECIFIED, 1 CASCADE_CLIENT, 2 EXPLAIN_PROBLEM, 3 REFACTOR_FUNCTION,
4 EVAL, 5 EVAL_TASK, 6 ASYNC_PRR, 7 ASYNC_CF, 8 ASYNC_SL, 9 ASYNC_PRD,
10 ASYNC_CM, 12 INTERACTIVE_CASCADE, 13 REPLAY, 15 SDK, 16 SUBAGENT,
17 CLI, 18 JETBOX, 19 AGENT_API, 20 CIDER, 21 GEMINI_APP, 22 VSCODE,
23 VISUAL_STUDIO
The CLI writes 17 (CLI) and the desktop app 1 (CASCADE_CLIENT)
(observed, macOS and Linux). The summaries table's app_data_dir column holds
the data-directory name the app passes the language server (antigravity
on the app, antigravity-cli on the CLI). It also tells a summary row
the CLI 1.3.5 database mirrors from the app (antigravity) from the CLI's
own (Summaries database); the parser does not put
app_data_dir in the row's text, but the row's source_file names the
database it came from. The parser puts
source=<name> and data_dir=<directory> in each conversation's session
start row. On Windows (observed, CLI 1.3.5 and app 2.23.1) the app's four
read source=cascade_client and data_dir=antigravity, one of them with
the app project's project_id and three with outside-of-project, and the
CLI's read source=cli, data_dir=antigravity-cli and
project_id=default-cli-project. The conversation title is in conversation_summaries.title and
in annotations/<uuid>.pbtxt (title:); the parser reads the former.
The brain mirror (Transcript stores) joins the
database by conversation id: the <uuid> of brain/<uuid>/ is the
database's cascade_id, and the parser puts it in session_id for both.
A mirror line repeats one database step, and the timeline pairs the two
rows on session_id, turn_type and text within 600 seconds (see
Secondary sources in analyzer/docs/output.md,
the analyzer's rule for second copies). The mirror records no workspace,
so its rows have no project_path; they need none to pair, since the
session id scopes the match. The text joins because the parser renders a
mirror line as the database reader renders the step of the same kind. The
time is the weak part: the line has one created_at, while the database
reader stamps an assistant, tool_use or tool_result row with the
step's completed_at, so the mirror's row comes first by the time the
model or the tool took, which is what the 600 seconds cover. Rows that do
not pair, and so appear twice when both stores survive: a
SYSTEM_MESSAGE whose database step has an event_type (the
task_notification events of every real install; the database row reads
task_notification: <message>, and the line records no event type), a
queued prompt (the database row starts [queued] ), a field shortened in
transcript.jsonl on a row with no tool_use_id (a shortened tool call
or result pairs on the id the parser infers for it, since analyzer
0.13.0 pairs tool rows on their ids), a step that ran longer than ten
minutes, and a GENERIC line whose content differs from the database
step's generic.result.result and that has no inferred id, which no
install has compared. A conversation's opening prompt is in
history.jsonl without conversationId, in the mirror and in the
database; the history line, matched by workspace, can take the database
row first, and the mirror's row, matched by session, then finds the
history row under the broader scope dedup.deduplicate tries among
secondary rows, so the prompt is shown once.
Other stores¶
Summaries database¶
CREATE TABLE conversation_summaries (conversation_id text PRIMARY KEY, title text, preview text, step_count integer,
last_modified_time datetime, workspace_uris text, status text, source text, project_id text, agent_name text,
parent_conversation_id text, nesting_depth integer, battle_id text, winning_conversation_id text, not_fully_idle numeric,
killed numeric, last_user_input_time datetime, last_user_input_step_index integer, app_data_dir text, raw_summary blob, group_id text);
Times are text like 2026-10-03 16:43:44.002530482+00:00. workspace_uris
is a JSON array of file:// URIs. status is a CascadeRunStatus name.
raw_summary is exa.jetski_cortex_pb.CascadeTrajectorySummary (1
summary, 2 step_count, 3 last_modified_time, 7 created_time, 9
workspaces[], 10 last_user_input_time, 17 trajectory_metadata, 22
trajectory_type, 24 fork_parent_conversation_id).
The desktop app's conversation_summaries.db (observed, macOS; 131,072
B with a 32,768 B -shm and an empty -wal) has the same
conversation_summaries table and two more:
search_schema_version(version), one row, value 3.conversations_fts, an FTS5 virtual table (FTS5 is SQLite's full-text search extension; a virtual table whose rows live in the shadow tablesconversations_fts_data,_idx,_content,_docsizeand_config; the Linux listing showedconversations_fts_config, which the macOS listing did not record) with the columnsconversation_id,chunk_index,chunk_first_step,chunk_last_step,last_modified_time,step_count,last_step_created_at,archived,user_step_byte_offsets,agent_step_byte_offsets,title,workspace,project,user_bodyandagent_body, tokenizerunicode61 remove_diacritics 2, prefix indexes1 2 3; 8 rows for 4 conversations. By their names,user_bodyandagent_bodyhold the user's and the agent's text of a chunk of steps (the values were not read); the parser does not read the table.
Its four conversation_summaries rows had status
CASCADE_RUN_STATUS_IDLE, source and agent_name empty,
nesting_depth 0, parent_conversation_id and group_id empty, killed
0, project_id and title set, app_data_dir antigravity,
raw_summary of 285-395 B and workspace_uris as text. The CLI's
summaries database has only conversation_summaries.
On Linux (observed, app 2.23.1) the app's database was 167,936 B with a
32,768 B -shm and an empty -wal, the same schema with
search_schema_version 3, and four rows like the macOS ones, raw_summary
278-390 B. The CLI 1.3.4 summaries database was 20,480 B with only
conversation_summaries and one row (app_data_dir antigravity-cli,
raw_summary 386 B).
On Windows (observed, CLI 1.3.5 and app 2.23.1) neither summaries
database had a -wal or -shm sidecar: the app's was 159,744 B, the
CLI's 40,960 B. The CLI's held five rows, its own conversation's and one
for each of the app's four, which carry app_data_dir antigravity; the
CLI's cache/conversation_metadata.json lists the same four
(Transcript stores), and its cli.log has a line
from reconcile_summaries.go and one from project_uris_migration.go.
The parser reads every row of both databases, so each app conversation
yields two conversation summary rows, one from each database (9 for 5
conversations on this install). The mirrored row has no run status: the
app's own row reads
conversation summary | <title> | CASCADE_RUN_STATUS_IDLE | 20 steps and
the CLI's copy conversation summary | <title> | 20 steps. Neither macOS
(CLI 1.2.16) nor Linux (CLI 1.3.4) showed the mirroring; whether it is new
in 1.3.5 or needs the app to have run first on the same profile is not
determined.
Permission configuration files¶
Besides the per-step grants in the conversation databases (Conversation database), Antigravity keeps standing permission state in four JSON files, which together are its permission configuration. A grant entry is a tool-call pattern: a tool name followed by its argument in parentheses. The keys, with what was seen on the 2026-10-13 real installs (macOS: CLI 1.2.16 and app 2.23.0; Ubuntu: CLI 1.3.4 and app 2.23.1) and the Windows install of 2026-10-14 (CLI 1.3.5 and app 2.23.1), key names and counts only, observed unless marked:
| File | Keys |
|---|---|
.gemini/config/config.json (shared by the CLI and the app) |
userSettings.globalPermissionGrants.allow[] (3 entries on macOS, 11 on Ubuntu, 14 on Windows), userSettings.permissionGrantsV2Migrated (bool), userSettings.sandboxEnabledAtV2Migration (bool); per automation (sidecar) sidecars.<name>.enabled and sidecars.<name>.resolvedPermissions.accessGrants[] (not in the macOS or the Windows file; the Windows file also had neither migration flag) |
.gemini/config/projects/<uuid>.json |
permissionGrants.permissionGrants.allow[] (2 entries, seen on one Ubuntu project file), permissionGrants.v2Migrated; the project folder is projectResources.resources[].folderUri |
.gemini/config/sidecars/<name>/sidecar.json |
agent_permissions.access_grants[] (2 entries on macOS, 3 on Windows) |
.gemini/antigravity-cli/settings.json |
permissions.allow[] (CLI 1.3.x; 2 entries on Ubuntu, 1 on Windows) and trustedWorkspaces[] (the folders the user trusted; a JSON tag in the binary, see CLI data directory) |
Sidecar logs¶
sidecar_data/<name>/logs/sidecar.log (observed, Linux, 388 B,
written when the automation was saved): the plain-text log of the sidecar
named <name> (the automation's name, the same as its directory under
.gemini/config/sidecars/). With digits and names redacted, its lines
were:
=== sidecar "<name>" started at <timestamp> ===
<date> <time> [schedule] Scheduler started for schedule: "CRON_TZ=<zone> N N * * *"
<date> <time> [schedule] Calculated jitter: NmNN.NNNNNNNNs
<date> <time> [schedule] Next execution scheduled in NNhNNmNNs (at <UTC time>), will run by ...
So a scheduled automation's own output lands under
sidecar_data/<name>/logs/. The schedule is a cron expression with a time
zone prefix (CRON_TZ=). No scheduled run fired on any install, so what
a run writes, and whether it becomes a conversation, is not observed. The
parser does not read the log.
On Windows (observed, app 2.23.1) the automation was saved
(.gemini/config/sidecars/<name>/sidecar.json, written 00:17:41Z to
00:20:16Z), but no sidecar_data/ directory existed 25 minutes later and
config.json had no sidecars key, both of which the Linux install had
within a minute of saving. The language server's log,
%APPDATA%\Antigravity\logs\language_server.log, has these lines about it
(digits and names redacted; repeat counts in brackets):
manager.go:NN] Migration [MIGRATION_ID_BUILTIN_SIDECARS_TO_PLUGINS] is enabled (x3)
manager.go:NN] Migration [MIGRATION_ID_BUILTIN_SIDECARS_TO_PLUGINS] starting
manager.go:NN] Migration [MIGRATION_ID_BUILTIN_SIDECARS_TO_PLUGINS] completed successfully in NN.NNNNms
manager.go:NN] Migration [MIGRATION_ID_BUILTIN_SIDECARS_TO_PLUGINS] already has status MIGRATION_STATUS_... (x2)
manager.go:NN] Migration [MIGRATION_ID_SIDECAR_USER_CONFIG_BYPASS] is disabled, skipping entirely (x3)
sidecar_manager.go:NNN] Config changed for sidecar <name>, updating...
sidecar_sdk.go:NN] Using bundled agy-node
Whether the sidecar ever started on Windows, and where its log would go there, is not determined.
Format versions¶
The builds observed differ in which files and keys they write; the protobuf schemas were compared only between the Linux (WSL) build of Source and evidence and the macOS CLI 1.2.16 and app 2.23.0, and the descriptors of CLI 1.3.4 and 1.3.5 and app 2.23.1 were not extracted.
history.jsonl: up to CLI 1.2.x a line has no conversation id; from CLI 1.3.x a prompt typed into a running conversation carriesconversationIdand a conversation's opening prompt does not (CLI 1.3.4 on Linux, 1.3.5 on Windows, 1.3.6 on macOS; Joins and timestamps).annotations/<uuid>.pbtxtappears in the CLI's directory from CLI 1.3.x, as in the app's (Transcript stores), and the CLI'ssettings.jsonhaspermissions.allow[]from CLI 1.3.x (Permission configuration files).- CLI 1.3.5 on Windows wrote
cache/conversation_metadata.jsonand a summary row for each of the app's conversations, which neither CLI 1.2.16 on macOS nor 1.3.4 on Linux showed (Summaries database). - Brain mirror lines: on Linux (CLI 1.3.4 and app 2.23.1) every
GENERICline has anerrorkey, which on macOS appeared only onERROR_MESSAGElines (Brain mirror lines). - Before 2.0 the VS Code-fork IDE wrote
.gemini/antigravity/, the directory the desktop app 2.x now uses; the separately installed IDE's directory is.gemini/antigravity-ide/(Transcript stores).
The descriptor comparison: tools/proto_descriptors.py extract (after the
fix for issue 86) found 271 descriptor files
in agy 1.2.16 and 484 in language_server 2.23.0; the difference from the Linux count in
Source and evidence was not investigated.
exa.cortex_pb.CortexStepType (118 values), CortexStepStatus,
CortexTrajectorySource, gemini_coder.Step, gemini_coder.Trajectory and
every message in the parser's SCHEMA were diffed against the parser's
tables, which were built from the Linux descriptors: field numbers, names
and types match in both macOS binaries, and the two define
CortexTrajectorySource identically (Joins and timestamps).
Nothing the parser reads drifted. The diff did find one error in the tables
themselves, the delete_file layout (Conversation database).
Secrets¶
antigravity-oauth-token (collector secret glob).
plugin_data/<plugin>/token.json under the desktop app's data directory
(Credentials) is the Google Docs plugin's OAuth credential
(observed): keys client_id, client_secret, email, scopes (an
array of 8 URLs), token {access_token, expiry (ISO date),
refresh_token, token_type} and updated_at. client_secret and the
token values are the credential and email names the account. The
collector flags the file secret: true
(issue 84); the parser never reads it.
ChatModelMetadata.system_prompt and message_prompts in gen_metadata hold the full prompt
including file contents; the parser does not read them. Tool outputs in generic.result
and run_command, the brain directory's steps/<idx>/output.txt and
tasks/*.log contain whatever the agent read, and so, presumably, do the
FTS5 table's user_body and agent_body.
The Windows Credential Manager entry of CLI 1.3.5 and the
os_crypt.encrypted_key in the desktop app's Windows Local State file
are described in Credentials; the parser reads neither.
Parser plan¶
Every source below is read on every run; a secondary source is one whose
rows the timeline drops when the primary store yields the same event
(Secondary sources in analyzer/docs/output.md).
| Source | Role | Rows |
|---|---|---|
<dir>/conversations/<uuid>.db |
primary: the store of record, every step with its payload, model, permissions and both times | session start, user, assistant, tool_use, tool_result, thinking, system, model and permission rows (Conversation database) |
<dir>/conversation_summaries.db |
primary: a summary per conversation, not a copy of its events | one conversation summary system row per conversation (Summaries database) |
.gemini/antigravity-cli/history.jsonl |
secondary (2 seconds): the prompts the database also records | one user row per line (Joins and timestamps) |
<dir>/brain/<uuid>/.system_generated/logs/transcript_full.jsonl, else chunks/transcript_full/*.jsonl concatenated, else transcript.jsonl, else chunks/transcript/*.jsonl |
secondary (600 seconds): one copy of the database's steps, read in that order of preference, one copy per conversation | user, assistant, tool_use, tool_result, thinking and system rows, as the database reader renders the same step kinds (Transcript stores) |
| the standing permission files | primary: no other copy | permission setting rows (Permission configuration files) |
The four mirror files are copies of one transcript, not four sources: the
shortened transcript.jsonl holds the same lines with long fields cut, and
the chunks are the same bytes split at 102,400 bytes. Not read:
brain/<uuid>/.system_generated/steps/<idx>/output.txt and content.md,
messages/<uuid>.json and tasks/task-<idx>.log (outputs and messages
the steps already carry, or not yet mapped to a step), annotations/*.pbtxt
(the title, also in the summaries database),
cache/conversation_metadata.json, jetbox_summaries_proto.pb and
agyhub_summaries_proto.pb (summaries again), and the app's FTS5 table.
Permission rows¶
The parser decodes the steps.permissions column
(Conversation database), or Step field 133 of the payload when
the column is empty, and yields after the step's own rows one system row
per permission_grants[] entry,
permission grant: action=<action> target=<target> allow=<true|false> scope=<scope>
(action and target from fields 5 and 6, else from resource; with
deny_instruction=<text> appended when user_deny_instruction is set), and
one per file_access_permissions[] entry,
permission grant: path=<path> is_directory=<true|false> allow=<true|false> scope=<scope>
(with from_current_step=true appended when set). Each row carries the
step's tool_name and tool_use_id, so it sits beside the call it
governed, and the step's tool-result time; <scope> is the lower-case name
without the prefix, or the number for a value not in the enum.
A step with user_rejected set (the three tool-payload fields of
Conversation database) yields, right after its tool_result
row (whose text keeps [rejected by user]), a system row
permission decision: user_rejected with the step's tool_name,
tool_use_id and result time. ran_in_sandbox is not a decision: a
run_command result with it set ends with sandbox=true.
The antigravity parser reads the keys of the
permission configuration files and
nothing else in the files (not plugins, remoteControlHostname, a
project's name or a sidecar's args), and never wants mcp_config.json,
which can embed MCP credentials, or a plugin's token.json. Each list entry
and each flag becomes one system row,
permission setting: <key>=<value> (from <path relative to the home>, file mtime),
where <key> is the JSON path in the file and a trustedWorkspaces[] entry
is trustedWorkspace=<path>. The rows are timestamped by the file's
modification time (the manifest's mtime, or the file's own without a
manifest), since none of the entries records when it was granted; their
session_id is empty, and the project file's rows and each trusted
workspace's row carry the folder as project_path. A deny[] list beside
each allow[] is read the same way; none was seen, so it is fixture only.
On Windows (observed, CLI 1.3.5) the one trustedWorkspaces[] entry was
an absolute Windows path, not a file:// URI; the parser accepts both
(issue 92).
Model rows¶
The parser yields the model as a system row
(issue 96): model: <id> before the rows of
the conversation's first step that a gen_metadata row lists in step_indices, and
model: <old> -> <new> before the rows of each later step whose model differs, at the step's
metadata.created_at, with the new id in the model column. The id is
chat_model.response_model, else model_display_name. No step kind in
the parser's SCHEMA records a model switch. The macOS and Linux rounds
did not record the response_model values per conversation; on Windows
(observed, CLI 1.3.5 and app 2.23.1) each of the five conversations
yielded one model row and no change, with gemini-3.8-flash-n in every
one. So a model change within a conversation has not been observed; it
would show only as a different response_model on a later planner step.
Past-use rows and secondary sources¶
The conversation database is the store of record. history.jsonl (2
seconds) and the brain mirror (600 seconds, one copy per conversation in
the order of preference in the table) are secondary sources; each
summaries row is a conversation summary row of its own, so an app
conversation that CLI 1.3.5 also summarises yields two
(Summaries database). What each copy survives is in
What survives a delete; how history and mirror
rows pair with the database's, and which rows do not pair, is in
Joins and timestamps.
Sync, relay and origin rows¶
Not stated.
Scratch directory rows¶
The parser yields no scratch directory: row: the app's scratch documents
sit inside its data directory (Scratch directories),
which no row records as a project path.
Deletion rows¶
Not stated.
Bad-line rows¶
A steps.permissions blob that does not decode is one system row,
parser: the permissions of step <idx> could not be decoded, and the
step's other rows stand (issue 92). Each
history.jsonl and brain mirror line that does not decode is its own system row carrying the
line, and the lines around it are still read; a brain chunk can cut a line at a
chunk boundary (Transcript stores).
Fixtures¶
analyzer/tests/fixtures/antigravity.py builds the CLI data directory
(build_antigravity, with the step shapes of antigravity_steps), the
app's (build_antigravity_app, antigravity_app_steps, source 1 and
app_data_dir antigravity), the brain mirror (build_antigravity_brain:
a conversation with its database, and one whose database is gone, its line
cut across two chunks) and the permission configuration files
(build_antigravity_config). Fixture only, never seen on a real install:
the keys of a mirror line's tool_calls elements
(Brain mirror lines) and a deny[] permission list
(Permission rows).
Confidence¶
- High: the CLI layout (live, observed and binary literals); the desktop
app's data directory
~/.gemini/antigravityand its contents (bundle and observed); the Electron user-data directory nameAntigravityand the macOS logs directory (bundle and observed); the Linux Electron user-data directory~/.config/Antigravityand itslogs/(bundle and observed, app 2.23.1); the Windows Electron user-data directory%APPDATA%\Antigravityand itslogs\, and the Windows staging directory%LOCALAPPDATA%\antigravity\staging(observed, app 2.23.1 and CLI 1.3.5, Windows 11 ARM64 build 26300, 2026-10-14); the Credential Manager as the CLI's keyring on Windows (observed log lines); the roles ofantigravity-ideandantigravity-backup(bundle); the plugin token's location and keys (observed); the keyring service and file fallback;~/.gemini/configcontents, includingprojects/<uuid>.jsonandsidecars/<name>/sidecar.json(observed); the CLI's log line naming~/.config/antigravity/plugin-secrets.jsonon Linux (observed). - High: the conversation database and summaries database schemas (observed
on every install); the protobuf tables the parser reads (descriptors of
agy1.2.16 andlanguage_server2.23.0, diffed against the parser's tables, Format versions); the five step kinds of Conversation database, the brain mirror's line keys and thehistory.jsonlkeys, including which lines carryconversationId(observed on all three platforms). - Medium: the macOS and Windows paths of
plugin-secrets.json(inferred from Go'sos.UserConfigDir(), not observed; the Windows install used the Credential Manager instead) and its contents (never observed);antigravity-ide/conversationsandbrain(four community sources, no real install); theAntigravity IDEapp-dir name on macOS (inferred from the Windows and Linux names);knowledge/sub-layout (one source);.cache/antigravitypurpose; the brain mirror's value forms (the format description the backend embeds,agy1.3.6, not compared value by value on a real install, Brain mirror lines). - Not determined: which of the observed app conversations belongs to which
task, on any of the three platforms (modification times only,
Observed); what a fired scheduled run writes and whether it
becomes a conversation (Sidecar logs); whether the
scheduled automation's sidecar ever started on Windows, and where its log
would go there; whether the Electron
CookiesorLocal Storage/can hold a credential; where the WSL language server keeps state; theimplicit/*.pbandpresence/semantics; whether~/.antigravityis still written by any build; the name of the CLI's Credential Manager entry on Windows; whether CLI 1.3.5 copies the app's conversation summaries on every platform, or only once the app has run (Summaries database). - Not determined, for the parser: what Antigravity's own delete of a
conversation removes, and whether a compaction or a rewind rewrites the
brain mirror (What survives a delete); the step
kinds other than the five seen, decoded from the descriptors only; which
scope values and
actionstringssteps.permissionsholds; whetheruser_rejectedorran_in_sandboxis ever set on a real install; whether a mirror line'screated_atis the step'screated_ator itscompleted_at; the keys of a mirror line'stool_callselements and adeny[]permission list (fixture only); a model change within a conversation (none observed, Model rows); the descriptors of CLI 1.3.4 and 1.3.5 and app 2.23.1, which were not extracted, and why the Linux binary's descriptor count differs from the macOS ones (Format versions).