GEM-4C 558 -4%
GPT-61S 555 -3.8%
CL-SN55 553 -3.8%
CL-OP55 551 -4%
GPT-61TERR 547 -3.5%
GEM-4CM 546 -4%
CL-OP55EH 542 -3.9%
GPT-61SOLXH 541 -3.6%
GPT-61SOLH 527 -3.7%
CL-SN55XH 523 -3.5%
GEM-4CL 520 -3.9%
GPT-61TERRXH 507 -3.4%
CL-OP55H 506 -4%
GPT-61SOLM 500 -3.5%
KIMI-K31P 499 -3.5%
GEM-4AR 498 -3.9%
GPT-61TERRH 490 -3.2%
CL-OP55M 483 -3.6%
MUSE-WONDFUL 479 -3.8%
CL-SN55H 467 -3.3%
CL-HK55 463 -2.9%
GPT-61TERRM 462 -3.1%
GPT-6A 451 -4.7%
MUSE-WOND 451 -3.6%
CL-HK55XH 450 -3%
GPT-6ASTRXH 440 -4.8%
GROK-47 440 -3.1%
GROK-47H 438 -2.9%
GPT-6ASTRH 437 -4.8%
DSK-V-340615 436 -2.9%
QWEN-38X 428 -2.9%
GPT-61SOLL 423 -3.2%
GLM-53 420 -3%
MIMO-V26P 420 -2.6%
CL-HK55H 419 -2.8%
LING-31F1019 417 -2.6%
GEM-38F 416 -2.8%
GPT-6ASTRM 415 -4.6%
MMAX-M31F 414 -2.8%
GEM-38FM 412 -2.8%
GPT-61TERRNO 411 -2.8%
GROK-47L 410 -2.8%
DSK-V-3E48BD 410 -2.6%
GPT-6L 407 -2.6%
GLM-53F 407 -2.6%
STEP-5 405 -2.6%
CL-FABL51XH 403 -4.7%
GPT-61TERRL 403 -2.9%
MIMO-V26F 401 -2.4%
CL-FABL51 399 -4.5%
CL-SN55M 395 -2.9%
CL-OP55L 393 -3.4%
MIST-LARG4 390 -2.7%
CL-FABL51H 386 -4.5%
CL-HK55M 386 -2.3%
GPT-6LUNAXH 377 -2.6%
MUSE-SPAROPE 375 -2.6%
MIST-LARG4M 371 -2.4%
DSK-V4P 365 -2.4%
GPT-6LUNAH 365 -2.1%
GLM-53L 364 -2.4%
CL-SN55L 362 -2.7%
GEM-38FL 361 -2.4%
GPT-6ASTRL 359 -4.5%
CL-FABL51M 359 -4.5%
QWEN-827B 349 -2.2%
CL-HK55L 347 -2%
MMAX-M3 345 -2%
GPT-6LUNAM 344 -2.3%
DSK-V-02811D 344 -2%
K2-HORI375BA 342 -2%
REFL-BEAM 338 -2%
QWEN-827BM 332 -1.8%
CL-FABL51L 329 -4.4%
QWEN-827BL 320 -1.8%
NEMO-35SUPEV 313 -1.9%
INKL 295 -1.7%
NVID-NEMO3UL 295 -1.3%
GEM-35FLITE 295 -1.3%
GPT-6LUNAL 287 -1.4%
GPT-6LUNANON 286 -1%
NANB-333B 285 -2.7%
QWEN-827BNON 282 -1.4%
COMM-APLUS 266 -1.1%
MUSE-GLIM 263 -1.1%
NEMO-35LIGH 261 -0.8%
GRAN-428B 258 -0.8%
MIST-SMAL4 252 -0.4%
INKL-SM 235 -2.5%
GEMM-431B 225 —
GEMM-4E4B 225 —
GEMM-4E4BNON 225 —
LING-30TINY 225 —
MINI-33B 225 —
NORT-MCODE 225 —
NOVA-MICR 225 —
NVID--ADE3B4 225 —
QWEN-54B 225 —
QWEN-54BNONR 225 —
TINY-AYAGLOB 225 —
GEM-4C 558 -4%
GPT-61S 555 -3.8%
CL-SN55 553 -3.8%
CL-OP55 551 -4%
GPT-61TERR 547 -3.5%
GEM-4CM 546 -4%
CL-OP55EH 542 -3.9%
GPT-61SOLXH 541 -3.6%
GPT-61SOLH 527 -3.7%
CL-SN55XH 523 -3.5%
GEM-4CL 520 -3.9%
GPT-61TERRXH 507 -3.4%
CL-OP55H 506 -4%
GPT-61SOLM 500 -3.5%
KIMI-K31P 499 -3.5%
GEM-4AR 498 -3.9%
GPT-61TERRH 490 -3.2%
CL-OP55M 483 -3.6%
MUSE-WONDFUL 479 -3.8%
CL-SN55H 467 -3.3%
CL-HK55 463 -2.9%
GPT-61TERRM 462 -3.1%
GPT-6A 451 -4.7%
MUSE-WOND 451 -3.6%
CL-HK55XH 450 -3%
GPT-6ASTRXH 440 -4.8%
GROK-47 440 -3.1%
GROK-47H 438 -2.9%
GPT-6ASTRH 437 -4.8%
DSK-V-340615 436 -2.9%
QWEN-38X 428 -2.9%
GPT-61SOLL 423 -3.2%
GLM-53 420 -3%
MIMO-V26P 420 -2.6%
CL-HK55H 419 -2.8%
LING-31F1019 417 -2.6%
GEM-38F 416 -2.8%
GPT-6ASTRM 415 -4.6%
MMAX-M31F 414 -2.8%
GEM-38FM 412 -2.8%
GPT-61TERRNO 411 -2.8%
GROK-47L 410 -2.8%
DSK-V-3E48BD 410 -2.6%
GPT-6L 407 -2.6%
GLM-53F 407 -2.6%
STEP-5 405 -2.6%
CL-FABL51XH 403 -4.7%
GPT-61TERRL 403 -2.9%
MIMO-V26F 401 -2.4%
CL-FABL51 399 -4.5%
CL-SN55M 395 -2.9%
CL-OP55L 393 -3.4%
MIST-LARG4 390 -2.7%
CL-FABL51H 386 -4.5%
CL-HK55M 386 -2.3%
GPT-6LUNAXH 377 -2.6%
MUSE-SPAROPE 375 -2.6%
MIST-LARG4M 371 -2.4%
DSK-V4P 365 -2.4%
GPT-6LUNAH 365 -2.1%
GLM-53L 364 -2.4%
CL-SN55L 362 -2.7%
GEM-38FL 361 -2.4%
GPT-6ASTRL 359 -4.5%
CL-FABL51M 359 -4.5%
QWEN-827B 349 -2.2%
CL-HK55L 347 -2%
MMAX-M3 345 -2%
GPT-6LUNAM 344 -2.3%
DSK-V-02811D 344 -2%
K2-HORI375BA 342 -2%
REFL-BEAM 338 -2%
QWEN-827BM 332 -1.8%
CL-FABL51L 329 -4.4%
QWEN-827BL 320 -1.8%
NEMO-35SUPEV 313 -1.9%
INKL 295 -1.7%
NVID-NEMO3UL 295 -1.3%
GEM-35FLITE 295 -1.3%
GPT-6LUNAL 287 -1.4%
GPT-6LUNANON 286 -1%
NANB-333B 285 -2.7%
QWEN-827BNON 282 -1.4%
COMM-APLUS 266 -1.1%
MUSE-GLIM 263 -1.1%
NEMO-35LIGH 261 -0.8%
GRAN-428B 258 -0.8%
MIST-SMAL4 252 -0.4%
INKL-SM 235 -2.5%
GEMM-431B 225 —
GEMM-4E4B 225 —
GEMM-4E4BNON 225 —
LING-30TINY 225 —
MINI-33B 225 —
NORT-MCODE 225 —
NOVA-MICR 225 —
NVID--ADE3B4 225 —
QWEN-54B 225 —
QWEN-54BNONR 225 —
TINY-AYAGLOB 225 —

Delayed ticker data. Last calculated 5 Nov 2026, 11:04 pm Sydney time.

← Back to feed

Grok Build CLI Uploads Your Entire Repository to xAI — .env Secrets, Unread Files, and Git History Included

A reproducible wire-level analysis of xAI’s Grok Build CLI (version 0.2.93) documents three upload behaviours active by default: secrets files transmitted unredacted to model endpoints, a whole-repository git bundle sent to a Google Cloud Storage bucket without a size cap, and third-party telemetry to Mixpanel. None of the three are stopped by the tool’s opt-out settings.

The analysis was conducted on macOS Apple Silicon using mitmproxy with a canary repository containing uniquely marked files, including a .env file with dummy credentials. All upload events were confirmed by HTTP 200 responses in wire-captured traffic. SHA-256 hashes of captured artifacts were published alongside the analysis.

Channel A: Secrets Files Go to the Model Endpoint

When Grok reads a file during a coding task, its contents are serialised verbatim into the POST /v1/responses model-turn body. A .env file containing two canary credentials — API_KEY=CANARY7F3A9-SECRET and DB_PASSWORD=CANARY7F3A9-DBPASS — appeared unredacted in the captured 48,070-byte request body alongside "model":"grok-4.5". All six file markers in the test repository were recoverable from the decrypted /v1/responses bodies.

This is unsurprising in isolation: a cloud coding agent must send file contents to its server to act on them. The problem is there is no redaction layer. A .env file is transmitted the same way as a README.md.

Channel B: The Whole Repo Goes to GCS, Including Files the Agent Was Told Not to Open

Independently of what the agent reads, Grok packages the entire workspace and uploads it via POST /v1/storage to a bucket named grok-code-session-traces. This is a separate mechanism from the model-turn channel.

The definitive proof: with the explicit prompt “Reply with exactly: OK. Do not read or open any files,” Grok still uploaded the entire repository as a git bundle (POST cli-chat-proxy.grok.com/v1/storage → 200). Running git clone on the captured bundle recovered a file the agent was told not to open — src/_probe/never_read_canary.txt with its unique marker — plus full commit history. The test was replicated on a second, unrelated codebase with the same result.

The byte split is the load-bearing proof. In the same captured 12 GB session — a repository of 100% random files the agent never read — the two channels moved:

  • Channel A /v1/responses (model turns): 196,705 bytes (192 KB total, 5 requests)
  • Channel B /v1/storage: 5,476,228,005 bytes (5.10 GiB)

A ratio of ~27,800×. The model demonstrably could not have ingested the files; 192 KB cannot carry 5 GiB of content. Yet 5.10 GiB left via /v1/storage, with zero failed requests.

The upload scales without a known ceiling:

Repo sizeUpload methodOutcome
64 MBSingle POST, 48 MB bodyHTTP 200
~600 MB~7.5 MB chunksAll 200
~3 GB50 MB multipart directly to storage.googleapis.comAll 200
12 GB75 MB chunks; 5.10 GiB captured before run was stoppedAll 200, 0 failures

Upload activity continued returning 200s after the model endpoint hit a quota limit (402/429). The codebase upload runs independently of whether the model is answering.

The destination bucket, grok-code-session-traces, is named verbatim in binary strings: crates/codegen/xai-data-collector/src/gcs.rs, crates/codegen/xai-grok-shell/src/upload/{gcs,turn,trace,manifest}.rs. A captured metadata.json gives each file a destination path of the form gs://grok-code-session-traces/repo_changes_dedup/v2/supplemental/sha256_….

The Opt-Out Does Not Stop the Upload

After disabling “Improve the model” in Grok settings, the whole-repo upload continued identically. The server’s /v1/settings response to the CLI returned:

"trace_upload_enabled": true
"upload_enabled": true
"session_registry_enabled": true
"max_upload_file_bytes": 1073741824

The 1 GiB per-file cap in that response suggests individual file uploads are bounded, but the whole-repo bundle mechanism operated without hitting it in testing. The opt-out appears to govern training data policy, not whether code leaves the machine.

Third-Party Telemetry

POST requests to api.mixpanel.com/track, api.mixpanel.com/engage, and grok.com/_data/v1/events were captured, all returning 200.

What This Does Not Prove

The analysis explicitly does not prove xAI trains on uploaded repository contents. Transmission and persistence to GCS ≠ training. That is a separate policy and account-tier question. The analysis also does not test .gitignored files (the upload mechanism is read-driven per the file_access_tracker crate, but .gitignore interaction was not specifically tested) or high-entropy token detection (whether xAI’s backend redacts real sk-...-format API keys was not confirmed).

The Practical Exposure

Any developer running Grok Build against a repository containing a .env file, API keys in config files, or internal source code in git history should treat that content as having been transmitted to xAI’s infrastructure and written to grok-code-session-traces. The Grok privacy settings page offers a prospective opt-out from training use. It does not stop the upload pipeline.

The analysis also flags a reliability issue independent of privacy: the ~/.grok/upload_queue directory stages multi-gigabyte snapshots per session turn and can exhaust disk space under sustained use.

xAI had not issued a public response at the time of publication.