a22f1baf4d879301696f2bdeb036212ddd55c95b
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>
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 |
Description
Languages
TypeScript
69.5%
CSS
29.6%
JavaScript
0.6%
Dockerfile
0.3%