Claude a22f1baf4d Extract NoteWidget and CalendarWidget from monolithic page.tsx
Split page.tsx from ~2370 to ~1600 lines by extracting:
- NoteWidget: Markdown editor/preview, toolbar, checkbox toggle, all
  formatting helpers (bold, italic, lists, links, code)
- CalendarWidget: Month grid, event tooltips, source selection,
  next-events list, month navigation

Both components are self-contained with their own state where appropriate
(calendar month navigation, local content edits) while receiving data
and callbacks from the parent.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-18 13:36:06 +02:00
2026-06-18 10:02:05 +02:00
2026-06-18 10:02:05 +02:00
2026-06-18 10:02:05 +02:00

Personal Dashboard

Ein selbst gehostetes persönliches Dashboard mit konfigurierbaren Widgets, Multi-Tab-Support und Benutzerverwaltung.

Features

  • Widgets: Favoriten/Links, Notizen (Markdown), Uhr, Taschenrechner, Suche, Kalender (ICS + Exchange EWS), Domainprüfung
  • Dashboard-Tabs: Mehrere Dashboards pro Benutzer
  • Drag & Drop: Widgets frei im Raster positionieren und skalieren
  • Dark Mode und anpassbares Branding (Logo, Farben, Hintergrundbild, Custom CSS)
  • Benutzerverwaltung: Admin- und User-Rollen, Session-basierte Authentifizierung
  • Kalender: Mehrere Quellen pro Widget, ICS-URLs und Exchange EWS mit verschlüsselten Zugangsdaten

Tech Stack

  • Frontend: Next.js 16, React 19, react-grid-layout
  • Backend: Next.js API Routes, Prisma ORM
  • Datenbank: SQLite
  • Deployment: Docker

Schnellstart mit Docker

cp .env.example .env

CALENDAR_ENCRYPTION_KEY generieren (32 Byte, Base64 oder Hex):

# Base64 (empfohlen)
openssl rand -base64 32

# oder Hex
openssl rand -hex 32

Den generierten Wert in .env eintragen, dann starten:

docker compose up -d

Das Dashboard ist dann unter http://localhost:3130 erreichbar.

Entwicklung

npm install
npx prisma generate
npx prisma db push
npm run dev

Umgebungsvariablen

Variable Beschreibung Standard
DATABASE_URL SQLite-Pfad file:/data/dashboard.db
INITIAL_ADMIN_EMAIL E-Mail des initialen Admins admin@example.local
INITIAL_ADMIN_PASSWORD Passwort des initialen Admins (muss gesetzt werden)
CALENDAR_ENCRYPTION_KEY 32-Byte-Key (Base64 oder Hex) für Kalender-Passwörter (muss generiert werden, siehe oben)
CALENDAR_ALLOWED_HOSTS Erlaubte Kalender-Hosts (kommasepariert) (leer = alle)
SESSION_TTL_DAYS Session-Lebensdauer in Tagen 30
S
Description
Selbst gehostetes persönliches Dashboard mit konfigurierbaren Widgets
Readme 208 KiB
Languages
TypeScript 69.5%
CSS 29.6%
JavaScript 0.6%
Dockerfile 0.3%