the forecast, narrowed
A small web app that solves a small frustration: every weather app shows a slightly different temperature. Truecast polls multiple meteorological models in parallel, averages them, and shows you the 3 sources closest to consensus so you can see who actually agrees — plus a 24-hour chart, 7-day outlook, air quality, sun & UV, and a model-disagreement score.
prefers-reduced-motionOut of the box (no API keys required, all CORS-friendly):
| Source | Operator |
|---|---|
| Open-Meteo (ensemble best-match) | Open-Meteo |
| NOAA GFS | US National Oceanic and Atmospheric Admin. |
| ECMWF IFS | European Centre for Medium-Range Weather |
| DWD ICON | Deutscher Wetterdienst (Germany) |
| ECCC GEM | Environment & Climate Change Canada |
| JMA | Japan Meteorological Agency |
| NWS observations | US National Weather Service (US locations) |
Optionally enabled by pasting an API key into the Settings disclosure:
Keys are stored only in localStorage and sent only to the matching provider.
npm install
npm run dev # dev server on http://localhost:5173
npm run build # type-check + production bundle in dist/
npm run preview # serve the built bundle locally
Geolocation needs
https://orlocalhost— it won't work overfile://.
Deployed on Vercel (vercel.json defines the build). Push to the connected
branch and Vercel builds + ships automatically. To deploy anywhere else, run
npm run build and copy dist/ to any static host (GitHub Pages, Cloudflare
Pages, S3 + CloudFront, etc.).
.
├── index.html # Vite entry
├── src/
│ ├── main.ts # mount App
│ ├── App.svelte # composes everything, runs the fetch cycle
│ ├── app.css # design tokens + base layout
│ ├── components/ # one file per UI piece
│ └── lib/
│ ├── state.svelte.ts # global runes-based state + localStorage
│ ├── types.ts # shared types
│ ├── sources/ # one file per weather provider
│ ├── api/ # forecast, air-quality, geocoding
│ └── utils/ # units, stats, format, weather-code mapping
├── CLAUDE.md # context for AI assistants
├── README.md # this file
└── package.json
See CLAUDE.md for architecture notes and the Source
contract — adding a new provider is one new file in src/lib/sources/.
MIT.