--- context: default phase: freeform-session task: null total_tasks: null status: complete last_updated: 2026-06-20T12:30:00Z --- All requested work is complete and deployed. No pending tasks. The dashboard is running in Docker on port 3130, accessible via Nginx Proxy Manager. All commits pushed to Gitea (git.heidencrime.de/schalli/personal-dashboard). Session commits (10 total): - a63c106: Fix Docker port mapping — container listens on 3130, not 3000 - d277789: Add admin password reset for users (PATCH /api/users/[id] with password field, modal UI in admin/users) - 88614b0: Center drag handle at top of all widgets, fix dead widgetCardEditMode CSS - ca76bf3: Move drag handle to top center edge of widget card (out of header, tab-style at top border) - 04d14b3: Add stopwatch widget with lap functionality (new component, CSS, type registration) - b82e0e6: Fix stopwatch API type validation (API has its own WidgetType that needs separate updates) - 09a0e44: Use accent color for stopwatch buttons instead of hardcoded green/red - 80bd18a: Load calendar data async so slow/failing sources don't block page load - 30316e2: Fix search widget border line, reduce height, fix 10 dead widgetCardEditMode refs - 001bfb3: Clip search widget content overflow on small widget sizes No remaining work from this session. - Calendar data loads async after core dashboard data — slow Exchange EWS sources were blocking entire page load for 15+ seconds - Drag handle moved from inside widgetHeader to direct child of widgetCard — enables positioning at top center edge independent of header - API route (src/app/api/widgets/route.ts) has its OWN WidgetType definition separate from src/types/dashboard.ts — both must be updated when adding new widget types - widget-density.css and search-widget.css referenced non-existent class widgetCardEditMode — the actual class in JSX is widgetEditing. All 10+ references fixed - .netrc was in wrong format (Username:/Password: instead of machine/login/password) — fixed for Gitea token auth None. ## Required Reading (in order) 1. `src/app/page.tsx` — main dashboard, renderWidget() structure, loadDashboardData/loadCalendarData split 2. `src/app/api/widgets/route.ts` — widget creation API with its own WidgetType and normalizeWidgetType 3. `src/app/widget-density.css` — compact density overrides, uses widgetEditing class 4. `src/app/search-widget.css` — complex CSS with many override layers ## Infrastructure State - Docker container `personal-dashboard` running on port 3130 (host) → 3130 (container) - Nginx Proxy Manager (`npmplus`) in host network mode — forward to 127.0.0.1:3130 - Gitea remote: https://git.heidencrime.de/schalli/personal-dashboard.git - Auth via ~/.netrc (token-based) - SQLite database at /data/dashboard.db (Docker volume `personal-dashboard-data`) - 3 users: admin@heidencrime.de, schalli@heidencrime.de, kschaller@ctl.de - Calendar sources: 2 Exchange EWS (owa.ctl.de), 1 ICS (SOGo) Freeform user-driven session. User (schalli) is a German-speaking dev who self-hosts everything. All communication in German. Work was entirely reactive to user requests — no roadmap or phases. CSS has significant technical debt from many layered fixes with !important overrides. The search-widget.css in particular has ~380 lines of overlapping rules that could benefit from a rewrite. Start with: No pending work. Ask user what they'd like to work on next.