Skip to content

feat: add brand assets and Codex interface metadata - #3

Merged
jbiskur merged 1 commit into
mainfrom
feat/brand-assets-and-codex-interface
Aug 10, 2026
Merged

feat: add brand assets and Codex interface metadata#3
jbiskur merged 1 commit into
mainfrom
feat/brand-assets-and-codex-interface

Conversation

@jbiskur

@jbiskur jbiskur commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Fixes the generic pencil icon and "Website: Unavailable" in the Codex plugin UI.

Root cause

Codex takes presentation metadata from an interface object — not from the Agent Plugins homepage field. The package shipped no interface object at all, so Codex had nothing to render and fell back to defaults.

Change

  • Usable mark from the brand kit: assets/usable-icon.svg (composer icon) and assets/usable-logo.png (600×600).
  • interface metadata under extensions["com.openai"] — the namespace the spec sanctions for client-specific data, so the portable core is untouched. Fields mirror shipped Codex plugins: display name, descriptions, developer, category, website, privacy/terms, brand colour #347cbf (the site's theme_color), icon, logo, default prompt.

URLs were resolved, not guessed: the apex domain 308-redirects to www, so everything uses https://www.usable.dev to avoid a redirect hop. /privacy and /terms confirmed 200.

Guards added

Adding assets created two new ways to ship something broken, so both are now closed:

  • assets/ added to the release-archive allowlist — the allowlist would otherwise have silently dropped it, shipping a manifest pointing at files not in the tarball.
  • The validator now checks client-extension file references: plugin-relative, contained within the plugin root, and actually present. Verified by deleting the icon and watching validation fail, rather than assuming.

Three self-tests added — missing asset, path escaping the root, namespace without a reverse domain. Suite is 18/18.

Security

Before asserting in permissions-and-data-flow.md that the SVG is inert, I audited it. It contains only <svg>, <g>, <path>, <ellipse> — no <script>, event handlers, href, xlink:href, <foreignObject>, <use>, or data: URIs.

⚠️ Needs your eyes

I could not verify this renders. Codex exposes no CLI surface for resolved interface metadata, and it writes no resolved manifest to disk — so the plugin UI is the only oracle and I can't see it.

The Codex PR that added Agent Plugins support states the inline com.openai extension is primary with .codex-plugin/plugin.json as a fallback overlay, which is why I used the inline form. Worth noting every shipped example I inspected uses the .codex-plugin file instead.

To check: reinstall and reopen the plugin detail view.

codex plugin remove usable@usable && codex plugin marketplace remove usable
codex plugin marketplace add . && codex plugin add usable@usable

If it still renders unbranded, the fallback is a .codex-plugin/plugin.json overlay. That needs care: skill discovery works today, and a malformed overlay could disturb it — so it should be added with a re-check that both skills still reach the model.

The plugin rendered in Codex with a generic pencil icon and "Website:
Unavailable". Root cause: Codex takes presentation metadata from an
`interface` object, not from the Agent Plugins `homepage` field, and the
package shipped no interface object at all.

Adds the Usable mark from the brand kit as assets/usable-icon.svg and
assets/usable-logo.png (600x600), and declares interface metadata under
extensions["com.openai"] — the namespace the spec sanctions for
client-specific data, so the portable core stays untouched. Fields mirror
what shipped Codex plugins use: display name, short/long description,
developer, category, website, privacy and terms URLs, brand colour
#347cbf (the site's theme_color), icon, logo, default prompt.

URLs resolved rather than guessed: the apex domain 308-redirects to www,
so homepage and the interface URLs use https://www.usable.dev to avoid a
redirect hop. /privacy and /terms confirmed 200.

Adding assets created two new failure modes, so both are now guarded:
- assets/ added to the release archive allowlist, since the allowlist
  would otherwise silently drop them
- the validator now checks client-extension file references are
  plugin-relative, contained within the plugin root, and actually exist.
  Verified by deleting the icon and watching validation fail. Three
  self-tests added (missing asset, path escaping root, non-reverse-domain
  namespace); suite is 18/18.

SVG audited before asserting it is safe in the security docs: it contains
only svg, g, path and ellipse elements, with no script, event handlers,
href, xlink:href, foreignObject, use, or data: URIs.

NOT VERIFIED: whether Codex reads the interface object from the inline
com.openai extension. The CLI exposes no way to inspect resolved
interface metadata, so this needs a look at the plugin UI. If it still
renders unbranded, the documented fallback is a .codex-plugin/plugin.json
overlay — which must be added carefully, because skill discovery works
today and a malformed overlay could disturb it.

Co-Authored-By: Oz <oz-agent@warp.dev>
@jbiskur
jbiskur requested a review from a team as a code owner August 8, 2026 08:25
@jbiskur
jbiskur merged commit c0ed3e5 into main Aug 10, 2026
4 checks passed
@jbiskur
jbiskur deleted the feat/brand-assets-and-codex-interface branch August 10, 2026 10:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant