Desktop skill picker ignores icon_small/icon_large and always renders the generic cube
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.4k
- PR merge metrics
- PR metrics pending
Description
What version of Codex is running?
- ChatGPT desktop app:
26.818.41509(build6962) - Embedded Codex CLI:
0.149.0-alpha.4.1 - Platform: macOS 26.5.2, Apple Silicon
What issue are you seeing?
The ChatGPT desktop skill picker always renders the generic cube icon for standalone and plugin skills, even when valid interface.icon_small and interface.icon_large metadata is present in agents/openai.yaml.
The metadata is loaded correctly. A forced skills/list request returns a resolved, existing absolute path, for example:
{
"name": "yeet",
"interface": {
"iconSmall": "/Users/<user>/project/.codex/skills/yeet/assets/skill-provider.png",
"iconLarge": "/Users/<user>/project/.codex/skills/yeet/assets/skill-provider.png"
},
"enabled": true
}
However, the / picker, the @ skill list, and the skill slash-command list all show the same generic skill cube.
Inspection of the shipped desktop JavaScript shows that the skill data mapper preserves interface.iconSmall, but the three list-item builders instantiate the generic skill icon directly (icon: genericSkillIcon() / Icon: genericSkillIcon()) instead of using the supplied icon path. The existing image renderer is used for apps/plugins elsewhere in the same bundle.
What steps can reproduce the bug?
-
Create a skill containing
SKILL.md,assets/provider.png, and this metadata:interface: display_name: "Provider Icon Repro" icon_small: "./assets/provider.png" icon_large: "./assets/provider.png" -
Confirm
assets/provider.pngexists and is readable. -
Run Force reload skills from the command menu, or fully restart the desktop app.
-
Open the composer and type
/or@to display the skill picker. -
Observe that the row uses the generic cube rather than
provider.png. -
Call
skills/listwithforceReload: true; observe thatinterface.iconSmallandinterface.iconLargeare correctly resolved.
What is the expected behavior?
Skill picker rows should render interface.iconSmall when it is present and valid, falling back to the generic skill icon only when no custom icon is available or loading fails.
The same behavior should apply consistently to:
- the
/skill picker; - the
@skill list; - slash-command skill results;
- inserted skill mention chips where custom icons are supported.
Additional information
- The current skills documentation describes
icon_smallandicon_largeas optional UI metadata for the ChatGPT desktop app. - Restarting and forcing a catalog reload do not change the result.
- PNG and SVG assets both reproduce the issue.
- This appears to be a presentation-layer wiring gap rather than a loader or cache problem.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by locating the desktop JavaScript skill data mapper and the three list-item builders that currently instantiate genericSkillIcon(), then compare them with the existing app/plugin image renderer. Reproduce the issue in the /, @, and slash-command pickers with a skill whose skills/list response contains iconSmall and iconLarge paths; done means valid custom icons render and unavailable icons still use the generic fallback.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- javascript
- Domain
- desktop
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 68/100