### **Breaking change:** `OPENAI_API_KEY` is no longer read from the environment
API login is no longer implicit; we do not pick up `OPENAI_API_KEY` from the environment. To use an API key programmatically, run the following _once_:
```shell
codex login --api-key "your-api-key-here"
```
and this value will be stored in `CODEX_HOME/auth.json`.
The next time you run `codex`, the API key stored in `auth.json` will be used automatically.
To switch to ChatGPT login instead of using your API key, run `codex login`.
Note that `codex logout` will remove whatever login credential is stored in `auth.json` (API key or ChatGPT auth token).
### Highlights
**Introducing our newest model GPT-5-Codex**
GPT-5-Codex works faster through easy tasks and harder on complex tasks, improves on code quality, and is more steerable with AGENTS.md. [Learn More](https://openai.com/index/introducing-upgrades-to-codex/)
**Resuming old sessions**
Resuming old conversations with `codex resume` (#3537, #3625).
**Unified execution and reliability**
Unified execution improvements (#3288, #3479) and race-condition fix (#3644); include command output on timeouts (#3576); do not execute when command parses as a patch (#3382); improved sandbox timeout handling (#3435); flaky test fixes (#3596, #3564).
**Auth and login experience**
- login polish (#3632); fix issue allowing to be both logged in and using API key simultaneously (#3611); fix stray login URL characters (#3639); fix `get_auth_status` for custom providers (#3581).
**JSON-RPC and MCP**
JSON-RPC: `SetDefaultModel` and `None` clears default (#3512, #3529), `UserInfo` (#3428), `reasoning_effort` in `NewConversationResponse` (#3506); initial MCP interface and docs (#3543, #3507, #3345); standardized shell description (#3514).
**TUI onboarding and polish**
New onboarding flow and animation (#3398, #3631, #3590, #3627), consistent headers on resume (#3615, #3592), improved spacing/padding (#3469, #3471, #3472, #3474), clearer interruption and status styling (#3470), numerous UX nits addressed (#3650, #3534).
**Core platform**
Experimental automatic context compaction (#3446); expanded default sandbox (#3483); Azure Responses API workaround (#3528); preserve more item IDs in Azure (#3542); logging and clippy improvements (#3488, #3489); `just test` via nextest (#3508).
### All merged PRs
- fix: change MIN_ANIMATION_HEIGHT so show_animation is calculated correctly (#3656)
- feat: tweak onboarding strings (#3650)
- fix stray login url characters persisting in login (#3639)
- Add file reference guidelines to gpt-5 prompt (#3651)
- feat: skip animations on small terminals (#3647)
- chore: rename (#3648)
- fix: add references (#3633)
- chore: set `prerelease:true` for now (#3645)
- fix: race condition unified exec (#3644)
- feat: update splash (#3631)
- chore(deps): bump tracing-subscriber from 0.3.19 to 0.3.20 in /codex-rs (#3620)
- chore(deps): bump slab from 0.4.10 to 0.4.11 in /codex-rs (#3635)
- Login flow polish (#3632)
- Fix codex resume so flags (cd, model, search, etc.) still work (#3625)
- feat: tighten preset filter, tame storage load logs, enable rollout prompt by default (#3628)
- Show abort in the resume (#3629)
- Change animation frames (#3627)
- initial mcp add interface (#3543)
- chore: update prompts for gpt-5-code (#3624)
- feat: add reasoning level to header (#3622)
- Revert "refactor transcript view to handle HistoryCells" (#3614)
- Show the header when resuming a conversation (#3615)
- When logging in using ChatGPT, make sure to overwrite API key (#3611)
- Don't show the model for apikey (#3607)
- Fix get_auth_status response when using custom provider (#3581)
- fix: model family and apply_patch consistency (#3603)
- fix(tui): update full-auto to default preset (#3608)
- fix(core): flaky test `completed_commands_do_not_persist_sessions` (#3596)
- Skip frames files in codespell (#3606)
- Add session header to chat widget (#3592)
- Append full raw reasoning event text (#3605)
- feat: UI animation (#3590)
- Fix EventMsg Optional (#3604)
- Single branch for gpt-5-code (#3601)
- enable-resume (#3537)
- feat: update model save (#3589)
- Fix flaky windows test (#3564)
- Fix gpt-5-code model selector (#3598)
- Add per-model-family prompts (#3597)
- Include command output when sending timeout to model (#3576)
- Align user history message prefix width (#3467)
- Gate model upgrade prompt behind ChatGPT auth (#3586)
- chore: update `output_lines()` to take a struct instead of bools (#3591)
- Add spacing before queued status indicator messages (#3474)
- Handle resuming/forking after compact (#3533)
- refactor transcript view to handle HistoryCells (#3538)
- Default gpt-5-code models to experimental reasoning summaries (#3560)
- Preserve IDs for more item types in azure (#3542)
- Always request encrypted cot (#3539)
- Review Mode (Core) (#3401)
- fix: NIT None reasoning effort (#3536)
- Fix NUX UI (#3534)
- core: expand default sandbox (#3483)
- Add Azure Responses API workaround (#3528)
- if a command parses as a patch, do not attempt to run it (#3382)
- Update interruption error message styling (#3470)
- feat: context compaction (#3446)
- Add spacing before composer footer hints (#3469)
- Add spacing between dropdown headers and items (#3472)
- feat: reasoning effort as optional (#3527)
- feat: change the behavior of SetDefaultModel RPC so None clears the value. (#3529)
- standardize shell description (#3514)
- bug: fix model save (#3525)
- Add spacing to timer duration formats (#3471)
- MCP Documentation Changes Requests in Code Review (#3507)
- chore: add `just test`, which runs `cargo nextest` (#3508)
- feat: added SetDefaultModel to JSON-RPC server (#3512)
- feat: include reasoning_effort in NewConversationResponse (#3506)
- add(readme): IDE (#3494)
- Log cf-ray header in client traces (#3488)
- bug: default to image (#3501)
- feat: TUI onboarding (#3398)
- Use PlanType enum when formatting usage-limit CTA (#3495)
- Add more detailed documentation on MCP server usage (#3345)
- fix: improve `handle_sandbox_error` timeouts (#3435)
- chore: enable `clippy::redundant_clone` (#3489)
- Assign the entire gpt-5 model family same characteristics (#3490)
- Clear composer on fork (#3445)
- fix: use -F instead of -f for force=true in gh call (#3486)
- Add Compact and Turn Context to the rollout items (#3444)
- NIT unified exec (#3479)
- Simplify auth flow and reconcile differences between ChatGPT and API Key auth (#3189)
- apply-patch: sort replacements and add regression tests (#3425)
- chore: rust-release.yml should update the latest-alpha-cli branch (#3458)
- fix: add check to ensure output of `generate_mcp_types.py` matches `codex-rs/mcp-types/src/lib.rs` (#3450)
- Change forking to read the rollout from file (#3440)
- Unified execution (#3288)
- feat: add UserInfo request to JSON-RPC server (#3428)
- fix: ensure output of `codex-rs/mcp-types/generate_mcp_types.py` matches `codex-rs/mcp-types/src/lib.rs` (#3439)
- fix trampling projects table when accepting trusted dirs (#3434)
- put workspace roots in the environment context (#3375)