openai / openai/codex

Desktop skill picker ignores icon_small/icon_large and always renders the generic cube

Open
#40,224 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

app bug skills
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 (build 6962)
  • 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?
  1. 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"
    
  2. Confirm assets/provider.png exists and is readable.

  3. Run Force reload skills from the command menu, or fully restart the desktop app.

  4. Open the composer and type / or @ to display the skill picker.

  5. Observe that the row uses the generic cube rather than provider.png.

  6. Call skills/list with forceReload: true; observe that interface.iconSmall and interface.iconLarge are 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_small and icon_large as 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.