- 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
npm i -g @openai/codex
or brew install --cask codex
Codex CLI is a coding agent from OpenAI that runs locally on your computer.
If you want Codex in your code editor (VS Code, Cursor, Windsurf), install in your IDE.
If you are looking for the cloud-based agent from OpenAI, Codex Web, go to chatgpt.com/codex.
Quickstart
Installing and running Codex CLI
Install globally with your preferred package manager:
# Install using npm
npm install -g @openai/codex
# Install using Homebrew
brew install --cask codex
Then simply run codex to get started.
You can also go to the latest GitHub Release and download the appropriate binary for your platform.
Each GitHub Release contains many executables, but in practice, you likely want one of these:
- macOS
- Apple Silicon/arm64:
codex-aarch64-apple-darwin.tar.gz - x86_64 (older Mac hardware):
codex-x86_64-apple-darwin.tar.gz
- Apple Silicon/arm64:
- Linux
- x86_64:
codex-x86_64-unknown-linux-musl.tar.gz - arm64:
codex-aarch64-unknown-linux-musl.tar.gz
- x86_64:
Each archive contains a single entry with the platform baked into the name (e.g., codex-x86_64-unknown-linux-musl), so you likely want to rename it to codex after extracting it.
Using Codex with your ChatGPT plan
Run codex and select Sign in with ChatGPT. We recommend signing into your ChatGPT account to use Codex as part of your Plus, Pro, Team, Edu, or Enterprise plan. Learn more about what's included in your ChatGPT plan.
You can also use Codex with an API key, but this requires additional setup.
Docs
This repository is licensed under the Apache-2.0 License.
