Widgets
Live signage elements generated from Canvas Relay's authoritative widget registry. Dynamic sources are normalized and cached by Canvas Relay; players do not call third-party APIs directly. Device support, data source, refresh, offline behavior and setup fields below stay synchronized with the runtime.
Clock
Free plan and upOffline: fully static/local — no live network is requiredCurrent time — digital or analog face.
Digital or analog, any IANA timezone, 12/24-hour. Pair it with the hours widget for an 'open now' corner.
| Setting | Type | Default | Notes |
|---|---|---|---|
| face | enum (digital | analog) | "digital" | |
| format | enum (12 | 24) | "12" | |
| showSeconds | boolean | false | |
| showDate | boolean | false | |
| timezone | string | null | |
| color | color | "#FFFFFF" |
QR code
Free plan and upOffline: fully static/local — no live network is requiredScannable link — menus, reviews, Wi-Fi, promos.
Point it at your review page, Wi-Fi details, or a signup link. Give it a quiet zone (padding) and test-scan from the farthest seat.
| Setting | Type | Default | Notes |
|---|---|---|---|
| url | url | "" | |
| label | string | "" | |
| dark | color | "#000000" | |
| light | color | "#FFFFFF" |
Business hours
Free plan and upOffline: fully static/local — no live network is requiredWeekly opening hours with a live open/closed status.
Set your weekly hours once; the widget shows today's hours and flips between 'open now' and 'closed' on its own.
| Setting | Type | Default | Notes |
|---|---|---|---|
| title | string | "Hours" | |
| highlightToday | boolean | true | |
| timezone | string | null | |
| color | color | "#FFFFFF" | |
| accent | color | "#34D399" | |
| monOpen | string | "" | |
| monClose | string | "" | |
| tueOpen | string | "" | |
| tueClose | string | "" | |
| wedOpen | string | "" | |
| wedClose | string | "" | |
| thuOpen | string | "" | |
| thuClose | string | "" | |
| friOpen | string | "" | |
| friClose | string | "" | |
| satOpen | string | "" | |
| satClose | string | "" | |
| sunOpen | string | "" | |
| sunClose | string | "" |
Countdown
Creator plan and upOffline: fully static/local — no live network is requiredDays/hours/minutes to a date — "opens in", events, deadlines.
Counts down to a date/time — 'opens in 3 days', 'happy hour in 45 min'. Pick the target and the labels.
| Setting | Type | Default | Notes |
|---|---|---|---|
| targetAt | string | "" | |
| label | string | "Opens in" | |
| doneText | string | "We're open!" | |
| color | color | "#FFFFFF" | |
| accent | color | "#F59E0B" |
Image slideshow
Creator plan and upOffline: fully static/local — no live network is requiredRotating photos from your media library, crossfaded.
Pick up to 6 images from your media library and a crossfade cadence. Uses your cached media, so it plays fully offline.
| Setting | Type | Default | Notes |
|---|---|---|---|
| image1 | media | null | |
| image2 | media | null | |
| image3 | media | null | |
| image4 | media | null | |
| image5 | media | null | |
| image6 | media | null | |
| intervalSec | number | 8 | 3–60 |
| fit | enum (cover | contain) | "cover" |
Weather / Forecast
Pro plan and upOffline: keeps showing the last good data it fetchedCurrent conditions plus a configurable 3–5 day forecast using commercial-safe open weather data.
Live conditions for a latitude/longitude via the built-in weather provider — no API key needed. Cached briefly; offline it shows the last fetch.
Data: MET Norway Locationforecast 2.0
Use/license: CC BY 4.0; commercial reuse permitted with attribution
Attribution: Weather data: MET Norway (CC BY 4.0)
Refresh: 20-minute shared public cache; never fetched more often than every 15 minutes.
Limits: No delivery SLA. Requests identify Canvas Relay and respect MET cache guidance. Daily highs/lows are derived from MET's hourly forecast points in the configured timezone.
| Setting | Type | Default | Notes |
|---|---|---|---|
| latitude | number | 38.72 | -90–90 |
| longitude | number | -75.08 | -180–180 |
| timezone | string | "America/New_York" | |
| units | enum (fahrenheit | celsius) | "fahrenheit" | |
| layout | enum (compact | card | forecast) | "card" | |
| forecastDays | number | 5 | 3–5 |
| forecastHours | number | 12 | 3–24 |
| showFeelsLike | boolean | true | |
| showWind | boolean | true | |
| showAttribution | boolean | true | |
| theme | enum (transparent | dark | light) | "dark" | |
| color | color | "#FFFFFF" |
Ticker
Pro plan and upOffline: keeps showing the last good data it fetchedScrolling headlines — your own lines or an RSS feed.
A scrolling line of your own messages, or items from an RSS feed. Keep entries short — tickers are glanced at, not read.
| Setting | Type | Default | Notes |
|---|---|---|---|
| items | string | "" | |
| rssUrl | url | null | |
| speedSec | number | 30 | 5–120 |
| color | color | "#FFFFFF" | |
| background | color | "#111827" |
Web embed
Pro plan and upOffline: hides itself until the network returnsEmbed a web page (sandboxed). Needs the screen to be online.
Embeds a web page in a sandboxed iframe. Online-only: offline it hides rather than showing a broken page. Some sites refuse embedding (X-Frame-Options) — that's their choice, not a bug.
| Setting | Type | Default | Notes |
|---|---|---|---|
| url | url | "" |
YouTube
Pro plan and upOffline: hides itself until the network returnsYouTube video, muted + looping. Online-only; heavy on Raspberry Pi — prefer uploaded video files there.
Plays a YouTube video muted and looping. Online-only, and heavy for a Raspberry Pi — prefer uploaded video files on Pi players.
| Setting | Type | Default | Notes |
|---|---|---|---|
| video | string | "" | |
| loop | boolean | true |
Air Quality
Pro plan and upOffline: keeps showing the last good data it fetchedAQI and health category from a customer-owned/open structured feed.
Data: Customer-provided JSON/CSV
Use/license: Customer/source controlled
Refresh: No more often than every 30 minutes; normally hourly.
Limits: Canvas Relay does not bundle a paid commercial AQI API. Use a feed you are licensed to display, including public-domain EPA data transformed to JSON/CSV.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (json | csv) | "json" | |
| sourceUrl | url | null | |
| title | string | "Air Quality" | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Tides / Marine
Pro plan and upOffline: keeps showing the last good data it fetchedNOAA tide predictions for a CO-OPS station.
Data: NOAA CO-OPS Data API
Use/license: U.S. government/public-domain data unless specifically marked otherwise
Attribution: NOAA / Center for Operational Oceanographic Products and Services
Refresh: Fetches a multi-day prediction window and refreshes at most every 6 hours.
| Setting | Type | Default | Notes |
|---|---|---|---|
| station | string | "8557380" | |
| title | string | "Tides" | |
| hours | number | 48 | 12–168 |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Earthquakes
Pro plan and upOffline: keeps showing the last good data it fetchedRecent USGS earthquake activity by magnitude and optional location.
Data: USGS Earthquake Catalog/FDSN
Use/license: USGS-produced data are U.S. public domain; source credit requested
Attribution: U.S. Geological Survey
Refresh: Shared cache; normally every 10 minutes.
| Setting | Type | Default | Notes |
|---|---|---|---|
| latitude | number | null | -90–90 |
| longitude | number | null | -180–180 |
| radiusKm | number | 1000 | 10–20000 |
| minMagnitude | number | 2.5 | 0–10 |
| hours | number | 24 | 1–168 |
| maxItems | number | 6 | 1–12 |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Sunrise / Sunset / Moon
Pro plan and upOffline: fully static/local — no live network is requiredLocal sunrise, sunset, moon phase, and daylight calculations.
Data: Canvas Relay deterministic astronomy calculations
Use/license: No external data provider
Refresh: Calculated on-device from date/location; no recurring network request.
| Setting | Type | Default | Notes |
|---|---|---|---|
| latitude | number | 38.72 | -90–90 |
| longitude | number | -75.08 | -180–180 |
| timezone | string | "America/New_York" | |
| showMoon | boolean | true | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
World Clock
Pro plan and upOffline: fully static/local — no live network is requiredMultiple city clocks calculated locally on the player.
Data: IANA timezone data on player/runtime
Use/license: No recurring external API
Refresh: Calculated locally every minute (or second when needed).
| Setting | Type | Default | Notes |
|---|---|---|---|
| cities | record-list | [{"label":"New York","timezone":"America/New_York"},{"label":"London","timezone":"Europe/London"},{"label":"Tokyo","timezone":"Asia/Tokyo"}] | Use Add item; no raw JSON needed. |
| format | enum (12h | 24h) | "12h" | |
| showDate | boolean | false | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Calendar / Agenda
Pro plan and upOffline: keeps showing the last good data it fetchedGoogle Calendar-first agenda with an ICS fallback for other calendar providers.
Data: Google Calendar API (primary) / customer-provided ICS fallback
Use/license: Customer-authorized Google Calendar data or customer-selected ICS source
Refresh: Five-minute tenant cache with ETag/last-known-good behavior.
Limits: Google mode requires a one-time OAuth connection. Private events default to Busy-only display so details are not exposed accidentally.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (google | ics) | "google" | |
| calendarId | string | "primary" | |
| feedUrl | url | null | |
| title | string | "Agenda" | |
| maxItems | number | 6 | 1–12 |
| horizonHours | number | 72 | 6–336 |
| privacyMode | enum (details | busy | hide-private) | "busy" | |
| layout | enum (agenda | next-event | week) | "agenda" | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
News Cards
Pro plan and upOffline: keeps showing the last good data it fetchedHeadline cards from a licensed RSS or Atom feed.
Data: Customer-provided RSS/Atom feed
Use/license: Feed publisher/customer controlled
Refresh: Ten-minute cache; conditional/stale behavior is centralized.
Limits: The customer must have the right to publicly display/redistribute the selected feed content.
| Setting | Type | Default | Notes |
|---|---|---|---|
| feedUrl | url | null | |
| title | string | "Latest" | |
| maxItems | number | 6 | 1–12 |
| layout | enum (cards | list) | "cards" | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Quotes / Messages
Pro plan and upOffline: fully static/local — no live network is requiredRotate customer-entered messages without any external quote service.
Data: Canvas Relay board configuration
Use/license: Customer-owned/entered content
Refresh: Change-driven; rotation is local.
| Setting | Type | Default | Notes |
|---|---|---|---|
| messages | string-list | ["Welcome!","Thanks for being here."] | Add/reorder values in the inspector. |
| intervalSec | number | 15 | 5–300 |
| showQuotes | boolean | false | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Google Reviews / Testimonials
Pro plan and upOffline: keeps showing the last good data it fetchedLatest reviews from an authorized Google Business Profile, with manual testimonials as a fallback.
Data: Google Business Profile Reviews API / manual testimonials
Use/license: Authorized first-party Business Profile content; Google API policies apply
Attribution: Reviews from Google Business Profile when Google mode is selected
Refresh: 15-minute tenant cache; temporary cached Google content is retained for at most seven days.
Limits: Google mode only works for profiles the signed-in merchant owns or manages. Canvas Relay's Google Cloud project must first receive Business Profile API access approval. No review scraping is used.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (google | manual) | "google" | |
| accountId | string | "" | |
| locationId | string | "" | |
| maxItems | number | 10 | 1–20 |
| reviews | record-list | [{"quote":"Great service!","author":"Customer","rating":5}] | Use Add item; no raw JSON needed. |
| intervalSec | number | 20 | 5–300 |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Transit Departures
Pro plan and upOffline: keeps showing the last good data it fetchedDepartures from a public GTFS-Realtime Trip Updates feed.
Data: Customer-selected public GTFS-Realtime feed
Use/license: Varies by transit agency; customer must select a feed licensed for display
Refresh: One-minute hard minimum with source/query cache deduplication.
| Setting | Type | Default | Notes |
|---|---|---|---|
| feedUrl | url | null | |
| stopId | string | "" | |
| title | string | "Departures" | |
| maxItems | number | 8 | 1–12 |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Sports Scoreboard
Pro plan and upOffline: keeps showing the last good data it fetchedOpenLigaDB scores and fixtures with an optional customer-owned JSON/CSV fallback.
Data: OpenLigaDB (built-in) or customer-provided JSON/CSV
Use/license: OpenLigaDB API data: Open Database License (ODbL); BYO feed terms are customer/source controlled
Attribution: Data: OpenLigaDB · ODbL
Refresh: Current scoreboards use a two-minute cache; completed data may remain cached longer. Roku never calls OpenLigaDB directly.
Limits: OpenLigaDB is community-maintained and strongest for football/German leagues. Team/league logos are intentionally not redistributed. JSON/CSV fallback remains available for other competitions.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (openligadb | json | csv) | "openligadb" | |
| OpenLigaDB league code (e.g. bl1) | string | "bl1" | |
| Season (e.g. 2026) | string | "2026" | |
| Matchday / group number | number | null | 1–100 |
| Team filter | string | "" | |
| displayMode | enum (scoreboard | current | recent | upcoming) | "scoreboard" | |
| sourceUrl | url | null | |
| title | string | "Scores" | |
| maxItems | number | 5 | 1–10 |
| showKickoff | boolean | true | |
| showStatus | boolean | true | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
KPI / Big Number
Pro plan and upOffline: keeps showing the last good data it fetchedA signage-first number, label, and optional comparison.
Data: Canvas Relay/manual or customer-provided JSON/CSV
Use/license: Customer-owned/authorized data
Refresh: Manual values are change-driven; remote data has a one-minute hard minimum.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (manual | json | csv) | "manual" | |
| sourceUrl | url | null | |
| label | string | "Sales Today" | |
| value | string | "1,248" | |
| prefix | string | "" | |
| suffix | string | "" | |
| subtext | string | "" | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Progress / Goal Meter
Pro plan and upOffline: keeps showing the last good data it fetchedActual-versus-target progress for sales, fundraising, or production.
Data: Canvas Relay/manual or customer-provided JSON/CSV
Use/license: Customer-owned/authorized data
Refresh: Change-driven/manual or five-minute cached remote source.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (manual | json | csv) | "manual" | |
| sourceUrl | url | null | |
| label | string | "Goal" | |
| value | number | 72 | -1000000000000–1000000000000 |
| target | number | 100 | 0.000001–1000000000000 |
| prefix | string | "" | |
| suffix | string | "" | |
| showPercent | boolean | true | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Data Table
Pro plan and upOffline: keeps showing the last good data it fetchedTV-readable rows and selected columns from JSON/CSV.
Data: Customer-provided JSON/CSV
Use/license: Customer-owned/authorized data
Refresh: Five-minute cache with one-minute hard minimum.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (json | csv) | "csv" | |
| sourceUrl | url | null | |
| title | string | "Status" | |
| columns | record-list | [{"key":"name","label":"Name"},{"key":"value","label":"Value"}] | Use Add item; no raw JSON needed. |
| maxRows | number | 10 | 1–30 |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Leaderboard
Pro plan and upOffline: keeps showing the last good data it fetchedRank employees, teams, scores, sales, or fundraising totals.
Data: Canvas Relay/manual or customer-provided JSON/CSV
Use/license: Customer-owned/authorized data
Refresh: Change-driven/manual or five-minute cached remote source.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (manual | json | csv) | "manual" | |
| sourceUrl | url | null | |
| title | string | "Leaderboard" | |
| entries | record-list | [{"label":"Team A","value":"100"},{"label":"Team B","value":"92"}] | Use Add item; no raw JSON needed. |
| maxItems | number | 10 | 1–20 |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Map / Directions
Pro plan and upOffline: fully static/local — no live network is requiredDisplay an OpenStreetMap destination with an address and directions link.
Data: OpenStreetMap interactive embed
Use/license: OpenStreetMap data is ODbL; tile/service use is subject to OSMF usage policies
Attribution: © OpenStreetMap contributors
Refresh: Browser-requested interactive tiles only; Canvas Relay does not prefetch or proxy OSM tiles.
Limits: Roku does not embed browser maps. The browser player sends ordinary Referer/browser requests and leaves attribution visible.
| Setting | Type | Default | Notes |
|---|---|---|---|
| title | string | "Find Us" | |
| destination | string | "Destination" | |
| address | string | "" | |
| latitude | number | 38.72 | -90–90 |
| longitude | number | -75.08 | -180–180 |
| zoom | number | 15 | 3–18 |
| showDirectionsLink | boolean | true | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Wait Time / Queue
Pro plan and upOffline: keeps showing the last good data it fetchedShow a current wait estimate, queue depth, status, and message from manual, public, or authenticated data.
Data: Manual, customer JSON/CSV, or encrypted Canvas Relay HTTP connector
Use/license: Customer-owned/authorized operational data
Refresh: Manual values are change-driven; remote sources have a one-minute hard minimum.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (manual | json | csv | connector) | "manual" | |
| sourceUrl | url | null | |
| connectorId | string | "" | |
| connectorPath | string | "" | |
| title | string | "Current Wait" | |
| value | number | 10 | 0–100000 |
| peopleAhead | number | 0 | 0–100000 |
| status | string | "Open" | |
| subtext | string | "" | |
| prefix | string | "" | |
| suffix | string | " min" | |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Authenticated Dashboard Snapshot
Pro plan and upOffline: keeps showing the last good data it fetchedSecurely fetch and display an image snapshot from a saved authenticated HTTP connector without storing credentials in the board.
Data: Canvas Relay encrypted HTTP connector
Use/license: Customer must be authorized to access and display the connected dashboard
Refresh: Five-minute cache by default with a one-minute hard minimum.
Limits: Snapshot endpoint must return an image. Credentials remain server-side and encrypted at rest.
| Setting | Type | Default | Notes |
|---|---|---|---|
| connectorId | string | "" | |
| connectorPath | string | "" | |
| title | string | "Dashboard" | |
| fit | enum (contain | cover) | "contain" | |
| background | color | "#0A0F1C" |
Inventory / Status
Pro plan and upOffline: keeps showing the last good data it fetchedTV-readable inventory, availability, equipment, room, or service status from manual, public, or authenticated data.
Data: Manual, customer JSON/CSV, or encrypted Canvas Relay HTTP connector
Use/license: Customer-owned/authorized operational data
Refresh: Manual values are change-driven; remote sources normally cache five minutes.
| Setting | Type | Default | Notes |
|---|---|---|---|
| source | enum (manual | json | csv | connector) | "manual" | |
| sourceUrl | url | null | |
| connectorId | string | "" | |
| connectorPath | string | "" | |
| title | string | "Inventory Status" | |
| entries | record-list | [{"name":"Example item","sku":"","quantity":"12","status":"In stock","detail":""}] | Use Add item; no raw JSON needed. |
| columns | record-list | [{"key":"name","label":"Item"},{"key":"quantity","label":"Qty"},{"key":"status","label":"Status"}] | Use Add item; no raw JSON needed. |
| maxRows | number | 10 | 1–20 |
| theme | enum (transparent | dark | light) | "dark" | |
| accent | color | "#38BDF8" | |
| textColor | color | "#FFFFFF" |
Developer / Custom HTML
Pro plan and upOffline: fully static/local — no live network is requiredSandboxed HTML/CSS for advanced browser signage. Scripts are opt-in and never receive same-origin access.
Data: Customer-authored sandboxed browser content
Use/license: Customer is responsible for code/content and third-party rights
Refresh: Change-driven; no Canvas Relay data polling.
Limits: Runs in an iframe sandbox. Script mode grants allow-scripts only, never allow-same-origin; Roku is unsupported.
| Setting | Type | Default | Notes |
|---|---|---|---|
| html | string | "<div class=\"card\">Custom HTML</div>" | |
| css | string | "body{margin:0;font-family:system-ui;background:#111827;color:white}.card{padding:24px}" | |
| javascript | string | "" | |
| allowScripts | boolean | false | |
| background | color | "#111827" |

Social Feed
Pro plan and upOffline: keeps showing the last good data it fetchedPosts/cards from a customer-provided RSS/Atom, JSON, or CSV feed.
Data: Customer-provided feed/BYO structured source
Use/license: Customer/source controlled
Refresh: Ten-minute cache; five-minute hard minimum.
Limits: No expensive social-network API or scraping is bundled.