Files
LEDMatrix/docs/WEB_INTERFACE_GUIDE.md
T
ChuckandClaude Opus 5 869e36fb2f feat(web): weekly automatic updates with health check and rollback (#581)
* feat(web): weekly automatic updates with health check and rollback

A General-tab toggle (off by default) checks for and installs LEDMatrix and
plugin updates once a week, overnight in the configured timezone.

- Pre-update checks skip (and report) instead of forcing: local edits or
  commits, merge/live rebase, no upstream, low disk, missing health check, or
  a version that was already rolled back. An abandoned rebase (HEAD back on a
  branch) is cleared, since it would otherwise block every pull.
- The pull reuses the Update Code path (now perform_core_update(), which
  reports dependency install failures as data).
- ledmatrix-update-verify.service, started via a .path unit from a request
  file, restarts the services from its own cgroup, requires them to come up
  and stay up, and otherwise resets to the previous commit and reinstalls the
  previous requirements. It runs a copy of the checker taken before the pull.
- No SSH needed: switching the toggle on restarts the display service, which
  (as root) installs the two units from the repo templates for the web user.
  first_time_install.sh installs them too and takes --enable-auto-update /
  LEDMATRIX_AUTO_UPDATE (passed through by one-shot-install.sh).
- Plugins update after the code passes its check; failures, blocks and
  rollbacks raise an Overview banner and show under the toggle.

Tested end to end on a Pi: web-UI setup, a good update, a broken web service
and a broken display (both rolled back), a blocked local edit, and an
abandoned rebase found on the device.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* chore(auto-update): address static-analysis findings

- Replace the subprocess.CompletedProcess the verifier fabricated for a
  command that could not start with a plain namedtuple; nothing is executed
  there, but the scanner flags any CompletedProcess built from variables.
- Mark the subprocess imports with the repo's standard B404 annotation (all
  calls are list-form argv, no shell).
- Mark the rollback-failed message as not SQL (B608 matched its wording).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(auto-update): CI failures on Linux

- Keep the setup result when chown fails. CI runs as a non-root user, where
  chown to the web user raises; that discarded the result file, so the
  General tab would never learn whether setup worked. Regression test added.
- Register the two new /api/v3/system/auto-update routes in the URL map
  snapshot.
- Use utility classes app.css defines (space-y-1, hover:text-red-600).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(auto-update): address review feedback

- Health check: a failed restart command no longer lets the check run
  against the still-running old process; it counts as a failure (and after a
  rollback, as a failed rollback). An unreadable restart count is never
  treated as stable, since a crash loop looks healthy between attempts.
- Installer writes the auto_update setting to a temp file and swaps it in,
  keeping mode and owner, so a running config watcher never reads a
  truncated config.json.
- Verify unit quotes its command-line paths (install folders with spaces);
  setup refuses folder names systemd would reinterpret (%, quotes,
  backslashes, control characters) and says so on the General tab.
- The auto-update status route no longer returns exception text.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(auto-update): keep error detail in the status route's 500

test_web_error_detail requires every 5xx handler to log the traceback and
return describe_exception(e), which redacts credentials, so failures are
diagnosable from the web UI. Dropping it for CodeQL broke that policy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(auto-update): dismiss route rejects non-object JSON with 400

A JSON array or scalar body made `.get('alert_id')` raise, returning 500.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(auto-update): let the app-wide handler answer status-route errors

CodeQL (py/stack-trace-exposure, #709) flagged the route's own except,
which returned describe_exception(e). web_interface/app.py's error handler
already logs the traceback and returns the same redacted detail for any
unhandled exception, so the local copy is removed: same response, no new
exception-to-response flow, and test_web_error_detail's policy still holds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 10:58:57 -04:00

14 KiB
Raw Blame History

Web Interface Guide

Overview

The LEDMatrix web interface provides a complete control panel for managing your LED matrix display. Access all features through a modern, responsive web interface that works on desktop, tablet, and mobile devices.


Quick Start

Accessing the Interface

  1. Find your Raspberry Pi's IP address:

    hostname -I
    
  2. Open a web browser and navigate to:

    http://your-pi-ip:5000
    
  3. The interface will load with the Overview tab displaying system stats and a live display preview.

Note: If the interface doesn't load, verify the web service is running:

sudo systemctl status ledmatrix-web

Navigation

The interface uses a two-row tab layout. The system tabs are always present:

  • Overview — System stats, quick actions, live display preview
  • General — Timezone, location, plugin-system settings
  • WiFi — Network selection and AP-mode setup
  • Schedule — Power and dim schedules
  • Display — Matrix hardware configuration (rows, cols, hardware mapping, GPIO slowdown, brightness, PWM) and Vegas Scroll Mode settings
  • Rotation — drag-and-drop Rotation Order list and per-plugin Screen Durations
  • Config Editor — Raw config.json editor with validation
  • Backup & Restore — back up and restore your configuration
  • Fonts — Upload and manage fonts
  • Logs — Real-time log streaming
  • Cache — Cached data inspection and cleanup
  • Operation History — Recent service operations
  • Tools — system diagnostics, git & updates, Python dependencies, maintenance, power supply, network radio, services, and plugin health

A second nav row holds plugin tabs:

  • Plugin Manager — browse the Plugin Store section, install plugins from GitHub, enable/disable installed plugins
  • <plugin-id> — one tab per installed plugin for its own configuration form (auto-generated from the plugin's config_schema.json)

Features and Usage

Overview Tab

The Overview tab provides at-a-glance information and quick actions:

System Stats:

  • CPU usage and temperature
  • Memory usage
  • Disk usage
  • Network status

Quick Actions (verified in web_interface/templates/v3/partials/overview.html):

  • Start Display / Stop Display — control the display service
  • Restart Display Service — apply configuration changes
  • Restart Web Service — restart the web UI itself
  • Update Code — git pull the latest version (stashes local changes)
  • Reboot System / Shutdown System — confirm-gated power controls

Display Preview:

  • Live preview of what's currently shown on the LED matrix
  • Updates in real-time
  • Useful for remote monitoring

General Tab

Configure basic system settings:

  • Timezone — used by all time/date displays
  • Location — city/state/country for weather and other location-aware plugins
  • Plugin System Settings — including the plugins_directory (default plugin-repos/) used by the plugin loader
  • Autostart options for the display service
  • Automatic updates — once a week, update LEDMatrix and every installed plugin with a newer version. Off by default. Runs 2–5 AM local time when possible, otherwise within a day of being due. The last result and next check are shown under the toggle, and anything other than success raises a banner on Overview.
    • Checks first: the code update is skipped, with the reason shown, if tracked files were edited locally, the checkout has local commits, a rebase/merge is in progress, the branch has no upstream, less than 300 MB is free, or the newest version already failed once. A failed fetch is retried the next day.
    • Health check and rollback: after pulling, ledmatrix-update-verify.service restarts the services and checks that the web interface responds and the display (if it was running) stays up. If not — or if the new dependencies failed to install — it resets to the previous commit, reinstalls the previous dependencies and restarts again. A running display is restarted; a stopped one stays stopped.
    • Plugins update through the Plugin Store, which refuses versions that need a newer LEDMatrix and restores the old copy when an install fails. When the code changed, plugins wait until it passes its health check. Plugins are not health-checked after updating.
    • Setup needs no SSH. Turning the toggle on restarts the display service, which installs the health check (ledmatrix-update-verify.path and .service); the General tab shows when it is ready, or why setup failed. Until then only plugins update. New installs set it up during installation and can switch updates on with first_time_install.sh --enable-auto-update (or LEDMATRIX_AUTO_UPDATE=1, which one-shot-install.sh passes through), or at the installer's prompt.

Click Save to write changes to config/config.json. Most changes require a display service restart from Overview.

Display Tab

Configure your LED matrix hardware:

Matrix configuration:

  • rows — LED rows (typically 32 or 64)
  • cols — LED columns (typically 64 or 96)
  • chain_length — number of horizontally chained panels
  • parallel — number of parallel chains
  • hardware_mapping — adafruit-hat-pwm (with PWM jumper mod), adafruit-hat (without), regular, or regular-pi1
  • gpio_slowdown — must match your Pi model (3 for Pi 3, 4 for Pi 4, etc.)
  • brightness — 0–100%
  • pwm_bits, pwm_lsb_nanoseconds, pwm_dither_bits — PWM tuning
  • Dynamic Duration — global cap for plugins that extend their display time based on content

Vegas Scroll Mode: the Display tab also has a full Vegas Scroll Mode section — enable toggle, scroll speed, separator width, dynamic duration, and related settings — so you can configure Vegas mode entirely from the web UI without hand-editing JSON. See ADVANCED_FEATURES.md for what the options do.

Changes require Restart Display Service from the Overview tab.

Plugin Manager Tab

The Plugin Manager has three main sections:

  1. Installed Plugins — toggle installed plugins on/off, see version info. Each installed plugin also gets its own tab in the second nav row for its configuration form.
  2. Plugin Store — browse plugins from the official ledmatrix-plugins registry. Click Install to fetch and install. Filter by category and search.
  3. Install from GitHub — install third-party plugins by pasting a GitHub repository URL. Install Single Plugin for a single-plugin repo, Load Registry for a multi-plugin monorepo.

When a plugin is installed and enabled:

  • A new tab for that plugin appears in the second nav row
  • Open the tab to edit its config (auto-generated form from config_schema.json)
  • The tab also exposes Run On-Demand / Stop On-Demand controls to render that plugin immediately, even if it's disabled in the rotation

Per-plugin Configuration Tabs

Each installed plugin has its own tab in the second nav row. The form fields are auto-generated from the plugin's config_schema.json, so options always match the plugin's current code.

To temporarily run a plugin outside the normal rotation, use the Run On-Demand / Stop On-Demand buttons inside its tab. This works even when the plugin is disabled.

Fonts Tab

Manage fonts for your display:

Upload Fonts:

  • Drag and drop font files (.ttf, .otf, .bdf)
  • Upload multiple files at once
  • Progress indicator shows upload status

Font Catalog:

  • View all available fonts
  • See font previews
  • Check font sizes and styles

Font Overrides:

  • Overrides are set per display element (e.g. a specific score or clock text element), not per plugin
  • Override default font choices for individual elements
  • Preview font changes

Delete Fonts:

  • Remove unused fonts
  • Free up disk space

Logs Tab

View real-time system logs:

Log Viewer:

  • Streaming logs from the display service
  • Auto-scroll to latest entries
  • Timestamps for each log entry

Filtering:

  • Filter by log level (INFO, WARNING, ERROR)
  • Search for specific text
  • Filter by plugin or component

Actions:

  • Refresh: Reload the log view
  • Clear: Clear the current view
  • Download: Download logs for offline analysis
  • Auto-scroll checkbox: toggle automatic scrolling to the latest entries

Common Tasks

Changing Display Brightness

  1. Open the Display tab
  2. Adjust the Brightness slider (0–100)
  3. Click Save
  4. Click Restart Display Service on the Overview tab

Installing a New Plugin

  1. Open the Plugin Manager tab
  2. Scroll to the Plugin Store section and browse or search
  3. Click Install next to the plugin
  4. Toggle the plugin on in Installed Plugins
  5. Click Restart Display Service on Overview

Configuring a Plugin

  1. Open the plugin's tab in the second nav row (each installed plugin has its own tab)
  2. Edit the auto-generated form
  3. Click Save
  4. Restart the display service from Overview

Setting Favorite Sports Teams

Sports favorites live in the relevant plugin's tab — there is no separate "Sports Configuration" tab. For example:

  1. Install Hockey Scoreboard from Plugin Manager → Plugin Store
  2. Open the Hockey Scoreboard tab in the second nav row
  3. Add your favorites under favorite_teams.<league> (e.g. favorite_teams.nhl)
  4. Click Save and restart the display service

Troubleshooting Display Issues

  1. Navigate to the Logs tab
  2. Look for ERROR or WARNING messages
  3. Filter by the problematic plugin or component
  4. Check the error message for clues
  5. See TROUBLESHOOTING.md for common solutions

Real-Time Features

The web interface uses Server-Sent Events (SSE) for real-time updates:

Live Updates:

  • System stats refresh automatically every few seconds
  • Display preview updates in real-time
  • Logs stream continuously
  • No page refresh required

Performance:

  • Minimal bandwidth usage
  • Server-side rendering for fast load times
  • The UI is built on Alpine.js and HTMX, so JavaScript must be enabled in the browser

Mobile Access

The interface is fully responsive and works on mobile devices:

Mobile Features:

  • Touch-friendly interface
  • Responsive layout adapts to screen size
  • All features available on mobile

Tips for Mobile:

  • Use landscape mode for better visibility
  • Pinch to zoom on display preview

API Access

The web interface is built on a REST API that you can access programmatically:

API Base URL:

http://your-pi-ip:5000/api/v3

The API blueprint mounts at /api/v3 (see web_interface/app.py:199). All endpoints below are relative to that base.

Common Endpoints:

  • GET /api/v3/config/main — Get main configuration
  • POST /api/v3/config/main — Update main configuration
  • GET /api/v3/system/status — Get system status
  • POST /api/v3/system/action — Control display (start/stop/restart, reboot, etc.)
  • GET /api/v3/plugins/installed — List installed plugins
  • POST /api/v3/plugins/install — Install a plugin from the store
  • POST /api/v3/plugins/install-from-url — Install a plugin from a GitHub URL

Note: See REST_API_REFERENCE.md for complete API documentation.


Troubleshooting

Interface Won't Load

Problem: Browser shows "Unable to connect" or "Connection refused"

Solutions:

  1. Verify the web service is running:

    sudo systemctl status ledmatrix-web
    
  2. Start the service if stopped:

    sudo systemctl start ledmatrix-web
    
  3. Check that port 5000 is not blocked by firewall

  4. Verify the Pi's IP address is correct

Changes Not Applying

Problem: Configuration changes don't take effect

Solutions:

  1. Ensure you clicked "Save Configuration"
  2. Restart the display service for changes to apply:
    sudo systemctl restart ledmatrix
    
  3. Check logs for error messages

Display Preview Not Updating

Problem: Display preview shows old content or doesn't update

Solutions:

  1. Refresh the browser page (F5)
  2. Check that the display service is running
  3. Verify SSE streams are working (check browser console)

Plugin Configuration Not Saving

Problem: Plugin settings revert after restart

Solutions:

  1. Check file permissions on config/config.json:
    ls -l config/config.json
    
  2. Ensure the web service has write permissions
  3. Check logs for permission errors

Security Considerations

Network Access:

  • The interface is accessible to anyone on your local network
  • No authentication is currently implemented
  • Recommended for trusted networks only

Best Practices:

  1. Run on a private network (not exposed to internet)
  2. Use a firewall to restrict access if needed
  3. Consider VPN access for remote control
  4. Keep the system updated

Technical Details

Architecture

The web interface uses modern web technologies:

  • Backend: Flask with Blueprint-based modular design
  • Frontend: HTMX for dynamic content, Alpine.js for reactive components
  • Styling: Tailwind CSS for responsive design
  • Real-Time: Server-Sent Events (SSE) for live updates

File Locations

Configuration:

  • Main config: /config/config.json
  • Secrets: /config/config_secrets.json
  • WiFi config: /config/wifi_config.json

Logs:

  • Display service: sudo journalctl -u ledmatrix -f
  • Web service: sudo journalctl -u ledmatrix-web -f

Plugins:

  • Plugin directory: configurable via plugin_system.plugins_directory in config.json (default plugin-repos/). Main plugin discovery only scans this directory; the Plugin Store install flow and the schema loader additionally probe plugins/ so dev symlinks created by scripts/dev/dev_plugin_setup.sh keep working.
  • Plugin config: /config/config.json (per-plugin sections)