Codex CLI setup
Codex CLI is a terminal coding Agent that reads, edits, and verifies code. Choose this guide if you use codex in a terminal and want its Lumoswitch configuration to remain separate from ChatGPT desktop and the Codex IDE extension. The commands pass provider settings at launch and do not modify ~/.codex/config.toml or ~/.codex/.env.
If you installed only ChatGPT desktop and do not have a codex command, use ChatGPT Desktop (Codex) setup instead.
1. Confirm that Codex CLI is installed
codex --versionIf the shell reports codex: command not found, choose one official installation method:
# Standalone installer for macOS or Linux
curl -fsSL https://chatgpt.com/codex/install.sh | sh
# Or use npm
npm install -g @openai/codex
# Or use Homebrew
brew install --cask codexOpen a new terminal and run codex --version again.
On Windows with WSL, use WSL2, run the Linux installer from inside the WSL shell, and preferably keep the repository under a Linux path such as ~/code/project instead of /mnt/c. Do not reuse a Windows-installed Codex executable; the WSL import deliberately writes its isolated CODEX_HOME inside the distribution. Codex 0.115 and later no longer support WSL1.
2. Prepare four configuration values
Replace each placeholder in the commands with the real value shown on your API configuration result:
| Placeholder | Value |
|---|---|
{{api_base_url}} | Lumoswitch API URL, normally ending in /v1 |
{{access_key}} | The API configuration's Access Key; never share it or commit it to Git |
{{model}} | The client-facing model name, not an upstream platform display name |
{{codex_model_catalog_base64}} | Capability-aware Codex model catalog, Base64 encoded |
The API configuration must enable Responses output.
3. Choose how to launch
| Mode | Best for | Local changes | Later launch |
|---|---|---|---|
| One-time launch | A quick test or occasional use | No launcher and no shared Codex setting changes | Run the one-time command again |
| Persistent use | Regular Lumoswitch use in a terminal | Native configuration + optional launcher and model catalog | Run codex |
| Remove setup | Stop using Lumoswitch in the CLI | Removes the native setup and launcher | Run plain codex afterward |
One-time launch
Run this in the project directory where you want to work:
(
set -e
LUMOSWITCH_CODEX_CATALOG="$(mktemp "${TMPDIR:-/tmp}/lumoswitch-codex-models.XXXXXX")"
trap 'rm -f "$LUMOSWITCH_CODEX_CATALOG"' EXIT
printf '%s' '{{codex_model_catalog_base64}}' | base64 --decode > "$LUMOSWITCH_CODEX_CATALOG"
chmod 600 "$LUMOSWITCH_CODEX_CATALOG"
LUMOSWITCH_CODEX_API_KEY="{{access_key}}" codex --model "{{model}}" \
-c 'model_provider="lumoswitch"' \
-c 'features.multi_agent=false' \
-c 'web_search="disabled"' \
-c "model_catalog_json=\"$LUMOSWITCH_CODEX_CATALOG\"" \
-c 'model_providers.lumoswitch.name="Lumoswitch"' \
-c 'model_providers.lumoswitch.base_url="{{api_base_url}}"' \
-c 'model_providers.lumoswitch.env_key="LUMOSWITCH_CODEX_API_KEY"' \
-c 'model_providers.lumoswitch.wire_api="responses"' \
-c 'model_providers.lumoswitch.http_headers={ "X-Lumoswitch-Agent" = "codex-v1" }' \
-c 'model_providers.lumoswitch.requires_openai_auth=false'
)The settings end when this Codex session closes. No launcher is added to the computer.
Persistent use
Persistent import stores the Access Key in an owner-only managed environment file. Use it only on a trusted personal device.
Run once in a trusted terminal:
set -e
LUMOSWITCH_ROOT="$HOME/.config/lumoswitch/agents/codex"
LUMOSWITCH_ENV="$LUMOSWITCH_ROOT/env.sh"
LUMOSWITCH_LAUNCHER="$HOME/.local/bin/lumoswitch-codex"
mkdir -p "$LUMOSWITCH_ROOT" "$(dirname "$LUMOSWITCH_LAUNCHER")"
umask 077
if [ -f "$LUMOSWITCH_LAUNCHER" ]; then
LUMOSWITCH_BACKUP="$LUMOSWITCH_LAUNCHER.backup.$(date +%Y%m%d-%H%M%S)-$$"
cp "$LUMOSWITCH_LAUNCHER" "$LUMOSWITCH_BACKUP"
chmod 600 "$LUMOSWITCH_BACKUP"
fi
LUMOSWITCH_CODEX_HOME="$LUMOSWITCH_ROOT/codex-home"
LUMOSWITCH_CODEX_CONFIG="$LUMOSWITCH_CODEX_HOME/config.toml"
LUMOSWITCH_CODEX_CATALOG="$LUMOSWITCH_ROOT/model-catalog.json"
mkdir -p "$LUMOSWITCH_CODEX_HOME"
printf '%s' '{{codex_model_catalog_base64}}' | base64 --decode > "$LUMOSWITCH_CODEX_CATALOG"
cat > "$LUMOSWITCH_CODEX_CONFIG" <<LUMOSWITCH_CONFIG_EOF
model = "{{model}}"
model_provider = "lumoswitch"
model_catalog_json = "$LUMOSWITCH_CODEX_CATALOG"
web_search = "disabled"
[features]
multi_agent = false
[model_providers.lumoswitch]
name = "Lumoswitch"
base_url = "{{api_base_url}}"
env_key = "LUMOSWITCH_CODEX_API_KEY"
wire_api = "responses"
http_headers = { "X-Lumoswitch-Agent" = "codex-v1" }
requires_openai_auth = false
LUMOSWITCH_CONFIG_EOF
cat > "$LUMOSWITCH_ENV" <<'LUMOSWITCH_ENV_EOF'
export CODEX_HOME="$HOME/.config/lumoswitch/agents/codex/codex-home"
export LUMOSWITCH_CODEX_API_KEY="{{access_key}}"
LUMOSWITCH_ENV_EOF
case "$SHELL" in
*/zsh) LUMOSWITCH_PROFILE="$HOME/.zshrc" ;;
*/bash) LUMOSWITCH_PROFILE="$HOME/.bashrc" ;;
*) LUMOSWITCH_PROFILE="$HOME/.profile" ;;
esac
touch "$LUMOSWITCH_PROFILE"
LUMOSWITCH_PROFILE_MARKER='# Lumoswitch Agent: codex'
LUMOSWITCH_SOURCE_LINE='[ -f "$HOME/.config/lumoswitch/agents/codex/env.sh" ] && . "$HOME/.config/lumoswitch/agents/codex/env.sh"'
if ! grep -Fqx "$LUMOSWITCH_SOURCE_LINE" "$LUMOSWITCH_PROFILE"; then
printf '\n%s\n%s\n' "$LUMOSWITCH_PROFILE_MARKER" "$LUMOSWITCH_SOURCE_LINE" >> "$LUMOSWITCH_PROFILE"
fi
printf '%s\n' "$LUMOSWITCH_PROFILE" > "$LUMOSWITCH_ROOT/profile-path"
cat > "$LUMOSWITCH_LAUNCHER" <<'LUMOSWITCH_LAUNCHER_EOF'
#!/usr/bin/env bash
set -e
LUMOSWITCH_ROOT="$HOME/.config/lumoswitch/agents/codex"
LUMOSWITCH_ENV="$LUMOSWITCH_ROOT/env.sh"
LUMOSWITCH_LAUNCHER="$HOME/.local/bin/lumoswitch-codex"
if [ "$1" = "--lumoswitch-clean" ]; then
if [ -f "$LUMOSWITCH_ROOT/profile-path" ]; then
LUMOSWITCH_PROFILE="$(cat "$LUMOSWITCH_ROOT/profile-path")"
if [ -f "$LUMOSWITCH_PROFILE" ]; then
LUMOSWITCH_PROFILE_MARKER='# Lumoswitch Agent: codex'
LUMOSWITCH_SOURCE_LINE='[ -f "$HOME/.config/lumoswitch/agents/codex/env.sh" ] && . "$HOME/.config/lumoswitch/agents/codex/env.sh"'
LUMOSWITCH_PROFILE_TMP="$LUMOSWITCH_PROFILE.lumoswitch.$$"
awk -v marker="$LUMOSWITCH_PROFILE_MARKER" -v source="$LUMOSWITCH_SOURCE_LINE" '$0 != marker && $0 != source' "$LUMOSWITCH_PROFILE" > "$LUMOSWITCH_PROFILE_TMP"
mv "$LUMOSWITCH_PROFILE_TMP" "$LUMOSWITCH_PROFILE"
fi
fi
if [ -d "$LUMOSWITCH_ROOT" ]; then
find "$LUMOSWITCH_ROOT" -depth \( -type f -o -type l \) -delete
find "$LUMOSWITCH_ROOT" -depth -type d -exec rmdir {} \; 2>/dev/null || true
fi
find "$(dirname "$LUMOSWITCH_LAUNCHER")" -maxdepth 1 -type f -name 'lumoswitch-codex.backup.*' -delete
rm -f "$LUMOSWITCH_LAUNCHER"
printf '%s\n' 'Lumoswitch native setup and optional launcher removed. Open a new terminal to refresh the environment.'
exit 0
fi
if [ -f "$LUMOSWITCH_ENV" ]; then . "$LUMOSWITCH_ENV"; fi
exec codex "$@"
LUMOSWITCH_LAUNCHER_EOF
chmod 600 "$LUMOSWITCH_ENV"
find "$LUMOSWITCH_ROOT" -type f -exec chmod 600 {} \;
chmod 700 "$LUMOSWITCH_LAUNCHER"
. "$LUMOSWITCH_ENV"
printf '%s\n' 'Native Lumoswitch setup saved. Future command: codex'
printf '%s\n' 'Optional maintenance launcher: ~/.local/bin/lumoswitch-codex'
codexThe command writes a dedicated Codex home and backs up an existing optional launcher before replacing it and restricts their permissions. It does not change ChatGPT desktop or Codex IDE settings. The catalog exposes only reasoning levels supported by both the model and its Lumoswitch route; models without a verified request-side control default to none. Codex's multi-agent namespace and native web search remain disabled, while standard function tools, terminal commands, and file operations remain available.
4. Launch later
After completing persistent import, run this from the project directory where you want to work:
codexIf the Access Key, API URL, or client-facing model name changes, replace the placeholders and run the persistent import command again. An already-running Codex process does not update automatically.
New sessions start at medium. Run /reasoning in the agent to select low, medium, or high; the selection applies to the current task, while a new launch returns to the medium default.
Native Windows PowerShell import
These commands run natively in Windows PowerShell without WSL and use the same connection values as the macOS/Linux templates on this page.
One-time use on Windows
& {
$ErrorActionPreference = 'Stop'
$lumoswitchConfig = Join-Path ([IO.Path]::GetTempPath()) ('lumoswitch-' + [Guid]::NewGuid().ToString('N') + '.json')
[IO.File]::WriteAllBytes($lumoswitchConfig, [Convert]::FromBase64String('{{codex_model_catalog_base64}}'))
$lumoswitchEnvironmentNames = @('LUMOSWITCH_CODEX_API_KEY')
$lumoswitchPreviousEnvironment = @{}
foreach ($lumoswitchName in $lumoswitchEnvironmentNames) {
$lumoswitchPreviousEnvironment[$lumoswitchName] = [Environment]::GetEnvironmentVariable($lumoswitchName, 'Process')
}
$lumoswitchExitCode = 0
try {
[Environment]::SetEnvironmentVariable('LUMOSWITCH_CODEX_API_KEY', '{{access_key}}', 'Process')
$lumoswitchArguments = @('--model', '{{model}}', '-c', 'model_provider="lumoswitch"', '-c', 'features.multi_agent=false', '-c', 'web_search="disabled"', '-c', ('model_catalog_json="' + $lumoswitchConfig + '"'), '-c', 'model_providers.lumoswitch.name="Lumoswitch"', '-c', 'model_providers.lumoswitch.base_url="{{api_base_url}}"', '-c', 'model_providers.lumoswitch.env_key="LUMOSWITCH_CODEX_API_KEY"', '-c', 'model_providers.lumoswitch.wire_api="responses"', '-c', 'model_providers.lumoswitch.http_headers={ "X-Lumoswitch-Agent" = "codex-v1" }', '-c', 'model_providers.lumoswitch.requires_openai_auth=false')
$lumoswitchExecutable = Get-Command 'codex.cmd' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'codex' -CommandType Application -ErrorAction Stop }
& $lumoswitchExecutable.Path @lumoswitchArguments
if ($null -ne $LASTEXITCODE) { $lumoswitchExitCode = $LASTEXITCODE }
} finally {
foreach ($lumoswitchName in $lumoswitchEnvironmentNames) {
[Environment]::SetEnvironmentVariable($lumoswitchName, $lumoswitchPreviousEnvironment[$lumoswitchName], 'Process')
}
Remove-Item -LiteralPath $lumoswitchConfig -Force -ErrorAction SilentlyContinue
}
if ($lumoswitchExitCode -ne 0) { throw 'codex exited with code ' + $lumoswitchExitCode }
}Persistent use on Windows
This command backs up existing Lumoswitch-owned files and restricts access to the configuration and launcher for the current user.
& {
$ErrorActionPreference = 'Stop'
$lumoswitchRoot = Join-Path $env:LOCALAPPDATA 'Lumoswitch\agents\codex'
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-codex.ps1'
$lumoswitchBackupSuffix = (Get-Date -Format 'yyyyMMdd-HHmmss') + '-' + $PID
function Protect-LumoswitchFile([string] $Path) {
$lumoswitchSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
& icacls.exe $Path '/inheritance:r' '/grant:r' ('*' + $lumoswitchSid + ':(F)') '*S-1-5-18:(F)' '*S-1-5-32-544:(F)' | Out-Null
if ($LASTEXITCODE -ne 0) { throw "Could not restrict access to $Path" }
}
function Install-LumoswitchFile([string] $Path, [string] $Content) {
[IO.Directory]::CreateDirectory((Split-Path -Parent $Path)) | Out-Null
if (Test-Path -LiteralPath $Path) {
$lumoswitchItem = Get-Item -LiteralPath $Path -Force
if ($lumoswitchItem.PSIsContainer -or ($lumoswitchItem.Attributes -band [IO.FileAttributes]::ReparsePoint)) {
throw "Lumoswitch refused to replace a directory or link: $Path"
}
$lumoswitchBackup = $Path + '.backup.' + $lumoswitchBackupSuffix
Copy-Item -LiteralPath $Path -Destination $lumoswitchBackup
Protect-LumoswitchFile $lumoswitchBackup
}
$lumoswitchTemporary = $Path + '.' + [Guid]::NewGuid().ToString('N') + '.tmp'
try {
[IO.File]::WriteAllText($lumoswitchTemporary, $Content, [Text.UTF8Encoding]::new($false))
Move-Item -LiteralPath $lumoswitchTemporary -Destination $Path -Force
Protect-LumoswitchFile $Path
} finally {
Remove-Item -LiteralPath $lumoswitchTemporary -Force -ErrorAction SilentlyContinue
}
}
[IO.Directory]::CreateDirectory($lumoswitchRoot) | Out-Null
$lumoswitchCodexHome = Join-Path $lumoswitchRoot 'codex-home'
$lumoswitchCatalog = Join-Path $lumoswitchRoot 'model-catalog.json'
$lumoswitchCatalogContent = [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String('{{codex_model_catalog_base64}}'))
Install-LumoswitchFile $lumoswitchCatalog $lumoswitchCatalogContent
$lumoswitchCatalogToml = $lumoswitchCatalog.Replace('\', '/')
$lumoswitchConfig = Join-Path $lumoswitchCodexHome 'config.toml'
$lumoswitchConfigContent = @'
model = "{{model}}"
model_provider = "lumoswitch"
model_catalog_json = "__LUMOSWITCH_CATALOG__"
web_search = "disabled"
[features]
multi_agent = false
[model_providers.lumoswitch]
name = "Lumoswitch"
base_url = "{{api_base_url}}"
env_key = "LUMOSWITCH_CODEX_API_KEY"
wire_api = "responses"
http_headers = { "X-Lumoswitch-Agent" = "codex-v1" }
requires_openai_auth = false
'@.Replace('__LUMOSWITCH_CATALOG__', $lumoswitchCatalogToml)
Install-LumoswitchFile $lumoswitchConfig $lumoswitchConfigContent
$lumoswitchEnvironment = [ordered]@{}
$lumoswitchEnvironment['CODEX_HOME'] = (Join-Path $lumoswitchRoot 'codex-home')
$lumoswitchEnvironment['LUMOSWITCH_CODEX_API_KEY'] = '{{access_key}}'
foreach ($lumoswitchEntry in $lumoswitchEnvironment.GetEnumerator()) {
[Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'User')
[Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'Process')
}
$lumoswitchLauncherContent = @'
param([Parameter(ValueFromRemainingArguments = $true)][string[]] $AgentArgs)
$ErrorActionPreference = 'Stop'
$lumoswitchRoot = Join-Path $env:LOCALAPPDATA 'Lumoswitch\agents\codex'
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-codex.ps1'
function Remove-LumoswitchFile([string] $Path) {
if (-not (Test-Path -LiteralPath $Path)) { return }
$lumoswitchItem = Get-Item -LiteralPath $Path -Force
if ($lumoswitchItem.PSIsContainer -or ($lumoswitchItem.Attributes -band [IO.FileAttributes]::ReparsePoint)) {
throw "Lumoswitch refused to remove a directory or link: $Path"
}
Remove-Item -LiteralPath $Path -Force
}
if ($AgentArgs.Count -gt 0 -and $AgentArgs[0] -eq '--lumoswitch-clean') {
foreach ($lumoswitchName in @('CODEX_HOME', 'LUMOSWITCH_CODEX_API_KEY')) {
[Environment]::SetEnvironmentVariable($lumoswitchName, $null, 'User')
[Environment]::SetEnvironmentVariable($lumoswitchName, $null, 'Process')
}
if (Test-Path -LiteralPath $lumoswitchRoot -PathType Container) {
$lumoswitchRootItem = Get-Item -LiteralPath $lumoswitchRoot -Force
if ($lumoswitchRootItem.Attributes -band [IO.FileAttributes]::ReparsePoint) { throw 'Lumoswitch refused to clean through a linked directory.' }
foreach ($lumoswitchFile in @(Get-ChildItem -LiteralPath $lumoswitchRoot -File -Recurse -Force)) { Remove-LumoswitchFile $lumoswitchFile.FullName }
foreach ($lumoswitchDirectory in @(Get-ChildItem -LiteralPath $lumoswitchRoot -Directory -Recurse -Force | Sort-Object FullName -Descending)) {
if ($null -eq (Get-ChildItem -LiteralPath $lumoswitchDirectory.FullName -Force | Select-Object -First 1)) { Remove-Item -LiteralPath $lumoswitchDirectory.FullName -Force }
}
if ($null -eq (Get-ChildItem -LiteralPath $lumoswitchRoot -Force | Select-Object -First 1)) { Remove-Item -LiteralPath $lumoswitchRoot -Force }
}
$lumoswitchBin = Split-Path -Parent $lumoswitchLauncher
if (Test-Path -LiteralPath $lumoswitchBin -PathType Container) {
foreach ($lumoswitchBackup in @(Get-ChildItem -LiteralPath $lumoswitchBin -Filter 'lumoswitch-codex.ps1.backup.*' -File -Force)) { Remove-LumoswitchFile $lumoswitchBackup.FullName }
}
Remove-LumoswitchFile $lumoswitchLauncher
Write-Host 'Lumoswitch native setup and optional launcher removed. Open a new terminal to refresh the environment.'
exit 0
}
$lumoswitchEnvironment = [ordered]@{}
$lumoswitchEnvironment['CODEX_HOME'] = (Join-Path $lumoswitchRoot 'codex-home')
$lumoswitchEnvironment['LUMOSWITCH_CODEX_API_KEY'] = '{{access_key}}'
foreach ($lumoswitchEntry in $lumoswitchEnvironment.GetEnumerator()) {
[Environment]::SetEnvironmentVariable($lumoswitchEntry.Key, $lumoswitchEntry.Value, 'Process')
}
$lumoswitchExecutable = Get-Command 'codex.cmd' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'codex.exe' -CommandType Application -ErrorAction SilentlyContinue }
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'codex' -CommandType Application -ErrorAction Stop }
$lumoswitchArguments = @()
& $lumoswitchExecutable.Path @lumoswitchArguments @AgentArgs
if ($null -ne $LASTEXITCODE) { exit $LASTEXITCODE }
'@
Install-LumoswitchFile $lumoswitchLauncher $lumoswitchLauncherContent
Write-Host 'Native Lumoswitch setup saved. Future command: codex'
Write-Host 'Optional maintenance launcher:' $lumoswitchLauncher
$lumoswitchExecutable = Get-Command 'codex.cmd' -CommandType Application -ErrorAction SilentlyContinue
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'codex.exe' -CommandType Application -ErrorAction SilentlyContinue }
if ($null -eq $lumoswitchExecutable) { $lumoswitchExecutable = Get-Command 'codex' -CommandType Application -ErrorAction Stop }
$lumoswitchArguments = @()
& $lumoswitchExecutable.Path @lumoswitchArguments
if ($null -ne $LASTEXITCODE -and $LASTEXITCODE -ne 0) { throw 'codex exited with code ' + $LASTEXITCODE }
}The import writes the Agent-supported persistent configuration and starts codex directly. The saved Lumoswitch maintenance script is not required to start the Agent; run it with --lumoswitch-clean when you need to restore or remove this setup.
5. Remove the Lumoswitch setup
Windows PowerShell
Exit every Lumoswitch session for this Agent, then run the command below. The optional maintenance launcher removes the managed native configuration, restores any preserved shared file, clears Lumoswitch user environment values, and removes itself.
& {
$lumoswitchLauncher = Join-Path $env:LOCALAPPDATA 'Lumoswitch\bin\lumoswitch-codex.ps1'
if (-not (Test-Path -LiteralPath $lumoswitchLauncher -PathType Leaf)) {
throw 'The optional Lumoswitch maintenance launcher is missing. Run persistent import again before cleanup.'
}
& powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File $lumoswitchLauncher --lumoswitch-clean
}macOS / Linux
Exit every running Lumoswitch Codex session, then run:
"$HOME/.local/bin/lumoswitch-codex" --lumoswitch-cleanThe one-time command scopes the Access Key, model catalog, and compatibility overrides to the Codex process, then removes the temporary catalog on exit. The command above removes the dedicated Codex home, environment hook, optional launcher, catalog, and Lumoswitch backups. It does not modify ChatGPT desktop, the Codex IDE extension, or shared files under ~/.codex.
6. Verify the connection
Use /status in Codex to check the active model and provider, then send a small request and look for it in Lumoswitch request logs.
If the request fails, confirm that:
- the API URL ends in
/v1but not/responses; - the client-facing model name matches the configuration result exactly;
- the downstream model supports the selected reasoning effort; if only higher levels fail, use
/reasoningto selectlow; - after persistent import, you opened a new terminal before running plain
codex; and - the Access Key has no extra whitespace and remains valid.
Publication fields
- Platform ID:
codex - Display name:
Codex CLI - Downstream protocol:
responses commandTemplate: copy the complete One-time launch code block from this page- Persistence strategy:
native persistentCommandTemplate: copy the complete Persistent use code block from this pagefutureCommand:codex- Sort order:
10 - Last verified:
2026-08-27
Troubleshooting
- The command still reports
codex: command not found: Codex CLI is not installed or the new terminal has not loaded its path. Makecodex --versionsucceed first. - Plain
codexdoes not use Lumoswitch: open a new terminal so the managedCODEX_HOMEenvironment is loaded, then runcodexagain. - ChatGPT desktop did not change: This is the intended isolation. Use ChatGPT Desktop + Codex CLI when both should share settings.
- Codex waits and no request log appears: Confirm that you opened a new terminal and launched
codexfrom the target project instead of keeping an old Codex process open.
References: Codex CLI, Codex on WSL, custom model providers, and Codex configuration reference.