From 14d60d28eb4cb7e6e2f3f32b93226f268b1ce591 Mon Sep 17 00:00:00 2001 From: Brad Groux Date: Wed, 28 Jan 2026 17:10:40 -0600 Subject: [PATCH] perf: lazy-load dashboard and split vendor chunks to reduce main bundle by 69% --- .../telemetry/events-2026-01-28.ndjson | 3 ++ server/.veritas-kanban/activity.json | 44 +++++++++++++++++++ web/src/components/board/KanbanBoard.tsx | 20 +++++++-- web/vite.config.ts | 19 ++++++++ 4 files changed, 83 insertions(+), 3 deletions(-) diff --git a/.veritas-kanban/telemetry/events-2026-01-28.ndjson b/.veritas-kanban/telemetry/events-2026-01-28.ndjson index e09b2f7e..8d168252 100644 --- a/.veritas-kanban/telemetry/events-2026-01-28.ndjson +++ b/.veritas-kanban/telemetry/events-2026-01-28.ndjson @@ -3583,3 +3583,6 @@ {"type":"task.status_changed","taskId":"task_20260128_nK2-lo","project":"veritas-kanban","status":"done","previousStatus":"in-progress","id":"evt_kUKAqOeC-LBN","timestamp":"2026-01-28T23:08:32.549Z"} {"type":"task.status_changed","taskId":"task_20260128_eH_S3Q","project":"veritas-kanban","status":"in-progress","previousStatus":"todo","id":"evt_5xw3LknlZ-Nl","timestamp":"2026-01-28T23:09:01.718Z"} {"type":"task.status_changed","taskId":"task_20260128_2H7USQ","project":"veritas-kanban","status":"done","previousStatus":"in-progress","id":"evt_fW1aiEhB87_H","timestamp":"2026-01-28T23:09:10.815Z"} +{"type":"task.status_changed","taskId":"task_20260128_8DUobI","project":"veritas-kanban","status":"in-progress","previousStatus":"todo","id":"evt_Z18-z1bQmSi2","timestamp":"2026-01-28T23:09:43.882Z"} +{"type":"task.status_changed","taskId":"task_20260128_eH_S3Q","project":"veritas-kanban","status":"done","previousStatus":"in-progress","id":"evt_-T0SarE9oB4I","timestamp":"2026-01-28T23:09:45.270Z"} +{"type":"task.status_changed","taskId":"task_20260128_uUydZN","project":"veritas-kanban","status":"in-progress","previousStatus":"todo","id":"evt_uKoZ1SQCUTkn","timestamp":"2026-01-28T23:10:18.570Z"} diff --git a/server/.veritas-kanban/activity.json b/server/.veritas-kanban/activity.json index 625526f7..74fc7610 100644 --- a/server/.veritas-kanban/activity.json +++ b/server/.veritas-kanban/activity.json @@ -1,4 +1,48 @@ [ + { + "id": "activity_1769641818570_u5pb6k93a", + "type": "status_changed", + "taskId": "task_20260128_uUydZN", + "taskTitle": "QUALITY: Add request ID middleware for request tracing", + "details": { + "from": "todo", + "status": "in-progress" + }, + "timestamp": "2026-01-28T23:10:18.570Z" + }, + { + "id": "activity_1769641790370_38yvkyi66", + "type": "comment_added", + "taskId": "task_20260128_eH_S3Q", + "taskTitle": "SECURITY: Sanitize Content-Disposition header in attachment downloads", + "details": { + "author": "Veritas", + "preview": "Replaced raw string interpolation in Content-Dispo..." + }, + "timestamp": "2026-01-28T23:09:50.370Z" + }, + { + "id": "activity_1769641785270_wd8qg1v3m", + "type": "status_changed", + "taskId": "task_20260128_eH_S3Q", + "taskTitle": "SECURITY: Sanitize Content-Disposition header in attachment downloads", + "details": { + "from": "in-progress", + "status": "done" + }, + "timestamp": "2026-01-28T23:09:45.270Z" + }, + { + "id": "activity_1769641783882_z8lz7tg6d", + "type": "status_changed", + "taskId": "task_20260128_8DUobI", + "taskTitle": "PERF: Reduce frontend bundle size from 1.2MB main chunk", + "details": { + "from": "todo", + "status": "in-progress" + }, + "timestamp": "2026-01-28T23:09:43.882Z" + }, { "id": "activity_1769641756408_28h6sbmhl", "type": "comment_added", diff --git a/web/src/components/board/KanbanBoard.tsx b/web/src/components/board/KanbanBoard.tsx index 95612c1c..a460e69a 100644 --- a/web/src/components/board/KanbanBoard.tsx +++ b/web/src/components/board/KanbanBoard.tsx @@ -6,7 +6,7 @@ import { TaskDetailPanel } from '@/components/task/TaskDetailPanel'; import type { TaskStatus, Task } from '@veritas-kanban/shared'; import { useFeatureSettings } from '@/hooks/useFeatureSettings'; import { DndContext, DragOverlay, closestCorners } from '@dnd-kit/core'; -import { useState, useEffect, useCallback, useMemo } from 'react'; +import { useState, useEffect, useCallback, useMemo, lazy, Suspense } from 'react'; import { TaskCard } from '@/components/task/TaskCard'; import { useKeyboard } from '@/hooks/useKeyboard'; import { @@ -18,9 +18,15 @@ import { } from './FilterBar'; import { BulkActionsBar } from './BulkActionsBar'; import { ArchiveSuggestionBanner } from './ArchiveSuggestionBanner'; -import { DashboardSection } from '@/components/dashboard/DashboardSection'; import FeatureErrorBoundary from '@/components/shared/FeatureErrorBoundary'; +// Lazy-load DashboardSection to split recharts + d3 (~800KB) out of main bundle +const DashboardSection = lazy(() => + import('@/components/dashboard/DashboardSection').then(mod => ({ + default: mod.DashboardSection, + })) +); + const COLUMNS: { id: TaskStatus; title: string }[] = [ { id: 'todo', title: 'To Do' }, { id: 'in-progress', title: 'In Progress' }, @@ -197,7 +203,15 @@ export function KanbanBoard() { )} - {featureSettings.board.showDashboard && } + {featureSettings.board.showDashboard && ( + + Loading dashboard… + + }> + + + )}