Lumoswitch Docs

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 --version

If 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 codex

Open 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:

PlaceholderValue
{{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

ModeBest forLocal changesLater launch
One-time launchA quick test or occasional useNo launcher and no shared Codex setting changesRun the one-time command again
Persistent useRegular Lumoswitch use in a terminalNative configuration + optional launcher and model catalogRun codex
Remove setupStop using Lumoswitch in the CLIRemoves the native setup and launcherRun 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'
codex

The 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:

codex

If 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-clean

The 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 /v1 but 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 /reasoning to select low;
  • 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 page
  • futureCommand: 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. Make codex --version succeed first.
  • Plain codex does not use Lumoswitch: open a new terminal so the managed CODEX_HOME environment is loaded, then run codex again.
  • 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 codex from the target project instead of keeping an old Codex process open.

References: Codex CLI, Codex on WSL, custom model providers, and Codex configuration reference.

On this page