TanStack
TanStack

Table

A powerful engine for building Data Grids.

TanStack Table is a headless engine for sorting, pagination, filtering, faceting, grouping, aggregation, row expansion, row and cell selection, cell spanning, row and column pinning, column ordering, visibility, resizing, and more.

Docs
issue workbench
8 rows · 0 selected
Router docsactive98
Query cachereview94
Table filtersshipped91
Virtual listsactive88
page 1 / 2

Headless by design

Build exactly the table you want with 100% control.

Having 100% control of your code matters more than ever. TanStack Table supplies state and typed APIs without prescribing a single element or style. Use its built-in client-side processing or bring rows processed by your server, then render with any component library or design system, including your own.

headless ownership

TanStack Table handles

Headless table logic

State
Row processing
Typed APIs

You control

100% of the rendered result

Markup & semantics
Styles & components
Events & interactions

Works with your stack

Use any component library or design system, including your own.

headless logic → your UI

Fine-grained state

Put each update on the smallest useful render path.

Every registered state slice is backed by TanStack Store, whose fine-grained reactivity is built on alien-signals. Read selected state from table.state, create local subscription islands with table.Subscribe, or hand ownership to an external writable atom when the rest of the app needs it.

sorting reactivity
<table.Subscribe selector={(state) => state.sorting}>

Move a reactive read to the smallest part of the tree that renders it.

sorting atom→subscription island→UI

Performance architecture

Deliberate bundles, allocations, and row processing.

Every feature is independently tree-shakable, and table objects share feature methods in memory. Client-side row-model stages memoize derived work. When processing moves to the server, manual modes bypass those stages and consume the rows you provide.

client-side row-model pipeline

01

Core

automatic

data to rows

02

Filter

createFilteredRowModel()

column + global

03

Group

createGroupedRowModel()

grouped rows

04

Sort

createSortedRowModel()

ordered rows

05

Expand

createExpandedRowModel()

visible sub-rows

06

Paginate

createPaginatedRowModel()

current page

Each registered stage memoizes its derived work. Unregistered or manual stages pass the previous row model through.

Composition and tooling

Build one table or build your product's table system.

TanStack Table exposes its own architecture as a public toolkit. Extend it with typed features, package shared conventions into reusable table hooks and options, and inspect live instances with dedicated Devtools.

Custom features

tableFeatures({ densityFeature })

Add state, options, and APIs through the same extension system used by built-in features.

Reusable tables

createTableHook({ features, ... })

Share typed features, options, column helpers, and registered components across a product.

Devtools

useTanStackTableDevtools(table)

Inspect table state and derived data in supported framework integrations instead of logging internals.

Partners

Gold
Cloudflare
Railway
Netlify
CodeRabbit
Lovable
Silver
Clerk
SerpApi
OpenRouter
AG Grid
WorkOS
Bronze
Unkey
Prisma
Sentry
Electric
OSS Sponsors

Sponsors get special perks like private discord channels, priority issue requests, and direct support!