Decision. Three libraries are live enough to bet on: TanStack Table ⭐ 28k when your design system is authoritative and your table is a table; AG Grid ⭐ 15k when you need row grouping, pivot, Excel export or a server-side row model and would rather buy them than spend 25–50 dev-days building them [17]; MUI X Data Grid ⭐ 5.8k only if you have already adopted MUI. Everything else has aged out.
The shortlist is shorter than the marketing suggests. The comfortable assumption that this is an eight-way race does not survive contact with the registries. Glide Data Grid’s last stable release is 6.0.3 from February 2024 [3]; Mantine React Table’s v2 line has sat in beta since February 2025 with a stable branch still pinned to Mantine 6 [4] ⭐ 1.1k; react-data-grid ⭐ 7.7k has no stable v7 and its beta drops React 18 entirely [5]; Handsontable ⭐ 22k is not open source at all, and its free tier is a non-commercial licence that bars production use in anything connected to commercial activity [6]. Even the presumed-safe default is in motion: TanStack Table’s stable latest is still 8.21.3 from April 2025 [1], with v9 in beta since June 2026 [2] — so “adopt TanStack Table” today means adopting a frozen v8 or an unfinished v9.
Every angle converged on the same axis, and the paywall sits on it. The split is not headless-vs-batteries or free-vs-paid; it is what the grid owns versus what you own. Grouping, pivoting, aggregation, Excel export and the Server-Side Row Model are precisely the features AG Grid gates behind Enterprise [8] and MUI gates behind Premium [9]. The most telling evidence is that TanStack’s own docs point you at AG Grid when you need grouping, pivoting or a server-side row model [7] — the headless camp concedes the ceiling rather than contesting it. Choosing headless is choosing to own a state machine, and it bites in unglamorous ways: with manualPagination plus manualFiltering, pageIndex is not reset when filters change, so a user sitting on page 1000 silently gets an empty result set [21] ⭐ 28k.
The usual reason people buy a grid turns out to be the wrong one. Row count is nearly never the constraint: every virtualized grid renders roughly 40 rows regardless of dataset size [10]. What actually breaks is update frequency — MUI X users report the grid degrading to unusable at ~10 updates/second on a 400-row window [13] ⭐ 5.8k, while AG Grid batches streaming updates outside React entirely [14]. And there is a ceiling no vendor escapes: browsers cap scroll-container height at 33.5M px (17.5M in Firefox) [11], which hard-limits any natively-scrolling grid — canvas included — to roughly 500k–900k rows. A headless virtualizer does not save you; TanStack Virtual ⭐ 7.0k has the same open issue [12]. Treat “millions of rows” claims as marketing unless the grid has replaced native scrolling. ⚠ The published benchmarks are all vendor-authored and mutually contradictory — LyteNyte’s numbers and RevoGrid’s disagree about whether AG Grid handles 100k rows comfortably or crashes the tab [15] [16] — so benchmark against your own data before believing any of them.
Buying is not only a money decision. The licence is the cheap part: AG Grid Enterprise is $999/dev perpetual [17], MUI X Pro $299/dev/yr [18]. The expensive part is that a grid with opinions drags its CSS in with it. AG Grid at least plumbs your design tokens through --ag-* custom properties, while warning that class-level overrides are fragile because its DOM changes each release [19]; MUI X is not a component adoption but a design-system adoption, complete with Tailwind v4 cascade-layer fights [20] ⭐ 96k. So the buy decision propagates into your styling layer for years, which is exactly where it is hardest to reverse.
The sharpest open question this run did not answer: accessibility. It was offered as an angle and left unticked, yet it is where the canvas-rendered options quietly fail — Glide’s own repository concedes its a11y story is unverified [22] ⭐ 5.3k. If your table is going anywhere near a procurement checklist or a WCAG audit, that gap is the next thing to close — and it may quietly eliminate an option this framework otherwise keeps on the table.