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

Open 💬 1 comment Opened Aug 23, 2026 by ardjo-s

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:

``yaml
interface:
display_name: "Provider Icon Repro"
icon_small: "./assets/provider.png"
icon_large: "./assets/provider.png"
``

  1. Confirm assets/provider.png exists and is readable.
  2. Run Force reload skills from the command menu, or fully restart the desktop app.
  3. Open the composer and type / or @ to display the skill picker.
  4. Observe that the row uses the generic cube rather than provider.png.
  5. 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.

View original on GitHub ↗

1 Comment

ardjo-s · 5 days ago

Additional implementation detail from build 26.818.41509: the existing small-icon renderer already accepts a skill object or explicit iconSmall, basePath, and fallback options. The missing wiring is limited to three builders: the @ mention skill item, the / skill picker item, and the slash-command skill result; each currently instantiates the generic cube directly. A proof-of-concept swapping those three calls for the existing renderer validated the data path. This needs to ship in the signed desktop bundle: app.asar is part of the macOS resource seal, so mutating it locally is not a safe workaround.