3.4 KiB
3.4 KiB
Pulse Polish Audit
Date: 2026-03-16 Version: 0.15.0-alpha
Current State
Pulse is a mature product — 55+ routes, 156 API handlers, 50 migrations, 8 background workers, 3 third-party integrations. The codebase is clean with zero TODO/FIXME comments. Recent work has focused on UX refinements: empty state CTAs, animated number transitions, inline bar charts, and mobile responsiveness fixes.
Polish Opportunities
High Impact
1. Custom 404 Page ✅ Already Done
- Branded 404 page exists at
app/not-found.tsxwith "Go back home" and "View FAQ" CTAs
2. Rate Limit (429) UX Feedback
- Issue: When rate limited, API requests fail silently with no user feedback
- Effort: Low
- Action: Catch 429 responses in the API client and show a toast with retry timing (
Retry-Afterheader)
Medium Impact
3. Export Progress Indicator
- Issue: PDF/Excel exports have no progress bar and can appear frozen on large datasets
- Effort: Low
- Action: Add a determinate or indeterminate progress bar inside
ExportModal.tsx
4. Filter Application Feedback
- Issue: Applying filters has no loading/transition indicator
- Effort: Low
- Action: Show a subtle loading state on the dashboard when filters change and data is refetching
5. Inline Form Validation
- Issue: All validation errors go to toasts only; no inline field-level error messages
- Effort: Medium
- Action: Add inline error messages below form fields (funnel creation, goal creation, site settings)
6. Accessibility: Modal Focus Trapping
- Issue: Modals don't trap focus, breaking keyboard-only navigation
- Effort: Medium
- Action: Implement focus trapping in modal components (VerificationModal, ExportModal, settings modals)
7. Accessibility: ARIA Live Regions
- Issue: Real-time visitor count updates aren't announced to screen readers
- Effort: Low
- Action: Add
aria-live="polite"toRealtimeVisitors.tsxand other auto-updating elements
8. Table Pagination Loading
- Issue: No loading indicator when paginating through table data
- Effort: Low
- Action: Show a loading spinner or skeleton overlay when fetching the next page of results
Low Impact
9. Remove Unused axios Dependency
- Issue:
apiRequestis the actual HTTP client;axiosis dead weight in the bundle - Effort: Trivial
- Action:
npm uninstall axiosand verify no imports reference it
10. PWA Service Worker Caching
- Issue:
@ducanh2912/next-pwais configured but no offline caching strategy exists - Effort: Medium
- Action: Define a caching strategy for static assets and API responses, or remove the PWA dependency
11. Image Lazy Loading
- Issue: Table/list images (favicons, flags) don't use
loading="lazy" - Effort: Low
- Action: Add
loading="lazy"to images in referrer lists, country tables, and similar components
12. OpenAPI Specification
- Issue: Backend has no Swagger/OpenAPI doc; README serves as the only API documentation
- Effort: High
- Action: Generate an OpenAPI spec from Go handler annotations or write one manually
Additional Notes
- No i18n — English only. Worth planning if expanding to international markets.
- Test coverage — 16 backend test files cover core logic well, but GSC/BunnyCDN sync and report delivery e2e are gaps.
- Chart.tsx is 35KB — A candidate for splitting into sub-components eventually.