On September 1, 2026, Render added four words to its changelog that change the trust relationship between you and the binary that deploys your apps: usage telemetry, enabled by default. Starting with CLI v2.26.0, every render command you run reports home — which command, how long it took, whether it succeeded, what OS and architecture you run, and a stable installation UUID that ties all of it to your machine.
Render documented the payload, open-sourced the event model, and honors the DO_NOT_TRACK standard. This is not a story about a vendor sneaking spyware past its users. It is a story about a subtler question: what standard should a deploy CLI — the exact process that holds your API tokens and sees every service you touch — be held to? And does "presumed consent," disclosed once on a TTY and never in CI, clear that bar?
Here is the complete picture first, before a single paragraph of analysis:
| Render collects | Render explicitly does NOT collect |
|---|---|
Command invoked (e.g. render services list) — no arguments or flag values | Command arguments and flag values |
| Duration, exit code, completion status | Environment variable values |
| CLI version, OS, CPU architecture | Passwords, tokens, file contents |
Allow-listed env var names signaling CI (CI) or AI-agent (CLAUDECODE) context | Anything outside the documented event model |
| TTY state, output format, start timestamp | |
installation_id: a random UUID identifying your install |
And here is the off switch, because you should not have to read 2,000 words to find it:
# Per-tool opt-out
export RENDER_CLI_DISABLE_ANALYTICS=1
# Or the cross-tool standard Render honors
export DO_NOT_TRACK=1Now the part worth your attention: what this collects, how the disclosure actually works, and the one gap — CI runs send telemetry with no notice at all — that keeps this from being the model implementation it almost is.
Exactly what phones home, field by field
Before v2.26.0, Render's CLI analytics existed but hid behind a dev/test environment variable — effectively opt-in. A single pull request, titled "Make analytics opt-out instead of hiding them behind a dev / test env var," flipped the default for everyone. The release notes put it plainly: "The CLI now collects usage data on commands and performance; no sensitive data is collected."
The payload itself is genuinely restrained, and Render deserves credit for documenting every field. Each telemetry event carries 17 fields:
| Field | What it says about you |
|---|---|
command | Which subcommand ran — no args, no flag values |
duration_ms, completion_kind, exit_code | How long it took and how it ended |
cli_version, os, arch | Your toolchain and platform |
ci_signals, agent_signals | Names of allow-listed env vars only (e.g. CI, CLAUDECODE) — never values |
is_stdin_tty, is_stdout_tty, is_stderr_tty, is_term_dumb | Whether you ran interactively |
launched_full_screen_tui, output_format | Which interface you used |
started_at | RFC 3339 timestamp from your clock |
installation_id | A random UUID stored on your machine, stable across runs |
Two fields deserve a second look. installation_id is pseudonymous, not anonymous: a stable per-machine identifier means Render can reconstruct your full command history as a session, not just aggregate counts. That is how "understand common use cases" actually works in practice, and it is fine — but call it what it is. The *_signals fields are the clever bit done right: instead of shipping your environment, the CLI checks it against an allow-list and reports only the matched names, so Render learns "this ran inside an AI coding agent" without learning anything about your agent's configuration.
Best of all, you do not have to take the docs' word for it. Setting RENDER_LOG_ANALYTICS=1 makes the CLI print each telemetry event after the command completes, and the canonical event model lives in the open-source repo at pkg/client/clitelemetry/clitelemetry_gen.go. Self-inspection plus a version-controlled schema is exactly how telemetry documentation should work: the payload is a falsifiable claim, not a promise.
The off switch, exactly
Two environment variables, checked in this precedence order:
DO_NOT_TRACK=1— the cross-tool console standard, checked first.RENDER_CLI_DISABLE_ANALYTICS=1— Render's own variable.
Set either one — to 1 or true — and no events are sent. There is no config-file toggle and no per-command flag to remember: one line in your shell profile covers every invocation, including CI runners if you set it there. Note the asymmetry worth remembering for later: you have to know the switch exists before it helps you, and in CI nothing tells you.
Render's disclosure design, graded fairly
Give credit where it is due: Render built a real disclosure gate, not a changelog line and a prayer. On interactive runs, the CLI prints a notice explaining what it collects and how to opt out, once per machine, before analytics are allowed to send anything. Non-TTY runs stay suppressed until some TTY run has shown the notice and persisted the marker. A telemetry failure can never fail your command. This is thoughtful engineering, and it puts Render ahead of most of the 100-plus tools cataloged by community opt-out lists, where the telemetry is simply on and the variable is tribal knowledge.
Now the gap, found in the same source tree. CI runs bypass the notice gate entirely: no notice is shown, no marker is written, and analytics send from the very first invocation. Read that again against where deploy CLIs actually run with the most privilege. Your laptop gets a disclosure; the CI job holding a production API token, deploying on every merge, gets silence. The environment where the CLI touches the most sensitive operations with the least human supervision is the one environment guaranteed never to see the notice.
Render's own code states the philosophy without flinching. From pkg/analytics/consent.go: "Consent is presumed unless the user denies it through an opt-out mechanism — it is not a record of an affirmative opt-in." Honest. Also the entire argument against opt-out telemetry in one sentence: nobody said yes.
Why a deploy CLI is not a dashboard
None of the above would matter much for a dashboard analytics pixel. It matters for a deploy CLI for three concrete reasons.
First, the CLI holds your credentials. render login mints API tokens that live on disk; Render's docs walk you through viewing and revoking them from account settings precisely because a CLI token is a standing credential. Every telemetry event now travels from a process whose neighbor on the same machine — often the same config directory — is a token that can read and mutate your infrastructure. The payload excludes secrets today, but the telemetry endpoint is a second network destination from a credential-adjacent process, and "which destinations does this binary phone" is now a two-item list you must audit instead of one.
Second, the CLI sees everything you touch. A dashboard analytics event says somebody viewed a page. A command stream — render services list, render postgres create, render logs — is a ledger of your infrastructure operations: which services exist, when you touch the database, when deploys happen, when something is failing (exit codes and durations tell that story). Individually boring; as a timestamped per-installation series, a detailed operational diary of your team.
Third, it runs where you are not. Dashboards phone home while a human watches. Deploy CLIs run in CI at 3 a.m., inside AI coding agents (Render's own agent_signals field proves the vendor knows this), and in scripts written once and forgotten. Ambient telemetry from unattended processes is how "usage data" quietly becomes surveillance of your automation — and CI is exactly where Render skips the notice.
Some perspective: Render is following an industry pattern, not inventing one. Heroku's CLI has shipped oclif-based telemetry for years — with its own opt-out variable and enough startup-overhead complaints that the team had to optimize telemetry loading on Windows. Community projects exist solely to catalog per-tool opt-out variables across the ecosystem because "on by default, off by tribal knowledge" is the norm. Render's implementation is better-documented than most. The question is whether "better than most" is the right bar for the binary holding your deploy keys.
What a trustworthy CLI owes you — and where Render lands
For a CLI that carries deploy credentials, the standard should be opt-in: collect nothing until the user says yes, and let no credential-adjacent process phone anywhere it does not have to. Against that standard, Render fails — by its own source code's admission, consent is presumed, not granted. An opt-in prompt on first run (render login would be the natural moment: you are already making a trust decision) would have cost Render some data volume and bought something worth more: telemetry every user affirmatively chose.
For tools that insist on opt-out anyway, there is a minimum bar. Here is Render's report card:
| Requirement | Verdict |
|---|---|
| Documented payload, field by field | Pass — 17 fields, all documented |
| Open, version-controlled event model | Pass — in the public repo |
| Self-inspection mode so users can verify | Pass — RENDER_LOG_ANALYTICS=1 |
Honor the DO_NOT_TRACK standard | Pass — checked first in precedence order |
| Disclosure everywhere the CLI runs, including CI | Fail — CI bypasses the notice gate with no log line |
Four out of five, and the failing item is the one that matters most for unattended, credential-bearing runs. The fix is small: emit the notice to stderr (or a debug log) on CI runs too, or at minimum document that CI operators must set the variable explicitly. Silence in automation is not a minor edge case; for a deploy tool, automation is the main case.
The conversation this should start
Render did most of this right, and that is precisely why the case is worth studying: if a well-documented, open-source, standards-honoring implementation still ships presumed consent with a CI-shaped hole, then the ecosystem's default posture — telemetry on, opt-out by folklore — is not a standard at all. It is a habit.
If you run Render's CLI, set one of the two variables today — in your shell profile and in CI, since CI will never ask you. If you build a CLI that holds credentials, treat Render's implementation as the floor, not the ceiling: documented payload, open event model, self-inspection, DO_NOT_TRACK support — plus affirmative consent and disclosure in every environment, especially the unattended ones. The tool that can destroy your production database on a typo should not be making its own phone calls without asking first.
Building on machines you own instead? Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on infrastructure you control, with agent-friendly CLIs and APIs designed for operators who read the source. Star the repo on GitHub or deploy your first app today.



