# FAQs URL: /docs/product-docs/FAQs General FAQs ## How to upgrade NocoDB ? * Please see [here](/docs/self-hosting/upgrading) ## What is available in free version ? * [Detailed comparison of Community Edition vs Enterprise Edition is here](/docs/product-docs/cloud-enterprise-edition/community-vs-paid-editions). * NocoDB has just one community edition version which is free forever. * In it you will notice advanced features are all available for free. * ACL * Collaboration * Advanced Views : Form View, Gallery View & Kanban View * Share View * Embed View * Password protected View * Automations * API Token Support * And we would never move these features from free to an enterprise version of NocoDB. * There is no limitations to number of bases, records or fields either. ## Is NocoDB available on the cloud? Yes! NocoDB is currently available in technical preview. You can simply signup by clicking [here](https://app.nocodb.com/#/signin?utm_source=OSS\&utm_medium=OSS\&utm_campaign=OSS\&utm_content=OSS). ## Why is the feature I need not in Community Edition? We know it can be disappointing when a feature you need isn’t available in community edition. But before we react, let’s reflect: NocoDB community edition is empowering over 20,000 companies — for free without any cost. In the sector of software that often takes, we choose to give. Yet, to continue serving with integrity, some capabilities are part of our paid plans — not as a barrier, but as a way to sustain the service for all. Should you need these features, you’re welcome to support us through the cloud or a self-hosted license. ## Scrollbar disappears, how should I make it visible always? NocoDB follows the system settings for scrollbars. If you have configured your system to always show scrollbars, NocoDB will respect that setting. If you want to change this behavior, you can adjust your system settings accordingly. image ## How to check my Base info in the community edition ? * You can open `Base context menu` and click `Copy Base Info`. image You should see the similar result as below. ``` Node: **v20.15.1** Arch: **x64** Platform: **linux** Docker: **true** RootDB: **pg** PackageVersion: **0.258.2** ``` ## What are the official socials for NocoDB? * Youtube: [https://www.youtube.com/@nocodb](https://www.youtube.com/@nocodb) * Twitter: [https://twitter.com/nocodb](https://twitter.com/nocodb) * Discord: [http://discord.nocodb.com/](http://discord.nocodb.com/) * GitHub: [https://github.com/nocodb/nocodb](https://github.com/nocodb/nocodb) * Community Forums: [https://community.nocodb.com/](https://community.nocodb.com/) * LinkedIn: [https://www.linkedin.com/company/nocodb](https://www.linkedin.com/company/nocodb) * Reddit: [https://www.reddit.com/r/NocoDB/](https://www.reddit.com/r/NocoDB/) ## SSO (Single Sign-On) FAQs For all questions related to SSO, please see the dedicated SSO FAQ section: [SSO FAQs](/docs/product-docs/account-settings/authentication/FAQs) # Welcome URL: /docs/product-docs NocoDB Documentation image NocoDB is a no-code database platform that allows teams to collaborate and build processes with ease of a familiar and intuitive spreadsheet interface. This allows even non-developers or business users to become software creators. ## Features ### Rich Spreadsheet Interface * Basic Operations: Create, Read, Update and Delete on Tables, Fields, and Records * Fields Operations: Sort, Filter, Group By, Search, Hide / Reorder Fields * Rich Field Types: Text, Number, Date/Time, Select, Attachment, Formula, Links, Lookup, Rollup and more * Multiple View Types: Grid (default), Form, Gallery, Kanban, Calendar, Timeline, List and Map * View Permissions: Collaborative Views, Locked Views, and Personal Views * Share Bases / Views: Public or Private (with Password Protection) * Access Control with Roles: Fine-grained access control at Workspace, Base, Table, Field, and Record levels ### Automation & Scripting * Workflows: Visual workflow builder with triggers, actions, conditions, and loops (beta) * Scripts: JavaScript-based automation with full API access to bases, tables, fields, and records * Webhooks: Event-driven notifications on record create, update, and delete ### Dashboards & Extensions * Dashboards: Build visual dashboards with chart widgets (Bar, Line, Pie, Donut), numbers, text, and iframes * Extensions: Bulk Update, Data Exporter, Dedupe, Org Chart, Page Designer, URL Preview, and more ### AI & Integrations * NocoAI: AI-assisted creation of bases, tables, fields, views, filters, formulas, and select options * NocoDocs: Built-in document editor with rich text, comments, AI assistant, and permissions * NocoSync: Sync data from GitHub, GitLab, Bitbucket, and Linear * Integrations: Connect external data sources (PostgreSQL, MySQL, SQL Server, and more) ### Programmatic Access * REST APIs * MCP Server: Model Context Protocol server for AI agent integration ## Why are we building this? Most internet businesses equip themselves with either spreadsheet or a database to solve their business needs. Spreadsheets are used by a Billion+ humans collaboratively every single day. However, we are way off working at similar speeds on databases which are way more powerful tools when it comes to computing. Attempts to solve this with SaaS offerings has meant horrible access controls, vendor lockin, data lockin, abrupt price changes & most importantly a glass ceiling on what's possible in the future. ## Our Mission Our mission is to provide the most powerful no-code interface for databases, accessible to every internet business across the world. By making this capability broadly available under a fair and sustainable model, we aim to democratise access to powerful computing tools and enable a billion-plus people to develop radical tinkering and building abilities on the internet. Follow us for updates, content, and other activities with our community: * [Youtube](https://www.youtube.com/@nocodb) * [Twitter](https://twitter.com/nocodb) * [Discord](http://discord.nocodb.com/) * [GitHub](https://github.com/nocodb/nocodb) * [Community Forums](https://community.nocodb.com/) * [LinkedIn](https://www.linkedin.com/company/nocodb) * [Reddit](https://www.reddit.com/r/NocoDB/) # MCP Server URL: /docs/product-docs/mcp Connect NocoDB to Large Language Models (LLMs) via the Model Context Protocol (MCP). The **Model Context Protocol (MCP) Server** lets you connect NocoDB with LLMs that support MCP, such as Claude, Cursor, or Windsurf. With this integration, LLMs can interact directly with your NocoDB base to create, query, update, and manage records. ## Desktop LLM Clients Each MCP endpoint in NocoDB provides a secure URL that can be linked to an MCP-compatible client. Once configured, the LLM can execute database operations in your workspace through natural language prompts. MCP server exposes standard CRUD operations. These can be triggered conversationally, without writing SQL or scripts. | Action | Purpose | Sample Prompt | | ------ | -------------------- | ------------------------------------------------------------- | | Create | Add new records | Create a task named ‘Review Documentation’ | | Read | Look up information | Show me all projects with deadlines this week | | Update | Change existing data | Mark the status of Project X as completed & re-assign to John | | Delete | Remove records | Remove all tasks assigned to John | NocoDB MCP supports only record-level operations and does not handle table, field, or other metadata changes. ### Server Configuration (NocoDB) 1. Click on the **Overview** button in the left sidebar. 2. Select the **Settings** tab. 3. Select the **Model Context Protocol** 4. Click on the **New MCP Endpoint** to create a new MCP config JSON for your base. 5. Provide a name for the MCP endpoint 6. Click **Create** to generate the MCP Config JSON. 7. Copy the generated JSON configuration. This will be used in your LLM client configuration. MCP Config MCP Config ### Client Configuration #### Claude 1. Open **Claude Desktop Preferences** (`⌘+,`). 2. Under **Develop**, click **Edit Config**. 3. Insert the JSON block copied [here](#server-configuration-nocodb) as `claude_desktop_config.json`. 4. Save the file and restart Claude Desktop. #### Cursor 1. Go to **Cursor Settings** (`⇧+⌘+J`). 2. Open the **MCP** tab and select **Add Custom MCP**. 3. Paste the JSON block copied [here](#server-configuration-nocodb). Save. On success, you will see `11 tools enabled` below the MCP Server just installed. If you see an error, double-check the JSON configuration. Cursor MCP Settings #### Windsurf 1. Open **Windsurf Settings** (`⌘+,`). 2. In the **Cascade** section > `Plugins (MCP Server)` > Click **Manage Plugins** 3. Paste the JSON block copied [here](#server-configuration-nocodb). Save. Windsurf MCP Settings Windsurf MCP Settings ### JSON Example ```json { "mcpServers": { "NocoDB MCP": { "command": "npx", "args": [ "mcp-remote", "https://your-domain.com/mcp/", "--header", "xc-mcp-token: " ] } } } ``` Your MCP configurations generated above functions as a set of access credentials, granting full control over your NocoDB base. Ensure it remains confidential, never include it in source control, and store it only in secure, protected locations. *** ## Web based LLM Clients (OAuth) Connect NocoDB to web-based LLM applications using OAuth, enabling seamless database access directly from the browser without requiring desktop client setup. This approach grants granular permission controls and eliminates the need for manual JSON configuration. ### Claude Web OAuth-based integration allows Claude web users to access NocoDB databases through the connectors interface. #### Setup Steps 1. Click [here](https://claude.ai/settings/connectors) to open Claude Web Settings in a new tab. * Alternatively, navigate to **Settings** > **Connectors** from the Claude Web app. 2. Click **Add custom connector**. open-connectors 3. In the "Add custom connector" dialog: * Provide a connector name of your choice * Enter the MCP endpoint URL: `https://app.nocodb.com/mcp` * Click `Add` add-connector-dialog 4. NocoDB Connector will now be listed in "Disconnected" state. Click **Connect** to initiate the OAuth authorization flow (Opens in a new tab). add-connector 5. Authorize Access * You will be asked to log in to your NocoDB account (if not already logged in) * Select the workspace and base you want to connect * Confirm the permissions Claude will have * Access the selected base * Read / create / update / delete records in the selected base * Act on your behalf within the selected resources * Click **Authorize** to grant access authorize-access With this, the NocoDB connector will move to "Connected" state in Claude Web. You can now interact with your NocoDB data through Claude web application. On-prem enterprise users should replace [https://app.nocodb.com](https://app.nocodb.com) with their NocoDB instance URL #### Configure Tool Permissions By default, all tools are set to "Always ask permission" to ensure you have control over each operation Claude performs. You can modify these settings as needed. Click [here](https://claude.ai/settings/connectors) to open Claude Web Settings in a new tab. Click **Configure** on the NocoDB connector to manage tool permissions. Set each tool's permission level using the dropdown menu: * **Always ask permission** — Your approval is required every time Claude uses this tool * **Allow unsupervised** — Claude can use this tool without requesting approval tool-permissions tool-permissions To retrieve Workspace & Base information that this connector has access to, use the "Get Base Info" tool. get-base-info #### Using NocoDB Tools in Claude Web Once configured, you can interact with your NocoDB data conversationally. For example: * "Show me all projects with deadlines this week" * "Create a task named 'Review Documentation'" * "Mark the status of Project X as completed and reassign to John" * "Provide details of our top 3 sponsors" Claude will execute these requests using the enabled NocoDB tools, reading from and writing to your database based on the permissions you've granted. connected-connector OAuth authorization functions as a set of access credentials granting Claude control over your NocoDB base within the selected workspace. Only authorize access to bases and operations you trust Claude to perform on your behalf. ### ChatGPT OAuth-based integration enables OpenAI web users (ChatGPT) to securely connect with NocoDB databases through the MCP connector, directly from their browser environment. This provides the same granular access control and eliminates the need for manual configuration or desktop client setup. #### Prerequisites Enable Developer Mode in ChatGPT settings to allow custom connector additions. 1. Open [ChatGPT Settings](https://chatgpt.com/#settings/Connectors) in a new tab. * Alternatively, click your **Profile Icon** → **Settings** → **Settings** → **Apps & Connectors**). 2. Click **Advanced Settings** & enable **Developer Mode**. open-connectors #### Setup Steps 1. Open [ChatGPT Settings](https://chatgpt.com/#settings/Connectors) in a new tab. * Alternatively, click your **Profile Icon** → **Settings** → **Settings** → **Apps & Connectors**). 2. Click **Create** button in top right corner of the **Connectors** modal. 3. In the "New connector" dialog: * Provide a connector name of your choice. Optionally, add a description / icon. * Enter the MCP Server URL: `https://app.nocodb.com/mcp` * Check the box for **I trust this application**. * Click `Create` new-connector 4. Authorize Access: * Log in to your NocoDB account if prompted * Select the workspace and base you want to connect * Review and confirm the permissions being requested: * Access to the selected base * Read / create / update / delete records * Act on your behalf within the selected resources * Click **Authorize** Once authorization completes, you will see a confirmation message in ChatGPT Web indicating the NocoDB connector is now connected. connected For on-prem enterprise users, replace `https://app.nocodb.com` with your NocoDB instance URL. #### Using NocoDB Tools in OpenAI Web On the ChatGPT interface, start a new conversation and * Click the **+** icon to open the "Tools" menu, enable `Developer Mode` if not already enabled. * Click `More` to find and select the NocoDB connector you created. Toggle to enable it. using-connector Once configured, you can query or update your NocoDB data conversationally. For example: * “List all open support tickets assigned to me” * “Add a new contact named ‘Alice Chen’ to the CRM base” * “Update the status of Order #2456 to ‘Shipped’” * “Summarize total revenue by month from the Sales base” ChatGPT executes these actions using the connected NocoDB tools according to the permissions granted. OAuth authorization provides ChatGPT controlled access to your NocoDB base within the selected workspace. Only authorize operations and bases you trust ChatGPT to manage on your behalf. *** # Skills URL: /docs/product-docs/skills Extend Claude's capabilities with the NocoDB skill for managing nocodb bases through natural language. #### Setup * Download the [NocoDB Skill](/nocodb-skills.zip) * Get your API token from NocoDB * Upload the skill to Claude * Configure environment variables #### Usage Claude automatically uses the skill when relevant. Interact with your databases using natural language: | Action | Sample Prompt | | --------------- | ------------------------------------------------- | | List workspaces | "Show me all my NocoDB workspaces" | | View tables | "List all tables in my Sales base" | | Query records | "Show me all customers from New York" | | Create records | "Add a new task called 'Review Documentation'" | | Update records | "Mark order #123 as shipped" | | Delete records | "Remove all completed tasks from last month" | | Filter data | "Find all high-priority tickets that are overdue" | #### Supported Operations * **Workspaces**: List, create, update, delete, manage members * **Bases**: List, create, update, delete * **Tables**: List, create, update, delete * **Fields**: List, create, update, delete (all field types) * **Views**: List, create, update, delete (grid, gallery, kanban, calendar) * **Records**: List, get, create, update, delete, count with filtering * **Linked Records**: List, add, remove relationships * **Filters & Sorts**: Create view-level filters and sorts * **Attachments**: Upload files to records #### Related * [MCP Server](/docs/product-docs/mcp) - Connect NocoDB to LLMs via Model Context Protocol # Table details URL: /docs/product-docs/table-details Manage fields, relations, APIs, and webhooks for your table `Table Details` helps **creators** manage table structure and integrate with external systems. Access it using the `Data-Details` toggle in the top navbar. image ## Fields Manage all your fields in one place — add, edit, delete, or reorder using the multi-field editor. Learn more about the [multi-field editor](/docs/product-docs/fields/multi-fields-editor). image ## Permissions Control who can add / delete records in your table & who can edit fields. Refer to the [Table permissions](/docs/product-docs/roles-and-permissions/table-permissions) and [Field permissions](/docs/product-docs/roles-and-permissions/field-permissions) documentation for more details. image ## Relations Visualize and manage how tables connect using the Entity Relationship Diagram (ERD). This helps in: * Designing your schema * Ensuring data integrity * Improving query performance Drag-and-drop to rearrange tables in the ERD. Layout changes aren’t saved across sessions. image ## API Snippet Use prebuilt REST API examples to interact with your table programmatically — in Shell, JavaScript, Python, and more. Ideal for quickly connecting NocoDB to your applications. image ### Supported languages * **Shell:** cURL, wget * **JavaScript:** Axios, Fetch, jQuery, XHR * **Node:** Axios, Fetch, Request, Native, Unirest * **NocoDB SDK:** JavaScript, Node * **Python:** http.client, requests * **PHP**, **Ruby**, **Java**, **C** ## Webhooks Set up real-time triggers when records change. Use webhooks to: * Send instant alerts * Automate external workflows * Sync data across platforms * Handle batch updates efficiently image Webhooks are defined per table. More details [here](/docs/product-docs/automation/webhook) . *** # API tokens URL: /docs/product-docs/account-settings/api-tokens This article explains how to create and work with API Tokens, including fine-grained tokens with scoped permissions. NocoDB supports two types of API tokens: * **Fine-grained tokens** — Scoped to specific bases with granular permission categories. Recommended for all new integrations. * **Legacy tokens** — Org-wide tokens that inherit the creator's full role permissions. *** ## Fine-Grained API Tokens Fine-grained API tokens give you precise control over what external integrations, scripts, and CI/CD pipelines can do in NocoDB. Unlike legacy tokens, fine-grained tokens let you restrict access to specific bases with granular permission categories. Fine-grained tokens are available on all tiers. Granular scope and permission controls (base selection, permission categories) are available on **Business** and above plans (Cloud) and **licensed Self-hosted** . On Community Edition and unlicensed Self-hosted, tokens default to all-resources access. ### Key Concepts * **Intersection model** — A token can only *restrict* what your role already allows. It never grants additional permissions beyond your role. * **Deny by default** — Only permission categories you explicitly add are granted. Everything else is denied. * **Show-once token** — The token string is displayed only at creation time and cannot be retrieved later. The token is stored as a SHA-256 hash — the plaintext is never persisted. ### Create a Fine-Grained Token Navigate to **Account Settings** > **API Tokens** and click **Create new token**. This opens a single-page form with four sections. Create token form #### Name Give your token a descriptive name that identifies its purpose (e.g., "CI/CD Pipeline", "Zapier Integration"). The name must be between 1 and 255 characters. #### Scopes (Permissions) Define what operations this token can perform. Permissions use an additive model — start with no permissions and add only the categories you need. Click **+ Add permission** to open a dropdown listing all available permission categories. Select a category to add it. Add permission dropdown Each added category appears as a row with an access-level pill that defaults to **Read only**. Click the pill to switch between: Access level dropdown * **Read only** — Read-level access for that category * **Read & write** — Full read and write access for that category To remove a category, click the **×** button on its row. Any category not explicitly added will have no access. The eight permission categories are: | Category | Read only | Read & write | | --------------------------------------------------- | ------------------------ | ---------------------------- | | **Records** — record CRUD, data export, aggregation | List, read, export | Create, update, delete | | **Comments** — record comments | View comments | Post, edit, delete | | **Tables** — table management | List, read | Create, update, delete | | **Fields** — column/field management | List columns | Create, update, delete | | **Views** — views, sorts, filters, sharing | List views and config | Create, update, delete | | **Webhooks** — webhook triggers and logs | List, view logs | Create, update, delete, test | | **Base** — base settings, sources, jobs | View info, swagger, jobs | Create sources, delete base | | **Users** — base and workspace members | List members | Invite, update roles, remove | #### Access (Resource Scope) Define which resources this token can access. Two options are available: * **Add all resources** — Token can access all current and future bases across all workspaces. * **Add a base** — Opens a searchable dropdown with bases grouped by workspace. Select individual bases to grant access. Add a base dropdown You can add multiple bases. Selected resources appear in a bordered list where each item can be removed with the **×** button. If you add "All resources", any previously selected individual bases are cleared. All resources selected At least one resource must be selected on licensed plans. Use **Add all resources** for org-wide access, or **Add a base** to restrict to specific bases. On Community Edition and unlicensed Self-hosted, tokens automatically have all-resources access. #### Expiration Choose an expiration period from the dropdown: * **7 days**, **30 days**, **60 days**, **90 days** (default), **1 year** — preset options * **Custom** — pick a specific date * **No expiration** — the token never expires We recommend setting an expiration for better security. Expired tokens are automatically rejected. Here is an example of a completed form with permissions and base scope configured: Filled create token form Click **Create Token** to generate the token. #### Copy Your Token After creation, a modal displays the token string **once**. Copy it immediately and store it securely. The token format is `nc_pat_` followed by 40 random characters: ``` nc_pat_V1StGXR8_Z5jdHi2B-xoMwDqE3G4n5p6q7r8s ``` The **Done** button is only enabled after you copy the token. Token created modal This token will not be displayed again after you close this dialog. If you lose it, you must delete the token and create a new one. ### Manage Tokens The token list shows all your API tokens with columns: **Active** (toggle), **Token Name**, **Creator** (with avatar and email), **Expires On**, and **Actions**. Token list Fine-grained tokens display an **Expired** badge (red) when past their expiry date, and an **SSO** badge (orange) if created through SSO authentication. #### Token Actions Each token row provides action icons: * **Edit** (pencil icon) — Opens the edit form inline, replacing the list view. * **Delete** (trash icon) — Opens a confirmation dialog to permanently delete the token. #### Edit a Token Clicking edit opens the same form used for creation, pre-filled with the token's current values. You can update: * **Token name** — Change the descriptive name * **Scopes (Permissions)** — Add, remove, or change permission categories and their access levels * **Access (Resource Scope)** — Add or remove bases, or switch to all resources * **Expiration** — Extend or set a new expiry date. A **Keep** option preserves the current expiry. Expiration dropdown in edit mode Click **Save** to apply changes, or **Cancel** to return to the token list. #### Enable / Disable a Token Use the **Active** toggle on any token row to enable or disable it. A disabled token receives `401 Unauthorized` on all requests. Re-enable it at any time to restore access. This is useful for: * Investigating suspicious activity without permanently revoking access * Temporarily pausing an integration during maintenance ### Permission Enforcement For each API request, the system checks: 1. **Is the token valid?** — exists, not expired, enabled 2. **Does the scope match?** — if base-scoped, the requested base must be in the token's scope 3. **Does the user's role allow this operation?** — standard role-based ACL check 4. **Does the token's permission level allow this operation?** — operation mapped to a category and checked against the token's level All four checks must pass. The effective permission is the **intersection** of the user's role and the token's granted permissions. | Scenario | HTTP Status | | --------------------------------------------- | ----------- | | Token is valid and has sufficient permissions | `200` | | Token is expired | `401` | | Token is disabled | `401` | | Token does not exist or is malformed | `401` | | Token scope does not match the requested base | `401` | | Token permission level is insufficient | `403` | *** ## Legacy API Tokens Legacy token creation is no longer available in the UI. The V1 API still supports creating them for backward compatibility, but we recommend using fine-grained tokens for all new integrations. Legacy tokens are org-scoped and inherit the creator's full role permissions. They remain functional for backward compatibility but we recommend migrating to fine-grained tokens for better security and control. ### Create a Legacy Token (Deprecated) 1. Click on `User menu` in the bottom left corner of the sidebar 2. Select `Account Settings` from the dropdown profile page 3. Click on `Tokens` tab in the `Account Settings` page 4. Click on `Add New API Token` 5. Enter the name for the API Token 6. Click on `Save` button to save the changes 7. Copy the API Token by clicking on `Copy` button displayed under `Actions` menu Create API Token Create API Token Legacy API tokens do not expire, but can be deleted anytime. API Token created will get added to the list. Copy API token by clicking on `Copy` button displayed under `Actions` menu. Create API Token ### Delete a Token All services using the API token will stop working once the token is deleted. 1. Click on `User menu` in the bottom left corner of the sidebar 2. Select `Account Settings` from the dropdown 3. Click on `Tokens` tab in the `Account Settings` page 4. From the `Actions` menu, click on `Delete` button associated with the API token to be deleted Delete API Token *** ## Authentication Both fine-grained and legacy tokens support two authentication methods: ### Method 1: xc-token Header ```bash curl -H "xc-token: nc_pat_..." https://your-nocodb.com/api/v3/... ``` ### Method 2: Authorization Header ```bash curl -H "Authorization: Bearer nc_pat_..." https://your-nocodb.com/api/v3/... ``` Both methods are equivalent. Choose the one that best fits your application's authentication patterns. *** ## Security Best Practices 1. **Set an expiration** — Use the shortest expiry that meets your needs. 90 days is a good default. 2. **Use the least permissions necessary** — A read-only dashboard only needs `Records: Read`. 3. **Scope to specific bases** — Avoid "All resources" when the integration only needs access to one base. 4. **Rotate tokens regularly** — Create a new token, update your integration, then delete the old one. 5. **Disable before deleting** — If you suspect a token is compromised, disable it immediately via the Active toggle to investigate before deleting. 6. **Store tokens securely** — Use environment variables or a secrets manager. Never hardcode tokens in source code. 7. **Audit your tokens** — Periodically review your token list. Delete tokens that are no longer needed. *** ## API Token Access with SSO-Enabled Workspaces If a workspace is configured to enforce Single Sign-On (SSO), API access to that workspace is restricted to tokens that are created **after authenticating via SSO**. **Tokens created before SSO was enabled** do not have the necessary identity context and **will not work** for SSO-enforced workspaces. To access an SSO-enforced workspace via API, users must: 1. Sign in using SSO. 2. Generate a new API token from their authenticated session. Tokens created before SSO enforcement may still work for other workspaces that do not require SSO. For ease of identification, tokens created after SSO is enabled will have a badge indicating they were generated through SSO authentication. API Token SSO Badge ### What Happens When SSO is Disabled? If SSO is later disabled for a workspace: * API tokens that were created via SSO authentication will **continue to work** as long as the user is still active and has the required permissions. * Tokens created prior to enabling SSO will continue to function & can now access the workspace without SSO authentication. * No tokens are automatically revoked when SSO is disabled. # Appearance URL: /docs/product-docs/account-settings/appearance This article explains how to customize the appearance of the NocoDB interface, including switching between Light and Dark modes. NocoDB allows you to customize the visual appearance of the interface to suit your working preferences and environment. ## Dark mode Dark mode reduces screen glare and can be more comfortable for extended usage, especially in low-light environments. ### Switching between modes You can quickly switch between **Light** and **Dark** modes using the mode switch icon available in the left-side mini bar. 1. Locate the **Appearance** (sun/moon) icon in the left mini bar. 2. Click the icon to toggle between **Light** and **Dark** modes. Appearance mode switch Appearance mode switch Appearance settings are applied instantly and stored in the browser’s local storage. This means that the selected mode will persist across sessions on the same browser. *** # Experimental Features URL: /docs/product-docs/account-settings/experimental-features Learn how to enable or disable experimental features in NocoDB to try out new capabilities before they are generally available. NocoDB includes an **Experimental Features** panel that lets you try out new capabilities before they are generally available. These features are still under development and may change or be removed in future releases. ## Accessing Experimental Features 1. Click on your **profile picture** in the bottom-left corner of the sidebar. 2. Select **Experimental Features** from the menu. Experimental Features menu A panel opens listing all available experimental features, each with a toggle to enable or disable it and a brief description of what it does. Experimental Features panel ## Available Experimental Features | Feature | Description | | -------------------------- | --------------------------------------------------------------------------------------------------- | | **Bases V3** | Experience the next generation of NocoDB with Bases V3 with enhanced performance and optimizations. | | **Infinite Scrolling** | Effortlessly browse large datasets with infinite scrolling. | | **Link To Another Record** | Show linked record display value in Link fields. | | **Cross Base Link** | Enables link creation between tables in different bases. | | **Custom Link** | Allows user to create custom links using existing fields. | | **Templates** | Enable templates feature to browse and use templates. | | **Optimized Kanban View** | Optimized Kanban view with optimised API for better performance. | | **Map View** | Enable map view to visualize geo data fields on an interactive map. | | **Timeline View** | Enable timeline view to visualize date-based data on a timeline. | The list of experimental features may vary across NocoDB versions as new features are added and existing ones are promoted to general availability. Additionally, the available features can differ depending on your deployment type — NocoDB Cloud, self-hosted licensed (Enterprise), or self-hosted OSS. ## Toggle All Features Use the **toggle all** switch at the top of the panel to enable or disable all experimental features at once. You can also use the **search bar** to quickly find a specific feature. Experimental features may be unstable or incomplete. Use them with caution in production environments. *** # Language settings URL: /docs/product-docs/account-settings/language This article explains how to change the language settings in NocoDB. Language support is currently in beta. Some parts of the interface may still appear in English, as translations might be incomplete or missing. NocoDB supports multiple languages for its user interface to help users work in their preferred language. You can change the language directly from the app: 1. Click on your profile picture in the bottom-left corner. 2. Select **Language** from the dropdown menu. 3. Choose from the list of available languages. image The translations in NocoDB are community-driven and enhanced using AI-generated translations. As a result, some phrases or words may be inaccurate or not fully localized. We appreciate your help in improving translations! ## Contribute to Translations You can help improve translations or add support for new languages through our community translation platform on [Crowdin](https://crowdin.com). * NocoDB Project link: [https://crowdin.com/project/nocodb](https://crowdin.com/project/nocodb) To contribute: * Sign up or log in to Crowdin. * Join the NocoDB project. * Select your language and start translating or reviewing existing translations. For more details, refer [here](/docs/product-docs/engineering/translation) Every contribution helps make NocoDB more accessible across the world! *** # In Community Edition URL: /docs/product-docs/account-settings/oss-specific-details This article explains Account settings specifics in Community Edition NocoDB. Some of the Account settings features are available only in Community Edition NocoDB. This article explains details about such specifics. ## Enable / Disable Signup Signup without an invitation is disabled by default and can be managed from UI by a super admin. Invite only signup ## App Store App store lists available integrations for NocoDB. You can install and configure these integrations from the App store. App Store We provide different integrations in three main categories. | Category | App Name | | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Chat** | Microsoft Teams
Discord
Twilio
Whatsapp Twilio
Mattermost
Slack | | **Email** | SMTP
MailerSend
AWS SES | | **Storage** | AWS S3
Minio
Google Cloud Storage
Spaces
Backblaze B2
Vultr Object Storage
OvhCloud Object Storage
Linode Object Storage
UpCloud Object Storage
Scaleway Object Storage | # Profile page URL: /docs/product-docs/account-settings/profile-page This article explains how to manage your profile page. Profile page is the place where you can manage your profile information. Currently, only a custom username can be setup as part of profile configuration. To access your profile page, 1. Click on `User menu` in the bottom left corner of the sidebar, 2. Select `Account Settings` from the dropdown 3. Change `Profile name` 4. Click on `Save` button to save the changes delete account profile page ## Delete Account This option is available currently only for the cloud users. To delete your account permanently, 1. Click on `User menu` in the bottom left corner of the sidebar, 2. Select `Account Settings` from the dropdown 3. In the section for delete account, click on `Delete Account` button 4. Confirmation modal displays the Workspaces, Bases & Tokens that will be invalidated upon deletion. As a confirmation step, you will be asked to enter your email address associated with the account. 5. Click on `Delete Account` button to delete the account permanently. delete account delete account delete account * Deleting the account is irreversible and all the data associated with the account will be lost permanently. * All the workspaces & bases for which you are the sole owner will be deleted. For all other workspaces & bases, you access permissions will be revoked. * All the tokens associated with the account will be invalidated. * You will be allowed to re-register with the same email address. However, you will require invite from the existing workspace owner to access the workspaces & bases. # Admin Panel URL: /docs/product-docs/cloud-enterprise-edition/admin-panel This article explains how to use the Admin Panel in Cloud & Self hosted Enterprise Edition. The Admin Panel in NocoDB provides organization-level oversight and control. It allows administrators to monitor usage metrics, manage workspaces and bases, provision and track users, configure Single Sign-On (SSO), and update branding settings. This guide walks through each section available within the Admin Panel to help administrators maintain governance, enforce security, and keep user and workspace configurations aligned with organizational standards. ## Navigation Overview Admin panel is accessible for users with administrative privileges. To access the Admin Panel, click on the **Admin Panel** option located in the user menu in the bottom-left corner of the NocoDB interface. image The Admin Panel interface includes a sidebar menu with persistent access to the following sections: * Dashboard * Workspaces * Bases * User Management * Single Sign-On (SSO) * Teams * SCIM * Settings Use the **Back** button in the top-left corner to return to the main NocoDB application interface. ### Dashboard The Dashboard offers a high-level overview of key metrics across your NocoDB deployment. It acts as a basic control center for admins to monitor system usage and understand the scale of their organization’s data and user base. While the current functionality is limited, the visual summaries make it easy to track a few critical numbers at a glance. image **Displayed Metrics:** * **Workspaces** – Number of workspaces created within the organization. * **Users** – Count of unique users who are part of the organization. * **Bases** – Total number of bases created across all workspaces. * **Editors** – Number of users with Editor-level access or above. ### Workspaces The **Workspaces** section lists all active workspaces within your organization. Each workspace displays its name, number of members, and number of bases. This view helps admins monitor workspace-level participation and data volume. image **Actions:** * **Add Member** – Invite new users to the workspace. * **Rename** – Edit the workspace name. * **Manage Users** – Modify user roles or remove users from the workspace. ### Bases The **Bases** section displays all databases across the organization, regardless of the workspace they belong to. Each base shows its name, the workspace it belongs to, and the number of members. This provides a centralized view to help admins maintain visibility over base creation and ownership. image **Actions:** * **Rename** – Update the base name. * **Manage Users** – Add or remove collaborators, or change their roles. ### User Management The **User Management** section lists all users who are part of the organization. Each member is shown with their **Org Role** (Org-Admin, Org-Creator, or Org-Viewer) and the date they joined. The Org Admin can manage organization membership, assign org-level roles, and provision workspace access. image **Changing Org Roles:** Click the role dropdown next to any member to change their org role. The available roles are: * **Org-Viewer** – Can access workspaces and bases they are invited to, but cannot create new workspaces * **Org-Creator** – Same as Org-Viewer, plus can create new workspaces within the organization. Cannot manage org membership. * **Org-Admin** – Complete access to the organization, including member management, SSO, SCIM, domains, billing, and all org-level settings The Org Admin's role is displayed as a distinct badge. See [Organization-level Roles](/docs/product-docs/roles-and-permissions#organization-level-roles) for details on org role constraints. image **Actions menu:** Click the **Actions** (three dots) menu beside a member to access: * **Resend Invite E-mail** – Resend the invitation email to the user. * **Copy Invite URL** – Copy the invitation link to clipboard. * **Copy password reset URL** – Generate and copy a password reset link. * **Remove User** – Remove the user from the organization. This also removes them from all workspaces, bases, and teams within the organization. image Use the **+ Invite User** button to add new users to the organization. For more details about organization-level roles, see [Organization-level Roles](/docs/product-docs/roles-and-permissions#organization-level-roles). ### Teams The **Teams** section allows Org Admins to create and manage organization-level teams. Unlike workspace teams, org teams are available across all workspaces within the organization — they can be assigned roles in any workspace or base. The teams list displays each team's name, badge, member count, creator, and an actions menu. Teams with sub-teams show an expand/collapse toggle. You can switch between tree view and flat view using the toggle buttons in the toolbar. image Click the **+ New Team** button to create a new team. You can optionally select a parent team to create it as a sub-team. image Click the **Actions** (three dots) menu beside a team to access: * **Edit** – Open the team to manage its members and settings. * **Add sub-team** – Create a nested sub-team under this team. * **Move team** – Move the team under a different parent. * **Delete team** – Remove the team from the organization. image For detailed team management instructions, see [Organization Teams](/docs/product-docs/collaboration/teams#organization-teams). ### Single Sign-On (SSO) The **Single Sign-On (SSO)** section allows organizations to configure centralized authentication for their users. SSO reduces the burden of managing individual credentials and ensures that user authentication adheres to enterprise security policies. image Refer to the [SSO documentation](/docs/product-docs/account-settings/authentication#single-sign-on-sso) for detailed setup instructions. ### SCIM The **SCIM** section allows Org Admins to configure SCIM v2.0 provisioning for automatic user and group management from an identity provider (IdP). When enabled, user onboarding, offboarding, and group membership changes in your IdP are automatically synced to NocoDB. image From this section, you can: * Enable or disable SCIM provisioning * Configure the default org role for provisioned users * Copy the SCIM endpoint URL and provisioning token for IdP configuration * Regenerate the provisioning token if compromised * Remove the SCIM configuration entirely Refer to the [SCIM Provisioning documentation](/docs/product-docs/account-settings/authentication/scim) for detailed setup instructions. ### Settings The **Settings** section allows administrators to define the visual identity and branding of their NocoDB instance. image **Editable Fields:** * **Organisation Name** – The display name for the organisation. * **Organisation Logo** – Upload or update the logo for the organisation. *** ## Additional Notes * Only users with the **Org Admin** role can access the Admin Panel. Org Creators and Org Viewers do not have access. * Actions in the Admin Panel are scoped at the **organization level**, affecting all workspaces and bases. * Any updates made in this panel reflect immediately and globally across your NocoDB deployment. # Community Edition vs Enterprise Edition URL: /docs/product-docs/cloud-enterprise-edition/community-vs-paid-editions Complete overview of the differences between NocoDBs Community vs Enterprise Edition. | **Section** | **Sub-section** | **Community Edition** | **Enterprise Edition** | **Comments** | | ------------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------- | ---------------------- | ----------------------------------------- | | **Usage** | [Workspaces](/docs/product-docs/workspaces) | Only one | Unlimited | | | | [Bases](/docs/product-docs/bases) | Unlimited | Unlimited | | | | [Audit: Workspace-level](/docs/product-docs/workspaces/workspace-audit) | ❌ | ✅ | | | | [Base snapshots](/docs/product-docs/bases/snapshots) | ❌ | ✅ | | | **Views** | [Grid](/docs/product-docs/views/view-types/grid) | ✅ | ✅ | | | | [Gallery](/docs/product-docs/views/view-types/gallery) | ✅ | ✅ | | | | [Form](/docs/product-docs/views/view-types/form) | ✅ | ✅ | | | | [Calendar](/docs/product-docs/views/view-types/calendar) | ✅ | ✅ | | | | [Kanban](/docs/product-docs/views/view-types/kanban) | ✅ | ✅ | | | | [Map](/docs/product-docs/views/view-types/map) | ✅ | ✅ | | | | [Timeline](/docs/product-docs/views/view-types/timeline) | ❌ | ✅ | | | | [List](/docs/product-docs/views/view-types/list) | ❌ | ✅ | | | **Expanded Record** | [Field layout](/docs/product-docs/records/expand-record#field-mode) | ✅ | ✅ | | | | [Files layout](/docs/product-docs/records/expand-record#file-preview-mode--) | ❌ | ✅ | | | | [Discussion layout](/docs/product-docs/records/expand-record#discussion-mode--) | ❌ | ✅ | | | **Form View** | [Background theme](/docs/product-docs/views/view-types/form#change-background-color) | ✅ | ✅ | | | | Forms | ✅ | ✅ | | | | [Email responses](/docs/product-docs/views/view-types/form#post-form-submission-settings) | ✅ | ✅ | | | | [Prefilled forms](/docs/product-docs/views/view-types/form#post-form-submission-settings) | ✅ | ✅ | | | | Custom logo & banner | ❌ | ✅ | | | | [Hide NocoDB branding](/docs/product-docs/views/view-types/form#hide-branding) | ❌ | ✅ | | | | [Form redirection](/docs/product-docs/views/view-types/form#redirect-url) | ❌ | ✅ | | | | [Customize & shorten shared URL](/docs/product-docs/views/share-view#custom-url) | ❌ | ✅ | | | | [Field input validation](/docs/product-docs/views/view-types/form#field-validations-) | ❌ | ✅ | | | | [Conditional field display](/docs/product-docs/views/view-types/form#field-show-on-conditions) | ❌ | ✅ | | | | [Form scheduling](/docs/product-docs/views/view-types/form#form-scheduling-) | ❌ | ✅ | | | **Fields** | AI button (Action) | ❌ | ✅ | | | | AI prompt (Field) | ❌ | ✅ | | | | [Single line text](/docs/product-docs/fields/field-types/text-based/single-line-text) | ✅ | ✅ | | | | [Long text](/docs/product-docs/fields/field-types/text-based/long-text) | ✅ | ✅ | | | | [Rich text](/docs/product-docs/fields/field-types/text-based/long-text) | ✅ | ✅ | | | | [URL](/docs/product-docs/fields/field-types/text-based/url) | ✅ | ✅ | | | | [Email](/docs/product-docs/fields/field-types/text-based/email) | ✅ | ✅ | | | | [Phone](/docs/product-docs/fields/field-types/text-based/phonenumber) | ✅ | ✅ | | | | [Single select](/docs/product-docs/fields/field-types/select-based/single-select) | ✅ | ✅ | | | | [Multiple select](/docs/product-docs/fields/field-types/select-based/multi-select) | ✅ | ✅ | | | | [Number](/docs/product-docs/fields/field-types/numerical/number) | ✅ | ✅ | | | | [Decimal](/docs/product-docs/fields/field-types/numerical/decimal) | ✅ | ✅ | | | | [Currency](/docs/product-docs/fields/field-types/numerical/currency) | ✅ | ✅ | | | | [Duration](/docs/product-docs/fields/field-types/date-time-based/duration) | ✅ | ✅ | | | | [Percent](/docs/product-docs/fields/field-types/numerical/percent) | ✅ | ✅ | | | | [Progress bar (Percent)](/docs/product-docs/fields/field-types/numerical/percent) | ✅ | ✅ | | | | [Date](/docs/product-docs/fields/field-types/date-time-based/date) | ✅ | ✅ | | | | [Time](/docs/product-docs/fields/field-types/date-time-based/time) | ✅ | ✅ | | | | [DateTime](/docs/product-docs/fields/field-types/date-time-based/date-time) | ✅ | ✅ | | | | Year | ✅ | ✅ | | | | [Links](/docs/product-docs/fields/field-types/links-based/links) | ✅ | ✅ | | | | [Link to another record](/docs/product-docs/fields/field-types/links-based/links) | ✅ | ✅ | | | | [Lookup](/docs/product-docs/fields/field-types/links-based/lookup) | ✅ | ✅ | | | | [Rollup](/docs/product-docs/fields/field-types/links-based/rollup) | ✅ | ✅ | | | | [Attachment](/docs/product-docs/fields/field-types/custom-types/attachment) | ✅ | ✅ | | | | [Rating](/docs/product-docs/fields/field-types/custom-types/rating) | ✅ | ✅ | | | | [Checkbox](/docs/product-docs/fields/field-types/custom-types/checkbox) | ✅ | ✅ | | | | [User](/docs/product-docs/fields/field-types/user-based/user) | ✅ | ✅ | | | | [QR code](/docs/product-docs/fields/field-types/custom-types/QR-code) | ✅ | ✅ | | | | [Barcode](/docs/product-docs/fields/field-types/custom-types/barcode) | ✅ | ✅ | | | | [Button](/docs/product-docs/fields/field-types/custom-types/button) | ✅ | ✅ | | | | [Formula](/docs/product-docs/fields/field-types/formula/formula) | ✅ | ✅ | | | | [Created at](/docs/product-docs/fields/field-types/date-time-based/created-time) | ✅ | ✅ | | | | [Last modified at](/docs/product-docs/fields/field-types/date-time-based/last-modified-time) | ✅ | ✅ | | | | [Created by](/docs/product-docs/fields/field-types/user-based/created-by) | ✅ | ✅ | | | | [Last modified by](/docs/product-docs/fields/field-types/user-based/last-modified-by) | ✅ | ✅ | | | | [UUID](/docs/product-docs/fields/field-types/identifier-types/uuid) | ❌ | ✅ | PostgreSQL only | | | [Colour](/docs/product-docs/fields/field-types/custom-types/colour) | ❌ | ✅ | | | | [Auto-number](/docs/product-docs/fields/field-types/identifier-types/auto-number) | ❌ | ✅ | | | **Features** | [Filter](/docs/product-docs/table-operations/filter) | ✅ | ✅ | | | | [Filter groups](/docs/product-docs/table-operations/filter#group-filters) | ✅ | ✅ | | | | [Pinned filters](/docs/product-docs/table-operations/filter#pinned-filters-) | ❌ | ✅ | | | | [Toggle filters](/docs/product-docs/table-operations/filter#toggle-filters-) | ❌ | ✅ | | | | [AI filters](/docs/product-docs/noco-ai/create-filter) | ❌ | ✅ | | | | [Sort](/docs/product-docs/table-operations/sort) | ✅ | ✅ | | | | [Group by](/docs/product-docs/table-operations/group-by) | ✅ | ✅ | | | | [Row height](/docs/product-docs/table-operations/row-height) | ✅ | ✅ | | | | [Footer aggregations](/docs/product-docs/fields/field-summary-footer) | ✅ | ✅ | | | | [Group by aggregations](/docs/product-docs/table-operations/group-by#group-level-field-aggregations) | ✅ | ✅ | | | | Table & field description | ✅ | ✅ | | | | [Unique fields](/docs/product-docs/fields#unique-fields-) | ❌ | ✅ | | | | Undo / Redo | ✅ | ✅ | | | | [Quick navigation (Cmd + K)](/docs/product-docs/getting-started/keyboard-shortcuts#quick-actions) | ✅ | ✅ | | | | Search | Limited | Limited | | | | Templates | Limited | Coming soon | | | | [Record templates](/docs/product-docs/records/record-templates) | ❌ | ✅ | | | | [API snippets](/docs/product-docs/table-details#api-snippet) | ✅ | ✅ | | | | [Field manager (bulk edit)](/docs/product-docs/table-details#fields) | ✅ | ✅ | | | | Filter, Sort & Group re-order | ❌ | ✅ | | | | [Base relationship diagram (ERD)](/docs/product-docs/table-details) | ✅ | ✅ | | | | [Link field : Limit to view](/docs/product-docs/fields/field-types/links-based/links#limit-by-view) | ✅ | ✅ | | | | [Link field : Limit by filter](/docs/product-docs/fields/field-types/links-based/links#limit-by-filter-) | ❌ | ✅ | | | | [Conditional lookup](/docs/product-docs/fields/field-types/links-based/lookup#conditional-lookup-) | ❌ | ✅ | | | | [Conditional rollup](/docs/product-docs/fields/field-types/links-based/rollup#conditional-rollup-) | ❌ | ✅ | | | | [Conditional button fields](/docs/product-docs/fields/field-types/custom-types/button#conditional-buttons-) | ❌ | ✅ | | | | [Locked views](/docs/product-docs/views#locked-views) | ✅ | ✅ | | | | [Personal views](/docs/product-docs/views#personal-views-) | ❌ | ✅ | | | | [View sections](/docs/product-docs/views/view-sections) | ❌ | ✅ | | | | [Calendar view with end date](/docs/product-docs/views/view-types/calendar#configuring-date-range) | ❌ | ✅ | | | | [Date dependencies](/docs/product-docs/tables/date-dependency) | ❌ | ✅ | | | | [Copy another view config](/docs/product-docs/views/actions-on-view#copy-another-views-configuration-) | ❌ | ✅ | | | | [Hide field labels](/docs/product-docs/table-operations/field-operations#hide-field-labels-) | ❌ | ✅ | Applicable for Gallery & Kanban views | | | [Row colouring](/docs/product-docs/table-operations/record-colouring) | ❌ | ✅ | | | | [Cell colouring](/docs/product-docs/table-operations/record-colouring#cell-colouring) | ❌ | ✅ | | | | [Dashboards](/docs/product-docs/dashboards) | ❌ | ✅ | | | | [Private Bases](/docs/product-docs/bases/private-base) | ❌ | ✅ | | | | [Extensions](/docs/product-docs/extensions) | ❌ | ✅ | | | | [MCP Server (desktop)](/docs/product-docs/mcp) | ✅ | ✅ | Desktop apps for Claude, Cursor, Windsurf | | | [MCP OAuth](/docs/product-docs/mcp) | ❌ | ✅ | ChatGPT, Claude | | **Extensions** | [Bulk update](/docs/product-docs/extensions/bulk-update) | ❌ | ✅ | | | | [Data exporter](/docs/product-docs/extensions/data-exporter) | ❌ | ✅ | | | | [URL preview](/docs/product-docs/extensions/url-preview) | ❌ | ✅ | | | | [World clock](/docs/product-docs/extensions/world-clock) | ❌ | ✅ | | | | [Upload CSV with upsert](/docs/product-docs/extensions/upload-data-from-csv) | ❌ | ✅ | | | | [Org chart](/docs/product-docs/extensions/org-chart) | ❌ | ✅ | | | | [Page designer](/docs/product-docs/extensions/page-designer) | ❌ | ✅ | | | | [De-duplicate](/docs/product-docs/extensions/dedupe) | ❌ | ✅ | | | **Import/Export** | [Export: CSV, XLS](/docs/product-docs/table-operations/download#download-data) | ✅ | ✅ | | | | [Import to new table: CSV, XLS, JSON](/docs/product-docs/tables/create-table-via-import#import-table-from-csv--excel--json) | ✅ | ✅ | | | | [Import: Airtable](/docs/product-docs/bases/import-base-from-airtable) | ✅ | ✅ | | | | [Import to existing table](/docs/product-docs/tables/import-data-into-existing-table) | ✅ | ✅ | | | **Developers** | [Core REST API](/docs/product-docs/developer-resources/rest-apis) | ✅ | ✅ | | | | [Advanced REST API](/docs/product-docs/developer-resources/rest-apis) | ❌ | ✅ | View, Script & Collaboration APIs | | | [Swagger specification](/docs/product-docs/developer-resources/rest-apis/accessing-apis#swagger-ui) | ✅ | ✅ | | | | [API tokens](/docs/product-docs/account-settings/api-tokens) | ✅ | ✅ | | | | [Fine-grained API tokens](/docs/product-docs/account-settings/api-tokens#fine-grained-api-tokens) | ❌ | ✅ | | | **Public Sharing** | [Public view sharing](/docs/product-docs/views/share-view) | ✅ | ✅ | | | | [Public view sharing with password](/docs/product-docs/views/share-view#password-protection) | ✅ | ✅ | | | | [Public view custom URL](/docs/product-docs/views/share-view#custom-url) | ❌ | ✅ | | | | Public base custom URL | ❌ | ✅ | | | **Automations** | [Webhooks](/docs/product-docs/automation/webhook) | ✅ | ✅ | | | | [Webhooks with conditions](/docs/product-docs/automation/webhook/create-webhook#webhook-with-conditions) | ✅ | ✅ | | | | [Webhooks with custom payload](/docs/product-docs/automation/webhook/create-webhook#webhook-with-custom-payload) | ✅ | ✅ | | | | [Webhooks on specific field changes](/docs/product-docs/automation/webhook/create-webhook#webhook-on-field-changes-) | ❌ | ✅ | | | | [Webhooks view & field specific triggers](/docs/product-docs/automation/webhook/create-webhook#trigger-source-and-event) | ❌ | ✅ | | | | [Webhook logs](/docs/product-docs/automation/webhook/actions-on-webhook#webhook-logs-) | ❌ | ✅ | | | | [Scripts (Custom JS code)](/docs/scripts) | ❌ | ✅ | | | | [Run scripts via Button field](/docs/product-docs/fields/field-types/custom-types/button) | ❌ | ✅ | | | **Workflows** | [Workflows](/docs/workflows) | ❌ | ✅ | | | **Collaboration** | [Workspace collaboration](/docs/product-docs/workspaces/workspace-collaboration) | ✅ | ✅ | Community Edition supports 1 workspace | | | [Base collaboration](/docs/product-docs/bases/base-collaboration) | ✅ | ✅ | | | | [Role-based permissions](/docs/product-docs/roles-and-permissions) | ✅ | ✅ | | | | [Record-level security](/docs/product-docs/roles-and-permissions/record-level-security) | ❌ | ✅ | | | | [Table permissions](/docs/product-docs/roles-and-permissions/table-permissions) | ❌ | ✅ | | | | [Field permissions](/docs/product-docs/roles-and-permissions/field-permissions) | ❌ | ✅ | | | | Notifications | ✅ | ✅ | | | | [Row comments](/docs/product-docs/records/expand-record#record-comment) | ✅ | ✅ | | | | Row comments resolve | ❌ | ✅ | | | | @Mentions in comments fields | ❌ | ✅ | | | | Realtime collaboration | ❌ | ✅ | | | | [Teams (workspace-level)](/docs/product-docs/collaboration/teams) | ❌ | ✅ | | | | [Organization roles](/docs/product-docs/roles-and-permissions#organization-level-roles) | ✅ | ✅ | | | | [Organization teams](/docs/product-docs/collaboration/teams#organization-teams) | ❌ | ✅ | | | **Integrations** | PostgreSQL | ✅ | ✅ | | | | MySQL | ✅ | ✅ | | | | SQLite | ✅ | ❌ | | | | OpenAI | ❌ | ✅ | | | | Claude | ❌ | ✅ | | | | Ollama | ❌ | ✅ | | | | Groq | ❌ | ✅ | | | | Private integrations | ❌ | ✅ | | | **NocoDocs** | [Documents](/docs/noco-docs) | ❌ | ✅ | | | **Sync** | [Sync](/docs/product-docs/noco-sync) | ❌ | ✅ | | | **Admin** | [Admin panel](/docs/product-docs/cloud-enterprise-edition/admin-panel) | ❌ | ✅ | | | | [SSO](/docs/product-docs/account-settings/authentication#single-sign-on-sso) | ❌ | ✅ | | | | [Audit logs](/docs/product-docs/workspaces/workspace-audit) | ❌ | ✅ | | | | Co-branding | ❌ | ✅ | | | | 2FA | ❌ | Coming soon | Q2 2026 | | | [SCIM](/docs/product-docs/account-settings/authentication/scim) | ❌ | ✅ | | | **Support** | Community support | ✅ | ✅ | | | | Priority support | ❌ | ✅ | | | | SLA-based support | ❌ | ✅ | | *** # OSS to Enterprise Migration URL: /docs/product-docs/cloud-enterprise-edition/oss-to-enterprise-migration This guide outlines the steps to migrate from the OSS version of NocoDB to the Enterprise Edition. Migration is supported for both **on-prem** and **cloud** deployments. ## Prerequisites Before you begin, ensure the following: * The OSS version of NocoDB (`Instance-1`) is accessible. * You have access to the Enterprise Edition of NocoDB (`Instance-2`) — either self-hosted (on-prem) or provisioned via a cloud subscription on NocoDB. * If using the self-hosted (on-prem) Enterprise Edition, it must be running version v0.262.2 or higher. * You have administrative access to both instances. *** ## Steps The migration process consists of two parts: ### Part 1: Generate Migration URL On the Enterprise Edition (**Instance-2**) 1. On the base homepage, click **Import Data**. 2. Choose **NocoDB** as the data source. 3. Click **Generate & Copy URL**. 4. The URL will be copied to your clipboard. The modal will now enter **listening mode**, waiting for a migration request from the OSS instance. Generate Migration URL Generate Migration URL Generate Migration URL Generate Migration URL *** ### Part 2: Migrate Base from Self hosted instance On the OSS instance (**Instance-1**): 1. Open the base context menu and select **Settings**. 2. Navigate to the **Migrate** tab. 3. Paste the migration URL copied from Instance-2. 4. Click **Migrate**. Migrate Base from OSS Migrate Base from OSS Once the migration is triggered, a status popup will appear on the OSS instance (Instance-1). Upon successful completion, a confirmation message will be displayed on the Enterprise Edition (Instance-2). Click **Go to Base** to access the migrated base. Migration Complete *** # NocoDB Pricing Guide URL: /docs/product-docs/cloud-enterprise-edition/understanding-pricing Transparent, Scalable, and Business-Friendly ## Executive Summary NocoDB's pricing model is designed with growing businesses in mind. Our unique "**pay for 9, get unlimited**" approach means you'll never pay for more than 9 editor seats, regardless of your team size. This creates predictable costs and exceptional value as your organization scales. **Key Benefits:** * **Predictable costs** - Your bill caps at 9 editor seats automatically * **Unlimited scale** - Add as many team members as needed without additional cost * **Immediate value** - Start small and grow without pricing penalties * **No surprises** - Transparent billing with no hidden fees *** ## Understanding User Roles and Billing ### Billable vs. Non-Billable Users **Billable Users (Editors):** Team members who can create, modify, or delete data * **Owner:** Full administrative control * **Creator:** Can create new bases and modify data * **Editor:** Can modify existing data and records **Non-Billable Users (Always Free):** Team members with view-only or limited access * **Commenter:** Can view records and add comments, but cannot edit data * **Viewer:** Read-only access to data and dashboards 💡 **Pro Tip:** Maximize your investment by assigning Commenter or Viewer roles to stakeholders who only need to review data, not edit it. *** ## The "Pay for 9, Get Unlimited" Model **How It Works** 1. **You pay for only the first 9 editor seats** - regardless of your actual number of editors 2. **Every editor beyond the 9th is completely free** - no limits, no restrictions 3. **Start with any number** - begin with 1-2 users and grow naturally 4. **Automatic billing cap** - NocoDB stops charging after the 9th editor ### Real-World Example **Scenario:** Your company has 45 total users across different departments * **25 editors** (Sales, Operations, Product teams who need to update data) * **20 commenters/viewers** (Executives, stakeholders who review reports) **What you pay for:** * Only 9 editor seats (not all 25 editors) * 0 seats for commenters/viewers **Your cost:** Same as a 9-person team, but with 45 people using the platform. *** ## Pricing Plans Comparison ### Plus Plan **Price:** $12 per editor/month (Annual) **Best for:** Growing teams and departments | Team Size (Editors) | Monthly Cost | Annual Cost | Cost Per User/Month | | ------------------- | ------------ | ----------- | ------------------- | | 5 editors | $60 | $720 | **$12.00** | | 10 editors | $108 | $1,296 | **$10.80** | | 25 editors | $108 | $1,296 | **$4.32** | | 50 editors | $108 | $1,296 | **$2.16** | | 100 editors | $108 | $1,296 | **$1.08** | ### Business Plan **Price:** $24 per editor/month (Annual) **Best for:** Enterprise teams requiring advanced features | Team Size (Editors) | Monthly Cost | Annual Cost | Cost Per User/Month | | ------------------- | ------------ | ----------- | ------------------- | | 5 editors | $120 | $1,440 | **$24.00** | | 10 editors | $216 | $2,592 | **$21.60** | | 25 editors | $216 | $2,592 | **$8.64** | | 50 editors | $216 | $2,592 | **$4.32** | | 100 editors | $216 | $2,592 | **$2.16** | *** ## ROI Calculator **Traditional Per-Seat Pricing vs. NocoDB** Example: 40-person team needing editing access | Pricing Model | Monthly Cost | Annual Cost | Savings with NocoDB | | --------------------------- | ------------ | ----------- | ------------------- | | Traditional SaaS ($15/user) | $600 | $7,200 | - | | **NocoDB Plus** | $108 | $1,296 | **$5,904 saved** | | **NocoDB Business** | $216 | $2,592 | **$4,608 saved** | *The larger your team, the greater your savings.* ## Changing plans Note that, you can change your plan at any time from the billing dashboard. Upgrades take effect immediately, and you'll be billed on a prorated basis. Downgrades take effect at the end of your current billing cycle. Please ensure your workspace usage fits within the limits of the downgraded plan (record limits, storage, etc.). The detailed steps for change plan are captured [here](/docs/product-docs/workspaces/billing#change-your-plan). ## Access your invoices To view and download your invoices, go to the **Billing** tab in your workspace settings. You can access past invoices, their statuses, and download them for your records. Find more details [here](/docs/product-docs/workspaces/billing#download-invoices). *** ## Cancel your plan You can cancel your paid plan anytime from the billing dashboard. Upon cancellation, your workspace remains on the current plan until the end of the billing period. After that, it automatically moves to the Free plan, and no further charges are made. Before canceling, ensure you’ve backed up any data or features available only in paid plans, as these may become unavailable after the downgrade. Follow the detailed steps [here](/docs/product-docs/workspaces/billing#cancel-plan). *** ## Frequently Asked Questions ### Can I change user roles after setup? Yes, you can promote Commenters to Editors or vice versa at any time. Billing adjusts automatically based on your current editor count (up to 9 paid seats). ### What happens if I temporarily need more than 9 editors? Nothing changes with your billing. Add as many editors as needed - you'll still only pay for 9 seats. ### Do I need to commit to 9 seats upfront? No. Start with the number of editors you need today. You'll only pay for active editor seats until you reach 9. ### How does annual vs. monthly billing work? Annual billing provides the pricing shown above and helps you save 20% compared to monthly billing. ### Questions About Pricing? Our sales team is here to help you understand how NocoDB's pricing model works for your specific situation. **[Book a consultation call →](https://cal.com/nocodb/sales/)** *** # Base collaboration URL: /docs/product-docs/collaboration/base-collaboration This article explains how to invite members or teams to your base, manage their roles, and remove them when needed. A comprehensive guide regarding roles and permissions can be accessed [here](/docs/product-docs/roles-and-permissions) Teams feature availability: **Business** plan onwards in cloud and On-premise **Enterprise** edition ## Invite Members to Base Base-level member management allows you to control granular access to specific bases within your workspace. You can invite individual members directly to a base with specific role assignments. 1. Navigate to the **Overview** > **Members** tab within your base. 2. Click **Add Members**. 3. Enter one or more email addresses (comma-separated). 4. Select a role for the invited member(s) from the dropdown menu. 5. Click **Invite to Base**. You can only assign roles that are at most equal to your own role on the base. You can invite multiple members simultaneously by entering their email addresses separated by commas. image image Members added to a workspace inherit the role assigned at the workspace level, unless a specific role is configured at the base level. Alternatively, you can invite users directly to a base with restricted workspace access. This allows you to grant access to a single base without exposing other workspace data — ideal for collaborating with external partners, clients, or temporary contributors in a controlled manner. ## Invite Teams to Base ☁ You can assign entire teams to a base for streamlined collaboration. Teams inherit the base-level role assigned to them, making it easier to manage access for department-wide or functional group permissions. 1. Navigate to the **Overview** > **Members** tab within your base. 2. Click on the **Add Teams** button. 3. From the dropdown, select one or multiple teams to add to the base. Teams already added to the base will be indicated as disabled in the dropdown. 4. Choose the appropriate base-level role from the dropdown menu. Note that: * Similar to individual members, you can only assign roles that are at most equal to your own role on the base. * Teams can't be assigned the **Owner** role at the base level. 5. Click on the **Add Teams** button to complete the process. When a team is invited to the base, all users under that team inherit the assigned base-level role unless overridden by an individual explicit member role. image image To learn more about creating and managing teams, refer to the [Teams documentation](/docs/product-docs/collaboration/teams). Teams added to a workspace inherit the role assigned at the workspace level, unless a different role is configured at the base level. Alternatively, you can invite teams directly to a base with restricted workspace access. This allows team members to collaborate on a specific base without access to other workspace data — ideal for engaging external teams, partner organizations, or temporary project groups securely and efficiently. ## List Base Members and Teams The `Members` tab displays all users and teams that have access to the base. * Individual members appear with their email addresses and assigned base role. * Teams are listed with their name, member count, and assigned base role. image Inherited roles from workspace-level are displayed with `workspace` suffix to indicate their origin. ## Modify Roles for Members or Teams Access permissions for both members and teams can be updated directly from the `Members` tab. 1. Click on the role dropdown next to the member or team. 2. Select a new role from the list of available options. 3. The role change takes effect immediately. image You can only assign roles that are at most equal to your own role on the base. Teams cannot be assigned the **Owner** role at the base level. Learn more about [roles and permissions](/docs/product-docs/roles-and-permissions). ## Role Precedence When a user has multiple role assignments through both team and individual access at the base level, NocoDB resolves the final permission using a clear precedence order. * Individual explicit role takes precedence over team-assigned role. * Base-level roles override workspace-level roles. * In case of multiple team roles, the **highest** permission applies. Learn more about [roles and permissions](/docs/product-docs/collaboration/teams#effective-role-resolution). ## Remove or Revoke Base Access There are two ways to manage member or team access to a base: ### Deny Access To prevent a user or team from accessing the base: * Click on the role dropdown next to the member or team entry. * Select `No Access` from the available roles. The member or team will be blocked from accessing this base, regardless of their workspace or team-level permissions. ### Revoke Explicit Assignment To remove an explicit base-level role assignment and allow the user to inherit their workspace or team-level role: * Click on the role dropdown next to the member or team entry. * Select `Inherit` from the available roles. The member or team will now access the base based on their workspace-level or team-level permissions, rather than an explicit base-level assignment. Use **No Access** to explicitly block someone from a base. Use **Inherit** to remove the base-level assignment and fall back to workspace or team inheritance. ## Best Practice * Use base-level permissions to restrict access to sensitive data while maintaining broader workspace access. * Assign teams to bases for departments or functional groups to manage access efficiently without individual invitations. * Start by inviting teams to bases when possible, then add individual members for exceptions. * Regularly audit base member lists to ensure access remains appropriate as team compositions change. Learn more [here](/docs/product-docs/collaboration/teams#best-practices). *** # Collaboration URL: /docs/product-docs/collaboration This article explains various collaboration features that NocoDB offers. At NocoDB, teamwork is at the core of what we do. Our collaboration features make it easy to share work, assign tasks, and communicate effectively with your team. In this section, we’ll explore the different collaboration tools available in NocoDB. [Workspace collaboration](/docs/product-docs/collaboration/workspace-collaboration)\ [Base collaboration](/docs/product-docs/collaboration/base-collaboration)\ [Teams](/docs/product-docs/collaboration/teams)\ [Share base](/docs/product-docs/collaboration/share-base)\ [Share view](/docs/product-docs/collaboration/share-view) # Notifications URL: /docs/product-docs/collaboration/notifications This article explains specifics of Notifications. The Notifications feature in NocoDB helps you stay informed about important updates, invitations, and activities within your bases and workspaces. This feature allows you to easily manage and keep track of all your notifications in one place. Notifications ## Notification Center The Notification Center is accessible via the bell icon located at the bottom of the sidebar in your NocoDB interface. Clicking on this icon opens a menu that displays all your recent notifications. Whenever someone mentions you in the comments or invites you to a workspace, you will receive a notification.
``` ### Embed into application's HTML Body Sample code with embedded iframe generated above ```html ``` # Share view URL: /docs/product-docs/collaboration/share-view Procedures to share a view publicly ## Generate Share View 1. Click `Share` button on the top right of the toolbar 2. Toggle `Enable public viewing` to create shared view link 3. Click `Copy` button to copy the link to clipboard share button shared view ### Share view options #### Password protection You can enable `Restrict access with a password` if you want a password-protected view password protection #### Download options You can toggle `Allow Download` button to enable or disable download CSV/XLSX options in the shared view link download options ### Share Form View Options Form view has additional customizations for shared view. You can enable/disable the following options for shared form view: 1. `Survey mode`: This option when enabled, will display the form in survey mode. 2. `RTL Orientation`: This option when enabled, will display the form in RTL orientation. 3. `Themes`: You can select a theme for the form from the dropdown. form view options ## Access Share View To access the shared view, please follow the steps below: Click on the `Shared View URL`. If the URL is password-protected, you will be prompted to enter the password to unlock it. Please input the required password to proceed. password modal Once the password is successfully entered and authenticated, you will gain access to the shared view. In the event that the URL is not password-protected, you will be directed to the shared view directly, without the need for a password. share-view Users with the shared view link can only view the data and cannot make any changes to the view or its content. Records and fields in the shared view will be updated in real-time as changes are made to the original view. Users accessing shared view can apply filters and sort records as per their requirements. :::info Note that, filters & sorts applied to shared view will not be persisted. These filters & sorts will be reset when the shared view is accessed again. ::: # Teams URL: /docs/product-docs/collaboration/teams Manage groups of users with role-based access to workspaces & bases Workspace Teams: **Business** plan onwards in Cloud and On-premise **Enterprise** edition. Organization Teams: **Enterprise** plan only (Cloud & On-premise). ## Overview Teams let you group members so you can assign and manage permissions at scale. Instead of configuring the same role for each person on every base, add users to a team and grant that team a role on one or more bases. NocoDB supports two scopes of teams: | | Workspace Teams | Organization Teams | | ---------------- | -------------------------- | -------------------- | | **Scope** | Single workspace | Entire organization | | **Managed in** | Workspace Settings > Teams | Admin Panel > Teams | | **Availability** | Business plan onwards | Enterprise plan only | **When to use which:** * **Org teams** are ideal for company-wide groups like departments (Engineering, Marketing, HR) that need consistent access across multiple workspaces. The Org Admin manages them centrally, and they can be assigned roles in any workspace. * **Workspace teams** are better for project-specific or workspace-local groups — for example, a "Sprint Team" or "External Contractors" group that only needs access within a single workspace. Teams help you to * **Organize** members by department, project, or function * **Manage permissions** efficiently by assigning roles to teams instead of individuals * **Scale access control** without managing individual user permissions * **Maintain flexibility** with inheritance and override capabilities * **Create sub-teams** for more granular organization with up to 4 levels of nesting ## Workspace Teams The following sections cover **Workspace Teams** . For organization-level teams, see [Organization Teams](#organization-teams) below. ### Create Team 1. Navigate to **Workspace Settings** > **Teams** tab. 2. Click **New Team**. 3. Enter a team name (Optional). 4. Click **Create Team**. image image When a team is created, the creator is automatically added as its first member and designated as the **Team Owner**. Team Owners have full administrative privileges, including adding or removing members, renaming the team, and deleting it when necessary. Multiple owners can be assigned to a team, but each team must always have at least one owner. ### Add Members to a Team In the **Teams** tab, select the team you want to manage, then follow these steps: 1. Click **Add Members**. 2. Use the toggle buttons to select existing workspace members to add. Members already part of the team are clearly indicated. 3. Click **Add Members** again to confirm your selection. You can search by name or email to quickly locate users. Existing team members have their toggles disabled to avoid duplicate additions. Each member's workspace role is displayed beside their name for better context. image image ### Remove Members from a Team In the **Teams** tab, select the team you want to manage, then follow these steps: 1. Locate the member you want to remove. Use the search bar if needed and open the **Actions** (three dots) menu beside their name. 2. Select **Remove Member**. 3. Confirm the action when prompted. image image To remove **multiple members** at once: 1. Use the checkboxes to select the members you want to remove. 2. Click **Actions** > **Remove from Team** at the top of the member list. 3. Confirm the action when prompted. image image ### Manage Team Owners A team can have multiple owners, but it must always have at least one. To add or remove team owners: 1. In the **Teams** tab, select the team you want to manage. 2. Locate the member whose ownership status you want to change. Use the search bar if necessary and open the **Actions** (three dots) menu beside their name. 3. To grant ownership, select **Assign as Team Owner**. To revoke ownership, select **Remove as Team Owner**. image image ### Leave Team Members can leave a team on their own if they no longer wish to be part of it (any team member can leave, not just owners — as long as at least one owner remains). To leave a team you are a member of: 1. In the **Teams** tab, open team context menu by clicking the **Actions** (three dots) button beside the team name. 2. Click the **Leave Team** button from the dropdown menu. 3. Confirm the action when prompted. image image ### Rename Team In the **Teams** tab, select the team you want to rename. Edit team name as needed, and your changes will be saved automatically. image ### Delete Team Only Team Owners can delete a team. Deleting a team will not remove its members from the workspace; it only dissolves the team grouping. To delete a team: 1. In the **Teams** tab, open team context menu by clicking the **Actions** (three dots) button beside the team name. 2. Click the **Delete Team** button from the dropdown menu. 3. Confirm the action when prompted. image image ### Sub-teams You can create teams within teams to match how your company is organized. For example, an "Engineering" team can have "Frontend" and "Backend" as sub-teams. Sub-teams can be nested up to **4 levels deep**. ``` Engineering ├── Frontend │ └── Design System │ └── Icons ← maximum depth └── Backend ``` image #### Create a sub-team 1. In the **Teams** tab, click the **Actions** (three dots) menu next to the parent team. 2. Select **Create Sub-team**. 3. Enter a name for the sub-team. 4. Click **Create Team**. image image Alternatively, click **New Team** and select a parent team from the **Parent team** dropdown. Enter a name for the team and click **Create Team**. image #### Move a team You can move a team under a different parent, or make it a top-level team. 1. In the **Teams** tab, click the **Actions** (three dots) menu next to the team. 2. Select **Move Team**. 3. Pick the new parent team, or choose no parent to make it top-level. 4. Confirm the move. image image Moving a team also moves all its sub-teams. The total depth after the move cannot exceed 4 levels. #### Members in sub-teams Adding someone to a parent team does **not** automatically add them to its sub-teams. You manage each team's members separately. When you open a team's details, you'll see: * **Direct members** — people you added to this team * **Inherited members** — people from parent teams above, shown for reference with a label indicating which team they belong to image ### How sub-teams affect permissions | What | Direction | How it works | | --------------------------------- | --------- | ---------------------------------------------------------------------------- | | Workspace & base roles | Upward | Parent team members automatically get their sub-team's roles | | Table, record & field permissions | Downward | Sub-team members are included by default; you can switch to "This team only" | Sub-teams change how permissions work in two ways: #### 1. Workspace & base roles flow upward When you give a sub-team a role on a workspace or base, members of the **parent team also get that role** automatically. This way, managers in the parent team can always see what their sub-teams have access to. **Example:** The "Frontend" sub-team has **Editor** access to Workspace X. | Person | Team | Access to Workspace X | | ------ | -------------------------------- | ------------------------------ | | Alice | Frontend | Editor | | Bob | Engineering (parent of Frontend) | Editor — gets it automatically | | Carol | Backend (sibling, not parent) | No access | This only works **upward** . Parent team members get the sub-team's roles, but sub-team members do **not** get the parent team's roles. #### 2. Table, record & field permissions flow downward When you grant a team access using **"Specific users or teams"** in [table visibility](/docs/product-docs/roles-and-permissions/table-permissions#table-visibility), [record permissions](/docs/product-docs/roles-and-permissions/table-permissions#table-record-permissions), or [field permissions](/docs/product-docs/roles-and-permissions/field-permissions), you can choose whether to include sub-team members or not. After selecting a team, you'll see a segmented control next to the team name with two options: | Option | Who gets access | | ------------------------- | --------------------------------------------------- | | **This team** | Only direct members of this team | | **+ Sub-teams** (default) | Members of this team **and all sub-teams below it** | image {/* ![Hierarchy scope toggle — include sub-teams](/img/v2/collaboration/teams/scope-toggle-with-descendants.png) */} **Example:** The "Infrastructure" table is visible to the "Engineering" team. With **"Include sub-teams"** (default): | Person | Team | Can see "Infrastructure"? | | ------ | ---------------------------- | ------------------------- | | Alice | Engineering | Yes | | Bob | Frontend (sub-team) | Yes | | Carol | Design System (sub-sub-team) | Yes | | Dave | Marketing | No | With **"This team only"**: | Person | Team | Can see "Infrastructure"? | | ------ | ---------------------------- | ------------------------- | | Alice | Engineering | Yes | | Bob | Frontend (sub-team) | No | | Carol | Design System (sub-sub-team) | No | This toggle is available wherever you see the **"Specific users or teams"** option: * **Table visibility** — who can see a table * **Record permissions** — who can create or delete records * **Field permissions** — who can edit a field ### Team roles Every team member is either an **Owner** or a **Member**. | Role | What they can do | | ---------- | --------------------------------------------------------------------------- | | **Owner** | Manage the team — rename, move, delete, add/remove people, create sub-teams | | **Member** | Be part of the team and receive the workspace/base roles assigned to it | * The person who creates a team is automatically its first Owner. * A team can have multiple Owners but must always have at least one. * Team roles (Owner/Member) are separate from workspace and base roles (Creator, Editor, Viewer, etc.). ### Assign roles to teams You can give a team a role at the workspace or base level, just like you do for individual users. When a team gets a role, all its members receive that access. Available roles for teams: * **Creator** — full control except deletion * **Editor** — add, edit, and delete records * **Commenter** — view and comment on records * **Viewer** — read-only access * **No Access** — block access entirely Teams **cannot** be given the **Owner** role. Only individual users can be workspace or base owners. For step-by-step instructions: * [Add a team to a workspace](/docs/product-docs/collaboration/workspace-collaboration#invite-teams-to-workspace-) * [Add a team to a base](/docs/product-docs/collaboration/base-collaboration#invite-teams-to-base-) ### Effective role resolution When someone belongs to one or more teams **and** has an individual role, NocoDB picks the one that applies using this order: #### For a base | Priority | Where the role comes from | | ----------- | ---------------------------------------------------- | | 1 (highest) | Role assigned directly to the user on this base | | 2 | Highest role from any team assigned to this base | | 3 | Role assigned directly to the user on the workspace | | 4 | Highest role from any team assigned to the workspace | | 5 (lowest) | No access | #### For a workspace | Priority | Where the role comes from | | ----------- | ---------------------------------------------------- | | 1 (highest) | Role assigned directly to the user on the workspace | | 2 | Highest role from any team assigned to the workspace | | 3 (lowest) | No access | #### Rules to remember * **Individual roles always win over team roles** at the same level. * **Base-level roles win over workspace-level roles** — a role set on a specific base takes priority. * **Highest team role wins** — if you're in two teams with different roles, you get the higher one. For example, Viewer + Editor = Editor. * **"Inherit" at workspace level** means "use my team role." Any other workspace role overrides team roles. * **"No Access" at workspace level blocks everything** — even team roles can't override it. #### Examples **Team role only** Alice is in the "Marketing" team, which has **Editor** access on Workspace X. Alice has no individual role. → Alice gets **Editor** access on the workspace and all its bases. **Individual role overrides team** Bob is in "Marketing" (Editor on Workspace X), but Bob is also individually set as **Viewer** on Workspace X. → Bob gets **Viewer** — individual roles always take priority, even if less permissive. **Multiple teams** Carol is in "Marketing" (Viewer on Base A) and "Content" (Editor on Base A). → Carol gets **Editor** on Base A — the higher team role wins. **Base-level override** Dave is in "Engineering" (Editor on Workspace X). He's also individually set as **Creator** on Base B. → Dave gets **Creator** on Base B, **Editor** on all other bases. **Sub-team role flowing upward** "Frontend" is a sub-team of "Engineering." "Frontend" has **Editor** on Workspace X. → Frontend members get **Editor**. → Engineering members also get **Editor** — parent team members automatically receive sub-team roles. ### Best practices * **Invite users with the "Inherit" role** at workspace level. This lets their access be fully controlled through teams. (Note: "No Access" at workspace level blocks all team roles.) * **Match your org chart** — create top-level teams for departments and sub-teams for groups within them. * **Put managers in parent teams** — they'll automatically get access to everything their sub-teams can see. * **Use individual roles only for exceptions** — teams should handle the norm, individual assignments handle the edge cases. * **Use clear team names** (e.g., `Eng - Backend`, `Ops - HR`) so it's easy to find and manage teams. * **Review membership regularly** — remove people who've left or changed roles. * **Add multiple team owners** — so things don't get stuck if one owner is unavailable. *** ## Organization Teams Availability: **Enterprise** plan only (Cloud & On-premise) Organization teams are scoped to the entire organization and can be assigned roles across any workspace within the org. They are created and managed from the **Admin Panel** > **Teams** section by the Org Admin. Unlike workspace teams, org teams do not have a separate Team Owner / Team Member distinction. The **Org Admin** has full management control over all org-level teams — including creating, editing, deleting teams and managing their members. Org teams appear in workspace member and team lists with an **ORG** badge. They are read-only at the workspace level — you cannot edit their membership from workspace settings, but you can assign them workspace or base roles just like workspace teams. ### Create an Org Team 1. Navigate to **Admin Panel** > **Teams**. 2. Click **+ New Team**. 3. Enter a team name. 4. Optionally, select a **Parent team** to create it as a sub-team. 5. Click **Create Team**. image ### Manage an Org Team Click the **Actions** (three dots) menu beside a team to: * **Edit** – Open the team to manage its members and settings. * **Add sub-team** – Create a nested sub-team under this team. * **Move team** – Move the team under a different parent. * **Delete team** – Remove the team from the organization. image ### Add Members to an Org Team 1. In **Admin Panel** > **Teams**, click **Edit** on the team you want to manage. 2. Click **Add Members**. 3. Select one or more members from the organization's member list. 4. Click **Add Members** to confirm. Members already part of the team are indicated and cannot be added again. You can search by name or email to quickly locate users. ### Sub-teams Org teams support the same hierarchical structure as workspace teams, with sub-teams nested up to **4 levels deep**. To create an org sub-team: 1. In **Admin Panel** > **Teams**, click the **Actions** (three dots) menu next to the parent team. 2. Select **Add sub-team**. 3. Enter a name and click **Create Team**. Alternatively, click **+ New Team** and select a parent team from the **Parent team** dropdown. image Organization teams and workspace teams are separate hierarchies. An org team cannot be a child of a workspace team, and a workspace team cannot be a child of an org team. ### Assign Org Teams to Workspaces and Bases Org teams can be assigned workspace-level or base-level roles, just like workspace teams. When an org team is given a role, all its members receive that access. From a workspace's **Members** tab, org teams appear with an **ORG** badge. You can assign or change their role from this view, but you cannot edit the team's membership — that is managed from the Admin Panel. image Roles assigned to org teams follow the same [effective role resolution](#effective-role-resolution) rules as workspace teams. ### Org Teams vs Workspace Teams | Aspect | Workspace Teams | Organization Teams | | ------------------------- | -------------------------- | ------------------------------- | | Plan required | Business+ | Enterprise | | Scope | Single workspace | Entire organization | | Managed from | Workspace Settings > Teams | Admin Panel > Teams | | Managed by | Team Owners | Org Admin | | Visible in workspace | Yes (native) | Yes (with ORG badge, read-only) | | Sub-team depth | 4 levels | 4 levels | | Members source | Workspace members | Org members | | Can parent the other type | No | No | Team names are scoped — they must be unique within their own scope (workspace or org), but the same name can exist in different scopes. For example, a team called "Support" can exist as an org team and also as a workspace team in two different workspaces, all independently. ### Best practices * **Use org teams for cross-workspace access** — when teams need consistent roles across multiple workspaces, create an org team in the Admin Panel rather than duplicating workspace teams in each workspace. * **Reserve workspace teams for project-specific groups** — if a team only needs access within a single workspace, a workspace team is simpler to manage. *** # Workspace collaboration URL: /docs/product-docs/collaboration/workspace-collaboration This article explains how to invite members or teams to your workspace, manage their roles, and remove them when needed. A comprehensive guide regarding roles and permissions can be accessed [here](/docs/product-docs/roles-and-permissions) Teams feature availability: **Business** plan onwards in cloud and On-premise **Enterprise** edition ## Invite Members to Workspace 1. Go to **Team & Settings** in the left minibar. 2. Open the **Members** tab. 3. Click **Add Member**. 4. Enter one or more email addresses (comma-separated). 5. Select a role for the invited member(s). 6. Click **Invite to Workspace**. Any user can invite members to the workspace, but they can only assign a role to new members that is at most equal to their own role. image image image You have the capability to invite multiple members simultaneously by entering their email addresses, separated by commas. ## Invite Teams to Workspace ☁ NocoDB now allows inviting **Teams** to the workspace for simplified collaboration. Teams can be assigned workspace-level access roles, streamlining permissions for all their members. 1. Navigate to the `Team & Settings` page and open the `Members` tab. 2. Click on the `Add Teams` button. 3. From the dropdown, select one or multiple teams to add. 4. Choose the appropriate access role from the dropdown menu. Note that, * Similar to individual members, you can only assign roles that are at most equal to your own role in the workspace. * Teams can't be assigned the **Owner** role. 5. Click on the `Add Teams` button to complete the process. When a team is invited to the workspace, all users under that team inherit the assigned workspace-level role unless overridden by a lower-level permission (explicit workspace role or base-level role). image image To learn more about creating and managing teams, refer to the [Teams documentation](/docs/product-docs/collaboration/teams). **Organization Teams** (Enterprise only): Org-level teams also appear in the team selector with an **ORG** badge. These teams are managed from the [Admin Panel](/docs/product-docs/cloud-enterprise-edition/admin-panel#teams) and are read-only at the workspace level — you cannot edit their membership from workspace settings, but you can assign them workspace or base roles. Learn more about [Organization Teams](/docs/product-docs/collaboration/teams#organization-teams) . image ## List Workspace Members and Teams The `Members` tab displays all users and teams that have access to the workspace. * Individual members appear with their email addresses. * Teams are listed with their name and member count. * Organization teams (Enterprise only) are displayed with an **ORG** badge, distinguishing them from workspace teams. Members and teams list is accessible to all workspace members. image ## Modify Roles for Members or Teams Access permissions for both members and teams can be updated directly from the `Members` tab. 1. Click on the access dropdown next to the member or team. 2. Select a new role from the list of available options. You can only assign roles that are at most equal to your own role in the workspace. Teams cannot be assigned the **Owner** role. image ## Role Precedence When a user has multiple role assignments through both team and individual access, NocoDB resolves the final permission using a clear precedence order. * Individual explicit role takes precedence over team-assigned role. * Base-level roles override workspace-level roles. * In case of multiple team roles, the **highest** permission applies. This ensures users always retain the most permissive access assigned at their lowest configured level. To learn more about effective role resolution, refer to the [Teams effective role resolution documentation](/docs/product-docs/collaboration/teams#effective-role-resolution). ## Remove Members or Teams from Workspace You can remove both members and teams from the workspace using the context menu. 1. Click on the vertical ellipses `⋮` beside the member or team entry. 2. Select the appropriate removal option — `Remove User` or `Remove Team`. Only the workspace **owner** or **creator** can remove members or teams from the workspace. image image ## Best Practice * Invite all users to the workspace first with the **Inherit** role. This will allow them to access workspaces based on their team or base-level roles. * Use teams for departments or functional groups to manage roles efficiently. * Adjust team-level permissions instead of managing roles individually for large workspaces. Learn more [here](/docs/product-docs/collaboration/teams#best-practices). *** # Dashboards URL: /docs/product-docs/dashboards Create and share dashboards with your team The Dashboard feature in NocoDB enables you to visualize data from your tables using charts, graphs, and metric widgets. Dashboards help present key insights to stakeholders through an interactive, configurable interface. Dashboards are currently in Beta and available on **Plus** and **Business** plans in Cloud. ## Getting Started ### Creating a Dashboard 1. Click on **Create New** in the left sidebar. 2. Select **Dashboard** from the dropdown. 3. Enter a name for your dashboard. (Optional, Defaults to "Dashboard") 4. Click **Create Dashboard** to open the dashboard editor. 5. Click on **Edit Dashboard** to start adding widgets. Create a new dashboard Create a new dashboard Create a new dashboard ### Managing Dashboards Use the dashboard context menu to perform actions like: * **Rename dashboard**: Change the dashboard name * **Edit description**: Add or update the dashboard description. This description will appear on hover over the `i` icon in the dashboard header. * **Duplicate dashboard**: Create a copy of the dashboard * **Delete dashboard**: Remove the dashboard Dashboard context menu ### Sharing Dashboards To share a dashboard publicly, click the **Share** button in the top navigation bar, enable the `Enable Public Viewing` option, and copy the generated link. Anyone with this link will be able to view the dashboard without requiring a NocoDB account. Share dashboard Additional options include: * Configuring a custom URL for your dashboard. * Setting a password to control access. Dashboard sharing works similarly to view sharing. Learn more about [sharing views](/docs/product-docs/views/share-view). *** ## Dashboard Layout 1. **Top Navigation Bar**: Navigation breadcrumbs and dashboard-level actions. Toggle between dashboard **View** and **Edit** modes. You can also **Share** the dashboard with team members. 2. **Widget Bar**: Toolbar at the top with available widget types to add to the dashboard. 3. **Dashboard Canvas**: Main area where widgets are arranged. NocoDB supports a flexible grid layout, allowing you to drag and drop widgets to position them as needed. 4. **Widget Configuration Panel**: Right panel for configuring selected widget properties. Dashboard layout ## Widgets NocoDB dashboards support various widget types to visualize data effectively. You can add widgets from the widget bar at the top of the dashboard editor. The following widget types are available: | Widget Type | Description | | -------------------------------------------------------------------- | --------------------------------------- | | **[Number](/docs/product-docs/dashboards/widgets/number)** | Displays KPIs and metric summaries | | **[Pie Chart](/docs/product-docs/dashboards/widgets/pie-chart)** | Visualizes parts of a whole | | **[Donut Chart](/docs/product-docs/dashboards/widgets/donut-chart)** | Pie chart variant with a hollow center | | **[Text](/docs/product-docs/dashboards/widgets/text)** | Displays static text | | **[iFrame](/docs/product-docs/dashboards/widgets/iframe)** | Embeds external web content | | **[Bar Chart](/docs/product-docs/dashboards/widgets/bar-chart)** | Bar chart variant with a hollow center | | **[Line Chart](/docs/product-docs/dashboards/widgets/line-chart)** | Line chart variant with a hollow center | *** # Actions on Data sources URL: /docs/product-docs/data-sources/actions-on-data-sources Learn more about actions that can be performed on data sources in NocoDB. ## Edit Data Source parameters * Open [Data Sources](/docs/product-docs/data-sources#accessing-data-sources) tab in the Base Settings homepage * Click on the data source that you wish to edit * Re-configure data source parameters as required. The following parameters can be edited: 1. Data source name 2. Database & Schema 3. Data source access permissions * Click on `Submit` button to save the changes To change database connection configuration parameters (like host, port, and such) use [Edit connection](/docs/product-docs/integrations/actions-on-connection#edit) option. Edit connection option is available only for the users with Workspace Creator+ permissions edit-data-source ## Remove data source Open [Data Sources](/docs/product-docs/data-sources#accessing-data-sources) tab in the Base Settings homepage 1. Click on Actions button (three dots) against the data source that you wish to remove 2. Select `Remove` option from the dropdown datasource unlink datasource unlink Removing a data source will not delete the external data source. It will only remove the data source from the current base ## Data source visibility * Open [Data Sources](/docs/product-docs/data-sources#accessing-data-sources) tab in the Base Settings homepage * Toggle radio button listed under `Visibility` column for the data source that you wish to hide/un-hide datasource visibility ## View visibility View visibility is available only in Open-Source version of NocoDB Open [Data Sources](/docs/product-docs/data-sources#accessing-data-sources) tab in the Base Settings homepage, select the data source that you wish to configure view visibility for and follow the steps below: 1. Select `View visibility` tab 2. You can see the list of views & tables available in the data source as rows & roles available as columns. Toggle checkboxes to enable/disable access to tables for specific roles. 3. Click on `Save` button to save the changes ui acl ## Relations * Open [Data Sources](/docs/product-docs/data-sources#accessing-data-sources) tab in the Base Settings homepage * Select the data source that you wish to access ERD (Relations view) for * Click on `ERD View` tab relations # Connect to a Data source URL: /docs/product-docs/data-sources/connect-to-data-source Learn how to connect to an external data-source (PG/MySQL) in NocoDB. NocoDB recommends using **MySQL version 5.7 or later** and **PostgreSQL version 14 or later** for best compatibility and performance. To connect an external Database as a new Data Source for NocoDB, follow the steps below: 1. Click on the Base name in the left sidebar to access the **Base homepage** 2. Click **Connect External Data** button 3. Provide a name to the data source 4. Select connection to pick credentials for the database (a) Select connection from the list of available connections in the dropdown\ (b) Click on `+ New connection` button to create a new connection instead 5. Configure / Change database & schema details as required. If default database & schema details were provided during connection creation, these details will be pre-filled. 6. [Configure permissions](#configuring-permissions) for the data source 7. Click on `Test Database Connection` button to verify the connection 8. Click on `Add Source` button to save the data source data source data source data source Option (4b) to create a new connection is available only if the user has the required permissions to create new connection (Workspace Creator+) ## Configuring Permissions This section covers the settings available when configuring data source permissions. These settings determine the level of access and modifications allowed on the connected database. data source-1 NocoDB provides the following options for schema and data permissions: ### Allow Data Edit This option when enabled, users can insert, update, and delete records from the tables. This provides the flexibility to manage the data directly from the NocoDB UI but should be used with caution to avoid unintentional changes to the records in the external data source. This level of access is ideal for administrative users who need to modify data directly. By default, data editing is enabled When data editing is disabled, users can still view the data and perform read-only operations such as filtering, sorting, and grouping. This ensures that users can access the data for analysis and reporting purposes without the risk of modifying the records. Data editing can only be disabled when schema editing is also disabled ### Allow Schema Edit This option enables users to modify the structure of the database schema. When enabled, users can create, modify, and delete tables, fields and relationships (links) within the connected datasource from NocoDB UI. This provides flexibility to adjust the database schema design as needed from UI. NocoDB strongly advises against enabling the schema editing option unless absolutely necessary. Use with extreme caution, as improper changes can severely impact the data integrity and functionality of the connected data source. By default, schema editing is disabled. Even when schema editing is disabled, users can still * add (augment) virtual columns such as Lookup, Rollup and Formula. These virtual columns do not alter the underlying schema of the connected data source. * create views to customize the data presentation without modifying the original tables. * create webhooks to trigger external actions based on specific events within the connected datasource. * collaborate with other users by explicitly inviting them to the base or by sharing views. # Data sources URL: /docs/product-docs/data-sources NocoDB Data-Source sync, access control & re-config ## Overview NocoDB allows you to connect to external data sources and get a unified spreadsheet view of your data. Activities related to external data sources can be managed from `Data Sources` tab in `Base dashboard`. `Data Sources` tab includes following functionalities 1. Connect / manage external data source 2. UI Access Control 3. Relations (ERD View) 4. Meta Sync ## Accessing `Data Sources` 1. Click on Base name in the left sidebar to access **Base homepage** 2. Select **Data Sources** tab data source Learn more about **working with Data sources** in the following sections: * [Connect to a Data source](/docs/product-docs/data-sources/connect-to-data-source) * [Sync changes externally made to data source](/docs/product-docs/data-sources/sync-with-data-source) * [Edit external database configuration parameters](/docs/product-docs/data-sources/actions-on-data-sources#edit-data-source-parameters) * [Remove Data source](/docs/product-docs/data-sources/actions-on-data-sources#remove-data-source) * [Hide Data source](/docs/product-docs/data-sources/actions-on-data-sources#data-source-visibility) * [Relations within a data source](/docs/product-docs/data-sources/actions-on-data-sources#relations) * [View visibility](/docs/product-docs/data-sources/actions-on-data-sources#view-visibility) # Sync with Data source URL: /docs/product-docs/data-sources/sync-with-data-source Learn how to sync changes done in external data source with NocoDB. To sync changes done in the external data source with NocoDB, Open [Data Sources](/docs/product-docs/data-sources#accessing-data-sources) tab in the Base Settings, select the data source you wish to sync metadata for, and follow the steps below: 1. Click on the `Meta Sync` tab 2. Click on the `Reload` button to refresh Sync state (Optional) 3. Any changes to the metadata identified will be listed in the `Sync State` column 4. Click on `Sync Now` button to sync the metadata changes 5. Once the sync is complete, you can see the updated state in the `Sync State` column sync metadata sync metadata After the sync is complete, you can see the updated state in the `Sync State` column.\ Sync modal also marks `Tables metadata is in Sync` in the header. # Updating Secrets URL: /docs/product-docs/data-sources/updating-secret Learn how to update secrets in NocoDB using the nc-secret-mgr package. ## Updating Secrets To update a secret in NocoDB, you can use the `nc-secret-mgr` package. Follow the steps below to update a secret: ### Using the Command Line Interface (CLI) 1. Install the `nc-secret-mgr` package if you haven't already. You can do this by running the following command in your terminal: ```bash npm install -g nc-secret-mgr ``` 2. Once the package is installed, you can update a secret by running the following command: ```bash NC_DB="pg://host:port?u=user&p=password&d=database" nc-secret-mgr update --prev --new ``` OR ```bash NC_DB="pg://host:port?u=user&p=password&d=database" nc-secret-mgr ``` Replace `` with the name of the secret you used previously, and `` with the new value of the secret. 3. After running the command, the secret will be updated in NocoDB. ### Using Executables Alternatively, you can use the `nc-secret-mgr` executable to update secrets. 1. Download the `nc-secret-mgr` executable from the [NocoDB Github](https://github.com/nocodb/nc-secret-mgr/releases/latest). 2. Run the executable using the following command: ```bash NC_DB="pg://host:port?u=user&p=password&d=database" ./nc-secret-mgr-macos-arm64 update --prev --new ``` Replace `` with the name of the secret you used previously, and `` with the new value of the secret. 3. After running the command, the secret will be updated in NocoDB. Note: All environment variables are supported, including `NC_DB`, `NC_DB_JSON`, `NC_DB_JSON_FILE`, `DATABASE_URL`, and `DATABASE_URL_FILE`. You can use any of these variables to specify your database connection. Alternatively, you can use the following equivalent parameters. | Environment Variable | CLI Parameter | | -------------------- | --------------------- | | `NC_DB` | `--nc-db` | | `NC_DB_JSON` | `--nc-db-json` | | `NC_DB_JSON_FILE` | `--nc-db-json-file` | | `DATABASE_URL` | `--database-url` | | `DATABASE_URL_FILE` | `--database-url-file` | # MCP Server URL: /docs/product-docs/developer-resources/mcp Connect NocoDB to Large Language Models (LLMs) via the Model Context Protocol (MCP). The **Model Context Protocol (MCP) Server** lets you connect NocoDB with LLMs that support MCP, such as Claude, Cursor, or Windsurf. With this integration, LLMs can interact directly with your NocoDB base to create, query, update, and manage records. ## Desktop LLM Clients Each MCP endpoint in NocoDB provides a secure URL that can be linked to an MCP-compatible client. Once configured, the LLM can execute database operations in your workspace through natural language prompts. MCP server exposes standard CRUD operations. These can be triggered conversationally, without writing SQL or scripts. | Action | Purpose | Sample Prompt | | ------ | -------------------- | ------------------------------------------------------------- | | Create | Add new records | Create a task named ‘Review Documentation’ | | Read | Look up information | Show me all projects with deadlines this week | | Update | Change existing data | Mark the status of Project X as completed & re-assign to John | | Delete | Remove records | Remove all tasks assigned to John | NocoDB MCP supports only record-level operations and does not handle table, field, or other metadata changes. ### Server Configuration (NocoDB) 1. Click on the **Overview** button in the left sidebar. 2. Select the **Settings** tab. 3. Select the **Model Context Protocol** 4. Click on the **New MCP Endpoint** to create a new MCP config JSON for your base. 5. Provide a name for the MCP endpoint 6. Click **Create** to generate the MCP Config JSON. 7. Copy the generated JSON configuration. This will be used in your LLM client configuration. MCP Config MCP Config ### Client Configuration #### Claude 1. Open **Claude Desktop Preferences** (`⌘+,`). 2. Under **Develop**, click **Edit Config**. 3. Insert the JSON block copied [here](#server-configuration-nocodb) as `claude_desktop_config.json`. 4. Save the file and restart Claude Desktop. #### Cursor 1. Go to **Cursor Settings** (`⇧+⌘+J`). 2. Open the **MCP** tab and select **Add Custom MCP**. 3. Paste the JSON block copied [here](#server-configuration-nocodb). Save. On success, you will see `11 tools enabled` below the MCP Server just installed. If you see an error, double-check the JSON configuration. Cursor MCP Settings #### Windsurf 1. Open **Windsurf Settings** (`⌘+,`). 2. In the **Cascade** section > `Plugins (MCP Server)` > Click **Manage Plugins** 3. Paste the JSON block copied [here](#server-configuration-nocodb). Save. Windsurf MCP Settings Windsurf MCP Settings ### JSON Example ```json { "mcpServers": { "NocoDB MCP": { "command": "npx", "args": [ "mcp-remote", "https://your-domain.com/mcp/", "--header", "xc-mcp-token: " ] } } } ``` Your MCP configurations generated above functions as a set of access credentials, granting full control over your NocoDB base. Ensure it remains confidential, never include it in source control, and store it only in secure, protected locations. *** ## Web based LLM Clients (OAuth) Connect NocoDB to web-based LLM applications using OAuth, enabling seamless database access directly from the browser without requiring desktop client setup. This approach grants granular permission controls and eliminates the need for manual JSON configuration. ### Claude Web OAuth-based integration allows Claude web users to access NocoDB databases through the connectors interface. #### Setup Steps 1. Click [here](https://claude.ai/settings/connectors) to open Claude Web Settings in a new tab. * Alternatively, navigate to **Settings** > **Connectors** from the Claude Web app. 2. Click **Add custom connector**. open-connectors 3. In the "Add custom connector" dialog: * Provide a connector name of your choice * Enter the MCP endpoint URL: `https://app.nocodb.com/mcp` * Click `Add` add-connector-dialog 4. NocoDB Connector will now be listed in "Disconnected" state. Click **Connect** to initiate the OAuth authorization flow (Opens in a new tab). add-connector 5. Authorize Access * You will be asked to log in to your NocoDB account (if not already logged in) * Select the workspace and base you want to connect * Confirm the permissions Claude will have * Access the selected base * Read / create / update / delete records in the selected base * Act on your behalf within the selected resources * Click **Authorize** to grant access authorize-access With this, the NocoDB connector will move to "Connected" state in Claude Web. You can now interact with your NocoDB data through Claude web application. On-prem enterprise users should replace [https://app.nocodb.com](https://app.nocodb.com) with their NocoDB instance URL #### Configure Tool Permissions By default, all tools are set to "Always ask permission" to ensure you have control over each operation Claude performs. You can modify these settings as needed. Click [here](https://claude.ai/settings/connectors) to open Claude Web Settings in a new tab. Click **Configure** on the NocoDB connector to manage tool permissions. Set each tool's permission level using the dropdown menu: * **Always ask permission** — Your approval is required every time Claude uses this tool * **Allow unsupervised** — Claude can use this tool without requesting approval tool-permissions tool-permissions To retrieve Workspace & Base information that this connector has access to, use the "Get Base Info" tool. get-base-info #### Using NocoDB Tools in Claude Web Once configured, you can interact with your NocoDB data conversationally. For example: * "Show me all projects with deadlines this week" * "Create a task named 'Review Documentation'" * "Mark the status of Project X as completed and reassign to John" * "Provide details of our top 3 sponsors" Claude will execute these requests using the enabled NocoDB tools, reading from and writing to your database based on the permissions you've granted. connected-connector OAuth authorization functions as a set of access credentials granting Claude control over your NocoDB base within the selected workspace. Only authorize access to bases and operations you trust Claude to perform on your behalf. ### ChatGPT OAuth-based integration enables OpenAI web users (ChatGPT) to securely connect with NocoDB databases through the MCP connector, directly from their browser environment. This provides the same granular access control and eliminates the need for manual configuration or desktop client setup. #### Prerequisites Enable Developer Mode in ChatGPT settings to allow custom connector additions. 1. Open [ChatGPT Settings](https://chatgpt.com/#settings/Connectors) in a new tab. * Alternatively, click your **Profile Icon** → **Settings** → **Settings** → **Apps & Connectors**). 2. Click **Advanced Settings** & enable **Developer Mode**. open-connectors #### Setup Steps 1. Open [ChatGPT Settings](https://chatgpt.com/#settings/Connectors) in a new tab. * Alternatively, click your **Profile Icon** → **Settings** → **Settings** → **Apps & Connectors**). 2. Click **Create** button in top right corner of the **Connectors** modal. 3. In the "New connector" dialog: * Provide a connector name of your choice. Optionally, add a description / icon. * Enter the MCP Server URL: `https://app.nocodb.com/mcp` * Check the box for **I trust this application**. * Click `Create` new-connector 4. Authorize Access: * Log in to your NocoDB account if prompted * Select the workspace and base you want to connect * Review and confirm the permissions being requested: * Access to the selected base * Read / create / update / delete records * Act on your behalf within the selected resources * Click **Authorize** Once authorization completes, you will see a confirmation message in ChatGPT Web indicating the NocoDB connector is now connected. connected For on-prem enterprise users, replace `https://app.nocodb.com` with your NocoDB instance URL. #### Using NocoDB Tools in OpenAI Web On the ChatGPT interface, start a new conversation and * Click the **+** icon to open the "Tools" menu, enable `Developer Mode` if not already enabled. * Click `More` to find and select the NocoDB connector you created. Toggle to enable it. using-connector Once configured, you can query or update your NocoDB data conversationally. For example: * “List all open support tickets assigned to me” * “Add a new contact named ‘Alice Chen’ to the CRM base” * “Update the status of Order #2456 to ‘Shipped’” * “Summarize total revenue by month from the Sales base” ChatGPT executes these actions using the connected NocoDB tools according to the permissions granted. OAuth authorization provides ChatGPT controlled access to your NocoDB base within the selected workspace. Only authorize operations and bases you trust ChatGPT to manage on your behalf. *** # Architecture overview URL: /docs/product-docs/engineering/architecture Simple overview of NocoDB architecture By default, if `NC_DB` is not specified, then SQLite will be used to store your metadata. We suggest users to separate the metadata and user data in different databases. image | Project Type | Metadata stored in | Data stored in | | -------------------------------------- | ------------------ | ----------------- | | Create new base | NC\_DB | NC\_DB | | Create new base with External Database | NC\_DB | External Database | | Create new base from Excel | NC\_DB | NC\_DB | # Releases & builds URL: /docs/product-docs/engineering/builds-and-releases NocoDB creates Docker and Binaries for each PR ## Builds of NocoDB There are 3 kinds of docker builds in NocoDB * Release builds [nocodb/nocodb](https://hub.docker.com/r/nocodb/nocodb) : built during NocoDB release. * Daily builds [nocodb/nocodb-daily](https://hub.docker.com/r/nocodb/nocodb-daily) : built every 6 hours from Develop branch. * Timely builds [nocodb/nocodb-timely](https://hub.docker.com/r/nocodb/nocodb-timely): built for every PR and manually triggered PRs. Below is an overview of how to make these builds and what happens behind the scenes. ## Release builds ### How to make a release build ? * Click [NocoDB release action](https://github.com/nocodb/nocodb/actions/workflows/release-nocodb.yml) * You should see the below screen NocoDB Release Workflow * Change `Use workflow from` to `Branch: master`. If you choose the wrong branch, the workflow will be ended. Release Branch Selection * Then there would be two cases - you can either leave target tag and pervious tag blank or manually input some values * Target Tag means the target deployment version, while Previous Tag means the latest version as of now. Previous Tag is used for Release Note only - showing the file / commit differences between two tags. ### Tagging The naming convention would be following given the actual release tag is `0.100.0` * `0.100.0-beta.0` (first version of pre-release) * `0.100.0-beta.1` (include bug fix changes on top of the previous version) * `0.100.0-beta.2`(include bug fix changes on top of the previous version) * and so on ... * `0.100.0` (actual release) * `0.100.1` (minor bug fix release) * `0.100.2` (minor bug fix release) ### Case 1: Leaving inputs blank * If Previous Tag is blank, then the value will be fetched from [latest](https://github.com/nocodb/nocodb/releases/latest) * If Target Tag is blank, then the value will be Previous Tag plus one. Example: 0.90.11 (Previous Tag) + 0.0.1 = 0.90.12 (Target Tag) ### Case 2: Manually Input Why? Sometimes we may mess up in NPM deployment. As NPM doesn't allow us to redeploy to the same tag again, in this case we cannot just use the previous tag + 1. Therefore, we need to use previous tag + 2 instead and we manually configure it. * After that, click `Run workflow` to start * You can see Summary for the overall job status. * Once `release-draft-note` and `release-executables` is finished, then go to [releases](https://github.com/nocodb/nocodb/releases), edit the draft note and save as draft for time being. * Example: Adding header, update content if necessary, and click `Auto-generate release notes` to include more info. * Once `release-docker` is finished, then test it locally first. You'll be expected to see `Upgrade Available` notification in UI as we haven't published the release note. (the version is retrieved from there) * Once everything is finished, then publish the release note and the deployment is considered as DONE. ### How does release action work ? #### validate-branch To check if `github.ref` is master. Otherwise, other branches will be not accepted. #### process-input To enrich target tag or previous tag if necessary. #### pr-to-master Automate a PR from develop to master branch so that we know the actual differences between the previous tag and the current tag. We choose master branch for a deployment base. #### release-npm Build frontend and backend and release them to NPM. The changes during built such as version bumping will be committed and pushed to a temporary branch and an automated PR will be created and merged to master branch. Note that once you publish with a certain tag, you cannot publish with the same tag again. #### release-draft-note Generate a draft release note. Some actions need to be done after this step. #### release-docker Build docker image and publish it to Docker Hub. It may take around 15 - 30 mins. #### close-issues Open issues marked with label `Status: Fixed` and `Status: Resolved` will be closed by bot automatically with comment mentioning the fix is included in which version. Example: Close Issues Example #### publish-docs Publish Documentations #### update-sdk-path `nocodb-sdk` is used in frontend and backend. However, in develop branch, the value would be `file:../nocodb-sdk` for development purpose (so that the changes done in nocodb-sdk in develop will be included in frontend and backend). During the deployment, the value will be changed to the target tag. This job is to update them back. #### sync-to-develop Once the deployment is finished, there would be some new changes being pushed to master branch. This job is to sync the changes back to develop so that both branch won't have any difference. ## Daily builds ### What are daily builds ? * NocoDB creates every 6 hours from develop branches and publishes as nocodb/nocodb-daily * This is so that we can easily try what is in the develop branch easily. ### Docker images * The docker images will be built and pushed to Docker Hub (See [nocodb/nocodb-daily](https://hub.docker.com/r/nocodb/nocodb-daily/tags) for the full list). ## Timely builds ### What are timely builds ? NocoDB has github actions which creates docker and binaries for each PR! And these can be found as a **comment on the last commit** of the PR. Example shown below * Go to a PR and click on the comment. PR Comment Timely Build * Click on the link to copy the docker image and run it locally. Docker Copy Command This is to * reduce pull request cycle time * allow issue reporters / reviewers to verify the fix without setting up their local machines ### Docker images When a non-draft Pull Request is created, reopened or synchronized, a timely build for Docker would be triggered for the changes only included in the following paths. * `packages/nocodb-sdk/**` * `packages/nc-gui/**` * `packages/nocodb/**` The docker images will be built and pushed to Docker Hub (See [nocodb/nocodb-timely](https://hub.docker.com/r/nocodb/nocodb-timely/tags) for the full list). Once the image is ready, GitHub bot will add a comment with the command in the pull request. The tag would be `-pr---`. Timely Build Comment ## Executables or Binaries Similarly, we provide a timely build for executables for non-docker users. The source code will be built, packaged as binary files, and pushed to GitHub (See [nocodb/nocodb-timely](https://github.com/nocodb/nocodb-timely/releases) for the full list). Currently, we only support the following targets: * `node16-linux-arm64` * `node16-macos-arm64` * `node16-win-arm64` * `node16-linux-x64` * `node16-macos-x64` * `node16-win-x64` Once the executables are ready, GitHub bot will add a comment with the commands in the pull request. Executables Comment NocoDB creates Docker and Binaries for each PR. This is to * reduce pull request cycle time * allow issue reporters / reviewers to verify the fix without setting up their local machines # Development Setup URL: /docs/product-docs/engineering/development-setup How to set-up your development environment ## Clone the repo ```bash git clone https://github.com/nocodb/nocodb # change directory to the project root cd nocodb ``` ## Install dependencies ```bash # run from the project root # this command will install the dependencies including sdk build pnpm bootstrap ``` ## Start Frontend ```bash # run from the project root pnpm start:frontend # runs on port 3000 ``` ## Start Backend ```bash # run from the project root pnpm start:backend # runs on port 8080 ``` Any changes made to frontend and backend will be automatically reflected in the browser. ## Enabling CI-CD for Draft PR CI-CD will be triggered on moving a PR from draft state to `Ready for review` state & on pushing changes to `Develop`. To verify CI-CD before requesting for review, add label `trigger-CI` on Draft PR. ## Accessing CI-CD Failure Screenshots For Playwright tests, screenshots are captured on the tests. These will provide vital clues for debugging possible issues observed in CI-CD. To access screenshots, Open link associated with CI-CD run & click on `Artifacts` CI-CD Artifacts # Playwright E2E testing URL: /docs/product-docs/engineering/playwright Overview to playwright based e2e tests ## How to run tests All the tests reside in `tests/playwright` folder. Make sure to install the dependencies (in the playwright folder): ```bash pnpm --filter=playwright install pnpm exec playwright install --with-deps chromium ``` ### Run Test Server Start the backend test server (in `packages/nocodb` folder): ```bash pnpm run watch:run:playwright ``` Start the frontend test server (in `packages/nc-gui` folder): ```bash NUXT_PAGE_TRANSITION_DISABLE=true pnpm run dev ``` ### Running all tests For selecting db type, rename `.env.example` to `.env` and set `E2E_DEV_DB_TYPE` to `sqlite`(default), `mysql` or `pg`. headless mode(without opening browser): ```bash pnpm run test ``` with browser: ```bash pnpm run test:debug ``` For setting up mysql(sakila): ```bash docker-compose -f ./tests/playwright/scripts/docker-compose-mysql-playwright.yml up -d ``` For setting up postgres(sakila): ```bash docker-compose -f ./tests/playwright/scripts/docker-compose-playwright-pg.yml ``` ### Running individual tests Add `.only` to the test you want to run: ```js test.only('should login', async ({ page }) => { // ... }) ``` ```bash pnpm run test ``` ## Concepts ### Independent tests * All tests are independent of each other. * Each test starts with a fresh project with a fresh sakila database(option to not use sakila db is also there). * Each test creates a new user(email as `user@nocodb.com`) and logs in with that user to the dashboard. Caveats: * Some stuffs are shared i.e, users, plugins etc. So be catious while writing tests touching that. A fix for this is in the works. * In test, we prefix email and project with the test id, which will be deleted after the test is done. ### What to test * UI verification. This includes verifying the state of the UI element, i.e if the element is visible, if the element has a particular text etc. * Test should verify all user flow. A test has a default timeout of 60 seconds. If a test is taking more than 60 seconds, it is a sign that the test should be broken down into smaller tests. * Test should also verify all the side effects the feature(i.e. On adding a new field type, should verify field deletion as well) will have, and also error cases. * Test name should be descriptive. It should be easy to understand what the test is doing by just reading the test name. ### Playwright * Playwright is a nodejs library for automating chromium, firefox and webkit. * For each test, a new browser context is created. This means that each test runs in a new incognito window. * For assertion always use `expect` from `@playwright/test` library. This library provides a lot of useful assertions, which also has retry logic built in. ## Page Objects * Page objects are used to abstract over the components/page. This makes the tests more readable and maintainable. * All page objects are in `tests/playwright/pages` folder. * All the test related code should be in page objects. * Methods should be as thin as possible and its better to have multiple methods than one big method, which improves reusability. The methods of a page object can be classified into 2 categories: * Actions: Performs an UI actions like click, type, select etc. Is also responsible for waiting for the element to be ready and the action to be performed. This included waiting for API calls to complete. * Assertions: Asserts the state of the UI element, i.e if the element is visible, if the element has a particular text etc. Use `expect` from `@playwright/test` and if not use `expect.poll` to wait for the assertion to pass. ## Writing a test Let's write a test for testing filter functionality. For simplicity, we will have `DashboardPage` implemented, which will have all the methods related to dashboard page and also its child components like Grid, etc. ### Create a test suite Create a new file `filter.spec.ts` in `tests/playwright/tests` folder and use `setup` method to create a new project and user. ```js import { test, expect } from '@playwright/test'; import setup, { NcContext } from '../setup'; test.describe('Filter', () => { let context: NcContext; test.beforeEach(async ({ page }) => { context = await setup({ page }); }) test('should filter', async ({ page }) => { // ... }); }); ``` ### Create a page object Since filter is UI wise scoped to a `Toolbar` , we will add filter page object to `ToolbarPage` page object. ```js export class ToolbarPage extends BasePage { readonly parent: GridPage | GalleryPage | FormPage | KanbanPage; readonly filter: ToolbarFilterPage; constructor(parent: GridPage | GalleryPage | FormPage | KanbanPage) { super(parent.rootPage); this.parent = parent; this.filter = new ToolbarFilterPage(this); } } ``` We will create `ToolbarFilterPage` page object, which will have all the methods related to filter. ```js export class ToolbarFilterPage extends BasePage { readonly toolbar: ToolbarPage; constructor(toolbar: ToolbarPage) { super(toolbar.rootPage); this.toolbar = toolbar; } } ``` Here `BasePage` is an abstract class, which used to enforce structure for all page objects. Thus all page object *should* inherit `BasePage`. * Helper methods like `waitForResponse` and `getClipboardText` (this can be access on any page object, with `this.waitForResponse`) * Provides structure for page objects, enforces all Page objects to have `rootPage` property, which is the page object created in the test setup. * Enforces all pages to have a `get` method which will return the locator of the main container of that page, hence we can have focused dom selection, i.e. ```js // This will only select the button inside the container of the concerned page await this.get().querySelector('button').count(); ``` ### Writing an action method This a method which will reset/clear all the filters. Since this is an action method, it will also wait for the `delete` filter API to return. Ignoring this API call will cause flakiness in the test, down the line. ```js async resetFilter() { await this.waitForResponse({ uiAction: async () => await this.get().locator('.nc-filter-item-remove-btn').click(), httpMethodsToMatch: ['DELETE'], requestUrlPathToMatch: '/api/v1/db/meta/filters/', }); } ``` ### Writing an assertion/verification method Here we use `expect` from `@playwright/test` library, which has retry logic built in. ```js import { expect } from '@playwright/test'; async verifyFilter({ title }: { title: string }) { await expect( this.get().locator(`[data-testid="nc-fields-menu-${title}"]`).locator('input[type="checkbox"]') ).toBeChecked(); } ``` ## Tips to avoid flakiness * If an UI action, causes an API call or the UI state change, then wait for that API call to complete or the UI state to change. * What to wait out can be situation specific, but in general, is best to wait for the final state to be reached, i.e. in the case of creating filter, while it seems like waiting for the filter API to complete is enough, but after its return the table records are reloaded and the UI state changes, so its better to wait for the table records to be reloaded. ## Accessing playwright report in the CI * Open `Summary` tab in the CI workflow in github actions. * Scroll down to `Artifacts` section. * Access reports which suffixed with the db type and shard number(corresponding to the CI workerflow name). i.e `playwright-report-mysql-2` is for `playwright-mysql-2` workflow. * Download it and run `pnpm install -D @playwright/test && npx playwright show-report ./` inside the downloaded folder. # Repository structure URL: /docs/product-docs/engineering/repository-structure Repository Structure We use `Lerna` to manage multi-packages. We have the following [packages](https://github.com/nocodb/nocodb/tree/master/packages). * `packages/nocodb-sdk`: API client sdk of nocodb. * `packages/nc-gui`: NocoDB Frontend. * `packages/nc-lib-gui`: The build version of `nc-gui` which will be used in `packages/nocodb`. * `packages/nocodb`: NocoDB Backend, hosted in [NPM](https://www.npmjs.com/package/nocodb). # i18n translation URL: /docs/product-docs/engineering/translation Contribute to NocoDB's i18n translation * NocoDB supports 30+ foreign languages & community contributions are now simplified via [Crowdin](https://crowdin.com/). ## How to add / edit translations ? ### Using GitHub * For English, make changes directly to [en.json](https://github.com/nocodb/nocodb/blob/develop/packages/nc-gui/lang/en.json) & commit to `develop` * For any other language, use `crowdin` option. ### Using Crowdin * Setup [Crowdin](https://crowdin.com) account * Join [NocoDB](https://crowdin.com/project/nocodb) project Crowdin Join Project * Click the language that you wish to contribute Crowdin Select Language * Click the `Translate` button; this opens up `Crowdin Online Editor` Crowdin Translate Button * Select string in `English` on the left-hand menu bar \[1] * Propose changes \[2] * Save \[3] Note: Crowdin provides translation recommendation's as in \[4]. Click directly if it's apt Crowdin Online Editor A GitHub Pull Request will be automatically triggered (periodicity- 6 hours). We will follow up on remaining integration work items. #### Reference Refer following articles to get additional details about Crowdin Portal usage * [Translator Introduction](https://support.crowdin.com/crowdin-intro/) * [Volunteer Translation Introduction](https://support.crowdin.com/for-volunteer-translators/) * [Online Editor](https://support.crowdin.com/online-editor/) ## How to add a new language ? #### GitHub changes * Update enumeration in `enums.ts` \[packages/nc-gui/lib/enums.ts] * Map JSON path in `a.i18n.ts` \[packages/nc-gui/plugins/a.i18n.ts] #### Crowdin changes \[admin only] * Open `NocoDB` project * Click on `Language` on the home tab * Select target language, `Update` * Update array in `tests/playwright/tests/language.spec.ts` Crowdin Language Settings Crowdin Language Update ## String Categories * **General**: simple & common tokens (save, cancel, submit, open, close, home, and such) * **Objects**: objects from NocoDB POV (project, table, field, view, page, and such) * **Title**: screen headers (compact) (menu headers, modal headers) * **Lables**: text box/ radio/ field headers (few words) (Labels over textbox, radio buttons, and such) * **Activity**/ actions: work items (few words) (Create Project, Delete Table, Add Record, and such) * **Tooltip**: additional information associated with work items (usually lengthy) (Additional information provided for activity) * **Placeholder**: placeholders associated with various textboxes (Text placeholders) * **Msg** * Info: general/success category for everything * Error: warnings & errors * Toast: pop-up toast messages > Note: string name should be in camelCase. Use above list as priority order in case of ambiguity. # Writing unit tests URL: /docs/product-docs/engineering/unit-testing Overview to Unit Testing ## Unit Tests * All individual unit tests are independent of each other. We don't use any shared state between tests. * Test environment includes `sakila` sample database and any change to it by a test is reverted before running other tests. * While running unit tests, it tries to connect to mysql server running on `localhost:3306` with username `root` and password `password` (which can be configured) and if not found, it will use `sqlite` as a fallback, hence no requirement of any sql server to run tests. ### Pre-requisites * MySQL is preferred - however tests can fallback on SQLite too ### Setup ```bash pnpm --filter=-nocodb install # add a .env file cp tests/unit/.env.sample tests/unit/.env # open .env file open tests/unit/.env ``` Configure the following variables > DB\_HOST : host > DB\_PORT : port > DB\_USER : username > DB\_PASSWORD : password ### Run Tests ```bash pnpm run test:unit ``` ### Folder Structure The root folder for unit tests is `packages/nocodb/tests/unit` * `rest` folder contains all the test suites for rest apis. * `model` folder contains all the test suites for models. * `factory` folder contains all the helper functions to create test data. * `init` folder contains helper functions to configure test environment. * `index.test.ts` is the root test suite file which imports all the test suites. * `TestDbMngr.ts` is a helper class to manage test databases (i.e. creating, dropping, etc.). ### Factory Pattern * Use factories for create/update/delete data. No data should be directly create/updated/deleted in the test. * While writing a factory make sure that it can be used with as less parameters as possible and use default values for other parameters. * Use named parameters for factories. ```ts createUser({ email, password}) ``` * Use one file per factory. ### Walk through of writing a Unit Test We will create an `Table` test suite as an example. #### Configure test We will configure `beforeEach` which is called before each test is executed. We will use `init` function from `nocodb/packages/nocodb/tests/unit/init/index.ts`, which is a helper function which configures the test environment(i.e resetting state, etc.). `init` does the following things - * It initializes a `Noco` instance(reused in all tests). * Restores `meta` and `sakila` database to its initial state. * Creates the root user. * Returns `context` which has `auth token` for the created user, node server instance(`app`), and `dbConfig`. We will use `createProject` and `createProject` factories to create a project and a table. ```typescript let context; beforeEach(async function () { context = await init(); project = await createProject(context); table = await createTable(context, project); }); ``` #### Test case We will use `it` function to create a test case. We will use `supertest` to make a request to the server. We use `expect`(`chai`) to assert the response. ```typescript it('Get table list', async function () { const response = await request(context.app) .get(`/api/v1/db/meta/projects/${project.id}/tables`) .set('xc-auth', context.token) .send({}) .expect(200); expect(response.body.list).to.be.an('array').not.empty; }); ``` We can also run individual test by using `.only` in `describe` or `it` function and the running the test command. ```typescript it.only('Get table list', async () => { ``` #### Integrating the New Test Suite We create a new file `table.test.ts` in `packages/nocodb/tests/unit/rest/tests` directory. ```typescript import 'mocha'; import request from 'supertest'; import init from '../../init'; import { createTable, getAllTables } from '../../factory/table'; import { createProject } from '../../factory/project'; import { defaultColumns } from '../../factory/column'; import Model from '../../../../src/lib/models/Model'; import { expect } from 'chai'; function tableTest() { let context; let project; let table; beforeEach(async function () { context = await init(); project = await createProject(context); table = await createTable(context, project); }); it('Get table list', async function () { const response = await request(context.app) .get(`/api/v1/db/meta/projects/${project.id}/tables`) .set('xc-auth', context.token) .send({}) .expect(200); expect(response.body.list).to.be.an('array').not.empty; }); } export default function () { describe('Table', tableTests); } ``` We can then import the `Table` test suite to `Rest` test suite in `packages/nocodb/tests/unit/rest/index.test.ts` file(`Rest` test suite is imported in the root test suite file which is `packages/nocodb/tests/unit/index.test.ts`). ### Seeding Sample DB (Sakila) ```typescript function tableTest() { let context; let sakilaProject: Project; let customerTable: Model; beforeEach(async function () { context = await init(); /******* Start : Seeding sample database **********/ sakilaProject = await createSakilaProject(context); /******* End : Seeding sample database **********/ customerTable = await getTable({project: sakilaProject, name: 'customer'}) }); it('Get table data list', async function () { const response = await request(context.app) .get(`/api/v1/db/data/noco/${sakilaProject.id}/${customerTable.id}`) .set('xc-auth', context.token) .send({}) .expect(200); expect(response.body.list[0]['FirstName']).to.equal('MARY'); }); } ``` # Writing docs URL: /docs/product-docs/engineering/writing-docs Overview to writing docs This article discusses some of the protocol and conventions to be followed while writing docs. ## Folder Structure * Docs follow object-oriented approach. Each folder represents an object and each file represents procedures associated with that object. * Each folder contains an `meta.json` file which contains the metadata for that object. ``` { "title": "Engineering", "icon": "terminal", "pages": [ "architecture", "repository-structure", "development-setup", "unit-testing", "playwright", "build-and-releases", "translations", "writing-docs" ] } ``` ## File Structure * Add following metadata to the top of each file. ``` --- title: "Writing docs" description: "Overview to writing docs" tags: ['Engineering'] keywords: ['Engineering', Writing docs', 'Docs conventions'] --- ``` * `title` is the title of the article that appears on the sidebar and on the top of the article. * `description` is the description of the article that appears in search results. * `tags` are the tags associated with the article. Tags are used to group articles together. For example, all articles with the tag `Workspaces` will be grouped together. * `keywords` are the keywords associated with the article. Keywords are used to improve search results. For example, if the user searches for `Create workspace`, then the article with the keyword `Create workspace` will be displayed in the search results. ## Nomenclature * Folder names & file name are * in kebab-case. * For example, `account-settings`. * Only first letter of the folder/file name is capitalized. Second letter onwards, first letter is capitalized only if it is a proper noun. ## Tags * First letter of each tag is capitalized. * Tags usually are Objects or Actions. Add a tag only if we are sure that the tag will be used in multiple places. Example: 'Create' - we can have `Create project`, `Create user`, `Create API token` etc. ### Active Tags Tags that are currently being used in the docs are listed below. See if you can reuse any of these tags before adding a new tag. ## Description * Description should be crisp and to the point. Preferably one line. * Refer to the description associated with the tag to get an idea of how the description should be. * Descriptions appear in the search results (when searched by tags). So, it should be descriptive enough to give the user an idea of what the article is about. Search by tags ## Images * Annotated images should be placed in `img/v2` folder. * For every annotated image, there should be a corresponding unannotated image in the `img/v2-unannotated` folder. * Images are kept in the same folder structure as the docs. * Use `Skitch` for annotations. ## Before you commit * Use `pnpm run build` to build the docs. * Ensure that the build is successful & there are no errors/warnings related to missing links, images, etc. # Bulk Update URL: /docs/product-docs/extensions/bulk-update Update multiple records in a table at once ## Overview Bulk Update The Bulk Update extension empowers users to modify multiple records across a selected table view simultaneously. Instead of editing each row one by one, you can define field-level updates and apply them to all visible records with a single action—saving time and reducing manual errors. Bulk updates are irreversible. Ensure you review the changes before confirming the update. ## Updating Records Follow these steps to update multiple records in a table: 1. Select the table and associated view you wish to update. 2. Click the **New Action** button. 3. Choose the **Field** you want to update. 4. Select an **Update Type**: * **Set Value**: Set a specific value for the field. * **Clear Value**: Clear the field value. 5. If you selected **Set Value**, provide the **Value** to be applied. 6. Click the **Update Records** button to apply the changes. 7. A confirmation dialog will display the number of fields and records to be updated. Review the details and click **Confirm Update** to proceed. Bulk Update You can add multiple actions to update different fields in the table. Bulk updates affect all records within the current view, including those not visible on the screen. Since views are just filtered representations of the same underlying data, any record that appears in multiple views will also reflect the update. These updates apply only to records in the selected view and do not impact records outside of it or in unrelated views. ## Managing Actions The Update work items added are listed in the **Actions** section. You can: * **Edit** an action by clicking on the action item in the list & making the necessary changes. * **Delete** an action by clicking on the delete icon next to the action item. * **Disable** an action by toggling the switch next to the action item. Disabling an action will prevent it from being applied to the records. For any configured bulk update extension, you can reuse the **Update Records** button to repeat the batch update process. This is particularly useful when you need to apply the same changes across multiple records in the future. # Data Exporter URL: /docs/product-docs/extensions/data-exporter Export data from NocoDB in various formats ## Overview The `Data Exporter` extension is designed to simplify the process of exporting data from your NocoDB tables. With just a few clicks, you can effortlessly download CSV files for any specific table and view within your base. The download process is handled asynchronously in the background, ensuring that your application usage remains uninterrupted. Once your file is ready, you’ll receive a notification, allowing you to download the CSV into your local machine at your convenience. ## Exporting Data Follow these steps to export data from your NocoDB tables: 1. Select the table and associated view you wish to export. 2. Configure optional settings for Separator and Encoding: * Default separator: Comma `,` * Other options: Semicolon `;`, Pipe `|` and `Tab` 3. Click the **Export** button. 4. Once the export is complete, the file will be listed in the **Recent Exports** section. 5. Click the **Download** button to save the CSV file to your local device. Separator and Encoding configurations are only accessible from the expanded extension panel. Data Exporter ## Managing Exports The files exported have a limited lifespan and are automatically removed after 6 hours. The files listed under the **Recent Exports** section are only visible to you and are not shared with other users. You can manage your exports by downloading or removing them as needed. ### Downloading Exports 1. In the Recent Exports section, locate the desired file. 2. Click the Download icon next to the file to save it to your device. ### Removing Exports 1. Locate it in the Recent Exports section. 2. Click the `x` icon to remove it from the list. # Dedupe URL: /docs/product-docs/extensions/dedupe Identify and merge duplicate records in a table ## Overview Dedupe The Dedupe extension helps you identify and merge duplicate records in a table using one or more fields for grouping. Instead of manually scanning and comparing records, Dedupe detects groups of records with matching values across the selected fields and provides a guided interface to review, select, and merge them into a single primary record. This extension is especially useful for maintaining clean datasets such as contacts, leads, or inventories where duplicate entries are common. Merging duplicate records is irreversible. Once records are merged, deleted records cannot be restored. *** ## Finding Duplicate Records Follow these steps to detect duplicate records: 1. Select the **Table** you want to scan for duplicates. Optionally, you can also select a specific **View** within that table to limit the scope of the records being analyzed. 2. Select one or more **Field(s)** to group records by. You can choose multiple fields from the dropdown to define more granular deduplication criteria. 3. Dedupe identifies groups where **two or more records** share the same values across all the selected fields. 4. Each group is presented for review one at a time. Dedupe Find Duplicates *** ## Resolving Duplicate Records For each duplicate group, review and merge records as follows: 1. Select **one primary record** to keep. 2. If a record shown in the group is not actually a duplicate, **exclude** it. Excluded records are not merged and not deleted. 3. Optionally, for each field - click a value from any record to copy it into the primary record. 4. Once satisfied, proceed to merge the group. When the merge is completed: * The primary record is retained with its original primary key. * Selected field values are copied into the primary record. * All non-excluded duplicate records in the group are permanently deleted. Dedupe Review Dedupe Review - Field Selection Dedupe Merge *** ## Field Behavior During Merge All editable fields are displayed except the grouping field(s) & system fields (e.g. `id`, `created_at`, `updated_at`). Virtual fields (Formula, Lookup, Rollup) are shown for reference as these cannot be edited directly. Record ID of the primary record is always retained. Modified timestamps are updated automatically. When merging, field values are handled as follows: * If you select a value from any record for a field, that value is copied into the primary record. * If no value is selected for a field, the primary record's existing value remains unchanged. *** ## Group Review Actions While reviewing duplicate groups, you can: * **Skip group** Move to the next duplicate group without making any changes. * **Reset** Clear all selections for the current group (primary record, field selections, exclusions) and start over. Dedupe Actions You can skip a group before selecting a primary record, or reset even after making selections. *** ## Supported Field Types **Supported for duplicate detection** * Text, LongText, SingleLineText * Number, Decimal, Currency, Percent, Duration, Rating * Date, DateTime, Time, Year * Phone, Email, URL * SingleSelect, MultiSelect * Checkbox * Attachment * JSON, Geometry * User * Links & LinkToAnotherRecord (LTAR): many-to-many, belongs-to-one **Not supported** * Links & LinkToAnotherRecord (LTAR): has-many, one-to-one *** ## Key Notes * Duplicate detection supports **single-field or multi-field grouping** * When multiple fields are selected, records must match on **all** selected fields to be grouped as duplicates * At least **two matching records** are required per group * Undo / Redo is not supported * Deleted records cannot be restored The Dedupe extension provides a controlled and efficient way to clean up duplicate data while giving you full visibility and control over what gets merged and removed. *** # Extensions URL: /docs/product-docs/extensions Overview of the extensions available in NocoDB The Extensions feature is available on NocoDB cloud and on-premise licensed deployments. Extensions are modular components designed to expand and customize your experience with NocoDB. Functioning like plugins, extensions introduce new features and functionalities beyond the platform's core capabilities, allowing users to adapt NocoDB to suit unique requirements and workflows. This section provides an overview of the Extensions framework, detailing how to install, manage, and utilize extensions to optimize your NocoDB base. * [Extension Marketplace](#extensions-marketplace) * [Adding Extensions](#adding-extensions) * [Managing Extensions](#managing-extensions) Extensions can be developed using JavaScript and Vue.js, offering a flexible approach to adding new features to your NocoDB instance. The ability to develop custom extensions will be available soon, allowing you to tailor NocoDB to meet specific needs and workflows. Stay tuned for more updates! The Extensions side panel can be toggled using the `Extensions` button located in the top-right corner of the NocoDB interface. Extensions side panel ## Extensions Marketplace The Extensions Marketplace is a centralized hub where you can explore, discover, and install extensions to enhance your NocoDB experience. The following extensions are currently available in the marketplace: * [Data Exporter](/docs/product-docs/extensions/data-exporter) * [Upload Data from CSV](/docs/product-docs/extensions/upload-data-from-csv) * [URL Preview](/docs/product-docs/extensions/url-preview) * [World Clock](/docs/product-docs/extensions/world-clock) * [Page Designer](/docs/product-docs/extensions/page-designer) * [Bulk Update](/docs/product-docs/extensions/bulk-update) Note that, the ability to develop custom extensions is not supported currently. ## Adding Extensions To add an extension to your NocoDB instance, open extensions side panel and follow these steps: 1. Click the `Add Extension` button in the Extensions side panel. 2. Click the `Add` button to add the extension to your NocoDB instance. You can also click on the extension card to view more details about the extension. * The extensions installed are specific to the base and are not shared across workspace. * Multiple instances of the same extension can be added to a base. Add Extension-1 Add Extension-2 ## Managing Extensions After installing an extension, you can manage it using the following options: ### 1. Adjust Visibility Use the `expand` icon to view the extension in full screen mode. Extension visibility ### 2. Reorder Extensions Use the `drag-drop` icon to reorder the extensions in the side panel. Reorder ### 3. Additional Actions Use the `More` button to perform the following actions: * Rename extension * Duplicate extension * Clear data * Delete extension more-actions # Org Chart URL: /docs/product-docs/extensions/org-chart Display an organization chart based on your data ## Overview The Org Chart extension in NocoDB allows you to visualize hierarchical data in the form of an organization chart. This extension is particularly useful for displaying relationships within teams, departments, or any other hierarchical structure based on your data. # Page Designer URL: /docs/product-docs/extensions/page-designer Create printable and shareable layouts from your database records ## Overview Page Designer The **Page Designer** extension allows users to create printable and shareable (PDF) visual layouts from their database records. Common use cases include generating invoices, reports, certificates, and summaries—by combining text, images, and dynamic field data in a freeform design canvas. This feature is ideal for teams who want to convert structured table data into branded, formatted documents directly within NocoDB. ## Key Features * **Drag-and-drop Builder**: Add text, images, tables, and dividers to customize your page layout. * **Record-specific Rendering**: Auto-populates fields dynamically from the selected record. * **Supports Linked Records**: Render data from related tables in a tabular, list, or inline format. * **Full Design Control**: Modify font, alignment, borders, colors, and more for each element. * **Print & PDF Export**: Preview your design and export directly to PDF. ## How to Access To get started: 1. Open **Page Designer** from the **Extensions** menu in your NocoDB instance. 2. Choose the target **table** and **view** from which records will be pulled. 3. Select a specific **record** to preview and design the layout interactively. ## Designing Your Page The canvas on the left shows a preview of your document layout. Use the sidebar on the right to add and arrange elements. ### Add Elements Add components to your layout by dragging them onto the canvas: | Element | Description | | --------- | ---------------------------------------------------- | | 🅰️ Text | Add static or dynamic text (linked to table fields). | | 🖼️ Image | Add image blocks, such as logos or banners. | | ➖ Divider | Insert horizontal lines for visual separation. | ### Bind Field Data Under **Field Elements**, you can drag and drop database fields onto the canvas. Once dropped into the canvas, these fields will auto-populate with values from the selected record. You can also format these fields using the sidebar options (font size, color, alignment, etc.). ##### Field Configuration For most field types, you can configure: | Setting | Description | | ---------------- | --------------------------------------------------- | | Font settings | Customize font family, size, line height, and color | | Alignment | Set horizontal and vertical alignment | | Border & Radius | Add borders and set corner radius | | Background color | Set background color for the field | ### Linked Records The **Linked Records** section allows you to display related table data using three formats: * **Inline**: Display as plain text. * **List**: Show entries in a vertical list. * **Table** : Render fields from the related table as a structured table with columns and rows. For linked records displayed in tabluar format, you can choose which fields to display and customize their visibility. ##### Table Configuration | Column | Options | | --------------------- | --------------------------------------------------- | | Enable/Disable fields | Toggle visibility per field | | Font settings | Customize font family, size, line height, and color | | Table Header styling | Set separate font size and line height for headers | | Background color | Set background color for the table | ## Record Preview Use the **Record selector** in the sidebar to toggle between different records and preview how the design looks with real data. ## Page Settings * **Page Name**: Customize the name of your page for easy reference. This name will be used when exporting or printing. * **Print / Export**: Use the print icon in the top-right corner to generate PDFs or physical printouts. ## Key Use Cases * 🧾 Invoices & Quotes * 📄 Client Reports & Status Sheets * 🎓 Certificates & Badges * 📊 Internal Summaries for review meetings ## Limitations (Beta) * The Page Designer is currently in **Beta**—minor rendering issues may occur in some browsers. Help us improve by reporting any bugs you encounter and any suggestions you have to improve the experience. *** # Upload data from CSV URL: /docs/product-docs/extensions/upload-data-from-csv Import data from CSV files into NocoDB ## Overview The `Upload data from CSV` extension in NocoDB allows users to import data from CSV files directly into existing tables. This tool enables you to efficiently add new records, update existing ones, and map CSV columns to NocoDB fields with precision. ## Importing Data ### Modes of Import The Import CSV Extension supports two modes of data import:   **1. Add Records**: Import all records from the CSV file as new entries in the selected table. No existing records are modified.   **2. Merge Records**: Update existing records based on a designated **merge field** (a unique field used for matching) while optionally adding new records. The available options under this mode are: * *Create New Records Only* * Only adds new records from the CSV. Existing records are not updated. New records are identified based on the merge field specified. * *Update Existing Records Only* * Only updates records that already exist in the table based on the merge field. New records are not added. * *Create and Update Records* * Adds new records and updates existing ones as needed, based on the merge field. **Merge Field:** The merge field is the key field used to match records in the CSV file with those in the NocoDB table for updating purposes. Typically, this is the Primary Key or another unique identifier. Composite keys are not supported. **Field Mapping:** Easily map CSV columns to corresponding fields in the NocoDB table. You have the flexibility to import only the fields you need. ### Steps to Import Follow these steps to import data from a CSV file into NocoDB: 1. Drag and drop or upload your CSV file into the Import CSV Extension area. 2. Select the table you want to import the data into. By default, current active table is selected. 3. Choose the mode of import: * **Add Records** or * **Merge Records** with one of the following **Import Types**: * *Create New Records Only* * *Update Existing Records Only* * *Create and Update Records* 4. Set the **Merge Field** (for Merge Records mode): Select the field that will be used to match CSV records with existing table records. 5. **Use first record as header**: If the first row of the CSV file contains the column headers, enable this option to use them as the field names. 6. Map the columns from the CSV file to the corresponding fields in the NocoDB table. 7. Click the **Import** button to start the import process. Import CSV ### Post-Import Summary Once the import is complete, NocoDB will display a summary detailing: * The number of new records added * The number of existing records updated * Any records left unchanged This streamlined process ensures your data is imported accurately and efficiently. # URL Preview URL: /docs/product-docs/extensions/url-preview Preview URLs in NocoDB ## Overview The URL Preview extension in NocoDB allows you to preview URLs directly within your NocoDB instance. This feature is particularly useful when you need to quickly view the content of a URL without leaving your workspace. This extension enhances the data visualization capabilities of NocoDB by providing rich, contextual previews for supported online platforms and services. ## Previewing URLs To preview a URL in NocoDB, just select a cell from the URL field. A preview of the URL content will be displayed in the extension sub-panel, allowing you to view the content without navigating away from your workspace. URL Preview ## Supported Platforms The URL Preview Extension currently supports the following platforms: ### 📽️ Media & Social * YouTube * Vimeo * SoundCloud * Spotify * Twitter * Dailymotion * Behance * TED ### 💼 Productivity & Collaboration * Google Docs * Google Sheets * Google Slides * Google Drive share links * Loom share links ### 🧑‍💻 Design & Development * GitHub (Gists) * CodePen * CodeSandbox (Embed url) * JSFiddle * StackBlitz * Figma * Notion # World Clock URL: /docs/product-docs/extensions/world-clock Display multiple time zone clocks with in NocoDB ## Overview The World Clock extension in NocoDB allows you to display multiple time zone clocks within your NocoDB instance. This feature is particularly useful when you need to track time across different regions or collaborate with team members in different time zones. The extension enhances the user experience by providing a visual representation of time zones, making it easier to manage global operations and schedules. Analog Digital ### Adding Clock To add a clock, expand World clock extension, click `+ Add City` and select City from the dropdown available. You can add a maximum of 4 clocks per instance of an extension. * **Clock Name**: Enter a name for the clock to identify it easily. It defaults to the selected City name. * **Theme**: Choose one amongst the available themes for the clock display. ### Clock Display Settings The following are the global settings that will be applied to all the clocks configured. * **Clock Type**: Choose between **Analog**, **Digital**, or **Both** for the display format. * **Show Numbers**: For analog clocks, you can additionally configure if hour numbers are to be displayed on the clock dial. * **Time Format**: Choose between 12H and 24H format for the clock display. # Actions on field URL: /docs/product-docs/fields/actions-on-field This article explains how to perform various actions on a field- like rename, change field type, default, field width, record height, show/hide. ## Fields context menu Fields context menu can be accessed by clicking on the dropdown icon (🔽) next to the field name.\ Fields context menu ### Edit #### Rename field 1. Open the field context menu 2. Click on `Edit` option. 3. Enter new field name as required in the `Field Name` field. 4. Click on `Save Field` button. Rename field #### Change field type 1. Open the field context menu 2. Click on `Edit` option. 3. Select new field type from the `Field Type` dropdown. 4. Click on `Save Field` button. Change field type #### Change default value 1. Open the field context menu 2. Click on `Edit` option. 3. Enter new default value in the `Default Value` field. To disable, click on `x` icon. 4. Click on `Save Field` button. Change default value ### Change field width To adjust the width of the field, hover over the field edge and drag to adjust the width. Change field width ### Hide field 1. Open the field context menu 2. Click on `Hide Field` option * Hidden fields are not visible in the table view, but will still be accessible for Formulas, Sort, Filter, etc. * To un hide a field, use `Toolbar > Fields` menu * Fields can also be marked as hidden from `Toolbar > Fields` menu ### Set as Display value 1. Open the field context menu 2. Click on `Set as Display Value` option. Refer to [Display Value](/docs/product-docs/fields/display-value) for more details. ### Sort Ascending 1. Open the field context menu 2. Click on `Sort Ascending` option. ### Sort Descending 1. Open the field context menu 2. Click on `Sort Descending` option. ### Duplicate field 1. Open the field context menu 2. Click on `Duplicate` option. Duplicated field sans the data will be created with suffix `_copy` in its name & will be placed to the right of the original field. ### Insert after a field 1. Open the field context menu 2. Click on `Insert after` option. New field will be created to the right of the original field. ### Insert before a field 1. Open the field context menu 2. Click on `Insert before` option. New field will be created to the left of the original field. ### Delete field **This action cannot be undone** To delete a field, follow the steps below: 1. Open the field context menu by clicking on dropdown icon (🔽) . 2. Click on **Delete**. 3. Confirm the deletion by clicking on **Delete Field** on the confirmation modal. ### Add / edit field description Field description can be added by clicking on the `Add Description` button on the field creation modal or by clicking on the `Edit Description` button from the field context menu. add field description edit field description Description for a field will be visible as a tooltip when hovering over the `info` icon next to the field name. Field description ### Set field as unique To set a field as unique, follow the steps below: 1. Open the field context menu by clicking on dropdown icon (🔽) . 2. Click on **Edit field**. 3. Toggle on the **Unique values only** option. 4. Click on **Save Field** button. Set field as unique Note that, this feature is only available for certain field types like Single line text, Email, Number, etc. Find more details on setting a field as unique in [Unique Fields](/docs/product-docs/fields#unique-fields-) article. # Display Value URL: /docs/product-docs/fields/display-value This article explains how to set the display value for a table and its significance. The **Display Value** serves as the primary visual identifier for a record within a table. It helps users quickly recognize and associate records across views and linked tables. While it is often recommended to set a display value based on a field with unique identifiers (like a primary key), uniqueness is not enforced at the database level.
``` Here’s an example of a complete HTML document embedding the base: ```html Sample iFrame Example ``` *** # Base Snapshots URL: /docs/product-docs/bases/snapshots Procedures to create and manage snapshots Snapshots allow you to create a point-in-time backup of your base. Use them before major changes or to safeguard against accidental data loss. Snapshots are available on cloud-hosted paid plans and self-hosted enterprise plans. ## Key Notes * Restoring a snapshot creates a new base — the existing base is not modified. * You can choose which workspace to restore the snapshot into. * Audit log data (global audits and record revision history) is not included in snapshots. * Base-level permissions, shared base, and shared view settings are not restored — these must be reconfigured manually. * The number of snapshots allowed per base depends on your plan. * A minimum gap of three hours is required between creating two snapshots. * Only **Base Owners** can access the snapshot feature. ## Access Snapshots 1. Open the base and go to **Base Settings** → **Manage Snapshots** in the sidebar. Snapshots ## Create a Snapshot 1. Click **+ New Snapshot**. 2. Enter a name for the snapshot (defaults to the current date and time). 3. Click **Save**. Create Snapshot The snapshot will appear in the list with **Restore** and **Delete** actions. Create Snapshot ## Restore a Snapshot 1. Click **Restore** next to the snapshot you want to restore. 2. Select the target workspace (defaults to current workspace). 3. Click **Confirm Restore**. Restore Snapshot Restoring a snapshot creates a new base in the selected workspace. The existing base is not affected. ## Delete a Snapshot 1. Click the **delete icon** (🗑️) next to the snapshot. 2. Click **Delete Snapshot** to confirm. Delete Snapshot # Auth0 URL: /docs/product-docs/account-settings/authentication/oidc-sso/auth0 Learn how to configure Auth0 as an identity provider for NocoDB. For SSO Access - please reach [**out to sales team**](https://cal.com/nocodb/sales) This article briefs about the steps to configure Auth0 as Identity service provider for NocoDB For users on **Business plan** , the SSO configuration menu is available under **Workspace Settings** . Refer [here](/docs/product-docs/account-settings/authentication#business-plan) for more details. **Domain Verification Required for Cloud Plans** : Before configuring OIDC SSO, you must verify your domain in NocoDB (required for both Business and Enterprise plans in the cloud). Only users with email addresses from verified domains can sign in via SSO. See [Domain Verification](/docs/product-docs/account-settings/authentication#domain-verification) for details. ### NocoDB, Retrieve `Redirect URL` 1. Go to `Account Settings` 2. Select `Authentication (SSO)` 3. Click on `New Provider` button 4. On the Popup modal, Specify a `Display name` for the provider; note that, this name will be used to display the provider on the login page 5. Retrieve `Redirect URL`; this information will be required to be configured later with the Identity Provider OIDC SSO Configuration OIDC SSO Configuration OIDC SSO Configuration ### Auth0, Configure NocoDB as an Application 1. Access your [Auth0 account](https://auth0.com/) * navigate to `Applications` > `Create Application`. 2. In the `Create Application` modal, * choose `Regular Web Application` * click `Create` 3. On Quick start screen, go to `Settings` tab * Copy the `Client ID` and `Client Secret` from the `Basic Information` section. 4. Goto `Application URIs` section * Add the `Redirect URL` copied from step(2) under `Allowed Callback URLs`. * `Save Changes` 5. On the `Settings` tab, go to the `Advanced Settings` section and click on the `Endpoints` tab. * Copy the `OAuth Authorization URL`, `OAuth Token URL`, `OAuth User Info URL` & `JSON Web Key Set URL` ### NocoDB, Configure Auth0 as an Identity Provider 1. In NocoDB, open `Account Settings` > `Authentication` > `OIDC`. On the "Register OIDC Identity Provider" modal, insert the following information: * Insert `Client ID` retrieved in step (5) above as `Client ID` * Insert `Client Secret` retrieved in step (5) above as `Client Secret` * Insert `OAuth Authorization URL` retrieved in step (7) above as `Authorization URL` * Insert `OAuth Token URL` retrieved in step (7) above as `Token URL` * Insert `OAuth User Info URL` retrieved in step (7) above as `Userinfo URL` * Insert `JSON Web Key Set URL` retrieved in step (7) above as `JWK Set URL` * Set `Scope` as `openid` `profile` `email` `offline_access` * In the Username Attribute field, indicate the name of the claim that represents the user's email. The default value is set to "email." For Sign-in's, user should be able to now see `Sign in with ` option. SAML SSO Configuration Post sign-out, refresh page (for the first time) if you do not see `Sign in with SSO` option For information about Auth0 API Scopes, refer [here](https://auth0.com/docs/secure/tokens/refresh-tokens) For more common questions and troubleshooting, see our [SSO FAQ](/docs/product-docs/account-settings/authentication/FAQs) . # Azure AD (Entra) URL: /docs/product-docs/account-settings/authentication/oidc-sso/azure-ad Learn how to configure Azure AD as an identity provider for NocoDB. Please reach [**out to sales**](https://cal.com/nocodb/sales) for SSO access This article briefs about the steps to configure Azure AD as Identity service provider for NocoDB For users on **Business plan** , the SSO configuration menu is available under **Workspace Settings** . Refer [here](/docs/product-docs/account-settings/authentication#business-plan) for more details. **Domain Verification Required for Cloud Plans** : Before configuring OIDC SSO, you must verify your domain in NocoDB (required for both Business and Enterprise plans in the cloud). Only users with email addresses from verified domains can sign in via SSO. See [Domain Verification](/docs/product-docs/account-settings/authentication#domain-verification) for details. ### NocoDB, Retrieve `Redirect URL` 1. Go to `Account Settings` 2. Select `Authentication (SSO)` 3. Click on `New Provider` button 4. On the Popup modal, Specify a `Display name` for the provider; note that, this name will be used to display the provider on the login page 5. Retrieve `Redirect URL`; this information will be required to be configured later with the Identity Provider OIDC SSO Configuration OIDC SSO Configuration OIDC SSO Configuration ### Azure AD, Configure NocoDB as an Application 1. Sign in to your [Azure account](https://portal.azure.com/#allservices) and navigate to `Azure Active Directory` under `Azure Services`. 2. Access `Manage Tenants` from the navigation bar, select your directory, and click `Switch`. 3. On your directory's homepage, click `+ Add` > `App Registration` from the navigation bar. 4. On the `Register an application` page, * Provide your application's name. * Set `Accounts in this organizational directory only` as the `Supported account types`. * Choose `Web` as the Application type * Add the `Redirect URL` under `Redirect URIs`. * `Register` 5. On your application's homepage, * Copy the `Application (client) ID` * Click `Add a certificate or secret` under `Client credentials` section * On `Certificates & secrets` page, go to `Client secrets` section * Click `New client secret` * On `Add a client secret` page, * Add a description for the secret * Set expiration as required * `Add` * Copy the `Value` of the newly created secret 6. On your application's homepage, * Go to `Endpoints` tab * Open `OpenID Connect metadata document` URL & copy `authorization_endpoint`, `token_endpoint`, `userinfo_endpoint` & `jwks_uri` from the JSON response 7. Configuring scopes * Go to `API permissions` tab * Click `Add a permission` * On `Request API permissions` page, * Select `Microsoft Graph` from `Microsoft APIs` * Select `Delegated permissions` * Select `openid` `profile` `email` `offline_access` from `Select permissions` dropdown * From `Users` dropdown, select `User.Read` * `Add permissions` * Click `Grant admin consent for this directory` from the `API permissions` page ### NocoDB, Configure Azure AD as an Identity Provider On NocoDB, open `Account Settings` > `Authentication` > `OIDC`. On the "Register OIDC Identity Provider" modal, insert the following information: * Insert `Application (client) ID` retrieved in step (7) above as `Client ID` * Insert `Value` of the newly created secret retrieved in step (7) above as `Client Secret` * Insert `authorization_endpoint` retrieved in step (8) above as `Authorization URL` * Insert `token_endpoint` retrieved in step (8) above as `Token URL` * Insert `userinfo_endpoint` retrieved in step (8) above as `Userinfo URL` * Insert `jwks_uri` retrieved in step (8) above as `JWK Set URL` * Set `Scope` as `openid` `profile` `email` `offline_access` For Sign-in's, user should be able to now see `Sign in with ` option. SAML SSO Configuration Post sign-out, refresh page (for the first time) if you do not see `Sign in with SSO` option For more common questions and troubleshooting, see our [SSO FAQ](/docs/product-docs/account-settings/authentication/FAQs) . For information about Azure AD API Scopes, refer [here](https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent#offline_access) # Okta URL: /docs/product-docs/account-settings/authentication/oidc-sso/okta Learn how to configure Okta as an identity provider for NocoDB. For SSO Access - please reach [**out to sales team**](https://cal.com/nocodb/sales) This article briefs about the steps to configure Okta as Identity service provider for NocoDB For users on **Business plan** , the SSO configuration menu is available under **Workspace Settings** . Refer [here](/docs/product-docs/account-settings/authentication#business-plan) for more details. **Domain Verification Required for Cloud Plans** : Before configuring OIDC SSO, you must verify your domain in NocoDB (required for both Business and Enterprise plans in the cloud). Only users with email addresses from verified domains can sign in via SSO. See [Domain Verification](/docs/product-docs/account-settings/authentication#domain-verification) for details. ### NocoDB, Retrieve `Redirect URL` 1. Go to `Account Settings` 2. Select `Authentication (SSO)` 3. Click on `New Provider` button 4. On the Popup modal, Specify a `Display name` for the provider; note that, this name will be used to display the provider on the login page 5. Retrieve `Redirect URL`; this information will be required to be configured later with the Identity Provider OIDC SSO Configuration OIDC SSO Configuration OIDC SSO Configuration ### Okta, Configure NocoDB as an Application 1. Sign in to your [Okta account](https://www.okta.com/) and navigate to the "Get started with Okta" page. * Click on `Add App` for the Single Sign-On option. * On the `Browse App Integration Catalog` page, select `Create New App` 2. In the pop-up with title `Create a new app integration` * Choose `OIDC - OpenID Connect` as the Sign-in method * Choose `Web Application` as the Application type 3. Go to `General Settings` on the `New Web App Integration` page * Provide your application's name. * From the Options in the `Grant type allowed` section, select `Authorization Code` and `Refresh Token` * Add the `Redirect URL` under `Sign-in redirect URIs`. * From the `Assignments section`, select an option from `Controlled access` to set up the desired accessibility configuration for this application. * `Save` 4. On your new application, * Go to the `General` tab * Copy the `Client ID` and `Client Secret` from the `Client Credentials` section. 5. From `Account` dropdown in navigation bar * Copy `Okta Domain` 6. Append "./well-known/openid-configuration" to the `Okta Domain` URL & access it * Example: [https://dev-123456.okta.com/.well-known/openid-configuration](https://dev-123456.okta.com/.well-known/openid-configuration) * Copy `authorization_endpoint`, `token_endpoint`, `userinfo_endpoint` & `jwks_uri` from the JSON response ### NocoDB, Configure Okta as an Identity Provider In NocoDB, open `Account Settings` > `Authentication` > `OIDC`. On the "Register OIDC Identity Provider" modal, insert the following information: * Insert `Client ID` retrieved in step (6) above as `Client ID` * Insert `Client Secret` retrieved in step (6) above as `Client Secret` * Insert `authorization_endpoint` retrieved in step (8) above as `Authorization URL` * Insert `token_endpoint` retrieved in step (8) above as `Token URL` * Insert `userinfo_endpoint` retrieved in step (8) above as `Userinfo URL` * Insert `jwks_uri` retrieved in step (8) above as `JWK Set URL` * Set `Scope` as `openid` `profile` `email` `offline_access` * In the Username Attribute field, indicate the name of the claim that represents the user's email. The default value is set to "email." For Sign-in's, user should be able to now see `Sign in with ` option. SAML SSO Configuration Post sign-out, refresh page (for the first time) if you do not see `Sign in with SSO` option For information about Okta API Scopes, refer [here](https://developer.okta.com/docs/reference/api/oidc/#scopes) For more common questions and troubleshooting, see our [SSO FAQ](/docs/product-docs/account-settings/authentication/FAQs) . # Ping Identity URL: /docs/product-docs/account-settings/authentication/oidc-sso/ping-identity Learn how to configure Ping Identity as an identity provider for NocoDB. For SSO Access - please reach [**out to sales team**](https://cal.com/nocodb/sales) This article briefs about the steps to configure Ping Identity as Identity service provider for NocoDB For users on **Business plan** , the SSO configuration menu is available under **Workspace Settings** . Refer [here](/docs/product-docs/account-settings/authentication#business-plan) for more details. **Domain Verification Required for Cloud Plans** : Before configuring OIDC SSO, you must verify your domain in NocoDB (required for both Business and Enterprise plans in the cloud). Only users with email addresses from verified domains can sign in via SSO. See [Domain Verification](/docs/product-docs/account-settings/authentication#domain-verification) for details. ### NocoDB, Retrieve `Redirect URL` 1. Go to `Account Settings` 2. Select `Authentication (SSO)` 3. Click on `New Provider` button 4. On the Popup modal, Specify a `Display name` for the provider; note that, this name will be used to display the provider on the login page 5. Retrieve `Redirect URL`; this information will be required to be configured later with the Identity Provider OIDC SSO Configuration OIDC SSO Configuration OIDC SSO Configuration ### Ping Identity, Configure NocoDB as an Application 1. Access your [PingOne account](https://www.pingidentity.com/en/account/sign-on.html) and navigate to the homepage. 2. Click on `Add Environment` from the top right corner. 3. On the `Create Environment` screen, * Opt for `Build your own solution` * In the `Select solution(s) for your Environment` section, select `PingOne SSO` from `Cloud Services` * Click `Next` * Provide a name and description for the environment, * Click `Next` 4. Access the newly created environment and go to `Connections` > `Applications` from the sidebar. 5. Within the Applications homepage, initiate the creation of a new application by clicking the "+" icon. 6. On the "Add Application" panel: * Input the application name and description. * Choose "OIDC Web App" as the Application Type and click "Configure" 7. From your application, * Go to `Configurations` tab * Click on `Edit` button * Check `Refresh Token` option * Copy `Authorization URL`, `Token URL`, `Userinfo URL` & `JWK Set URL` from the `Endpoints` section * From `Generals` dropdown, copy `Client ID` & `Client Secret` * `Save` 8. From `Resources` tab, * Click `Edit` * Select `openid` `profile` `email` from `Scopes` 9. Switch toggle button in the top right corner to `On` to activate the application. ### NocoDB, Configure Ping Identity as an Identity Provider 1. In NocoDB, open `Account Settings` > `Authentication` > `OIDC`. On the "Register OIDC Identity Provider" modal, insert the following information: * Insert `Client ID` retrieved in step (9) above as `Client ID` * Insert `Client Secret` retrieved in step (9) above as `Client Secret` * Insert `Authorization URL` retrieved in step (9) above as `Authorization URL` * Insert `Token URL` retrieved in step (9) above as `Token URL` * Insert `Userinfo URL` retrieved in step (9) above as `Userinfo URL` * Insert `JWK Set URL` retrieved in step (9) above as `JWK Set URL` * Set `Scope` as `openid` `profile` `email` `offline_access` * In the Username Attribute field, indicate the name of the claim that represents the user's email. The default value is set to "email." For Sign-in's, user should be able to now see `Sign in with ` option. SAML SSO Configuration Post sign-out, refresh page (for the first time) if you do not see `Sign in with SSO` option For information about Ping Identity API Scopes, refer [here](https://docs.pingidentity.com/r/en-us/pingone/pingone_t_edit_scopes_for_an_application) For more common questions and troubleshooting, see our [SSO FAQ](/docs/product-docs/account-settings/authentication/FAQs) . # Auth0 URL: /docs/product-docs/account-settings/authentication/saml-sso/auth0 Learn how to configure Auth0 as an identity provider for NocoDB. For SSO Access - please reach [**out to sales team**](https://cal.com/nocodb/sales) This article briefs about the steps to configure Auth0 as Identity service provider for NocoDB For users on **Business plan** , the SSO configuration menu is available under **Workspace Settings** . Refer [here](/docs/product-docs/account-settings/authentication#business-plan) for more details. **Domain Verification Required for Cloud Plans** : Before configuring SAML SSO, you must verify your domain in NocoDB (required for both Business and Enterprise plans in the cloud). Only users with email addresses from verified domains can sign in via SSO. See [Domain Verification](/docs/product-docs/account-settings/authentication#domain-verification) for details. ### NocoDB, Retrieve `SAML SSO` Configuration details 1. Go to `Account Settings` 2. Select `Authentication (SSO)` 3. Click on `New Provider` button 4. On the Popup modal, Specify a `Display name` for the provider; note that, this name will be used to display the provider on the login page 5. Retrieve `Redirect URL` & `Audience / Entity ID`; these information will be required to be configured later with the Identity Provider SAML SSO Configuration SAML SSO Configuration SAML SSO Configuration ### Auth0, Configure NocoDB as an Application 1. Access your [Auth0 account](https://auth0.com/) * navigate to `Applications` > `Create Application`. 2. In the `Create Application` modal, * choose `Regular Web Application` * click `Create` 3. Upon successful creation, you will be directed to the `Quick Start` screen. * Go to the `Addons` tab. * Enable `SAML2 Web App` 4. On the `SAML2 Web App` modal, * Paste `Redirect URL` copied in step above into `Application Callback URL` field * In Settings, retain `nameIdentifierProbes` as `["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"]`; remove other probes if any ```json { "nameIdentifierProbes": [ "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" ] } ``` * Click `Enable` to save the settings 5. On the `Settings` tab, * move to `Advanced Settings` > `Endpoints` > `SAML` section, * copy the SAML `Metadata URL` [//]: # "3. Upon successful creation, you will be directed to the `Quick Start` screen. " [//]: # " - Go to the `Settings` tab." [//]: # " - Paste `Redirect URI` copied in step above into `Allowed Callback URLs` field" [//]: # " - `Save`" ### NocoDB, Configure Auth0 as an Identity Provider 1. Go to `Account Settings` > `Authentication` > `SAML` 2. Insert `Metadata URL` retrieved in step above; alternatively you can configure XML directly as well 3. `Save` SAML SSO Configuration For Sign-in's, user should be able to now see `Sign in with ` option. SAML SSO Configuration Post sign-out, refresh page (for the first time) if you do not see `Sign in with SSO` option For more common questions and troubleshooting, see our [SSO FAQ](/docs/product-docs/account-settings/authentication/FAQs) . # Azure AD (Entra) URL: /docs/product-docs/account-settings/authentication/saml-sso/azure-ad Learn how to configure Active Directory as an identity provider for NocoDB. For SSO Access - please reach [**out to sales team**](https://cal.com/nocodb/sales) This article briefs about the steps to configure Active Directory as Identity service provider for NocoDB For users on **Business plan** , the SSO configuration menu is available under **Workspace Settings** . Refer [here](/docs/product-docs/account-settings/authentication#business-plan) for more details. **Domain Verification Required for Cloud Plans** : Before configuring SAML SSO, you must verify your domain in NocoDB (required for both Business and Enterprise plans in the cloud). Only users with email addresses from verified domains can sign in via SSO. See [Domain Verification](/docs/product-docs/account-settings/authentication#domain-verification) for details. ### NocoDB, Retrieve `SAML SSO` Configuration details 1. Go to `Account Settings` 2. Select `Authentication (SSO)` 3. Click on `New Provider` button 4. On the Popup modal, Specify a `Display name` for the provider; note that, this name will be used to display the provider on the login page 5. Retrieve `Redirect URL` & `Audience / Entity ID`; these information will be required to be configured later with the Identity Provider SAML SSO Configuration SAML SSO Configuration SAML SSO Configuration ### Azure AD, Configure NocoDB as an Application 1. Sign in to your [Azure account](https://portal.azure.com/#allservices) and navigate to `Microsoft Entra admin center` > `Identity` > `Enterprise applications` 2. Click `+ New application` 3. On the `Browse Microsoft Entra Gallery` page, select `Create your own application` from the navigation bar. * Provide your application's name. * Choose `Integrate any other application you don't find in the gallery (Non-gallery)` * `Create` 4. On your application page, navigate to `Manage` > `Single sign-on` > `SAML` 5. Go to the `Basic SAML Configuration` section under `Set up Single Sign-On with SAML` and click `Edit` * Add the `Audience URI` under `Identifier (Entity ID)`. * Add the `Redirect URL` under `Replay URL (Assertion Consumer Service URL)`. * Click `Save` 6. In the `Attributes & Claims` section, click `Edit` * Edit the "Unique User Identifier (Name ID)" claim: * Select `Email address` from the `Name identifier format` dropdown * Choose `Attribute` as the `Source` * In the `Source attribute`, select `user.mail` * Click `Save` 7. Go to the `SAML Certificates` section and copy the `App Federation Metadata URL` 8. on the Application's Overview page, * Click `Users and groups`, * Add the necessary users or groups to the application. ### NocoDB, Configure Azure AD as an Identity Provider 1. Go to `Account Settings` > `Authentication` > `SAML` 2. Insert `Metadata URL` retrieved in step above; alternatively you can configure XML directly as well 3. `Save` SAML SSO Configuration For Sign-in's, user should be able to now see `Sign in with ` option. SAML SSO Configuration Post sign-out, refresh page (for the first time) if you do not see `Sign in with SSO` option For more common questions and troubleshooting, see our [SSO FAQ](/docs/product-docs/account-settings/authentication/FAQs) . # Keycloak URL: /docs/product-docs/account-settings/authentication/saml-sso/keycloak Learn how to configure Keycloak as an identity provider for NocoDB. For SSO Access - please reach [**out to sales team**](https://cal.com/nocodb/sales). This article briefs about the steps to configure Keycloak as Identity service provider for NocoDB For users on **Business plan** , the SSO configuration menu is available under **Workspace Settings** . Refer [here](/docs/product-docs/account-settings/authentication#business-plan) for more details. **Domain Verification Required for Cloud Plans** : Before configuring SAML SSO, you must verify your domain in NocoDB (required for both Business and Enterprise plans in the cloud). Only users with email addresses from verified domains can sign in via SSO. See [Domain Verification](/docs/product-docs/account-settings/authentication#domain-verification) for details. ### NocoDB, Retrieve `SAML SSO` Configuration details 1. Go to `Account Settings` 2. Select `Authentication (SSO)` 3. Click on `New Provider` button 4. On the Popup modal, Specify a `Display name` for the provider; note that, this name will be used to display the provider on the login page 5. Retrieve `Redirect URL` & `Audience / Entity ID`; these information will be required to be configured later with the Identity Provider SAML SSO Configuration SAML SSO Configuration SAML SSO Configuration ### Keycloak, Configure NocoDB as an Application 1. Access your Keycloak account * navigate to `Clients` menu * select `Clients list` tab > Click `Create client` button. 2. In the `Create Client` modal, `General Settings` tab: * Select `SAML` as the `Client type` * Specify `Audience/Entity ID` retrieved from NocoDB as the `Client ID` * Click `Next` 3. In the `Create Client` modal, `Login Settings` tab, * Specify `Redirect URL` retrieved from NocoDB as the `Valid Redirect URIs` * Specify `Redirect URL` retrieved from NocoDB as the `Valid post logout redirect URIs` * Click `Save` 4. On the `Client details`, `Settings` tab, * navigate to `SAML Capabilities` section * Specify `Name ID format` as `email` * Enable `Force Name ID Format` and `Force POST Binding` * navigate to `Signature and Encryption` section * Enable `Sign Assertions` * Click `Save` 5. On the `Client details`, `Keys` tab, * Disable `Signing keys config` > `Client Signature Required` 6. Navigate to `Realm Settings` > `Endpoints` * Copy `SAML 2.0 Identity Provider Metadata` URL ### NocoDB, Configure Azure AD as an Identity Provider 1. Go to `Account Settings` > `Authentication` > `SAML`Key 2. Insert `Metadata URL` retrieved in step above; alternatively you can configure XML directly as well 3. `Save` SAML SSO Configuration For Sign-in's, user should be able to now see `Sign in with ` option. SAML SSO Configuration Post sign-out, refresh page (for the first time) if you do not see `Sign in with ` option For more common questions and troubleshooting, see our [SSO FAQ](/docs/product-docs/account-settings/authentication/FAQs) . # Okta URL: /docs/product-docs/account-settings/authentication/saml-sso/okta Learn how to configure Okta as an identity provider for NocoDB. For SSO Access - please reach [**out to sales team**](https://cal.com/nocodb/sales). This article briefs about the steps to configure Okta as Identity service provider for NocoDB For users on **Business plan** , the SSO configuration menu is available under **Workspace Settings** . Refer [here](/docs/product-docs/account-settings/authentication#business-plan) for more details. **Domain Verification Required for Cloud Plans** : Before configuring SAML SSO, you must verify your domain in NocoDB (required for both Business and Enterprise plans in the cloud). Only users with email addresses from verified domains can sign in via SSO. See [Domain Verification](/docs/product-docs/account-settings/authentication#domain-verification) for details. ### NocoDB, Retrieve `SAML SSO` Configuration details 1. Go to `Account Settings` 2. Select `Authentication (SSO)` 3. Click on `New Provider` button 4. On the Popup modal, Specify a `Display name` for the provider; note that, this name will be used to display the provider on the login page 5. Retrieve `Redirect URL` & `Audience / Entity ID`; these information will be required to be configured later with the Identity Provider SAML SSO Configuration SAML SSO Configuration SAML SSO Configuration ### Okta, Configure NocoDB as an Application 1. Sign in to your [Okta account](https://www.okta.com/) * Navigate to `Applications` > `Applications` * Click `Create App Integration` 2. In the pop-up with title `Create a new app integration` choose `SAML 2.0` as the Sign-in method 3. On the `Create SAML Integration` page, in the General settings - provide a name for your app; click `Next` 4. In the `Configure SAML` section: * Enter the `Redirect URL` copied from NocoDB in the `Single sign-on URL` field. * Add the `Audience URI` copied from NocoDB in the `Audience URI (SP Entity ID)` field. * Choose `Email Address` from the `Name ID format` options. * Select `Email` from the `Application user-name` options. * Click `Next` 5. Complete any additional information in the final step and click `Finish` 6. On your application's homepage, * Navigate to the `Sign-on` tab * Copy the `Metadata URL` from the `SAML 2.0` section 7. Go to the `Assignments` tab and click `Assign` to assign people or groups to this application. ### NocoDB, Configure Okta as an Identity Provider 1. Go to `Account Settings` > `Authentication (SSO)` > `SAML` 2. On the "Register SAML Identity Provider" modal, insert `Metadata URL` retrieved in step above; alternatively you can configure XML directly as well 3. `Save` SAML SSO Configuration For Sign-in's, user should be able to now see `Sign in with ` option. SAML SSO Configuration Post sign-out, refresh page (for the first time) if you do not see `Sign in with SSO` option For more common questions and troubleshooting, see our [SSO FAQ](/docs/product-docs/account-settings/authentication/FAQs) . # Ping Identity URL: /docs/product-docs/account-settings/authentication/saml-sso/ping-identity Learn how to configure Ping Identity as an identity provider for NocoDB. For SSO Access - please reach [**out to sales team**](https://cal.com/nocodb/sales) This article briefs about the steps to configure Auth0 as Identity service provider for NocoDB For users on **Business plan** , the SSO configuration menu is available under **Workspace Settings** . Refer [here](/docs/product-docs/account-settings/authentication#business-plan) for more details. **Domain Verification Required for Cloud Plans** : Before configuring SAML SSO, you must verify your domain in NocoDB (required for both Business and Enterprise plans in the cloud). Only users with email addresses from verified domains can sign in via SSO. See [Domain Verification](/docs/product-docs/account-settings/authentication#domain-verification) for details. ### NocoDB, Retrieve `SAML SSO` Configuration details 1. Go to `Account Settings` 2. Select `Authentication (SSO)` 3. Click on `New Provider` button 4. On the Popup modal, Specify a `Display name` for the provider; note that, this name will be used to display the provider on the login page 5. Retrieve `Redirect URL` & `Audience / Entity ID`; these information will be required to be configured later with the Identity Provider SAML SSO Configuration SAML SSO Configuration SAML SSO Configuration ### Ping Identity, Configure NocoDB as an Application 1. Access your [PingOne account](https://www.pingidentity.com/en/account/sign-on.html) and navigate to the homepage. 2. Click on `Add Environment` from the top right corner. 3. On the `Create Environment` screen, * Opt for `Build your own solution` * In the `Select solution(s) for your Environment` section, select `PingOne SSO` from `Cloud Services` * Click `Next` * Provide a name and description for the environment, * Click `Next` 4. Access the newly created environment and go to `Connections` > `Applications` from the sidebar. 5. Within the Applications homepage, initiate the creation of a new application by clicking the "+" icon. 6. On the "Add Application" panel: * Input the application name and description. * Choose "SAML Application" as the Application Type and click "Configure." * Within the SAML Configuration panel, opt for "Manually Enter." * Populate the `ACS URLs` field with the `Redirect URL` retrieved from step (2) above * Insert the `Audience URI` retrieved above in step (2) in the `Entity ID` field * `Save` 7. In your application, * Navigate to the `Configurations` tab * Copy the `IDP Metadata URL` 8. On your application panel, activate user access to the application by toggling the switch in the top right corner. ### NocoDB, Configure Ping Identity as an Identity Provider 1. Go to `Account Settings` > `Authentication` > `SAML` 2. Insert `Metadata URL` retrieved in step above; alternatively you can configure XML directly as well 3. `Save` SAML SSO Configuration For Sign-in's, user should be able to now see `Sign in with ` option. SAML SSO Configuration Post sign-out, refresh page (for the first time) if you do not see `Sign in with SSO` option For more common questions and troubleshooting, see our [SSO FAQ](/docs/product-docs/account-settings/authentication/FAQs) . # QR code URL: /docs/product-docs/fields/field-types/custom-types/QR-code This article explains how to create & work with a QR code field. `QR code` is a custom field type that allows you to generate a QR code from a string value. This is useful for generating QR codes for things like URLs, phone numbers, or other data that can be represented as a string. The following field types are supported for the reference field: * Formula * Single Line Text * Long Text * Phone Number * URL * Email ## Create a QR code field 1. Click on `+` icon to the right of `Fields header` 2. On the dropdown modal, enter the field name (Optional). 3. Select the field type as `QR Code` from the dropdown. 4. Select the field to be used as the source for the QR code. 5. Click on `Save Field` button. image ### Cell display Cell displays the QR code generated from the source field. Click on the cell to open enlarged view of the QR code. image\ image ## Related fields * [Barcode](/docs/product-docs/fields/field-types/custom-types/barcode) # Attachment URL: /docs/product-docs/fields/field-types/custom-types/attachment This article explains how to create & work with an Attachment field. `Attachment` fields allow you to upload files to your records. You can upload any file type, and the file will be linked to the record. You can also upload multiple files to a single `Attachment` field record. ## Create an Attachment field 1. Click on `+` icon to the right of `Fields header` 2. On the dropdown modal, enter the field name (Optional). 3. Select the field type as `Attachment` from the dropdown. 4. Click on `Save Field` button. image Max size for an attachment file is currently limited to 5 MB ### Cell display The cell display for `Attachment` field is either a clickable preview if file is an image in recognizable format or a file-type icon.\ image ### Upload files To upload files to an `Attachment` field, * Click on the `+` icon in the cell, choose the file to upload and click on `Upload` button. OR * Drag drop the file to the cell. OR * Click on expand icon `<>`, choose the file to upload or drag-drop file; click on `Upload` button. ## Expand modal Expand modal for `Attachment` field displays the list of files uploaded to the field. You can also upload files from the expand modal. To access expand modal, click on the expand icon `<>` in the cell. image Expand modal supports the following actions: ### Attach file(s) * Click on `Attach file(s)` button {"<"}1{">"} * Choose the file(s) to upload ### Delete file * Click on `x` icon {"<"}2{">"} to the top left of the image card to delete the file ### Download file * Click on `Download` button {"<"}5{">"} to download the file ### Bulk Download file(s) * Select the files by clicking on the checkbox {"<"}3{">"} to the top left of the image card * Click on `Bulk Download` button {"<"}4{">"} to download the selected files ### Rename file * Click on `Rename` button {"<"}5{">"} to rename the file * Enter the new name in the input field * Click on `Rename` button to save the new name Rename file only renames the file in NocoDB display (expand record & tool tip on hover). It does not rename the file in the storage. ## Environment variables In self-hosted version, you can configure the following environment variables to customize the behavior of `Attachment` field: * `NC_ATTACHMENT_FIELD_SIZE`: Maximum size of attachment files in bytes. Default: `20971520` (20 MiB) * `NC_MAX_ATTACHMENTS_ALLOWED`: Maximum number of attachments per cell. Default: `10` * `NC_SECURE_ATTACHMENTS`: Allow accessing attachments only through pre-signed URLs. Default: `false` * `NC_ATTACHMENT_EXPIRE_SECONDS`: Expiry time for pre-signed URLs. Default: `7200` (2 hours) All supported environment variables are described [here](/docs/self-hosting/environment-variables). ## Related articles * [Attaching a file from mobile](/docs/product-docs/views/view-types/form#attaching-a-file-from-mobile-device) # Barcode URL: /docs/product-docs/fields/field-types/custom-types/barcode This article explains how to create & work with a Barcode field. `Barcode` is a custom field type that allows you to generate a barcode from a string value. This is useful for generating barcodes for things like URLs, phone numbers, or other data that can be represented as a string. The following field types are supported for the for reference field: * Formula * Single Line Text * Long Text * Phone Number * URL * Email ## Create a barcode field 1. Click on `+` icon to the right of `Fields header` 2. On the dropdown modal, enter the field name (Optional). 3. Select the field type as `Barcode` from the dropdown. 4. Select the field to be used as the source for the barcode. 5. Select the barcode type from the dropdown. 6. Click on `Save Field` button. image ### Cell display Cell displays the barcode generated from the source field. Click on the cell to open enlarged view of the QR code. image\ image ### Supported barcode types NocoDB supports the following barcode types for the barcode field type. * CODE128 * EAN-13 * EAN-8 * EAN-5 * EAN-2 * UPC (A) * CODE39 * ITF-14 * MSI * Pharma code * Coda bar ## Related fields * [QR code](/docs/product-docs/fields/field-types/custom-types/QR-code) # Button URL: /docs/product-docs/fields/field-types/custom-types/button This article explains how to create & work with a Button field. The **Button** Field allows users to create interactive buttons within their tables. These buttons can trigger specific actions, making workflows more dynamic and efficient. With the Button Field, you can navigate to external URLs, run custom webhooks, or even run custom scripts with a single click. NocoDB currently supports following actions for the Button Field: 1. **Open URL**: Opens a new tab with a URL generated by a formula within the button field. The URL can be static or dynamic based on the current record's data. 2. **Run Webhook**: Trigger a webhook with the configured URL & custom payload. Payload can include data from the current record. 3. **Run Script**: Execute a custom script that can perform various operations on the current record or the entire table. Current record information can be accessed using the `row` variable in the script. **Run Script** action is currently available only in the NocoDB Cloud version, Plus and above plans.