Skip to content

Commit 3f3ee13

Browse files
committed
feat: tanstack table v9 blog post
1 parent 9309d88 commit 3f3ee13

5 files changed

Lines changed: 91 additions & 12 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
"@tanstack/react-router-ssr-query": "1.167.1",
7878
"@tanstack/react-start": "1.168.26",
7979
"@tanstack/react-start-client": "1.168.14",
80-
"@tanstack/react-table": "9.0.0-beta.80",
80+
"@tanstack/react-table": "9.0.0",
8181
"@tanstack/workflow-core": "0.0.4",
8282
"@tanstack/workflow-runtime": "0.0.3",
8383
"@tanstack/workflow-store-drizzle-postgres": "0.0.5",

pnpm-lock.yaml

Lines changed: 9 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pnpm-workspace.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ packages:
22
- .
33

44
minimumReleaseAgeExclude:
5-
- '@tanstack/react-table@9.0.0-beta.80'
6-
- '@tanstack/table-core@9.0.0-beta.80'
5+
- '@tanstack/react-table@9.0.0'
6+
- '@tanstack/table-core@9.0.0'
77

88
overrides:
99
cross-spawn: '>=6.0.6'
1.56 MB
Loading
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
---
2+
title: 'Announcing TanStack Table V9'
3+
published: 2026-08-04
4+
draft: true
5+
excerpt: TanStack Table V9 is here with a tree-shakable feature architecture, fine-grained reactivity, improved performance, and first-class support for more frameworks.
6+
library: table
7+
authors:
8+
- Kevin Van Cott
9+
---
10+
11+
![A wooden table on a beach at sunset](/blog-assets/announcing-tanstack-table-v9/header.png)
12+
13+
After 2+ years of work, TanStack Table V9 is finally here and stable. It has turned out to be quite the major release, with not only a new internal architecture, but lots of new feature, improvements, and fixes.
14+
15+
Back when we [announced the beta](/blog/tanstack-table-v9-taking-form), we said that most of the development done at that point was mainly focused on refactoring the internal architecture to support the new tree-shakable plugin system and the new state management system built on top of TanStack Store. But it turns out that this new architecture was flexible enough to allow us to grow the library quickly during the beta. So here's the new and much more fuller list of all improvements that TanStack Table V9 has to offer.
16+
17+
## What's New in TanStack Table V9
18+
19+
TanStack Table V9 is a major release, but the table logic and headless rendering model you already know are still here. Most of the changes are in the architecture underneath that model and in the new capabilities it makes possible. The main improvements fall into seven areas.
20+
21+
### 1. Record Number of Framework Adapters Supported
22+
23+
Every framework adapter's reactivity system was completely overhauled in V9. With table state now built on TanStack Store, each adapter can connect the framework-agnostic core to its framework's native reactive model instead of adapting assumptions inherited from React. This is especially significant for signal-based frameworks as table atoms now connect much more directly to signals, refs, runes, and tracked values, making those adapters more performant overall and bringing them much closer to true signal-based rendering. TanStack Table V9 now ships ten dedicated framework adapters, plus the framework-agnostic `@tanstack/table-core`. Read [Inside TanStack Table V9 Reactivity](/blog/tanstack-table-v9-reactivity) for a deeper look at how this new system works.
24+
25+
- [React Table](/table/latest/docs/framework/react/quick-start) supports React 18 and newer, works correctly under the React Compiler, and offers fine-grained reads through atoms, selectors, and `table.Subscribe`.
26+
- [Preact Table](/table/latest/docs/framework/preact/quick-start) supports Preact 10 and newer with the same TanStack Store-backed atoms and fine-grained subscription model.
27+
- [Vue Table](/table/latest/docs/framework/vue/quick-start) supports Vue 3.2 and newer, bridging table atoms to Vue refs and computed values while unwrapping reactive options such as `data`.
28+
- [Solid Table](/table/latest/docs/framework/solid/quick-start) supports Solid 1.3 through the latest Solid 1.x releases, with table atom reads participating directly in Solid tracking inside JSX, memos, effects, and `table.Subscribe`. Solid 2 is not supported yet, but support is planned for TanStack Table V10 in the near future.
29+
- [Svelte Table](/table/latest/docs/framework/svelte/quick-start) is built specifically for Svelte 5 and newer, with runes, Svelte-aware atom bindings, and native `$derived` projections.
30+
- [Angular Table](/table/latest/docs/framework/angular/quick-start) supports Angular 19 and newer, bridging table atoms into Angular signals and `computed()` derivations.
31+
- [Lit Table](/table/latest/docs/framework/lit/quick-start) supports Lit 3.1 and newer through a `TableController` reactive controller that can narrow host updates with selectors.
32+
- [Alpine Table](/table/latest/docs/framework/alpine/quick-start) supports Alpine 3, automatically bridging TanStack Store updates into bindings that read table state and APIs.
33+
- [Ember Table](/table/latest/docs/framework/ember/quick-start) supports Ember 5.8 and newer as a v2 addon, with Glimmer tracking, `.gts` and `.gjs` template tags, Glint, and Embroider support.
34+
- [Octane Table](/table/latest/docs/framework/octane/quick-start) supports Octane 0.1 with TanStack Store-backed reactivity, `.tsrx` components, keyed rendering, and adapter-native subscription helpers.
35+
36+
### 2. Better Performance
37+
38+
Table V9 uses shared prototypes for row, column, cell, and header APIs instead of recreating the same methods for every object instance. That change can produce [dramatically lower memory usage at large scales](/blog/tanstack-table-v9-memory-performance). In our latest benchmark report, V9 used up to 86% less retained JavaScript heap than V8, reducing the one-million-row, eight-column paginated cases from about 2.71 GB to about 380 MB. We also revisited the full client-side processing pipeline with better algorithms, more deliberate memoization, fewer unnecessary allocations, and faster paths for sorting, filtering, grouping, aggregation, expansion, selection, faceting, and column resizing. These improvements make client-side tables faster while allowing them to process substantially more data before memory becomes the limiting factor.
39+
40+
Our latest benchmark suite compares equivalent V8 and V9 client-side row-model operations over the same deterministic data. The summary below covers comparable runs at 20,000 rows and above, where durations are large enough to measure reliably. V9 reduced average processing time by 79% for the core row model, 52% for grouping and aggregation, 37% for sorting, and 34% for filtering. Across the measured categories, the total time spent processing rows improved by roughly 1.5x to 3.9x.
41+
42+
| Category | n | Avg improvement | Median | Min | Max | Total-time speedup |
43+
| ------------------------ | --- | --------------- | ------ | --- | --- | ----------------------------- |
44+
| **Core row model** | 3 | **79%** | 80% | 73% | 85% | 3.9x |
45+
| **Grouping/aggregation** | 27 | **52%** | 52% | 29% | 84% | 1.7x |
46+
| **Sorting** | 36 | **37%** | 37% | 5% | 60% | 1.6x |
47+
| **Filtering** | 23 | **34%** | 35% | 7% | 52% | 1.5x |
48+
| Expanding | 2 | 74% || 72% | 76% | 3.7x |
49+
| Faceting | 9 | 44% | 36% | 15% | 77% | 1.7x |
50+
| Selection | 5 | 43% | 46% | 18% | 52% | 1.6x |
51+
| Pagination | 0 ||||| both versions < 5ms (instant) |
52+
53+
We'll should have a full writeup on the performance improvements soon, but that blog post is taking a lot longer to write than expected.
54+
55+
### 3. State Management Overhaul
56+
57+
Table state is now backed by [TanStack Store](/store/latest), whose fine-grained reactivity is built on the `alien-signals` architecture. Each framework adapter connects that state to its own reactive model, so components can subscribe to only the slices they use through table atoms, selectors, or framework-specific subscription helpers. You can still control state with the familiar `state` and `on[State]Change` options, or hand individual slices to external writable atoms when your table needs to share ownership with the rest of your application. We covered the design and its rendering benefits in more detail in [Inside TanStack Table V9 Reactivity](/blog/tanstack-table-v9-reactivity).
58+
59+
### 4. Type-Safety Improvements
60+
61+
V9 adds and revamps type helpers for columns, custom filter, sort, and aggregation functions, table options, shared components, and metadata. Table, column, and filter metadata can now be typed per table instead of requiring global declaration merging. The type system also understands which features a table has registered, so feature APIs only exist when they are actually available and feature prerequisites can be validated before runtime. We put substantial work into keeping that more capable type system fast, which we documented in [TypeScript Performance in TanStack Table V9](/blog/tanstack-table-v9-typescript-performance).
62+
63+
### 5. Tree Shaking and Extensibility
64+
65+
Features are explicit, modular, and tree-shakeable in V9. A table that only registers sorting does not also need to ship filtering, pagination, grouping, or the rest of the built-in feature set. Row model factories and registered filter, sort, and aggregation functions are defined alongside features with `tableFeatures()`, allowing unused processing code to be removed too. Custom features now use this same system, giving your own plugins the same typed access to state, options, defaults, and APIs as the features maintained in Table core.
66+
67+
### 6. Composability
68+
69+
The new architecture makes it easier to move from configuring one table to building a consistent table system for an entire product. `tableOptions()` lets you compose reusable features, row models, functions, defaults, and other configuration while preserving inference. `createTableHook()` can take that composition further by creating an app-specific table hook or factory with features and component conventions already bound. Individual tables can stay concise without giving up the ability to customize what makes each one unique.
70+
71+
### 7. New and Refreshed Features
72+
73+
V9 introduces [Cell Selection](/table/latest/docs/framework/react/guide/cell-selection), including rectangular ranges, drag selection, Shift extension, and multiple disjoint ranges. It also adds [Cell Spanning](/table/latest/docs/framework/react/guide/cell-spanning) across rows and columns, span-aware cell selection, and computed header row spans for complex header layouts. Existing features received meaningful upgrades as well: columns can define multiple aggregations, row selection supports Shift range selection, and column resizing has been expanded and optimized. New table and row APIs such as `table.getMaxSubRowDepth()` and `row.getDisplayIndex()` round out the refreshed feature set.
74+
75+
## Where Does TanStack Table Go From Here?
76+
77+
TanStack Table V9 is a foundational release. More than any one feature, its most important contribution is the new foundation it gives us for everything that comes next. The tree-shakable plugin architecture lets features grow without adding all of that code or API surface to every table. We can grow TanStack Table in more ambitious directions while keeping each application focused on only the capabilities it chooses to use.
78+
79+
The V8 and V9 releases arrived more than four years apart, and we do not anticipate waiting that long for V10. Part of the reason why TansTack Table V9 took so long was that there was a change of guard. I, Kevin Van Cott, and more recently, Riccardo Perra, have taken over the project from Tanner over the past few years. We are already exploring further state management improvements, Solid 2 support, and larger optional features such as full pivoting, advanced filter expressions, and more. V9 gives us the architecture to build those capabilities as composable features instead of making every user carry the cost of the entire roadmap.

0 commit comments

Comments
 (0)