Files
LEDMatrix/docs/PLUGIN_CUSTOM_ICONS.md
Chuck a62d4529fb docs: flag aspirational/regressed features in plugin docs
These docs describe features that exist as documented in the doc but
either never wired up or regressed when v3 shipped. Each gets a clear
status banner so plugin authors don't waste time chasing features that
don't actually work.

FONT_MANAGER.md
- The "For Plugin Developers / Plugin Font Registration" section
  documents adding a "fonts" block to manifest.json that gets
  registered via FontManager.register_plugin_fonts(). The method
  exists at src/font_manager.py:150 but is **never called from
  anywhere** in the codebase (verified: zero callers). A plugin
  shipping a manifest "fonts" block has its fonts silently ignored.
  Added a status warning and a note about how to actually ship plugin
  fonts (regular files in the plugin dir, loaded directly).

PLUGIN_IMPLEMENTATION_SUMMARY.md
- Added a top-level status banner.
- Architecture diagram referenced src/plugin_system/registry_manager.py
  (which doesn't exist) and listed plugins/ as the install location.
  Replaced with the real file list (plugin_loader, schema_manager,
  health_monitor, operation_queue, state_manager) and pointed at
  plugin-repos/ as the default install location.
- "Dependency Management: Virtual Environments" — verified there's no
  per-plugin venv. Removed the bullet and added a note that plugin
  Python deps install into the system Python environment, with no
  conflict resolution.
- "Permission System: File Access Control / Network Access /
  Resource Limits / CPU and memory constraints" — none of these
  exist. There's a resource_monitor.py and health_monitor.py for
  metrics/warnings, but no hard caps or sandboxing. Replaced the
  section with what's actually implemented and a clear note that
  plugins run in the same process with full file/network access.

PLUGIN_CUSTOM_ICONS.md and PLUGIN_CUSTOM_ICONS_FEATURE.md
- The custom-icon feature was implemented in the v2 web interface
  via a getPluginIcon() helper in templates/index_v2.html that read
  the manifest "icon" field. When the v3 web interface was built,
  that helper wasn't ported. Verified in
  web_interface/templates/v3/base.html:515 and :774, plugin tab
  icons are hardcoded to `fas fa-puzzle-piece`. The "icon" field in
  plugin manifests is currently silently ignored (verified with grep
  across web_interface/ and src/plugin_system/ — zero non-action-
  related reads of plugin.icon or manifest.icon).
- Added a status banner to both docs noting the regression so plugin
  authors don't think their custom icons are broken in their own
  plugin code.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 09:39:46 -04:00

8.8 KiB
Raw Blame History

Plugin Custom Icons Guide

⚠️ Status: the icon field in manifest.json is currently not honored by the v3 web interface. Plugin tab icons are hardcoded to fas fa-puzzle-piece in web_interface/templates/v3/base.html:515 and :774. The icon field was originally read by a getPluginIcon() helper in the v2 templates, but that helper wasn't ported to v3. Setting icon in a manifest is harmless (it's just ignored) so plugin authors can leave it in place for when this regression is fixed.

Tracking issue: see the LEDMatrix repo for the open ticket.

Overview

Plugins can specify custom icons that appear next to their name in the web interface tabs. This makes your plugin instantly recognizable and adds visual polish to the UI.

Icon Types Supported

The system supports three types of icons:

The web interface uses Font Awesome 6, giving you access to thousands of icons.

Example:

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

Common Font Awesome Icons:

  • Clock: fas fa-clock
  • Weather: fas fa-cloud-sun, fas fa-cloud-rain
  • Calendar: fas fa-calendar, fas fa-calendar-alt
  • Sports: fas fa-football-ball, fas fa-basketball-ball
  • Music: fas fa-music, fas fa-headphones
  • Finance: fas fa-chart-line, fas fa-dollar-sign
  • News: fas fa-newspaper, fas fa-rss
  • Settings: fas fa-cog, fas fa-sliders-h
  • Timer: fas fa-stopwatch, fas fa-hourglass
  • Alert: fas fa-bell, fas fa-exclamation-triangle
  • Heart: fas fa-heart, far fa-heart (outline)
  • Star: fas fa-star, far fa-star (outline)
  • Image: fas fa-image, fas fa-camera
  • Video: fas fa-video, fas fa-film
  • Game: fas fa-gamepad, fas fa-dice

Browse all icons: Font Awesome Icon Gallery

2. Emoji Icons (Fun & Simple)

Use any emoji character for a colorful, fun icon.

Example:

{
  "id": "hello-world",
  "name": "Hello World",
  "icon": "👋"
}

Popular Emojis:

  • Time: 🕐 ⏱️ ⏲️
  • Weather: ☀️ 🌤️ 🌧️ ⛈️ 🌩️ ❄️
  • Sports: 🏀 🏈 🎾 🏐
  • Music: 🎵 🎶 🎸 🎹 🎤
  • Money: 💰 💵 💴 💶 💷
  • Calendar: 📅 📆
  • News: 📰 📻 📡
  • Fun: 🎮 🎲 🎯 🎨 🎭
  • Nature: 🌍 🌎 🌏 🌳 🌺 🌸
  • Food: 🍕 🍔 🍟 🍦 🍰

3. Custom Image URLs (Advanced)

Use a custom image file for ultimate branding.

Example:

{
  "id": "my-plugin",
  "name": "My Plugin",
  "icon": "/plugins/my-plugin/icon.png"
}

Requirements:

  • Image should be 16x16 to 32x32 pixels
  • Supported formats: PNG, SVG, JPG, GIF
  • Can be a relative path, absolute path, or external URL
  • SVG recommended for best quality at any size

How to Add an Icon

Step 1: Choose Your Icon

Decide which type suits your plugin:

  • Font Awesome: Professional, consistent with UI
  • Emoji: Fun, colorful, no setup needed
  • Custom Image: Unique branding, requires image file

Step 2: Add to manifest.json

Add the icon field to your plugin's manifest.json:

{
  "id": "my-weather-plugin",
  "name": "Weather Display",
  "version": "1.0.0",
  "author": "Your Name",
  "description": "Shows weather information",
  "icon": "fas fa-cloud-sun",  // ← Add this line
  "entry_point": "manager.py",
  ...
}

Step 3: Test Your Plugin

  1. Install or update your plugin
  2. Open the web interface
  3. Look for your plugin's tab
  4. The icon should appear next to the plugin name

Examples

Weather Plugin

{
  "id": "weather-advanced",
  "name": "Weather Advanced",
  "icon": "fas fa-cloud-sun",
  "description": "Advanced weather display with forecasts"
}

Result: Tab shows: ☁️ Weather Advanced

Clock Plugin

{
  "id": "digital-clock",
  "name": "Digital Clock",
  "icon": "⏰",
  "description": "A beautiful digital clock"
}

Result: Tab shows: ⏰ Digital Clock

Sports Scores Plugin

{
  "id": "sports-scores",
  "name": "Sports Scores",
  "icon": "fas fa-trophy",
  "description": "Live sports scores"
}

Result: Tab shows: 🏆 Sports Scores

Custom Branding

{
  "id": "company-dashboard",
  "name": "Company Dashboard",
  "icon": "/plugins/company-dashboard/logo.svg",
  "description": "Company metrics display"
}

Result: Tab shows: [logo] Company Dashboard

Best Practices

1. Choose Meaningful Icons

  • Icon should relate to plugin functionality
  • Users should understand what the plugin does at a glance
  • Avoid generic icons for specific functionality

2. Keep It Simple

  • Simpler icons work better at small sizes
  • Avoid icons with too much detail
  • Test how your icon looks at 16x16 pixels

3. Match the UI Style

  • Font Awesome icons match the interface best
  • If using emoji, consider contrast with background
  • Custom images should use similar color schemes

4. Consider Accessibility

  • Icons should be recognizable without color
  • Don't rely solely on color to convey meaning
  • The plugin name should be descriptive

5. Test on Different Displays

  • Check icon clarity on various screen sizes
  • Ensure emoji render correctly on target devices
  • Custom images should have good contrast

Icon Categories

Here are recommended icons by plugin category:

Time & Calendar

  • fas fa-clock, fas fa-calendar, fas fa-hourglass
  • Emoji: 📅 ⏱️

Weather

  • fas fa-cloud-sun, fas fa-temperature-high, fas fa-wind
  • Emoji: ☀️ 🌧️ ⛈️

Finance & Stocks

  • fas fa-chart-line, fas fa-dollar-sign, fas fa-coins
  • Emoji: 💰 📈 💵

Sports & Games

  • fas fa-football-ball, fas fa-trophy, fas fa-gamepad
  • Emoji: 🏀 🎮

Entertainment

  • fas fa-music, fas fa-film, fas fa-tv
  • Emoji: 🎵 🎬 📺

News & Information

  • fas fa-newspaper, fas fa-rss, fas fa-info-circle
  • Emoji: 📰 📡

Utilities

  • fas fa-tools, fas fa-cog, fas fa-wrench
  • Emoji: 🔧 ⚙️ 🛠️

Social Media

  • fab fa-twitter, fab fa-facebook, fab fa-instagram
  • Emoji: 📱 💬 📧

Troubleshooting

Icon Not Showing

  1. Check that the icon field is correctly spelled in manifest.json
  2. For Font Awesome icons, verify the class name is correct
  3. For custom images, check that the file path is accessible
  4. Refresh the plugins in the web interface
  5. Check browser console for errors

Emoji Looks Wrong

  • Some emojis render differently on different platforms
  • Try a different emoji if one doesn't work well
  • Consider using Font Awesome instead for consistency

Custom Image Not Loading

  • Verify the image file exists in the specified path
  • Check file permissions (should be readable)
  • Try using an absolute path or URL
  • Ensure image format is supported (PNG, SVG, JPG, GIF)
  • Check image dimensions (16x16 to 32x32 recommended)

Icon Too Large/Small

  • Font Awesome and emoji icons automatically size correctly
  • For custom images, adjust the image file dimensions
  • SVG images scale best

Default Behavior

If you don't specify an icon field in your manifest:

  • The plugin tab will show a default puzzle piece icon: 🧩
  • This is the fallback for all plugins without custom icons

Technical Details

The icon system works as follows:

  1. Frontend reads manifest: When plugins load, the web interface reads each plugin's manifest.json
  2. Icon detection: The getPluginIcon() function determines icon type:
    • Contains fa- → Font Awesome icon
    • 1-4 characters → Emoji
    • Starts with http://, https://, or / → Custom image
    • Otherwise → Default puzzle piece
  3. Rendering: Icon HTML is generated and inserted into:
    • Tab button in navigation bar
    • Configuration page header

Advanced: Dynamic Icons

Want to change icons programmatically? While not officially supported, you could:

  1. Store multiple icon options in your manifest
  2. Use JavaScript to swap icons based on plugin state
  3. Update the manifest dynamically and refresh plugins

Example (advanced):

{
  "id": "status-display",
  "icon": "fas fa-circle",
  "icon_states": {
    "active": "fas fa-check-circle",
    "error": "fas fa-exclamation-circle",
    "warning": "fas fa-exclamation-triangle"
  }
}

Summary

Adding a custom icon to your plugin:

  1. Choose your icon (Font Awesome, emoji, or custom image)
  2. Add the icon field to manifest.json
  3. Test in the web interface

That's it! Your plugin now has a professional, recognizable icon in the UI. 🎨