Nate EmmertandClaude Sonnet 5.5 1566ac2897 Add user management with admin and viewer roles
- data/users.json store; existing single account migrates to first admin
- Roles: admin (settings, import, users) and viewer (read-only, own password)
- Live role/disabled lookup; per-user session epoch so password changes,
  resets and disabling sign that user out everywhere
- Login brute-force lockout (5 fails -> 5 min), constant-time unknown-user check
- /api/users CRUD with last-admin and self-lockout safeguards
- Account page (own password + admin user management); role-aware header
- Min password length 8; recovery token resets the primary admin and clears lockouts

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-15 12:34:13 -04:00

Weather App

Self-hosted weather app with animated radar. No API keys required.

Data Sources

  • Weather: Open-Meteo — free, no key
  • Radar: RainViewer — free, no key
  • Map tiles: CartoDB Dark Matter (free, no key)

Features

  • Current conditions (temp, feels-like, wind, humidity, pressure, visibility, UV, clouds)
  • 24-hour hourly forecast
  • 7-day daily forecast
  • Embedded radar panel on the conditions page
  • Full-page radar tab with animated past frames + nowcast
  • Animated radar timeline with play/pause controls
  • City search with autocomplete + GPS geolocation
  • Auto-pans radar to searched city
  • Dark mode (follows system preference)
  • Responsive / mobile-friendly

Quick Start

docker compose up -d

App runs at http://localhost:3000

Pull prebuilt image

docker pull ghcr.io/nmemmert/weather:latest
docker run -d --name weather-app -p 3000:3000 ghcr.io/nmemmert/weather:latest

If the package is private, log in first:

echo "<GITHUB_PAT>" | docker login ghcr.io -u nmemmert --password-stdin

Change the port

Edit docker-compose.yml:

ports:
  - "8080:3000"

Run without Docker

cd app
npm install
node server.js

Project structure

weather-app/
├── docker-compose.yml
└── app/
    ├── Dockerfile
    ├── package.json
    ├── server.js           # Express — proxies Open-Meteo, RainViewer
    └── public/
        ├── index.html
        ├── style.css
        └── app.js          # Weather render + dual Leaflet radar

Nginx reverse proxy

server {
    listen 80;
    server_name weather.yourdomain.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
S
Description
No description provided
Readme
3.2 MiB
0 Stars 1 Watchers 0 Forks
Languages
JavaScript 55.3%
HTML 26.4%
CSS 18.3%