//nbkelley /homelab

MBTA Dashboard - Kiosk Mode#

What Was Established#

The MBTA dashboard runs as a 24/7 kiosk display on a Raspberry Pi 3B+ using Anthias (formerly Screenly OSE) in Docker. The display is portrait 1080x1920. The Pi has severe memory constraints (788MB total) requiring aggressive optimization.

Anthias Deployment#

Hardware#

  • Device: Raspberry Pi 3B+ (788MB RAM)
  • Display: 1080x1920 portrait screen
  • Software: Anthias (Docker-based digital signage)

Display Configuration#

  • Dashboard page set as primary asset
  • Splash page appears for 1 minute every 11 hours 59 minutes as a refresh cycle
  • Page refreshes via cron job to prevent memory leaks

Cron Refresh#

# Refresh the kiosk page periodically to clear memory
0 */6 * * * docker restart screenly-anthias-viewer-1

Qt WebEngine Quirks#

Anthias uses Qt WebEngine for rendering, which differs from desktop Chrome:

  • Font rendering: Wider default fonts; use Arial for consistency
  • Emoji support: Limited — use Bootstrap Icons instead of Unicode emoji
  • WebP support: May not render WebP images (test before deploying)
  • CSS animations: Choppier than desktop browsers, especially continuous animations
  • Debug mode: QT_LOGGING_DEBUG=1 QT_QPA_EGLFS_DEBUG=1 environment variables

Font Fix#

* { font-family: Arial, Helvetica, sans-serif; }

Icon Strategy#

  • Prefer Bootstrap Icons (bi-*) over Unicode emoji
  • Meteocons for weather icons (small, targeted icon set)
  • Avoid loading full icon libraries — use specific CSS classes only

Memory Management#

Pi 3B+ Constraints#

  • 788MB total RAM, ~624MB used by system + Docker + Anthias
  • No swap recommended (degrades SD card)
  • Docker container: screenly-anthias-viewer-1
  • All data fetches must be server-side to minimize browser memory

Optimization Checklist#

  • Server-side proxy for all API calls
  • Static map image (WebP/PNG) instead of Leaflet.js
  • Lazy loading for non-critical sections
  • CSS animations over JavaScript for tickers
  • Remove unused DOM elements
  • Regular page refresh via cron
  • Minimize icon/emoji loading

Current Configuration#

  • MBTA API Key: Stored server-side in /opt/mbta-proxy/.env
  • MBTA API Base: https://api-v3.mbta.com
  • Data endpoint: http://transit.intra.plgt.com/api/data
  • Access: Internal via transit.intra.plgt.com, external via Cloudflare tunnel to mbtadash.nbkelley.com

Historical Notes#

  • Initial conversation: 2026-02-20 (kiosk mode basics)
  • Claude Code session: 2026-03-12 to 2026-04-12 (full implementation + Anthias debugging)
  • Blue Bikes removed when GBFS feed deprecated
  • Ferry panels updated seasonally (winter schedule removes F2H Hull, F3 Boston)
  • User strongly prefers server-side proxy over client-side API calls

Sources#

  • ingested/chats/179-CSS Media Query Screen Size Issue.md
  • DeepSeek conversation: “Local test proxy for MBTA tracker” (chat 184)
  • Claude Code conversation: “MBTADashboard - Prompt Maker” (chat 24)