About The Project
Data tables for React and shadcn/ui: faceted filters, sorting, infinite scroll, and a row detail sheet. Installed as source with the shadcn CLI, so the code is yours to change.
One createTableSchema definition drives the columns, the filter controls, the row sheet, the Drizzle route handler, and the MCP tool schema. When the rows live in Postgres, filtering, faceted counts, and cursor pagination run in SQL. Built for the openstatus dashboard and used there in production.
Visit data-table.openstatus.dev to learn more. Read the Docs for full documentation.
Install
— the Quick Start below is installed into a fresh Next.js app and typechecked nightly against the latest shadcn CLI.
Prerequisite. Requires a shadcn project on the Radix library (
npx shadcn@latest init -b radix -p nova). The shadcn CLI default, Base UI (init -d, presetbase-nova), is not supported yet — the blocks fail to typecheck on it.
One command installs the core block and the schema system:
npx shadcn@latest add https://data-table.openstatus.dev/r/data-table.json https://data-table.openstatus.dev/r/data-table-schema.jsonThen render a table from any array of objects — columns, filters, and cell renderers are inferred:
import { DataTableAuto } from "@/components/data-table/data-table-auto";
const data = [
{
name: "Alice",
role: "admin",
rating: 5,
created_at: "2026-01-15T10:00:00Z",
},
{ name: "Bob", role: "user", rating: 3, created_at: "2026-02-20T14:30:00Z" },
];
export default function Page() {
return <DataTableAuto data={data} />;
}From create-next-app to a green next build this takes about 30 seconds on a clean machine. See the Quick Start for the full walkthrough, and add any block below as you need it.
| Block | Install URL | What it adds |
|---|---|---|
data-table |
.../r/data-table.json |
Core: table engine, store, 4 filter types, memory adapter |
data-table-filter-command |
.../r/data-table-filter-command.json |
Command palette with history + keyboard shortcuts |
data-table-cell |
.../r/data-table-cell.json |
12 cell renderers (text, code, number, bar, heatmap, gauge, badge, boolean, star, status-code, level-indicator, timestamp) |
data-table-sheet |
.../r/data-table-sheet.json |
Row detail side panel |
data-table-nuqs |
.../r/data-table-nuqs.json |
nuqs URL state adapter |
data-table-zustand |
.../r/data-table-zustand.json |
zustand state adapter |
data-table-schema |
.../r/data-table-schema.json |
Declarative schema system with col.* factories |
data-table-drizzle |
.../r/data-table-drizzle.json |
Drizzle ORM server-side helpers |
data-table-query |
.../r/data-table-query.json |
React Query infinite query integration |
data-table-filter-command-ai |
.../r/data-table-filter-command-ai.json |
AI-powered natural language → filter inference |
data-table-mcp |
.../r/data-table-mcp.json |
MCP server endpoint for AI agents |
data-table-actions |
.../r/data-table-actions.json |
Row and bulk actions rendered from server metadata |
data-table-remote |
.../r/data-table-remote.json |
Headless table that renders from an API endpoint's manifest |
All URLs use base https://data-table.openstatus.dev.
For AI Agents
Install the plugin in Claude Code:
/plugin marketplace add openstatushq/data-table-filters
/plugin install data-table-filters@openstatusOr install the skill with any agent that supports the skills CLI:
npx skills add https://github.com/openstatushq/data-table-filters --skill data-table-filtersThen just say "add a filterable data table" — the skill detects your stack, installs the right blocks, generates a schema, and wires everything up.
Or point any MCP client at the docs and let the agent ask them questions —
search_docs, get_doc, list_blocks, get_install_plan:
claude mcp add --transport http data-table-filters https://data-table.openstatus.dev/api/mcpMachine-readable docs, for agents without the skill:
| Endpoint | What it is |
|---|---|
/api/mcp |
These docs as an MCP server (Streamable HTTP) |
/llms.txt |
Index: blocks, install recipes, docs links |
/llms-full.txt |
Every documentation page in one file |
/r/index.md |
Block catalog with install commands and dependencies |
/docs/<page>.md |
Any docs page as raw markdown |
Cursor users can copy .cursor/rules/data-table-filters.mdc into their project; AGENTS.md covers every other agent. See the For AI Agents docs page for the full rundown.
Table Schema
Define your entire table — columns, filters, display, sorting, row details — in one place with createTableSchema and col.* factories.
import {
col,
createTableSchema,
type InferTableType,
} from "@/lib/table-schema";
const LEVELS = ["error", "warn", "info", "debug"] as const;
export const tableSchema = createTableSchema({
level: col.presets.logLevel(LEVELS),
date: col.presets.timestamp().label("Date").size(200).sheet(),
latency: col.presets
.duration("ms")
.label("Latency")
.sortable()
.size(110)
.sheet(),
status: col.presets.httpStatus().label("Status").size(60),
host: col.string().label("Host").size(125).sheet(),
});
export type ColumnSchema = InferTableType<typeof tableSchema.definition>;Generators produce everything the table components need from a single schema:
const columns = generateColumns<ColumnSchema>(tableSchema.definition);
const filterFields = generateFilterFields<ColumnSchema>(tableSchema.definition);
const sheetFields = generateSheetFields<ColumnSchema>(tableSchema.definition);Presets cover common patterns: logLevel, httpStatus, httpMethod, duration, timestamp, traceId, pathname.
Examples
/default— client-side pagination (nuqs or zustand)/infinite— infinite scroll with server-side filtering, live mode, row details/drizzle— Drizzle ORM + Supabase PostgreSQL with cursor-based pagination, faceted search, and live data via Vercel cron/light— OpenStatus Light Viewer (UI forvercel-edge-ping)/builder— interactive schema builder (paste JSON/CSV, live table preview, export TS)
BYOS (Bring Your Own Store)
A pluggable adapter pattern for filter state management. Three built-in adapters:
- nuqs — URL-based state (shareable URLs, browser history)
- zustand — client-side state (existing store integration)
- memory — ephemeral in-memory state (embedded tables, builder)
Or implement the StoreAdapter interface for a custom solution. See the Docs for details.
Built With
- nextjs
- tanstack-query
- tanstack-table
- shadcn/ui
- cmdk
- nuqs
- zustand
- drizzle-orm
- zod
- superjson
- date-fns
- recharts
- dnd-kit
Getting Started
No environment variable required for the default examples. For the Drizzle example, set DATABASE_URL to a PostgreSQL connection string.
pnpm install
pnpm devOpen http://localhost:3000 with your browser to see the result.
Want more?
If you are looking for specific use-cases or like what we are building and want to hire us, feel free write us to hire@openstatus.dev or book a call via cal.com.
Credits
- sadmann17 for the dope
<Sortable />component around@dnd-kit(see sortable.sadmn.com) - shelwin_ for the draggable chart inspiration (see zoom-chart-demo.vercel.app)
