Skip to content

Analytics

The saved view and the comparison window first, because every figure below depends on both — then six charts, none of which load a charting library.

8 blocks68 lineslucide-reactAdded 10 Sept 2026

What's included

  • app/analytics-page.tsx
  • 8 blocks it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab add analytics-page

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Preview

Analytics

The window and the comparison first, because every figure below them depends on both.

Support queue

One filter has been added to this view: Enterprise only

All open is shared with your team. Saving changes what everyone sees, including tomorrow's scheduled digest.

Filters in this view

  • Status is open
  • Any assignee
  • Last 30 days
  • Enterprise only

Narrow it further

Reporting period

Every percentage on this dashboard is measured against the comparison window below.

Compare against
Aug 4 – Aug 31, 2026Jul 7 – Aug 3, 2026

Both windows are inclusive of their end dates and computed in UTC, so a change of clocks never produces a week of six days and 23 hours.

This month

The four numbers the team looks at

Every figure names what it is being compared against. A delta with no stated period is the most common way a dashboard misleads the people who built it.

Active workspaces
3,412

+7.2% on the previous 30 days, not on last calendar month.

Net revenue retention
112%

Trailing twelve months, expansion minus churn and contraction.

p95 latency
412 ms

Same period, all regions. p50 is 96 ms and hides this.

Open incidents
1

Degraded, not down. Public status page has the detail.

Requests

1.24M+18.2%

Trend over the last 12 periods, rising 18.2 percent.

Error rate

0.12%-34.5%

Trend over the last 12 periods, falling 34.5 percent.

p95 latency

184ms-8.1%

Trend over the last 12 periods, falling 8.1 percent.

Monthly active workspaces

Compared with the same month last year.

  • This year
  • Last year
  • 5,000
  • 3,500
  • 2,000
  • Jan
  • Mar
  • May
  • Jul
  • Sep
  • Nov
Monthly active workspaces
MonthThis yearLast year
Jan3,1202,980
Feb3,2603,010
Mar3,1803,090
Apr3,5403,120
May3,7203,050
Jun3,6103,210
Jul3,8803,180
Aug4,0203,340
Sep3,9603,290
Oct4,1803,410
Nov4,3203,380
Dec4,4103,520

Where the bill went

Billing period to date, across every project in the workspace.

Compute
$4,82048.2%
Object storage
$2,14021.4%
Egress
$1,31013.1%
Managed Postgres
$8908.9%
Log retention
$4204.2%
Other (3 lines)
$4154.2%

Signup funnel

Last 30 days

End to end 5.5%

  1. Visited pricing18,420Top of the funnel

    100.0% of the funnel

  2. Started signup6,21533.7%from previous step

    12,205 did not continue · 33.7% of everyone who started

  3. Verified email4,98880.3%from previous step

    1,227 did not continue · 27.1% of everyone who started · Link expires after 24 hours

  4. Reached checkout1,10222.1%from previous step

    3,886 did not continue · 6.0% of everyone who started

    Biggest drop in the funnel — 77.9% of the previous step stops here

  5. Paid1,01492.0%from previous step

    88 did not continue · 5.5% of everyone who started

Counted as a cohort: every person here entered at the first step inside the window and is followed through in order. Someone who signed up last month and paid this month is not in these numbers, so this reads lower than a per-step total over the same period — and it is the one that answers “what happens to the people we get”.

Deploy activity

1,453 deploys across 306 active days in the last year

LessLevel 0Level 1Level 2Level 3Level 4More
Deploy activity by month
Monthdeploys
Sep 202572
Oct 202590
Nov 202587
Dec 2025109
Jan 2026111
Feb 202669
Mar 2026132
Apr 2026146
May 2026148
Jun 2026157
Jul 2026170
Aug 2026162

The real page, rendered in your current theme — every section below is a live block, not a screenshot.

Built from

All blocks
  1. Saved View TabsSaved views with the third state most implementations drop: a shared view with unsaved edits, where Save changes what a colleague sees tomorrow. Two honest buttons instead of one, ownership on the tab, and dirty said in words.
  2. Comparison Period PickerA reporting window with the comparison window spelled out beside it — resolved dates, UTC arithmetic, and an option to align weekdays so a weekend is never compared against a Tuesday.
  3. KPI Summary BandThe top-of-dashboard figures, each carrying the comparison period that makes a delta mean anything.
  4. Sparkline Metric CardsKPI cards with a hand-built SVG trend line — no charting dependency for a path this file computes in twelve lines.
  5. Dual-Series Line ChartA year-over-year trend in inline SVG with a printed axis, no charting dependency and the same data repeated as a screen-reader table.
  6. Donut BreakdownWhere a total went, drawn as one conic-gradient ring with the total in the hole and every number repeated in the legend.
  7. Conversion FunnelA funnel that leads with the step-to-step rate and the people who fell out of it, not the tidy share-of-top percentages nobody can act on. Biggest drop named in words, and a footnote saying which definition of funnel this is.
  8. Daily Activity HeatmapA year of daily activity as one square per day, bucketed against a quantile so a single outlier cannot flatten the scale.

Only want one section? Open it and copy that block instead — browse Dashboards.

Source

app/analytics-page.tsx
/**
 * The analytics screen, arranged so the controls that change every number
 * on it come before the numbers.
 *
 * `dashboard-overview` is the glanceable version — cards, a feed, a header.
 * This is the one someone actually works in, and the difference is entirely
 * about the two controls at the top.
 *
 * <DashboardSavedViews> and <DashboardComparisonPeriod> are first because
 * every chart below them is meaningless without knowing which window is
 * being shown and what it is being compared against. A dashboard that puts
 * its date picker in a corner produces a specific, repeatable mistake:
 * someone reads a 40% rise, screenshots it, and finds out later they were
 * comparing four weeks against three.
 *
 * Then the numbers, in decreasing altitude:
 *
 *   kpi band      the four figures the meeting is about
 *   sparklines    the same figures with their direction
 *   line chart    one metric over a year, with the axis printed
 *   donut         where a single total went
 *   funnel        where people fell out, led by the step-to-step rate
 *   heatmap       a year of days, so seasonality is visible at all
 *
 * The funnel is deliberately after the donut even though both are
 * breakdowns. A donut answers "of the whole, how much"; a funnel answers
 * "between two steps, how many survived", and the second question only
 * makes sense once someone has the total in their head.
 *
 * Nothing here loads a charting library. Every chart on this page is inline
 * SVG or a conic gradient, which is the reason a page with six of them is
 * still a page and not a bundle.
 */

import * as React from 'react'
import { DashboardSavedViews } from '@/components/dashboard-saved-views'
import { DashboardComparisonPeriod } from '@/components/dashboard-comparison-period'
import { KpiSummaryBand } from '@/components/kpi-summary-band'
import { MetricSparklineCards } from '@/components/metric-sparkline-cards'
import { LineChartPanel } from '@/components/line-chart-panel'
import { DonutBreakdown } from '@/components/donut-breakdown'
import { FunnelConversionPanel } from '@/components/funnel-conversion-panel'
import { ActivityHeatmap } from '@/components/activity-heatmap'

export default function AnalyticsPage() {
  return (
    <main className="min-h-screen bg-background text-foreground">
      <section className="mx-auto w-full max-w-6xl px-6 pb-2 pt-12">
        <h1 className="text-2xl font-bold tracking-tight">Analytics</h1>
        <p className="mt-1 text-sm text-muted-foreground">
          The window and the comparison first, because every figure below
          them depends on both.
        </p>
      </section>

      <DashboardSavedViews />
      <DashboardComparisonPeriod />

      <KpiSummaryBand />
      <MetricSparklineCards />
      <LineChartPanel />
      <DonutBreakdown />
      <FunnelConversionPanel />
      <ActivityHeatmap />
    </main>
  )
}

How to use it

  1. 1. Copy each of the 8 blocks above into components/ — each block page has its own copy button.
  2. 2. Drop this file at app/analytics-page.tsx. The imports already point at @/components/…, so they resolve with no edits.
  3. 3. Delete the sections you do not want. Every block takes props, so the copy changes without the layout moving.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

More App Screens

Open the full page for this page

Dashboard Overview

The screen an app opens on: shell, header, KPI row, chart and activity feed — numbers first, shape second, changes last.

App Screens5 blocks47 lines
Open the full page for this page

AI Assistant Screen

An agent working inside a real app: a transcript down the middle — reasoning, answer, then the one card that can act — with what it may read and what it noticed demoted to a rail.

App Screens7 blocks110 lines
Open the full page for this page

Project Board

A kanban board inside the app shell, with tabs that admit the board is one view among several and a header whose primary action is creating work.

App Screens3 blocks42 lines
Open the full page for this page

Customer List Screen

The canonical CRUD list — header, toolbar, sortable table and pagination framed as one panel instead of three stacked cards.

App Screens5 blocks37 lines
Open the full page for this page

Onboarding

A wizard for the session someone finishes and a checklist for the one they do not, with the only genuinely blocking step in front of both.

App Screens3 blocks45 lines
Open the full page for this page

Search Results

Built around the state a search page is in most of the time — empty — so recent queries lead and the facets sit in a sidebar that survives growing to twelve.

App Screens4 blocks47 lines
Open the full page for this page

Agent Run Detail

One run opened up in the order you would debug it — intent, actions, the retries that are invisible in both, then cost.

App Screens4 blocks49 lines
Open the full page for this page

Approvals Inbox

The queue, the same queue sorted by how long things have waited, and the policy that decided both — with the policy last so it is not scrolled past forever.

App Screens3 blocks45 lines
Open the full page for this page

Assistant Chat

The blank thread answered with real starter prompts, the model picker with the three numbers the choice turns on, and the four surfaces a session grows into — attachments, branches, canvas, threads.

App Screens6 blocks68 lines
Open the full page for this page

Agent Run Inspector

The three states an agent screen usually omits: the wait before the first token, the trace after something broke with retries costed in the open, and the diff it wants a person to accept.

App Screens5 blocks61 lines
Open the full page for this page

Retrieval Console

Why the answer said what it said: what is connected, how stale it is, what the query was allowed to see, what fitted in the window and what fell out — plus the failed-search state a debugging tool is most needed in.

App Screens7 blocks66 lines
Open the full page for this page

AI Editor

Five ways to reach a model without the cursor leaving the sentence — slash menu, inline completion, selection toolbar, action menu, property inspector — and the two surfaces that say where the answer came from.

App Screens7 blocks64 lines
Open the full page for this page

Records Table

A table after real people have used it — columns reordered from the keyboard, a selection bar that asks page-or-all, subtotals that survive collapsing, cells edited in place, and the empty state its own filters produced.

App Screens8 blocks71 lines
Open the full page for this page

Alerting

Thresholds with how often each has actually fired, what that produced, where it went — and the digest settings that exist because of the answer.

App Screens5 blocks54 lines
Open the full page for this page

Import Data

The flow between an empty product and a useful one, in the order it goes wrong: sample data offered with equal weight, a file, a URL, the column mapping everything stalls on, and an upload that survives the connection dropping.

App Screens7 blocks64 lines
Open the full page for this page

Account Setup

A profile form where the role options state what they actually change, the avatar crop works from the keyboard, and a navigation guard names the fields it is about to throw away.

App Screens4 blocks53 lines
Open the full page for this page

App Shell

The furniture that is on every screen and belongs to none — navbar, mobile drawer, command palette, shortcut sheet, header search, scope switcher, and the two shapes a detail view takes without losing the list.

App Screens8 blocks68 lines
Open the full page for this page

Workspace Activity

Backwards from now and forwards from it on one screen — a day-grouped timeline, a month grid where a busy Tuesday never changes the row height, and the state both are in on day one.

App Screens3 blocks51 lines
Open the full page for this page

First Run

What the product looks like while onboarding happens: a tour step anchored to the control it explains, the skeletons of the slowest load it will ever do, and the checklist that outlives both.

App Screens3 blocks50 lines