A one-glance page — weather, news headlines, sun and moon times, and aircraft overhead — generated on your computer and read on the device as an EPUB.
This is host-side tooling. No firmware feature, no RAM cost, no background connectivity: see SCOPE.md.
Install the dependencies once:
python3 -m venv .venv && .venv/bin/pip install -r requirements.txtCopy the example config and edit it:
cp scripts/dashboard.config.example.json scripts/dashboard.config.local.json| Key | Meaning |
|---|---|
location.name |
Shown on the page and the cover |
location.lat / location.lon |
Used for weather, sun times, and the flight search |
units.temperature |
celsius or fahrenheit |
units.wind |
kmh, mph, ms, or kn |
news.feeds |
RSS or Atom feeds — name and url per entry |
news.max_per_feed |
Headlines kept per feed (default 5) |
flights.radius_miles |
Search radius around your location (default 25) |
device.host |
almanac.local, or the IP shown on screen if mDNS does not resolve |
device.path |
Directory on the SD card (default /Books) |
The .local.json file is gitignored — your location and feeds stay out of the
repository.
-
On the device, open File Transfer mode.
-
Run:
.venv/bin/python scripts/generate_dashboard_epub.py
-
Open Dashboard.epub on the device.
If the device is not reachable the EPUB is still built and the command prints
the exact curl line to push it later.
| Flag | Effect |
|---|---|
--no-upload |
Build only; leave the file in build/ |
--out PATH |
Write the EPUB somewhere else |
--config PATH |
Use a different config file |
- The filename is always
Dashboard.epub. The device refuses an upload when the target already exists, so the tool deletes the previous copy first — which also clears that book's cache, so the new page renders instead of yesterday's, and you start back at page 1. - Because the old copy is removed first, an upload that fails partway leaves the
device without a dashboard until the next successful run. The local copy under
build/always survives, so you can retry without regenerating. - Any section that fails to fetch renders as "unavailable" with the reason; the rest of the page is unaffected.
- Anonymous OpenSky access is rate-limited, so the Flights section is the one most likely to be empty. That is expected.
- Every page carries the generation time, so a stale page is visibly stale.
.venv/bin/pytest -vNo network access is required — the suite runs against fixture payloads.