ZCode ships your Git history to the cloud without asking

4 min read 2 sources clear_take
├── "ZCode's silent Git history upload is a serious privacy and security violation, not a bug but a deliberate default"
│  ├── cdnsteve (Tokenstead / Hacker News, 217 pts) → read

The Tokenstead guide demonstrates via proxy captures that ZCode ships multi-megabyte multipart uploads containing the working tree and Git plumbing within seconds of startup, before any user interaction. The author frames this as an unacceptable default behavior gated behind nothing more than launching the binary, with no consent dialog or opt-out flag.

│  └── csmantle (blog.ferstar.org / Hacker News, 278 pts) → read

The Ferstar teardown goes deeper, showing that ZCode also captures .git/config contents — which frequently contain plaintext tokens in remote URLs — and does not respect .gitignore when building its snapshot. The author argues this crosses a line beyond typical context-sharing because it exfiltrates credentials and deliberately-excluded files.

├── "Uploading Git history specifically — not just code — is the qualitative line ZCode crosses that other coding agents don't"
│  └── top10.dev editorial (top10.dev) → read below

The editorial acknowledges that Cursor, Copilot, Cody, and Continue all ship code off-device and have all faced their own 'you're uploading what?' moments. What makes ZCode distinct is that it uploads Git history — commit metadata, author identities, branch names, .git/config — before the user has typed a single prompt, which is a categorically different level of exposure than sending context on demand.

└── "Ignoring .gitignore during snapshotting is an independent and equally serious failure"
  └── csmantle (blog.ferstar.org / Hacker News, 278 pts) → read

The Ferstar teardown specifically calls out that ZCode's snapshot mechanism does not consult .gitignore, meaning files developers deliberately kept out of version control — often the exact files containing secrets, local configs, or personal data — get swept up alongside tracked source. This shows the client is not merely mirroring what Git already tracks but actively harvesting more.

What happened

Two separate write-ups landed on Hacker News within a day of each other, both dissecting the same behavior in ZCode, a coding agent built on Zhipu's GLM models. The Tokenstead guide and a longer teardown on blog.ferstar.org each pulled the same thread: when you launch ZCode inside a Git repository, the client silently packages up a snapshot of the workspace — tracked files, uncommitted diffs, and Git metadata — and ships it to a remote endpoint before it ever answers your first question.

The researchers captured this by pointing ZCode at a scratch repo, running a proxy in front of it, and watching multi-megabyte multipart uploads leave the machine within seconds of startup. The payload wasn't a stripped context window or a hashed fingerprint. It was the working tree plus enough Git plumbing to reconstruct history: recent commits, author identities, branch names, and in some captures the contents of `.git/config` — which on a lot of developer machines still contains a plaintext token in the remote URL.

Neither post frames this as a bug. It's the product's default behavior, gated behind nothing more than launching the binary. There's no consent dialog, no `--upload-context` flag, no mention in the onboarding. The Ferstar teardown notes the client doesn't respect `.gitignore` for the snapshot either — files you deliberately kept out of version control get swept up alongside the rest.

Why it matters

Coding agents have a real context problem: the model is only useful if it can see enough of your codebase to reason about it, and the pragmatic answer most vendors have converged on is "send a lot, ask forgiveness later." Cursor, Copilot, Cody, Continue — all of them ship code off-device, and all of them have had at least one round of "wait, you're uploading *what*?" discourse. What makes ZCode notable isn't that it uploads code. It's that it uploads Git history, and does so before the user has typed anything.

That distinction matters for three reasons. First, Git history is where the skeletons live. The password someone committed in 2019 and force-pushed out of `main` is still sitting in the reflog of every clone. Purged secrets, half-finished features, private forks of proprietary code — all of it is one `git log --all` away, and a workspace snapshot that includes `.git/` grabs the lot. Second, the upload happens pre-prompt. There's no "the user asked me to refactor this file, so I need to see the file" justification — the data leaves whether you use the tool or not. Third, the destination is a Chinese-hosted endpoint tied to Zhipu's infrastructure, which for a meaningful slice of the developer audience is a compliance conversation that ends the pilot on the spot.

Community reaction on the HN threads (217 and 278 points respectively, unusually high for a single-vendor security post) split predictably. One camp: "this is how all these tools work, you're naïve if you thought otherwise." The other camp, and the one that reads the traffic dumps more carefully, points out that most competitors at least scope uploads to files the model needs to answer the current query — ZCode's snapshot is indiscriminate and up-front. The Ferstar author put it plainly: "it's not that it phones home. It's that it phones home with your entire filing cabinet before you say hello."

There's also a supply-chain wrinkle that neither post fully develops but both hint at. The uploaded snapshot includes remote URLs. If a developer has SSH keys or personal access tokens embedded in those URLs — still depressingly common in dotfiles and CI configs — those credentials now sit on a third-party server with unknown retention. Rotating them is straightforward. Knowing you need to rotate them requires reading a Hacker News post.

What this means for your stack

If ZCode has touched a work machine, treat it as an incident, not a curiosity. Concretely: rotate any credentials that have ever been committed to any repo you opened in the tool, audit `.git/config` for embedded tokens, and pull egress logs for the install window to see what actually left. The Tokenstead guide includes the specific endpoints to grep for. If you're on a corporate network with any kind of DLP, the traffic should be visible; if you're not, this is a good week to reconsider that.

The broader move is to stop trusting coding-agent vendors' defaults and start treating the network layer as the source of truth. Run new agents behind a logging proxy for the first hour. Watch what leaves. This is fifteen minutes of setup with `mitmproxy` and it catches this exact class of problem — silent context exfiltration, telemetry that includes file contents, third-party analytics SDKs bundled into the binary. The alternative is trusting a privacy policy written by the same company that decided uploading your Git history was a reasonable default.

For teams evaluating agent tools, add two questions to the eval rubric: (1) what leaves the machine before I send a prompt, and (2) does the upload scope respect `.gitignore` and exclude `.git/`. Both are answerable in an afternoon of packet capture. Neither is answerable from a marketing page.

Looking ahead

ZCode will almost certainly ship a patch — the pattern with this kind of disclosure is a quiet config flag within a week, a blog post about "enhanced privacy controls" within a month, and no acknowledgment that the default was ever wrong. The more interesting question is whether any of the larger coding-agent vendors get audited to the same depth, because the honest answer is that most of them haven't been, and the ones that have came out looking better than ZCode but not by as much as their users assume. The next six months of this category are going to be defined less by benchmark scores and more by whose traffic dumps survive contact with a curious researcher.

Hacker News 325 pts 108 comments

Inside ZCode: Silently Uploading Your Git History to the Cloud

→ read on Hacker News
Hacker News 217 pts 45 comments

ZCode, the GLM coding agent, silently uploads your Git history

→ read on Hacker News
outloudvi · Hacker News

LLM-paraphrased from the original post: https://blog.ferstar.org/en/posts/zcode-silent-workspace-sna...

philbo · Hacker News

Tangential, mildly amusing thing I noticed while implementing my own harness: GLM and particularly Deepseek are both fond of trying to read dotfiles and anything listed in your .gitignore files. I only noticed it because I have separate read scopes for project files, ignored files, dotfiles and exte

Aldipower · Hacker News

That the article cannot distinguish between the git history 'git log' and the git repository, which is meant here, tells a lot.Claude Fable uploads my git history (git log) every day to the Anthropic servers!

v3ss0n · Hacker News

Never use a Harness if it is not opensourced.DeepSeek Harness is my favorite for coding. Hermes is my favourite for Other things , followed by OpenCode (sucks at managing long running services) .Others swear by Pi.dev

tancop · Hacker News

Closed source agents are a red flag no matter if its China or America. Always use an open harness with a good reputation and enough users that someone will notice if they push malicious code like this one here. Right now that's Opencode and Pi.

// share this

// get daily digest

Top 10 dev stories every morning at 8am UTC. AI-curated. Retro terminal HTML email.