Personal dashboard component

Skully Calendar Widget

A wall-kiosk month grid that turns selected Google calendars, US holidays, and NEISD school-day indicators into a quiet, glanceable household schedule.

This is a product note for personal software running on the Skully home dashboard host. It is not offered as a hosted public calendar service.

Skully mascot
Display 3 Calendar
Rendered locally from dashboard JSON
Synced every 5 min

April 2026

Selected calendars + US holidays + NEISD

14 entries this month

Built For A Dedicated Home Kiosk

Skully is a triple-display dashboard host. The calendar widget occupies the lower-left panel of the right display, beside world clocks and the entry-camera dashboard.

Month Grid First

The browser renders a Sunday-start current-month grid with adjacent-month days, highlighted today state, event chips, and overflow handling.

Multiple Sources

The collector merges selected Google calendars, Google's US holiday calendar, and a public NEISD district-events ICS feed.

Local Browser Surface

The kiosk browser reads only a local JSON file. OAuth credentials and refresh tokens stay on the host-side collector path.

How It Works

The widget is intentionally simple at the display layer. Systemd refreshes data in the background, Python normalizes event sources, and the local page paints the grid from one JSON payload.

Source Google OAuth

A one-time tunneled consent flow authorizes calendar read-only and calendar-list read-only scopes.

Collect Python Fetcher

The host refreshes tokens, pulls selected calendars, loads holiday data, and filters school-day indicators.

Publish Local JSON

The normalized payload lands at /opt/dashboard-kiosk/site/data/calendar.json for the kiosk site.

Render Display 3

The right-display page updates the month grid without exposing credentials in Chromium.

Implementation Facts

Runtime Host

Runs on the Skully Ubuntu kiosk host as part of a local Xorg, Openbox, Chromium dashboard stack.

Refresh Cadence

dashboard-kiosk-google-calendar.timer starts after boot and refreshes every five minutes.

Failure State

If authorization expires or is revoked, the widget switches to an authorization-required state until the helper runs again.

Privacy Boundary

This software is for the owner's personal dashboard. It is not designed as a public privacy-preserving calendar service.