- 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>
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>
- 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>
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>
- 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>
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>
- 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>
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>
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>
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>
"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>
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>
- 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>
- 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>
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>
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>
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>
- 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>
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>
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>
- 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>
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>