Theme importer rejects custom codeThemeId values unless they match dropdown IDs
What version of the Codex App are you using (From “About Codex” dialog)?
Codex for macOS Version: 26.311.21342 Build: 993
What subscription do you have?
ChatGPT Plus
What platform is your computer?
Darwin 25.3.0 arm64 arm
What issue are you seeing?
The Codex macOS theme importer appears to validate codeThemeId against the list of built-in code themes shown in the theme dropdown.
If codeThemeId is not one of those IDs (for example matrix, everforest, gruvbox, etc.), the import cannot proceed even when the theme payload is otherwise valid.
When using a custom codeThemeId, the “Import theme” button remains disabled.
However, the exact same payload imports successfully when codeThemeId is replaced with one of the existing dropdown values.
This prevents importing a fully custom theme identifier even though the rest of the schema is valid.
Example payload that fails:
codex-theme-v1:{"codeThemeId":"custom","theme":{"accent":"#597859","contrast":40},"variant":"dark"}
The same payload works when using an existing ID:
codex-theme-v1:{"codeThemeId":"matrix","theme":{"accent":"#597859","contrast":40},"variant":"dark"}
What steps can reproduce the bug?
- Open Codex on macOS
- Go to Theme settings
- Click Import
- Paste a valid theme payload with a new
codeThemeIdthat does not exist in the dropdown - Attempt to import the theme
Result: the Import button remains disabled.
If the same payload is used with an existing codeThemeId such as matrix, the import succeeds.
What is the expected behavior?
The importer should validate the theme payload schema rather than restricting codeThemeId to existing dropdown values.
A valid theme payload with a new codeThemeId should import successfully and become selectable for the corresponding variant.
Additional information
This appears to be caused by codeThemeId being validated against a fixed list of built-in theme IDs (likely the same list used to populate the dropdown) instead of validating only the theme schema.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗