Staging -> Main: marketing site overhaul, feature pages, realtime dashboard#426
Staging -> Main: marketing site overhaul, feature pages, realtime dashboard#426izadoesdev merged 15 commits intomainfrom
Conversation
- Hero CTA: "Start free" -> "See your analytics in 5 minutes" - Grid cards: "Set up once, understand everything" -> "One install. Six tools replaced." - Testimonials: "What developers are saying" -> "Why developers are switching" + real numbers - Bottom CTA: outcome-driven headline with switching cost reduction subhead - Footer CTA: loss-aversion angle for late-stage visitors - Pricing: "One price. Every feature." header - Description section: added resolution line closing the problem loop - Added 4 objection-handling FAQs (migration, outgrowing, speed, self-host) - Added stats bar (500+ websites, 2,000+ developers, 10M+ events/month)
- Rewrote errors, web-vitals, feature-flags, and uptime pages to use Section with default padding and max-w-400 container (matching main page) - Created demo-primitives.tsx with FeatureHero, SectionHeader, TwoColumnGrid, GridCell, and shared demo utilities (CardChrome, BottomFade, MaskedTableShell) - Created demo-constants.ts for server-safe string constants - Removed ClosingCtaSection, ValueProp, ff-demo-reveal (consolidated) - Added bento card href links to feature pages - Fixed navbar /error-tracking -> /errors href - Removed /error-tracking and /web-vitals redirects (now real pages) - Added d3-geo, topojson-client, world-atlas dependencies for uptime globe - Removed useless "Built for production" section from feature-flags page
Mechanical find-and-replace of all em-dash characters in .ts/.tsx files.
The pre-commit format hook with stage_fixed: true was running ultracite fix on staged files and re-staging them, which overwrites working tree changes during partial commits. Removed the format command; linting should be run manually or in CI instead.
- Reduced row height from h-14 to h-9, header from h-10 to h-8 - Removed "unique users" and "total views" sublabels from metric cells - Tightened padding and icon sizes for denser table layout
…s, feed, velocity New RealtimeBuilders module with 5 query types for the realtime dashboard. Adds corresponding parameter types to shared ParameterDataMap.
- New realtime page with live visitor map using cobe globe - Country codes mapping for flag display - Added cobe, d3-geo, topojson-client, world-atlas dependencies
- Swapped Phosphor CheckIcon/PaperPlaneTiltIcon to Nucleo CheckIcon/EnvelopeSimpleIcon - Made subscribe button icon-only (size="icon") with aria-label - Input height aligned to h-9 (DS default) - Merged duplicate @databuddy/ui imports
The DS Button was missing cursor-pointer, causing no hand cursor on hover across every button in the app.
The pre-commit hook had reverted the FAQ section back to the plain Mahika version. Restores the Swami-style accordion-item CSS class (yellow->pink->indigo gradient left border on hover/open), SectionBullet with orange color, and sticky left-side title layout.
- Deleted ff-demo-reveal.ts (consolidated into useRevealOnScroll) - Replaced local EASE, CardChrome, BottomFade, RightFade, TH/TH_RIGHT across 15 demo files with imports from demo-primitives/demo-constants - Removed dead exports: TABLE_HEADER_ROW, TABLE_BODY, revealStyle, MaskedTableShell
- Tab indicator slides left/right using motion layoutId with spring physics - Demo iframe panels slide in the direction of navigation with CSS transitions - Tracks previous tab index to determine slide direction
Panels left of active slide offscreen left, panels right slide offscreen right. Removed broken direction/prevTabIndex tracking.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
1 Skipped Deployment
|
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: ASSERTIVE Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryLarge staging-to-main merge covering a marketing site overhaul (landing page copy, 4 new feature pages, shared demo primitives), a realtime dashboard page with a canvas globe map, compact table rows, and miscellaneous DS/config cleanup. Two issues need attention before merge:
Confidence Score: 3/5Not safe to merge as-is — the stray Two P1 findings: an external unknown package being pulled into the monorepo root and a redirect removal that will 404 existing SEO/bookmark traffic. The rest of the 90-file change is well-structured and follows existing patterns.
Important Files Changed
Sequence DiagramsequenceDiagram
participant Browser
participant RealtimePage
participant useDynamicQuery
participant API
participant RealtimeBuilders
participant RealtimeMap
Browser->>RealtimePage: Navigate to /realtime
RealtimePage->>useDynamicQuery: poll realtime_countries (5s interval)
useDynamicQuery->>API: POST /query {id: realtime-countries}
API->>RealtimeBuilders: realtime_countries builder
Note over RealtimeBuilders: WHERE time >= now() - 5 MIN<br/>GROUP BY country<br/>normalizeGeo plugin → country_code/country_name
RealtimeBuilders-->>API: SQL result
API-->>useDynamicQuery: [{country_code, country_name, visitors}]
useDynamicQuery-->>RealtimePage: data.realtime_countries
RealtimePage->>RealtimeMap: countries prop (lazy-loaded, ssr:false)
RealtimeMap->>RealtimeMap: canvas init (one offscreen canvas per country)
RealtimeMap->>RealtimeMap: rAF draw loop (Bayer dither fill + hover hit-test)
|
| "chalk": "^5.6.2", | ||
| "cobe": "^2.0.1", | ||
| "culori": "^4.0.2", | ||
| "dashboard": "^0.0.1", |
There was a problem hiding this comment.
Unknown external
dashboard package added to root
"dashboard": "^0.0.1" resolves to an external npm package, not the local @databuddy/dashboard workspace app. Bun will fetch an unrelated package from the registry. This appears to be an accidental inclusion and should be removed — the local app is already referenced by workspace protocol via @databuddy/dashboard.
| "@types/dockerode": "^3.3.47", | ||
| "@types/node": "^24.12.2", | ||
| "chalk": "^5.6.2", | ||
| "cobe": "^2.0.1", |
There was a problem hiding this comment.
| "tokenlens": "^2.0.0-alpha.3", | ||
| "@tokenlens/models": "1.3.0" | ||
| } | ||
| }, | ||
| "dependencies": { | ||
| "d3-geo": "^3.1.1", |
There was a problem hiding this comment.
Root-level
dependencies duplicates app-level packages
d3-geo, topojson-client, and world-atlas are already declared in apps/docs/package.json. Adding them again to the workspace root's dependencies creates a second resolution target that will be installed for every workspace package. In a Bun monorepo these should live only in the app that consumes them; remove the root-level dependencies block.
| type: "number", | ||
| label: "Active Visitors", | ||
| description: "Unique visitors from this country", | ||
| }, | ||
| { | ||
| name: "latitude", | ||
| type: "number", | ||
| label: "Latitude", | ||
| description: "Country centroid latitude", | ||
| }, | ||
| { | ||
| name: "longitude", | ||
| type: "number", | ||
| label: "Longitude", | ||
| description: "Country centroid longitude", | ||
| }, | ||
| ], | ||
| default_visualization: "table", | ||
| supports_granularity: [], | ||
| version: "1.0", | ||
| }, | ||
| table: Analytics.events, | ||
| fields: [ | ||
| "country as name", | ||
| "uniq(anonymous_id) as visitors", | ||
| ], | ||
| where: [ | ||
| "event_name = 'screen_view'", | ||
| "time >= now() - INTERVAL 5 MINUTE", | ||
| "country != ''", | ||
| ], | ||
| groupBy: ["country"], | ||
| orderBy: "visitors DESC", | ||
| limit: 50, | ||
| timeField: "time", | ||
| skipDateFilter: true, | ||
| customizable: false, | ||
| plugins: { normalizeGeo: true, deduplicateGeo: true }, | ||
| }, |
There was a problem hiding this comment.
output_fields meta declares fields that the query never returns
The realtime_countries builder's meta.output_fields lists country, latitude, and longitude, but the actual fields array only selects "country as name" and "uniq(anonymous_id) as visitors". The normalizeGeo plugin will produce country_code/country_name (not country), and there is no latitude/longitude computation anywhere. The meta documentation will be misleading for API consumers and any tooling that generates UIs from it.
| <div className="space-y-2"> | ||
| <form className="flex gap-2" onSubmit={handleSubmit}> | ||
| <Input | ||
| className="h-10 w-full min-w-0 sm:w-80" | ||
| className="h-9 w-full min-w-0" | ||
| disabled={status === "loading"} | ||
| placeholder="you@company.com" | ||
| ref={inputRef} | ||
| required | ||
| type="email" | ||
| /> | ||
| <Button | ||
| className="shrink-0" | ||
| aria-label="Subscribe to newsletter" | ||
| disabled={status === "loading"} | ||
| loading={status === "loading"} | ||
| size="lg" | ||
| size="icon" | ||
| type="submit" | ||
| > | ||
| Subscribe | ||
| <PaperPlaneTiltIcon className="size-3.5" weight="fill" /> | ||
| <EnvelopeSimpleIcon className="size-4" /> | ||
| </Button> |
There was a problem hiding this comment.
Icon-only subscribe button hides action label for non-screen-reader users
The visible "Subscribe" text was replaced with a bare EnvelopeSimpleIcon. While aria-label covers screen readers, sighted users have no text affordance on the CTA button — an envelope icon alone doesn't clearly communicate "subscribe". Consider keeping at least a short visible label (e.g. "Subscribe" or "Join") alongside the icon, or use a tooltip.
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Summary
Test plan