I am a ChatGPT Business workspace admin importing custom Codex/ChatGPT plugins from a GitHub repository through Workspace settings → Plugins → Import from GitHub.
What is the current, supported repository and manifest structure for ensuring that plugin logos display correctly and update when the GitHub source changes?
My plugins use:
.agents/plugins/marketplace.json
plugins/<plugin-name>/.codex-plugin/plugin.json
interface.logo and interface.composerIcon pointing to ./assets/*.png
- assets committed inside each plugin folder
- valid 75×75 PNG files under 10 KB
- version increments for updates
The plugins themselves, skills, and bundled apps appear correctly after import, but the custom plugin logos show as broken images in ChatGPT web, Codex, and the ChatGPT mobile app.
The existing workspace import also does not show a Refresh action, and importing the same GitHub repository again reports that it is already imported.
Questions:
- Is this the correct GitHub import structure and asset-path convention?
- Should
logo and composerIcon be separate files, or may they point to the same asset?
- How are logo changes/version updates supposed to be refreshed for an existing workspace import?
- Is there a supported way for an admin to force a re-import or refresh without deleting and recreating the plugin?
- Are skill-level
icon_small/icon_large paths in agents/openai.yaml expected to appear in the Workspace plugin page?
I am looking for the current 2026 guidance for GitHub-imported workspace plugins, especially for logo handling and update behavior.
Similar issue with Plugin Creator — custom icons appear after reordering JSON properties
I’m experiencing a similar issue with custom plugins created using OpenAI’s Plugin Creator.
The plugins themselves import and function correctly, but their custom profile icons sometimes fail to appear, even when the manifest includes valid-looking asset paths such as:
"logo": "./assets/AI_Natalia_profilpix.jpg",
"composerIcon": "./assets/AI_Natalia_profilpix.jpg",
"logoDark": "./assets/AI_Natalia_profilpix.jpg",
"composerIconDark": "./assets/AI_Natalia_profilpix.jpg"
I’ve encountered this behavior across several plugin configurations.
What I observed
-
The issue has occurred repeatedly with Plugin Creator-generated manifests.
-
Some manifests initially contained JSON syntax or structural errors, which were corrected separately.
-
In a later case, the manifest was syntactically valid, but the custom icon still failed to appear.
-
Reordering the properties in the plugin.json file to match a previously working version, then reimporting the plugin, resulted in the custom icon appearing.
-
The icon asset paths and values were preserved during that reordering.
Important qualification
I am not claiming that JSON property order should matter. According to JSON semantics, object member order should not affect the meaning of the data.
The successful import may have been caused by an implementation-specific ordering dependency, manifest reprocessing, caching, or another import-related behavior. I haven’t isolated the root cause.
Difference between the two versions
The non-working and working plugin.json files contained the same properties and values. The only intentional change was the order of the properties, which I rearranged to match a previously working plugin configuration. After reimporting the reordered version, the custom icon appeared.
Has anyone else experienced similar behavior?
It would be useful to know whether this is a known Plugin Creator/import issue or an undocumented constraint in how interface metadata is processed.
Hi @m.grabner, and welcome to the community, @juppiterDesign! Thanks for sharing these reports.
@m.grabner, the current GitHub import guide documents Plugins → Marketplaces → Sync now for updating existing imports.
@juppiterDesign, thanks for documenting the icon issue and your reordering test. The cause remains unconfirmed. If it happens again, please email support@openai.com with the affected plugin link, a screenshot, and relevant redacted manifest fields so we can review it privately.
-Sanket