feat: Phases 4-7 — Full Feature Expansion (26 features)

Phase 4 — New Widget Types:
- Clock/Weather, System Stats, RSS/Feed, Calendar, Markdown,
  Metric/Counter, Link Group, Camera/Stream widgets
- Backend services with caching for each data source
- Full creation form with dynamic config fields per type

Phase 5 — Visual & Styling Enhancements:
- Glassmorphism card style (solid/glass/outline)
- Board-level themes with per-board hue/saturation
- Animated SVG status rings replacing static dots
- Card size options (compact/medium/large)
- Custom CSS injection (admin + per-board, sanitized)
- Wallpaper backgrounds with blur/overlay/parallax

Phase 6 — Functional Features:
- Favorites bar with drag-and-drop reordering
- Recent apps tracking with privacy toggle
- Uptime dashboard page (/status, guest-accessible)
- Notifications system (Discord/Slack/Telegram/HTTP webhooks)
- App tags with filtering in board view
- Multi-URL app cards with expandable sub-links
- Personal API tokens with scoped permissions
- Audit log with retention and admin viewer

Phase 7 — Quality of Life:
- Onboarding wizard (5-step first-launch setup)
- App URL health preview with favicon/title detection
- Board templates (4 built-in + custom import/export)
- Keyboard shortcut overlay (j/k nav, 1-9 boards, ? help)

212 files changed, 15641 insertions, 980 deletions.
Build, lint, type check, and 222 tests all pass.
This commit is contained in:
2026-03-25 14:18:10 +03:00
parent 8d7847889e
commit 1c0a7cb850
212 changed files with 15642 additions and 981 deletions
@@ -10,9 +10,11 @@ All 6 phases complete. The codebase is fully integrated and passing all checks.
- `npm test` passes (175 tests, 14 test files)
## Temporary Workarounds
- None yet
## Cross-Phase Dependencies
- Phase 1 (OAuth) is independent — touches auth system only
- Phase 2 (DnD) is independent — touches board editor UI only
- Phase 3 (Widgets) depends on existing widget system from MVP
@@ -20,12 +22,14 @@ All 6 phases complete. The codebase is fully integrated and passing all checks.
- Phase 5 (Integration) depends on all prior phases
## Implementation Notes
- Big Bang strategy: intermediate phases may not build. Phase 6 is the convergence phase.
- OAuth uses `openid-client` (already installed in MVP dependencies)
- DnD uses `svelte-dnd-action` (installed in Phase 2)
- New widget types extend the existing Widget model's `type` and `config` JSON fields
## Phase 2 (DnD) — Completed
- Installed `svelte-dnd-action` package
- Created `DraggableBoard.svelte`, `DraggableSection.svelte`, `DraggableWidget.svelte` component hierarchy
- Board edit page now uses DnD for section and widget reordering (including cross-section widget moves)
@@ -35,6 +39,7 @@ All 6 phases complete. The codebase is fully integrated and passing all checks.
- Edit page actions (add/delete section/widget) use `invalidateAll()` for data refresh; DnD uses optimistic fetch
## Phase 4 (Additional Widget Types) — Completed
- Installed `marked` package for markdown rendering
- WidgetType enum already had BOOKMARK, NOTE, EMBED, STATUS from MVP constants
- Added per-type Zod config schemas in `validators.ts`: `appWidgetConfigSchema`, `bookmarkWidgetConfigSchema`, `noteWidgetConfigSchema`, `embedWidgetConfigSchema`, `statusWidgetConfigSchema`
+11 -8
View File
@@ -9,9 +9,11 @@
**Execution:** Orchestrator
## Summary
Add OAuth/Authentik integration, drag-and-drop reordering, localization (EN/RU), additional widget types (bookmark, note, embed, status), and per-board access control UI.
## Build & Test Commands
- **Build:** `npm run build`
- **Test:** `npm test`
- **Lint:** `npm run lint`
@@ -28,16 +30,17 @@ Add OAuth/Authentik integration, drag-and-drop reordering, localization (EN/RU),
## Phase Progress Log
| Phase | Domain | Status | Review | Build | Committed |
|-------|--------|--------|--------|-------|-----------|
| Phase 1: OAuth | fullstack | Done | ⬜ | ⬜ | ⬜ |
| Phase 2: DnD | frontend | Done | ⬜ | ⬜ | ⬜ |
| Phase 3: Localization | fullstack | Done | ⬜ | ⬜ | ⬜ |
| Phase 4: Widgets | fullstack | Done | ⬜ | ⬜ | ⬜ |
| Phase 5: Access Control | fullstack | Done | ⬜ | ⬜ | ⬜ |
| Phase 6: Integration | fullstack | Done | ⬜ | ⬜ | ⬜ |
| Phase | Domain | Status | Review | Build | Committed |
| ----------------------- | --------- | ------ | ------ | ----- | --------- |
| Phase 1: OAuth | fullstack | Done | ⬜ | ⬜ | ⬜ |
| Phase 2: DnD | frontend | Done | ⬜ | ⬜ | ⬜ |
| Phase 3: Localization | fullstack | Done | ⬜ | ⬜ | ⬜ |
| Phase 4: Widgets | fullstack | Done | ⬜ | ⬜ | ⬜ |
| Phase 5: Access Control | fullstack | Done | ⬜ | ⬜ | ⬜ |
| Phase 6: Integration | fullstack | Done | ⬜ | ⬜ | ⬜ |
## Final Review
- [ ] Comprehensive code review
- [ ] Full build passes
- [ ] Full test suite passes
@@ -5,6 +5,7 @@
**Domain:** fullstack
## Objective
Add OIDC/OAuth2 authentication via Authentik, including redirect/callback flows, auto-provisioning users, and admin configuration UI.
## Tasks
@@ -21,6 +22,7 @@ Add OIDC/OAuth2 authentication via Authentik, including redirect/callback flows,
- [x] Task 10: Add env vars to `.env.example` — OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, OAUTH_DISCOVERY_URL, OAUTH_REDIRECT_URI
## Files to Modify/Create
- `src/lib/server/services/oauthService.ts` — NEW
- `src/routes/auth/oauth/authorize/+server.ts` — NEW
- `src/routes/auth/oauth/callback/+server.ts` — NEW
@@ -33,6 +35,7 @@ Add OIDC/OAuth2 authentication via Authentik, including redirect/callback flows,
- `.env.example` — MODIFY
## Acceptance Criteria
- OAuth login redirects to Authentik and returns with valid session
- New OAuth users are auto-provisioned with correct role/groups
- Existing users can link OAuth identity
@@ -41,6 +44,7 @@ Add OIDC/OAuth2 authentication via Authentik, including redirect/callback flows,
- Login page shows appropriate buttons based on auth mode
## Notes
- Use `openid-client` for OIDC discovery and token exchange
- Store OAuth state/nonce in HTTP-only cookies for CSRF protection
- Map Authentik groups to local groups by name
@@ -5,6 +5,7 @@
**Domain:** frontend
## Objective
Add drag-and-drop reordering for sections within boards and widgets within/across sections using svelte-dnd-action.
## Tasks
@@ -21,6 +22,7 @@ Add drag-and-drop reordering for sections within boards and widgets within/acros
- [x] Task 10: Support moving widgets between sections via cross-section DnD
## Files to Modify/Create
- `package.json` — add svelte-dnd-action
- `src/lib/components/board/DraggableBoard.svelte` — NEW
- `src/lib/components/section/DraggableSection.svelte` — NEW
@@ -31,6 +33,7 @@ Add drag-and-drop reordering for sections within boards and widgets within/acros
- `src/lib/server/services/boardService.ts` — MODIFY
## Acceptance Criteria
- Sections can be reordered via drag-and-drop in the board editor
- Widgets can be reordered within a section
- Widgets can be moved between sections
@@ -39,12 +42,14 @@ Add drag-and-drop reordering for sections within boards and widgets within/acros
- Drop zones are visually indicated during drag
## Notes
- `svelte-dnd-action` works well with Svelte 5
- Use optimistic updates — reorder in UI immediately, sync to server in background
- Reorder APIs should accept an array of IDs in the new order
- Big Bang: may need integration fixes in Phase 6
## Review Checklist
- [x] All tasks completed
- [x] Code follows project conventions
- [x] No unintended side effects
@@ -52,7 +57,9 @@ Add drag-and-drop reordering for sections within boards and widgets within/acros
- [ ] Tests pass (new + existing)
## Handoff to Next Phase
Phase 2 DnD is complete. Key additions:
- `svelte-dnd-action` installed and integrated with Svelte 5 (`use:dndzone`, `onconsider`/`onfinalize` event pattern)
- Board editor (`/boards/[boardId]/edit`) now uses `DraggableBoard` > `DraggableSection` > `DraggableWidget` component hierarchy
- Sections support drag-and-drop reordering with grip-dot handles; widgets support reordering within and across sections
@@ -5,6 +5,7 @@
**Domain:** fullstack
## Objective
Add internationalization (i18n) support with English and Russian locales. All UI strings should be translatable. Users can switch language in settings or header.
## Tasks
@@ -24,6 +25,7 @@ Add internationalization (i18n) support with English and Russian locales. All UI
- [x] Task 13: Translate all strings to Russian in ru.json
## Files to Modify/Create
- `src/lib/i18n/en.json` — NEW
- `src/lib/i18n/ru.json` — NEW
- `src/lib/i18n/index.ts` — NEW
@@ -64,12 +66,14 @@ Add internationalization (i18n) support with English and Russian locales. All UI
- `src/lib/components/admin/PermissionEditor.svelte` — MODIFIED
## Acceptance Criteria
- All user-visible strings are translatable (no hardcoded text in components)
- English and Russian translations are complete
- Language switcher in the header toggles between EN/RU
- Locale preference persists across sessions (localStorage key `wal-locale`)
## Notes
- Uses flat key structure: `{ "nav.boards": "Boards", "nav.apps": "Apps", ... }`
- Translation keys are semantic and grouped by feature
- `svelte-i18n` installed as a dependency
@@ -78,6 +82,7 @@ Add internationalization (i18n) support with English and Russian locales. All UI
- Phase 4 widget types (bookmark, note, embed, status) form labels in DraggableSection left partially untranslated as they are highly technical; core UI strings extracted
## Review Checklist
- [x] All tasks completed
- [x] Code follows project conventions
- [ ] No unintended side effects
@@ -85,6 +90,7 @@ Add internationalization (i18n) support with English and Russian locales. All UI
- [ ] Tests pass (new + existing)
## Handoff to Next Phase
- `svelte-i18n` added as dependency. All components import `{ t }` from `svelte-i18n` and use `$t('key')` for strings.
- Locale files at `src/lib/i18n/en.json` and `src/lib/i18n/ru.json` contain ~180 translation keys.
- `LanguageSwitcher` component added to the Header, toggles EN/RU and persists to localStorage.
@@ -5,6 +5,7 @@
**Domain:** fullstack
## Objective
Add four new widget types: Bookmark, Note, Embed, and Status. Extend the widget system with type-specific rendering and configuration.
## Tasks
@@ -23,6 +24,7 @@ Add four new widget types: Bookmark, Note, Embed, and Status. Extend the widget
- [x] Task 12: Install `marked` for Note widget markdown rendering
## Files to Modify/Create
- `src/lib/utils/constants.ts` — MODIFY (already had all types)
- `src/lib/utils/validators.ts` — MODIFY
- `src/lib/types/widget.ts` — MODIFY
@@ -42,6 +44,7 @@ Add four new widget types: Bookmark, Note, Embed, and Status. Extend the widget
- `src/routes/boards/[boardId]/edit/+page.server.ts` — MODIFY
## Acceptance Criteria
- All four widget types render correctly in the board view
- Each widget type has a type-specific config form in the board editor
- Bookmark: displays URL with label and optional icon, opens in new tab
@@ -51,6 +54,7 @@ Add four new widget types: Bookmark, Note, Embed, and Status. Extend the widget
- WidgetRenderer correctly dispatches to the right component by type
## Notes
- Widget config JSON structure per type:
- APP: `{ appId: string }`
- BOOKMARK: `{ url: string, label: string, icon?: string, description?: string }`
@@ -61,6 +65,7 @@ Add four new widget types: Bookmark, Note, Embed, and Status. Extend the widget
- Big Bang strategy: may need integration fixes in Phase 6
## Review Checklist
- [x] All tasks completed
- [x] Code follows project conventions
- [ ] No unintended side effects
@@ -68,6 +73,7 @@ Add four new widget types: Bookmark, Note, Embed, and Status. Extend the widget
- [ ] Tests pass (new + existing)
## Handoff to Next Phase
- Installed `marked` package for markdown rendering in NoteWidget
- `WidgetType` enum already had all 5 types from MVP
- Updated `validators.ts` with per-type config Zod schemas (appWidgetConfigSchema, bookmarkWidgetConfigSchema, noteWidgetConfigSchema, embedWidgetConfigSchema, statusWidgetConfigSchema)
@@ -5,6 +5,7 @@
**Domain:** fullstack
## Objective
Add a user-friendly access control interface for boards, allowing admins to manage per-board permissions with user/group pickers and visual indicators.
## Tasks
@@ -19,6 +20,7 @@ Add a user-friendly access control interface for boards, allowing admins to mana
- [x] Task 8: Create `src/lib/components/board/BoardShareDialog.svelte` — quick share dialog for boards
## Files to Modify/Create
- `src/lib/components/board/BoardAccessControl.svelte` — NEW
- `src/lib/components/board/BoardShareDialog.svelte` — NEW
- `src/routes/api/boards/[id]/permissions/+server.ts` — NEW
@@ -34,6 +36,7 @@ Add a user-friendly access control interface for boards, allowing admins to mana
- `src/lib/i18n/ru.json` — MODIFY
## Acceptance Criteria
- Board editor has a permissions section for managing access
- Admins can grant/revoke view/edit/admin permissions per user or group
- Board list shows access indicators (shared icon, guest badge, etc.)
@@ -41,11 +44,13 @@ Add a user-friendly access control interface for boards, allowing admins to mana
- Guest access toggle works with visual feedback
## Notes
- The permission system already exists from MVP (permissionService)
- This phase adds the UI layer on top of existing backend
- ⚠️ Big Bang: may need integration fixes in Phase 6
## Review Checklist
- [x] All tasks completed
- [x] Code follows project conventions
- [ ] No unintended side effects
@@ -53,6 +58,7 @@ Add a user-friendly access control interface for boards, allowing admins to mana
- [ ] Tests pass (new + existing)
## Handoff to Next Phase
- Created `BoardAccessControl.svelte` — self-contained board permission manager with search/autocomplete, fetches from `/api/boards/[id]/permissions`
- Created `BoardShareDialog.svelte` — modal dialog for quick sharing with copy link, guest toggle, and permission management
- Created `/api/boards/[id]/permissions` API endpoint with GET/POST/DELETE for board-scoped permissions
@@ -5,6 +5,7 @@
**Domain:** fullstack
## Objective
Integrate all Phase 2 features, fix all build/type/lint errors, write tests, and ensure everything works together.
## Tasks
@@ -22,6 +23,7 @@ Integrate all Phase 2 features, fix all build/type/lint errors, write tests, and
- [ ] Task 11: Update `.env.example` with all new env vars documented
## Files Modified/Created
- `src/lib/server/services/oauthService.ts` — fixed undefined sub claim type error
- `src/lib/components/ui/DynamicIcon.svelte` — fixed Svelte 5 deprecated svelte:component + type error
- `src/lib/components/board/DraggableBoard.svelte` — removed unused eslint-disable
@@ -37,6 +39,7 @@ Integrate all Phase 2 features, fix all build/type/lint errors, write tests, and
- `prisma/seed.ts` — added bookmark, note, embed, status widgets + team board with permissions
## Acceptance Criteria
- [x] `npm run build` succeeds
- [x] `npm run check` passes (0 errors, 18 warnings)
- [x] `npm run lint` passes
@@ -45,11 +48,13 @@ Integrate all Phase 2 features, fix all build/type/lint errors, write tests, and
- [x] Seed script includes all widget types and board with permissions
## Notes
- Installed missing `svelte-i18n` dependency (was used but not in package.json)
- Circular dependency warnings from `typebox` and `zod-v3-to-json-schema` are from node_modules, not our code
- Svelte check warnings are about `state_referenced_locally` in superForm usage patterns (safe to ignore)
## Review Checklist
- [x] All tasks completed
- [x] Code follows project conventions
- [x] No unintended side effects
@@ -57,4 +62,5 @@ Integrate all Phase 2 features, fix all build/type/lint errors, write tests, and
- [x] Tests pass (new + existing)
## Handoff
Phase 6 complete. All build, type, lint, and test checks pass. The codebase is fully integrated with 175 passing tests. Phase 2 enhanced features are production-ready.