A modern desktop weather app that asks four world-class models, shows you where they disagree, and grades its own accuracy.
β¨ Features Β β’Β πΈ Screenshots Β β’Β π Quick Start Β β’Β π¬ How It Works Β β’Β πΊοΈ Roadmap
| weather models queried in parallel |
hourly strip and daily outlook |
API keys required |
self-scored vs. persistence & IFS |
Most weather apps present one model's output as if it were certain. But models disagree, and that disagreement is useful information.
Weather Forecasting queries several independent models at once, reports the median, shows how far apart they are, and then checks itself against what actually happened, so you can see how much to trust a forecast, not just what it says.
π‘ Narrow spread = models agree. Wide spread = treat the forecast with caution.
| Queries ECMWF IFS, ECMWF AIFS, GFS and ICON in parallel and reports the median temperature with a confidence spread. | Grades forecasts against observed conditions and benchmarks them against persistence and IFS baselines. | Automatic detection of heat, cold, wind, rain and storm conditions. |
| Ranks locations by comfort, safety and overall conditions. | Daylight curve with sunrise and sunset markers, plus the current moon phase. | A 24-hour strip and 5-day outlook with precipitation probabilities. |
| Card-based layout with dynamic colors and icons that follow conditions. | City search with geolocation calibration. | A quick terminal preview of the full ensemble, great for scripting. |
β±οΈ Hourly strip Β· 5-day outlook Β· Forecast accuracy |
β¨οΈ CLI preview Β· Multi-model ensemble output |
flowchart LR
A["City search<br/>or geolocation"] --> B["fetcher.py"]
B --> C1["ECMWF IFS"]
B --> C2["ECMWF AIFS"]
B --> C3["GFS"]
B --> C4["ICON"]
C1 --> D["Ensemble merge<br/>median + spread"]
C2 --> D
C3 --> D
C4 --> D
D --> E["alerts.py"]
D --> F["scoring.py"]
D --> G["ui.py + widgets.py"]
E --> G
F --> G
style A fill:#1b5fa8,color:#fff
style D fill:#8b5cf6,color:#fff
style G fill:#22c55e,color:#fff
| Step | What happens |
|---|---|
| 1 Β· Fetch | Open-Meteo is queried once per configured model, in parallel |
| 2 Β· Merge | Responses are normalized; the median is reported and the spread becomes the confidence signal |
| 3 Β· Assess | Alert rules flag hazards; scoring ranks comfort and safety |
| 4 Β· Grade | Past forecasts are compared with observations using MAE and hit rate, against persistence and IFS baselines |
Requirements: Python 3.10+ and an internet connection. No API key.
1 Β· Clone
git clone https://github.com/sonubiswal/Weather-Forecasting.git
cd Weather-Forecasting2 Β· Create a virtual environment
| πͺ Windows | π macOS / π§ Linux |
|---|---|
python -m venv venv
venv\Scripts\activate |
python3 -m venv venv
source venv/bin/activate |
3 Β· Install
pip install -r requirements.txt4 Β· Run
| π₯οΈ Desktop GUI | β¨οΈ CLI preview |
|---|---|
cd src
python -m weather_app.main |
python preview.py |
π Sample CLI output
Puri, India (19.798, 85.825)
median temperature : 26.1 Β°C (spread 2.1Β° across 4/4 models)
feels like : 31.6 Β°C
humidity / wind : 88% / 4.8 km/h
condition : Clear sky
confidence : Good confidence Β· 4 models within 2.1Β°
hours / days : 24 / 5
models configured : ecmwf_ifs025, ecmwf_aifs025_single, gfs_seamless, icon_seamless
Weather-Forecasting/
βββ πΌοΈ assets/
β βββ banner.svg
β βββ screenshots/
βββ π¦ src/weather_app/
β βββ __init__.py # Package metadata and version
β βββ main.py # Entry point (QApplication + event loop)
β βββ fetcher.py # Open-Meteo client, ensemble merge, normalization
β βββ scoring.py # Comfort / safety scoring, accuracy tracking
β βββ alerts.py # Severe weather detection rules
β βββ theme.py # Dynamic color, font, and icon selection
β βββ widgets.py # Reusable PySide6 components (cards, strips, arcs)
β βββ ui.py # Main window layout and event wiring
βββ preview.py # Headless CLI preview
βββ requirements.txt
βββ pyproject.toml
βββ .env.example
| Principle | In practice |
|---|---|
| Separation of concerns | Data (fetcher), logic (scoring, alerts) and presentation (ui, widgets, theme) are separate modules |
| Reusable widgets | UI building blocks are isolated in widgets.py |
| Provider-agnostic data layer | Normalization in fetcher.py keeps the rest of the app independent of the API's response shape |
Open-Meteo needs no key, so this is optional. To add a custom provider later:
| πͺ Windows | π macOS / π§ Linux |
|---|---|
copy .env.example .env |
cp .env.example .env |
| Model ID | Provider |
|---|---|
ecmwf_ifs025 |
πͺπΊ ECMWF IFS |
ecmwf_aifs025_single |
π€ ECMWF AIFS |
gfs_seamless |
πΊπΈ NOAA GFS |
icon_seamless |
π©πͺ DWD ICON |
β ModuleNotFoundError: No module named 'weather_app'
Run from inside src using the module form:
cd src
python -m weather_app.mainπ The app opens but shows no data
Check your internet connection and that Open-Meteo is reachable. The CLI line shows how many models responded (for example 4/4 models).
π¦ PySide6 fails to install or the window won't launch
Use Python 3.10+ and upgrade pip first:
python -m pip install --upgrade pip
pip install -r requirements.txtOn some Linux distributions, Qt may need extra system libraries (for example libxcb-related packages).
πͺ venv won't activate in PowerShell
Use Command Prompt, or allow scripts for the current session:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned- π Historical trend charts (30 / 90-day temperature and rainfall)
- β Saved locations and quick-switch favorites
- π System tray notifications for active alerts
- π Light / dark theme toggle
- π¦ Standalone executable (PyInstaller)
- π Expanded accuracy dashboard (per-model scoring breakdown)
Have an idea? Open an issue π¬
Contributions, bug reports and feature requests are welcome.
- π¬ Open an issue first to discuss any major change
- π΄ Fork the repo and create a branch:
git checkout -b feature/your-feature - βοΈ Commit with clear, descriptive messages
- π Open a Pull Request explaining what changed and why
Please keep changes focused, match the existing module structure, and include screenshots for UI changes.
Weather data by Open-Meteo.com under CC BY 4.0. Forecasts derive from models operated by ECMWF, NOAA (GFS) and DWD (ICON).
β οΈ Disclaimer: For informational use only. Do not rely on this app as your sole source for safety-critical decisions; consult official meteorological authorities during severe weather.
Released under the MIT License. See LICENSE.
Sonu Biswal Β· @sonubiswal

