diff --git a/README.md b/README.md
index e0fcc744..7d9f50a4 100644
--- a/README.md
+++ b/README.md
@@ -94,7 +94,7 @@ curl -X POST http://your-pi-ip:5000/api/v3/plugins/install \
| [NRL Scoreboard](./plugins/nrl-scoreboard/) | National Rugby League live, recent & upcoming games | |
| [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 | |
+| [Masters Tournament](./plugins/masters-tournament/) | Live Masters golf leaderboard, hole tracking, player cards |
|
| [NFL Draft](./plugins/nfl-draft/) | Projected & live NFL draft picks from ESPN |
|
| [March Madness](./plugins/march-madness/) | NCAA tournament bracket tracker with round branding and live scores |
|
| [Odds Ticker](./plugins/odds-ticker/) | Betting odds & lines across NFL, NBA, MLB, NHL, NCAA | |
diff --git a/docs/assets/masters-tournament/hero.png b/docs/assets/masters-tournament/hero.png
new file mode 100644
index 00000000..726ad650
Binary files /dev/null and b/docs/assets/masters-tournament/hero.png differ
diff --git a/docs/assets/masters-tournament/offseason-modes.png b/docs/assets/masters-tournament/offseason-modes.png
new file mode 100644
index 00000000..5f9f56b6
Binary files /dev/null and b/docs/assets/masters-tournament/offseason-modes.png differ
diff --git a/docs/assets/masters-tournament/panel-sizes.png b/docs/assets/masters-tournament/panel-sizes.png
new file mode 100644
index 00000000..d088ccbb
Binary files /dev/null and b/docs/assets/masters-tournament/panel-sizes.png differ
diff --git a/docs/assets/masters-tournament/shots.json b/docs/assets/masters-tournament/shots.json
new file mode 100644
index 00000000..6797a41c
--- /dev/null
+++ b/docs/assets/masters-tournament/shots.json
@@ -0,0 +1,1122 @@
+{
+ "plugin": "masters-tournament",
+ "_comment": "The plugin ships a mock_data mode, so these render offline with no seeding. Which modes are available depends on the tournament phase: the eight in tournament-modes render during Masters week and are blank outside it, and the six in offseason-modes are the other way round. The shots pin the clock to each phase accordingly.",
+ "defaults": {
+ "width": 128,
+ "height": 32,
+ "scale": 6,
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "config": {
+ "enabled": true,
+ "mock_data": true
+ }
+ },
+ "shots": [
+ {
+ "name": "hero",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": true
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00"
+ },
+ {
+ "name": "t-leaderboard",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": true
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "t-player_cards",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": true
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "t-live_action",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": true
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "t-amen_corner",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": true
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "t-featured_holes",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": true
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "t-schedule",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": true
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "t-tournament_stats",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": true
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "t-field_overview",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": true
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "o-countdown",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": true
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-01-15T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "o-past_champions",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": true
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-01-15T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "o-course_overview",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": true
+ }
+ }
+ },
+ "freeze_time": "2026-01-15T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "o-hole_by_hole",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": true
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-01-15T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "o-course_tour",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": true
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-01-15T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "o-fun_facts",
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": false
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": true
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-01-15T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "size-64x32",
+ "width": 64,
+ "height": 32,
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": true
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "size-128x32",
+ "width": 128,
+ "height": 32,
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": true
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "size-128x64",
+ "width": 128,
+ "height": 64,
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": true
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ },
+ {
+ "name": "size-256x32",
+ "width": 256,
+ "height": 32,
+ "config": {
+ "enabled": true,
+ "mock_data": true,
+ "display_modes": {
+ "leaderboard": {
+ "enabled": true
+ },
+ "player_cards": {
+ "enabled": false
+ },
+ "hole_by_hole": {
+ "enabled": false
+ },
+ "live_action": {
+ "enabled": false
+ },
+ "course_tour": {
+ "enabled": false
+ },
+ "amen_corner": {
+ "enabled": false
+ },
+ "featured_holes": {
+ "enabled": false
+ },
+ "schedule": {
+ "enabled": false
+ },
+ "past_champions": {
+ "enabled": false
+ },
+ "tournament_stats": {
+ "enabled": false
+ },
+ "fun_facts": {
+ "enabled": false
+ },
+ "countdown": {
+ "enabled": false
+ },
+ "field_overview": {
+ "enabled": false
+ },
+ "course_overview": {
+ "enabled": false
+ }
+ }
+ },
+ "freeze_time": "2026-04-09T18:00:00+00:00",
+ "standalone": false
+ }
+ ],
+ "composites": [
+ {
+ "name": "tournament-modes",
+ "columns": 2,
+ "cells": [
+ {
+ "shot": "t-leaderboard",
+ "label": "leaderboard"
+ },
+ {
+ "shot": "t-player_cards",
+ "label": "player_cards"
+ },
+ {
+ "shot": "t-live_action",
+ "label": "live_action"
+ },
+ {
+ "shot": "t-amen_corner",
+ "label": "amen_corner"
+ },
+ {
+ "shot": "t-featured_holes",
+ "label": "featured_holes"
+ },
+ {
+ "shot": "t-schedule",
+ "label": "schedule"
+ },
+ {
+ "shot": "t-tournament_stats",
+ "label": "tournament_stats"
+ },
+ {
+ "shot": "t-field_overview",
+ "label": "field_overview"
+ }
+ ]
+ },
+ {
+ "name": "offseason-modes",
+ "columns": 2,
+ "cells": [
+ {
+ "shot": "o-countdown",
+ "label": "countdown"
+ },
+ {
+ "shot": "o-past_champions",
+ "label": "past_champions"
+ },
+ {
+ "shot": "o-course_overview",
+ "label": "course_overview"
+ },
+ {
+ "shot": "o-hole_by_hole",
+ "label": "hole_by_hole"
+ },
+ {
+ "shot": "o-course_tour",
+ "label": "course_tour"
+ },
+ {
+ "shot": "o-fun_facts",
+ "label": "fun_facts"
+ }
+ ]
+ },
+ {
+ "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/masters-tournament/tournament-modes.png b/docs/assets/masters-tournament/tournament-modes.png
new file mode 100644
index 00000000..347be6c1
Binary files /dev/null and b/docs/assets/masters-tournament/tournament-modes.png differ
diff --git a/plugins.json b/plugins.json
index 8e4fca02..dd6a2f38 100644
--- a/plugins.json
+++ b/plugins.json
@@ -484,10 +484,10 @@
"plugin_path": "plugins/masters-tournament",
"stars": 0,
"downloads": 0,
- "last_updated": "2026-08-05",
+ "last_updated": "2026-09-03",
"verified": true,
"screenshot": "",
- "latest_version": "2.5.5"
+ "latest_version": "2.5.6"
},
{
"id": "mqtt-notifications",
diff --git a/plugins/masters-tournament/README.md b/plugins/masters-tournament/README.md
index 3e16fdd7..7934a14e 100644
--- a/plugins/masters-tournament/README.md
+++ b/plugins/masters-tournament/README.md
@@ -1,5 +1,12 @@
# Masters Tournament LED Display Plugin
+
+
+*Every image in this README is real plugin output, rendered at the true panel
+size using the plugin's own `mock_data` mode, so they reproduce offline.*
+
A high-polish Augusta National Masters Tournament display plugin for LEDMatrix with course imagery, live leaderboards, player stats, hole maps, and maximum Masters branding. Works year-round with engaging off-season content.
## Features
@@ -145,6 +152,99 @@ Customize Masters visual elements:
}
```
+### Top level
+
+| Key | Default | Notes |
+|---|---|---|
+| `enabled` | `true` | Enable or disable the Masters Tournament plugin. |
+| `display_duration` | `20` | Duration in seconds to display each mode before rotating (5–300). |
+| `update_interval` | `30` | How often to fetch new data in seconds (30s during tournament, 3600s off-season) (10–3600). |
+| `player_card_duration` | `8` | Seconds each player card is shown before rotating to the next player in the player card display mode (1–300). |
+| `hole_display_duration` | `15` | Seconds between hole advances in course tour and hole-by-hole display modes (1–300). |
+| `page_display_duration` | `15` | Seconds between page advances in paginated modes (leaderboard, champions, tournament stats, schedule, course overview) (1–300). |
+| `scroll_card_width` | `128` | Width in pixels of each card when rendered in Vegas scroll mode (the horizontally-scrolling ticker). Set lower to pack more cards into a long panel; set higher for more detail per card. Card height always matches the display height (32–256). |
+| `post_tournament_display_days` | `1` | Number of days after the final round to continue showing tournament results (leaderboard, player cards, etc.) before switching to countdown mode. Set to 0 to switch immediately after the tournament ends, or higher to extend the post-tournament display window (0–14). |
+| `mock_data` | `false` | Use mock tournament data for testing (useful when Masters isn't live). |
+| `favorite_players` | *(empty)* | List of favorite player names (e.g., ['Scottie Scheffler', 'Rory McIlroy']). |
+
+### Display modes
+
+Each of the fourteen modes takes `enabled`; a few carry extra keys.
+
+| Key | Default | Notes |
+|---|---|---|
+| `display_modes.leaderboard.enabled` | `true` | Show live leaderboard. |
+| `display_modes.leaderboard.top_n` | `10` | Number of players to show on leaderboard (1–50). |
+| `display_modes.leaderboard.show_favorites_always` | `true` | Always include favorite players even if outside top N. |
+| `display_modes.leaderboard.duration` | `25` | Display duration for leaderboard (seconds) (5–120). |
+| `display_modes.player_cards.enabled` | `true` | Show individual player spotlight cards. |
+| `display_modes.player_cards.show_headshots` | `true` | Display player headshot photos. **Not implemented**. |
+| `display_modes.player_cards.duration_per_player` | `15` | Time to show each player card (seconds) (5–60). **Not implemented**. |
+| `display_modes.course_tour.enabled` | `true` | Show rotating hole maps with course imagery. |
+| `display_modes.course_tour.show_animations` | `true` | Enable transitions and animations. **Not implemented**. |
+| `display_modes.course_tour.duration_per_hole` | `15` | Time to show each hole (seconds) (5–60). **Not implemented**. |
+| `display_modes.course_tour.show_divider` | `true` | Show the vertical divider line between the hole info and map columns. Set to false for a cleaner single-cell look. |
+| `display_modes.course_tour.featured_holes` | `[12, 13, 16]` | Featured holes to highlight (Amen Corner, par 3s). **Not implemented**. |
+| `display_modes.hole_by_hole.enabled` | `true` | Show hole-by-hole scores for favorite players. |
+| `display_modes.hole_by_hole.duration` | `20` | Display duration (seconds) (5–120). |
+| `display_modes.live_action.enabled` | `true` | Show real-time birdie/eagle notifications. |
+| `display_modes.live_action.duration` | `10` | Notification display duration (seconds) (3–30). |
+| `display_modes.amen_corner.enabled` | `true` | Dedicated display for holes 11-13 (Amen Corner). |
+| `display_modes.amen_corner.duration` | `20` | Display duration (seconds) (5–120). |
+| `display_modes.featured_holes.enabled` | `true` | Show scoring on signature holes (12, 16). |
+| `display_modes.featured_holes.duration` | `15` | Display duration (seconds) (5–120). |
+| `display_modes.schedule.enabled` | `true` | Show tee times and pairings. |
+| `display_modes.schedule.duration` | `20` | Display duration (seconds) (5–120). |
+| `display_modes.past_champions.enabled` | `true` | Show historical Masters winners. |
+| `display_modes.past_champions.duration` | `20` | Display duration (seconds) (5–120). |
+| `display_modes.tournament_stats.enabled` | `true` | Show tournament records and statistics. |
+| `display_modes.fun_facts.enabled` | `true` | Show Masters and Augusta National fun facts. |
+| `display_modes.countdown.enabled` | `true` | Show countdown to next Masters Tournament. |
+| `display_modes.field_overview.enabled` | `true` | Show field breakdown (under/over/even par counts). |
+| `display_modes.course_overview.enabled` | `true` | Show Augusta National front nine / back nine overview. |
+
+### Settings that do nothing
+
+Neither of these blocks is read anywhere in the plugin or the core — no
+`config.get("notifications")`, no `config.get("branding")`. They are in the
+schema and the web UI, and changing them has no effect. Tracked in
+[issue #418](https://github.com/ChuckBuilds/ledmatrix-plugins/issues/418),
+along with the five `display_modes` leaves marked above.
+
+| Key | Default |
+|---|---|
+| `notifications.practice_round_alerts.enabled` | `true` |
+| `notifications.practice_round_alerts.interrupt_display` | `true` |
+| `notifications.practice_round_alerts.duration` | `15` |
+| `notifications.favorite_player_alerts.enabled` | `true` |
+| `notifications.favorite_player_alerts.interrupt_display` | `true` |
+| `notifications.favorite_player_alerts.duration` | `10` |
+| `notifications.tournament_start_alert.enabled` | `true` |
+| `notifications.tournament_start_alert.interrupt_display` | `false` |
+| `branding.show_masters_logo` | `true` |
+| `branding.show_green_jacket` | `true` |
+| `branding.show_azaleas` | `true` |
+| `branding.color_scheme` | `"classic"` |
+
+
+### What the modes look like
+
+Which modes are available depends on where you are in the tournament calendar.
+During Masters week these eight render and the off-season set is blank:
+
+
+
+Outside it, that reverses — these six render and the tournament set is blank:
+
+
+
+Enabling only an off-season mode during Masters week therefore shows nothing;
+that is the phase gate, not a fault. On a 128-wide panel Amen Corner packs
+three hole names against their par and yardage, so the two columns sit very
+close together.
+
+
+
## Data Source
This plugin uses the **ESPN Golf API** (free, no API key required):
diff --git a/plugins/masters-tournament/manifest.json b/plugins/masters-tournament/manifest.json
index 1d655261..4f928750 100644
--- a/plugins/masters-tournament/manifest.json
+++ b/plugins/masters-tournament/manifest.json
@@ -1,7 +1,7 @@
{
"id": "masters-tournament",
"name": "Masters Tournament",
- "version": "2.5.5",
+ "version": "2.5.6",
"description": "Broadcast-quality Masters Tournament display with real ESPN player headshots, accurate Augusta National hole layouts, fun facts, past champions, live leaderboards, and pixel-perfect LED matrix rendering",
"author": "ChuckBuilds",
"class_name": "MastersTournamentPlugin",
@@ -43,6 +43,12 @@
"height": 64
},
"versions": [
+ {
+ "version": "2.5.6",
+ "released": "2026-09-03",
+ "notes": "Documentation. None of the 51 settings had a named key in the README; they were described in prose and JSON examples. All 51 are now documented at the paths the schema expects. Seventeen of them do nothing: the notifications block (8) and the branding block (4) are never read by the plugin or the core, and five leaves inside display_modes are read nowhere either, yet the README had sections presenting notifications and branding as features (#418). Adds real rendered screenshots of all fourteen display modes, produced with the plugin's own mock_data mode, split by tournament phase because eight render only during Masters week and six only outside it.",
+ "ledmatrix_min_version": "2.0.0"
+ },
{
"version": "2.5.5",
"released": "2026-08-19",
@@ -172,7 +178,7 @@
"ledmatrix_min_version": "2.0.0"
}
],
- "last_updated": "2026-08-05",
+ "last_updated": "2026-09-03",
"compatible_versions": [
">=2.0.0"
]