MetricUIMetricUI
Compare

MetricUI vs Tremor

Two React dashboard libraries with different philosophies, different chart engines, and very different trajectories. Here is an honest comparison to help you pick the right tool for your next analytics project.

TL;DR

Tremor is a beautifully designed dashboard component library that gained well-deserved traction in the React ecosystem. It ships clean Tailwind-based components and was backed by Y Combinator before being acquired by Vercel in January 2025. Since the acquisition, active development has slowed and the project has pivoted toward a copy-paste model.

MetricUI takes a different approach: purpose-built for data-heavy dashboards with 18 chart types, cross-filtering, drill-down, export, AI insights, and a complete theming system with runtime switching. It is newer and has a smaller community, but it covers significantly more ground for teams building production analytics interfaces.

If you need a lightweight set of chart primitives and you are comfortable building dashboard wiring yourself, Tremor is a solid starting point. If you want a complete dashboard framework with interactivity, layout, and AI baked in, MetricUI is the more comprehensive choice.

What is Tremor?

Tremor launched as an open-source React library focused on making it easy to build dashboards with Tailwind CSS. It earned a loyal following for good reason: the components looked great out of the box, the API was approachable, and the Tailwind-native styling made it feel at home in modern React projects.

Tremor ships around 45 total components, though many of those are general-purpose UI primitives like Button, Input, Switch, and Dialog. The visualization layer includes roughly 11 chart types — Area, Bar, Combo, Line, Donut, Bar List, Category Bar, Progress Bar, Progress Circle, Spark Chart, and Tracker — all built on top of Recharts.

The library also comes with Blocks: over 300 pre-built templates that were open-sourced after the Vercel acquisition. These are useful starting points for common dashboard layouts, and they are now completely free.

Today, Tremor exists across two repositories. The original npm package (@tremor/react, v3.18.7, last updated January 2025) and a newer copy-paste repository modeled after shadcn/ui (last commit October 2025). The npm package still sees around 220K weekly downloads.

What is MetricUI?

MetricUI is a React component library built specifically for analytics dashboards. Where Tremor provides chart primitives and leaves dashboard orchestration to the developer, MetricUI ships the full stack: charts, KPI cards, data tables, filters, cross-filtering, drill-down, export, layout, theming, and AI-powered insights.

The library includes 44 components, 5 providers, and 15+ hooks. All 18 chart types are backed by Nivo, which means consistent rendering, animations, and accessibility across every visualization. The theming system ships 8 presets with runtime switching via a single provider prop.

MetricUI also ships an MCP server, which means AI coding assistants can generate complete, valid dashboards using the library without hallucinating props or inventing components. It is newer and has a smaller community than Tremor, but it is actively developed and purpose-built for the dashboard use case.

The Acquisition Factor

On January 22, 2025, Vercel announced the acquisition of Tremor. This was a validation of the project's design quality and community traction. The Tremor founders joined Vercel and now contribute to Vercel's product suite.

For users evaluating MetricUI vs Tremor, the acquisition introduces a practical question: what does the roadmap look like? Since January 2025, the npm package has not received a new release. The copy-paste repository saw its last commit in October 2025. Blocks were open-sourced, which is genuinely generous, but net-new feature development has slowed considerably.

This does not mean Tremor is abandoned. The code still works, the components are still well-built, and 220K weekly downloads show healthy adoption. But teams planning a multi-year investment in a dashboard framework should factor in the pace of development and whether the features they need in the future will arrive.

MetricUI is independently maintained and actively shipping. Version 1.0 shipped with AI insights, unified architecture, and 675 tests. That said, independent maintenance comes with its own risks — there is no corporate backing. The trade-off is pace versus institutional stability, and it is worth weighing both sides.

Dashboard Components

Both libraries ship visualization components, but they scope the problem differently. Tremor bundles general-purpose UI primitives alongside its charts. MetricUI focuses exclusively on the dashboard layer and assumes you are already using a UI library for buttons, inputs, and modals.

CategoryTremorMetricUI
Total components~45 (incl. UI primitives)31 + 5 providers + 15+ hooks
Chart components~1118
KPI / Metric cardsBasic card + BadgeKpiCard with sparklines, goals, conditions, comparisons
Data tablesTable componentDataTable + DataRow with sorting, pagination, search
Dashboard layoutNone (manual grid)MetricGrid auto-layout + Dashboard wrapper
Filter systemNoneFilterProvider, FilterBar, PeriodSelector, DropdownFilter, SegmentToggle, FilterTags
Templates / Blocks300+ free BlocksMCP-generated dashboards

Tremor's Blocks are a real strength — 300+ open-source templates give you a fast starting point. MetricUI trades templates for composable primitives that wire together automatically via context, plus an MCP server that lets AI assistants generate complete dashboards from a natural language prompt.

Chart Types

This is one of the biggest differences when comparing MetricUI vs Tremor. Tremor covers the essentials well. MetricUI covers those plus the specialized chart types that data teams actually need for production dashboards.

Chart TypeTremorMetricUI
AreaYesYes
BarYesYes
LineYesYes
Combo / Dual AxisYesYes
Donut / PieYesYes
Spark ChartYesYes
Progress BarYesYes
Progress CircleYesYes
Bar ListYesYes
Category BarYesNo
TrackerYesNo
FunnelNoYes
TreemapNoYes
SankeyNoYes
GaugeNoYes
Scatter / BubbleNoYes
HeatMapNoYes
WaterfallNoYes
BulletNoYes
RadarNoYes

Tremor's 11 chart types cover the most common dashboard scenarios. If your dashboard is primarily line charts, bar charts, and donuts, Tremor handles that well.

MetricUI's 18 chart types are all backed by Nivo, which gives you a consistent rendering engine, animation system, and accessibility layer across every chart. The specialized types — Funnel, Sankey, Treemap, HeatMap, Waterfall, Bullet, and Gauge — are the charts that data teams ask for once a dashboard moves past the prototype stage.

Theming & Customization

Tremor's theming story is Tailwind CSS. You style components using utility classes and your Tailwind config. This is natural if your entire app is Tailwind-based, and it gives you fine-grained control at the class level. There are no built-in theme presets, no ThemeProvider, and no runtime theme switching.

MetricUI takes a different approach with a centralized theming system. The MetricProvider accepts a theme prop that applies one of 8 built-in presets — indigo, emerald, rose, amber, cyan, violet, slate, or orange — or a fully custom theme object. Switching themes at runtime is a single prop change.

FeatureTremorMetricUI
Theming approachTailwind utility classesCSS variables via MetricProvider
Built-in presetsNone8 presets
Runtime switchingNoYes, single prop
Custom themesVia Tailwind configCustom ThemePreset object
Dark modeTailwind dark: modifierBuilt into each preset

Neither approach is wrong. Tailwind-based theming gives more granular control if you are already deep in the Tailwind ecosystem. MetricUI's provider-based system is faster to set up and makes it trivial to offer theme switching to end users, which is increasingly common in SaaS dashboards.

Interactivity

Interactivity is where the gap between MetricUI and Tremor becomes most pronounced. Tremor provides click handlers on chart elements and basic tooltip interactions. The developer is responsible for building any coordination between components — filtering, cross-highlighting, drill-down navigation.

MetricUI ships a full interactivity stack that wires together via React context:

  • Filter system — FilterProvider, FilterBar, PeriodSelector, DropdownFilter, SegmentToggle, and FilterTags, all connected via context. One filter change propagates to every subscribed component.
  • Cross-filtering — Click a bar segment or donut slice to set a filter signal that other charts and tables can respond to. Built on CrossFilterProvider with the useCrossFilter() and useCrossFilteredData() hooks.
  • Linked hover — Hover over a data point in one chart and see the corresponding point highlighted in every linked chart.
  • Value flash — Visual pulse animation when metric values change, so users notice updates in real time.
  • Drill-down — Up to 4 levels of drill-down navigation with breadcrumb trails, built into the component layer.
  • Export — PNG, CSV, and clipboard export for any chart or table.

None of these features exist in Tremor. You can build them yourself on top of Tremor's components, but that is weeks of custom development that MetricUI provides out of the box.

Developer Experience

Tremor's developer experience is one of its strengths. The API is clean, the components are well-documented, and the Tailwind integration means styling feels natural. The copy-paste model (via the newer repository) gives you full ownership of the source code, which some teams prefer for long-term maintenance.

MetricUI focuses on a different DX priority: minimizing the wiring code between components. A MetricProvider wraps the app, a MetricGrid handles layout, and filters, themes, and data states all flow through context. The trade-off is more convention and less manual control.

DX FeatureTremorMetricUI
TypeScriptFullFull
Installation modelnpm package + copy-pastenpm package
Chart engineRechartsNivo
Built-in data statesNoLoading, empty, error states
Test coverageYes175+ tests
AI-assisted generationNoMCP server
AI insightsNoDashboardInsight (bring-your-own-LLM)

The MCP server is worth highlighting. MetricUI ships a Model Context Protocol server that AI coding assistants (Cursor, Copilot, Claude) can use to generate valid dashboards without hallucinating component names or props. This is a meaningful DX advantage in 2026 where most new code starts with an AI prompt.

Comparison Table

A side-by-side summary of the key differences between MetricUI and Tremor.

FeatureTremorMetricUI
Chart types1118
Chart engineRechartsNivo
Theme presetsNone8 built-in + custom
Runtime theme switchingNoYes
Auto-layout gridNoMetricGrid
Filter systemNoFull (6 components + context)
Cross-filteringNoYes
Linked hoverNoYes
Drill-downNoYes (4 levels)
Export (PNG/CSV)NoYes
AI insightsNoDashboardInsight
MCP serverNoYes
Data statesNoLoading / empty / error
Dashboard wrapperNoYes
Templates300+ BlocksMCP generation
LicenseMIT / Apache 2.0MIT
npm downloads~220K/weekGrowing
Active developmentSlowed post-acquisitionActive

When to Choose Tremor

Tremor is still a good choice in specific scenarios:

  • You want a Tailwind-native approach where every component is styled with utility classes and integrates seamlessly with your existing Tailwind setup.
  • You need general-purpose UI componentsalongside your charts. Tremor's Button, Input, Dialog, and other primitives mean you may not need a separate UI library.
  • You want to own the source code via the copy-paste model. No dependency to upgrade, no breaking changes to worry about.
  • Your dashboard is simple— a few charts, a table, some KPIs — and does not need cross-filtering, drill-down, or coordinated interactivity.
  • You want to start from a template. Tremor's 300+ open-source Blocks give you a massive library of pre-built layouts.

When to Choose MetricUI

MetricUI is the stronger choice when your requirements go beyond basic charts:

  • You are building a production analytics dashboard that needs filtering, cross-filtering, drill-down, and export out of the box.
  • You need specialized chart types like Funnel, Sankey, Treemap, HeatMap, Waterfall, Gauge, or Bullet that Tremor does not offer.
  • You want runtime theme switchingwith built-in presets — especially useful for SaaS products where customers expect white-labeling or dark mode.
  • You want auto-layout that handles responsive grid placement without manual CSS grid configuration.
  • You are using AI coding tools and want an MCP server that generates valid, complete dashboards from natural language.
  • You want AI-powered insights embedded directly in the dashboard via a bring-your-own-LLM integration.
  • You need active, ongoing development with a clear public roadmap toward 1.0.

See It In Action

Same dataset. Tremor builds one chart. MetricUI builds a full dashboard. Download the CSV and try it yourself.

Round 1: Chart vs. Chart

Same data, same chart type. Apples to apples.

Tremor: 32 linesvsMetricUI: 30 lines
Tremor
Tremor — stacked area chart
import { AreaChart, Card, Title } from "@tremor/react";

const data = [
  { month: "Jan 2024", Enterprise: 38400, Startup: 28600, SMB: 17200 },
  { month: "Feb 2024", Enterprise: 40100, Startup: 29200, SMB: 18200 },
  { month: "Mar 2024", Enterprise: 42300, Startup: 30100, SMB: 19400 },
  { month: "Apr 2024", Enterprise: 40800, Startup: 29800, SMB: 18800 },
  { month: "May 2024", Enterprise: 43600, Startup: 30900, SMB: 19700 },
  { month: "Jun 2024", Enterprise: 45200, Startup: 32100, SMB: 20800 },
  { month: "Jul 2024", Enterprise: 44100, Startup: 31800, SMB: 20600 },
  { month: "Aug 2024", Enterprise: 46800, Startup: 33200, SMB: 21400 },
  { month: "Sep 2024", Enterprise: 49100, Startup: 34300, SMB: 22400 },
  { month: "Oct 2024", Enterprise: 50800, Startup: 35400, SMB: 23000 },
  { month: "Nov 2024", Enterprise: 52900, Startup: 36700, SMB: 23900 },
  { month: "Dec 2024", Enterprise: 59400, Startup: 41200, SMB: 26850 },
];

export default function RevenueChart() {
  return (
    <Card>
      <Title>Revenue by Segment</Title>
      <AreaChart
        data={data}
        index="month"
        categories={["Enterprise", "Startup", "SMB"]}
        colors={["indigo", "violet", "purple"]}
        valueFormatter={(v) => `$${(v / 1000).toFixed(1)}k`}
        stack
      />
    </Card>
  );
}

Revenue by Segment

MetricUI
MetricUI — stacked area chart
import { AreaChart } from "metricui";
import "metricui/styles.css";

const data = [
  { month: "Jan 2024", enterprise: 38400, startup: 28600, smb: 17200 },
  { month: "Feb 2024", enterprise: 40100, startup: 29200, smb: 18200 },
  { month: "Mar 2024", enterprise: 42300, startup: 30100, smb: 19400 },
  { month: "Apr 2024", enterprise: 40800, startup: 29800, smb: 18800 },
  { month: "May 2024", enterprise: 43600, startup: 30900, smb: 19700 },
  { month: "Jun 2024", enterprise: 45200, startup: 32100, smb: 20800 },
  { month: "Jul 2024", enterprise: 44100, startup: 31800, smb: 20600 },
  { month: "Aug 2024", enterprise: 46800, startup: 33200, smb: 21400 },
  { month: "Sep 2024", enterprise: 49100, startup: 34300, smb: 22400 },
  { month: "Oct 2024", enterprise: 50800, startup: 35400, smb: 23000 },
  { month: "Nov 2024", enterprise: 52900, startup: 36700, smb: 23900 },
  { month: "Dec 2024", enterprise: 59400, startup: 41200, smb: 26850 },
];

export default function RevenueChart() {
  return (
    <AreaChart
      data={data}
      index="month"
      categories={["enterprise", "startup", "smb"]}
      title="Revenue by Segment"
      format="currency"
      stacked
    />
  );
}

Round 2: Now keep going

With Tremor, you'd need to build everything below from scratch. With MetricUI, add 41 more lines and get KPI cards, drill-downs, export, and AI chat.

+41 lines → full production dashboard
MetricUI — full dashboard
import {
  Dashboard, DashboardInsight, SectionHeader,
  KpiCard, AreaChart, DonutChart, Waterfall, MetricGrid,
} from "metricui";
import "metricui/styles.css";
import { DollarSign, Users, TrendingDown, BarChart3 } from "lucide-react";

const data = [
  { month: "Jan 2024", revenue: 84200, users: 3120, churn: 4.2, conversions: 186, enterprise: 38400, startup: 28600, smb: 17200 },
  // ... 12 months from the same CSV
  { month: "Dec 2024", revenue: 127450, users: 5120, churn: 2.4, conversions: 342, enterprise: 59400, startup: 41200, smb: 26850 },
];

export default function SaasDashboard() {
  const latest = data[data.length - 1];
  const prev = data[data.length - 2];

  return (
    <Dashboard theme="indigo" exportable
      ai={{ analyze: myLLM, company: "Acme SaaS", context: "2024 metrics" }}>
      <SectionHeader title="Key Metrics"
        description="December 2024 vs November. Click any card to drill down." />
      <MetricGrid>
        <KpiCard title="Revenue" value={latest.revenue} format="currency"
          comparison={{ value: prev.revenue, label: "vs Nov" }}
          sparkline={{ data: data.map(d => d.revenue), type: "bar" }}
          icon={<DollarSign className="h-3.5 w-3.5" />}
          description="Monthly recurring revenue across all segments." drillDown />
        <KpiCard title="Active Users" value={latest.users} format="number"
          comparison={{ value: prev.users, label: "vs Nov" }}
          sparkline={{ data: data.map(d => d.users) }}
          icon={<Users className="h-3.5 w-3.5" />}
          description="Unique active users this month." drillDown />
        <KpiCard title="Churn Rate" value={latest.churn} format="percent"
          comparison={{ value: prev.churn, invertTrend: true, label: "vs Nov" }}
          sparkline={{ data: data.map(d => d.churn) }}
          icon={<TrendingDown className="h-3.5 w-3.5" />}
          description="Monthly churn rate. Lower is better."
          conditions={[{ when: "below", value: 3, color: "emerald" },
            { when: "between", min: 3, max: 4, color: "amber" },
            { when: "above", value: 4, color: "red" }]} drillDown />
        <KpiCard title="Conversions" value={latest.conversions} format="number"
          comparison={{ value: prev.conversions, label: "vs Nov" }}
          sparkline={{ data: data.map(d => d.conversions), type: "bar" }}
          icon={<BarChart3 className="h-3.5 w-3.5" />}
          description="New paid signups this month." drillDown />
      </MetricGrid>
      <SectionHeader title="Revenue Breakdown"
        description="Click any chart to drill down into the data." />
      <MetricGrid>
        <AreaChart data={data} index="month" categories={["enterprise", "startup", "smb"]}
          title="Revenue by Segment"
          subtitle="Stacked monthly revenue across Enterprise, Startup, and SMB"
          format="currency" stacked drillDown />
        <DonutChart data={[
          { id: "enterprise", label: "Enterprise", value: latest.enterprise },
          { id: "startup", label: "Startup", value: latest.startup },
          { id: "smb", label: "SMB", value: latest.smb },
        ]} title="Dec 2024 Mix" subtitle="Click a slice to drill into segment details"
          format="currency" drillDown />
      </MetricGrid>
      <Waterfall data={data.map((d, i) => ({
        label: d.month.split(" ")[0],
        value: i === 0 ? d.revenue : d.revenue - data[i - 1].revenue,
      }))} title="Month-over-Month Revenue Change"
        subtitle="Positive and negative swings with running totals"
        format="currency" drillDown />
      <DashboardInsight />
    </Dashboard>
  );
}

SaaS Metrics

12-month overview — click any element to drill down

Key Metrics

Revenue
$0
+12.3%vs Nov
Active Users
0
+9.2%vs Nov
Churn Rate
0%
-7.7%vs Nov
Conversions
0
+13.6%vs Nov

Revenue Breakdown

Try it: click any KPI or chart to drill down, hit export, or open the AI chat to ask questions about the data.

The Bottom Line

Tremor earned its place in the React ecosystem by proving that dashboard components could be beautiful, well-typed, and Tailwind-native. It raised the bar for what open-source dashboard libraries should look and feel like. That legacy is real and worth acknowledging.

But the dashboard landscape in 2026 demands more than chart primitives. Teams need coordinated interactivity, intelligent theming, auto-layout, export, and increasingly, AI integration. Tremor was not built for that scope, and its post-acquisition pace suggests those features are unlikely to arrive.

MetricUI was designed from the ground up to be a complete dashboard framework. It has fewer community miles than Tremor, but it ships more of what you actually need to build a production analytics experience. The chart coverage is broader, the interactivity is deeper, the theming is more flexible, and the AI story is already here.

If you are starting a new dashboard project in 2026 and comparing MetricUI vs Tremor, the question is not which library has better individual components — both are well-crafted. The question is whether you want to build the dashboard wiring yourself or use a framework that already has it. MetricUI is that framework.