Skip to content

feat(dashboard): coherent Nova sample data on the 4 main pages + whitelabel hardening - #12

Merged
xdroberto merged 5 commits into
developfrom
feature/dashboard-data
Jul 8, 2026
Merged

feat(dashboard): coherent Nova sample data on the 4 main pages + whitelabel hardening#12
xdroberto merged 5 commits into
developfrom
feature/dashboard-data

Conversation

@xdroberto

Copy link
Copy Markdown
Owner

What

Whitelabel hardening across all dashboard pages, plus coherent Nova Analytics sample data on the four most-visited pages — driven by one canonical masterSnapshot (a single 30-day snapshot of Nova's own dogfood workspace, admin@novaanalytics.io).

Batches (5 commits)

1. fix(branding) — whitelabel hardening (ALL pages) + CI gate

  • Purged every residual non-Nova placeholder app-wide: infra orgs (Aiy Cap / Storeframe / Acme Corp), the nova.robertobh.dev/* personal-domain leak*.novaanalytics.io, user emails (@acme.inc / @sandbox.dev), workspace labels, invoice bill-to, legacy crm-v1 / analytics-v1, the kanban shadcn/ui card, and the analytics greeting.
  • Extended scripts/branding-check.sh with the spec's gate additions plus 3 broadened patterns for gaps the spec's own list missed (Acme Inc. with a space, bare Sandbox incl. an extra occurrence at users/data.tsx:114, Acme Industries). Self-tested: the gate catches every leak and spares legit refs (@shadcn/react, shadcn/tailwind.css, bare shadcn, sandboxed).

2–5. Metrics — the 4 most-visited pages (default · analytics · ecommerce · finance)

  • KPIs, charts and headings now derive from ONE number set (MAU 128,420 · Sessions 512,900 · Events 8.64M · 99.7% delivery · 43.2% quota…), with reused deltas and sums that reconcile: channel split → 512,900; event buckets → 8.64M; report bars → 379; events-by-project → 8.64M.
  • Chart rescales done deterministically via scripts so series means land exactly on the canonical figures (e.g. User Activity → Sessions/day 17,097, DAU 6,350, 73% ratio preserved). The one flagged component change is applied: delivery-health gauge Math.roundtoFixed(1) so the center reads 99.7% (plain rounding rendered 100%).

Out of scope — per Roberto's call (time-boxed)

The remaining pages (crm, academy, logistics, infrastructure, productivity, users/roles/tasks/invoice, kanban, calendar, legacy) keep their template sample numbers but are fully whitelabeled (batch 1, CI-enforced) — no non-Nova branding remains anywhere.

Also deferred inside the 4 pages: the ecommerce Recent Orders → "Report Activity" table reframe (a deeply-coupled table subsystem — schema / badges / filters / 34 rows). It holds clean generic data and passes the branding gate, so it was left intact rather than risk the filter logic under time pressure.

Verification

Per batch: biome · branding-check · next build (31 routes) ✅. Auth/landing/security e2e 11/11 ✅ (run at batch 1; the metric edits don't touch those surfaces). Rebased clean onto the latest develop (disjoint files — landing + security-audit commits).

🤖 Generated with Claude Code

https://claude.ai/code/session_01PA9EzergAZ12Dy1QBqx5kp

xdroberto and others added 5 commits July 8, 2026 12:18
Remove all remaining non-Nova branding from dashboard sample data and extend
the branding-check gate so CI catches it:
- infrastructure: org placeholders (Aiy Cap / Storeframe / Acme Corp) -> Nova
  Analytics; nova.robertobh.dev/* domains -> *.novaanalytics.io (personal-domain leak)
- users: @acme.inc / @sandbox.dev emails -> @novaanalytics.io; workspace labels
  Acme Inc. -> Web App, Sandbox -> Mobile (incl. an extra "Sandbox" the spec
  list missed at data.tsx:114); filter list realigned
- invoice: bill-to AIY Cap -> Northstar Labs with a US address + taxId
  (was a Mumbai GSTIN), for internal consistency
- legacy crm-v1: Shadcn / Shadcn UI Kit lead entries -> Sarah Parker /
  Northstar Labs / Cinder Health
- legacy analytics-v1: Acme Industries -> Cinder Health
- kanban: shadcn/ui desktop-shell card -> data-retention-controls
- analytics: greeting "Hello, Aiy" -> "Welcome back, admin"

branding-check.sh FORBIDDEN extended with aiy/aiycap, acme (inc/corp/industries),
storeframe, robertobh, \bsandbox\b, shadcn ui kit, shadcn/ui. Self-tested: the
gate catches every leak and spares legit refs (@shadcn/react, shadcn/tailwind.css,
bare shadcn). Verified: tsc, biome, branding gate, next build (31 routes), e2e 11/11.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PA9EzergAZ12Dy1QBqx5kp
Replace template sample data with the canonical 30-day snapshot on
/dashboard/default:
- KPI cards: MAU 128,420 (+12.5%), New Signups 3,240 (-20%), Sessions
  512,900 (+11.2%), Conversion Rate 4.8% (+0.4pp); icons -> Users/UserPlus/
  Activity/Target
- User Activity chart: rescale the 180-point series in place so the means land
  on canonical figures — Sessions/day 17,097 (x1.63584), Active Users 6,350
  (x1.01714), Returning Users 4,656 (same factor keeps ratio 0.7333 exactly);
  Area always above Lines (min 10,139 > max 6,744); series/title relabeled,
  description now analytics-oriented (residual R3)
- Recent Accounts: heading -> "128,420 Active Users"; Customer -> Account

Data was already whitelabel-clean; status/billing enums are coherent for a
B2B SaaS analytics product and were left intact.
Verified: biome, branding gate, next build (31 routes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PA9EzergAZ12Dy1QBqx5kp
Align /dashboard/analytics with the canonical snapshot:
- Audience strip: Unique Visitors 156.2k (+11.8%, from 139.75k), Sessions
  512.9k (+11.2%), Pageviews 1.86M (+9.4%, was DOWN -> UP), Engagement 62.4%
  (+3.1pp), Conversion 4.8% (+0.4pp, was DOWN -> UP); dropped unused
  ArrowDownRight
- Traffic Sources: series label Visitors -> Sessions; sources now sum to the
  512,900 session total (Organic 198.4k / Direct 121.6k / Social 82.3k /
  Referral 64.9k / Paid 45.7k); Spring Launch 16.8k -> 15.8k so campaigns sum
  exactly to Paid 45,700; referrers already summed to 41,400
- Realtime Visitors: header "142 active now · 24 per minute"; bars raised to
  ~14-36 (avg ~24, 4 zero-dropouts) with YAxis domain [0,40]; country split
  14/4/3/3 = 24 unchanged
- Engagement Quality (was Traffic Quality): retitled + series Actual/Baseline;
  data kept (actual -4.7..5.7)
- Top Pages: /blog + /contact -> /signup + /integrations; docs time 4m44s ->
  2m44s; top-5 views sum 175.9k

Verified: biome, branding gate, next build (31 routes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PA9EzergAZ12Dy1QBqx5kp
Reframe /dashboard/ecommerce from store metrics to product analytics:
- KPI strip (6): Events Captured 8.64M (+13.6%), Reports Created 379 (+6.2%),
  New Users 7d 756 (-20%), Events/Session 16.8, Active Alerts 18, Data
  Delivery 99.7%; icons swapped (Activity/FileText/UserPlus/Gauge/Bell)
- Events Overview (was Sales Overview): rescaled revenueBucketValues x0.17792
  so current month = 8,640K = 8.64M events (buckets 833-1,665K);
  profitMultipliers -> 0.044 so report bars sum to 379; YAxis [0,2000]/[0,120];
  tooltip drops "$", renders {value}K for events / int for reports
- Data Delivery Health (was Inventory): counts 8,614,080/17,280/8,640;
  availablePercent Math.round -> toFixed(1) so the center reads 99.7% (not
  100); labels Delivered/Delayed/Failed
- Live Traffic 24h (was Store Traffic): header "17.1K sessions (24h)"; 96 pts
  rescaled to sum exactly 17,097 (YAxis -> [0,850]); series Sessions/Anomalies
- Traffic Sources: channels Organic 39 / Direct 24 / Social 16 / Referral 12 /
  Paid 9 (=100), per-day sessions; removed brand icons (Meta/Google/etc.);
  header "17.1K sessions"
- Top Events (was Top Products): page_viewed 2.68M / query_run 2.07M /
  chart_viewed 1.55M = 73% of events

Deferred (noted for review): the Recent Orders table -> "Report Activity"
reframe is a deeply-coupled table subsystem (schema/badges/filters/34 rows);
it holds clean generic data and passes the branding gate, so it is left as-is
rather than risk the filter/enum logic in this batch.
Verified: biome, branding gate, next build (31 routes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PA9EzergAZ12Dy1QBqx5kp
Turn /dashboard/finance into Nova's usage & billing view:
- heading "Personal Finances" -> "Usage & Billing"
- KPI cluster: Events this cycle 8.64M (+13.6%), Events remaining 11.36M of
  20M (56.8%), Avg events/day 288K, Quota used 43.2%
- Top data sources (was Income sources): Web App 4.51M / iOS 1.78M / Android
  1.36M
- Events by Project donut (was Account Allocation): 5 slices summing to 8.64M
  (Web App 52.2% ... Docs 1.5%); replaced currency formatting/selector with an
  events (M) formatter + time-window picker
- Ingestion Overview (was Spending Overview): events ingested/day ~288K
  (240-340K) vs ingestion errors/day ~860 (0.3%); tooltip drops "$" -> K
- Scheduled Reports (was Upcoming Bills): Weekly Growth Digest / Monthly
  Retention / Funnel Alert Review; removed Claude/Resend/Linear brand icons
- Current Plan (was Wallet): Growth plan · 20M events/mo, 43.2% usage bar,
  seats 8; removed bank/crypto brand icons (Revolut/HSBC/Bitcoin/etc.)
- Invite teammate + Quick actions (was Quick Transfer + Shortcuts): email
  invite + Create report/Set alert/Export CSV shortcuts

Verified: biome, branding gate, next build (31 routes).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PA9EzergAZ12Dy1QBqx5kp
@xdroberto
xdroberto merged commit d9cdccc into develop Jul 8, 2026
3 checks passed
@xdroberto
xdroberto deleted the feature/dashboard-data branch July 8, 2026 17:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant