- Running direct shell commands no longer interrupts an in-flight turn; commands can execute concurrently when a turn is active. (#10513) - Added `/statusline` to configure which metadata appears in the TUI footer interactively. (#10546) - The TUI resume picker can now toggle sort order between creation time and last-updated time with an in-picker mode indicator. (#10752) - App-server clients now get dedicated APIs for steering active turns, listing experimental features, resuming agents, and opting out of specific notifications. (#10721, #10821, #10903, #11319) - Enterprise/admin requirements can now restrict web search modes and define network constraints through `requirements.toml`. (#10964, #10958) - Image attachments now accept GIF and WebP inputs in addition to existing formats. (#11237) ## Bug Fixes - Fixed a Windows startup issue where buffered keypresses could cause the TUI sign-in flow to exit immediately. (#10729) - Required MCP servers now fail fast during start/resume flows instead of continuing in a broken state. (#10902) - Fixed a file-watcher bug that emitted spurious skills reload events and could generate very large log files. (#11217) - Improved TUI input reliability: long option labels wrap correctly, Tab submits in steer mode when idle, history recall keeps cursor placement consistent, and stashed drafts restore image placeholders correctly. (#11123, #10035, #11295, #9040) - Fixed model-modality edge cases by surfacing clearer `view_image` errors on text-only models and stripping unsupported image history during model switches. (#11336, #11349) - Reduced false approval mismatches for wrapped/heredoc shell commands and guarded against empty command lists in exec policy evaluation. (#10941, #11397) ## Documentation - Expanded app-server docs and protocol references for `turn/steer`, experimental-feature discovery, `resume_agent`, notification opt-outs, and null `developer_instructions` normalization. (#10721, #10821, #10903, #10983, #11319) - Updated TUI composer docs to reflect draft/image restoration, steer-mode Tab submit behavior, and history-navigation cursor semantics. (#9040, #10035, #11295) ## Chores - Reworked npm release packaging so platform-specific binaries are distributed via `@openai/codex` dist-tags, reducing package-size pressure while preserving platform-specific installs (including `@alpha`). (#11318, #11339) - Pulled in a security-driven dependency update for `time` (RUSTSEC-2026-0009). (#10876) ## Changelog Full Changelog: https://github.com/openai/codex/compare/rust-v0.98.0...rust-v0.99.0 - #10729 fix(tui): flush input buffer on init to prevent early exit on Windows @Ashutosh0x - #10689 fix: flaky landlock @jif-oai - #10513 Allow user shell commands to run alongside active turns @jif-oai - #10738 nit: backfill stronger @jif-oai - #10246 adding fork information (UI) when forking @pap-openai - #10748 Update explorer role default model @jif-oai - #10425 Include real OS info in metrics. @iceweasel-oai - #10745 feat: resumable backfill @jif-oai - #10758 feat: wire ephemeral in `codex exec` @jif-oai - #10756 chore: handle shutdown correctly in tui @jif-oai - #10637 feat: add memory tool @jif-oai - #10751 feat: repair DB in case of missing lines @jif-oai - #10762 nit: add DB version in discrepancy recording @jif-oai - #10621 Leverage state DB metadata for thread summaries @jif-oai - #9691 Add hooks implementation and wire up to `notify` @gt-oai - #10546 feat(tui): add /statusline command for interactive status line configuration @fcoury - #10752 feat(tui): add sortable resume picker with created/updated timestamp toggle @fcoury - #10769 fix(tui): fix resume_picker_orders_by_updated_at test @owenlin0 - #10423 fix(auth): isolate chatgptAuthTokens concept to auth manager and app-server @owenlin0 - #10775 nit: gpt-5.3-codex announcement @jif-oai - #10782 nit: gpt-5.3-codex announcement 2 @jif-oai - #10711 add sandbox policy and sandbox name to codex.tool.call metrics @iceweasel-oai - #10660 chore: rm web-search-eligible header @sayan-oai - #10783 fix: announcement in prio @jif-oai - #10721 [app-server] Add a method to list experimental features. @mzeng-openai - #10787 chore: limit update to 0.98.0 NUX to < 0.98.0 ver @sayan-oai - #10655 Add analytics for /rename and /fork @pap-openai - #10790 feat: wait for backfill to be ready @jif-oai - #10693 Add app-server transport layer with websocket support @maxj-oai - #10818 other announcement @jif-oai - #10815 Sync app-server requirements API with refreshed cloud loader @xl-openai - #10820 go back to auto-enabling web_search for azure @sayan-oai - #10727 Send beta header with websocket connects @pakrym-oai - #10809 updates: use brew api for version check @magus - #10793 Add stage field for experimental flags. @mzeng-openai - #10821 feat(app-server): turn/steer API @owenlin0 - #10792 Print warning when config does not meet requirements @gt-oai - #10699 feat: expose detailed metrics to runtime metrics @apanasenko-oai - #10784 Gate app tooltips to macOS @aibrahim-oai - #10843 Log an event (info only) when we receive a file watcher event @etraut-openai - #10852 Personality setting is no longer available in experimental menu @etraut-openai - #10840 Removed the "remote_compaction" feature flag @etraut-openai - #10876 sec: fix version of `time` to prevent vulnerability @jif-oai - #10892 nit: test an @jif-oai - #10894 feat: backfill async again @jif-oai - #10902 Handle required MCP startup failures across components @jif-oai - #10851 Removed "exec_policy" feature flag @etraut-openai - #10457 Queue nudges while plan generating @charley-oai - #10822 Add app configs to config.toml @canvrno-oai - #10420 feat(network-proxy): add structured policy decision to blocked errors @viyatb-oai - #10814 fix(linux-sandbox): block io_uring syscalls in no-network seccomp policy @viyatb-oai - #10698 core: preconnect Responses websocket for first turn @joshka-oai - #10574 core: refresh developer instructions after compaction replacement history @charley-oai - #10914 chore(app-server): update AGENTS.md for config + optional collection guidance @owenlin0 - #10928 chore(app-server): add experimental annotation to relevant fields @owenlin0 - #10927 Treat compaction failure as failure state @aibrahim-oai - #10861 Support alternative websocket API @by-openai - #10826 add originator to otel @alexsong-oai - #10855 TUI/Core: preserve duplicate skill/app mention selection across submit + resume @daniel-oai - #10943 app-server: print help message to console when starting websockets server @JaviSoto - #10938 Mark Config.apps as experimental, correct schema generation issue @canvrno-oai - #10947 fix(tui): conditionally restore status indicator using message phase @sayan-oai - #10965 refactor(network-proxy): flatten network config under [network] @viyatb-oai - #10970 Fixed a flaky test @etraut-openai - #10710 Process-group cleanup for stdio MCP servers to prevent orphan process storms @etraut-openai - #10964 feat: add support for allowed_web_search_modes in requirements.toml @bolinfest - #10977 fix: use expected line ending in codex-rs/core/config.schema.json @bolinfest - #10973 Do not poll for usage when using API Key auth @etraut-openai - #10921 Show left/right arrows to navigate in tui request_user_input @charley-oai - #10988 fix: normalize line endings when reading file on Windows @bolinfest - #10903 Add resume_agent collab tool @jif-oai - #10909 Bootstrap shell commands via user shell snapshot @jif-oai - #10993 Fix flaky windows CI test @etraut-openai - #10987 Fixed a flaky Windows test that is consistently causing a CI failure @etraut-openai - #10958 feat(core): add network constraints schema to requirements.toml @viyatb-oai - #10983 app-server: treat null mode developer instructions as built-in defaults @charley-oai - #11039 feat: include state of [experimental_network] in /debug-config output @bolinfest - #11040 Simplify pre-connect @pakrym-oai - #10966 feat: enable premessage-deflate for websockets @apanasenko-oai - #9040 fix(tui): rehydrate drafts and restore image placeholders @Chriss4123 - #10824 Fallback to HTTP on UPGRADE_REQUIRED @pakrym-oai - #11028 Defer persistence of rollout file @etraut-openai - #10980 fix: remove config.schema.json from tag check @bolinfest - #11051 Gate view_image tool by model input_modalities @wiltzius-openai - #11109 [bazel] Upgrade some rulesets in preparation for enabling windows @zbarsky-openai - #11114 chore: refactor network-proxy so that ConfigReloader is injectable behavior @bolinfest - #10718 Upgrade rmcp to 0.14 @mzeng-openai - #11044 feat: include [experimental_network] in <environment_context> @bolinfest - #10994 [apps] Improve app loading. @mzeng-openai - #11121 chore: reverse the codex-network-proxy -> codex-core dependency @bolinfest - #11105 feat: include NetworkConfig through ExecParams @bolinfest - #11155 tui: avoid no-op status-line redraws @rakan-oai - #10799 feat: do not close unified exec processes across turns @jif-oai - #11172 chore: enable shell snapshot @jif-oai - #11175 fix: do not show closed agents in `/agent` @jif-oai - #11173 chore: enable sub agents @jif-oai - #11193 Deflake mixed parallel tools timing test @gt-oai - #10770 Load requirements on windows @gt-oai - #11132 core: account for all post-response items in auto-compact token checks @charley-oai - #11198 tools: remove get_memory tool and tests @jif-oai - #10937 Translate websocket errors @rasmusrygaard - #11217 Fixed bug in file watcher that results in spurious skills update events and large log files @etraut-openai - #11216 Move warmup to the task level @pakrym-oai - #11203 Try to stop small helper methods @pakrym-oai - #11197 [bazel] Upgrade some rulesets in preparation for enabling windows, part 2 @zbarsky-openai - #11158 chore: remove network-proxy-cli crate @viyatb-oai - #11230 Revert "chore: enable sub agents" @jif-oai - #11123 TUI: fix request_user_input wrapping for long option labels @charley-oai - #11133 core: add focused diagnostics for remote compaction overflows @charley-oai - #10657 feat: search_tool @apanasenko-oai - #11199 state: add memory consolidation lock primitives @jif-oai - #10835 feat: extend skills/list to support additional roots. @xl-openai - #10960 skill-creator: Remove invalid reference. @xl-openai - #11219 feat: use a notify instead of grace to close ue process @jif-oai - #11231 feat: tie shell snapshot to cwd @jif-oai - #10962 fix(tui): keep unified exec summary on working line @joshka-oai - #11232 Add originator to otel metadata tags @alexsong-oai - #11237 adding image support for gif and webp @natea-oai - #10924 [apps] Add gated instructions for Apps. @mzeng-openai - #11228 Use longest remote model prefix matching @aibrahim-oai - #11242 fix(feature) UnderDevelopment feature must be off @dylan-hurd-oai - #11185 fix: nix build by adding missing dependencies and fix outputHashes @Philipp-M - #10035 fix(tui): tab submits when no task running in steer mode @joshka-oai - #11238 Remove offline fallback for models @aibrahim-oai - #9739 Update models.json @github-actions - #11255 Revert "Update models.json" @aibrahim-oai - #11245 deflake linux-sandbox NoNewPrivs timeout @joshka-oai - #11256 Revert "Revert "Update models.json"" @aibrahim-oai - #11262 chore: change ConfigState so it no longer depends on a single config.toml file for reloading @bolinfest - #11263 test: deflake nextest child-process leak in MCP harnesses @joshka-oai - #11247 Adjust shell command timeouts for Windows @dylan-hurd-oai - #11240 fix(app-server): for external auth, replace id_token with chatgpt_acc… @owenlin0 - #11140 chore(deps): bump insta from 1.46.2 to 1.46.3 in /codex-rs @dependabot - #11139 chore(deps): bump anyhow from 1.0.100 to 1.0.101 in /codex-rs @dependabot - #11138 chore(deps): bump regex from 1.12.2 to 1.12.3 in /codex-rs @dependabot - #11239 Disable dynamic model refresh for custom model providers @etraut-openai - #11269 feat: reserve loopback ephemeral listeners for managed proxy @bolinfest - #11279 [apps] Add thread_id param to optionally load thread config for apps feature check. @mzeng-openai - #11244 feat: add SkillPolicy to skill metadata and support allow_implicit_invocation @alexsong-oai - #10215 chore(tui) cleanup /approvals @dylan-hurd-oai - #11113 feat(sandbox): enforce proxy-aware network routing in sandbox @viyatb-oai - #10940 feat: support configurable metric_exporter @alexsong-oai - #11294 chore: put crypto provider logic in a shared crate @bolinfest - #11207 feat: retain NetworkProxy, when appropriate @bolinfest - #11200 memories: add extraction and prompt module foundation @jif-oai - #11191 feat: add connector capabilities to sub-agents @jif-oai - #11304 Fix spawn_agent input type @jif-oai - #11300 feat: align memory phase 1 and make it stronger @jif-oai - #11311 Extract hooks into dedicated crate @jif-oai - #11306 feat: phase 2 consolidation @jif-oai - #11318 chore: split NPM packages @jif-oai - #11322 Fix pending input test waiting logic @jif-oai - #11265 Remove ApiPrompt @pakrym-oai - #11295 tui: keep history recall cursor at line end @joshka-oai - #11288 fix(protocol): approval policy never prompt @fouad-openai - #11323 Revert "Add app-server transport layer with websocket support (#10693)" @maxj-oai - #11162 Fix: update parallel tool call exec approval to approve on request id @shijie-oai - #11249 [apps] Improve app installation flow. @mzeng-openai - #11319 feat: opt-out of events in the app-server @jif-oai - #11241 Treat first rollout session_meta as canonical thread identity @guinness-oai - #11339 # Use `@openai/codex` dist-tags for platform binaries instead of separate package names @bolinfest - #11330 test(core): stabilize ARM bazel remote-model and parallelism tests @dylan-hurd-oai - #11345 core: remove stale apply_patch SandboxPolicy TODO in seatbelt @bolinfest - #11343 Compare full request for websockets incrementality @pakrym-oai - #11344 fix: reduce usage of `open_if_present` @jif-oai - #11336 Always expose view_image and return unsupported image-input error @aibrahim-oai - #11346 Sanitize MCP image output for text-only models @aibrahim-oai - #11337 Extract tool building @pakrym-oai - #10941 fix(core): canonicalize wrapper approvals and support heredoc prefix … @viyatb-oai - #10946 include sandbox (seatbelt, elevated, etc.) as in turn metadata header @iceweasel-oai - #11349 Strip unsupported images from prompt history to guard against model switch @aibrahim-oai - #11348 Use thin LTO for alpha Rust release builds @bolinfest - #11334 chore: unify memory job flow @jif-oai - #11364 feat: mem v2 - PR1 @jif-oai - #11365 feat: mem v2 - PR2 @jif-oai - #11366 feat: mem v2 - PR3 @jif-oai - #11274 Update models.json @github-actions - #11361 # Split command parsing/safety out of `codex-core` into new `codex-command` @bolinfest - #11369 feat: mem v2 - PR4 @jif-oai - #11362 Enable SOCKS defaults for common local network proxy use cases @viyatb-oai - #11359 ci: fall back to local Bazel on forks without BuildBuddy key @joshka-oai - #11372 feat: mem v2 - PR5 @jif-oai - #11374 feat: mem v2 - PR6 (consolidation) @jif-oai - #11377 feat: prevent double backfill @jif-oai - #11378 chore: rename codex-command to codex-shell-command @bolinfest - #11376 Update models.json @github-actions - #11394 Disable very flaky tests @pakrym-oai - #11386 Prefer websocket transport when model opts in @pakrym-oai - #11373 tui: queue non-pending rollback trims in app-event order @charley-oai - #11393 Remove `deterministic_process_ids` feature to avoid duplicate `codex-core` builds @bolinfest - #11397 fix(exec-policy) No empty command lists @dylan-hurd-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.
Use codex exec --ephemeral ... to run without persisting session rollout files to disk.
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.
If you want to contribute or inspect behavior in detail, start by reading the module-level README.md files under each crate and run the project workspace from the top-level codex-rs directory so shared config, features, and build scripts stay aligned.