Files
LEDMatrix/docs/PLUGIN_CUSTOM_ICONS.md
T
ChuckandClaude Opus 5.5 7eb7a58d0c fix: web UI and src.common bugs (wifi wrong-password, plugin icon, starlark toggle, API caching, scroll/logo/font helpers) (#646)
- wifi: keep the "wrong_password:" prefix through the restore/AP fallback so
  the UI's incorrect-password prompt fires again.
- /plugins/installed returns the manifest's icon (string only).
- /starlark/apps/<id>/toggle coerces `enabled` and delegates to
  _toggle_starlark_app (disk before memory, no KeyError, "false" is false).
- /api/v3/ JSON GETs are sent Cache-Control: no-store; non-JSON keeps 5s.
- ScrollHelper.set_scrolling_image converts non-RGB input (alpha onto black);
  create/set_scrolling_image reset last_update_time like reset_scroll.
- LogoHelper backs off a failed download per path for
  MISSING_LOGO_RECHECK_SECONDS; cleared on invalidate/clear_cache.
- refresh_placeholder_timestamp saves atomically.
- FontManager.clear_cache / _clear_plugin_font_cache bump cache_generation.
- Odds manager: per-game logs to DEBUG; JSON decode error caught before
  RequestException (same cooldown).
- element_style mangled continuations; startup validator skips null plugin
  blocks and reuses the controller's discovery.
- src/common/README lists frame_timing, json_body, render_gate.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 08:26:05 -04:00

2.0 KiB

Plugin Custom Icons Guide

Overview

A plugin can name an icon for its tab in the web interface's second nav row (next to Plugin Manager) with the icon field in manifest.json.

GET /api/v3/plugins/installed passes the manifest's icon through (a non-string value comes back as null), and a plugin without one gets the default puzzle piece.

Font Awesome classes only

icon is used verbatim as the CSS class of an <i> element (iconEl.className = plugin.icon || 'fas fa-puzzle-piece' in web_interface/static/v3/js/app-shell.js and the same fallback in app-early.js). So it must be a Font Awesome class string. Emoji, image paths and URLs are not supported: they would end up as a meaningless class name and render nothing.

The web interface bundles Font Awesome Free 6 (web_interface/static/v3/vendor/fontawesome/), so any free fas, far or fab icon works.

{
  "id": "my-plugin",
  "name": "Weather Display",
  "icon": "fas fa-cloud-sun"
}

Some common choices:

  • Clock / calendar: fas fa-clock, fas fa-calendar-alt
  • Weather: fas fa-cloud-sun, fas fa-cloud-rain
  • Sports: fas fa-football-ball, fas fa-basketball-ball, fas fa-trophy
  • Music: fas fa-music, fas fa-headphones
  • Finance: fas fa-chart-line, fas fa-dollar-sign
  • News: fas fa-newspaper, fas fa-rss
  • Games: fas fa-gamepad, fas fa-dice

Browse the rest in the Font Awesome gallery (filter to Free, version 6).

Default

With no icon (or an empty one) the tab shows fas fa-puzzle-piece.

Troubleshooting

  1. Check the class name against the Font Awesome 6 Free gallery; a Pro-only or misspelled class renders as a blank space.
  2. Include the style prefix (fas, far or fab) as well as the icon class.
  3. The manifest is re-read on each plugin list load; reload the page after editing icon.