A local customization of the Codex Desktop model selector, with verified Windows support and an experimental macOS build path.
This project turns Codex's compact model selector into a clearer and faster interface: model variants in tabs, the native reasoning slider with model-matched thumb emoji, model-specific animated colors, Fast mode β‘ with slider glow, Ultimate power glow π₯ on max, per-model effort memory, a settings button, and an automatically grouped model menu.
The project does not redistribute Codex or replace the official installation. It generates a local portable copy from the Codex installation already on your computer.
Recording.2026-08-19.083152.mp4
βΆοΈ Click the poster or link above to play 22s demo β tabs, β‘ Fast particle stream, π₯ MAX glow.
Drag to MAX β Range glows π₯, thumb pulses, burst fires. Toggle β‘ Fast β slider re-tints. Tabs switch model families β effort is remembered per exact model.
The β button opens the available model families, such as 5.6, 5.5, 5.4, and 5.3 Codex Spark. Variants remain in the top row, so the model menu does not duplicate Sol, Terra, Luna, or Mini.
- Uses Codex Desktop's native model-power slider component (
Yms+impl-DQ1U0Spg.jsβ tracks, ticks, bursts all tinted via--a). - Reads reasoning efforts from the real Codex model catalog.
- Shows model variants only when they actually exist.
- Displays a fixed
Fulltab for a family with no selectable variant. - Groups the model menu automatically by model family.
- Recolors the Ultra animation using the active model family's color while preserving the native slider animation.
- Fast mode β‘ β fully wired (forwards
serviceTierOptionsthroughYhs β _hs, togglesltr(f)βYms phase:activeparticle stream). - Ultimate power response π₯ β rightmost slider position triggers a quick accent flash, icon overshoot, and native MaxBurst.
- Ultra + Fast danger shake β the slider assembly shakes only while both maximum power and Fast mode are active, with a reduced-motion fallback.
- Model-matched thumb β the entire slider thumb becomes βοΈ for Sol, π for Terra, π for Luna, or π as the fallback.
- Per-model effort memory β remembers the last reasoning effort per exact
gpt-*model inlocalStorage. - Keeps Fast mode in the same row as the model variants.
- Renders the model menu above the interface through the host build's React DOM portal to avoid clipping and z-index issues.
- Creates a separate local copy while leaving the official installation untouched β auto-rebuilds on Store update via
Launch Codex Native Selector.ps1.
flowchart LR
A[Official Codex installation] --> B[Local app.asar]
B --> C[Temporary extraction]
C --> D[Targeted bundle patch]
D --> E[Portable app.asar]
E --> F[Customized native selector]
F --> G[Real Codex catalog and efforts]
The patch only targets the selector bundle and preserves the original application structure, components, events, and backend. The rest of the application is copied without modification.
- Windows 10 or 11 for verified support.
- macOS 12 or newer for the experimental macOS build path.
- Codex Desktop installed officially.
- Node.js 22.12 or newer (tested on 24.9.0).
- Codex fully closed while building and launching.
A macOS builder is included, but current macOS builds are not covered by CI or end-to-end verification. The repository contains a tested legacy 26.707 split-bundle profile; treat this path as experimental and validate the generated app locally.
The official macOS bundle is currently installed as /Applications/ChatGPT.app, even though it identifies itself as Codex. The builder also detects older /Applications/Codex.app installations.
Clone the repository and install the dependencies:
git clone https://github.com/Mirochill/codex-native-selector.git
cd codex-native-selector
npm installBuild the customized app:
./tools/build-macos.shTo use a nonstandard installation or output path, pass both explicitly:
./tools/build-macos.sh "/Applications/ChatGPT.app" \
"$HOME/Applications/Codex Native Selector.app"The default output is ~/Applications/Codex Native Selector.app. The script extracts and patches a temporary copy, updates Electron's ASAR integrity digest, disables Sparkle updates for the copy, and ad-hoc signs the finished bundle. The official app is not modified. Avoid iCloud Drive and other File Provider destinations because they can attach metadata that invalidates a local app signature.
Quit the official Codex app, then launch:
open "$HOME/Applications/Codex Native Selector.app"The official and customized copies must not run at the same time because they use the same Codex profile and bundle identity.
PowerShell is required in addition to the common requirements above.
git clone https://github.com/Mirochill/codex-native-selector.git
Set-Location .\codex-native-selector
npm installpowershell.exe -NoProfile -ExecutionPolicy Bypass `
-File .\tools\build-portable.ps1The builder detects the newest installed Microsoft Store package and extracts its archive automatically. The result is generated in:
outputs\Codex-Native-Selector\
Close official Codex, including its tray icon in the Windows notification area, then launch:
outputs\Codex-Native-Selector\Launch Codex Native Selector.cmd
The official and customized copies must not run at the same time because they use the same local Codex environment. The launcher checks the installed Store version on every start and rebuilds the portable copy automatically when Codex has updated.
Verified against Codex 26.803.5235.0 and 26.803.10989.0 from the Microsoft Store on Windows. Current builds are located semantically from stable model-picker message IDs, component prop contracts, React relationships, and CSS-module class families. Renamed minified symbols and hashed asset filenames are inferred automatically. Exact compatibility profiles remain as a fallback for older layouts.
The macOS path has a dedicated legacy Codex 26.707 split-bundle profile and unit coverage, but no current macOS archive has been verified end-to-end. macOS support is experimental, not a current compatibility guarantee.
Discovery is intentionally fail-closed: the builder patches only when one complete selector graph and one complete slider class family are found. Ambiguous or incomplete matches stop with a diagnostic instead of modifying a guessed function.
The Codex frontend bundle can change its filenames or structure after an update. Rebuild from the new installation:
On macOS, quit Codex and rerun:
./tools/build-macos.shOn Windows, close Codex fully and use the generated launcher. It detects the newest Store package and rebuilds automatically. You can also rerun tools\build-portable.ps1 manually.
If semantic discovery reports an incomplete selector graph, Codex changed a behavioral contract rather than only renaming or rehashing the bundle. Update the relevant semantic invariant in tools/semantic-selector-profile.mjs; do not weaken the one-graph safety check.
The builder discovers hashed assets, minified component names, JSX runtimes, hooks, slider components, Fast/Standard predicates and icons, wrapper prop aliases, catalog functions, and React DOM portals automatically. Version-specific mappings in tools/selector-compatibility.mjs provide fallback support for older builds. Both paths are covered by npm run check.
| Area | Benefit |
|---|---|
| No Codex fork | The project does not maintain a complete copy of the application. |
| No reinstallation | The copy is rebuilt from Codex already installed locally. |
| Official installation preserved | The installed app or Microsoft Store package is not overwritten. |
| Native components | The slider, its events, and model behavior remain Codex components. |
| Dynamic catalog | Models and reasoning efforts come from Codex's real configuration. |
| Targeted maintenance | The patch focuses on one frontend bundle. |
- This is not an official plugin: Codex Desktop does not expose a public API for replacing its native UI with a plugin.
- Windows is the verified target; the macOS builder is experimental and may need a platform-specific profile after an update.
- A Codex update that changes the selector's behavioral contracts may still require a semantic-discovery update.
- The macOS copy is ad-hoc signed for local use because changing
app.asarinvalidates the official signature. It is not a distributable or notarized build. - The official archive is not included on GitHub because of its size, redistribution concerns, and software ownership.
- The project does not bypass authentication, account limits, or service rules.
- The official instance must be closed before launching the customized copy.
- Available models still depend on the user's account, plan, and Codex backend.
Make sure that app.asar was extracted from the currently installed Codex version, then rebuild the copy. An old extracted archive may contain incompatible chunk names.
Quit Codex from the Windows notification-area icon. Closing only the main window may leave the background process running.
On macOS, quit Codex with Command+Q before opening the customized copy.
Rebuild it locally from the official installation, then verify the local signature:
codesign --verify --deep --strict "$HOME/Applications/Codex Native Selector.app"Do not copy a customized app built on another Mac. The generated bundle is intentionally ad-hoc signed for the machine that built it.
Rebuild from the newest official archive. This project does not manufacture a model list: it reuses the catalog exposed by Codex.
Run npm run check, extract app.asar from the current official installation, and rebuild. React error 130 usually means a discovered symbol did not resolve to a renderable component. Inspect the semantic diagnostic and update tools/semantic-selector-profile.mjs; do not map JSX targets to JSX-runtime or lazy-loader objects.
Close the customized copy, then launch Codex from the Start menu. No uninstall or file restoration is required.
docs/
βββ demo.mp4 # 22s screen capture β tabs, Fast, MAX glow
βββ demo-poster.jpg # Video poster frame
tools/
βββ build-portable.ps1 # Copies the local installation and creates the launcher
βββ build-macos.sh # Builds and ad-hoc signs a separate macOS app bundle
βββ build-inplace-asar.mjs # Applies the targeted app.asar patch (handles a/i advanced view lock)
βββ semantic-selector-profile.mjs # Infers the current selector graph and CSS class family
βββ selector-compatibility.mjs # Semantic discovery entrypoint plus exact legacy fallbacks
βββ selector-v2.js.txt # Customized selector component (tabs, Fast, MAX glow, effort memory)
README.md
LICENSE
.gitignore
package.json
The outputs/, work/asar-extracted/, and generated archives are ignored by Git so that a full Codex copy, local profile, or personal data cannot be published accidentally.
The scripts and customization code in this repository are distributed under the MIT License.
Codex Desktop, its components, resources, and models remain the property of their respective owners. This community project is not affiliated with or endorsed by OpenAI.