A modern, dark-themed Windows weather dashboard that auto-detects your location
and shows current conditions, hourly & 7-day forecasts, severe-weather alerts,
an interactive radar map, and astronomy data — all from free, key-less APIs.
Compiles to a single self-contained Nimbus.exe.
Grab the latest self-contained Nimbus.exe from the
Releases page — no install, no
Python, no dependencies. Just download and run.
| Area | Details |
|---|---|
| Current weather | Temperature, feels like, condition, rain & snow status |
| Stats | Humidity, wind (speed + direction + gusts), pressure, visibility, UV index, dew point |
| Forecasts | 24/48-hour hourly strip + detailed page, 7-day forecast with hi/lo range bars |
| Alerts | US National Weather Service active alerts; severe/extreme highlighted in red |
| Radar | Interactive Leaflet map — OpenStreetMap base + live RainViewer precipitation overlay (zoom / pan / location marker) |
| Europe storm tracker | Continent-wide rain & thunderstorm map (CARTO basemap + live RainViewer radar) on the dashboard |
| Sun & Moon | Sunrise, sunset, and a custom-painted realistic moon — shaded sphere with maria/craters and the true phase terminator (computed locally), shown in the hero card |
| Live clock | Header time ticks every second in the location's local timezone |
| Offline mode | Last good data is cached; if the network drops the app shows it with an "Offline" badge and never crashes |
| Settings | 12h/24h clock, auto-detect vs. manual city, refresh interval — persisted to settings/settings.json (temperature shown in °C) |
- Open-Meteo — forecast & air quality (current/hourly/daily, UV index)
- Open-Meteo Geocoding — manual city lookup
- ipapi.co / ip-api.com — IP geolocation (with automatic fallback)
- api.weather.gov (NWS) — severe-weather alerts (US)
- RainViewer — radar tiles · OpenStreetMap / CARTO — base map tiles
Nimbus/
├── main.py # entry point: logging + Qt + qasync loop + DI wiring
├── core/ # domain layer (no Qt/network deps where avoidable)
│ ├── models.py # dataclasses crossing the service<->UI boundary
│ ├── weather_codes.py # WMO code -> description / icon / scene
│ ├── astronomy.py # moon phase & illumination
│ ├── format.py # unit / time / compass formatting
│ ├── paths.py # source-vs-frozen path resolution
│ └── logging_config.py # centralized rotating-file logging
├── services/ # async API layer + DI container
│ ├── http.py # shared aiohttp client (retries, timeouts)
│ ├── geolocation.py # IP detect + manual geocode
│ ├── weather_api.py # Open-Meteo forecast + air quality -> WeatherBundle
│ ├── alerts_service.py # NWS alerts
│ ├── cache.py # TTL JSON + blob cache (offline fallback)
│ ├── settings_service.py # settings.json + change signal
│ ├── icon_service.py # vector (QPainter) icon renderer
│ ├── image_service.py # procedural hero backgrounds
│ ├── container.py # ServiceContainer (dependency injection)
│ └── controller.py # orchestrates fetch / cache / refresh timer
├── widgets/ # reusable presentational widgets
├── ui/ # MainWindow, Sidebar, and stacked pages/
├── themes/dark.qss # the dark theme stylesheet
├── assets/ # bundled resources (icons are drawn, so optional)
├── cache/ settings/ logs/ (created at runtime)
├── requirements.txt
├── Nimbus.spec # PyInstaller spec (onefile, windowed)
├── build.py # convenience build wrapper
└── README.md
Architecture: MVC-ish — core models, services (controller) logic, ui/
widgets views. All network I/O is async (aiohttp on the qasync loop) and
funnelled through services obtained from a single ServiceContainer
(dependency injection). Logging is centralized to a rotating file.
Requires Python 3.13 on Windows.
# from the Nimbus/ folder
py -3.13 -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python main.pyIf py isn't available, use the full interpreter path, e.g.
& "C:\Program Files\Python313\python.exe" -m venv .venv.
pip install -r requirements.txt
pyinstaller --noconfirm Nimbus.spec
# -> dist\Nimbus.exeor simply:
python build.py --cleanThe spec already encodes --onefile --windowed. The equivalent one-liner
(without the spec) would be:
pyinstaller --onefile --windowed --name Nimbus ^
--add-data "themes/dark.qss;themes" --add-data "assets;assets" ^
--hidden-import PySide6.QtWebEngineWidgets main.pyThe result is a single dist\Nimbus.exe with no external runtime
dependencies — copy it anywhere and run.
- First launch does a live fetch; subsequent launches render cached data instantly, then refresh in the background (default every 10 min).
- Writable data (cache / settings / logs) lives under
%LOCALAPPDATA%\Nimbusfor the frozen exe, or inside the project folder when run from source. - The radar map needs QtWebEngine, which the spec bundles automatically. If a stripped environment can't load it, the radar page shows a friendly message and the rest of the app keeps working.
- Icons and hero backgrounds are drawn at runtime (vector / cinematic procedural scenes), so the build stays fully self-contained and crisp at any DPI.
- Want photographic hero backgrounds? Drop images into
assets/backgrounds/named<scene>_<day|night>.jpg(or.png) — scenes areclear,cloudy,fog,rain,snow,storm(e.g.rain_night.jpg). If a matching file is present it's used automatically (cover-cropped); otherwise the procedural scene is drawn. Rebuild to bundle them into the exe.
Released under the MIT License.
Weather data © Open-Meteo (CC-BY 4.0) · Radar © RainViewer · Alerts © NOAA/NWS · Map data © OpenStreetMap contributors, tiles © CARTO.
