Commit graph

47 commits

Author SHA1 Message Date
de21688e55 Fix: use HTTPS domain for registry push [skip ci] 2026-03-10 19:27:02 +01:00
490f6322cb Fix: use git clone instead of actions/checkout
Some checks failed
Build Docker Image / build (push) Failing after 20s
2026-03-10 17:47:00 +01:00
435a19cb4d Add: Forgejo CI build workflow (migrated from GitLab CI)
Some checks failed
Build Docker Image / build (push) Failing after 2s
2026-03-10 17:38:35 +01:00
76c490eb60 CI: Fix registry to use port 9080 (same as GitLab) 2026-03-07 11:31:35 +00:00
bbca69f258 CI: Switch registry to adriahub (192.168.1.100:5050) 2026-03-07 11:24:59 +00:00
Sam
a4236e23f4 CI: master-Pushes taggen als :nightly statt :latest
Workflow: master → :nightly (Entwicklung/Test), manuell → :latest (stabil)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 21:50:10 +01:00
Sam
cbcdf4915d Rename: Sam's → Claude's Aufgaben (Vikunja + Dashboard)
- Vikunja Projekt 5 umbenannt zu "Claudes Aufgaben"
- Dashboard Tab-Label von "Sam's" zu "Claude's" geändert

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 01:45:19 +01:00
Sam
4b2e5beaf6 Fix: Tech-Kategorie für Golem/Heise/Computerbase News
Golem, Heise und Computerbase wurden als "allgemein" kategorisiert weil
die RSS-Feeds keine spezifische Kategorie liefern. Jetzt werden diese
Sources automatisch als "tech" kategorisiert.

- Source-basiertes Mapping in news_service._row_to_dict
- DB-Queries für category=tech filtern nach Source + allgemein
- "allgemein" Filter schließt Tech-Sources aus (kein Doppel)
- get_categories injiziert "tech" wenn Tech-Sources vorhanden

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 01:37:43 +01:00
Sam
e715197b7a Fix: Stündlich-Bereich im Wetter-Modal scrollbar machen
- shrink-0 statt min-w damit Flex-Items nicht zusammengedrückt werden
- Scrollbar sichtbar (thin) mit accent-farbigem Styling
- Fade-Gradient am rechten Rand als Scroll-Hinweis

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 01:21:07 +01:00
Sam
b4906b7a48 Fix: Add sunrise/sunset to forecast type definition
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 01:15:53 +01:00
Sam
2f56be835e Add: München als 3. Wetter-Location + Wetter-Detail-Modal
- München als tertiärer Standort (iris-Akzent) hinzugefügt
- Klick auf WeatherCard öffnet Detail-Modal mit:
  - 24h stündliche Prognose (horizontal scrollbar)
  - 7-Tage-Vorhersage mit Temperaturbalken
  - Wind, Feuchte, Sonnenauf/-untergang
- Backend: 7-Tage statt 3-Tage Forecast, 24 Hourly-Slots pro Standort
- Backend: forecast_3day → forecast Feldname-Konsistenz
- Dashboard: 3-Spalten Wetter-Grid statt 4 (HourlyForecast → Modal)
- Admin: Tertiärer Standort konfigurierbar
- THERMAL Design: iris glow, modal animation, Portal-basiertes Modal

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 01:13:49 +01:00
Sam
d9626108e6 fix: reduce WebSocket refresh interval to 10s for live MQTT data
- Client ping interval: 15s → 10s
- Server timeout fallback: 20s → 12s
- Ensures CPU/RAM values update promptly from MQTT store

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 23:58:14 +01:00
Sam
0dce8a9d80 layout: stack server cards in single column
Both Unraid servers now render stacked in one column instead of
each taking a separate grid cell. Grid changed from 4-col to 3-col
(servers | HA | tasks).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 23:51:59 +01:00
Sam
bc2dcb5589 feat: interactive Vikunja tasks — checkbox toggles done, click opens task
- Added POST /api/tasks/toggle endpoint to mark tasks as done/undone
- Added toggle_task_done() in vikunja_service (POST /tasks/{id})
- Cache invalidated after toggle for immediate refresh
- Checkbox click toggles done state with visual feedback
- Click on task row opens Vikunja in new tab (/tasks/{id})
- ExternalLink icon appears on hover as affordance

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 23:43:01 +01:00
Sam
c6db0ab569 refactor: replace GraphQL/REST with MQTT-only for Unraid server data
All server stats (CPU, RAM, Docker, shares, disks, array) now come
directly from MQTT topics published by the Unraid MQTT Agent. This
eliminates the need for API keys, HTTP polling, and the GraphQL/REST
fallback chain.

- Rewrote unraid_service.py to read from MQTT store (no httpx needed)
- Simplified servers router (no cache, no enrichment hack)
- Added mqtt_prefix field to UnraidServer config
- Updated DB: both Daddelolymp and Adriahub with mqtt_prefix, no api_key
- Data is always fresh (MQTT pushes every ~15s)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 23:25:57 +01:00
Sam
5d3d4f4015 MQTT-based live CPU/RAM metrics + remove auth from HA control
- Enrich server data with MQTT system topics (cpu_usage_percent,
  ram_usage_percent, temp, model etc.) published by Unraid MQTT Agent
- Works for both Daddelolymp and Adriahub topics
- MQTT overlay runs on every request (even cached) for fresh metrics
- Remove JWT auth from /api/ha/control — local dashboard doesn't need it
- Add cpu brand field to GraphQL query

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 22:41:16 +01:00
Sam
94727ebe70 Add Unraid GraphQL API support (6.12+) for server monitoring
The Unraid built-in API uses GraphQL at /graphql with x-api-key auth
instead of REST endpoints. Service now tries GraphQL first, then falls
back to legacy REST, then connectivity check.

Fetches: hostname, uptime, CPU cores/threads, RAM total, Docker
containers with status, array state, and share free space.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 22:30:05 +01:00
Sam
0d68933b85 Further filter technical switches (child locks, LED indicators, permit join)
Removes child lock toggles, motion sensor LED indicators, and
Zigbee2MQTT permit join from the smart-home dashboard view.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:40:25 +01:00
Sam
3235e6293a Filter out Unraid infrastructure entities from HA smart-home view
Exclude Docker container power switches, system service switches,
VM switches, and hardware monitoring sensors (disk/CPU/GPU temps)
from the dashboard. Only show actual smart-home entities.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:36:37 +01:00
Sam
f5b7c53f18 HA controls + wider layout: toggle lights/switches, cover controls, more sensors
- Backend: call_ha_service() for controlling entities via HA REST API
- Backend: POST /api/ha/control with JWT auth + cache invalidation
- Backend: Parse switches, binary_sensors, humidity, climate entities
- Frontend: HA card now xl:col-span-2 (double width)
- Frontend: Interactive toggles for lights/switches, cover up/stop/down
- Frontend: Temperature + humidity sensors, climate display, binary sensors
- Frontend: Two-column internal layout (controls left, sensors right)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 19:30:20 +01:00
Sam
4e7c1909ee Fix country matching: English→ISO code lookup for geocoding
"Rab,Croatia" now correctly matches Croatia (HR) instead of
Rabat (Morocco). Added country code mapping for common English
and German country names.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:51:56 +01:00
Sam
ac63370876 Fix geocoding for "City,Country" format (e.g. Rab,Croatia)
Split location on comma, search for city name, then filter results
by country name/code to find the correct match.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:48:45 +01:00
Sam
d3305a243c Weather: Replace wttr.in with Open-Meteo + structured logging
- Replace wttr.in (unreachable from Docker) with Open-Meteo API
  (free, no API key, reliable) with geocoding cache
- WMO weather codes mapped to German descriptions + emoji icons
- Add [WEATHER], [NEWS], [UNRAID], [DASHBOARD] log prefixes
- Structured integration status table on startup
- Suppress noisy httpx INFO logs (services log their own summaries)
- Add logging to unraid_service (was completely silent on errors)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:45:23 +01:00
Sam
94cf618e0d Fix: Setup-Wizard Redirect + market_news Migration
- Replace navigate() with window.location.href for full page reload
  after setup completion (fixes redirect loop back to /setup)
- Add migration 002: market_news table with indexes
- Remove unused useNavigate import

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:32:43 +01:00
Sam
c15176bff4 fix: replace passlib with direct bcrypt to fix password hashing crash
passlib 1.7.4 is incompatible with bcrypt>=4.1, causing a ValueError
during internal bug detection. Using bcrypt directly avoids this.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:20:36 +01:00
Sam
ee37b9bb31 polish: News step hint + n8n description clarify
News step now explains that sources are configured in n8n.
n8n step description clarified as optional webhook triggering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:11:42 +01:00
Sam
6651bfaf60 feat: Setup Wizard for first-run configuration
Container starts with only DB credentials. On first visit, a step-by-step
wizard guides through admin password, weather, HA, Vikunja, Unraid, MQTT,
n8n and news configuration. Backward-compat: ADMIN_PASSWORD env skips wizard.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:06:10 +01:00
Sam
e25d055ba2 polish: clean header, unified IBM Plex Sans typography
- Remove Daily Briefing title and live indicator from header
- Center clock prominently in header bar
- Switch all section headings to IBM Plex Sans (matching card titles)
- Remove unused Outfit font import

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 12:04:47 +01:00
Sam
e94a7706ab redesign: THERMAL warm brutalist dashboard UI
Complete visual redesign of all dashboard components with a warm
brutalist command terminal aesthetic. Features editorial section
numbering, IBM Plex typography, sharp zero-radius cards with colored
accent strips, film grain overlay, and data-glow effects.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 10:54:28 +01:00
Sam
f6a42c2dd2 feat: add Admin Panel with JWT auth, DB settings, and integration management
Complete admin backend with login, where all integrations (weather, news,
Home Assistant, Vikunja, Unraid, MQTT) can be configured via web UI instead
of ENV variables. Two-layer config: ENV seeds DB on first start, then DB
is source of truth. Auto-migration system on startup.

Backend: db.py shared pool, auth.py JWT, settings_service CRUD, seed_service,
admin router (protected), test_connections per integration, config.py rewrite.

Frontend: react-router v6, login page, admin layout with sidebar, 8 settings
pages (General, Weather, News, HA, Vikunja, Unraid, MQTT, ChangePassword),
shared IntegrationForm + TestButton components.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 10:37:30 +01:00
Sam
89ed0c6d0a feat: add MQTT integration for real-time entity updates
- aiomqtt async client with auto-reconnect and topic store
- MQTT router: GET /api/mqtt, GET /api/mqtt/topic/{path}, POST /api/mqtt/publish
- MQTT entities included in /api/all + WebSocket broadcast
- MqttCard frontend component with category filters, entity list
- Configurable via ENV: MQTT_HOST, MQTT_PORT, MQTT_USERNAME,
  MQTT_PASSWORD, MQTT_TOPICS (comma-separated or JSON array)
- Gracefully disabled when MQTT_HOST is not set

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 10:13:50 +01:00
Sam
9f7330e217 refactor: complete rewrite as React+FastAPI dashboard
Replace monolithic Jinja2 template with modern stack:

Backend (FastAPI):
- Modular router/service architecture
- Async PostgreSQL (asyncpg) for news from n8n pipeline
- Live Unraid server stats (2 servers via API)
- Home Assistant, Vikunja tasks, weather (wttr.in)
- WebSocket broadcast for real-time updates (15s)
- TTL cache per endpoint, all config via ENV vars

Frontend (React + Vite + TypeScript):
- Glassmorphism dark theme with Tailwind CSS
- Responsive grid: mobile/tablet/desktop/ultrawide
- Weather cards, hourly forecast, news with category tabs
- Server stats (CPU ring, RAM bar, Docker list)
- Home Assistant controls, task management
- Live clock, WebSocket connection indicator

Infrastructure:
- Multi-stage Dockerfile (node:22-alpine + python:3.11-slim)
- docker-compose with full ENV configuration
- Kaniko CI/CD pipeline for GitLab registry

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 01:48:51 +01:00
Sam
4bbc125a67 ci: allow branch pipelines for kaniko build 2026-03-02 00:36:52 +01:00
Sam
4860542d2b ci: switch daily briefing to kaniko registry build 2026-03-02 00:35:08 +01:00
Sam
9fd931a12f Use GitLab registry via local IP in CI 2026-03-01 22:44:44 +01:00
Sam
4fe644c517 UI: Remove 'Dashboard' text from inside the logo icon div 2026-02-13 13:57:06 +01:00
Sam
ee1c5bc5a4 UI: Rename to just 'Dashboard' and clean up header logo 2026-02-13 13:54:11 +01:00
Sam
c14cd60a32 UI: Move clock/date to right side, remove refresh button, and improve responsive layout 2026-02-13 12:58:24 +01:00
Sam
183b9528fe Fix: Absolute clock position - moved to background with -z-10 and opacity 2026-02-13 12:37:55 +01:00
Sam
0ad8470339 Update docker-compose.yml: add DASHBOARD_DATA_PATH and volume mount for data 2026-02-13 12:35:58 +01:00
Sam
076ee15c83 Add news and hourly weather to dashboard 2026-02-13 12:33:15 +01:00
Sam
320f273c3e Fix: Clock overlay in header - changed sm:flex to lg:flex, added z-0 2026-02-13 12:33:03 +01:00
Sam
79fb274b3b Update deploy stage tags to vm-deploy 2026-02-13 00:37:34 +01:00
Sam
231749f513 Trigger pipeline retry #2 2026-02-13 00:26:22 +01:00
Sam
8a2e6a9514 Trigger pipeline retry 2026-02-13 00:26:11 +01:00
Sam
58b2dd2730 Add GitLab CI/CD configuration 2026-02-13 00:25:22 +01:00
Sam
70c71105a1 Initial commit 2026-02-13 00:24:31 +01:00