A wall-mounted / kiosk-style home dashboard showing local weather, live solar production & battery data from a Sungrow inverter (via the iSolarCloud API), an AI-generated daily outlook, and a regional news feed.
- π₯οΈ Kiosk-ready home dashboard with a glassmorphism look β mesh-gradient background and frosted glass cards.
- π§ Multi-page layout with a collapsible sidebar: Home, Weather, News, and Solar (Live + Statistics).
- π Home overview combining a time-of-day greeting, weather hero, live production status, current conditions, news, animated power flow, and the AI outlook β all on one screen.
- π Themes: light, dark, system, and auto (switches between light/day and dark/night by time of day).
- π Multi-language UI: English, German, and Dutch, persisted across sessions (cookie +
localStorage). - βΆ Fullscreen / kiosk mode toggle for wall-mounted displays.
- π Unified 5-minute auto-refresh plus a manual refresh control, keeping weather and solar data in sync so they never drift apart.
- π± Responsive down to mobile, with a slide-in drawer sidebar and graceful loading / empty / error / "outdated data" states throughout.
- π‘οΈ Current conditions: temperature, feels-like, humidity, precipitation, wind speed, and cloud cover.
- π Daily forecast with min/max temperature, daylight & sunshine duration, and cloud cover.
- π€οΈ Day/night-aware icons mapped from Open-Meteo weather codes using the location's sunrise/sunset.
- π‘οΈ Backend proxy with automatic retry on transient network errors.
- β‘ Live production readings: solar output, grid import/export, battery power & charge level, household load, and daily yield.
- ποΈ Per-roof (per-string) PV power (e.g. East / West roof), supporting both plain grid-tied and hybrid/ESS (battery) inverters.
- π Animated power-flow visualization of energy moving between panels, battery, home, and grid.
- π Statistics page with a monthly-production chart and a per-roof intraday power chart (Recharts).
- π Cookie-based session (httpOnly) with a login/logout dialog and live connection status.
- π§ͺ Graceful fallback to demo/mock data before you connect, so the UI is fully usable without live credentials.
- π€ Natural-language daily summary of the weather, how solar is tracking, and anything notable about battery/grid usage.
- π£οΈ Language-aware β the summary is written in the currently selected UI language.
- πΎ Smart caching: volatile readings are bucketed into the cache key so the 5-minute refresh mostly hits the cache, only re-prompting the model when conditions change meaningfully (1-hour TTL).
- π° Merged regional feed (
ausland+inland), deduplicated and sorted newest-first. - πΌοΈ Normalized articles with a 16:9 teaser image, kicker/region, breaking-news flag, and a link to the full story.
- ποΈ Shown both as a card on the home screen and on a dedicated news page.
- β±οΈ 15-minute server-side cache to stay within the upstream feed's rate limits.
- π§± pnpm + Turborepo monorepo with a shared TypeScript contract package (
@repo/shared) as the single source of truth for API routes and payload shapes. - π§© Type-safe file-based routing (TanStack Router) and data fetching (TanStack Query).
- π Deploy scripts (
bin/) for provisioning and shipping to a Debian/nginx host.
- Monorepo: pnpm workspaces + Turborepo
- Backend (
apps/backend): Express 5, TypeScript (ESM),tsxfor dev,node-cachefor caching,openmeteo+ollamaclients - Frontend (
apps/web): Vite, React 19, TanStack Router + TanStack Query, Tailwind CSS v4, shadcn/radix-ui, Recharts - Shared (
packages/shared): TypeScript types and constants shared between backend and frontend, built withtsup
apps/
backend/ Express API β weather (Open-Meteo), iSolarCloud/Sungrow, AI overview (Ollama), news (Tagesschau)
web/ React SPA β dashboard UI
packages/
shared/ Shared types, constants, and API route definitions (@repo/shared)
tsconfig/ Shared base tsconfig presets
bin/
install-deps.sh Provisions a fresh Debian host (nginx, node via nvm, pnpm, firewall)
deploy.sh Pulls latest main, builds apps/web, copies dist/ to the target host
Prerequisites: Node.js (LTS) and pnpm.
pnpm installConfigure the backend by copying the example env file and filling in your credentials:
cp apps/backend/.env.example apps/backend/.env| Variable | Description |
|---|---|
FRONTEND_ORIGIN |
Comma-separated list of origins allowed by CORS (default http://localhost:5173) |
PORT |
Backend port (default 4000) |
OPENMETEO_URL |
Open-Meteo forecast API base URL |
TAGESSCHAU_NEWS_URL |
Tagesschau news feed base URL (region/ressort params are appended automatically) |
ISOLAR_CLOUD_URL |
iSolarCloud OpenAPI gateway base URL |
ISOLAR_CLOUD_APPKEY |
iSolarCloud app key |
ISOLAR_SECRET_KEY |
iSolarCloud access key |
OLLAMA_URL |
Ollama host for the AI overview (default https://ollama.com) |
OLLAMA_MODEL |
Model used to generate the outlook blurb |
OLLAMA_API_KEY |
Bearer token for the Ollama host (optional for local hosts) |
Run both apps in dev mode:
pnpm dev- Frontend: http://localhost:5173
- Backend: http://localhost:4000
Run from the repo root (Turborepo fans these out to each workspace):
pnpm dev # run backend + web in watch mode
pnpm build # build all workspaces
pnpm lint # lint all workspaces
pnpm typecheck # typecheck all workspacesThe backend exposes the following endpoints (route paths are defined in @repo/shared's API_ROUTES):
| Route | Description |
|---|---|
GET /health |
Service health check |
GET /weather |
Current conditions + daily forecast (Open-Meteo) |
POST /isolar/login Β· POST /isolar/logout Β· GET /isolar/status |
iSolarCloud session management |
GET /isolar/solar-data |
Live production / battery / grid / per-roof readings |
GET /isolar/statistics |
Monthly production + per-roof intraday power |
POST /ai/overview |
AI-generated daily outlook (Ollama) |
GET /news |
Normalized regional news feed (Tagesschau) |
bin/deploy.sh builds apps/web and copies the static output to a target directory on a server (default /var/www/html, i.e. nginx's default document root β the app is served at /), intended to run behind nginx, while the backend runs as a long-lived Node process. See bin/install-deps.sh for initial host provisioning. Run bin/deploy.sh --help for available flags.
Released under the MIT License.