{"repo":"teableio/teable","free":true,"listed":false,"github":"https://github.com/teableio/teable","clone":"git clone https://github.com/teableio/teable.git","description":"✨ AI Spreadsheet for Business","language":"TypeScript","stars":21660,"topics":["ai-agent","airtable","airtable-alternative","app-builder","database","internal-tool","low-code","no-code","postgres","postgresql","sandbox","spreadsheet"],"license":null,"category":"low_code_platform","readme_excerpt":"<div align=\"center\">\n  <h1 align=\"center\">\n    <picture>\n      <source media=\"(prefers-color-scheme: dark)\" srcset=\"static/assets/images/teable-vertical-dark.png\">\n      <img alt=\"teable logo\" height=\"120\" src=\"static/assets/images/teable-vertical-light.png\">\n    </picture>\n  </h1>\n  <h3 align=\"center\"><strong>Turn your data into AI workflows and custom apps that 100% fit your business</strong></h3>\n  <p>One platform where data management, AI workflows, and app building come together — spreadsheet-simple on the surface, real PostgreSQL underneath. Agents work inside your live data and real processes, so what they build lands seamlessly and fits your business exactly. In the cloud or fully self-hosted.</p>\n  <p>Try out Teable using our hosted version at <a href=\"https://teable.ai\">teable.ai</a></p>\n</div>\n\n<div align=\"center\">\n<a href=\"https://trendshift.io/repositories/8516\" target=\"_blank\"><img src=\"https://trendshift.io/api/badge/repositories/8516\" alt=\"teableio%2Fteable | Trendshift\" style=\"width: 250px; height: 55px;\" width=\"250\" height=\"55\"/></a>\n</div>\n\n<p align=\"center\">\n  <a target=\"_blank\" href=\"https://teable.ai\">Home</a> | <a target=\"_blank\" href=\"https://help.teable.ai\">Help</a> | <a target=\"_blank\" href=\"https://teable.ai/blog\">Blog</a> | <a target=\"_blank\" href=\"https://teable.ai/templates\">Template</a> | <a target=\"_blank\" href=\"https://help.teable.ai/en/api-doc/token\">API</a> | <a target=\"_blank\" href=\"https://community.teable.ai\">Community</a> | <a target=\"_blank\" href=\"https://x.com/teableio\">X</a>\n</p>\n\n<p align=\"center\">\n  <a aria-label=\"Build\" href=\"https://github.com/teableio/teable/actions?query=Build%20and%20Push%20to%20Docker%20Registry\">\n    <img alt=\"build\" src=\"https://img.shields.io/github/actions/workflow/status/teableio/teable/docker-push.yml?label=Build&logo=github&style=flat-quare&labelColor=000000\" />\n  </a>\n  <a aria-label=\"Codacy grade\" href=\"https://www.codacy.com/gh/teableio/teable/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=teableio/teable&amp;utm_campaign=Badge_Grade\">\n    <img alt=\"Codacy grade\" src=\"https://img.shields.io/codacy/grade/dff9c944af284a0fad4e165eb1727467?logo=codacy&style=flat-square&labelColor=000&label=Codacy\">\n  </a>\n  <a aria-label=\"Top language\" href=\"https://github.com/teableio/teable/search?l=typescript\">\n    <img alt=\"GitHub top language\" src=\"https://img.shields.io/github/languages/top/teableio/teable?style=flat-square&labelColor=000&color=blue\">\n  </a>\n</p>\n\n![Teable cover](static/assets/images/teable-cover.png)\n\n## Quick Guide\n\n1. Want to see it in action? Try Teable on our hosted cloud at [teable.ai](https://teable.ai).\n2. Deploying it yourself? Start from the [Deployment guide](https://help.teable.ai/en/deploy/choose) — standalone in minutes, or the full AI platform on your own machines.\n\n## Four platforms in one\n\nAI chat, App Builder, and app deployments are part of Teable, not bolt-ons.\nSelf-hosting Teable deploys four platforms in one:\n\n- **A secure, scalable agent sandbox** — every AI session runs in its own isolated container, started on demand and gone when the session ends.\n- **A resource-efficient app deployment platform** — every app your team builds and publishes runs as its own lightweight, long-lived container.\n- **An AI workflow engine** — automations triggered by record changes, schedules, and webhooks, with AI steps, running right where your data lives.\n- **A full-featured database collaboration platform on PostgreSQL** — tables, views, permissions, and API.\n\nSelf-hosting wraps your own compute into an **agent-ready, fully controlled\nproductivity environment** — putting AI in the hands of everyone on your team.\nSee [Architecture](https://help.teable.ai/en/deploy/architecture) for how the\npieces fit together.\n\n## ✨Features\n\n### 🤖 AI-native\n\n- **AI Chat** — ask, analyze, and operate on your data in natural language.\n- **App Builder** — describe the app you need; an agent builds it in an isolated sandbox and deploys it to its own URL in one click.\n- **AI automations** — react to record changes, schedules, and webhooks, with AI steps doing the reasoning.\n- **AI field filling** — generate and enrich field values in bulk.\n\n### 🍺 Everything you need, out of the box\n\nGrid, Form, Kanban, Gallery, and Calendar views; formulas, field conversion,\nfiltering, grouping, sorting, and aggregation; comments, record history,\nundo/redo, and real-time collaboration; attachments preview, batch editing,\nimport/export, search, validation, charts, plugins, SQL query — and millions\nof rows without breaking a sweat.\n\nMore features land all the time — see the <a target=\"_blank\" href=\"https://help.teable.ai/en/changelog\">Changelog</a>.\n\n## Deploy\n\nThree ways to run Teable — pick by what you need (full comparison in the\n[Deployment guide](https://help.teable.ai/en/deploy/choose)):\n\n|                                        | **Teable Cloud**               | **Full-featured self-host**                                                 | **Standalone self-host**                                |\n| -------------------------------------- | ------------------------------ | --------------------------------------------------------------------------- | ------------------------------------------------------- |\n| Tables, collaboration, API, automation | ✅                             | ✅                                                                          | ✅                                                      |\n| AI features (chat, agents)             | ✅                             | ✅                                                                          | ❌                                                      |\n| App Builder (build & deploy apps)      | ✅                             | ✅                                                                          | ❌                                                      |\n| Start here                             | [teable.ai](https://teable.ai) | [teableio/teable-deployment](https://github.com/teableio/teable-deployment) | [Docker guide](https://help.teable.ai/en/deploy/docker) |\n\nPrefer not to deploy by hand? **Hand [teableio/teable-deployment](https://github.com/teableio/teable-deployment)\nto your AI agent** (Claude Code, Codex, …) together with a domain, a DNS token,\nand access to the target machine or cluster — it can take the deployment end\nto end.\n\nAlready running standalone Teable? The runtime plane installs next to it and\nyour data stays in place: [migration guide](https://github.com/teableio/teable-deployment/blob/main/migration/2026-07-basic-to-full-featured.md).\n\n## Development\n\n#### 1. Initialize\n\n```sh\n# Enabling the Help Management Package Manager\ncorepack enable\n\n# Install project dependencies\npnpm install\n```\n\n#### 2. Initialize Postgres\n\n```sh\nmake switch-db-mode\n```\n\n#### 3. Custom Environment Variables（Optional）\n\n```sh\ncd apps/nextjs-app\ncp .env.development .env.development.local\n```\n\n#### 4. Run Dev Server\n\nyou just need to start backend, it will start next server for frontend automatically, file change will be auto reload\n\n```sh\ncd apps/nestjs-backend\npnpm dev\n```\n\n## Why Teable?\n\n**Software should fit the work — not the other way around.** Every team knows\nthe compromise: you have a concrete business need, you search for an app, and\nit covers 70% of it. So you bend your process around the tool, or you file a\nticket and wait quarters for custom development. The work adapts to the\nsoftware, when it should be the software adapting to the work.\n\n**AI only changes this if it reaches the real workflow.** A wave of AI tools\ncan now generate an app on demand — but each one is built in a vacuum: an\nempty database, no knowledge of how your team actually operates, one more\nisland to integrate and maintain. The demo impresses; the workflow stays the\nsame.\n\n**Teable puts the agent where the work already happens.** Your data, apps,\nautomations, permissions, and collaborators live here, on a real PostgreSQL —\nand the AI operates all of it. Chat acts on live data. Automations reason\nover records as they change. App Builder ships working systems wired to the\nsame database your team already uses — so what gets built is never another\nsilo, but a precise extension of the workflow it came from. AI lands in the\nwork seamlessly, and what it builds fits the business exactly.\n\n**And it's an architecture an IT team can say yes to.** Self-hosting Teable\npackages your own compute into an agent-ready platform for the whole team:\nevery AI session confined to an isolated sandbox, every app shipped as a\nstandard container, everything resting on PostgreSQL and HTTP APIs, with your\nown models and keys, on your own infrastructure. Full AI capability, full\ncontrol — neither traded for the other.\n\nThe result is a different way of building: business systems shaped precisely\nto your business, delivered in days instead of quarters, evolving as fast as\nthe work itself — by everyone on the team, not just the people who code.\n\n# License\n\nThis repository is the Teable Community Edition: free for self-hosting under\nthe AGPL-3.0 license (packages under `packages/` are MIT). See\n[./LICENSE](./LICENSE) for details.\n\nThe official image [`ghcr.io/teableio/teable`](https://github.com/teableio/teable/pkgs/container/teable)\nships the complete product: free to run, with paid plans unlocking AI features\nand advanced enterprise capabilities **in place** — activate with a license\nkey, no image swap, no migration. See [pricing](https://teable.ai/pricing) and\n[subscribe & activate](https://help.teable.ai/en/deploy/activate).\n","default_branch":"develop","files":7495,"tree":[".codeclimate.yml",".dockerignore",".gitattributes",".github/FUNDING.yml",".github/ISSUE_TEMPLATE/bug_report.md",".github/ISSUE_TEMPLATE/feature_request.md",".github/actions/docker-build-push/action.yml",".github/actions/pnpm-install/action.yml",".github/workflows/docker-push.yml",".github/workflows/integration-tests.yml",".github/workflows/linting.yml",".github/workflows/manual-preview.yml",".github/workflows/preview-cleanup.yml",".github/workflows/promote-latest.yml",".github/workflows/publish-release.yml",".github/workflows/templates/preview-template.yaml",".github/workflows/trigger-sync-to-ee.yml",".github/workflows/unit-tests.yml",".github/workflows/v2-benchmark-tests.yml",".github/workflows/v2-core-tests.yml",".gitignore",".gitpod.yml",".husky/commit-msg",".husky/install.mjs",".husky/pre-commit",".idea/modules.xml",".idea/teable.iml",".ncurc.yml",".npmrc",".prettierignore",".prettierrc.js",".vscode/extensions.json",".vscode/launch.json",".vscode/settings.json","AGPL_LICENSE","CODE_OF_CONDUCT.md","CONTRIBUTING.md","LICENSE","Makefile","README.md","SECURITY.md","agents.md","apps/nestjs-backend/.eslintrc.js","apps/nestjs-backend/.gitignore","apps/nestjs-backend/.idea/modules.xml","apps/nestjs-backend/.idea/nestjs-backend.iml","apps/nestjs-backend/README.md","apps/nestjs-backend/nest-cli.json","apps/nestjs-backend/package.json","apps/nestjs-backend/scripts/validate-dual-db-cutover.mjs","apps/nestjs-backend/src/app.module.ts","apps/nestjs-backend/src/bootstrap.ts","apps/nestjs-backend/src/cache/cache.module.ts","apps/nestjs-backend/src/cache/cache.provider.ts","apps/nestjs-backend/src/cache/cache.service.spec.ts","apps/nestjs-backend/src/cache/cache.service.ts","apps/nestjs-backend/src/cache/redis-native.service.ts","apps/nestjs-backend/src/cache/types.ts","apps/nestjs-backend/src/configs/auth.config.ts","apps/nestjs-backend/src/configs/base.config.ts","apps/nestjs-backend/src/configs/bootstrap.config.spec.ts","apps/nestjs-backend/src/configs/bootstrap.config.ts","apps/nestjs-backend/src/configs/cache.config.ts","apps/nestjs-backend/src/configs/computed-outbox-trigger.config.spec.ts","apps/nestjs-backend/src/configs/computed-outbox-trigger.config.ts","apps/nestjs-backend/src/configs/config.module.ts","apps/nestjs-backend/src/configs/config.spec.ts","apps/nestjs-backend/src/configs/env.validation.schema.spec.ts","apps/nestjs-backend/src/configs/env.validation.schema.ts","apps/nestjs-backend/src/configs/logger.config.ts","apps/nestjs-backend/src/configs/mail.config.ts","apps/nestjs-backend/src/configs/oauth.config.ts","apps/nestjs-backend/src/configs/risk-control.config.ts","apps/nestjs-backend/src/configs/storage.ts","apps/nestjs-backend/src/configs/threshold.config.ts","apps/nestjs-backend/src/configs/trash.config.ts","apps/nestjs-backend/src/const.ts","apps/nestjs-backend/src/custom.exception.ts","apps/nestjs-backend/src/db-provider/aggregation-query/aggregation-function.abstract.ts","apps/nestjs-backend/src/db-provider/aggregation-query/aggregation-function.interface.ts","apps/nestjs-backend/src/db-provider/aggregation-query/aggregation-query.abstract.ts","apps/nestjs-backend/src/db-provider/aggregation-query/aggregation-query.interface.ts","apps/nestjs-backend/src/db-provider/aggregation-query/postgres/__tests__/multiple-value-aggregation.adapter.spec.ts","apps/nestjs-backend/src/db-provider/aggregation-query/postgres/aggregation-function.postgres.ts","apps/nestjs-backend/src/db-provider/aggregation-query/postgres/aggregation-query.postgres.ts","apps/nestjs-backend/src/db-provider/aggregation-query/postgres/multiple-value/multiple-value-aggregation.adapter.ts","apps/nestjs-backend/src/db-provider/aggregation-query/postgres/single-value/single-value-aggregation.adapter.ts","apps/nestjs-backend/src/db-provider/base-query/abstract.ts","apps/nestjs-backend/src/db-provider/base-query/base-query.postgres.ts","apps/nestjs-backend/src/db-provider/create-database-column-query/create-database-column-field-visitor.interface.ts","apps/nestjs-backend/src/db-provider/create-database-column-query/create-database-column-field-visitor.postgres.ts","apps/nestjs-backend/src/db-provider/create-database-column-query/create-database-column-field.util.ts","apps/nestjs-backend/src/db-provider/create-database-column-query/index.ts","apps/nestjs-backend/src/db-provider/db.provider.interface.ts","apps/nestjs-backend/src/db-provider/db.provider.ts","apps/nestjs-backend/src/db-provider/drop-database-column-query/drop-database-column-field-visitor.interface.ts","apps/nestjs-backend/src/db-provider/drop-database-column-query/drop-database-column-field-visitor.postgres.ts","apps/nestjs-backend/src/db-provider/drop-database-column-query/index.ts","apps/nestjs-backend/src/db-provider/duplicate-table/abstract.ts","apps/nestjs-backend/src/db-provider/duplicate-table/duplicate-attachment-table-query.abstract.ts","apps/nestjs-backend/src/db-provider/duplicate-table/duplicate-attachment-table-query.postgres.ts","apps/nestjs-backend/src/db-provider/duplicate-table/duplicate-query.postgres.ts","apps/nestjs-backend/src/db-provider/filter-query/__tests__/field-reference.spec.ts","apps/nestjs-backend/src/db-provider/filter-query/__tests__/invalid-filter-skip.spec.ts","apps/nestjs-backend/src/db-provider/filter-query/__tests__/multiple-string-filter-sqli.spec.ts","apps/nestjs-backend/src/db-provider/filter-query/__tests__/numeric-text-filter.spec.ts","apps/nestjs-backend/src/db-provider/filter-query/cell-value-filter.abstract.ts","apps/nestjs-backend/src/db-provider/filter-query/cell-value-filter.interface.ts","apps/nestjs-backend/src/db-provider/filter-query/filter-query.abstract.ts","apps/nestjs-backend/src/db-provider/filter-query/filter-query.interface.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/cell-value-filter.postgres.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/index.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/multiple-value/multiple-boolean-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/multiple-value/multiple-datetime-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/multiple-value/multiple-json-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/multiple-value/multiple-number-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/multiple-value/multiple-string-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/single-value/boolean-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/single-value/datetime-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/single-value/json-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/single-value/number-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/cell-value-filter/single-value/string-cell-value-filter.adapter.ts","apps/nestjs-backend/src/db-provider/filter-query/postgres/filter-query.postgres.ts","apps/nestjs-backend/src/db-provider/formula-default-unit.spec.ts","apps/nestjs-backend/src/db-provider/generated-column-query/generated-column-query-support-validator.spec.ts","apps/nestjs-backend/src/db-provider/generated-column-query/generated-column-query.abstract.ts","apps/nestjs-backend/src/db-provider/generated-column-query/index.ts","apps/nestjs-backend/src/db-provider/generated-column-query/postgres/generated-column-query-support-validator.postgres.ts","apps/nestjs-backend/src/db-provider/generated-column-query/postgres/generated-column-query.postgres.spec.ts","apps/nestjs-backend/src/db-provider/generated-column-query/postgres/generated-column-query.postgres.ts","apps/nestjs-backend/src/db-provider/group-query/format-string.ts","apps/nestjs-backend/src/db-provider/group-query/group-query.abstract.ts","apps/nestjs-backend/src/db-provider/group-query/group-query.interface.ts","apps/nestjs-backend/src/db-provider/group-query/group-query.postgres.ts","apps/nestjs-backend/src/db-provider/index-query/index-abstract-builder.ts","apps/nestjs-backend/src/db-provider/integrity-query/abstract.ts","apps/nestjs-backend/src/db-provider/integrity-query/integrity-query.postgres.ts","apps/nestjs-backend/src/db-provider/postgres.provider.ts","apps/nestjs-backend/src/db-provider/search-query/abstract.ts","apps/nestjs-backend/src/db-provider/search-query/date-search-range.util.ts","apps/nestjs-backend/src/db-provider/search-query/get-offset.ts","apps/nestjs-backend/src/db-provider/search-query/search-index-builder.postgres.spec.ts","apps/nestjs-backend/src/db-provider/search-query/search-index-builder.postgres.ts","apps/nestjs-backend/src/db-provider/search-query/search-query.postgres.spec.ts","apps/nestjs-backend/src/db-provider/search-query/search-query.postgres.ts","apps/nestjs-backend/src/db-provider/search-query/types.ts","apps/nestjs-backend/src/db-provider/select-query/index.ts","apps/nestjs-backend/src/db-provider/select-query/postgres/select-query.postgres.spec.ts","apps/nestjs-backend/src/db-provider/select-query/postgres/select-query.postgres.ts","apps/nestjs-backend/src/db-provider/select-query/select-query.abstract.ts","apps/nestjs-backend/src/db-provider/sort-query/function/sort-function.abstract.ts","apps/nestjs-backend/src/db-provider/sort-query/function/sort-function.interface.ts","apps/nestjs-backend/src/db-provider/sort-query/postgres/multiple-value/multiple-datetime-sort.adapter.ts","apps/nestjs-backend/src/db-provider/sort-query/postgres/multiple-value/multiple-json-sort.adapter.ts","apps/nestjs-backend/src/db-provider/sort-query/postgres/multiple-value/multiple-number-sort.adapter.ts","apps/nestjs-backend/src/db-provider/sort-query/postgres/single-value/date-sort.adapter.ts","apps/nestjs-backend/src/db-provider/sort-query/postgres/single-value/json-sort.adapter.ts","apps/nestjs-backend/src/db-provider/sort-query/postgres/single-value/string-sort.adapter.ts","apps/nestjs-backend/src/db-provider/sort-query/postgres/sort-query.function.ts","apps/nestjs-backend/src/db-provider/sort-query/postgres/sort-query.postgres.ts","apps/nestjs-backend/src/db-provider/sort-query/sort-query.abstract.ts","apps/nestjs-backend/src/db-provider/sort-query/sort-query.interface.ts","apps/nestjs-backend/src/db-provider/utils/datetime-format.util.ts","apps/nestjs-backend/src/db-provider/utils/default-datetime-parse-pattern.spec.ts","apps/nestjs-backend/src/db-provider/utils/default-datetime-parse-pattern.ts","apps/nestjs-backend/src/db-provider/utils/formula-param-metadata.util.ts","apps/nestjs-backend/src/distributed-lock/distributed-lock.module.ts","apps/nestjs-backend/src/distributed-lock/distributed-lock.service.spec.ts","apps/nestjs-backend/src/distributed-lock/distributed-lock.service.ts","apps/nestjs-backend/src/distributed-lock/index.ts","apps/nestjs-backend/src/event-emitter/decorators/emit-controller-event.decorator.ts","apps/nestjs-backend/src/event-emitter/event-emitter.module.ts","apps/nestjs-backend/src/event-emitter/event-emitter.service.ts","apps/nestjs-backend/src/event-emitter/event-job/event-job.module.ts","apps/nestjs-backend/src/event-emitter/event-job/fallback/event-emitter.ts","apps/nestjs-backend/src/event-emitter/event-job/fallback/fallback-queue.module.ts","apps/nestjs-backend/src/event-emitter/event-job/fallback/fallback-queue.service.ts","apps/nestjs-backend/src/event-emitter/event-job/fallback/local-queue.provider.ts","apps/nestjs-backend/src/event-emitter/events/app/app.event.ts","apps/nestjs-backend/src/event-emitter/events/base/base-node.event.ts","apps/nestjs-backend/src/event-emitter/events/base/base.event.ts","apps/nestjs-backend/src/event-emitter/events/base/folder/base.folder.event.ts","apps/nestjs-backend/src/event-emitter/events/core-event.ts","apps/nestjs-backend/src/event-emitter/events/dashboard/dashboard.event.ts","apps/nestjs-backend/src/event-emitter/events/event.enum.ts","apps/nestjs-backend/src/event-emitter/events/index.ts","apps/nestjs-backend/src/event-emitter/events/last-visit/last-visit.event.ts","apps/nestjs-backend/src/event-emitter/events/op-event.ts","apps/nestjs-backend/src/event-emitter/events/space/collaborator.event.ts","apps/nestjs-backend/src/event-emitter/events/space/space.event.ts","apps/nestjs-backend/src/event-emitter/events/table/button.event.ts","apps/nestjs-backend/src/event-emitter/events/table/field.event.ts","apps/nestjs-backend/src/event-emitter/events/table/index.ts","apps/nestjs-backend/src/event-emitter/events/table/record.event.ts","apps/nestjs-backend/src/event-emitter/events/table/table.event.ts","apps/nestjs-backend/src/event-emitter/events/table/view.event.ts","apps/nestjs-backend/src/event-emitter/events/user/user.event.ts","apps/nestjs-backend/src/event-emitter/events/workflow/workflow.event.ts","apps/nestjs-backend/src/event-emitter/interceptor/event.Interceptor.spec.ts","apps/nestjs-backend/src/event-emitter/interceptor/event.Interceptor.ts","apps/nestjs-backend/src/event-emitter/listeners/action-trigger.listener.ts","apps/nestjs-backend/src/event-emitter/listeners/attachment.listener.ts","apps/nestjs-backend/src/event-emitter/listeners/base-permission-update.listener.ts","apps/nestjs-backend/src/event-emitter/listeners/collaborator-invite.listener.spec.ts","apps/nestjs-backend/src/event-emitter/listeners/collaborator-invite.listener.ts","apps/nestjs-backend/src/event-emitter/listeners/collaborator-notification.listener.ts","apps/nestjs-backend/src/event-emitter/listeners/pin.listener.ts","apps/nestjs-backend/src/event-emitter/listeners/record-history.listener.ts","apps/nestjs-backend/src/event-emitter/listeners/trash.listener.ts","apps/nestjs-backend/src/features/access-token/access-token.controller.spec.ts","apps/nestjs-backend/src/features/access-token/access-token.controller.ts","apps/nestjs-backend/src/features/access-token/access-token.encryptor.ts","apps/nestjs-backend/src/features/access-token/access-token.module.ts","apps/nestjs-backend/src/features/access-token/access-token.service.spec.ts","apps/nestjs-backend/src/features/access-token/access-token.service.ts","apps/nestjs-backend/src/features/aggregation/aggregation.module.ts","apps/nestjs-backend/src/features/aggregation/aggregation.service.interface.ts","apps/nestjs-backend/src/features/aggregation/aggregation.service.provider.ts","apps/nestjs-backend/src/features/aggregation/aggregation.service.spec.ts","apps/nestjs-backend/src/features/aggregation/aggregation.service.symbol.ts","apps/nestjs-backend/src/features/aggregation/aggregation.service.ts","apps/nestjs-backend/src/features/aggregation/index.ts","apps/nestjs-backend/src/features/aggregation/open-api/aggregation-open-api.controller.spec.ts","apps/nestjs-backend/src/features/aggregation/open-api/aggregation-open-api.controller.ts","apps/nestjs-backend/src/features/aggregation/open-api/aggregation-open-api.module.ts","apps/nestjs-backend/src/features/aggregation/open-api/aggregation-open-api.service.spec.ts","apps/nestjs-backend/src/features/aggregation/open-api/aggregation-open-api.service.ts","apps/nestjs-backend/src/features/ai/ai-gateway-models.service.spec.ts","apps/nestjs-backend/src/features/ai/ai-gateway-models.service.ts","apps/nestjs-backend/src/features/ai/ai.controller.ts","apps/nestjs-backend/src/features/ai/ai.module.ts","apps/nestjs-backend/src/features/ai/ai.service.spec.ts","apps/nestjs-backend/src/features/ai/ai.service.ts","apps/nestjs-backend/src/features/ai/constant.ts","apps/nestjs-backend/src/features/ai/util.ts","apps/nestjs-backend/src/features/airtable-import/airtable-api.client.ts","apps/nestjs-backend/src/features/airtable-import/airtable-formula-translator.spec.ts","apps/nestjs-backend/src/features/airtable-import/airtable-formula-translator.ts","apps/nestjs-backend/src/features/airtable-import/airtable-import.controller.ts","apps/nestjs-backend/src/features/airtable-import/airtable-import.module.ts","apps/nestjs-backend/src/features/airtable-import/airtable-import.service.spec.ts","apps/nestjs-backend/src/features/airtable-import/airtable-import.service.ts","apps/nestjs-backend/src/features/airtable-import/airtable-link-spill.spec.ts","apps/nestjs-backend/src/features/airtable-import/airtable-link-spill.ts","apps/nestjs-backend/src/features/airtable-import/airtable-record-converter.spec.ts","apps/nestjs-backend/src/features/airtable-import/airtable-record-converter.ts","apps/nestjs-backend/src/features/airtable-import/airtable-rollup-mapper.spec.ts","apps/nestjs-backend/src/features/airtable-import/airtable-rollup-mapper.ts","apps/nestjs-backend/src/features/airtable-import/airtable-schema-mapper.spec.ts","apps/nestjs-backend/src/features/airtable-import/airtable-schema-mapper.ts","apps/nestjs-backend/src/features/airtable-import/airtable-share.client.ts","apps/nestjs-backend/src/features/airtable-import/airtable-token-resolver.ts","apps/nestjs-backend/src/features/airtable-import/airtable-view-config-mapper.spec.ts","apps/nestjs-backend/src/features/airtable-import/airtable-view-config-mapper.ts","apps/nestjs-backend/src/features/airtable-import/airtable.types.ts","apps/nestjs-backend/src/features/airtable-import/test-scripts/airtable-build-test-base.mjs","apps/nestjs-backend/src/features/airtable-import/test-scripts/airtable-field-coverage.mjs","apps/nestjs-backend/src/features/airtable-import/test-scripts/airtable-import-smoke.mjs","apps/nestjs-backend/src/features/airtable-import/test-scripts/airtable-verify-share.mjs","apps/nestjs-backend/src/features/attachments/attachments-crop.module.ts","apps/nestjs-backend/src/features/attachments/attachments-crop.processor.ts","apps/nestjs-backend/src/features/attachments/attachments-storage.module.ts","apps/nestjs-backend/src/features/attachments/attachments-storage.service.ts","apps/nestjs-backend/src/features/attachments/attachments-table.module.ts","apps/nestjs-backend/src/features/attachments/attachments-table.service.spec.ts","apps/nestjs-backend/src/features/attachments/attachments-table.service.ts","apps/nestjs-backend/src/features/attachments/attachments.controller.spec.ts","apps/nestjs-backend/src/features/attachments/attachments.controller.ts","apps/nestjs-backend/src/features/attachments/attachments.module.ts","apps/nestjs-backend/src/features/attachments/attachments.service.spec.ts","apps/nestjs-backend/src/features/attachments/attachments.service.ts","apps/nestjs-backend/src/features/attachments/constant.ts","apps/nestjs-backend/src/features/attachments/guard/auth.guard.ts","apps/nestjs-backend/src/features/attachments/pdf-thumbnail.ts","apps/nestjs-backend/src/features/attachments/plugins/adapter.ts","apps/nestjs-backend/src/features/attachments/plugins/aliyun.ts","apps/nestjs-backend/src/features/attachments/plugins/local.helper.spec.ts","apps/nestjs-backend/src/features/attachments/plugins/local.helper.ts","apps/nestjs-backend/src/features/attachments/plugins/local.spec.ts","apps/nestjs-backend/src/features/attachments/plugins/local.ts","apps/nestjs-backend/src/features/attachments/plugins/minio.ts","apps/nestjs-backend/src/features/attachments/plugins/remote-crop.spec.ts","apps/nestjs-backend/src/features/attachments/plugins/s3.spec.ts","apps/nestjs-backend/src/features/attachments/plugins/s3.ts","apps/nestjs-backend/src/features/attachments/plugins/storage.module.ts","apps/nestjs-backend/src/features/attachments/plugins/storage.ts","apps/nestjs-backend/src/features/attachments/plugins/types.ts","apps/nestjs-backend/src/features/attachments/plugins/utils.ts","apps/nestjs-backend/src/features/attachments/utils.ts","apps/nestjs-backend/src/features/audit/audit-scope.spec.ts","apps/nestjs-backend/src/features/audit/audit-scope.ts","apps/nestjs-backend/src/features/audit/audit.decorator.spec.ts","apps/nestjs-backend/src/features/audit/audit.decorator.ts","apps/nestjs-backend/src/features/audit/audit.module.ts","apps/nestjs-backend/src/features/auth/auth.controller.spec.ts","apps/nestjs-backend/src/features/auth/auth.controller.ts","apps/nestjs-backend/src/features/auth/auth.module.ts","apps/nestjs-backend/src/features/auth/auth.service.spec.ts","apps/nestjs-backend/src/features/auth/auth.service.ts","apps/nestjs-backend/src/features/auth/decorators/allow-anonymous.decorator.ts","apps/nestjs-backend/src/features/auth/decorators/base-node-permissions.decorator.ts","apps/nestjs-backend/src/features/auth/decorators/disabled-permission.decorator.ts","apps/nestjs-backend/src/features/auth/decorators/ensure-login.decorator.ts","apps/nestjs-backend/src/features/auth/decorators/permissions.decorator.ts","apps/nestjs-backend/src/features/auth/decorators/public.decorator.ts","apps/nestjs-backend/src/features/auth/decorators/resource_meta.decorator.ts","apps/nestjs-backend/src/features/auth/decorators/token.decorator.ts","apps/nestjs-backend/src/features/auth/guard/auth.guard.ts","apps/nestjs-backend/src/features/auth/guard/base-node-permission.guard.ts","apps/nestjs-backend/src/features/auth/guard/github.guard.ts","apps/nestjs-backend/src/features/auth/guard/google.guard.ts","apps/nestjs-backend/src/features/auth/guard/local-auth.guard.ts","apps/nestjs-backend/src/features/auth/guard/oidc.guard.ts","apps/nestjs-backend/src/features/auth/guard/permission.guard.spec.ts","apps/nestjs-backend/src/features/auth/guard/permission.guard.ts","apps/nestjs-backend/src/features/auth/guard/social.guard.ts","apps/nestjs-backend/src/features/auth/local-auth/local-auth.controller.ts","apps/nestjs-backend/src/features/auth/local-auth/local-auth.module.ts","apps/nestjs-backend/src/features/auth/local-auth/local-auth.service.ts","apps/nestjs-backend/src/features/auth/oauth/oauth.store.ts","apps/nestjs-backend/src/features/auth/permission.module.ts","apps/nestjs-backend/src/features/auth/permission.service.spec.ts","apps/nestjs-backend/src/features/auth/permission.service.ts","apps/nestjs-backend/src/features/auth/session/session-handle.module.ts","apps/nestjs-backend/src/features/auth/session/session-handle.service.ts","apps/nestjs-backend/src/features/auth/session/session-store.service.spec.ts","apps/nestjs-backend/src/features/auth/session/session-store.service.ts","apps/nestjs-backend/src/features/auth/session/session.module.ts","apps/nestjs-backend/src/features/auth/session/session.serializer.ts","apps/nestjs-backend/src/features/auth/session/session.service.ts","apps/nestjs-backend/src/features/auth/social/controller.adapter.ts","apps/nestjs-backend/src/features/auth/social/github/github.controller.ts","apps/nestjs-backend/src/features/auth/social/github/github.module.ts","apps/nestjs-backend/src/features/auth/social/google/google.controller.ts","apps/nestjs-backend/src/features/auth/social/google/google.module.ts","apps/nestjs-backend/src/features/auth/social/oidc/oidc.controller.ts","apps/nestjs-backend/src/features/auth/social/oidc/oidc.module.ts","apps/nestjs-backend/src/features/auth/social/social.module.ts","apps/nestjs-backend/src/features/auth/strategies/access-token.passport.ts","apps/nestjs-backend/src/features/auth/strategies/access-token.strategy.ts","apps/nestjs-backend/src/features/auth/strategies/anonymous/anonymous.passport.ts","apps/nestjs-backend/src/features/auth/strategies/anonymous/anonymous.strategy.ts","apps/nestjs-backend/src/features/auth/strategies/constant.ts","apps/nestjs-backend/src/features/auth/strategies/github.strategy.ts","apps/nestjs-backend/src/features/auth/strategies/google.strategy.ts","apps/nestjs-backend/src/features/auth/strategies/jwt.strategy.ts","apps/nestjs-backend/src/features/auth/strategies/local.strategy.spec.ts","apps/nestjs-backend/src/features/auth/strategies/local.strategy.ts","apps/nestjs-backend/src/features/auth/strategies/oidc.strategy.ts","apps/nestjs-backend/src/features/auth/strategies/session.passport.ts","apps/nestjs-backend/src/features/auth/strategies/session.strategy.ts","apps/nestjs-backend/src/features/auth/strategies/types.ts","apps/nestjs-backend/src/features/auth/turnstile/turnstile.module.ts","apps/nestjs-backend/src/features/auth/turnstile/turnstile.service.ts","apps/nestjs-backend/src/features/auth/utils.ts","apps/nestjs-backend/src/features/base-node/base-node.controller.ts","apps/nestjs-backend/src/features/base-node/base-node.listener.ts","apps/nestjs-backend/src/features/base-node/base-node.module.ts","apps/nestjs-backend/src/features/base-node/base-node.permission.helper.ts","apps/nestjs-backend/src/features/base-node/base-node.service.spec.ts","apps/nestjs-backend/src/features/base-node/base-node.service.ts","apps/nestjs-backend/src/features/base-node/folder/base-node-folder.controller.ts","apps/nestjs-backend/src/features/base-node/folder/base-node-folder.module.ts","apps/nestjs-backend/src/features/base-node/folder/base-node-folder.service.ts","apps/nestjs-backend/src/features/base-node/helper.ts","apps/nestjs-backend/src/features/base-node/types.ts","apps/nestjs-backend/src/features/base-share/base-share-auth.service.ts","apps/nestjs-backend/src/features/base-share/base-share-open.controller.ts","apps/nestjs-backend/src/features/base-share/base-share.controller.ts","apps/nestjs-backend/src/features/base-share/base-share.module.ts","apps/nestjs-backend/src/features/base-share/base-share.service.ts","apps/nestjs-backend/src/features/base-share/guard/base-share-auth-local.guard.ts","apps/nestjs-backend/src/features/base-share/guard/base-share-auth.guard.ts","apps/nestjs-backend/src/features/base-share/guard/constant.ts","apps/nestjs-backend/src/features/base-share/strategies/jwt.strategy.ts","apps/nestjs-backend/src/features/base-sql-executor/allowed-functions.ts","apps/nestjs-backend/src/features/base-sql-executor/base-sql-executor.module.ts","apps/nestjs-backend/src/features/base-sql-executor/base-sql-executor.service.spec.ts","apps/nestjs-backend/src/features/base-sql-executor/base-sql-executor.service.ts","apps/nestjs-backend/src/features/base-sql-executor/const.ts","apps/nestjs-backend/src/features/base-sql-executor/utils.spec.ts","apps/nestjs-backend/src/features/base-sql-executor/utils.ts","apps/nestjs-backend/src/features/base/BatchProcessor.class.ts","apps/nestjs-backend/src/features/base/base-controller.spec.ts","apps/nestjs-backend/src/features/base/base-data-db-move.constants.ts","apps/nestjs-backend/src/features/base/base-data-db-move.service.spec.ts","apps/nestjs-backend/src/features/base/base-data-db-move.service.ts","apps/nestjs-backend/src/features/base/base-duplicate-v2.service.ts","apps/nestjs-backend/src/features/base/base-duplicate.service.spec.ts","apps/nestjs-backend/src/features/base/base-duplicate.service.ts","apps/nestjs-backend/src/features/base/base-export-v2.service.ts","apps/nestjs-backend/src/features/base/base-export.service.ts","apps/nestjs-backend/src/features/base/base-freeze.service.spec.ts","apps/nestjs-backend/src/features/base/base-import-processor/base-import-attachments-csv.module.ts","apps/nestjs-backend/src/features/base/base-import-processor/base-import-attachments-csv.processor.ts","apps/nestjs-backend/src/features/base/base-import-processor/base-import-attachments.module.ts","apps/nestjs-backend/src/features/base/base-import-processor/base-import-attachments.processor.ts","apps/nestjs-backend/src/features/base/base-import-processor/base-import-csv.module.ts","apps/nestjs-backend/src/features/base/base-import-processor/base-import-csv.processor.spec.ts","apps/nestjs-backend/src/features/base/base-import-processor/base-import-csv.processor.ts"],"storefront":"/r/teableio","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/teableio/teable/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}