feat(dashboard): coherent Nova sample data on the 4 main pages + whitelabel hardening - #12
Merged
Merged
Conversation
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
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 gatenova.robertobh.dev/*personal-domain leak →*.novaanalytics.io, user emails (@acme.inc/@sandbox.dev), workspace labels, invoice bill-to, legacy crm-v1 / analytics-v1, the kanbanshadcn/uicard, and the analytics greeting.scripts/branding-check.shwith the spec's gate additions plus 3 broadened patterns for gaps the spec's own list missed (Acme Inc.with a space, bareSandboxincl. an extra occurrence atusers/data.tsx:114,Acme Industries). Self-tested: the gate catches every leak and spares legit refs (@shadcn/react,shadcn/tailwind.css, bareshadcn,sandboxed).2–5. Metrics — the 4 most-visited pages (
default·analytics·ecommerce·finance)Math.round→toFixed(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 latestdevelop(disjoint files — landing + security-audit commits).🤖 Generated with Claude Code
https://claude.ai/code/session_01PA9EzergAZ12Dy1QBqx5kp