Infinite Table vs TanStack Table
TanStack Table gives you table logic and leaves the UI to you. Infinite Table is a finished grid: virtualized, keyboard-navigable and themed, configured with props.
Facts last verified on November 11, 2026, with a source link for each one.
TanStack Table is a headless library. It computes sorting, filtering, grouping, selection and pagination, and you write every element, style, event handler and ARIA attribute. That is ideal for a table in your own design system, or a small table that must match your markup exactly. It is MIT-licensed, tiny, and has adapters for most frameworks.
Infinite Table ships the whole grid. Row and column virtualization, column resizing, reordering, pinning and menus, grouping, pivoting, editing, keyboard navigation and context menus work as soon as you render it. Building the same on top of TanStack Table and TanStack Virtual is a substantial project, and that code is then yours to maintain.
The trade-off: TanStack Table is free with no footer and gives total control. Infinite Table is free with a footer, or $395 per developer per year without it, and gives you the finished grid.
When to choose which
Choose TanStack Table if
- You need full control over the markup, for example for a table component in your design system.
- Your tables are small and simple, and a few kilobytes of logic is all you want to add.
- You want an MIT license, with no footer and no license key.
- You use Svelte, Solid, Angular, Lit or another framework Infinite Table doesn't support.
- You've already built a mature grid UI on top of it.
Choose Infinite Table if
- You want to ship a data grid, not build one: virtualization, resizing, pinning, menus and keyboard navigation are built in.
- You need pivoting, which TanStack Table doesn't have, or lazy loading from a server.
- You need cell editing or a context menu without writing them yourself.
- You still want a declarative API, with columns, sorting, grouping and selection as controlled or uncontrolled props.
Features
22 of the 30 features below are built into Infinite Table, every one in the free package. TanStack Table has 0 built in, and 18 more partly or as headless logic, counting its most complete edition (TanStack Table). Each TanStack Table entry links to its documentation.
- Built in
- Partial / with limits
- Logic only (headless)
- Not available
- Pro = needs that paid edition
| Feature | Infinite TableFree with footer · $395 per developer per year | TanStack TableMIT · Free |
|---|---|---|
| Rendering | ||
| Row virtualizationOnly the visible rows are rendered, out of the box. | Yessource | |
| Column virtualizationOnly the visible columns are rendered, out of the box. | Yessource | |
| Columns | ||
| Multi-column sortingBuilt-in sorting UI, including sorting by several columns. | Yessource | Logic onlysource |
| Column filtersBuilt-in filter UI: a filter row, header filters or a filter menu. | ||
| Column resizingUsers drag to resize columns. | Yessource | Logic onlysource |
| Column reorderingUsers drag and drop columns to reorder them. | Yessource | |
| Column pinningPin (freeze) columns to the left or right. | Yessource | Logic onlysource |
| Column groupsMulti-level, grouped column headers. | Yessource | Logic onlysource |
| Column menuA built-in column header menu (sort, hide, pin...). | Yessource | No |
| Grouping and analysis | ||
| Row groupingGroup rows by one or more columns, with expand and collapse. | Yessource | Logic onlysource |
| AggregationsAggregated values (sum, average...) for groups or totals. | Yessource | Logic onlysource |
| PivotingPivot rows into dynamically generated columns. | Yessource | No |
| Tree dataHierarchical (tree) rows. | Yessource | |
| Master-detailExpandable detail rows with custom content or a nested grid. | Yessource | |
| Server data | ||
| Lazy loadingLoad rows from a server in batches as the user scrolls. | Yessource | NoNot built in; the official example builds it with TanStack Virtual and your own data fetching.source |
| Server-side sort, filter and groupBuilt-in support for sorting, filtering and grouping on the server. | ||
| Pagination UIA built-in pager. | Logic onlysource | |
| Editing and interaction | ||
| Cell editingInline cell editing with built-in editors. | Yessource | NoNo editing feature: editable cells are application code. |
| Row selectionSelect rows, including checkbox selection. | Yessource | Logic onlysource |
| Cell selectionSelect multiple cells or ranges of cells. | Yessource | |
| Keyboard navigationMove between cells with the keyboard. | Yessource | |
| Context menuA built-in cell or row context menu. | Yessource | No |
| Row drag and dropReorder rows by dragging them. | No | |
| Export and charts | ||
| ClipboardCopy (and paste) cells, built in. | No | NoSelected cell values are available through the API; copying is yours to build. |
| CSV exportBuilt-in export to CSV. | No | No |
| Excel exportBuilt-in export to Excel (.xlsx). | No | No |
| Integrated chartsChart grid data from inside the grid. | No | |
| Styling and accessibility | ||
| Theming with CSS variablesTheme the grid through CSS custom properties or design tokens. | Yessource | NoShips no styles: you style it with your own CSS or design system. |
| Documented accessibilityARIA roles and screen reader support, documented by the vendor. | NoKeyboard navigation is built in, but ARIA roles and screen reader support are not documented. | NoNo accessibility guide: you render the markup, so the ARIA roles are yours too. |
| Right-to-leftRight-to-left layout support. | No | Logic onlyLogical start/end pinning and an RTL resize mode; you set the direction on your markup.source |
Side by side
Licensing and pricing
List prices as published by each vendor, in US dollars. Follow the source links for the full terms.
| Edition | License | List price | Conditions | Deployment |
|---|---|---|---|---|
| Infinite Table | Commercial (EULA) | $395 per developer per yearVolume discounts: 5% from 3 developers, 10% from 5, 15% from 10. For 20 or more developers, email us.source | Every feature is free to use, in any product, as long as the "Powered by Infinite Table" footer stays visible. A license removes the footer and adds email support. | Development licenses only: no deployment, application or SaaS licenses. |
| TanStack Table | MIT | Freesource | MIT: free for any use, no license key. | None (MIT). |
Bundle size and dependencies
Every dependency is code you ship and a package you have to trust and keep updated. Infinite Table has none.
| Package | JS, min + gzip | CSS, min + gzip | Runtime dependencies | From other publishers |
|---|---|---|---|---|
| Infinite Table for React@infinite-table/infinite-react@10.1.4 | 145 kB | 5.7 kB | 0 | 0 |
| Infinite Table for Vue@infinite-table/infinite-vue@10.1.4 | 126 kB | 5.4 kB | 0 | 0 |
| TanStack Table@tanstack/react-table@9.3.1 | 9.9 kB | – | 4list@tanstack/react-store@0.11.2, @tanstack/store@0.11.2, @tanstack/table-core@9.3.1, use-sync-external-store@1.7.0 | 1 |
| TanStack Table + TanStack Virtual@tanstack/react-table@9.3.1 + @tanstack/react-virtual@3.14.26 | 20.2 kB | – | 5list@tanstack/react-store@0.11.2, @tanstack/store@0.11.2, @tanstack/table-core@9.3.1, @tanstack/virtual-core@3.19.11, use-sync-external-store@1.7.0 | 1 |
Measured on November 11, 2026 with the latest versions on npm. Runtime dependencies: every package that npm install adds besides the grid's own packages and the framework, including required peer dependencies. JS / CSS: esbuild 0.25.10 bundle of the minimal getting-started usage, minified, React or Vue left out, gzip level 9 (kB = 1,000 bytes). Fonts and images are not counted. Numbers include required peers such as a design system, so they are lower if your app already ships those. The measurement script is open source: run it to reproduce or update these numbers.
Framework support
| Framework | Infinite Tablesource | TanStack Tablesource |
|---|---|---|
| React | Yes | Yes |
| Vue | Yes | Yes |
| Angular | No | Yes |
| Svelte | No | Yes |
| Solid | No | Yes |
| Preact | No | Yes |
| Lit | No | Yes |
| Ember | No | Yes |
| Alpine | No | Yes |
| JavaScript | No | Yes |
- Infinite Table: React 18+ (@infinite-table/infinite-react) and Vue 3.4+ (@infinite-table/infinite-vue), same features and version.
- TanStack Table: Official adapters for React, Preact, Octane, Vue, Solid, Svelte, Angular, Ember, Lit and Alpine, plus vanilla JavaScript through @tanstack/table-core. Svelte 3 and 4 need v8.
Key differences
Headless vs complete
With TanStack Table you render the <table> (or divs) yourself, call FlexRender for each header and cell, and style everything. Its v9 API makes every feature opt-in, so you only bundle the logic you use.
With Infinite Table you pass columns and data, and get a virtualized, themed grid. You still customize cells, headers, editors and filters with your own components.
What you build yourself on TanStack Table
Virtualization (usually with TanStack Virtual), sort indicators, filter inputs, column resize handles, drag and drop for columns and rows, group expand and collapse, pinned-column layout, keyboard navigation, focus management, ARIA roles, editing and context menus.
None of these are hard on their own. Together they are most of the work in a data grid, and Infinite Table includes them.
Migrating from TanStack Table
A sortable table in TanStack Table v9 next to the same grid in Infinite Table. The TanStack version still has no virtualization, resizing or styling; the Infinite Table version has all three.
TanStack Table v9
import {
createSortedRowModel,
rowSortingFeature,
sortFns,
tableFeatures,
useTable,
} from '@tanstack/react-table';
import type { ColumnDef } from '@tanstack/react-table';
type Car = { id: number; make: string; model: string; price: number };
const data: Car[] = [
{ id: 1, make: 'Tesla', model: 'Model Y', price: 64950 },
{ id: 2, make: 'Ford', model: 'F-Series', price: 33850 },
];
const features = tableFeatures({
rowSortingFeature,
sortedRowModel: createSortedRowModel(),
sortFns,
});
const columns: ColumnDef<typeof features, Car>[] = [
{ accessorKey: 'make', header: 'Make' },
{ accessorKey: 'model', header: 'Model' },
{
accessorKey: 'price',
header: 'Price',
cell: (info) => <b>{info.getValue<number>()}</b>,
},
];
export function Cars() {
const table = useTable({
features,
columns,
data,
getRowId: (row) => String(row.id),
initialState: { sorting: [{ id: 'make', desc: false }] },
});
return (
<table>
<thead>
{table.getHeaderGroups().map((headerGroup) => (
<tr key={headerGroup.id}>
{headerGroup.headers.map((header) => (
<th
key={header.id}
onClick={header.column.getToggleSortingHandler()}
>
<table.FlexRender header={header} />
</th>
))}
</tr>
))}
</thead>
<tbody>
{table.getRowModel().rows.map((row) => (
<tr key={row.id}>
{row.getAllCells().map((cell) => (
<td key={cell.id}>
<table.FlexRender cell={cell} />
</td>
))}
</tr>
))}
</tbody>
</table>
);
}Infinite Table
import { DataSource, InfiniteTable } from '@infinite-table/infinite-react';
import type { InfiniteTablePropColumns } from '@infinite-table/infinite-react';
import '@infinite-table/infinite-react/index.css';
type Car = { id: number; make: string; model: string; price: number };
const data: Car[] = [
{ id: 1, make: 'Tesla', model: 'Model Y', price: 64950 },
{ id: 2, make: 'Ford', model: 'F-Series', price: 33850 },
];
const columns: InfiniteTablePropColumns<Car> = {
make: { field: 'make', header: 'Make' },
model: { field: 'model', header: 'Model', defaultWidth: 200 },
price: {
field: 'price',
header: 'Price',
renderValue: ({ value }) => <b>{value}</b>,
},
};
export function Cars() {
return (
<div style={{ height: 500, display: 'flex' }}>
<DataSource<Car>
primaryKey="id"
data={data}
defaultSortInfo={{ field: 'make', dir: 1 }}
>
<InfiniteTable<Car> columns={columns} />
</DataSource>
</div>
| TanStack Table | Infinite Table |
|---|---|
columns with accessorKey | columns (an object keyed by column id) with field |
header | header |
cell | renderValue or render |
size (column sizing feature) | defaultWidth, defaultFlex, or the columnSizing prop |
getRowId | primaryKey on <DataSource> |
initialState.sorting, state.sorting | defaultSortInfo, sortInfo on <DataSource> |
grouping state, grouped row model | defaultGroupBy, groupBy on <DataSource> |
getSubRows, expanded row model | <TreeDataSource> and <TreeGrid> |
manualSorting, manualFiltering... | a data function on <DataSource> (server-side) |
| TanStack Virtual | built in |
What TanStack Table does well
- Headless: it brings no markup or styles, so the table can match any design system exactly. source
- One core with official adapters for React, Vue, Solid, Svelte, Angular and more. source
- MIT, one free edition, no license keys and no deployment fees. source
- Broad logic coverage: sorting, filtering, faceting, grouping, aggregation, expansion, row and cell selection, pagination. source
- A tiny core: in v9 you register only the features you use. source
- Server-side processing is first-class, with a manual mode for each feature. source
TanStack offers paid enterprise support and workshops; prices are on request. source
FAQ
Is TanStack Table a data grid?
Not by itself. TanStack Table is a headless table library: it provides state and logic, not markup or styles. You build the grid UI on top of it, often with TanStack Virtual for virtualization.
Does TanStack Table support pivoting?
No pivoting feature is documented for TanStack Table v9. It has grouping and aggregation logic. Infinite Table has pivoting built in, on the client or the server.
Is TanStack Table smaller than Infinite Table?
Yes, much smaller, because it ships no UI. The comparison that matters for a data grid is TanStack Table plus TanStack Virtual plus everything you build on top, against a complete grid.
Can I use Infinite Table with Tailwind or shadcn/ui?
Yes. Infinite Table is themed with CSS variables and ships several themes, including one styled after shadcn/ui.
Which TanStack Table version does this page compare?
TanStack Table v9, the current stable major when we last checked. v9 changed the API: useTable with opt-in tableFeatures replaces the useReactTable hook of v8.
Is Infinite Table free to use?
Yes. Every feature is free to use, in any product and in production, as long as the "Powered by Infinite Table" footer stays visible. A license removes the footer and adds email support: $395 per developer per year, with volume discounts and no deployment or application licenses. See pricing.
How many dependencies does TanStack Table have, compared to Infinite Table?
Infinite Table has 0 runtime dependencies: installing it adds one package. TanStack Table adds 4 (1 from other publishers); TanStack Table + TanStack Virtual adds 5 (1 from other publishers), counting required peer dependencies but not React. Measured on November 11, 2026 with the latest versions on npm.
How big is TanStack Table compared to Infinite Table?
Bundling the minimal getting-started usage with esbuild, minified and gzipped, without React: Infinite Table 145 kB of JavaScript, TanStack Table 9.9 kB, TanStack Table + TanStack Virtual 20.2 kB. CSS is measured separately; the table above has both.
Try Infinite Table
npm i @infinite-table/infinite-react for React, or npm i @infinite-table/infinite-vue for Vue. Every feature is in the package.
Other comparisons
Sources
Sources and corrections
Every statement about another product links to the vendor's own documentation, pricing or license page. TanStack Table facts were last verified on November 11, 2026. Prices are list prices as published; taxes, discounts and quotes can differ. Products change quickly, so please check the vendor's site before you buy.
Spotted something wrong or out of date? We'll fix it: open a correction issue, edit the data on GitHub or email us.
Official links for TanStack Table: website, docs, license, repository.