diff --git a/README.md b/README.md
index 7a93a9db..4242b16a 100644
--- a/README.md
+++ b/README.md
@@ -114,7 +114,7 @@ curl -X POST http://your-pi-ip:5000/api/v3/plugins/install \
|--------|-------------|---------|
| [Simple Clock](./plugins/clock-simple/) | Time and date display |
|
| [7-Segment Clock](./plugins/7-segment-clock/) | Retro-style 7-segment clock with customizable colors |
|
-| [Google Calendar](./plugins/calendar/) | Upcoming events from Google Calendar | |
+| [Google Calendar](./plugins/calendar/) | Upcoming events from Google Calendar |
|
| [Geochron World Clock](./plugins/geochron/) | World map with the real-time day/night terminator |
|
### Weather (2)
diff --git a/docs/assets/calendar/event-kinds.png b/docs/assets/calendar/event-kinds.png
new file mode 100644
index 00000000..4d7ee9bb
Binary files /dev/null and b/docs/assets/calendar/event-kinds.png differ
diff --git a/docs/assets/calendar/hero.png b/docs/assets/calendar/hero.png
new file mode 100644
index 00000000..4f4fe3a3
Binary files /dev/null and b/docs/assets/calendar/hero.png differ
diff --git a/docs/assets/calendar/panel-sizes.png b/docs/assets/calendar/panel-sizes.png
new file mode 100644
index 00000000..153a5f1f
Binary files /dev/null and b/docs/assets/calendar/panel-sizes.png differ
diff --git a/docs/assets/calendar/shots.json b/docs/assets/calendar/shots.json
new file mode 100644
index 00000000..6f64fb8d
--- /dev/null
+++ b/docs/assets/calendar/shots.json
@@ -0,0 +1,54 @@
+{
+ "plugin": "calendar",
+ "defaults": {
+ "width": 128,
+ "height": 32,
+ "scale": 6,
+ "freeze_time": "2026-09-02T14:05:00+00:00",
+ "skip_update": true,
+ "config": {
+ "enabled": true
+ },
+ "attrs": {
+ "events": [
+ {"summary": "Team Standup",
+ "start": {"dateTime": "2026-09-03T09:30:00+00:00"}}
+ ]
+ }
+ },
+ "shots": [
+ { "name": "hero" },
+ { "name": "timed", "standalone": false },
+ { "name": "all-day", "standalone": false,
+ "attrs": { "events": [{"summary": "Ada's Birthday", "start": {"date": "2026-09-05"}}] } },
+ { "name": "long-title", "standalone": false,
+ "attrs": { "events": [{"summary": "Quarterly Planning Review With Engineering", "start": {"dateTime": "2026-09-04T13:00:00+00:00"}}] } },
+ { "name": "no-events", "standalone": false, "attrs": { "events": [] } },
+ { "name": "size-64x32", "width": 64, "standalone": false },
+ { "name": "size-128x32", "width": 128, "standalone": false },
+ { "name": "size-128x64", "width": 128, "height": 64, "standalone": false },
+ { "name": "size-256x32", "width": 256, "standalone": false }
+ ],
+ "composites": [
+ {
+ "name": "event-kinds",
+ "columns": 1,
+ "cells": [
+ {"shot": "timed", "label": "Timed event", "sublabel": "date, then start time"},
+ {"shot": "all-day", "label": "All-day event", "sublabel": "date, then \"All Day\""},
+ {"shot": "long-title", "label": "Long title", "sublabel": "wraps, then ellipsizes"},
+ {"shot": "no-events", "label": "Nothing upcoming"}
+ ]
+ },
+ {
+ "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/plugins.json b/plugins.json
index 846f1cb6..061f7d4c 100644
--- a/plugins.json
+++ b/plugins.json
@@ -121,10 +121,10 @@
"plugin_path": "plugins/calendar",
"stars": 0,
"downloads": 0,
- "last_updated": "2026-08-13",
+ "last_updated": "2026-09-02",
"verified": true,
"screenshot": "",
- "latest_version": "1.2.3"
+ "latest_version": "1.2.4"
},
{
"id": "christmas-countdown",
diff --git a/plugins/calendar/README.md b/plugins/calendar/README.md
index 6ceb255e..17a80f77 100644
--- a/plugins/calendar/README.md
+++ b/plugins/calendar/README.md
@@ -15,6 +15,12 @@
Display upcoming events from Google Calendar with automatic updates, event rotation, and timezone support.
+
+
+*Every image in this README is real plugin output, rendered at the true panel
+size and scaled up so the pixels stay pixels.*
+
## Features
- **Google Calendar Integration**: OAuth2 authentication
@@ -104,6 +110,7 @@ widget and first-time authentication) and rarely need editing by hand.
|-----|---------|-------|
| `enabled` | `false` | Enable or disable the plugin |
| `credentials_file` | `"credentials.json"` | Google OAuth credentials file (uploaded via the config UI) |
+| `google_auth` | `""` | Not a setting you type into. It is the **Step 2: Connect Your Google Account** button in the web UI (`x-widget: google-oauth`), which runs the consent flow described above. Google redirects to a page that fails to load — that is expected; copy the address back into the field to finish. |
| `token_file` | `"token.pickle"` | Where the OAuth token is stored after first-time auth (auto-created) |
| `calendars` | `["primary"]` | Calendar IDs to display — use the calendar picker after authenticating, or `"primary"` for your default |
| `max_events` | `3` | Maximum upcoming events to show (1–10) |
@@ -111,34 +118,29 @@ widget and first-time authentication) and rarely need editing by hand.
| `event_rotation_interval` | `10` | Seconds between rotating displayed events (min 5) |
| `display_duration` | `30` | Total seconds on screen before moving to the next plugin (min 5) |
| `update_interval` | `3600` | Seconds between refreshes from Google (60–86400) |
-| `customization.datetime_text.font` / `.font_size` | `PressStart2P-Regular.ttf` / `8` | Font family + size (4–16px) for the event date/time line |
-| `customization.title_text.font` / `.font_size` | `PressStart2P-Regular.ttf` / `8` | Font family + size (4–16px) for the event title |
+| `customization.datetime_text.font` | `PressStart2P-Regular.ttf` | Font for the date/time line |
+| `customization.datetime_text.font_size` | `8` | Size of the date/time line in pixels (4–16) |
+| `customization.title_text.font` | `PressStart2P-Regular.ttf` | Font for the event title |
+| `customization.title_text.font_size` | `8` | Size of the event title in pixels (4–16) |
## Display Format
-### Timed Event
-```
- 03/15 2:30pm
-
- Team Meeting
-
-```
+The date sits on the top line with the start time beside it, and the event title
+fills the space below, wrapped across as many lines as fit.
-### All-Day Event
-```
- 03/20 All Day
-
- Birthday Party
-
-```
+
-### Long Title (Wrapped)
-```
- 03/22 10:00am
-
- Project Review
- and Planning
-```
+- A **timed** event shows its start time next to the date.
+- An **all-day** event shows `All Day` in place of the time. Set
+ `show_all_day_events` to `false` to leave these out.
+- A **long title** wraps, and the last visible line is ellipsized rather than
+ simply stopping, so a title that did not fit is recognisable as truncated.
+- When nothing upcoming is left, the panel shows `No Events`.
+
+The layout is the same on every panel; the taller the panel, the more lines of
+title fit before ellipsis.
+
+
## Multiple Calendars
diff --git a/plugins/calendar/manifest.json b/plugins/calendar/manifest.json
index 30ab02a5..986893d8 100644
--- a/plugins/calendar/manifest.json
+++ b/plugins/calendar/manifest.json
@@ -1,7 +1,7 @@
{
"id": "calendar",
"name": "Google Calendar",
- "version": "1.2.3",
+ "version": "1.2.4",
"author": "ChuckBuilds",
"description": "Display upcoming events from Google Calendar with date, time, and event details. Shows next 1-3 events with automatic rotation and timezone support.",
"category": "productivity",
@@ -35,6 +35,12 @@
}
],
"versions": [
+ {
+ "version": "1.2.4",
+ "released": "2026-09-02",
+ "notes": "Documentation. The README's three ASCII mock-ups of the display are replaced with real rendered screenshots of the same four screens (timed, all-day, a long title being ellipsized, and the empty state) plus a panel-size sheet. Documents google_auth, which is the web UI's Connect Your Google Account button rather than a value you type, and splits the two combined font rows so each customization key appears on its own. All 13 schema settings are now documented by key.",
+ "ledmatrix_min_version": "3.3.0"
+ },
{
"version": "1.2.3",
"released": "2026-08-31",
@@ -106,7 +112,7 @@
"ledmatrix_min_version": "2.0.0"
}
],
- "last_updated": "2026-08-13",
+ "last_updated": "2026-09-02",
"stars": 0,
"downloads": 0,
"verified": true,