Personal dashboard for E-Ink displays showing calendar events and weather. Python Flask server + Arduino ESP32 client for M5Paper S3.
- Set WiFi/server credentials in
client/client.ino - Flash to M5Paper S3 using Arduino IDE
# Set configuration
export CONFIG='{
"user_hash": {
"timezone": "America/New_York",
"weather_location": "New York, NY",
"caldav_urls": "https://user:[email protected]/cal.ics"
}
}'
# Run with Docker (recommended)
docker run -d -p 7777:7777 -e CONFIG="$CONFIG" --restart unless-stopped ghcr.io/max.schaefer/dailydisplay:latest
# Or with docker-compose
docker-compose up -d- Auto-refresh: Hourly background updates
- Calendar: CalDAV integration with timezone support
- E-ink optimized: Grayscale PNG rendering
- Multi-user: Multiple dashboard configurations
- Weather: Open-Meteo API with day/night icons
services:
dailydisplay:
image: ghcr.io/max.schaefer/dailydisplay:latest
ports: ["7777:7777"]
restart: unless-stopped
environment:
CONFIG: |
{"user_hash": {"timezone": "America/New_York", "weather_location": "New York"}}docker run -d -p 7777:7777 -e CONFIG='{"user_hash":{"timezone":"America/New_York","weather_location":"New York"}}' ghcr.io/max.schaefer/dailydisplay:latestcd server && python app.pyGET /- Health checkGET /<user_hash>- HTML dashboardGET /<user_hash>.png- PNG for e-ink display
Client (client/client.ino): ESP32 firmware polls PNG endpoint, renders to M5Paper S3 display
Server (server/app.py): Flask app fetches calendar/weather data, generates PNGs with Playwright
Single environment variable contains JSON config:
{
"user_hash": {
"timezone": "America/New_York",
"weather_location": "New York, NY",
"caldav_urls": "https://user:[email protected]/cal.ics,https://user:[email protected]/work.ics",
"caldav_filter_names": "personal,work"
}
}Client: FastEPD, HTTPClient, NTPClient, PNGdec
Server: CalDAV, Flask, Gunicorn, iCalendar, Playwright
Pre-built Docker images available for linux/amd64 and linux/arm64 via GitHub Actions.
- Fork the repository
- Create a feature branch:
git checkout -b feature-name - Make changes following the code standards in CLAUDE.md
- Test locally:
cd server && python app.py - Submit a pull request
- Client issues: Check WiFi credentials and server URL
- No events: Check CalDAV URL format (
https://user:pass@host/path.ics) - No weather: Verify location name spelling
- PNG errors: Playwright dependencies missing
This project is licensed under the AGPL-3.0 License - see the LICENSE file for details.