Docs / Raw

Frontend Completion Plan

Sourced from docs/FRONTEND_COMPLETION_PLAN.md

Edit on GitHub

VoiceAssist Frontend Completion Plan

Executive Summary

This document outlines the comprehensive implementation plan for completing the VoiceAssist frontend MVP. Based on thorough codebase analysis, the frontend is approximately 65% complete with solid foundations in place.

Current State Assessment:

AreaStatusReadiness
Test InfrastructureVitest configured, ESM fixes applied70%
Offline Voice CaptureuseOfflineVoiceCapture fully implemented90%
Admin Dashboard10 components exist, needs wiring60%
i18n SetupConfig scaffolding only15%
PWA ConfigurationNot started0%
Voice FeaturesExtensive implementation85%
Bundle/PerformanceGood foundation70%
Analytics/MonitoringSentry complete, no analytics75%
AccessibilityBasic components, no automation45%
CI/CDStrong backend, needs frontend focus70%

Estimated Total Effort: 180-240 hours (9-12 weeks at 20 hrs/week)


Phase 8: Polish & Production Readiness

8.1 Fix Test Failures & CI Issues

Estimate: 4-6 hours | Priority: CRITICAL | Risk: Low

Current State

  • Vitest 1.6.1 configured with memory optimization (pool: 'forks', maxConcurrency: 3)
  • ESM import issues already addressed via inline: ['refractor', 'remark-gfm', ...]
  • 578 tests passing, 9 skipped
  • Bandit configured in .bandit, runs in CI
  • Trivy container scanning configured in trivy.yaml

Tasks

TaskFile(s)HoursNotes
Review ESM mock in test setupapps/web-app/src/test/setup.ts1Verify react-syntax-highlighter mock
Add frontend linting to CI.github/workflows/ci.yml1.5Add eslint + prettier check job
Address Bandit HIGH findingsservices/api-gateway/app/**/*.py1Run bandit -r services/api-gateway/app -ll
Fix Trivy container issuesDockerfile, trivy.yaml1Upgrade base images, fix CVEs
Add type-check job to CI.github/workflows/ci.yml0.5pnpm tsc --noEmit
Document test exclusionsvitest.config.mts0.5Add comments for OOM exclusions

Implementation

# Add to .github/workflows/ci.yml frontend-lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v2 - run: pnpm install --frozen-lockfile - run: pnpm lint - run: pnpm tsc --noEmit

8.2 Complete Offline Voice Capture

Estimate: 8-12 hours | Priority: HIGH | Risk: Medium

Current State

  • useOfflineVoiceCapture.ts (479 lines) - FULLY IMPLEMENTED
  • IndexedDB storage with proper schema (voiceassist-offline DB)
  • Recording lifecycle management (pending → uploading → uploaded → failed)
  • Auto-sync on connectivity restoration
  • Integration with VoiceModePanel.tsx exists

Gap Analysis

  • No storage quota management
  • No audio compression before storage
  • UI indicator exists but may need polish
  • Background sync API not used

Tasks

TaskFile(s)HoursNotes
Add storage quota managementuseOfflineVoiceCapture.ts2Check navigator.storage.estimate()
Implement audio compressionuseOfflineVoiceCapture.ts3Use Web Audio API or lamejs
Polish pending count UIVoiceModePanel.tsx1.5Badge with animation
Add sync progress indicatorVoiceModePanel.tsx1.5Progress bar during upload
Implement cleanup strategyuseOfflineVoiceCapture.ts1.5Delete old recordings after 7 days
Add retry backoff logicuseOfflineVoiceCapture.ts1Exponential backoff on failures
Write integration tests__tests__/2Mock IndexedDB with fake-indexeddb

Implementation Notes

// Storage quota management async function checkStorageQuota() { if (navigator.storage?.estimate) { const { usage, quota } = await navigator.storage.estimate(); const percentUsed = (usage! / quota!) * 100; if (percentUsed > 80) { await cleanupOldRecordings(); } } }

8.3 Admin Dashboard Enhancements

Estimate: 12-16 hours | Priority: HIGH | Risk: Medium

Current State

  • 10 admin components in /apps/web-app/src/components/admin/
  • WebSocketStatusPanel.tsx - Polls every 5 seconds
  • AnalyticsDashboard.tsx - Placeholder data
  • UserManagement.tsx - UI exists
  • KnowledgeBaseManager.tsx - Basic UI
  • Backend APIs exist for all features

Tasks

TaskFile(s)HoursNotes
Wire real-time WS monitoringWebSocketStatusPanel.tsx2Use actual WebSocket instead of polling
Connect user management CRUDUserManagement.tsx, adminApi.ts3Wire to /api/admin/users
Implement charts with RechartsMetricsCharts.tsx3Install recharts, add visualizations
Wire audit log to real APIAuditLogViewer.tsx2Connect to /api/admin/audit-logs
Add KB document previewKnowledgeBaseManager.tsx2Modal with document content
Wire analytics to real dataAnalyticsDashboard.tsx2.5Connect to /api/admin/analytics
Add RBAC UI indicatorsAll admin components1.5Show disabled state for unauthorized

API Endpoints to Wire

// Already in adminApi.ts - need to verify/connect: GET /api/admin/websocket-status GET /api/admin/system-health GET /api/admin/analytics GET /api/admin/users POST /api/admin/users PUT /api/admin/users/:id DELETE /api/admin/users/:id GET /api/admin/audit-logs GET /api/admin/kb/documents

Phase 9: Advanced Features

9.1 Multi-Language Support (i18n)

Estimate: 16-20 hours | Priority: MEDIUM | Risk: Medium

Current State

  • Config scaffolding in /packages/config/i18n.ts
  • Supports: English (full), Arabic (planned RTL), Spanish, French
  • No react-i18next installed
  • No translation files

Tasks

TaskFile(s)HoursNotes
Install react-i18nextpackage.json0.5pnpm add react-i18next i18next i18next-browser-languagedetector
Create i18n provider setupapps/web-app/src/lib/i18n.ts2Configure with language detection
Extract English stringslocales/en.json4~200 user-facing strings
Create Arabic translationslocales/ar.json3RTL language support
Implement language switchercomponents/settings/LanguageSwitcher.tsx2Dropdown in header/settings
Add RTL layout supportindex.css, layout components3dir="rtl" and CSS adjustments
Create useTranslation hook wrapperhooks/useI18n.ts1Type-safe translations
Test RTL in all componentsAll components2.5Manual + snapshot tests
Add i18n to CI.github/workflows/1Check for missing translations

Implementation

// apps/web-app/src/lib/i18n.ts import i18n from "i18next"; import { initReactI18next } from "react-i18next"; import LanguageDetector from "i18next-browser-languagedetector"; i18n .use(LanguageDetector) .use(initReactI18next) .init({ resources: { en: { translation: require("../locales/en.json") }, ar: { translation: require("../locales/ar.json") }, }, fallbackLng: "en", interpolation: { escapeValue: false }, });

9.2 Mobile Responsiveness & PWA

Estimate: 12-16 hours | Priority: MEDIUM | Risk: Low

Current State

  • No PWA infrastructure
  • No manifest.json
  • No service worker
  • Tailwind CSS with some responsive classes

Tasks

TaskFile(s)HoursNotes
Install vite-plugin-pwapackage.json, vite.config.ts1Auto-generates manifest + SW
Create manifest.jsonpublic/manifest.json1App metadata, icons
Configure service workervite.config.ts2Workbox strategies
Add app icons (192x192, 512x512)public/icons/1PWA icon requirements
Audit responsive breakpointsAll layout components3Mobile-first review
Fix voice mode touch interactionsVoiceModePanel.tsx2Touch-friendly buttons
Add install prompt UIcomponents/pwa/InstallPrompt.tsx2"Add to home screen"
Test on mobile devicesN/A2iOS Safari, Android Chrome
Add offline fallback pagepublic/offline.html1Graceful offline experience

Implementation

// vite.config.ts import { VitePWA } from "vite-plugin-pwa"; export default defineConfig({ plugins: [ react(), VitePWA({ registerType: "autoUpdate", manifest: { name: "VoiceAssist", short_name: "VoiceAssist", theme_color: "#2563eb", icons: [ { src: "/icons/icon-192.png", sizes: "192x192", type: "image/png" }, { src: "/icons/icon-512.png", sizes: "512x512", type: "image/png" }, ], }, workbox: { runtimeCaching: [ { urlPattern: /^https:\/\/api\./, handler: "NetworkFirst" }, { urlPattern: /\.(?:png|jpg|svg)$/, handler: "CacheFirst" }, ], }, }), ], });

9.3 Enhanced Voice Features

Estimate: 20-30 hours | Priority: MEDIUM | Risk: High

Current State

  • VoiceModePanel.tsx (38KB) - Extensive implementation
  • useRealtimeVoiceSession.ts (34KB) - WebRTC management
  • waveform.ts - Canvas-based visualization EXISTS
  • vad.ts - Voice activity detection EXISTS
  • VoiceMetricsDisplay.tsx - Latency/performance metrics

Tasks

TaskFile(s)HoursNotes
Integrate waveform visualizerVoiceModePanel.tsx3Use existing waveform.ts
Add frequency spectrum viewutils/waveform.ts3Alternative visualization
Implement wake word detectionhooks/useWakeWord.ts5"Hey Assistant" trigger
Add voice command shortcutshooks/useVoiceCommands.ts4"Stop", "Repeat", etc.
Create voice memo modecomponents/voice/VoiceMemoMode.tsx4Quick note recording
Add voice-to-text editingcomponents/chat/VoiceTextEditor.tsx4Edit transcripts inline
Speaker diarization (defer)--Requires backend changes
Add voice settings presetsstores/voiceSettingsStore.ts2Save/load configurations

Wake Word Implementation

// hooks/useWakeWord.ts import { useEffect, useRef } from "react"; export function useWakeWord(wakePhrase: string = "hey assistant", onActivate: () => void) { const recognitionRef = useRef<SpeechRecognition | null>(null); useEffect(() => { const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; if (!SpeechRecognition) return; const recognition = new SpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; recognition.onresult = (event) => { const transcript = Array.from(event.results) .map((r) => r[0].transcript.toLowerCase()) .join(""); if (transcript.includes(wakePhrase)) { onActivate(); } }; recognition.start(); recognitionRef.current = recognition; return () => recognition.stop(); }, [wakePhrase, onActivate]); }

Phase 10: Performance & Scalability

10.1 Bundle Optimization

Estimate: 8-12 hours | Priority: MEDIUM | Risk: Low

Current State

  • Vite with SWC compiler
  • Route-based lazy loading via React.lazy()
  • No bundle analysis configured

Tasks

TaskFile(s)HoursNotes
Add rollup-plugin-visualizervite.config.ts1Bundle size analysis
Analyze current bundleN/A2Identify large dependencies
Lazy load BranchTreecomponents/chat/BranchTree.tsx1Heavy component
Lazy load chart componentscomponents/admin/MetricsCharts.tsx1Recharts is large
Optimize markdown importsVarious2Tree-shake remark/rehype
Add manual chunks configvite.config.ts1.5Vendor splitting
Set up bundle size CI check.github/workflows/1.5Fail if bundle > threshold
Implement import cost warnings.vscode/settings.json0.5Import Cost extension

Implementation

// vite.config.ts import { visualizer } from "rollup-plugin-visualizer"; export default defineConfig({ build: { rollupOptions: { output: { manualChunks: { "react-vendor": ["react", "react-dom", "react-router-dom"], "ui-vendor": ["@voiceassist/ui"], "chart-vendor": ["recharts"], }, }, }, }, plugins: [visualizer({ open: true, filename: "dist/stats.html" })], });

10.2 State Management Optimization

Estimate: 8-12 hours | Priority: MEDIUM | Risk: Low

Current State

  • Zustand for state management
  • React Query installed but underutilized
  • No visible React.memo usage audit

Tasks

TaskFile(s)HoursNotes
Profile renders with React DevToolsN/A2Identify expensive re-renders
Add React.memo to heavy componentsVarious2MessageBubble, BranchTree
Implement virtualization for messagesMessageList.tsx2Already using react-virtuoso
Add useDeferredValue for searchConversationsSidebar.tsx1Defer search filtering
Optimize Zustand selectorsAll stores1.5Use shallow equality
Add React Query providerApp.tsx1.5Global query client
Convert admin API to React Queryhooks/useAdminQuery.ts2Better caching

10.3 Caching & Data Fetching

Estimate: 12-16 hours | Priority: MEDIUM | Risk: Medium

Tasks

TaskFile(s)HoursNotes
Configure React Query defaultslib/queryClient.ts2staleTime, cacheTime
Add optimistic updatesVarious mutations3Immediate UI feedback
Implement background refreshQuery configs2refetchOnWindowFocus
Cache WebSocket reconnection stateuseChatSession.ts3Restore messages on reconnect
Add conversation prefetchingConversationsSidebar.tsx2Prefetch on hover
Implement request deduplicationapiClient.ts2Prevent duplicate fetches
Add offline-first mutationsconversationsApi.ts2Queue mutations when offline

Phase 11: Analytics & Observability

11.1 User Analytics

Estimate: 8-12 hours | Priority: LOW | Risk: Low

Current State

  • No analytics service integrated
  • Sentry for errors only

Tasks

TaskFile(s)HoursNotes
Choose analytics providerN/A1Recommend Plausible (privacy-first)
Install Plausible scriptindex.html0.5Simple script tag
Track page viewsRouter setup1Automatic with react-router
Track key eventsVarious3Voice session start, message sent
Create custom goalsPlausible dashboard1Feature adoption metrics
Add UTM parameter handlinglib/analytics.ts1.5Campaign tracking
Privacy policy updatedocs/1Document data collection
Create analytics dashboardInternal docs2Usage patterns report

11.2 Error Monitoring Enhancements

Estimate: 6-8 hours | Priority: MEDIUM | Risk: Low

Current State

  • Sentry fully configured in lib/sentry.ts
  • Voice-specific error capture
  • PHI redaction enabled

Tasks

TaskFile(s)HoursNotes
Add error boundary to all routesAppRoutes.tsx1.5Catch rendering errors
Enhance user contextsentry.ts1Add conversation ID
Configure performance monitoringsentry.ts1.5Transaction sampling
Add user feedback widgetcomponents/feedback/FeedbackButton.tsx2Sentry user feedback
Set up Sentry alertsSentry dashboard1Email on new issues
Add release health trackingCI pipeline1Track regression rate

11.3 Voice Mode Metrics

Estimate: 8-12 hours | Priority: MEDIUM | Risk: Low

Current State

  • VoiceMetricsDisplay.tsx exists
  • useRealtimeVoiceSession tracks metrics
  • Sentry integration for SLO violations

Tasks

TaskFile(s)HoursNotes
Create voice metrics dashboardcomponents/voice/VoiceMetricsDashboard.tsx3Historical metrics view
Track end-to-end STT latencyuseRealtimeVoiceSession.ts2From utterance to transcript
Add session duration trackingvoiceSettingsStore.ts1.5Time spent in voice mode
Monitor audio quality metricsuseRealtimeVoiceSession.ts2Sample rate, bitrate
Create health check endpointBackend API2Voice service status
Add metrics exportlib/metrics.ts1.5Download as CSV

Phase 12: Accessibility & Compliance

12.1 WCAG 2.1 AA Compliance

Estimate: 12-16 hours | Priority: HIGH | Risk: Medium

Current State

  • LiveRegion.tsx, SkipLink.tsx exist
  • ACCESSIBILITY_AUDIT.md documents issues
  • No automated testing

Tasks

TaskFile(s)HoursNotes
Install axe-corepackage.json0.5@axe-core/react
Run automated auditAll pages2Generate issue list
Fix critical issuesVarious4Color contrast, labels
Fix serious issuesVarious3Focus order, ARIA
Add focus managementModal components2Focus trapping
Test with VoiceOverManual2macOS screen reader
Test with NVDAManual2Windows screen reader
Document compliancedocs/ACCESSIBILITY.md1VPAT-style report

Implementation

// Add to test setup import { axe, toHaveNoViolations } from 'jest-axe'; expect.extend(toHaveNoViolations); // In component tests it('should have no accessibility violations', async () => { const { container } = render(<MyComponent />); const results = await axe(container); expect(results).toHaveNoViolations(); });

12.2 Keyboard Navigation

Estimate: 8-12 hours | Priority: HIGH | Risk: Low

Current State

  • useKeyboardShortcuts.ts exists
  • Basic keyboard support

Tasks

TaskFile(s)HoursNotes
Audit keyboard navigationAll interactive elements2Tab order review
Add focus trapping to modalscomponents/ui/Modal.tsx2Use focus-trap-react
Implement roving tabindexMessageList.tsx, ConversationsSidebar.tsx2Arrow key navigation
Add keyboard hints overlaycomponents/keyboard/ShortcutsOverlay.tsx2Press ? to show
Create accessibility settingscomponents/settings/AccessibilitySettings.tsx1.5Reduced motion, etc.
Add skip linksMainLayout.tsx1Skip to main content
Test keyboard-only navigationManual1.5Full app flow

Implementation Schedule

Week 1-2:  Phase 8.1 (Tests/CI) + 8.3 (Admin Dashboard)
Week 3:    Phase 8.2 (Offline Voice) + 12.1 (Accessibility)
Week 4-5:  Phase 9.1 (i18n)
Week 6:    Phase 9.2 (PWA) + 12.2 (Keyboard)
Week 7-8:  Phase 10.1-10.3 (Performance)
Week 9:    Phase 11.1-11.3 (Analytics)
Week 10+:  Phase 9.3 (Enhanced Voice) - ongoing

Dependencies

graph TD A[8.1 Tests/CI] --> B[All Phases] C[8.3 Admin Dashboard] --> D[11.1 Analytics] E[9.1 i18n] --> F[9.2 PWA] G[10.1 Bundle] --> H[10.2 State] H --> I[10.3 Caching] J[12.1 WCAG] --> K[12.2 Keyboard]

Risk Mitigation

RiskMitigation
Wake word detection accuracyUse browser SpeechRecognition API first, evaluate 3rd party later
RTL layout breakingTest incrementally, use logical CSS properties
Bundle size explosionSet CI size limits, monitor with visualizer
PWA caching issuesUse NetworkFirst for API, CacheFirst for assets
i18n string extractionUse automated extraction tools (i18next-parser)

Success Metrics

PhaseMetricTarget
8.1Test pass rate100%
8.2Offline recordings sync success>95%
8.3Admin API coverage100% endpoints wired
9.1Translation coverage>95% strings
9.2Lighthouse PWA score>90
10.1Bundle size<500KB gzipped
10.2Unnecessary re-renders<5% of renders
11.1Analytics coverageAll key events tracked
12.1axe violations0 critical/serious
12.2Keyboard-only usability100% features accessible

File Change Summary

New Files to Create

apps/web-app/src/lib/i18n.ts
apps/web-app/src/locales/en.json
apps/web-app/src/locales/ar.json
apps/web-app/src/components/settings/LanguageSwitcher.tsx
apps/web-app/src/components/pwa/InstallPrompt.tsx
apps/web-app/src/hooks/useWakeWord.ts
apps/web-app/src/hooks/useVoiceCommands.ts
apps/web-app/src/components/voice/VoiceMemoMode.tsx
apps/web-app/src/components/feedback/FeedbackButton.tsx
apps/web-app/src/components/keyboard/ShortcutsOverlay.tsx
apps/web-app/src/components/settings/AccessibilitySettings.tsx
apps/web-app/public/manifest.json
apps/web-app/public/offline.html
apps/web-app/public/icons/icon-192.png
apps/web-app/public/icons/icon-512.png

Files to Modify

apps/web-app/vite.config.ts (PWA, bundle analysis)
apps/web-app/src/App.tsx (i18n provider, React Query)
apps/web-app/src/hooks/useChatSession.ts (caching)
apps/web-app/src/components/voice/VoiceModePanel.tsx (waveform, wake word)
apps/web-app/src/components/admin/*.tsx (API wiring)
apps/web-app/src/lib/sentry.ts (enhanced monitoring)
.github/workflows/ci.yml (frontend checks)

Document generated: 2025-11-26 Author: Claude Code

Beginning of guide
End of guide