WeatherNode

WeatherNode

Docker app from centauri's Repository

Overview

WeatherNode is a self-hosted website for your personal weather station. It shows live readings, forecasts, rain radar, history, records and statistics, and it can add air quality, pollen, tides, rivers, astronomy and more from free public sources. It reads data from Ecowitt, Davis WeatherLink, Weather Underground, Ambient Weather, WeatherFlow Tempest and several other stations and upload formats. You do not need a station to try it: forecasts and the other public data work on their own. Everything runs in this one container, including the background tasks that fetch new data every minute. On first start it creates its database and a secret key in the folders below. Open the WebUI to create your admin account, then follow the short setup.

WeatherNode

WeatherNode is a self hosted weather dashboard for your personal weather station. It combines live station readings with external data like forecasts, alerts, radar, air quality, astronomy, and more.

I built WeatherNode for my own station first. I wanted a dashboard that loads fast, stays usable during API outages, and lets me choose where the data comes from. Once it worked well enough for daily use, I decided to share it so you can run it too.

Screenshots

The public dashboard — live station readings, the current forecast, and the day's trends:

WeatherNode dashboard showing live weather station data, forecast and charts

Precipitation radar Community stations map
Precipitation radar centred on the station location Map of community weather stations that opted in to share their location

The admin panel — a dashboard with live ingest stats and station status, and settings to configure dozens of data sources, sensors, widgets and themes:

WeatherNode admin dashboard with live ingest statistics, station info, battery and sensor status

WeatherNode admin settings showing dozens of configurable data sources and integrations

More pages

WeatherNode has dedicated pages for each data source — a few more:

Forecast Satellite
Forecast page with daily and hourly outlook Satellite page with solar radiation forecast and imagery
Statistics & records History
Statistics and records with monthly averages and extremes History page with daily charts of past weather
Air quality Fire weather
Air quality page with AQI index and health advice Fire weather page with fire-danger and Angstrom index
Pollen forecast Aviation / METAR
Pollen forecast with 5-day grass, tree and weed levels Aviation METAR page with airport weather and atmospheric profile
Tides River levels
Tides page with tidal chart and forecast River levels with live gauge readings
Noise level Astronomy
Noise level with live readings and 24-hour history Astronomy page with sun and moon times and moon phases

Live demo running a real station: meteouitgeest.nl

If you are setting up a server, start with HOSTING.md to choose the right setup for your situation (VPS, shared hosting, or Docker), then follow DEPLOYMENT.md for the step-by-step install.

Support

Buy me a coffee

Documentation

Where the details live

This README stays focused on what WeatherNode is and what you get. Detailed server setup lives in DEPLOYMENT.md. Detailed admin operations live in ADMIN_GUIDE.md.

Features

🌡️ Live station data

  • Live station readings from Ecowitt, WeatherFlow, WeatherLink, Ambient Weather, Wunderground, and local file sources.
  • Per card timestamps so you see when each data source last updated.
  • Sensor health detection and OFFLINE badges when a source goes stale.
  • Optional alert notifications when fetching or saving fails.

🌤️ External data

  • Forecast sources include Yr.no, OpenWeatherMap, Weather Underground, Environment Canada, and Wxsim.
  • Weather alerts support multiple providers by region.
  • Air quality from WAQI and Sensor.Community.
  • Aurora, ISS passes, astronomy calculations, earthquakes, and METAR.

🗺️ Pages

  • Radar and satellite pages.
  • Forecast, air quality, astronomy, earthquakes, lightning, and pressure map pages.
  • History and statistics pages.
  • Community stations map.

🧰 Admin and operations

  • Admin panel for data sources, widgets, appearance, effects, mail, and updates.
  • In app updater with preview, backups, and rollback.
  • Cache first public site. WeatherNode updates data in the background and serves public pages from cache.

🎨 Customization

  • FX and Flat visual modes, with WeatherNode, Ocean, Forest, and Solar Flare colour palettes and visitor-selectable light/dark/system modes.
  • Admin drag and drop widget ordering on the dashboard.
  • Optional visual effects like rain, snow, wind, lightning, and fog.

🌐 Locale and units

  • Language and unit defaults set by the site admin.
  • Optional browser based locale and region detection, with fallback to the site defaults.

🔐 API and security

  • JSON API is protected by API keys. You manage keys at /admin/api-keys.
  • Authentication, endpoints, response details, and integration examples are documented in docs/API.md.
  • Optional secure push mode for Ecowitt receivers.

📡 Community telemetry

  • Optional station telemetry upload to a community aggregator.
  • Community stations map page, if you enable telemetry.

🤖 Optional AI

  • Built in forecast narrator.
  • Optional AI rephrasing for forecast text, off by default.

Requirements

  • PHP 8.2 or newer.
  • SQLite or MySQL.
  • Composer.
  • Node.js and npm for building frontend assets.

Quick start for local development

git clone https://github.com/centauri/WeatherNode.git
cd WeatherNode
composer install && npm install
cp .env.example .env && php artisan key:generate
php artisan migrate && php artisan db:seed
php artisan admin:create
npm run build && php artisan serve

Open your site and sign in at /admin using the admin account you created with php artisan admin:create.

Local development helpers

composer run setup
composer run dev
composer test

Admin bootstrap

php artisan db:seed seeds system settings. Create your first admin account with:

php artisan admin:create

For automation, use non-interactive flags:

php artisan admin:create --email=admin@example.com --password="strong-password" --name="Administrator"

After login, users can change their own password from /profile. If you lose admin access, use php artisan admin:fix-access <email> --password="new-strong-password".

Deployment

DEPLOYMENT.md covers production setup, cron, storage permissions, and web server configuration. For in-app updater behavior (what it runs and what it does not), see the "In-app updater command behavior" section in DEPLOYMENT.md. If you do not have Node.js/npm available, use SHARED_HOSTING_QUICKSTART.md for a no-npm deployment flow.

Docker container

WeatherNode is also available as a Docker image (published on GitHub Container Registry):

docker pull ghcr.io/centauri/weathernode:latest

Recommended Docker setup (compose-first):

git clone https://github.com/centauri/WeatherNode.git
cd WeatherNode
# Edit docker-compose.yml: set APP_URL and APP_KEY
php artisan key:generate --show
make docker-up

The container startup runs migrations automatically. On first startup it also runs one-time bootstrap (storage:link, db:seed, and optional admin:create when ADMIN_EMAIL + ADMIN_PASSWORD are set in docker-compose.yml). If you leave ADMIN_EMAIL / ADMIN_PASSWORD empty, create the first admin account in the browser at /setup/admin (available only while no users exist).

Log in and WeatherNode asks where the station is and where its readings come from, with a map for the coordinates. It ships knowing nothing about any particular place, so this is the one thing it needs before the weather pages mean anything. It takes a minute and can be put off.

For a friendlier startup check flow, use:

make docker-up

If you changed Docker build files, rebuild with:

make docker-rebuild

For full Docker usage (including the scheduler container), see DOCKER.md.

Release artifacts: why no ZIP on normal push?

A normal commit + push to main only builds/publishes the Docker image (latest). The deploy ZIP (weathernode-deploy.zip) is created only for tag pushes (v*), for example:

git tag v2026.05.1
git push origin v2026.05.1

AI features

WeatherNode can generate short forecast text. It uses a built in narrator. You can enable optional AI rephrasing for that text, it is off by default. Configuration lives in config/nlg.php and the related environment variables. If you enable AI rephrasing, the app may send forecast text to the configured provider.

Developer utilities

make clean
make release

make release expects a plain text/Markdown changelog bullet (raw HTML tags are rejected).

Media gallery

1 / 4

Install WeatherNode on Unraid in a few clicks.

Find WeatherNode in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for WeatherNode Review the template variables and paths Click Install

Requirements

Nothing extra. A weather station, or an API key for an online weather source, is optional.

Related apps

Details

Repository
ghcr.io/centauri/weathernode:latest
Last Updated2026-09-26
First Seen2026-09-26

Runtime arguments

Web UI
http://[IP]:[PORT:80]/
Network
bridge
Shell
bash
Privileged
false

Template configuration

WebUI PortPorttcp

Port for the website. 10130 is unused by other apps in Community Applications (and a nod to 1013 hPa, normal air pressure at sea level).

Target
80
Default
10130
Value
10130
StoragePathrw

Logs, caches, uploads and the saved secret key (.app-key). Keep this folder in your backups: without the key, saved API keys and passwords cannot be read.

Target
/var/www/html/storage
Default
/mnt/user/appdata/weathernode/storage
Value
/mnt/user/appdata/weathernode/storage
DatabasePathrw

The SQLite database with all readings and settings.

Target
/var/lib/weathernode
Default
/mnt/user/appdata/weathernode/database
Value
/mnt/user/appdata/weathernode/database
Site address (APP_URL)Variable

The address you open WeatherNode on, for example http://192.168.1.10:10130 or https://weather.example.com. Used for links in e-mails and share images.

Target
APP_URL
Admin e-mail (optional)Variable

Creates the first admin account on first start. Leave empty to create it in the browser instead.

Target
ADMIN_EMAIL
Admin password (optional)Variable

Password for the admin account above. Only used on first start.

Target
ADMIN_PASSWORD
APP_KEYVariable

Leave empty. A key is generated on first start and saved in the Storage folder. Only set this to move an existing install; changing it later makes saved API keys and passwords unreadable.

Run scheduler in this containerVariable

Runs the background tasks that fetch weather data every minute. Leave this on.

Target
DOCKER_RUN_SCHEDULER
Default
true
Value
true
DB_CONNECTIONVariable

Database type. Leave on sqlite unless you run MySQL yourself (then also set DB_HOST, DB_PORT, DB_USERNAME and DB_PASSWORD).

Default
sqlite
Value
sqlite
DB_DATABASEVariable

Location of the SQLite file inside the container. It must stay inside the Database folder above.

Default
/var/lib/weathernode/database.sqlite
Value
/var/lib/weathernode/database.sqlite
CACHE_STOREVariable

Where the cache is kept. Leave on file.

Default
file
Value
file
CONTAINERIZEDVariable

Tells WeatherNode it runs in a container, so the Updates page tells you to update the container instead of using the in-app updater.

Default
true
Value
true
APP_ENVVariable

Leave on production.

Default
production
Value
production
APP_DEBUGVariable

Shows detailed error pages. Only turn on briefly while troubleshooting, as it can reveal settings.

Default
false
Value
false