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/monkeytabBuilt for humans and agents. Local data, your way.
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.