diff --git a/README.md b/README.md
index 812a069d..4e049344 100644
--- a/README.md
+++ b/README.md
@@ -92,7 +92,7 @@ curl -X POST http://your-pi-ip:5000/api/v3/plugins/install \
| [Cricket Scoreboard](./plugins/cricket-scoreboard/) | Live, recent & upcoming international (Test/ODI/T20I) and major domestic cricket | |
| [AFL Scoreboard](./plugins/afl-scoreboard/) | Australian Football League live, recent & upcoming games |
|
| [NRL Scoreboard](./plugins/nrl-scoreboard/) | National Rugby League live, recent & upcoming games | |
-| [F1 Scoreboard](./plugins/f1-scoreboard/) | Formula 1 race results, schedules, and standings | |
+| [F1 Scoreboard](./plugins/f1-scoreboard/) | Formula 1 race results, schedules, and standings |
|
| [UFC Scoreboard](./plugins/ufc-scoreboard/) | UFC/MMA live fights, fighter headshots, records, odds & results — *by [LegoGuy1000](https://github.com/legoguy1000)* | |
| [Masters Tournament](./plugins/masters-tournament/) | Live Masters golf leaderboard, hole tracking, player cards | |
| [March Madness](./plugins/march-madness/) | NCAA tournament bracket tracker with round branding and live scores | |
diff --git a/docs/assets/f1-scoreboard/driver-split.png b/docs/assets/f1-scoreboard/driver-split.png
new file mode 100644
index 00000000..cb2f2f8f
Binary files /dev/null and b/docs/assets/f1-scoreboard/driver-split.png differ
diff --git a/docs/assets/f1-scoreboard/hero.png b/docs/assets/f1-scoreboard/hero.png
new file mode 100644
index 00000000..5f1227e8
Binary files /dev/null and b/docs/assets/f1-scoreboard/hero.png differ
diff --git a/docs/assets/f1-scoreboard/panel-sizes.png b/docs/assets/f1-scoreboard/panel-sizes.png
new file mode 100644
index 00000000..5276f0ef
Binary files /dev/null and b/docs/assets/f1-scoreboard/panel-sizes.png differ
diff --git a/docs/assets/f1-scoreboard/shots.json b/docs/assets/f1-scoreboard/shots.json
new file mode 100644
index 00000000..0cab3003
--- /dev/null
+++ b/docs/assets/f1-scoreboard/shots.json
@@ -0,0 +1,468 @@
+{
+ "plugin": "f1-scoreboard",
+ "_comment": "Standings are seeded onto the plugin instance rather than fetched, and _last_update is seeded so update() does not re-fetch and clear them. The cards scroll, so shots step frames. Drivers, teams and points are invented.",
+ "defaults": {
+ "width": 128,
+ "height": 32,
+ "scale": 6,
+ "freeze_time": "2026-09-03T18:00:00+00:00",
+ "skip_update": true,
+ "frames": 60,
+ "config": {
+ "enabled": true
+ },
+ "attrs": {
+ "_driver_standings": [
+ {
+ "position": 1,
+ "code": "VER",
+ "name": "M. Verstappen",
+ "constructor_id": "red_bull",
+ "points": 374,
+ "wins": 9,
+ "is_favorite": true,
+ "gap_to_leader": 0,
+ "poles": 0,
+ "last_race_pts": 0
+ },
+ {
+ "position": 2,
+ "code": "NOR",
+ "name": "L. Norris",
+ "constructor_id": "mclaren",
+ "points": 331,
+ "wins": 4,
+ "is_favorite": false,
+ "gap_to_leader": 43,
+ "poles": 0,
+ "last_race_pts": 0
+ },
+ {
+ "position": 3,
+ "code": "PIA",
+ "name": "O. Piastri",
+ "constructor_id": "mclaren",
+ "points": 307,
+ "wins": 3,
+ "is_favorite": false,
+ "gap_to_leader": 67,
+ "poles": 0,
+ "last_race_pts": 0
+ },
+ {
+ "position": 4,
+ "code": "LEC",
+ "name": "C. Leclerc",
+ "constructor_id": "ferrari",
+ "points": 245,
+ "wins": 1,
+ "is_favorite": false,
+ "gap_to_leader": 129,
+ "poles": 0,
+ "last_race_pts": 0
+ },
+ {
+ "position": 5,
+ "code": "RUS",
+ "name": "G. Russell",
+ "constructor_id": "mercedes",
+ "points": 211,
+ "wins": 2,
+ "is_favorite": false,
+ "gap_to_leader": 163,
+ "poles": 0,
+ "last_race_pts": 0
+ }
+ ],
+ "_constructor_standings": [
+ {
+ "position": 1,
+ "constructor_id": "mclaren",
+ "name": "McLaren",
+ "points": 638,
+ "wins": 7,
+ "code": "MCL"
+ },
+ {
+ "position": 2,
+ "constructor_id": "red_bull",
+ "name": "Red Bull",
+ "points": 521,
+ "wins": 9,
+ "code": "RED"
+ },
+ {
+ "position": 3,
+ "constructor_id": "ferrari",
+ "name": "Ferrari",
+ "points": 456,
+ "wins": 1,
+ "code": "FER"
+ },
+ {
+ "position": 4,
+ "constructor_id": "mercedes",
+ "name": "Mercedes",
+ "points": 398,
+ "wins": 2,
+ "code": "MER"
+ }
+ ],
+ "_last_update": 1788458400.0
+ }
+ },
+ "shots": [
+ {
+ "name": "hero",
+ "frames": 280,
+ "width": 256,
+ "config": {
+ "enabled": true,
+ "driver_standings": {
+ "enabled": true
+ },
+ "constructor_standings": {
+ "enabled": false
+ },
+ "recent_races": {
+ "enabled": false
+ },
+ "upcoming": {
+ "enabled": false
+ },
+ "qualifying": {
+ "enabled": false
+ },
+ "practice": {
+ "enabled": false
+ },
+ "sprint": {
+ "enabled": false
+ },
+ "calendar": {
+ "enabled": false
+ }
+ }
+ },
+ {
+ "name": "m-drivers",
+ "frames": 280,
+ "width": 256,
+ "standalone": false,
+ "config": {
+ "enabled": true,
+ "driver_standings": {
+ "enabled": true
+ },
+ "constructor_standings": {
+ "enabled": false
+ },
+ "recent_races": {
+ "enabled": false
+ },
+ "upcoming": {
+ "enabled": false
+ },
+ "qualifying": {
+ "enabled": false
+ },
+ "practice": {
+ "enabled": false
+ },
+ "sprint": {
+ "enabled": false
+ },
+ "calendar": {
+ "enabled": false
+ }
+ }
+ },
+ {
+ "name": "m-constructors",
+ "frames": 280,
+ "width": 256,
+ "standalone": false,
+ "config": {
+ "enabled": true,
+ "driver_standings": {
+ "enabled": false
+ },
+ "constructor_standings": {
+ "enabled": true
+ },
+ "recent_races": {
+ "enabled": false
+ },
+ "upcoming": {
+ "enabled": false
+ },
+ "qualifying": {
+ "enabled": false
+ },
+ "practice": {
+ "enabled": false
+ },
+ "sprint": {
+ "enabled": false
+ },
+ "calendar": {
+ "enabled": false
+ }
+ }
+ },
+ {
+ "name": "split-on",
+ "frames": 340,
+ "width": 256,
+ "standalone": false,
+ "config": {
+ "enabled": true,
+ "driver_standings": {
+ "enabled": false
+ },
+ "constructor_standings": {
+ "enabled": true,
+ "show_driver_split": true
+ },
+ "recent_races": {
+ "enabled": false
+ },
+ "upcoming": {
+ "enabled": false
+ },
+ "qualifying": {
+ "enabled": false
+ },
+ "practice": {
+ "enabled": false
+ },
+ "sprint": {
+ "enabled": false
+ },
+ "calendar": {
+ "enabled": false
+ }
+ }
+ },
+ {
+ "name": "split-off",
+ "frames": 340,
+ "width": 256,
+ "standalone": false,
+ "config": {
+ "enabled": true,
+ "driver_standings": {
+ "enabled": false
+ },
+ "constructor_standings": {
+ "enabled": true,
+ "show_driver_split": false
+ },
+ "recent_races": {
+ "enabled": false
+ },
+ "upcoming": {
+ "enabled": false
+ },
+ "qualifying": {
+ "enabled": false
+ },
+ "practice": {
+ "enabled": false
+ },
+ "sprint": {
+ "enabled": false
+ },
+ "calendar": {
+ "enabled": false
+ }
+ }
+ },
+ {
+ "name": "size-64x32",
+ "width": 64,
+ "frames": 280,
+ "standalone": false,
+ "config": {
+ "enabled": true,
+ "driver_standings": {
+ "enabled": true
+ },
+ "constructor_standings": {
+ "enabled": false
+ },
+ "recent_races": {
+ "enabled": false
+ },
+ "upcoming": {
+ "enabled": false
+ },
+ "qualifying": {
+ "enabled": false
+ },
+ "practice": {
+ "enabled": false
+ },
+ "sprint": {
+ "enabled": false
+ },
+ "calendar": {
+ "enabled": false
+ }
+ }
+ },
+ {
+ "name": "size-128x32",
+ "width": 128,
+ "frames": 280,
+ "standalone": false,
+ "config": {
+ "enabled": true,
+ "driver_standings": {
+ "enabled": true
+ },
+ "constructor_standings": {
+ "enabled": false
+ },
+ "recent_races": {
+ "enabled": false
+ },
+ "upcoming": {
+ "enabled": false
+ },
+ "qualifying": {
+ "enabled": false
+ },
+ "practice": {
+ "enabled": false
+ },
+ "sprint": {
+ "enabled": false
+ },
+ "calendar": {
+ "enabled": false
+ }
+ }
+ },
+ {
+ "name": "size-128x64",
+ "width": 128,
+ "height": 64,
+ "frames": 280,
+ "standalone": false,
+ "config": {
+ "enabled": true,
+ "driver_standings": {
+ "enabled": true
+ },
+ "constructor_standings": {
+ "enabled": false
+ },
+ "recent_races": {
+ "enabled": false
+ },
+ "upcoming": {
+ "enabled": false
+ },
+ "qualifying": {
+ "enabled": false
+ },
+ "practice": {
+ "enabled": false
+ },
+ "sprint": {
+ "enabled": false
+ },
+ "calendar": {
+ "enabled": false
+ }
+ }
+ },
+ {
+ "name": "size-256x32",
+ "width": 256,
+ "frames": 280,
+ "standalone": false,
+ "config": {
+ "enabled": true,
+ "driver_standings": {
+ "enabled": true
+ },
+ "constructor_standings": {
+ "enabled": false
+ },
+ "recent_races": {
+ "enabled": false
+ },
+ "upcoming": {
+ "enabled": false
+ },
+ "qualifying": {
+ "enabled": false
+ },
+ "practice": {
+ "enabled": false
+ },
+ "sprint": {
+ "enabled": false
+ },
+ "calendar": {
+ "enabled": false
+ }
+ }
+ }
+ ],
+ "composites": [
+ {
+ "name": "standings-modes",
+ "columns": 1,
+ "cells": [
+ {
+ "shot": "m-drivers",
+ "label": "f1_driver_standings",
+ "sublabel": "position, code, team and points"
+ },
+ {
+ "shot": "m-constructors",
+ "label": "f1_constructor_standings"
+ }
+ ]
+ },
+ {
+ "name": "driver-split",
+ "columns": 1,
+ "cells": [
+ {
+ "shot": "split-on",
+ "label": "constructor_standings.show_driver_split: true"
+ },
+ {
+ "shot": "split-off",
+ "label": "constructor_standings.show_driver_split: false"
+ }
+ ]
+ },
+ {
+ "name": "panel-sizes",
+ "columns": 2,
+ "cells": [
+ {
+ "shot": "size-64x32",
+ "label": "64 x 32"
+ },
+ {
+ "shot": "size-128x32",
+ "label": "128 x 32"
+ },
+ {
+ "shot": "size-128x64",
+ "label": "128 x 64"
+ },
+ {
+ "shot": "size-256x32",
+ "label": "256 x 32"
+ }
+ ]
+ }
+ ]
+}
diff --git a/docs/assets/f1-scoreboard/standings-modes.png b/docs/assets/f1-scoreboard/standings-modes.png
new file mode 100644
index 00000000..2e16eec4
Binary files /dev/null and b/docs/assets/f1-scoreboard/standings-modes.png differ
diff --git a/plugins.json b/plugins.json
index f818927f..0ae16c9b 100644
--- a/plugins.json
+++ b/plugins.json
@@ -212,10 +212,10 @@
"plugin_path": "plugins/f1-scoreboard",
"stars": 0,
"downloads": 0,
- "last_updated": "2026-08-05",
+ "last_updated": "2026-09-03",
"verified": true,
"screenshot": "",
- "latest_version": "1.8.6"
+ "latest_version": "1.8.7"
},
{
"id": "football-scoreboard",
diff --git a/plugins/f1-scoreboard/README.md b/plugins/f1-scoreboard/README.md
index 1b24ac59..85be7ba4 100644
--- a/plugins/f1-scoreboard/README.md
+++ b/plugins/f1-scoreboard/README.md
@@ -1,5 +1,13 @@
# F1 Scoreboard Plugin
+
+
+*Every image in this README is real plugin output, rendered at the true panel
+size from seeded standings so it reproduces exactly. Drivers, teams and points
+are invented.*
+
A Formula 1 plugin for LEDMatrix that displays driver and constructor
standings, race results, qualifying and practice times, sprint results,
upcoming races, and the full season calendar — with team-colored visuals,
@@ -86,11 +94,11 @@ Each mode section has an `enabled` toggle and mode-specific options:
| `recent_races` | `show_winners_summary` | `true` | Show a compact winners summary card at the start of the recent races section |
| `recent_races` | `show_gap_chart` | `true` | Show a horizontal bar chart of each finisher's time gap from the winner (team-colored bars) |
| `recent_races` | `gap_chart_drivers` | `5` | Number of drivers to show on the race gap bar chart (3–10) |
-| `upcoming` | `show_session_times` | `true` | Show practice / qualifying / race times |
-| `upcoming` | `countdown_enabled` | `true` | Live countdown to next session |
+| `upcoming` | `show_session_times` | `true` | **Not implemented.** Nothing reads it; the session times are always drawn. |
+| `upcoming` | `countdown_enabled` | `true` | **Not implemented.** Nothing reads it; the countdown is always drawn. |
| `upcoming` | `show_circuit_info` | `true` | Show circuit stats card after upcoming race card (laps, km, lap record) |
| `qualifying` | `show_q1` / `show_q2` / `show_q3` | `true` | Toggle each qualifying segment |
-| `qualifying` | `show_gaps` | `true` | Show gap-to-pole times |
+| `qualifying` | `show_gaps` | `true` | **Not implemented.** Nothing reads it. |
| `qualifying` | `show_team_duel` | `true` | Show team H2H summary card (who outqualified their teammate) |
| `practice` | `sessions_to_show` | `["FP1","FP2","FP3"]` | Which sessions to render |
| `practice` | `top_n` | `10` | Drivers per practice session |
@@ -183,6 +191,17 @@ Override the font used for each text role. All fonts are bundled in `assets/font
Available fonts: `PressStart2P-Regular.ttf`, `4x6-font.ttf`, `5by7.regular.ttf`
+Each role also takes a size, and `auto_scale` decides whether those sizes are
+used as written or scaled to the panel:
+
+| Key | Default | Description |
+|---|---|---|
+| `customization.auto_scale` | `true` | Leave the font fields below blank to auto-pick a crisp pixel (bitmap) font sized for your panel. This toggle only affects a scalable TTF you choose manually: on, it scales that TTF with panel size and snaps it to its pixel grid; off, it uses the exact size below. |
+| `customization.header_text.font_size` | `8` | Size in pixels. |
+| `customization.position_text.font_size` | `8` | Size in pixels. |
+| `customization.detail_text.font_size` | `6` | Size in pixels. |
+| `customization.small_text.font_size` | `6` | Size in pixels. |
+
### Driver and team codes
Set `favorite_driver` to one of these three-letter codes:
@@ -212,6 +231,21 @@ Set `favorite_team` to one of these constructor IDs:
timezone; if that isn't set, the host system's timezone is used, and only if
neither is available do times fall back to UTC.
+### What the modes look like
+
+The two standings modes need no session data, so they are pictured here. The
+other six — recent races, upcoming, qualifying, practice, sprint and calendar
+— need a live race weekend to have anything to show.
+
+
+
+Each card is tinted with the team's colour, and the header carries a season
+progress bar showing the round.
+
+
+
+
+
## Data sources
| Data | Source |
diff --git a/plugins/f1-scoreboard/manifest.json b/plugins/f1-scoreboard/manifest.json
index 379ffb88..e7ab883d 100644
--- a/plugins/f1-scoreboard/manifest.json
+++ b/plugins/f1-scoreboard/manifest.json
@@ -1,7 +1,7 @@
{
"id": "f1-scoreboard",
"name": "F1 Scoreboard",
- "version": "1.8.6",
+ "version": "1.8.7",
"author": "ChuckBuilds",
"class_name": "F1ScoreboardPlugin",
"entry_point": "manager.py",
@@ -29,6 +29,12 @@
"f1_calendar"
],
"versions": [
+ {
+ "version": "1.8.7",
+ "released": "2026-09-03",
+ "notes": "Documentation. This README was already close: 65 of the 70 settings were documented, and the five missing were customization.auto_scale and the four font sizes, which are now covered. Three settings are marked as not implemented -- upcoming.show_session_times, upcoming.countdown_enabled and qualifying.show_gaps appear nowhere in the plugin or the core, though the countdown they claim to gate is drawn regardless. Adds real rendered screenshots of both standings modes, the constructor driver-split toggle and four panel sizes; the other six modes need a live race weekend to have anything to show.",
+ "ledmatrix_min_version": "2.0.0"
+ },
{
"version": "1.8.6",
"released": "2026-08-21",
@@ -286,7 +292,7 @@
"ledmatrix_min_version": "2.0.0"
}
],
- "last_updated": "2026-08-05",
+ "last_updated": "2026-09-03",
"stars": 0,
"downloads": 0,
"verified": true,