Glanceboard is an e-ink display that helps you start your day, built with Gemini
This demo showcases how to use Gemini 3.6 Flash and Nano Banana to turn your Google Calendar into art on an e-ink display.
Using just a computer and an iCal feed, Glanceboard transforms your schedule, local weather, and custom family characters into Nano Banana generated art. Every morning, it reads your calendar and generates a fresh illustration so you know what's happening today, what to pack, and what to wear.
No screens. No notifications. Just a quiet picture frame that helps you know what's happening today.
Note: This demo was entirely vibe coded with Google Antigravity and uses off the shelf hardware.
Glanceboard runs a lightweight local server on your computer (or a Raspberry Pi). Every few hours, it:
- Reads your calendar events via iCal URL (universal standard for calendar data .ics file)
- Fetches the current weather for your location
- Builds a creative prompt for your characters
- Generates an illustrated daily planner image from the above using Nano Banana
- Dithers the image for 6-colour e-ink and serves it to your display
The display polls the server for new images β no cloud account needed.
| Part | Description |
|---|---|
| Waveshare ESP32-S3 PhotoPainter |
**USB-C cableA computer or PiPython 3.9+**Node.js 18+ No soldering. No ribbon cables. Just one display and a server.
Using a Raspberry Pi as the display?The legacy Pi + separate e-ink HAT setup is still supported β see[Legacy Pi Setup].
Daily Nano Banana artβ Your calendar events become illustrated daily planners** 6 art styles**β Pen-and-ink, fashion sketch, watercolour, pixel art, comic book, and Japanese sumi-e** Custom characters**β Add people and pets with reference photos for consistency** Drag-and-drop widgets**β Add sports scores, stock tickers, news, daily quotes, email digest, weather, and more to your display layout** Google Calendar**β Connect via iCal URL (any calendar that exports iCal works)** Weather-aware**β Shows weather on the display; characters dress for the actual conditions** Location-aware**β Uses your location to generate regionally accurate scenes (no snow in Sydney!)** Smart countdowns**β AI scans your calendar for birthdays, trips, and holidays to count down to** Gemini-powered event rewriting**β Turns "9am Tavi Library Bag" into "Tavi β remember library bag!"** E-ink ready**β Floyd-Steinberg dithered for 6-colour Spectra panels** Smart scheduling**β Auto-generates at your chosen times, only when your calendar or weather changes** Custom prompts**β Edit the image generation prompt template** Email digest**β Optional Gmail integration shows unread email summaries (setup required)Fully localβ Runs on your own machine, no cloud account required
git clone https://github.com/google-gemini/glanceboard.git
cd glanceboard
cd server
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cd ..
cd web
npm install
npm run build # automatically creates src/config.js from template on first run
cd ..
cd server
source venv/bin/activate
python3 -m uvicorn app:app --host 0.0.0.0 --port 8000
Open http://localhost:8000 β the Glanceboard dashboard will guide you through setup:
API keyβ Enter your Google AI Studio key (seeAPI key setupbelow)** Calendar**β Paste your iCal URL** Location**β Set your timezone and location for weather** Art style**β Choose from 6 styles** Characters**β Add your family members and pets
See Display setup guide below to flash and connect your PhotoPainter.
Want to keep it running 24/7?See[Self-Hosting Guide]for systemd service setup, Raspberry Pi instructions, and running Glanceboard as a permanent home server.
Glanceboard works with a range of AI image generation models:
| Model | Provider | Notes |
|---|---|---|
| Nano Banana Pro | ||
| Gemini API | Recommended. Best quality, text rendering, and character consistency. | |
| Nano Banana 2 | ||
| Gemini API | Balances speed with quality |
Glanceboard also uses Gemini Flash 3.6 for intelligence:
- Rewriting calendar events into friendly language
- Generating weather-accurate scene descriptions
- Scanning calendars for important upcoming events
Glanceboard requires a Gemini API key to generate images.
- Go to
aistudio.google.com/apikey - Click
Create API Keyβ select your Google Cloud project (or create one) - Copy the key (starts with
AIza...
) - Paste it into the Glanceboard dashboard during onboarding
That's it.The key is stored locally in yourserver/data/config.json
file and used server-side to call the Gemini API.
-
Connect your PhotoPainter to your computer via USB-C
-
Open the Glanceboard Web FlasherinChrome or Edge - Click Install Glanceboard Firmware and select your device - Wait for the flash to complete (~2 minutes)
-
Unplug and replug the USB-C cable to reboot
-
After rebooting, the display shows a setup screen with the WiFi name
Glanceboard-XXXX -
On your phone or computer, connect to the
Glanceboard-XXXX
WiFi network (no password) - A setup page will open automatically (or go to
http://192.168.4.1
) - Enter your
WiFi network name andpassword(leave password blank for open networks) - Paste the
Display Image URL from your Glanceboard dashboard (found inSettings β E-Ink Display Setup β π Copy URL) β it looks likehttp://YOUR_SERVER_IP:8000/images/latest_display.bmp
- Choose a poll interval(how often the display refreshes) - Click Save & Connect
The device will restart, connect to your WiFi, and begin polling for images. The display will update within ~60 seconds.
Tip:You can reconfigure the device later by accessing its IP address from any browser on the same network. The IP is shown on the display after setup.
Using a Raspberry Pi as the display?The legacy Pi + separate e-ink HAT setup is still supported β see[Legacy Pi Setup].
Local Server (FastAPI on Python 3.11+)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
server/app.py
βββ /api/config GET/POST β settings
βββ /api/generate POST β trigger image generation
βββ /api/status GET β generation status
βββ /api/preview GET β preview the prompt
βββ /images/* static β generated display images
βββ /* static β built Vite SPA dashboard
data/config.json local config (API key, calendar, etc.)
data/images/ generated display images
Scheduler (APScheduler)
βββ runs every 15 min, generates at user-chosen hours
only when calendar/weather has changed
Web Dashboard (Vite SPA)
βββ Onboarding wizard
βββ Settings panel
βββ Drag-and-drop widget layout editor
βββ Character manager
βββ Live display preview
ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
βΌ βΌ
ESP32-S3 PhotoPainter AI Provider
polls /images/latest_* Gemini API
updates e-ink display (Gemini Flash / Pro)
Gemini Flash 3.6
β’ Rewrites calendar events in friendly text
β’ Generates weather-accurate scene prompts
β’ Scans calendar for important countdowns
glanceboard/
βββ server/ # Local Python server (FastAPI)
β βββ app.py # All backend logic + API endpoints
β βββ requirements.txt # Python dependencies
β βββ requirements-email.txt # Optional email widget dependencies
β βββ data/ # Runtime data (gitignored)
β βββ config.json # Your settings (gitignored)
β βββ config.example.json # Template config
β βββ gmail_credentials.json # Gmail OAuth credentials (gitignored, optional)
β βββ gmail_token.json # Gmail OAuth token (gitignored, optional)
β βββ images/ # Generated display images (gitignored)
βββ web/ # Frontend (Vite SPA)
β βββ index.html # Dashboard + landing page
β βββ src/
β βββ main.js # App logic
β βββ style.css # Styles
β βββ config.js # Firebase config (gitignored, only for hosted version)
β βββ config.example.js # Template config
βββ functions/ # Cloud Functions (for hosted version)
β βββ main.py # Backend logic (Firebase variant)
β βββ requirements.txt # Python dependencies
βββ firmware/ # ESP32-S3 PhotoPainter docs
β βββ README.md # SD card & firmware setup
βββ pi/ # Legacy Raspberry Pi scripts
β βββ LEGACY_PI_SETUP.md # Pi setup guide
β βββ install.sh # One-line installer
β βββ display_update.py # Display update script
βββ firestore.rules # Firestore security rules (hosted version)
βββ storage.rules # Storage security rules (hosted version)
βββ firebase.json # Firebase config (hosted version)
βββ SELF_HOSTING.md # Guide to running on your own server 24/7
βββ FIREBASE_DEPLOY.md # Firebase deployment guide (hosted version)
βββ EMAIL_SETUP.md # Optional email widget setup guide
βββ LICENSE # Apache 2.0 License
Glanceboard can optionally show a summary of your unread Gmail on the display. This requires setting up your own Google Cloud OAuth credentials β see ** EMAIL_SETUP.md** for step-by-step instructions.
The email widget:
- Only reads subject lines and sender names (not email bodies)
- Summarises them via Gemini into a short digest
- Runs entirely on your own machine β no data leaves your server
- Is completely optional β everything else works without it
Contributions are welcome! Please see CONTRIBUTING.md for details on how to contribute and the Contributor License Agreement (CLA) process.
Copyright 2026 Google LLC
All software is licensed under the Apache License, Version 2.0 (Apache 2.0); you may not use this file except in compliance with the Apache 2.0 license. You may obtain a copy of the Apache 2.0 license at: https://www.apache.org/licenses/LICENSE-2.0
All other materials are licensed under the Creative Commons Attribution 4.0 International License (CC-BY). You may obtain a copy of the CC-BY license at: https://creativecommons.org/licenses/by/4.0/legalcode
Unless required by applicable law or agreed to in writing, all software and materials distributed here under the Apache 2.0 or CC-BY licenses are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the licenses for the specific language governing permissions and limitations under those licenses.
This is not an official Google product.
Built with β€οΈ by Raph Dixon using Antigravity and Gemini Flash 3.6.