The local-first table.

Spreadsheet-like editing, 14 type-aware columns,
and a real keyboard. For your React app today —
desktop and CLI coming soon.

npm install @datasketch/monkeytab

Built for humans and agents. Local data, your way.

NameScoreActive
Alpha9.5
Beta7.2
Gamma8.8

Drop-in, batteries included

Most React tables are headless primitives — you assemble the UI yourself. MonkeyTab is the opposite: a single component you mount and configure.

One install

npm install @datasketch/monkeytab. No assembly. React 18 or 19.

🎨

14 field types

Text, Number, Boolean, Date, SingleSelect, MultiSelect, Email, URL, Phone, Image, Attachment, Rating, Color, Computed.

⌨️

Spreadsheet keyboard

Arrows, Tab, Enter, Cmd+C/V, Shift+Arrow ranges. Multi-cell paste from Excel.

🔌

Extensible

Custom renderers, editors, computed functions, validators — all via props.

🌍

i18n built-in

English and Spanish bundled. Override any string. Locale-aware formatting.

📦

Tiny

140 KB gzipped. React peer dep only. No CSS-in-JS, no design system lock-in.

🔍

Sort, filter, search

Out of the box. Type-aware sort labels. Filter builder per column type.

📄

Pagination

Simple Previous/Next or load-more infinite scroll. Server-side or client-side.

🔒

Per-column control

editable, sortable, width, minWidth, align — opt out of edits per column.

Get a table in 30 seconds

import { MonkeyTable } from '@datasketch/monkeytab';

function App() {
  return (
    <MonkeyTable
      columns={[
        { id: 'Name' },
        { id: 'Score', type: 'Number', options: { precision: 1 } },
        { id: 'Status', type: 'SingleSelect', options: {
          options: [
            { value: 'active', label: 'Active', color: '#22c55e' },
            { value: 'done', label: 'Done', color: '#3b82f6' },
          ],
        }},
        { id: 'Approved', type: 'Boolean' },
      ]}
      rows={[
        { Name: 'Alpha', Score: 9.5, Status: 'active', Approved: true },
        { Name: 'Beta', Score: 7.2, Status: 'done', Approved: false },
      ]}
      onChange={(rows) => console.log(rows)}
      height={500}
    />
  );
}

Why MonkeyTab

You don't want to build a table

You want to ship the feature that needs the table. MonkeyTab handles cell editing, sorting, filtering, virtualization, keyboard navigation, and copy-paste so you can focus on what's special about your app.

It looks normal

No design system lock-in. The default styling is clean and Airtable-ish, but you can override any cell renderer, any editor, any string. It blends into whatever your app already looks like.

It scales when you need it

Built on TanStack Table with virtualization. Tested with 100,000+ rows. Server-side pagination, sorting, and filtering when you need them.