Files
meseo-staging/AUDIT-REPORT.md
T
Andres Resiri 70daeb214a
CI / Quality gate (push) Has been cancelled
Initial project commit for Coolify staging
2026-08-03 10:45:41 -04:00

7.7 KiB

Sidebar Page Audit Report

Audit performed against sidebar navigation (src/components/sidebar.tsx) on the feature branch claude/general-session-mMtpD. 23 routes checked.

Summary

  • Total pages checked: 23
  • Working with proper empty states: 14
  • ⚠️ Works but missing empty state / partial gating: 7
  • Broken or will crash: 0
  • 🚫 Page file missing: 0
  • 🪹 Stub pages (route exists but no real content): 2

Detailed Findings

Working Pages (14)

Route Path Notes
/brands-hub src/app/brands-hub/page.tsx (skipped per instructions — already working)
/signals src/app/signals/page.tsx Full error handling, "No signals for this filter" empty state, task creation error feedback
/website-upload src/app/website-upload/page.tsx Form validation gates submission, orgId check, success state with next steps
/site-tag src/app/site-tag/page.tsx Excellent setup CTA empty state ("Generate meSEO Site Tag"), safe null checks, loading spinner
/dashboard src/app/dashboard/page.tsx Full state reset on brand change, per-source connection gating, 5 distinct KPI card states, "Connect GSC" / "Awaiting Data" / connected states for Search Performance
/conversion-intelligence src/app/conversion-intelligence/page.tsx State machine with 6 explicit states: loading, not_connected, awaiting_sync, connected_empty, connected, error. Retry button on error state
/competitors src/app/competitors/page.tsx Uses hasData() helper + SourceEmptyState, graceful filter-empty state, safe network error handling
/technical-audit src/app/technical-audit/page.tsx Robust — 3-minute polling timeout, specific 429/403/504 error messages, 3 distinct states (no audit / running / failed), limited coverage warning
/site-performance-audit src/app/site-performance-audit/page.tsx "No Audit Yet" / "Running" / "Failed" states, network error caught
/dead-pages src/app/dead-pages/page.tsx Uses getSourceStatus("dead_pages") integration check, comprehensive empty state, "Select row" fallback
/page-studio src/app/page-studio/page.tsx Client-side canvas builder with no API calls, onboarding flow when no blocks, toast feedback for all actions
/recommendations src/app/recommendations/page.tsx Uses hasData() + SourceEmptyState, "No Issues Found" success state when counts.total === 0
/execution-hub src/app/execution-hub/page.tsx Brand guard on useEffect, try/catch on task operations, optimistic UI with rollback, "No tasks match filters" empty state
/page-launch-tracker src/app/page-launch-tracker/page.tsx SourceEmptyState when no launches, action link to Execution Hub
/settings src/app/settings/page.tsx Static form with mock team data, Save feedback, no API dependencies
/pricing src/app/pricing/page.tsx Graceful API fallback to FALLBACK_PLANS, loading spinner, always renders content

⚠️ Missing Empty States / Partial Gating (7)

Route Path Issue
/ai-strategist src/app/ai-strategist/page.tsx Has rich empty state for no-analysis case, but no pre-flight integration check — calls /api/analysis unconditionally. Relies on backend to return partial data. A brand new brand with no sources connected will still see the "Generate Analysis" button but the generated analysis will be mostly empty. Recommendation: add an integration-status banner before the "Generate" CTA.
/integrations src/app/integrations/page.tsx Shows all integrations as cards regardless of state, but no welcoming onboarding banner when zero integrations are connected. loadIntegrationStatus() silently swallows errors. New users may not know where to start. Recommendation: add "Get started — connect GA4 or GSC" banner at top when connectedCount === 0.
/content-brief src/app/content-brief/page.tsx Silent fallback to MOCK_BLOCKS when API fails or returns empty. No visual indicator distinguishing mock content from real saved briefs. Users may edit mock data thinking it's real. Recommendation: add banner "No saved briefs yet — this is a template" or hide editor until user creates a brief.
/llmo-content-brief src/app/llmo-content-brief/page.tsx Identical issue to /content-brief — falls back to mock data silently with no indicator.
/report-studio src/app/report-studio/page.tsx No error handling on report builds or data source toggles. No empty state when zero sections selected. Disabled-source check exists on toggles but no warning when building with unconnected sources. Build button active even with 0 sections. Recommendation: disable build button until at least 1 section + 1 connected source is selected.
/execution-hub src/app/execution-hub/page.tsx Otherwise working, but no pre-flight integration gating — users can create tasks for a brand that has zero integrations connected. Not strictly broken since tasks are brand-agnostic, but could be confusing. (Minor — flagging for visibility.)
/technical-audit src/app/technical-audit/page.tsx Otherwise working, but no getSourceStatus integration check before fetching. Dead-pages page does this correctly and could serve as a pattern. (Minor — flagging for consistency.)

Broken Pages (0)

None found. No page will crash, render a blank white screen, or show raw errors.


🚫 Missing Pages (0)

All 23 sidebar routes have a corresponding page.tsx file. No broken links.


🪹 Stub Pages (2)

These pages exist but are essentially placeholder stubs that render SourceEmptyState regardless of integration status — including when the source is connected. They never display real data.

Route Path Issue
/ai-visibility src/app/ai-visibility/page.tsx Checks if (!status || status.status !== "connected") → renders SourceEmptyState. But the "connected" branch also returns the same SourceEmptyState — no actual implementation. Page is a stub.
/local-geo src/app/local-geo/page.tsx Identical stub to /ai-visibility. Always renders empty state, no real content regardless of connection status.

Recommendation: Either (a) implement the actual data view for the "connected" branch, or (b) update the empty state copy to be honest ("AI Visibility tracking launches soon — we'll notify you when it's ready") so users understand this is a coming-soon feature rather than a broken page.


Critical Launch-Blocking Issues

None. No page will crash or show a raw error. However, the following are UX launch risks worth addressing:

Priority 1 (fix before launch)

  1. /ai-visibility and /local-geo stubs — users will click these from the sidebar and get the same empty state whether or not they have integrations. Either implement or mark as "Coming Soon".
  2. /content-brief and /llmo-content-brief mock fallback — users may edit mock content thinking it's saved. Add a visible "Template / Not saved" indicator.
  3. /report-studio no-op build button — add validation so users can't build empty reports.

Priority 2 (post-launch polish)

  1. /integrations welcome banner for zero-connected state
  2. /ai-strategist pre-flight integration check
  3. /technical-audit and /execution-hub source-status gating for consistency

Audit Coverage

All 23 sidebar routes checked Page files existence verified Error handling traced (try/catch, null checks, response.ok) Empty state handling verified for zero-data scenarios Integration gating reviewed Import resolution confirmed New-brand scenario considered (brand with no connected sources, no audits, no tasks)