Plugins from built-in marketplace are deleted after restart — marketplace source not persisted to config.toml
Environment
- Codex Desktop on macOS (arm64)
- config.toml:
~/.codex/config.toml
Steps to reproduce
- Open Codex Plugin UI (Plugins tab)
- Install any plugin from the built-in marketplace (e.g., Build Web Apps, Sentry, Superpowers)
- Verify plugin appears in plugins cache at
~/.codex/plugins/cache/openai-api-curated/ - Restart Codex
- Observe: the plugin disappears from cache and is no longer available
Root cause
When plugins are installed through the UI, they are downloaded to ~/.codex/plugins/cache/openai-api-curated/<plugin-name>/, but no corresponding marketplace entry is written to ~/.codex/config.toml.
`openai-curated is a reserved marketplace name that cannot be added via CLI (codex plugin marketplace add https://github.com/openai/plugins` fails with "marketplace 'openai-curated' is reserved").
On restart, the plugin sync process finds cached plugins without a valid marketplace source in config.toml and cleans them up as orphans.
Affected marketplaces
openai-curated-remote(binance, data-analytics, figma, github, openai-developers)openai-api-curated(build-web-apps, build-web-data-visualization, circleci, coderabbit, codex-security, sentry, superpowers, mixpanel-headless, etc.)
Expected behavior
Plugins installed through the UI should persist across restarts. The marketplace source should be written to config.toml (or an equivalent persistence mechanism) at install time.
Workaround
- Plugins from standalone GitHub repos (e.g., agentmemory, circleci-public/skills) work fine when registered via
codex plugin marketplace add - The 5 plugins from
openai-curated-remotecan be manually pinned by editing config.toml directly:
[marketplaces."openai-curated"]
source_type = "git"
source = "https://github.com/openai/plugins"
[plugins."github@openai-curated"]
enabled = true
- However,
openai-api-curatedplugins have no individual GitHub repos and cannot be registered this way. They can only be re-added via the UI after each restart.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗