Source: https://seerepo.com/r/teableio/teable/built
Markdown source: https://seerepo.com/r/teableio/teable/built.md
Description: teable is a TypeScript repo built with React, Next.js, Express, @nestjs/core, NestJS, and 2 more.

# What is teable built with?

teable is a TypeScript repo built with React, Next.js, Express, @nestjs/core, NestJS, and 2 more. It stores its data in @nestjs/bullmq, bullmq, Postgres, lru-cache, @keyv/redis, and 2 more, reaches it with knex, kysely, Prisma, and kysely-postgres-js, signs people in with nestjs, Passport, bcrypt, express-session, oauth2orize, and 6 more, stores files in AWS S3, uses AI through ai, ai-sdk, ollama-ai-provider-v2, OpenRouter, Anthropic, and 1 more, watches its errors with Sentry, makes its content with sharp, papaparse, @nestjs-modules/mailer, nodemailer, csv-stringify, and 16 more, validates its data with Zod, class-transformer, zod-validation-error, joi, @hookform/resolvers, and 2 more, is tested with Vitest, @nestjs/testing, vitest-mock-extended, Faker, Testing Library, and 3 more, deploys with nestjs-pino, opentelemetry, @nestjs/terminus, pino-http, pino, and 1 more, and uses Redis, @opentelemetry/instrumentation-ioredis, and MinIO. It has 1,646,857 written lines, with 2,229 test files.

Read on November 5, 2026, at commit f8be01f.

Repository: https://github.com/teableio/teable

## Frontend (apps/nestjs-backend)

### The base

- **[React](https://seerepo.com/uses/react)**: [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)
- **[Next.js](https://seerepo.com/uses/nextjs)**: 1 file · [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)

## Backend (apps/nestjs-backend)

### The base

- **[Express](https://seerepo.com/uses/express)**: 72 files · [in apps/nextjs-app/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nextjs-app/package.json)
- **@nestjs/core**: 17 files

### Data

- **@nestjs/bullmq**: 28 files
- **bullmq**: 28 files
- **[Postgres](https://seerepo.com/uses/postgres)**: 6 files · [apps/nestjs-backend/src/features/base/base-data-db-move.service.ts, line 14](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/base/base-data-db-move.service.ts#L14)
- **[lru-cache](https://seerepo.com/uses/lru-cache)**: 4 files
- **@keyv/redis**: 2 files
- **aws-sdk**: 2 files
- **[Redis](https://seerepo.com/uses/redis)**: 2 files · [apps/nestjs-backend/src/app.module.ts, line 7](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/app.module.ts#L7)
- **@opentelemetry/instrumentation-ioredis**: 1 file
- **MinIO**: 1 file · [apps/nestjs-backend/src/features/attachments/plugins/minio.ts, line 8](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/attachments/plugins/minio.ts#L8)

### Data access

- **knex**: 119 files
- **kysely**: 18 files
- **Prisma**: 8 files

### Sign-in

- **nestjs**: 27 files
- **Passport**: 5 files
- **[bcrypt](https://seerepo.com/uses/bcrypt)**: 4 files
- **express-session**: 3 files
- **oauth2orize**: 3 files
- **passport-jwt**: 3 files
- **helmet**: 1 file
- **passport-github2**: 1 file
- **passport-google-oauth20**: 1 file
- **passport-local**: 1 file
- **passport-oauth2-client-password**: 1 file

### AI

- **[ai](https://seerepo.com/uses/ai)**: 2 files
- **ai-sdk**: 1 file
- **ollama-ai-provider-v2**: 1 file
- **OpenRouter**: 1 file

### Services

- **[Sentry](https://seerepo.com/uses/sentry)**: 12 files · [apps/nestjs-backend/src/app.module.ts, line 6](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/app.module.ts#L6)
- **[Anthropic](https://seerepo.com/uses/anthropic)**: 1 file · [apps/nestjs-backend/src/features/ai/util.ts, line 4](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/ai/util.ts#L4)
- **[AWS S3](https://seerepo.com/uses/aws-s3)**: 1 file · [apps/nestjs-backend/src/features/attachments/plugins/aliyun.ts, line 3](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/attachments/plugins/aliyun.ts#L3)
- **[OpenAI](https://seerepo.com/uses/openai)**: 1 file · [apps/nestjs-backend/src/features/ai/util.ts, line 10](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/ai/util.ts#L10)

## Support (apps/nestjs-backend)

### The base

- **NestJS**: 587 files · [in apps/nestjs-backend/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/package.json)

### Content

- **[sharp](https://seerepo.com/uses/sharp)**: 10 files
- **[papaparse](https://seerepo.com/uses/papaparse)**: 6 files
- **@nestjs-modules/mailer**: 3 files
- **[nodemailer](https://seerepo.com/uses/nodemailer)**: 3 files
- **csv-stringify**: 2 files
- **xlsx**: 2 files
- **[markdown-it](https://seerepo.com/uses/markdown-it)**: 1 file
- **pdf-parse**: 1 file

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 9 files
- **class-transformer**: 5 files
- **zod-validation-error**: 5 files
- **joi**: 1 file

### Testing

- **Vitest**: 333 files
- **@nestjs/testing**: 65 files
- **vitest-mock-extended**: 14 files
- **Faker**: 3 files

### Deploy

- **nestjs-pino**: 5 files
- **opentelemetry**: 3 files
- **@nestjs/terminus**: 2 files
- **pino-http**: 1 file

### Tools

- **esbuild**: 2 files
- **@rspack/core**: 1 file
- **fork-ts-checker-webpack-plugin**: 1 file
- **glob**: 1 file
- **sql-formatter**: 1 file
- **unplugin-swc**: 1 file
- **vite-tsconfig-paths**: 1 file
- **webpack-node-externals**: 1 file

### Other

- **nestjs-cls**: 165 files
- **Lodash**: 91 files
- **[OpenTelemetry](https://seerepo.com/uses/opentelemetry)**: 33 files
- **ts-pattern**: 24 files
- **neverthrow**: 15 files
- **ms**: 14 files
- **dayjs**: 8 files
- **nanoid**: 8 files
- **fs-extra**: 7 files
- **rxjs**: 7 files
- **reflect-metadata**: 6 files
- **Axios**: 5 files
- **cookie**: 5 files
- **unzipper**: 5 files
- **multer**: 4 files
- **node-sql-parser**: 4 files
- **archiver**: 3 files
- **sockjs**: 3 files
- **@smithy/node-http-handler**: 2 files
- **mime-types**: 2 files
- **sockjs-client**: 2 files
- **stream-json**: 2 files
- **transliteration**: 2 files
- **ws**: 2 files
- **http-proxy-middleware**: 1 file
- **jschardet**: 1 file
- **node-fetch**: 1 file
- **p-limit**: 1 file
- **qs**: 1 file

## Frontend (apps/nextjs-app)

### The base

- **[React](https://seerepo.com/uses/react)**: 622 files · [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)
- **[Next.js](https://seerepo.com/uses/nextjs)**: 219 files · [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)

### Styles

- **[Tailwind CSS](https://seerepo.com/uses/tailwind-css)**: 3 files
- **@fontsource-variable/inter**: 1 file

### Interface

- **[dnd-kit](https://seerepo.com/uses/dnd-kit)**: 11 files
- **[React Hook Form](https://seerepo.com/uses/react-hook-form)**: 10 files
- **tanstack**: 8 files
- **react-hotkeys-hook**: 7 files
- **[CodeMirror](https://seerepo.com/uses/codemirror)**: 5 files
- **echarts**: 5 files
- **react-grid-layout**: 4 files
- **reactflow**: 4 files
- **react-virtuoso**: 3 files
- **re-resizable**: 2 files
- **[react-error-boundary](https://seerepo.com/uses/react-error-boundary)**: 2 files
- **[recharts](https://seerepo.com/uses/recharts)**: 2 files
- **canvas-confetti**: 1 file
- **emoji-mart**: 1 file
- **fullcalendar**: 1 file
- **Glide**: 1 file
- **nprogress**: 1 file
- **react-joyride**: 1 file
- **react-resizable**: 1 file
- **react-rnd**: 1 file
- **[react-syntax-highlighter](https://seerepo.com/uses/react-syntax-highlighter)**: 1 file

### Icons

- **[Lucide](https://seerepo.com/uses/lucide)**: 99 files
- **[Radix UI](https://seerepo.com/uses/radix-ui)**: 6 files

## Backend (apps/nextjs-app)

### The base

- **[Express](https://seerepo.com/uses/express)**: [in apps/nextjs-app/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nextjs-app/package.json)

### Services

- **[Sentry](https://seerepo.com/uses/sentry)**: 7 files · [apps/nestjs-backend/src/app.module.ts, line 6](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/app.module.ts#L6)

## Support (apps/nextjs-app)

### Content

- **qrcode.react**: 4 files
- **[dompurify](https://seerepo.com/uses/dompurify)**: 1 file

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 8 files
- **[@hookform/resolvers](https://seerepo.com/uses/hookform-resolvers)**: 7 files
- **zod-validation-error**: 3 files

### Testing

- **Vitest**: 79 files
- **Testing Library**: 48 files
- **@playwright/test**: 3 files

### Other

- **[TanStack](https://seerepo.com/uses/tanstack)**: 249 files
- **Lodash**: 49 files
- **react-use**: 37 files
- **zustand**: 23 files
- **dayjs**: 14 files
- **react-i18next**: 10 files
- **Axios**: 3 files
- **date-fns**: 3 files
- **date-fns-tz**: 3 files
- **filesize**: 2 files
- **fuse.js**: 2 files
- **ms**: 2 files
- **fflate**: 1 file
- **i18next**: 1 file
- **pinyin-pro**: 1 file

## Support (packages/core)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 40 files
- **class-transformer**: 22 files
- **zod-validation-error**: 1 file

### Testing

- **Vitest**: 6 files

### Tools

- **@asteasolutions/zod-to-openapi**: 1 file

### Other

- **Lodash**: 10 files
- **dayjs**: 9 files
- **color**: 1 file
- **date-fns-tz**: 1 file
- **nanoid**: 1 file
- **ts-pattern**: 1 file

## Backend (packages/db-data-prisma)

### Data

- **[Postgres](https://seerepo.com/uses/postgres)**: 1 file · [apps/nestjs-backend/src/features/base/base-data-db-move.service.ts, line 14](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/base/base-data-db-move.service.ts#L14)

## Support (packages/db-data-prisma)

### The base

- **NestJS**: 3 files · [in apps/nestjs-backend/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/package.json)

### Other

- **nestjs-cls**: 2 files
- **nanoid**: 1 file

## Backend (packages/db-main-prisma)

### Data

- **[Postgres](https://seerepo.com/uses/postgres)**: 3 files · [apps/nestjs-backend/src/features/base/base-data-db-move.service.ts, line 14](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/base/base-data-db-move.service.ts#L14)

### Data access

- **Prisma**: 4 files

### Sign-in

- **[bcrypt](https://seerepo.com/uses/bcrypt)**: 1 file

## Support (packages/db-main-prisma)

### The base

- **NestJS**: 4 files · [in apps/nestjs-backend/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/package.json)

### Other

- **nestjs-cls**: 2 files
- **nanoid**: 1 file

## Support (packages/formula)

### Testing

- **Vitest**: 2 files

## Frontend (packages/icons)

### The base

- **[React](https://seerepo.com/uses/react)**: 278 files · [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)

## Support (packages/openapi)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 35 files

### Testing

- **Vitest**: 21 files

### Tools

- **@asteasolutions/zod-to-openapi**: 372 files

### Other

- **Axios**: 23 files
- **form-data**: 1 file

## Frontend (packages/sdk)

### The base

- **[React](https://seerepo.com/uses/react)**: 353 files · [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)

### Styles

- **[Tailwind CSS](https://seerepo.com/uses/tailwind-css)**: 7 files

### Interface

- **[CodeMirror](https://seerepo.com/uses/codemirror)**: 7 files
- **tanstack**: 6 files
- **tiptap**: 6 files
- **react-textarea-autosize**: 3 files
- **[dnd-kit](https://seerepo.com/uses/dnd-kit)**: 2 files
- **[react-day-picker](https://seerepo.com/uses/react-day-picker)**: 2 files
- **@floating-ui/dom**: 1 file
- **[@lezer/highlight](https://seerepo.com/uses/lezer-highlight)**: 1 file
- **react-hotkeys-hook**: 1 file

### Icons

- **[Lucide](https://seerepo.com/uses/lucide)**: 13 files
- **[Radix UI](https://seerepo.com/uses/radix-ui)**: 1 file

## Backend (packages/sdk)

### Data

- **[lru-cache](https://seerepo.com/uses/lru-cache)**: 10 files

## Support (packages/sdk)

### Content

- **[react-markdown](https://seerepo.com/uses/react-markdown)**: 1 file
- **[rehype-raw](https://seerepo.com/uses/rehype-raw)**: 1 file
- **[rehype-sanitize](https://seerepo.com/uses/rehype-sanitize)**: 1 file
- **remark-cjk-friendly**: 1 file
- **[remark-gfm](https://seerepo.com/uses/remark-gfm)**: 1 file
- **remove-markdown**: 1 file
- **[turndown](https://seerepo.com/uses/turndown)**: 1 file

### Validation

- **class-transformer**: 4 files

### Testing

- **Vitest**: 97 files
- **Testing Library**: 62 files

### Other

- **Lodash**: 78 files
- **[TanStack](https://seerepo.com/uses/tanstack)**: 47 files
- **zustand**: 15 files
- **react-use**: 14 files
- **dayjs**: 5 files
- **Axios**: 3 files
- **date-fns-tz**: 3 files
- **date-fns**: 2 files
- **copy-to-clipboard**: 1 file
- **dequal**: 1 file
- **fuse.js**: 1 file
- **Immer**: 1 file
- **sockjs-client**: 1 file

## Frontend (packages/ui-lib)

### The base

- **[React](https://seerepo.com/uses/react)**: 75 files · [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)

### Styles

- **[Tailwind CSS](https://seerepo.com/uses/tailwind-css)**
- **[class-variance-authority](https://seerepo.com/uses/class-variance-authority)**: 14 files
- **[next-themes](https://seerepo.com/uses/next-themes)**: 1 file
- **[tailwind-merge](https://seerepo.com/uses/tailwind-merge)**: 1 file

### Interface

- **[Radix UI](https://seerepo.com/uses/radix-ui)**: 30 files
- **[cmdk](https://seerepo.com/uses/cmdk)**: 1 file
- **[dnd-kit](https://seerepo.com/uses/dnd-kit)**: 1 file
- **[embla-carousel-react](https://seerepo.com/uses/embla-carousel-react)**: 1 file
- **Glide**: 1 file
- **input-otp**: 1 file
- **[React Hook Form](https://seerepo.com/uses/react-hook-form)**: 1 file
- **[react-day-picker](https://seerepo.com/uses/react-day-picker)**: 1 file
- **[react-resizable-panels](https://seerepo.com/uses/react-resizable-panels)**: 1 file
- **[recharts](https://seerepo.com/uses/recharts)**: 1 file
- **[sonner](https://seerepo.com/uses/sonner)**: 1 file

### Icons

- **@radix-ui/react-icons**: 13 files
- **[Lucide](https://seerepo.com/uses/lucide)**: 2 files

## Support (packages/ui-lib)

### Content

- **docx-preview**: 1 file
- **[react-markdown](https://seerepo.com/uses/react-markdown)**: 1 file
- **remark-cjk-friendly**: 1 file
- **[remark-gfm](https://seerepo.com/uses/remark-gfm)**: 1 file
- **xlsx**: 1 file

### Other

- **clsx**: 1 file
- **date-fns**: 1 file

## Support (packages/v2/adapter-csv-parser-papaparse)

### Content

- **[papaparse](https://seerepo.com/uses/papaparse)**: 3 files

### Testing

- **Vitest**: 3 files

### Other

- **neverthrow**: 2 files

## Backend (packages/v2/adapter-db-postgres-pg)

### Data

- **[Postgres](https://seerepo.com/uses/postgres)**: 4 files · [apps/nestjs-backend/src/features/base/base-data-db-move.service.ts, line 14](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/base/base-data-db-move.service.ts#L14)

### Data access

- **kysely**: 2 files

## Support (packages/v2/adapter-db-postgres-pg)

### Testing

- **Vitest**: 2 files
- **@testcontainers/postgresql**: 1 file

### Other

- **neverthrow**: 1 file

## Backend (packages/v2/adapter-db-postgres-pglite)

### Data

- **@electric-sql/pglite**: 2 files

### Data access

- **kysely**: 2 files

## Backend (packages/v2/adapter-db-postgres-postgresjs)

### Data

- **[Postgres](https://seerepo.com/uses/postgres)**: 1 file · [apps/nestjs-backend/src/features/base/base-data-db-move.service.ts, line 14](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/base/base-data-db-move.service.ts#L14)

### Data access

- **kysely**: 1 file
- **kysely-postgres-js**: 1 file

## Backend (packages/v2/adapter-db-postgres-shared)

### Data access

- **kysely**: 2 files

## Support (packages/v2/adapter-db-postgres-shared)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Other

- **neverthrow**: 1 file

## Support (packages/v2/adapter-logger-pino)

### Deploy

- **[pino](https://seerepo.com/uses/pino)**: 2 files

## Support (packages/v2/adapter-realtime-broadcastchannel)

### Other

- **neverthrow**: 2 files

## Support (packages/v2/adapter-realtime-sharedb)

### Testing

- **Vitest**: 3 files

### Other

- **neverthrow**: 6 files
- **ws**: 1 file

## Backend (packages/v2/adapter-repository-postgres)

### Data access

- **kysely**: 13 files

## Support (packages/v2/adapter-repository-postgres)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Vitest**: 19 files
- **@testcontainers/postgresql**: 5 files

### Other

- **neverthrow**: 12 files
- **dayjs**: 1 file
- **transliteration**: 1 file
- **ts-pattern**: 1 file

## Backend (packages/v2/adapter-table-query-ops-postgres)

### Data access

- **kysely**: 13 files

## Support (packages/v2/adapter-table-query-ops-postgres)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Vitest**: 16 files

### Other

- **neverthrow**: 11 files

## Backend (packages/v2/adapter-table-repository-postgres)

### Data

- **@electric-sql/pglite**: 20 files

### Data access

- **kysely**: 98 files

## Support (packages/v2/adapter-table-repository-postgres)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 8 files

### Testing

- **Vitest**: 198 files
- **testcontainers**: 8 files

### Other

- **neverthrow**: 121 files
- **dayjs**: 2 files
- **ts-pattern**: 2 files
- **transliteration**: 1 file

## Support (packages/v2/adapter-undo-redo-keyv)

### Testing

- **Vitest**: 1 file

### Other

- **neverthrow**: 1 file

## Backend (packages/v2/app-bundle)

### Data access

- **kysely**: 1 file

## Support (packages/v2/app-bundle)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Vitest**: 1 file

### Other

- **fflate**: 1 file
- **neverthrow**: 1 file

## Backend (packages/v2/command-explain)

### Data access

- **kysely**: 12 files

## Support (packages/v2/command-explain)

### Testing

- **Vitest**: 14 files

### Other

- **neverthrow**: 25 files

## Support (packages/v2/complexity)

### Testing

- **Vitest**: 5 files

## Support (packages/v2/container-node)

### Testing

- **Vitest**: 1 file

## Support (packages/v2/contract-http-client)

### Testing

- **Vitest**: 1 file

### Other

- **orpc**: 1 file

## Backend (packages/v2/contract-http-express)

### The base

- **[Express](https://seerepo.com/uses/express)**: 2 files · [in apps/nextjs-app/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nextjs-app/package.json)

## Support (packages/v2/contract-http-fastify)

### The base

- **Fastify**: 1 file

## Support (packages/v2/contract-http-hono)

### The base

- **[Hono](https://seerepo.com/uses/hono)**: 1 file

## Support (packages/v2/contract-http-implementation)

### Testing

- **Vitest**: 9 files

### Other

- **neverthrow**: 4 files

## Support (packages/v2/contract-http-openapi)

### Validation

- **[Ajv](https://seerepo.com/uses/ajv)**: 1 file
- **[ajv-formats](https://seerepo.com/uses/ajv-formats)**: 1 file

### Testing

- **Vitest**: 1 file

### Other

- **@orpc/contract**: 1 file
- **neverthrow**: 1 file

## Support (packages/v2/contract-http)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 50 files

### Testing

- **Vitest**: 10 files

### Tools

- **openapi-types**: 1 file

### Other

- **neverthrow**: 40 files
- **@orpc/contract**: 4 files

## Support (packages/v2/core)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 204 files

### Testing

- **Vitest**: 358 files

### Other

- **neverthrow**: 810 files
- **ts-pattern**: 22 files
- **nanoid**: 1 file

## Support (packages/v2/data-query)

### Content

- **[yaml](https://seerepo.com/uses/yaml)**: 2 files

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 7 files

### Testing

- **Vitest**: 13 files

### Tools

- **TypeScript**: 1 file

### Other

- **neverthrow**: 11 files

## Support (packages/v2/di)

### Other

- **reflect-metadata**: 1 file

## Support (packages/v2/dottea)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Testing

- **Vitest**: 1 file

### Other

- **neverthrow**: 1 file
- **unzipper**: 1 file

## Support (packages/v2/field-dependency-core)

### Testing

- **Vitest**: 2 files

### Other

- **neverthrow**: 2 files

## Backend (packages/v2/formula-sql-pg)

### Data access

- **kysely**: 1 file

## Support (packages/v2/formula-sql-pg)

### Testing

- **Vitest**: 54 files

### Other

- **neverthrow**: 7 files

## Backend (packages/v2/headless-cli)

### Data access

- **kysely**: 1 file

## Support (packages/v2/headless-cli)

### Testing

- **Vitest**: 2 files

### Deploy

- **@hono/node-server**: 1 file

### Other

- **reflect-metadata**: 1 file

## Support (packages/v2/headless-http)

### The base

- **[Hono](https://seerepo.com/uses/hono)**: 1 file

### Testing

- **Vitest**: 1 file

## Backend (packages/v2/headless-runtime)

### Data access

- **kysely**: 3 files

## Support (packages/v2/headless-runtime)

### Testing

- **Vitest**: 5 files

### Other

- **neverthrow**: 2 files
- **proper-lockfile**: 1 file

## Support (packages/v2/import)

### Content

- **htmlparser2**: 1 file
- **saxes**: 1 file
- **xlsx**: 1 file

### Testing

- **Vitest**: 4 files

### Other

- **neverthrow**: 4 files
- **yauzl**: 1 file

## Backend (packages/v2/local-attachments)

### Data access

- **kysely**: 1 file

## Support (packages/v2/local-attachments)

### Testing

- **Vitest**: 1 file

## Backend (packages/v2/postgres-schema)

### Data access

- **kysely**: 1 file

## Support (packages/v2/table-query-ops)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 2 files

### Testing

- **Vitest**: 17 files

### Other

- **neverthrow**: 11 files
- **nanoid**: 2 files

## Support (packages/v2/utils)

### Testing

- **Vitest**: 3 files

### Other

- **ipaddr.js**: 2 files
- **node-fetch**: 1 file
- **request-filtering-agent**: 1 file
- **undici**: 1 file

## Frontend (plugins)

### The base

- **[React](https://seerepo.com/uses/react)**: 6 files · [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)
- **[Next.js](https://seerepo.com/uses/nextjs)**: 3 files · [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)

### Styles

- **[Tailwind CSS](https://seerepo.com/uses/tailwind-css)**

## Support (plugins)

### Validation

- **[Zod](https://seerepo.com/uses/zod)**: 1 file

### Other

- **react-i18next**: 3 files
- **[TanStack](https://seerepo.com/uses/tanstack)**: 2 files
- **i18next**: 1 file

## Other repos with a similar stack

- [twentyhq/twenty](https://seerepo.com/r/twentyhq/twenty/built): React, Express, @nestjs/core, bullmq, Postgres, aws-sdk, Redis, Sentry, Anthropic, AWS S3, OpenAI, NestJS, Passport, bcrypt, express-session, passport-jwt, passport-google-oauth20, ai, ai-sdk, sharp, papaparse, nodemailer, Zod, class-transformer, opentelemetry, @nestjs/terminus, React Hook Form, react-hotkeys-hook, react-grid-layout, react-error-boundary, dompurify, @hookform/resolvers, tiptap, react-textarea-autosize, react-markdown, remark-gfm, input-otp · [Compare](https://seerepo.com/compare/teableio/teable/vs/twentyhq/twenty)
- [infiniflow/ragflow](https://seerepo.com/r/infiniflow/ragflow/built): React, Postgres, Redis, AWS S3, OpenAI, papaparse, xlsx, Zod, Tailwind CSS, React Hook Form, tanstack, recharts, react-syntax-highlighter, Lucide, Radix UI, dompurify, @hookform/resolvers, react-day-picker, react-markdown, rehype-raw, rehype-sanitize, remark-gfm, class-variance-authority, next-themes, tailwind-merge, cmdk, embla-carousel-react, react-resizable-panels, sonner, Ajv, ajv-formats · [Compare](https://seerepo.com/compare/infiniflow/ragflow/vs/teableio/teable)
- [paperclipai/paperclip](https://seerepo.com/r/paperclipai/paperclip/built): React, Express, Postgres, Sentry, Anthropic, AWS S3, OpenAI, ai, sharp, Zod, opentelemetry, Tailwind CSS, dnd-kit, CodeMirror, Lucide, Radix UI, dompurify, @lezer/highlight, react-markdown, remark-gfm, class-variance-authority, tailwind-merge, cmdk, react-resizable-panels, pino, Ajv, ajv-formats, yaml · [Compare](https://seerepo.com/compare/paperclipai/paperclip/vs/teableio/teable)
- [supabase/supabase](https://seerepo.com/r/supabase/supabase/built): React, Next.js, Sentry, OpenAI, ai, papaparse, Zod, Tailwind CSS, dnd-kit, React Hook Form, tanstack, react-error-boundary, recharts, react-syntax-highlighter, Lucide, Radix UI, @hookform/resolvers, react-day-picker, react-markdown, remark-gfm, class-variance-authority, next-themes, cmdk, input-otp, react-resizable-panels, sonner · [Compare](https://seerepo.com/compare/supabase/supabase/vs/teableio/teable)
- [ruvnet/ruflo](https://seerepo.com/r/ruvnet/ruflo/built): React, Express, Postgres, OpenAI, helmet, sharp, Zod, Tailwind CSS, React Hook Form, reactflow, recharts, Lucide, Radix UI, react-day-picker, class-variance-authority, next-themes, tailwind-merge, cmdk, embla-carousel-react, input-otp, react-resizable-panels, sonner, pino, Ajv, yaml, htmlparser2 · [Compare](https://seerepo.com/compare/ruvnet/ruflo/vs/teableio/teable)
- [cline/cline](https://seerepo.com/r/cline/cline/built): React, Anthropic, OpenAI, ai, ai-sdk, pdf-parse, Zod, opentelemetry, Tailwind CSS, react-virtuoso, recharts, Lucide, Radix UI, dompurify, react-textarea-autosize, react-markdown, remark-gfm, turndown, class-variance-authority, next-themes, tailwind-merge, cmdk, embla-carousel-react, sonner, pino, yaml · [Compare](https://seerepo.com/compare/cline/cline/vs/teableio/teable)

## Frequently asked questions

### What language is teable written in?

teable is written in TypeScript, with 1,646,857 written lines.

### What framework does teable use?

teable is built with React, Next.js, Express, @nestjs/core, NestJS, Fastify, and Hono.

The proof: [in plugins/package.json](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/plugins/package.json)

### What database does teable use?

teable stores its data in @nestjs/bullmq, bullmq, Postgres, lru-cache, @keyv/redis, aws-sdk, and @electric-sql/pglite and reaches it with knex, kysely, Prisma, and kysely-postgres-js.

### What does teable sign people in with?

teable signs people in with nestjs, Passport, bcrypt, express-session, oauth2orize, passport-jwt, helmet, passport-github2, passport-google-oauth20, passport-local, and passport-oauth2-client-password.

### Does teable use AI?

Yes. teable uses AI through ai, ai-sdk, ollama-ai-provider-v2, OpenRouter, Anthropic, and OpenAI.

### What services does teable use?

teable stores files in AWS S3, watches its errors with Sentry, and uses Redis, @opentelemetry/instrumentation-ioredis, and MinIO.

The proof: [apps/nestjs-backend/src/features/attachments/plugins/aliyun.ts, line 3](https://github.com/teableio/teable/blob/f8be01fadb86790d3d3a878bedd10cf949f9a8f8/apps/nestjs-backend/src/features/attachments/plugins/aliyun.ts#L3)

### Does teable have tests?

Yes. teable has 2,229 test files and is tested with Vitest, @nestjs/testing, vitest-mock-extended, Faker, Testing Library, @playwright/test, @testcontainers/postgresql, and testcontainers.

### Which repos have a stack like teable's?

The ones that share most of its stack: twentyhq/twenty, infiniflow/ragflow, and paperclipai/paperclip.

## What is your repo built with?

Any public repo, with no account: https://seerepo.com/r/owner/repo/built, with the owner and name it has on GitHub.
