Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 | <a href="./plugins/clock-simple/"><img src="./docs/assets/clock-simple/hero.png" width="240" alt="clock-simple on an LED panel"></a> |
| [7-Segment Clock](./plugins/7-segment-clock/) | Retro-style 7-segment clock with customizable colors | <a href="./plugins/7-segment-clock/"><img src="./docs/assets/7-segment-clock/hero.png" width="240" alt="7-segment-clock on an LED panel"></a> |
| [Google Calendar](./plugins/calendar/) | Upcoming events from Google Calendar | |
| [Google Calendar](./plugins/calendar/) | Upcoming events from Google Calendar | <a href="./plugins/calendar/"><img src="./docs/assets/calendar/hero.png" width="240" alt="calendar on an LED panel"></a> |
| [Geochron World Clock](./plugins/geochron/) | World map with the real-time day/night terminator | <a href="./plugins/geochron/"><img src="./docs/assets/geochron/hero.png" width="240" alt="geochron on an LED panel"></a> |

### Weather (2)
Expand Down
Binary file added docs/assets/calendar/event-kinds.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/calendar/hero.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/assets/calendar/panel-sizes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
54 changes: 54 additions & 0 deletions docs/assets/calendar/shots.json
Original file line number Diff line number Diff line change
@@ -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"}
]
}
]
}
4 changes: 2 additions & 2 deletions plugins.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
48 changes: 25 additions & 23 deletions plugins/calendar/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@

Display upcoming events from Google Calendar with automatic updates, event rotation, and timezone support.

![An upcoming event on a 128x32 panel: the date and start time on one line, the
event title below it](../../docs/assets/calendar/hero.png)

*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
Expand Down Expand Up @@ -104,41 +110,37 @@ 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) |
| `show_all_day_events` | `true` | Include all-day events |
| `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

```
![Timed, all-day, long-title and empty screens](../../docs/assets/calendar/event-kinds.png)

### 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.

![The same event on four panel sizes](../../docs/assets/calendar/panel-sizes.png)

## Multiple Calendars

Expand Down
10 changes: 8 additions & 2 deletions plugins/calendar/manifest.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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,
Expand Down
Loading