The reporter documents that the Codex CLI installer registers a LaunchAgent on macOS, a systemd user unit on Linux, and a scheduled task on Windows without prompting the user or mentioning it in the quickstart. They argue developers expect CLIs to be inert until invoked, not persistent services that pull updates on their own schedule.
Argues the problem isn't auto-updaters in general — Chrome, Zoom, and Docker Desktop all ship them — but that developer CLI tools occupy a fundamentally different trust category. Running `codex --version` should not install a 24/7 resident service with network egress and file-write access under the user's account.
Reports that after running `npm rm -g @openai/codex` the background service unit was not removed and continued running. This indicates the installer registers persistence artifacts that the standard npm uninstall path does not clean up, leaving stale daemons on the system.
Found the updater had silently upgraded them past a version they had intentionally pinned for a reproducibility test. Argues this breaks a core expectation of developer tooling — that a pinned version stays pinned until the user explicitly changes it.
Points out that the daemon manifest requests network egress and file-write permissions under the user's account. On a typical developer laptop that inherits access to SSH keys, cloud credentials, `~/.aws`, and `~/.config/gcloud` — a far larger blast radius than most users would knowingly grant to a CLI tool.
On October 11, a GitHub issue (openai/codex#48195) landed on Hacker News with 313 points: the official OpenAI Codex CLI installer registers a persistent background daemon by default, with no visible prompt during install and no mention in the quickstart. The daemon starts on install, respawns on login, and silently pulls updates from OpenAI's release channel on its own schedule.
There is no "would you like to enable background updates?" step — the service is created, started, and set to auto-start as part of `npm i -g` (or the equivalent install script), and users only discover it when they go looking at `launchctl list`, `systemctl --user`, or Task Manager. The reporter walked through the artifacts: a LaunchAgent plist on macOS, a user-level systemd unit on Linux, and a scheduled task on Windows, each pointing at a Node entrypoint that stays resident, polls for new CLI versions, and replaces the binary in place.
The HN thread is where the real detail is. Multiple commenters confirmed the daemon on fresh VMs. One user noted it was still running after they uninstalled the CLI via `npm rm -g @openai/codex` — the service unit was not removed. Another found the updater had already silently upgraded them past a version they had intentionally pinned for a reproducibility test. A third pointed out that the daemon's manifest requests network egress and file-write permissions under the user's account, which on most dev laptops means it inherits SSH keys, cloud credentials, and whatever's in `~/.aws` or `~/.config/gcloud`.
The practice of shipping an auto-updating background service isn't new — Chrome does it, Zoom does it, Docker Desktop does it. What's different here is the audience: developer CLI tools are supposed to be inert until invoked, and OpenAI shipped one that behaves like a consumer app. Running `codex --version` is a very different trust model from installing a service that runs 24/7 under your user account and pulls signed-but-not-pinned binaries from a vendor.
There's a defensible version of this design. Auto-updates reduce the long tail of CVE-vulnerable installs, and a background daemon makes features like "Codex is ready in your IDE" possible without a cold-start penalty. Vercel's CLI, GitHub's `gh`, and the AWS CLI all now ship update-check mechanisms of varying aggressiveness. But those tools ask, or they check only when invoked, or they print a one-line notice and let the user run the upgrade. The Codex pattern is more aggressive than any of those, and it was shipped without a changelog entry calling it out.
The supply-chain angle is where senior engineers should pay attention. A persistent daemon with network egress, write access to its own binary, and the ability to execute on every login is a textbook description of the attack surface defenders have spent a decade trying to shrink. If OpenAI's release signing key is compromised — or if an internal build system is popped, as happened to SolarWinds and 3CX — every machine with Codex CLI installed becomes a same-day distribution target. The blast radius is whatever the user account can touch: source trees, git credentials, cloud roles via assumed identity, and any `.env` file in the home directory.
Community reaction split along predictable lines. The "this is fine, Chrome does it" camp pointed out that most developers already run dozens of auto-updating binaries. The counter — well-argued in the thread — is that developer tools opt into higher scrutiny because they run inside the trust boundary of production systems. A compromised Spotify client steals your playlist. A compromised Codex daemon steals your deploy keys.
OpenAI has not responded on the issue as of this writing. The absence of a changelog note is the part that stings most: this looks less like a deliberate product decision users were asked to accept, and more like infrastructure that leaked out of a release pipeline.
If you've installed Codex CLI, assume the daemon is running and audit it today. On macOS: `launchctl list | grep -i codex` and inspect `~/Library/LaunchAgents/`. On Linux: `systemctl --user list-units | grep codex` and check `~/.config/systemd/user/`. On Windows: `Get-ScheduledTask | Where-Object TaskName -like '*codex*'`. If you want the CLI but not the daemon, you'll need to disable the unit manually after install — there's no documented flag, and reinstalling or updating may re-enable it.
For teams, add Codex CLI to your endpoint inventory and treat it like any other auto-updating vendor agent: pin the version where possible, monitor the egress endpoint, and make sure your laptop MDM policy knows the daemon exists. Security teams running EDR will already see the process, but they probably haven't classified it, which means it'll show up as an unlabeled Node process making outbound HTTPS to an OpenAI CDN. That's exactly the shape of a thing an analyst flags at 2am.
For CI and container images, the risk is lower but non-zero. Most CI runners install the CLI fresh per job and tear down, so the daemon has no persistence. But if you've baked Codex CLI into a base image used by long-lived build hosts or dev containers, you've baked in a long-lived update channel too. Rebuild without it, or pin to a version and strip the service unit in your Dockerfile.
Expect two things in the next week. First, OpenAI will likely ship an opt-out flag and a changelog entry — the HN thread is loud enough that silence isn't an option. Second, this becomes the reference incident the next time a vendor pitches you a "lightweight background helper" with your dev CLI. The lesson isn't that auto-updates are evil; it's that developer tools are infrastructure, and infrastructure changes get announced. Shipping a daemon without telling anyone is the kind of thing you only get to do once before the community adds `--no-daemon` to its install cheat sheets permanently.
It also fills up my HD with old versions. I investigated and it took up something like 12 gigabytes in total on my system; which seems insane to me, it’s just a harness?People moan about how badly made Claude code is but Codex seems much worse on every metric
The daemon has many bugs. For example, when auto-updating, it would randomly ruin the permissions and block the goal as .git became read-only. Generally, it is extremely annoying how many bugs Codex has. I basically can't trust it to execute on any goal since it would often get blocked every fe
I’ve been using GPT models via hax[1], a bare bones harness with minimal tools on my system and have the models rely on bash for the most part the last few months. It’s been a breath of fresh air amidst all these overengineered harnesses.If I need special actions, I just make them CLI tools on my Ma
This is the same operational model as Claude Code. ls ~/.local/share/claude/versions/ ps auxww | grep "claude bg" I see a few prior versions of the Claude Code binary and several running background tasks, without any copy of Claude Code in the foreground. I regular
Top 10 dev stories every morning at 8am UTC. AI-curated. Retro terminal HTML email.
There aren't any documented settings to disable this, but there is a feature flag it currently sits behind. You can flip it in your ~/.codex/config.toml[1]: [features] daemon_auto_start = false There are also some files that it writes to in ~/.codex at startup: pid files, lock fi