- Headless runs now switch to device-code login automatically so sign-in works without a browser. (#8756) - TUI lets you queue messages with Tab during active turns (including /review), shows queue hints, and streams exec output inline for smoother updates. (#9077, #9122, #9138, #9194) - WebSocket transport reuses connections and supports incremental append requests to reduce streaming overhead. (#9127, #9128) - Linux sandbox can mount paths read-only to better protect files from writes. (#9112) - Default API model moved to gpt-5.2-codex. (#9188) ## Bug Fixes - Alternate-screen handling now avoids breaking Zellij scrollback and adds a config/flag to control it. (#8555) - Windows correctly prompts before unsafe commands when running with a read-only sandbox policy. (#9117) - Config.toml and rules parsing errors are reported to app-server clients/TUI instead of failing silently. (#9182, #9011) - Worked around a macOS system-configuration crash in proxy discovery. (#8954) - Invalid user image uploads now surface an error instead of being silently replaced. (#9146) ## Documentation - Published a generated JSON Schema for `config.toml` in `docs/` to validate configs. (#8956) - Documented the TUI paste-burst state machine for terminals without reliable bracketed paste. (#9020) ## Chores - Added Bazel build support plus a `just bazel-codex` helper for contributors. (#8875, #9177) ## Changelog Full Changelog: https://github.com/openai/codex/compare/rust-v0.80.0...rust-v0.81.0 - #8756 [device-auth] When headless environment is detected, show device login flow instead. @mzeng-openai - #8930 feat: first pass on clb tool @jif-oai - #8966 nit: rename session metric @jif-oai - #8969 chore: non mutable btree when building specs @jif-oai - #8968 chore: move otel provider outside of trace module @jif-oai - #8973 chore: add mcp call metric @jif-oai - #8970 chore: add approval metric @jif-oai - #8975 chore: metrics tool call @jif-oai - #8901 chore: update metrics temporality @jif-oai - #8954 Work around crash in system-configuration library @etraut-openai - #8873 fix(app-server): set originator header from initialize JSON-RPC request @owenlin0 - #8909 Add config to disable /feedback @gt-oai - #8985 chore: nuke telemetry file @jif-oai - #8986 Revert "fix(app-server): set originator header from initialize JSON-RPC request" @jif-oai - #8978 nit: rename to analytics_enabled @jif-oai - #8963 renaming: task to turn @jif-oai - #8555 fix: add tui.alternate_screen config and --no-alt-screen CLI flag for Zellij scrollback @hjanuschka - #8875 feat: add support for building with Bazel @zbarsky-openai - #8988 fix(app-server): set originator header from initialize (re-revert) @owenlin0 - #8766 fix: harden arg0 helper PATH handling @viyatb-oai - #8949 Log unhandled sse events @pakrym-oai - #8996 Add hierarchical agent prompt @pakrym-oai - #9003 Delete announcement_tip.toml @pakrym-oai - #8940 Refactor remote models tests to use TestCodex builder @aibrahim-oai - #8981 Add model provider info to /status if non-default @gt-oai - #8984 Add URL to responses error messages @gt-oai - #9008 fix: add .git to .bazelignore @bolinfest - #9010 fix: include AGENTS.md as repo root marker for integration tests @bolinfest - #8950 Label attached images so agent can understand in-message labels @charley-oai - #9032 Revert "Delete announcement_tip.toml" @jif-oai - #9018 fix: support remote arm64 builds, as well @zbarsky-openai - #8983 feat: testing harness for collab 1 @jif-oai - #9088 feat: add wait tool implementation for collab @jif-oai - #9090 feat: add close tool implementation for collab @jif-oai - #8971 add static mcp callback uri support @WhammyLeaf - #9099 nit: add docstring @jif-oai - #8994 feat: wire fork to codex cli @apanasenko-oai - #9071 chore(deps): bump tui-scrollbar from 0.2.1 to 0.2.2 in /codex-rs @dependabot - #9072 chore(deps): bump ts-rs from 11.0.1 to 11.1.0 in /codex-rs @dependabot - #9074 chore(deps): bump which from 6.0.3 to 8.0.0 in /codex-rs @dependabot - #9075 chore(deps): bump clap from 4.5.53 to 4.5.54 in /codex-rs @dependabot - #9076 chore(deps): bump tokio-util from 0.7.16 to 0.7.18 in /codex-rs @dependabot - #8957 feat: hot reload mcp servers @shijie-oai - #9107 Remove unused conversation_id header @pakrym-oai - #9080 Add some tests for image attachments @charley-oai - #9114 Extract single responses SSE event parsing @pakrym-oai - #8961 Assemble sandbox/approval/network prompts dynamically @aibrahim-oai - #9102 Add model client sessions @pakrym-oai - #8246 fix(tui): show in-flight coalesced tool calls in transcript overlay @Chriss4123 - #9127 Reuse websocket connection @pakrym-oai - #9117 fix: prompt for unsafe commands on Windows @bolinfest - #9128 Websocket append support @pakrym-oai - #9077 Send message by default mid turn. queue messages by tab @aibrahim-oai - #9049 Handle image paste from empty paste events @aibrahim-oai - #8952 Use markdown for migration screen @aibrahim-oai - #9109 Updated heuristic for tool call summary to detect file modifications @etraut-openai - #9138 Show tab queue hint in footer @aibrahim-oai - #9140 Use thread rollback for Esc backtrack @aibrahim-oai - #9143 chore: better error handling on collab tools @jif-oai - #9147 nit: collab send input cleaning @jif-oai - #9129 Support response.done and add integration tests @pakrym-oai - #8798 ollama: default to Responses API for built-ins @drifkin - #8956 add generated jsonschema for config.toml @sayan-oai - #9122 Fix queued messages during /review @charley-oai - #9126 fix: drop session span at end of the session @apanasenko-oai - #9101 Restrict MCP servers from `requirements.toml` @gt-oai - #9020 fix(tui): document paste-burst state machine @joshka-oai - #9118 feat(app-server): add an --analytics-default-enabled flag @owenlin0 - #9130 Fresh tooltips @mzeng-openai - #9134 fix(windows-sandbox-rs) bump SETUP_VERSION @dylan-hurd-oai - #9121 test(tui): add deterministic paste-burst tests @joshka-oai - #8661 Fix spinner/Esc interrupt when MCP startup completes mid-turn @2mawi2 - #9165 Allow close skill popup with esc. @xl-openai - #9169 Fix flakiness in WebSocket tests @pakrym-oai - #9011 fix: report an appropriate error in the TUI for malformed rules @bolinfest - #9166 fix: integration test for #9011 @bolinfest - #9177 feat: add bazel-codex entry to justfile @bolinfest - #9175 WebSocket test server script @pakrym-oai - #9136 Update models.json @github-actions - #9168 clean models manager @aibrahim-oai - #8933 [CODEX-4427] improve parsed commands @aibrahim-oai - #9174 Renew cache ttl on etag match @aibrahim-oai - #9124 fix(tui): harden paste-burst state transitions @joshka-oai - #9186 Use offline cache for tui migrations @aibrahim-oai - #9182 Improve handling of config and rules errors for app server clients @etraut-openai - #8997 chore: clarify default shell for unified_exec @sayan-oai - #9192 feat: add threadId to MCP server messages @bolinfest - #9188 change api default model @aibrahim-oai - #9150 feat: add sourcing of rc files to shell snapshot @jif-oai - #9155 fix: shell snapshot clean-up @jif-oai - #9146 feat: return an error if the image sent by the user is a bad image @jif-oai - #9197 feat: only source shell snapshot if the file exists @jif-oai - #9145 fix: drop double waiting header in TUI @jif-oai - #9194 Render exec output deltas inline @aibrahim-oai - #9156 chore: clamp min yield time for empty write_stdin @jif-oai - #9105 feat: add auto refresh on thread listeners @jif-oai - #9112 feat: add support for read-only bind mounts in the linux sandbox @viyatb-oai - #9179 Use current model for review @pakrym-oai
Codex CLI (Rust Implementation)
We provide Codex CLI as a standalone, native executable to ensure a zero-dependency install.
Installing Codex
Today, the easiest way to install Codex is via npm:
npm i -g @openai/codex
codex
You can also install via Homebrew (brew install --cask codex) or download a platform-specific release directly from our GitHub Releases.
Documentation quickstart
- First run with Codex? Start with
docs/getting-started.md(links to the walkthrough for prompts, keyboard shortcuts, and session management). - Want deeper control? See
docs/config.mdanddocs/install.md.
What's new in the Rust CLI
The Rust implementation is now the maintained Codex CLI and serves as the default experience. It includes a number of features that the legacy TypeScript CLI never supported.
Config
Codex supports a rich set of configuration options. Note that the Rust CLI uses config.toml instead of config.json. See docs/config.md for details.
Model Context Protocol Support
MCP client
Codex CLI functions as an MCP client that allows the Codex CLI and IDE extension to connect to MCP servers on startup. See the configuration documentation for details.
MCP server (experimental)
Codex can be launched as an MCP server by running codex mcp-server. This allows other MCP clients to use Codex as a tool for another agent.
Use the @modelcontextprotocol/inspector to try it out:
npx @modelcontextprotocol/inspector codex mcp-server
Use codex mcp to add/list/get/remove MCP server launchers defined in config.toml, and codex mcp-server to run the MCP server directly.
Notifications
You can enable notifications by configuring a script that is run whenever the agent finishes a turn. The notify documentation includes a detailed example that explains how to get desktop notifications via terminal-notifier on macOS. When Codex detects that it is running under WSL 2 inside Windows Terminal (WT_SESSION is set), the TUI automatically falls back to native Windows toast notifications so approval prompts and completed turns surface even though Windows Terminal does not implement OSC 9.
codex exec to run Codex programmatically/non-interactively
To run Codex non-interactively, run codex exec PROMPT (you can also pass the prompt via stdin) and Codex will work on your task until it decides that it is done and exits. Output is printed to the terminal directly. You can set the RUST_LOG environment variable to see more about what's going on.
Experimenting with the Codex Sandbox
To test to see what happens when a command is run under the sandbox provided by Codex, we provide the following subcommands in Codex CLI:
# macOS
codex sandbox macos [--full-auto] [--log-denials] [COMMAND]...
# Linux
codex sandbox linux [--full-auto] [COMMAND]...
# Windows
codex sandbox windows [--full-auto] [COMMAND]...
# Legacy aliases
codex debug seatbelt [--full-auto] [--log-denials] [COMMAND]...
codex debug landlock [--full-auto] [COMMAND]...
Selecting a sandbox policy via --sandbox
The Rust CLI exposes a dedicated --sandbox (-s) flag that lets you pick the sandbox policy without having to reach for the generic -c/--config option:
# Run Codex with the default, read-only sandbox
codex --sandbox read-only
# Allow the agent to write within the current workspace while still blocking network access
codex --sandbox workspace-write
# Danger! Disable sandboxing entirely (only do this if you are already running in a container or other isolated env)
codex --sandbox danger-full-access
The same setting can be persisted in ~/.codex/config.toml via the top-level sandbox_mode = "MODE" key, e.g. sandbox_mode = "workspace-write".
Code Organization
This folder is the root of a Cargo workspace. It contains quite a bit of experimental code, but here are the key crates:
core/contains the business logic for Codex. Ultimately, we hope this to be a library crate that is generally useful for building other Rust/native applications that use Codex.exec/"headless" CLI for use in automation.tui/CLI that launches a fullscreen TUI built with Ratatui.cli/CLI multitool that provides the aforementioned CLIs via subcommands.