Weather without the clutter. noadsweather.com
A fast, ad-free, privacy-respecting weather website. No tracking, no cookies, no bloat. Just weather.
Weather websites are some of the most bloated pages on the internet. A typical weather page loads 6-12MB of JavaScript, tracking scripts, and ads just to show you the temperature. NoAdsWeather loads in under 530KB total — that's 10-20x lighter.
- Current conditions with feels-like, humidity, dew point, wind, gusts, UV index, and air quality
- Pollen data (Google Pollen API for non-European locations, Open-Meteo for Europe)
- 24-hour hourly forecast
- 10-day forecast with interactive charts (temperature, humidity/cloud/pressure, precipitation, wind)
- Animated weather radar with play/pause and speed controls
- Sunrise, sunset, solar noon, moonrise, moonset, and moon phase
- NWS severe weather alerts (US)
- Weather summary sentence generated from forecast data
- Dark mode (auto-detects OS preference, manual toggle)
- Fahrenheit/Celsius and 12H/24H toggles (auto-detects from country)
- Customizable layout — drag to reorder sections, resize, minimize, or hide any section
- Bookmarkable URLs with direct lat/lon for instant loading
- Installable as a PWA (Progressive Web App)
- International postal code support (60+ countries)
- Zero cookies, zero tracking, zero analytics
- Frontend: Plain HTML, CSS, vanilla JavaScript — no frameworks, no bundler, no npm dependencies at runtime
- Hosting: GitHub Pages (free)
- Weather data: Open-Meteo API (free, no API key)
- Radar: RainViewer API (free) + CartoDB map tiles
- Alerts: NWS API (free, US only)
- Air quality: Open-Meteo Air Quality API (free)
- Pollen: Google Pollen API via Cloud Run proxy
- Postal codes: Zippopotam (free, 60+ countries)
No build step is required to serve the site. Just serve the files:
npx http-server . -p 8080Then open http://localhost:8080.
There is one optional build script: scripts/build-cities.js. It regenerates the 77 static city pages under cities/ plus sitemap.xml. You only need to re-run it when you edit either:
scripts/cities.json(the city list), or- the city-page i18n keys in
js/i18n.js(cityPageTitle,cityPageSeoBlurb,cityPageHideBlurb).
node scripts/build-cities.jsThe generated cities/ directory is committed to the repo so GitHub Pages can serve it directly.
index.html — Single-page app entry; also the template used by build-cities.js
privacy.html — Standalone privacy page
about/ — Standalone about page
css/style.css — All styles with CSS custom properties for theming
js/app.js — All application logic (~3362 lines)
js/i18n.js — TRANSLATIONS object (15 languages)
fonts/, img/ — Static assets
scripts/ — build-cities.js + cities.json (generates city pages + sitemap.xml)
cities/ — 77 generated city pages (committed)
alerts-proxy/ — Cloud Run proxy for NWS alerts
pollen-proxy/ — Cloud Run proxy for Google Pollen API
robots.txt, sitemap.xml
CNAME — Custom domain config for GitHub Pages
LICENSE — MIT License
- User searches a city name or postal code
- Geocoding converts the search to lat/lon coordinates (Open-Meteo for cities, Zippopotam for postal codes)
- All weather APIs are called in parallel from the browser — no backend needed
- Sections render progressively as each API responds
- User preferences (layout, units, theme) are saved in localStorage
- Pollen data is fetched on-demand through a Cloud Run proxy to keep the API key private
- Domain: ~$10/year
- Hosting: Free (GitHub Pages)
- APIs: Free (Open-Meteo, RainViewer, NWS, Zippopotam)
- Pollen proxy: Free tier (Google Cloud Run)
- Total: ~$10/year
MIT — see LICENSE
If you find this useful, consider supporting us on Ko-fi.