Thanks for your interest in contributing! MonkeyTab is the open-source embeddable React table from datasketch. We welcome bug reports, feature requests, and pull requests.
- Node.js 18+
- npm (or pnpm/yarn — npm is the default)
- Git
git clone https://github.com/datasketch/monkeytab.git
cd monkeytab
npm installnpm run buildThis produces dist/monkeytab.js and dist/index.d.ts.
npm test # run once
npm run test:watch # watch mode
npm run test:coverage # with coverage reportSee tests/README.md for the test layout, conventions, and how to write your first test.
cd examples/browser-standalone
npm install
npm run devThe example demonstrates the field types and features of the package.
monkeytab/
├── src/
│ ├── core/ # Types, adapter interface, registries
│ ├── ui/ # React components, renderers, editors
│ ├── browser/ # The @datasketch/monkeytab entry point
│ └── adapters/
│ └── memory/ # In-memory adapter (the default)
├── tests/ # Vitest test suite
│ └── README.md # How to write and run tests
├── examples/
│ └── browser-standalone/ # Minimal demo app
├── docs/
│ ├── architecture.md # How it's structured
│ ├── guides/ # Tutorial-style guides (rendered at monkeytab.app)
│ └── reference/ # Reference docs (rendered at monkeytab.app)
├── .github/ # Issue templates, PR template, CI workflows
├── package.json
├── tsconfig.json
├── vite.config.ts # Library build (Vite)
├── vitest.config.ts # Test runner config
├── README.md
├── BROWSER.md # API reference
├── EXTENDING.md # Custom renderers, editors, functions
├── CHANGELOG.md
└── LICENSE # MIT
The src/ directory uses TypeScript path aliases (defined in tsconfig.json and vite.config.ts) so imports look like @monkeytab/core and @monkeytab/adapter-memory even though everything lives in a flat src/ tree. You don't need to think about this — just use the aliases when importing across modules.
Before opening an issue, please:
- Check the existing issues — your problem may already be reported
- Try the latest version (
npm install @datasketch/monkeytab@latest) - Provide a minimal reproduction (a CodeSandbox or short code snippet works great)
When reporting a bug, include:
- The MonkeyTab version
- React version
- Browser and OS
- Steps to reproduce
- Expected vs actual behavior
- Console errors (if any)
- Fork the repo and create a topic branch (
git checkout -b fix-something) - Make your changes
- Add or update tests in
tests/if relevant - Run
npm testto verify - Run
npm run buildto verify it compiles - Commit with a clear message describing the why
- Open a pull request
Standard GitHub flow — open a PR, get reviewed, see it merged. The only quirk worth knowing: the merge may lag a beat behind your PR being approved.
That's because MonkeyTab is developed in an internal workspace and synced to this public repo, so when a maintainer accepts your PR they apply the same change upstream first, then merge here. You'll see commit attribution to you in the merge, the changelog entry credits you, and your PR closes as merged — same as any other open source project.
If anything ever looks weird (PR sitting in "approved" status for a while, your commit attribution missing, etc.), feel free to ping us in the PR thread.
- TypeScript strict mode — no
anyunless absolutely necessary - Use the
@monkeytab/*aliases for cross-module imports (configured intsconfig.json) - Match the existing code style — Prettier defaults are fine
- Keep changes focused — one PR per topic
- Lead with a verb in present tense ("Add X", "Fix Y", "Update Z")
- Explain why the change matters
- Reference issue numbers when relevant
- Keep the subject line under 70 characters
- Describe what the change does and why
- List any breaking changes (we follow semver)
- Include before/after screenshots for visual changes
- Link to related issues
The easiest contribution path is improving the documentation. Every markdown file under docs/guides/ and docs/reference/ is rendered at monkeytab.app, and the source for those pages lives right here in this repo.
To fix a typo, clarify a step, or add a new guide:
- Find the file under
docs/guides/ordocs/reference/ - Edit it (or create a new
.mdfile) - Open a PR with a clear description
The maintainers apply the change upstream, the docs site rebuilds, and your improvement is live.
A few notes:
README.md,BROWSER.md,EXTENDING.md,CHANGELOG.mdat the root are the npm package's primary docs. Edit these for API reference and package-level documentation.docs/guides/*.mdare tutorial-style guides — quick start, conceptual explanations, common patterns.docs/reference/*.mdare reference docs — overviews and conceptual API notes.docs/architecture.mdis the high-level architecture overview.
If you're not sure where a piece of documentation belongs, open an issue and we'll help.
If you want to add a brand new field type (e.g., Currency, Percent, Address):
- Add the type to the
FieldTypeunion insrc/core/types.ts - Create a
*FieldOptionsinterface for type-specific options in the same file - Add it to the
FieldOptionsunion - Create a renderer in
src/ui/components/renderers/ - Create an editor in
src/ui/components/editors/ - Register the type in
src/ui/registry/FieldTypeRegistry.ts - Register the renderer/editor pair in
src/ui/registry/defaults.ts - Update
src/browser/types.d.ts(the npm type declarations) - Add tests in
tests/ - Add documentation: a section in
EXTENDING.mdor a guide indocs/guides/
Note: you don't need a new field type just to customize an existing one — use the renderers, editors, or per-column render props instead. New field types are for genuinely new value shapes.
Adapters connect MonkeyTab to a data source. To add a new one:
- Create
src/adapters/your-adapter/ - Implement the
Adapterinterface from@monkeytab/core - Add tests in
tests/adapters/your-adapter.test.ts - Document the adapter's capabilities (sort, filter, search, files, etc.)
- Export from
src/adapters/your-adapter/index.ts - Add a TypeScript path alias in
tsconfig.jsonandvite.config.tsif cross-module imports are needed
The current public release ships only the in-memory adapter. File-system adapters (json, csv, folder, sqlite) are on the roadmap but not yet public — they need to be ported from Deno-specific filesystem APIs to node:fs. If you want to take that on, the upstream private repo has working Deno versions to port from — open an issue to coordinate.
For details on the adapter interface and what each method should do, see docs/architecture.md.
All user-facing strings must go through the i18n system. Never hardcode UI text in components.
When you add a new string:
- Add the key to the
I18nStringsinterface insrc/ui/i18n/strings.ts - Add the English value in
src/ui/i18n/en.ts - Add the Spanish value in
src/ui/i18n/es.ts - Use
const { t } = useI18n()in your component, then callt('your.key')
If you forget to add the key to all bundles, the UI will show the raw key string instead of translated text.
When you add a feature, also update the relevant documentation:
BROWSER.mdif it adds a new prop or changes the public APIEXTENDING.mdif it changes how to extend MonkeyTabCHANGELOG.mdunder the unreleased sectiondocs/architecture.mdif it changes the structure- A new guide under
docs/guides/if it deserves a dedicated tutorial
By contributing, you agree that your contributions will be licensed under the MIT License.
Be kind. Be respectful. Disagree with ideas, not people. We want this to be a welcoming community for contributors of all backgrounds and experience levels.