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.
| Category | Tremor | MetricUI |
|---|---|---|
| Total components | ~45 (incl. UI primitives) | 31 + 5 providers + 15+ hooks |
| Chart components | ~11 | 18 |
| KPI / Metric cards | Basic card + Badge | KpiCard with sparklines, goals, conditions, comparisons |
| Data tables | Table component | DataTable + DataRow with sorting, pagination, search |
| Dashboard layout | None (manual grid) | MetricGrid auto-layout + Dashboard wrapper |
| Filter system | None | FilterProvider, FilterBar, PeriodSelector, DropdownFilter, SegmentToggle, FilterTags |
| Templates / Blocks | 300+ free Blocks | MCP-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 Type | Tremor | MetricUI |
|---|---|---|
| Area | Yes | Yes |
| Bar | Yes | Yes |
| Line | Yes | Yes |
| Combo / Dual Axis | Yes | Yes |
| Donut / Pie | Yes | Yes |
| Spark Chart | Yes | Yes |
| Progress Bar | Yes | Yes |
| Progress Circle | Yes | Yes |
| Bar List | Yes | Yes |
| Category Bar | Yes | No |
| Tracker | Yes | No |
| Funnel | No | Yes |
| Treemap | No | Yes |
| Sankey | No | Yes |
| Gauge | No | Yes |
| Scatter / Bubble | No | Yes |
| HeatMap | No | Yes |
| Waterfall | No | Yes |
| Bullet | No | Yes |
| Radar | No | Yes |
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.
| Feature | Tremor | MetricUI |
|---|---|---|
| Theming approach | Tailwind utility classes | CSS variables via MetricProvider |
| Built-in presets | None | 8 presets |
| Runtime switching | No | Yes, single prop |
| Custom themes | Via Tailwind config | Custom ThemePreset object |
| Dark mode | Tailwind dark: modifier | Built 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()anduseCrossFilteredData()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 Feature | Tremor | MetricUI |
|---|---|---|
| TypeScript | Full | Full |
| Installation model | npm package + copy-paste | npm package |
| Chart engine | Recharts | Nivo |
| Built-in data states | No | Loading, empty, error states |
| Test coverage | Yes | 175+ tests |
| AI-assisted generation | No | MCP server |
| AI insights | No | DashboardInsight (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.
| Feature | Tremor | MetricUI |
|---|---|---|
| Chart types | 11 | 18 |
| Chart engine | Recharts | Nivo |
| Theme presets | None | 8 built-in + custom |
| Runtime theme switching | No | Yes |
| Auto-layout grid | No | MetricGrid |
| Filter system | No | Full (6 components + context) |
| Cross-filtering | No | Yes |
| Linked hover | No | Yes |
| Drill-down | No | Yes (4 levels) |
| Export (PNG/CSV) | No | Yes |
| AI insights | No | DashboardInsight |
| MCP server | No | Yes |
| Data states | No | Loading / empty / error |
| Dashboard wrapper | No | Yes |
| Templates | 300+ Blocks | MCP generation |
| License | MIT / Apache 2.0 | MIT |
| npm downloads | ~220K/week | Growing |
| Active development | Slowed post-acquisition | Active |
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.
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
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.
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 Breakdown
Stacked monthly revenue across Enterprise, Startup, and SMB
Click a slice to drill into segment details
Positive and negative swings with running totals
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.