CodexLauncher is a cross-platform launcher for managing local Codex model profiles and model providers. It includes a native SwiftUI app for macOS and a Tauri app for Windows.
It is intended for people who switch between multiple Codex model backends, such as OpenAI-compatible proxies, local Ollama, LM Studio, vLLM, or other custom providers.
- macOS 14 or later
/Applications/ChatGPT.app(the current app; legacy/Applications/Codex.appis also supported)- Swift toolchain / Xcode command line tools, if building from source
- Codex CLI bundled inside the app:
/Applications/ChatGPT.app/Contents/Resources/codexDownload the latest macOS DMG or Windows installer/portable ZIP from GitHub Releases:
After downloading, open CodexLauncher-vX.Y.Z.dmg, then drag
CodexLauncher.app onto the Applications folder shortcut.
On Windows, use the NSIS setup executable for a normal per-user installation, the MSI for managed installation, or the portable ZIP to run without installing. Windows builds are currently unsigned and may show a Microsoft Defender SmartScreen warning.
Because this app is not notarized yet, macOS may block the first launch. If that happens, open System Settings -> Privacy & Security and allow the app, or right-click the app and choose Open.
Clone the repository:
git clone git@github.com:shinrali/CodexLauncher.git
cd CodexLauncherBuild and run the app:
./script/build_and_run.sh --verifyThe script builds the Swift package, creates dist/CodexLauncher.app, and opens
the app.
For a release-style binary:
./script/build_and_run.sh --releaseThe independent Tauri 2 app lives in windows-tauri/.
It keeps the same Codex profile, provider, catalog, and command-auth formats,
while using Windows-native paths, DPAPI token encryption, Store-app discovery,
and NSIS/MSI/portable ZIP packaging.
CodexLauncher keeps launcher-managed profile presets separate from Codex's base configuration:
~/.codex/codex-launcher-state.jsonStores the launcher profile list.~/.codex/<profile>.config.tomlStores Codex 0.134.0+ profile-layer files using top-level config keys.~/.codex/config.tomlPreserves existing config, writes[model_providers.*]entries, and writes the selected profile's active top-level model keys before launching ChatGPT.app.~/Library/Application Support/CodexLauncher/provider-secrets.jsonStores provider tokens by provider id with file permissions set to600.
Other sections in ~/.codex/config.toml are preserved.
Codex 0.134.0 and later no longer reads legacy [profiles.name] tables from
~/.codex/config.toml. A named profile is now a separate file:
# ~/.codex/example.config.toml
model = "gpt-5.5"
model_provider = "openai"
model_catalog_json = "/Users/me/.codex/example-models.json"CodexLauncher follows that layout by writing the matching
~/.codex/<profile>.config.toml.
For the desktop app, CodexLauncher also writes the selected profile into the
active top-level keys in ~/.codex/config.toml before launching
/Applications/ChatGPT.app:
model = "gpt-5.5"
model_provider = "openai"
model_catalog_json = "/Users/me/.codex/example-models.json"This compatibility step is required because the desktop app starts from the
active config file and does not directly pick a separate profile file.
CodexLauncher backs up ~/.codex/config.toml before changing it and preserves
non-launcher-managed sections.
The Official entry launches /Applications/ChatGPT.app without selecting a
launcher profile. It also clears launcher-managed top-level active model keys
from ~/.codex/config.toml.
Use this when you want Codex to behave like the normal installed app.
A model provider describes how Codex connects to a backend:
idThe provider id used bymodel_provider.nameHuman-readable provider name.base_urlOpenAI-compatible API base URL, such ashttp://localhost:11434/v1.env_keyEnvironment variable name used only when the provider authentication mode is explicitly set to Environment.wire_apiCurrently normalized toresponses.tokenStored in CodexLauncher's private Application Support JSON, not inconfig.toml.
Provider settings that CodexLauncher does not edit, including query_params,
http_headers, env_http_headers, and future nested provider tables, are
preserved when the provider is saved or renamed.
Example provider in ~/.codex/config.toml:
[model_providers.local-ollama]
name = "Local Ollama"
base_url = "http://127.0.0.1:11434/v1"
wire_api = "responses"For an authenticated provider:
[model_providers.proxy]
name = "OpenAI-compatible proxy"
base_url = "https://proxy.example.com/v1"
env_key = "PROXY_API_KEY"
wire_api = "responses"If you select Local Token in CodexLauncher, the token is stored in its private
local JSON file. The launcher installs a private helper under Application
Support and writes official command-backed authentication into config.toml:
[model_providers.proxy.auth]
command = "/Users/me/Library/Application Support/CodexLauncher/bin/CodexLauncherTokenHelper"
args = ["--print-provider-token", "proxy"]
timeout_ms = 5000
refresh_interval_ms = 0Codex invokes this helper when it needs the bearer token. This works even when
ChatGPT.app does not inherit environment variables from the launcher. Existing
providers with a locally stored token and env_key are migrated automatically.
For short-lived bearer tokens, Codex also supports command-backed authentication:
[model_providers.proxy]
name = "Proxy"
base_url = "https://proxy.example.com/v1"
wire_api = "responses"
[model_providers.proxy.auth]
command = "/usr/local/bin/fetch-codex-token"
args = ["--audience", "codex"]
timeout_ms = 5000
refresh_interval_ms = 300000The command must print only the bearer token to stdout. User-supplied Command
authentication cannot be combined with env_key, a locally stored token,
experimental_bearer_token, or requires_openai_auth.
A profile links a model to a provider:
Profile nameThe launcher profile id and Codex profile filename prefix.modelThe exact model slug to use.model_providerOne of the configured provider ids.model_catalog_jsonGenerated automatically from the provider id.openai_base_urlOptional override for the built-in OpenAI provider. Custom providers usually do not need this.
Example generated profile file:
model = "qwen3.6:35b-a3b"
model_provider = "local-ollama"
model_catalog_json = "/Users/me/.codex/local-ollama-models.json"- Open CodexLauncher.
- Add or select a Model Provider.
- Fill
base_url, select Local Token, and enter the provider token. - Click Save Provider.
- Add or select a Profile.
- Choose the provider in
model_provider. - Enter or fetch a model slug.
- Click Save.
- Click Run Codex.
If Codex is already running, CodexLauncher asks before closing and relaunching it with the selected profile.
The Profile editor can fetch model names from the selected provider's /models
endpoint.
Authentication lookup order:
- A user-supplied authentication command, when Command mode is selected.
- Token stored in CodexLauncher's private Application Support JSON for that provider.
- The configured
env_keyfrom the current process or login shell environment.
Fetched models are saved into the provider's model catalog JSON file under
~/.codex.
CodexLauncher writes provider-specific model catalog files such as:
~/.codex/local-ollama-models.json
~/.codex/proxy-models.json
These files let Codex show and resolve local/custom model metadata. The Model Catalog tab lets you inspect and edit the current profile's model metadata.
New local model entries use conservative tool compatibility settings:
tool_mode = "direct"shell_type = "default"apply_patch_tool_type = nullmulti_agent_version = "disabled"supports_parallel_tool_calls = falsesupports_search_tool = falseuse_responses_lite = false
The Model Catalog editor exposes these protocol-sensitive fields as menus and toggles. Code Mode, freeform apply-patch, parallel calls, search, and Responses Lite should only be enabled when the custom provider and model are known to support their corresponding request and tool formats. Restore Compatible Defaults resets these fields without replacing the model's base instructions.
Provider tokens are not written to the repository or to config.toml.
They are also not written to ~/.codex/auth.json; that file belongs to
OpenAI/ChatGPT login credential storage.
They are stored in:
~/Library/Application Support/CodexLauncher/provider-secrets.json
The containing directory is set to mode 700 and the JSON file to mode 600.
The managed token helper and its bin directory are set to mode 700. The
helper prints only the requested provider token to Codex over stdout. Existing
legacy Keychain entries are not read, migrated, or deleted automatically.
Running the app may create or update:
~/.codex/config.toml
~/.codex/codex-launcher-state.json
~/.codex/<profile>.config.toml
~/.codex/<provider>-models.json
~/Library/Application Support/CodexLauncher/provider-secrets.json
~/Library/Application Support/CodexLauncher/bin/CodexLauncherTokenHelper
~/.codex/backups/config-*.toml
Backups are created before writing ~/.codex/config.toml.
Build the signed app and drag-to-Applications DMG:
./script/package_release.shThe current app version is read from VERSION and written to
CFBundleShortVersionString and CFBundleVersion, so it appears in the macOS
About window and Finder metadata.
CodexLauncher checks the latest public GitHub Release at launch, at most once every 24 hours. You can also choose CodexLauncher > 检查更新… to run a manual check.
When an update is available, the app downloads the release DMG into
~/Library/Caches/CodexLauncher/Updates/, verifies the SHA-256 digest returned
by GitHub, and opens the disk image. Drag CodexLauncher.app to Applications
to finish installing the update.
The script creates dist/CodexLauncher-vX.Y.Z.dmg. Opening the image shows the
app alongside an Applications shortcut for drag-and-drop installation.
dist/ is intentionally ignored by Git. Upload the DMG as a GitHub Release
asset instead of committing it to the repository.
- This app prefers the current
/Applications/ChatGPT.appand falls back to the legacy/Applications/Codex.app. - Custom provider ids cannot be the reserved Codex provider ids
openai,ollama, orlmstudio. base_urlvalues are normalized on save. For example,localhost:8888becomeshttp://localhost:8888/v1.wire_apiis normalized toresponses.- The local build uses an ad-hoc signature and is not notarized.
MIT License. See LICENSE.