Licensed under a Creative Commons Attribution 4.0 International License.
A lightweight, self-refreshing information dashboard designed for a fixed display in a living room, running on a Raspberry Pi. No server, no framework — just a Python data fetcher and a static HTML page.
- Current weather — temperature, wind speed, precipitation probability, sunrise/sunset times, weather icon (WMO code)
- 6-day forecast — daily min/max temperatures, weather icon, rain probability and accumulation
- Air quality — real-time European AQI with colour-coded label (green → amber → red)
- News feed — 2×2 grid: 2 local headlines (Ouest-France, Rennes) and 2 world headlines (Courrier International), full titles, no truncation
- Live clock — refreshes every 30 seconds without reloading the page
dashboard/
├── data/
│ └── dashboard.json # generated by update.py, read by app.js
├── venv/ # Python virtual environment (created by install.sh)
├── .firefox-profile/ # Firefox profile for local file access (created by start.sh)
├── app.js # Renders dashboard.json into the three panels
├── index.html # Page shell; loads fonts, Weather Icons, app.js
├── style.css # Dark theme, CSS tokens, responsive layout
├── update.py # Fetches weather + news, writes dashboard.json
├── install.sh # One-time setup (venv + dependencies)
├── start.sh # Main launcher (data fetch + browser + refresh loop)
├── dashboard.desktop # Double-click entry point for the file manager
└── start.log # Runtime log written by start.sh (auto-created)
update.py calls two free APIs (no key required):
- Open-Meteo — weather forecast and current conditions
- Open-Meteo Air Quality — European AQI
It also parses two RSS feeds:
rennes.maville.com— local Rennes news (Ouest-France)courrierinternational.com— world news
All data is written to data/dashboard.json. app.js fetches that file on page load and renders the three panels. The page itself never makes network requests — all external calls go through update.py.
start.sh orchestrates the full lifecycle: it runs update.py once on startup, opens the browser in kiosk mode, then re-runs update.py every 15 minutes in a loop and reloads the page (via xdotool).
- Raspberry Pi running Raspberry Pi OS (or any Debian-based Linux)
- Python 3.7+
- Firefox or Chromium
- Internet connection (for APIs, RSS feeds, and CDN-hosted fonts and icons)
Optional but recommended for automatic page reload:
sudo apt install xdotoolRun once, from inside the project directory:
cd ~/dashboard
bash install.shThis creates the venv/ folder, installs requests and feedparser, and generates the first dashboard.json.
Edit dashboard.desktop and replace the path with the actual location of your project:
Exec=bash /home/your-username/dashboard/start.sh
Then make it executable (right-click → Allow executing in the file manager, or):
chmod +x dashboard.desktopDouble-click dashboard.desktop to launch. The dashboard will open full-screen and refresh automatically every 15 minutes.
All runtime output is logged to start.log in the project directory — useful for troubleshooting.
To use a different location, edit the coordinates at the top of update.py:
LAT = 48.1173 # latitude
LON = -1.6778 # longitude
TIMEZONE = "Europe/Paris" # IANA timezone nameTo change the refresh interval, edit INTERVAL in start.sh (value in seconds):
INTERVAL=900 # 15 minutesTo add or replace news sources, edit the news dict in update.py and update the matching key lookups in app.js:
news = {
"Rennes (Ouest France)": rss_titles("https://..."),
"Monde (Courrier international)": rss_titles("https://..."),
}- Fonts (Google Fonts CDN): Bebas Neue (clock, large temperatures), Inter (body), Roboto Mono (numeric values in forecast)
- Icons: Weather Icons 2.0.10 via cdnjs — mapped from WMO 4677 weather codes
- Colour palette: near-black background (
#0d0f14), orange accent for warm values (#f97316), blue for cold/rain (#60a5fa), semantic colours for AQI - Layout: CSS Grid, two columns on top + full-width strip at the bottom; responsive single-column below 900px

