<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: NocoBase</title>
    <description>The latest articles on Forem by NocoBase (@nocobase).</description>
    <link>https://forem.com/nocobase</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1349233%2Ffe1061e9-2897-4210-a0b2-a96c044ac3b2.jpg</url>
      <title>Forem: NocoBase</title>
      <link>https://forem.com/nocobase</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/nocobase"/>
    <language>en</language>
    <item>
      <title>4 Ways to Quickly Build Web Apps from Excel Data</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Fri, 03 Apr 2026 13:13:27 +0000</pubDate>
      <link>https://forem.com/nocobase/4-ways-to-quickly-build-web-apps-from-excel-data-420i</link>
      <guid>https://forem.com/nocobase/4-ways-to-quickly-build-web-apps-from-excel-data-420i</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://www.nocobase.com/en/blog/excel-to-web-app-4-methods" rel="noopener noreferrer"&gt;https://www.nocobase.com/en/blog/excel-to-web-app-4-methods&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many companies do not start with formal systems for their internal processes.&lt;/p&gt;

&lt;p&gt;As we recently reviewed customer cases, we noticed a very common pattern. In the early stages of a business, or before internal systems are fully in place, many companies rely on Excel to manage customers, track orders, follow projects, handle approvals, and maintain inventory records.&lt;/p&gt;

&lt;p&gt;💡Read more: &lt;a href="https://www.nocobase.com/en/blog/how-to-quickly-build-a-real-system-to-replace-excel" rel="noopener noreferrer"&gt;How to Quickly Build a System to Replace Excel? (Complete Guide)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But as more and more business data and workflow logic are pushed into spreadsheets, Excel’s limitations gradually become harder to ignore. Many spreadsheets that were originally used only for recordkeeping eventually begin to take on part of the role of CRM, ERP, ticketing, or project management tools.&lt;/p&gt;

&lt;p&gt;That is exactly why turning Excel-based workflows into web applications has become a practical need for more and more companies. Still, different approaches fit different business stages, involve different levels of implementation effort, and offer different levels of long-term flexibility. In the following sections, we will walk through several common approaches and look at which one may fit your current stage best.&lt;/p&gt;

&lt;p&gt;💡Featured case: &lt;a href="https://www.nocobase.com/en/blog/medical-device-manufacturer-builds-self-hosted-management-system-with-nocobase" rel="noopener noreferrer"&gt;From Paper to Digital: How This Medical Manufacturer Chose NocoBase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before we get into the details, the table below gives a quick overview of the 4 approaches covered in this article.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Method 1: No-code platform&lt;/th&gt;
&lt;th&gt;Method 2: Online data platform&lt;/th&gt;
&lt;th&gt;Method 3: AI generation tools&lt;/th&gt;
&lt;th&gt;Method 4: Online spreadsheets&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core focus&lt;/td&gt;
&lt;td&gt;Business system&lt;/td&gt;
&lt;td&gt;Data structure&lt;/td&gt;
&lt;td&gt;App prototypes / pages&lt;/td&gt;
&lt;td&gt;Spreadsheet file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main goal&lt;/td&gt;
&lt;td&gt;Turn Excel into a formal system&lt;/td&gt;
&lt;td&gt;Move data online and structure it first, then gradually build apps&lt;/td&gt;
&lt;td&gt;Quickly create demos, prototypes, or lightweight apps&lt;/td&gt;
&lt;td&gt;Support online collaborative editing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical capabilities&lt;/td&gt;
&lt;td&gt;Data modeling, page building, permissions, workflows, plugin extensions&lt;/td&gt;
&lt;td&gt;Related tables, views, forms, lightweight automation&lt;/td&gt;
&lt;td&gt;Natural language page generation, front-end and back-end scaffolding, rapid iteration&lt;/td&gt;
&lt;td&gt;Sharing, collaboration, comments, basic filtering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Representative tools&lt;/td&gt;
&lt;td&gt;NocoBase, Appsmith, Budibase, ToolJet&lt;/td&gt;
&lt;td&gt;Airtable, Feishu Bitable, Baserow&lt;/td&gt;
&lt;td&gt;Lovable, Bolt, v0&lt;/td&gt;
&lt;td&gt;Excel for the web, Google Sheets, WPS Online Sheets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Formal business scenarios such as CRM, ERP, ticketing, and project management&lt;/td&gt;
&lt;td&gt;The transition stage from Excel to a more structured system&lt;/td&gt;
&lt;td&gt;Prototype validation, internal demos, rapid experimentation&lt;/td&gt;
&lt;td&gt;Lightweight collaboration and short-term sharing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strengths&lt;/td&gt;
&lt;td&gt;Highly extensible and well suited for long-term use&lt;/td&gt;
&lt;td&gt;Faster to start with and useful for organizing data first&lt;/td&gt;
&lt;td&gt;Fastest to launch and lowest cost for testing ideas&lt;/td&gt;
&lt;td&gt;Easy to learn and the lightest switch from Excel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limits&lt;/td&gt;
&lt;td&gt;Requires some upfront work to sort out data structure and processes&lt;/td&gt;
&lt;td&gt;Good for transition, but not always suitable for complex business operations&lt;/td&gt;
&lt;td&gt;Not always suitable for complex permissions or long-term maintenance&lt;/td&gt;
&lt;td&gt;Still a spreadsheet at its core, not a formal application&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;💬 Hey, you're reading the NocoBase blog. NocoBase is the most extensible AI-powered no-code/low-code development platform for building enterprise applications, internal tools, and all kinds of systems. It’s fully self-hosted, plugin-based, and developer-friendly. →&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt; Explore NocoBase on GitHub&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Method 1: Use an extensible no-code platform to turn Excel into a formal business system
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core idea
&lt;/h3&gt;

&lt;p&gt;The core of this approach is to upgrade the business data already stored in Excel into a real web application, instead of continuing to rely on spreadsheets as the main way to run the business.&lt;/p&gt;

&lt;p&gt;Typical tools for this approach include no-code or low-code platforms that support app building, data modeling, permission settings, and workflow extensions, such as NocoBase, Appsmith, Budibase, and ToolJet.&lt;/p&gt;

&lt;p&gt;This article uses NocoBase as the main example because it is designed for building enterprise applications, internal tools, and many kinds of business systems. It also supports private deployment, plugin-based extensions, and long-term system growth.&lt;/p&gt;

&lt;p&gt;Unlike many tools that generate pages directly from spreadsheets, NocoBase is built around a data model driven approach. Data structure and page presentation are separated. You define the data model first, then decide how the pages should appear. The advantage is that as the business continues to grow, the team does not have to stay tied to Excel. Whether you need to optimize your database structure, add table relationships, or connect to other data sources such as MySQL, PostgreSQL, MongoDB, REST API, or GraphQL, the system can keep expanding.&lt;/p&gt;

&lt;p&gt;If this type of platform also includes native AI capabilities, it becomes even more useful for later business upgrades. NocoBase’s AI employee is not just a chat interface. It can understand context based on the current page, data, and table structure, and then perform real actions such as querying data, filling in forms, and updating records. This can be especially valuable for operations, customer service, data analysis, or repetitive workflow tasks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Related links&lt;/p&gt;

&lt;p&gt;NocoBase official website: &lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;https://www.nocobase.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NocoBase documentation: &lt;a href="https://docs.nocobase.com/" rel="noopener noreferrer"&gt;https://docs.nocobase.com/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Suitable teams
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Already using Excel to manage customers, orders, projects, tickets, or approval workflows&lt;/li&gt;
&lt;li&gt;Want to upgrade gradually based on existing spreadsheets instead of rebuilding everything from scratch&lt;/li&gt;
&lt;li&gt;Expect to add permissions, workflows, automation, or cross-team collaboration later&lt;/li&gt;
&lt;li&gt;Have requirements around data security, private deployment, or long-term scalability&lt;/li&gt;
&lt;li&gt;Have basic implementation capability, or are willing to sort out the business structure first&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementation approach
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Start by creating tables and fields&lt;/strong&gt; Break the customer, order, project, ticket, approval, and other data in Excel into separate tables, then define field types and relationships between the tables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfwzyp3uaath9qfn49b8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfwzyp3uaath9qfn49b8.png" alt="nocobase1.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcfisa429dwl089h3r22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmcfisa429dwl089h3r22.png" alt="nocobase2.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Then import the Excel data into those tables&lt;/strong&gt; Once the table structure is ready, import the existing Excel data so the records that were scattered across spreadsheets are placed into properly structured tables and fields.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Configure list, form, and detail pages&lt;/strong&gt; After the data is in the system, set up list pages, form pages, and detail pages so the records can be viewed, added, edited, and maintained.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4xpo413p4ti00wygo1of.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4xpo413p4ti00wygo1of.png" alt="nocobase3.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Configure roles and permissions&lt;/strong&gt; Once the pages are usable, define menu access, action permissions, and data scope by role, so different users can see different content and handle different data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30t0v1f4iltbron8yk6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30t0v1f4iltbron8yk6k.png" alt="nocobase4.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Add workflows and extension capabilities&lt;/strong&gt; Then add status flows, automatic reminders, process handling, notifications, and any APIs, databases, or AI capabilities you may want to connect later, so the system can truly begin supporting day-to-day business operations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hmp1jsj74uglzknai0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hmp1jsj74uglzknai0s.png" alt="nocobase5.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6okzbmblenbsjhuc28zo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6okzbmblenbsjhuc28zo.png" alt="nocobase6.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage limits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It usually requires more upfront work, since you need to sort out the data structure and business processes first&lt;/li&gt;
&lt;li&gt;It does not require heavy coding, but someone still needs to understand data models, page structure, and permission logic&lt;/li&gt;
&lt;li&gt;It is better suited to medium and long-term use, not to quickly building a temporary page&lt;/li&gt;
&lt;li&gt;The software itself may not be the biggest cost. In many cases, the real cost comes from implementation, process design, migration, and ongoing maintenance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎉 &lt;a href="https://docs.nocobase.com/tutorials/v2/" rel="noopener noreferrer"&gt;NocoBase 2.0 Tutorial&lt;/a&gt; is now available. Using a ticketing system as an example, it shows how to build a complete business system from zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 2: Move data into an online data platform first, then gradually build applications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core idea
&lt;/h3&gt;

&lt;p&gt;The idea behind this approach is to first move data scattered across spreadsheets into an online, structured platform, and then build views, collaboration features, and lightweight workflows around that data. It works as a transition layer between Excel and a more complete business system. You start by organizing the data clearly, then decide whether to keep evolving it into a fuller application later.&lt;/p&gt;

&lt;p&gt;Suitable tools for this approach usually include online data platforms that support spreadsheet-style management, field settings, multiple views, and basic automation, such as Airtable, Baserow, Coda, and Smartsheet.&lt;br&gt;
💡Read more: &lt;a href="https://www.nocobase.com/en/blog/nocobase-vs-airtable" rel="noopener noreferrer"&gt;NocoBase vs Airtable: A Flexible and Customizable Open-Source Alternative &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For many teams already using online collaboration tools, Airtable is often an easy place to start. On one side, it retains a spreadsheet-style experience, so the learning curve is relatively low. On the other, it also offers fields, views, linked records, and lightweight automation, which makes it a good fit for many lighter business scenarios that were previously handled in Excel.&lt;/p&gt;

&lt;p&gt;It can be used to organize and maintain customer information, project progress, campaign schedules, content management, lead follow-up, simple ticketing, operational records, and similar data. It also supports different views, forms, comments, and basic automation on top of that. For organizations that are not yet ready to build complex systems, but already want to make Excel data more structured and collaborative online, tools like this are often sufficient.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Related links&lt;/p&gt;

&lt;p&gt;Airtable official website: &lt;a href="https://www.airtable.com/" rel="noopener noreferrer"&gt;https://www.airtable.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Airtable documentation: &lt;a href="https://support.airtable.com/" rel="noopener noreferrer"&gt;https://support.airtable.com/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Suitable teams
&lt;/h3&gt;

&lt;p&gt;Already using Excel to manage customers, orders, projects, or operational data, but mainly struggling with sharing and maintenance&lt;br&gt;
Want to move data online and structure it first, then gradually add pages or workflows&lt;br&gt;
Need clearer field management, filtered views, and collaboration methods than Excel can offer&lt;br&gt;
Want to validate a business structure at low cost before deciding whether to move toward a more systematic solution&lt;br&gt;
Currently care more about speed of adoption and collaboration efficiency than building a complete system all at once&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementation approach
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. First import Excel data into Airtable&lt;/strong&gt;&lt;br&gt;
Move your existing customer, order, project, ticket, or operational data into Airtable, so information that was previously scattered across local files becomes shared online tables that multiple people can maintain together.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5u60jmpxsswzbmjpi9z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5u60jmpxsswzbmjpi9z.png" alt="airtable1.png" width="800" height="552"&gt;&lt;/a&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Then organize fields, views, and table relationships&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After importing, you will usually need to clean up field names, data types, and basic relationships first, then configure views such as Grid, Kanban, Calendar, Gallery, or Form for different users or use cases. This helps the data move beyond a spreadsheet file and become a structure better suited to online collaboration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F28rsfxx5bpmujk9fffn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F28rsfxx5bpmujk9fffn8.png" alt="airtable2.png" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Add collaboration and lightweight workflows as needed&lt;/strong&gt;&lt;br&gt;
Once the data structure is relatively stable, you can continue adding comments, reminders, simple automations, lightweight approvals, or Interface pages, allowing the platform to gradually support more collaboration and daily operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage limits
&lt;/h3&gt;

&lt;p&gt;Better suited to the transition stage of putting data online and structuring it, but not always suitable for complex business operations&lt;br&gt;
As permissions, workflows, and cross-table relationships become more complex, the limits of the platform itself become more visible&lt;br&gt;
Useful for bringing data together first, but not always enough to support the ongoing operation of a complete system&lt;br&gt;
If you later need to connect more complex databases, APIs, business modules, or finer-grained permission controls, another upgrade step is often still needed&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 3: Use AI tools to generate applications or pages directly
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core idea
&lt;/h3&gt;

&lt;p&gt;This approach does not begin by fully sorting out data structures, permissions, and workflows. Instead, it uses natural language to quickly generate pages, prototypes, or simple applications, making it easier to validate ideas and experiment at a lower initial cost.&lt;/p&gt;

&lt;p&gt;Typical tools in this category include Lovable, Bolt, and v0. These are better suited to quickly turning an idea into a page or application that can be viewed, clicked, and revised. Lovable, for example, is a representative tool in this category. It is particularly useful for quickly generating web app prototypes, pages, and lightweight tools through natural language. Based on text descriptions, it can generate front-end interfaces, and it can also work with back-end, database, and authentication features to help create a first version of the application and support later changes and publishing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Suitable teams
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Need to quickly create a demo, prototype, or internal presentation version&lt;/li&gt;
&lt;li&gt;Are still exploring requirements, and many features or workflows are not fully defined yet&lt;/li&gt;
&lt;li&gt;Want to validate page structure, interaction design, or product direction first&lt;/li&gt;
&lt;li&gt;Care more about speed than building a complete system architecture from the beginning&lt;/li&gt;
&lt;li&gt;Have room for experimentation and can accept later rebuilding or migration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementation approach
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Use natural language to generate the first version of the page or app framework&lt;/strong&gt; Start by clearly describing the need in natural language, such as a customer management page, a project tracking dashboard, or a simple internal tool, and generate the first version directly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyoxnoslp7fpp6iviobi7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyoxnoslp7fpp6iviobi7.png" alt="Lovable1.png" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Then continue refining fields, interactions, and logic&lt;/strong&gt; Once the first version is generated, keep adding forms, buttons, page structure, and basic interactions step by step so it gets closer to the real scenario you want to validate or present.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Finally use it for validation, demos, or short-term trials&lt;/strong&gt; If the goal is only prototype validation, project proposals, lightweight pages, or a short-term online version, this is often enough. In many cases, the real value of these tools is that they help teams move into discussion and testing much faster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vmkhzxyw1rewktfb6mn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vmkhzxyw1rewktfb6mn.png" alt="Lovable2.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage limits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Better suited to prototypes, demos, and rapid experimentation, but not always to complex production use&lt;/li&gt;
&lt;li&gt;Page generation is very fast, but data structures, permission systems, and workflow logic often still need substantial follow-up work&lt;/li&gt;
&lt;li&gt;It is easy to create the interface and interaction first, but that does not mean the underlying structure is ready for long-term operation&lt;/li&gt;
&lt;li&gt;If the product later needs to support complex permissions, cross-table relationships, database design, or long-term maintenance, it usually still needs to be redesigned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡Read more: &lt;a href="https://www.nocobase.com/en/blog/6-developer-tools-with-rbac-support" rel="noopener noreferrer"&gt;Comparison and Use Cases of 6 Development Tools with RBAC Support &lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For many organizations, this approach is better suited to early exploration and validation than to serving directly as the final system form&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Related links&lt;/p&gt;

&lt;p&gt;Lovable official website: &lt;a href="https://lovable.dev/" rel="noopener noreferrer"&gt;https://lovable.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lovable documentation: &lt;a href="https://docs.lovable.dev/" rel="noopener noreferrer"&gt;https://docs.lovable.dev/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Method 4: Use online spreadsheets for sharing and collaboration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core idea
&lt;/h3&gt;

&lt;p&gt;The purpose of this approach is not to turn Excel into an application or system, but to move spreadsheets online and continue using them for sharing, editing, and collaboration.&lt;/p&gt;

&lt;p&gt;Typical tools in this category include Microsoft Excel for the web, Google Sheets, and WPS Online Sheets. These are essentially online spreadsheets. The work still revolves around the spreadsheet file itself, but it happens in an online environment rather than a local one.&lt;/p&gt;

&lt;p&gt;This article uses Google Sheets as the example. It is better suited to scenarios that do not yet require full system-level transformation, but already need better support for shared access and online collaboration. For teams that are already used to Excel, this approach requires almost no relearning and very little structural redesign, so the switching cost is lower.&lt;/p&gt;

&lt;p&gt;💡Read more: &lt;a href="https://www.nocobase.com/en/blog/the-8-best-google-sheets-alternatives-with-full-cost-and-capability-analysis" rel="noopener noreferrer"&gt;The 8 Best Google Sheets Alternatives with Full Cost and Capability Analysis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can support online co-editing, shared links, comments, simple filtering, and basic access control. It is also a practical option for moving routine maintenance spreadsheets online so teams can continue collaborating more easily.&lt;/p&gt;

&lt;h3&gt;
  
  
  Suitable teams
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mainly need multiple people to share and edit the same spreadsheet at the same time&lt;/li&gt;
&lt;li&gt;Are mostly facing problems such as files being passed around, version confusion, and inconsistent updates&lt;/li&gt;
&lt;li&gt;Do not yet have a clear need for formal system building&lt;/li&gt;
&lt;li&gt;Have relatively simple business logic focused on recording, summarizing, and maintenance&lt;/li&gt;
&lt;li&gt;Care more about low barriers and immediate usability than long-term extensibility or system capability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Implementation approach
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Import local Excel files into an online environment&lt;/strong&gt; Move the Excel files that were originally stored locally or on a shared drive into an online workspace, so the team can access and maintain them from one shared entry point.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F199fpb0zsnzptldf51j9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F199fpb0zsnzptldf51j9.png" alt="Google Sheets1.png" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Use sharing, permissions, and comments to collaborate&lt;/strong&gt; Replace email attachments and repeated version updates with online sharing, multi-person editing, comment discussions, and real-time syncing, so the most immediate collaboration issues are addressed first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxzg6oyi09t3wnvv62y1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxzg6oyi09t3wnvv62y1m.png" alt="Google Sheets2.png" width="800" height="743"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Add basic management methods as needed&lt;/strong&gt; From there, you can further organize the spreadsheet through worksheets, simple permission settings, filtering, and views, making it easier for multiple people to maintain together.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcs9kych0lksfklfk258i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcs9kych0lksfklfk258i.png" alt="Google Sheets3.png" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage limits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It is still a spreadsheet at its core, not a formal web application&lt;/li&gt;
&lt;li&gt;Better suited to lightweight collaboration and online sharing than to handling complex business processes&lt;/li&gt;
&lt;li&gt;It can solve version control and collaboration issues first, but may not solve deeper problems related to permissions, workflows, or system structure&lt;/li&gt;
&lt;li&gt;For many organizations, this is the lightest first step, but it is usually not the final destination in the move from Excel to systems&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Related links&lt;/p&gt;

&lt;p&gt;Google Sheets official website: &lt;a href="https://workspace.google.com/products/sheets/" rel="noopener noreferrer"&gt;https://workspace.google.com/products/sheets/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google Sheets documentation: &lt;a href="https://support.google.com/docs/?hl=en" rel="noopener noreferrer"&gt;https://support.google.com/docs/?hl=en&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Excel permissions are not detailed enough. What should we switch to?
&lt;/h3&gt;

&lt;p&gt;If you already need to define who can view, edit, or approve, then it may be time to upgrade directly and use a platform like &lt;strong&gt;NocoBase&lt;/strong&gt; to build CRM, ticketing, approval, or internal management systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Are AI app generation tools suitable for formal business systems?
&lt;/h3&gt;

&lt;p&gt;They are better suited to prototypes, demos, MVPs, or early experimentation, and not ideal as the final solution for complex business systems. If you simply want to create a first version quickly, tools like &lt;strong&gt;Lovable&lt;/strong&gt; can work well.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. If multiple Excel sheets need to maintain relationships with each other, which method is more suitable?
&lt;/h3&gt;

&lt;p&gt;If your data has already been split into customer tables, order tables, project tables, and ticket tables, and those relationships need to be maintained continuously, then ordinary spreadsheets are usually no longer enough. In that case, a data model driven platform like &lt;strong&gt;NocoBase&lt;/strong&gt; is a better fit for structured system-level management.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. At what point should Excel users start considering a move to a real system?
&lt;/h3&gt;

&lt;p&gt;Once Excel starts handling multi-person collaboration, permission control, status changes, and cross-table relationships, it is usually a sign that an upgrade is worth considering. If the workflow is already close to CRM, ERP, ticketing, or project management scenarios, then an extensible no-code platform such as &lt;strong&gt;NocoBase&lt;/strong&gt; may be a suitable next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. If the requirements are still unclear, which tool is the safest place to start?
&lt;/h3&gt;

&lt;p&gt;If the current goal is simply to organize data online and sort out the structure first, then &lt;strong&gt;Airtable&lt;/strong&gt; or &lt;strong&gt;Feishu Bitable&lt;/strong&gt; would usually be a better starting point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Excel is still an effective tool for many teams in everyday work. But as business needs continue to grow, spreadsheets alone often become less able to support the full workflow. In that situation, introducing more suitable tools or systems is usually the more practical choice. We hope this article gives you a useful reference, and feel free to share it with others who are thinking about the same issue.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/5-no-code-low-code-platforms-supporting-external-databases-mysql-mongodb-api" rel="noopener noreferrer"&gt;Not Just PostgreSQL: Comparing 5 No-Code/Low-Code Platforms with External Database Support &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/open-source-project-management-tool-selection-guide-2026-edition" rel="noopener noreferrer"&gt;Open Source Project Management Tool Selection Guide, 2026 Edition &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/how-to-build-a-custom-crm-with-postgresql" rel="noopener noreferrer"&gt;How to Build a Custom CRM with PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/best-open-source-ai-projects-github-2026" rel="noopener noreferrer"&gt;Top 20 AI Projects on GitHub to Watch in 2026: Not Just OpenClaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/best-ai-crm-open-source-nocobase-twenty-krayin" rel="noopener noreferrer"&gt;Best Open Source AI CRM: NocoBase vs Twenty vs Krayin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/top-3-open-source-erp-with-ai-on-github-nocobase-vs-odoo-vs-erpnext" rel="noopener noreferrer"&gt;Top 3 Open Source ERP with AI on GitHub: NocoBase vs Odoo vs ERPNext&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/5-most-popular-open-source-ai-project-management-tools-on-github" rel="noopener noreferrer"&gt;5 Most Popular Open-Source AI Project Management Tools on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/6-best-open-source-ai-ticketing-systems" rel="noopener noreferrer"&gt;6 Best Open-Source AI Ticketing Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/4-open-source-data-management-tools-for-business-systems" rel="noopener noreferrer"&gt;4 Open Source Data Management Tools for Business Systems&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>nocode</category>
      <category>automation</category>
    </item>
    <item>
      <title>Weekly Updates Add JS variables to event flow</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Thu, 02 Apr 2026 06:41:50 +0000</pubDate>
      <link>https://forem.com/nocobase/weekly-updatesadd-js-variables-to-event-flow-29dp</link>
      <guid>https://forem.com/nocobase/weekly-updatesadd-js-variables-to-event-flow-29dp</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://www.nocobase.com/en/blog/weekly-updates-20260402" rel="noopener noreferrer"&gt;https://www.nocobase.com/en/blog/weekly-updates-20260402&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Summarize the weekly product update logs, and the latest releases can be checked on &lt;a href="https://www.nocobase.com/en/blog/timeline" rel="noopener noreferrer"&gt;our blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NocoBase is currently updated with three branches: &lt;code&gt;main&lt;/code&gt; , &lt;code&gt;next&lt;/code&gt; and &lt;code&gt;develop&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66qf0fuohv233at2nnzv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66qf0fuohv233at2nnzv.png" alt="version.png" width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;main&lt;/code&gt;：The most stable version to date, recommended for installation;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;next&lt;/code&gt;：Beta version, contains upcoming new features and has been preliminarily tested. There might be some known or unknown issues. It's mainly for test users to collect feedback and optimize functions further. Ideal for test users who want to experience new features early and give feedback;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;develop&lt;/code&gt;：Alpha version, contains the latest feature code, may be incomplete or unstable, mainly for internal dev and rapid iteration. Suited for tech users interested in product's cutting-edge, but with potential issues and incomplete functions. Not for production use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  main
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjmnc6cb7az5ofw9t1ip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjmnc6cb7az5ofw9t1ip.png" alt="main.png" width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.31" rel="noopener noreferrer"&gt;v2.0.31&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-04-01&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[AI employees]&lt;/strong&gt; Optimize prompts for deepseek when handling unsupported file types (&lt;a href="https://github.com/nocobase/nocobase/pull/9003" rel="noopener noreferrer"&gt;#9003&lt;/a&gt;) by @cgyrock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow]&lt;/strong&gt; Change enabled switch size to small (&lt;a href="https://github.com/nocobase/nocobase/pull/9010" rel="noopener noreferrer"&gt;#9010&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Fixed the issue where the copy of the associated fields in the table was not displayed correctly in the first rendering. (&lt;a href="https://github.com/nocobase/nocobase/pull/9007" rel="noopener noreferrer"&gt;#9007&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[flow-engine]&lt;/strong&gt; Fix clipped settings menus in popup (&lt;a href="https://github.com/nocobase/nocobase/pull/9005" rel="noopener noreferrer"&gt;#9005&lt;/a&gt;) by &lt;a class="mentioned-user" href="https://dev.to/gchust"&gt;@gchust&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Notification: In-app message]&lt;/strong&gt; Fix action whitelist for in-app message updates to prevent unauthorized updates by non-owners. (&lt;a href="https://github.com/nocobase/nocobase/pull/9001" rel="noopener noreferrer"&gt;#9001&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[AI employees]&lt;/strong&gt; Fixed the issue of abnormal web search behavior when using the Qwen  LLM (&lt;a href="https://github.com/nocobase/nocobase/pull/9012" rel="noopener noreferrer"&gt;#9012&lt;/a&gt;) by @cgyrock&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.30" rel="noopener noreferrer"&gt;v2.0.30&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-30&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: JavaScript]&lt;/strong&gt; Add &lt;code&gt;isolated-vm&lt;/code&gt; as default JavaScript execute engine for JavaScript node (&lt;a href="https://github.com/nocobase/nocobase/pull/8973" rel="noopener noreferrer"&gt;#8973&lt;/a&gt;) by @mytharcher
Reference: &lt;a href="https://docs.nocobase.com/cn/workflow/nodes/javascript" rel="noopener noreferrer"&gt;JavaScript Node&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Fixed incorrect secondary confirmation message when closing multi-level popup after modifying form data. (&lt;a href="https://github.com/nocobase/nocobase/pull/8944" rel="noopener noreferrer"&gt;#8944&lt;/a&gt;) by &lt;a class="mentioned-user" href="https://dev.to/gchust"&gt;@gchust&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: SQL node]&lt;/strong&gt; Fix security issue in SQL node (&lt;a href="https://github.com/nocobase/nocobase/pull/8989" rel="noopener noreferrer"&gt;#8989&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[AI employees]&lt;/strong&gt; Add ownership verification to the AI conversation API (&lt;a href="https://github.com/nocobase/nocobase/pull/8993" rel="noopener noreferrer"&gt;#8993&lt;/a&gt;) by @cgyrock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Fix version limit of legacy migrations to avoid error thrown when start in latest version deployment by @mytharcher&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.29" rel="noopener noreferrer"&gt;v2.0.29&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-30&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[undefined]&lt;/strong&gt; Reduced log noise during server startup by silencing unzip commands for LibreOffice and Oracle Instant Client (&lt;a href="https://github.com/nocobase/nocobase/pull/8984" rel="noopener noreferrer"&gt;#8984&lt;/a&gt;) by @Rishabh1925&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Fix the issue where space in variable expression cause label not display (&lt;a href="https://github.com/nocobase/nocobase/pull/8988" rel="noopener noreferrer"&gt;#8988&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[flow-engine]&lt;/strong&gt; Fixed an issue where menu items could not be selected when the UI component width in the configuration state was too small. (&lt;a href="https://github.com/nocobase/nocobase/pull/8954" rel="noopener noreferrer"&gt;#8954&lt;/a&gt;) by &lt;a class="mentioned-user" href="https://dev.to/gchust"&gt;@gchust&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Data visualization]&lt;/strong&gt; When using variable-based filters, charts fail to resolve variable values correctly on the initial render (&lt;a href="https://github.com/nocobase/nocobase/pull/8964" rel="noopener noreferrer"&gt;#8964&lt;/a&gt;) by @2013xile&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.28" rel="noopener noreferrer"&gt;v2.0.28&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-27&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[Action: Import records]&lt;/strong&gt; fixed the problem of import failure after opening plugin-space (&lt;a href="https://github.com/nocobase/nocobase/pull/8968" rel="noopener noreferrer"&gt;#8968&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Data visualization]&lt;/strong&gt; fixed the abnormal data statistics of the root role chart after enabling the space plugin (&lt;a href="https://github.com/nocobase/nocobase/pull/8969" rel="noopener noreferrer"&gt;#8969&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: JavaScript]&lt;/strong&gt; Fix security issues (&lt;a href="https://github.com/nocobase/nocobase/pull/8967" rel="noopener noreferrer"&gt;#8967&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[AI employees]&lt;/strong&gt; Adjust the gap between the tool card components in the AI Conversation (&lt;a href="https://github.com/nocobase/nocobase/pull/8965" rel="noopener noreferrer"&gt;#8965&lt;/a&gt;) by @cgyrock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Action: Export records]&lt;/strong&gt; Limit import and export configuration of multi-layer related fields (&lt;a href="https://github.com/nocobase/nocobase/pull/8893" rel="noopener noreferrer"&gt;#8893&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Action: Import records Pro]&lt;/strong&gt; limit import and export configuration of multi-layer related fields by @jiannx&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.27" rel="noopener noreferrer"&gt;v2.0.27&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-26&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow]&lt;/strong&gt; Add variable for page size parameter (&lt;a href="https://github.com/nocobase/nocobase/pull/8951" rel="noopener noreferrer"&gt;#8951&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Subflow]&lt;/strong&gt; Add defensive logic to avoid workflow hangs when exception occurs by @mytharcher&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Fixed the exception when adding child nodes to the tree table in the pop-up window (&lt;a href="https://github.com/nocobase/nocobase/pull/8872" rel="noopener noreferrer"&gt;#8872&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[server]&lt;/strong&gt; Avoid to handle sync-message after app stopped (&lt;a href="https://github.com/nocobase/nocobase/pull/8940" rel="noopener noreferrer"&gt;#8940&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Flow engine]&lt;/strong&gt; Remove legacy event copied from uiSchema repository to avoid error thrown when triggering (&lt;a href="https://github.com/nocobase/nocobase/pull/8957" rel="noopener noreferrer"&gt;#8957&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Authentication]&lt;/strong&gt; fix acl to support custom state filtering parameters (&lt;a href="https://github.com/nocobase/nocobase/pull/8918" rel="noopener noreferrer"&gt;#8918&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Email manager]&lt;/strong&gt; Fixed signature being overwritten when using templates by @jiannx&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  develop
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow9jd2rkp6w0rmrzuzwl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow9jd2rkp6w0rmrzuzwl.png" alt="develop.png" width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.1.0-alpha.13" rel="noopener noreferrer"&gt;v2.1.0-alpha.13&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-27&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎉 New Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Add JS variables to event flow (&lt;a href="https://github.com/nocobase/nocobase/pull/8938" rel="noopener noreferrer"&gt;#8938&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; support setting field styles through runjs (&lt;a href="https://github.com/nocobase/nocobase/pull/8933" rel="noopener noreferrer"&gt;#8933&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[flow-engine]&lt;/strong&gt; Improve schema validation for ui building api. (&lt;a href="https://github.com/nocobase/nocobase/pull/8881" rel="noopener noreferrer"&gt;#8881&lt;/a&gt;) by &lt;a class="mentioned-user" href="https://dev.to/gchust"&gt;@gchust&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Pre-action event]&lt;/strong&gt; Add validation rules for triggers and nodes (&lt;a href="https://github.com/nocobase/nocobase/pull/8971" rel="noopener noreferrer"&gt;#8971&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow]&lt;/strong&gt; Add variable for page size parameter (&lt;a href="https://github.com/nocobase/nocobase/pull/8951" rel="noopener noreferrer"&gt;#8951&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Webhook]&lt;/strong&gt; Add validation for creating trigger / node API by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[Workflow: Subflow]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add validation for creating node API by @mytharcher&lt;/li&gt;
&lt;li&gt;Add defensive logic to avoid workflow hangs when exception occurs by @mytharcher&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Add validation for trigger / node API by @mytharcher&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Fixed the exception when adding child nodes to the tree table in the pop-up window (&lt;a href="https://github.com/nocobase/nocobase/pull/8872" rel="noopener noreferrer"&gt;#8872&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[server]&lt;/strong&gt; Avoid to handle sync-message after app stopped (&lt;a href="https://github.com/nocobase/nocobase/pull/8940" rel="noopener noreferrer"&gt;#8940&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Action: Export records]&lt;/strong&gt; Limit import and export configuration of multi-layer related fields (&lt;a href="https://github.com/nocobase/nocobase/pull/8893" rel="noopener noreferrer"&gt;#8893&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Data visualization]&lt;/strong&gt; fixed the abnormal data statistics of the root role chart after enabling the space plugin (&lt;a href="https://github.com/nocobase/nocobase/pull/8969" rel="noopener noreferrer"&gt;#8969&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Action: Import records]&lt;/strong&gt; fixed the problem of import failure after opening plugin-space (&lt;a href="https://github.com/nocobase/nocobase/pull/8968" rel="noopener noreferrer"&gt;#8968&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: JavaScript]&lt;/strong&gt; Fix security issues (&lt;a href="https://github.com/nocobase/nocobase/pull/8967" rel="noopener noreferrer"&gt;#8967&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[AI employees]&lt;/strong&gt; Adjust the gap between the tool card components in the AI Conversation (&lt;a href="https://github.com/nocobase/nocobase/pull/8965" rel="noopener noreferrer"&gt;#8965&lt;/a&gt;) by @cgyrock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Flow engine]&lt;/strong&gt; Remove legacy event copied from uiSchema repository to avoid error thrown when triggering (&lt;a href="https://github.com/nocobase/nocobase/pull/8957" rel="noopener noreferrer"&gt;#8957&lt;/a&gt;) by @mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Authentication]&lt;/strong&gt; fix acl to support custom state filtering parameters (&lt;a href="https://github.com/nocobase/nocobase/pull/8918" rel="noopener noreferrer"&gt;#8918&lt;/a&gt;) by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Action: Import records Pro]&lt;/strong&gt; limit import and export configuration of multi-layer related fields by @jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Email manager]&lt;/strong&gt; Fixed signature being overwritten when using templates by @jiannx&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  About NocoBase
&lt;/h3&gt;

&lt;p&gt;NocoBase is the most extensible AI-powered no-code platform.&lt;br&gt;
Total control. Infinite extensibility. AI collaboration.&lt;br&gt;
Enable your team to adapt quickly and cut costs dramatically.&lt;br&gt;
No years of development. No millions wasted.&lt;br&gt;
Deploy NocoBase in minutes — and take control of everything.&lt;/p&gt;

&lt;p&gt;Discover NocoBase in 3 Minutes!&lt;/p&gt;

&lt;h3&gt;
  
  
  👇 Get NocoBase
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;Homepage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.nocobase.com/new" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://v2.docs.nocobase.com/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nocode</category>
      <category>opensource</category>
      <category>news</category>
    </item>
    <item>
      <title>Case Study: Digitizing Medical Manufacturing Workflows with NocoBase</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Wed, 01 Apr 2026 12:12:18 +0000</pubDate>
      <link>https://forem.com/nocobase/case-study-digitizing-medical-manufacturing-workflows-with-nocobase-1dp1</link>
      <guid>https://forem.com/nocobase/case-study-digitizing-medical-manufacturing-workflows-with-nocobase-1dp1</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://www.nocobase.com/en/blog/medical-device-manufacturer-builds-self-hosted-management-system-with-nocobase" rel="noopener noreferrer"&gt;https://www.nocobase.com/en/blog/medical-device-manufacturer-builds-self-hosted-management-system-with-nocobase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Confidentiality Note:&lt;/strong&gt; To protect the privacy and security of the organization, this study is shared anonymously. The workflows and outcomes described below accurately reflect a real-world implementation in the medical device sector.&lt;/p&gt;




&lt;p&gt;In medical device manufacturing, internal processes require more than just basic management—they demand long-term data retention, rigorous traceability, and audit-ready verification.&lt;/p&gt;

&lt;p&gt;Despite these requirements, many organizations still rely on paper logs and fragmented spreadsheets. A leading medical manufacturer recently moved away from high-cost custom development and rigid SaaS vendors, choosing &lt;strong&gt;NocoBase&lt;/strong&gt; as a flexible foundation to build their own internal management systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5b1f8hxuegf1r9g9efj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5b1f8hxuegf1r9g9efj.png" alt="image.png" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Context &amp;amp; Problem
&lt;/h2&gt;

&lt;p&gt;The IT department at this manufacturing firm faced a common dilemma. They needed to modernize three core operational areas: &lt;strong&gt;Equipment Management&lt;/strong&gt;, &lt;strong&gt;IT Asset Tracking&lt;/strong&gt;, and &lt;strong&gt;Validation Records&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Their constraints were specific:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Regulatory Compliance:&lt;/strong&gt; Data must be traceable and retrievable for long-term audits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security &amp;amp; Sovereignty:&lt;/strong&gt; Due to industry regulations, the systems had to be &lt;strong&gt;self-hosted&lt;/strong&gt; on a private intranet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development Cost:&lt;/strong&gt; Building from scratch was too resource-intensive, while off-the-shelf SaaS products lacked the necessary local deployment options and flexibility to match their specific business logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Solution: An Open-Source, Self-Hosted Foundation
&lt;/h2&gt;

&lt;p&gt;The team chose NocoBase to balance the control of custom software with the speed of a platform. By opting for an open-source, extensible architecture, they achieved:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Data Sovereignty:&lt;/strong&gt; Full control over their database and application environment on-premise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterative Development:&lt;/strong&gt; Instead of a "big bang" implementation, they built and deployed systems incrementally as business needs evolved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility:&lt;/strong&gt; The ability to adjust data models and workflows without being locked into a vendor's roadmap.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Key Implementation Details
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Equipment Management &amp;amp; Knowledge Base
&lt;/h3&gt;

&lt;p&gt;Previously, maintenance logs and acceptance documents were scattered across Excel files and physical folders.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuobzi6up6xiozi8iz6jj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuobzi6up6xiozi8iz6jj.png" alt="NocoBase1.png" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System Design:&lt;/strong&gt; The team built a centralized equipment ledger using NocoBase’s &lt;strong&gt;Data sources&lt;/strong&gt; and &lt;strong&gt;Collection&lt;/strong&gt; features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow:&lt;/strong&gt; Every piece of hardware now has a digital twin containing its status, technical manuals, and historical maintenance records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Retention:&lt;/strong&gt; They implemented a "Maintenance Wiki" within the system to document common faults and spare-part lifespans, transforming individual technician "know-how" into a searchable corporate asset.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. IT Asset Lifecycle Tracking
&lt;/h3&gt;

&lt;p&gt;Managing hardware like computers and networking gear through paper trails led to frequent discrepancies during audits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd78ge3hjswtu9cwvrv2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd78ge3hjswtu9cwvrv2l.png" alt="NocoBase2.png" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3xxj8dtfjvvf8wt7ise.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3xxj8dtfjvvf8wt7ise.png" alt="NocoBase3.png" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Model:&lt;/strong&gt; A lifecycle-based model was implemented to track assets from &lt;strong&gt;procurement (inbound)&lt;/strong&gt; to &lt;strong&gt;assignment (transfer)&lt;/strong&gt; and &lt;strong&gt;retirement&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability:&lt;/strong&gt; By using NocoBase's built-in logging, the IT team can now perform digital inventories and verify the chain of custody for any asset in real-time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Validation Record Management (V&amp;amp;V)
&lt;/h3&gt;

&lt;p&gt;Verification and Validation (V&amp;amp;V) records for equipment and processes are critical in medical manufacturing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mb3dnjfuu8ojfdfjl1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mb3dnjfuu8ojfdfjl1z.png" alt="NocoBase4.png" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjtu24fc7pgepqlgae77q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjtu24fc7pgepqlgae77q.png" alt="NocoBase5.png" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traceability:&lt;/strong&gt; This module focuses on document collection and versioning. By structuring these records in a unified database, the firm replaced fragmented document storage with a relational system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions (RBAC):&lt;/strong&gt; Using NocoBase’s Role-Based Access Control, they ensured that sensitive validation data is only accessible to authorized QA and technical personnel, meeting internal compliance standards.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Outcome &amp;amp; Impact
&lt;/h2&gt;

&lt;p&gt;By moving from manual processes to a structured digital environment, the manufacturer has established a "single source of truth" for their operations.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"In the medical industry, our systems must operate within a private network. By using NocoBase to build our own tools, we ensured operational efficiency while keeping our business data entirely under our own control." — &lt;strong&gt;IT Director&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This case reflects a common pattern in traditional industries:&lt;/p&gt;

&lt;p&gt;Start by structuring &lt;strong&gt;core operational data and workflows&lt;/strong&gt;, especially those still dependent on manual processes. Once the foundation is stable, systems become &lt;strong&gt;queryable, traceable, and extensible by design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For enterprise applications, reliability at the data and system level remains the prerequisite. Only after that foundation is in place can more advanced capabilities, such as AI-driven automation, deliver meaningful impact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More Customer Stories:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/software-vendor-boosts-delivery-efficiency-with-nocobase" rel="noopener noreferrer"&gt;Software Vendor Boosts Delivery Efficiency by 70% with NocoBase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/an-erp-built-with-nocobase" rel="noopener noreferrer"&gt;Community Spotlight: Building a Real-World ERP with NocoBase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/shenzhen-chuanglianyun-tech-development-methodology" rel="noopener noreferrer"&gt;Inside: How an 8-Person Team Delivers at Enterprise Speed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/ai-multimodal-platform" rel="noopener noreferrer"&gt;Built an AI Multimodal R&amp;amp;D Platform in Days — with NocoBase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/nocobase-in-russia" rel="noopener noreferrer"&gt;NocoBase in Russia: Multi-Scenario Digital Solutions in Action&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/university-course" rel="noopener noreferrer"&gt;NocoBase Enters German University Classrooms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/ed" rel="noopener noreferrer"&gt;NocoBase as ED’s Technology Foundation: From Internal Systems to Commercial Products&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/classact" rel="noopener noreferrer"&gt;Sub-Second Response at Scale: Classact Runs NocoBase on Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>nocode</category>
      <category>news</category>
    </item>
    <item>
      <title>Not Just PostgreSQL: Comparing 5 No-Code/Low-Code Platforms with External Database Support</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Mon, 30 Mar 2026 17:34:06 +0000</pubDate>
      <link>https://forem.com/nocobase/not-just-postgresql-comparing-5-no-codelow-code-platforms-with-external-database-support-3f5k</link>
      <guid>https://forem.com/nocobase/not-just-postgresql-comparing-5-no-codelow-code-platforms-with-external-database-support-3f5k</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://www.nocobase.com/en/blog/5-no-code-low-code-platforms-supporting-external-databases-mysql-mongodb-api" rel="noopener noreferrer"&gt;https://www.nocobase.com/en/blog/5-no-code-low-code-platforms-supporting-external-databases-mysql-mongodb-api&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;If you need to build a full business system on top of your existing database, such as CRM, ERP, approval workflows, or ticketing, &lt;strong&gt;NocoBase&lt;/strong&gt; is the best fit. It supports multi source data management, cross source relationships, and deep business modeling. If you simply want to build internal tools or admin interfaces quickly, &lt;strong&gt;Retool, Appsmith, and ToolJet&lt;/strong&gt; are easier to adopt. If your main focus is workflow driven applications such as approvals and ticketing, &lt;strong&gt;Budibase&lt;/strong&gt; is a better choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before We Begin
&lt;/h2&gt;

&lt;p&gt;As business needs become more diverse, many teams want to quickly add an application layer on top of their existing data and systems to build internal operating systems such as CRM, ERP, approvals, and ticketing. In this context, no code and low code platforms that can connect flexibly to existing data sources without changing the underlying system have become a priority for many companies.&lt;/p&gt;

&lt;p&gt;We have previously published two types of content around PostgreSQL. One is a practical guide, &lt;a href="https://www.nocobase.com/cn/blog/how-to-build-a-custom-crm-with-postgresql" rel="noopener noreferrer"&gt;How to Build a Usable CRM Based on PostgreSQL&lt;/a&gt;. The other focuses on tool selection, &lt;a href="https://www.nocobase.com/cn/blog/6-no-code-tools-supporting-postgresql" rel="noopener noreferrer"&gt;6 No Code Tools That Support PostgreSQL&lt;/a&gt;, comparing how different platforms support PostgreSQL across areas such as native integration, relationship modeling, and self hosted deployment.&lt;/p&gt;

&lt;p&gt;PostgreSQL is only one common option. Many teams may already be working with MySQL, MariaDB, or MongoDB. In some cases, data is not stored directly in a database at all, but exposed through REST APIs or GraphQL interfaces.&lt;/p&gt;

&lt;p&gt;In this article, we compare several mainstream no code and low code platforms across four key dimensions: support for external data sources and depth of integration, handling of complex business relationships, workflows and permissions, efficiency in building business systems, and long term extensibility.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: Sources used in this article&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The product capabilities, data source support, and related information covered here are mainly compiled from each product’s official website, official documentation, GitHub repository, and other public materials.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;💬 Hey, you're reading the NocoBase blog. NocoBase is the most extensible AI-powered no-code/low-code development platform for building enterprise applications, internal tools, and all kinds of systems. It’s fully self-hosted, plugin-based, and developer-friendly. →&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt; Explore NocoBase on GitHub&lt;/a&gt;]&lt;/p&gt;




&lt;p&gt;For this article, we selected five low code and no code platforms that are drawing strong attention right now:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;NocoBase&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hbxq6iw4zc19uqpu5hm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hbxq6iw4zc19uqpu5hm.png" alt="nocobase1.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An open source AI no code and low code platform built around a data model driven architecture. It brings complex data relationships, permissions, workflows, and plugin extensions into one unified system foundation, making it well suited for continuously building enterprise applications, internal tools, and complex business systems on top of existing data.&lt;/p&gt;

&lt;p&gt;Official website: &lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;https://www.nocobase.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt;https://github.com/nocobase/nocobase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Data source documentation: &lt;a href="https://docs.nocobase.com/data-sources/data-source-manager/" rel="noopener noreferrer"&gt;https://docs.nocobase.com/data-sources/data-source-manager/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Retool&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznv0obkm0znfz1qzy7j5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fznv0obkm0znfz1qzy7j5.png" alt="Retool1.png" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An internal tool and operations platform designed for teams. It can quickly combine databases, APIs, workflows, and front end components into usable internal software, making it a good fit for admin panels, operations dashboards, and data tools.&lt;/p&gt;

&lt;p&gt;Official website: &lt;a href="https://retool.com/" rel="noopener noreferrer"&gt;https://retool.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/retool" rel="noopener noreferrer"&gt;https://github.com/retool&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Data source documentation: &lt;a href="https://docs.retool.com/data-sources/" rel="noopener noreferrer"&gt;https://docs.retool.com/data-sources/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Appsmith&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqybefps4jwai8ph1akxa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqybefps4jwai8ph1akxa.png" alt="Appsmith1.png" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A developer friendly low code front end layer that helps engineering teams build CRUD apps, admin pages, and custom internal tools faster on top of existing databases, APIs, and scripts, while keeping strong control over JavaScript and Git workflows.&lt;/p&gt;

&lt;p&gt;Official website: &lt;a href="https://www.appsmith.com/" rel="noopener noreferrer"&gt;https://www.appsmith.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/appsmithorg/appsmith" rel="noopener noreferrer"&gt;https://github.com/appsmithorg/appsmith&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Data source documentation: &lt;a href="https://docs.appsmith.com/connect-data/overview" rel="noopener noreferrer"&gt;https://docs.appsmith.com/connect-data/overview&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Budibase&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5n3eguijnl1rvq3ivnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5n3eguijnl1rvq3ivnz.png" alt="Budibase1.png" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Best known for form based, approval based, request based, and workflow driven applications. Its product focus is clearly closer to internal process automation, so it is especially suitable for service requests, ticket routing, approval handling, and data collection.&lt;/p&gt;

&lt;p&gt;Official website: &lt;a href="https://budibase.com/" rel="noopener noreferrer"&gt;https://budibase.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Budibase/budibase" rel="noopener noreferrer"&gt;https://github.com/Budibase/budibase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Data source documentation: &lt;a href="https://docs.budibase.com/docs/data-sources" rel="noopener noreferrer"&gt;https://docs.budibase.com/docs/data-sources&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ToolJet
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3khgz06zxaimhe0ms53.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3khgz06zxaimhe0ms53.png" alt="ToolJet1.png" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A platform focused on multi source connectivity and rapid internal tool building. It supports databases, APIs, SaaS tools, and cloud services, making it a strong choice for teams that need to bring multiple existing systems into one unified interface quickly.&lt;/p&gt;

&lt;p&gt;Official website: &lt;a href="https://www.tooljet.com/" rel="noopener noreferrer"&gt;https://www.tooljet.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/ToolJet/ToolJet" rel="noopener noreferrer"&gt;https://github.com/ToolJet/ToolJet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Data source documentation: &lt;a href="https://docs.tooljet.com/docs/data-sources/overview/" rel="noopener noreferrer"&gt;https://docs.tooljet.com/docs/data-sources/overview/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. External Data Source Support and Integration Depth
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Supported Data Source Types&lt;/th&gt;
&lt;th&gt;Typical Data Sources&lt;/th&gt;
&lt;th&gt;Integration Depth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NocoBase&lt;/td&gt;
&lt;td&gt;Relational databases, NoSQL, APIs, file based sources&lt;/td&gt;
&lt;td&gt;MySQL, MariaDB, PostgreSQL, MSSQL, Oracle, KingbaseES, REST API&lt;/td&gt;
&lt;td&gt;More than simple data connection and read or write access. It also supports unified multi source management, cross source relationships, and continued modeling on top of existing data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retool&lt;/td&gt;
&lt;td&gt;Relational databases, NoSQL, data warehouses, APIs&lt;/td&gt;
&lt;td&gt;PostgreSQL, MySQL, MongoDB, Snowflake, BigQuery, REST API, GraphQL, Google Sheets&lt;/td&gt;
&lt;td&gt;More focused on bringing existing data sources into one interface, then using queries, components, and workflows for reading, updating, and orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Appsmith&lt;/td&gt;
&lt;td&gt;Relational databases, NoSQL, search engines, APIs&lt;/td&gt;
&lt;td&gt;PostgreSQL, MySQL, MongoDB, Microsoft SQL Server, Oracle, Redis, Snowflake, GraphQL&lt;/td&gt;
&lt;td&gt;More focused on configuring queries, pages, and interaction logic on top of existing databases and APIs to quickly form an application front end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budibase&lt;/td&gt;
&lt;td&gt;Relational databases, NoSQL, cache, APIs, object storage&lt;/td&gt;
&lt;td&gt;PostgreSQL, MySQL / MariaDB, MongoDB, MS SQL Server, Oracle, Redis, S3, Google Sheets&lt;/td&gt;
&lt;td&gt;Supports both external data source connections and app building through queries, forms, and workflow configuration, though it still centers mainly on data driven pages and workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ToolJet&lt;/td&gt;
&lt;td&gt;Relational databases, NoSQL, data warehouses, APIs, SaaS data sources&lt;/td&gt;
&lt;td&gt;PostgreSQL, MySQL, MongoDB, MS SQL Server, Snowflake, BigQuery, REST API, GraphQL&lt;/td&gt;
&lt;td&gt;More focused on connecting many kinds of data sources for reading, updating, and unified operations, with support for both SQL and visual query building&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retool, Appsmith, and ToolJet are best suited to quickly adding an operations layer or tool layer on top of existing databases and APIs, so teams can connect, query, and update data more easily&lt;/li&gt;
&lt;li&gt;Budibase goes a step further toward workflow driven applications&lt;/li&gt;
&lt;li&gt;NocoBase is positioned closer to building systems on top of existing data, with stronger extensibility in multi source management, cross source relationships, and continued modeling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23r4fe78pvzdbp9kri6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F23r4fe78pvzdbp9kri6r.png" alt="NocoBase2.png" width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Complex Business Relationships, Workflows, and Permissions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Handling Complex Relationships&lt;/th&gt;
&lt;th&gt;Workflows / Automation&lt;/th&gt;
&lt;th&gt;Permission Granularity&lt;/th&gt;
&lt;th&gt;Suitable Business Complexity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NocoBase&lt;/td&gt;
&lt;td&gt;Strong, well suited for multi table relationships and complex business objects&lt;/td&gt;
&lt;td&gt;Built in workflows, supports data driven processes&lt;/td&gt;
&lt;td&gt;Role, action, data, and field level permissions&lt;/td&gt;
&lt;td&gt;Medium to high complexity business systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retool&lt;/td&gt;
&lt;td&gt;Moderately strong, more focused on internal tool orchestration&lt;/td&gt;
&lt;td&gt;Mature workflows, suitable for multi step tasks&lt;/td&gt;
&lt;td&gt;Role permissions, permission groups, and object level control&lt;/td&gt;
&lt;td&gt;Medium complexity internal software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Appsmith&lt;/td&gt;
&lt;td&gt;Moderate, with relationship handling relying more on developer configuration&lt;/td&gt;
&lt;td&gt;Supports workflow orchestration through queries, scripts, and events&lt;/td&gt;
&lt;td&gt;Fine grained control at the app, page, and query level&lt;/td&gt;
&lt;td&gt;Medium complexity custom applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budibase&lt;/td&gt;
&lt;td&gt;Moderate, more focused on forms and workflow relationships&lt;/td&gt;
&lt;td&gt;Well suited for approvals, requests, and status transitions&lt;/td&gt;
&lt;td&gt;Role, dataset, and field level control&lt;/td&gt;
&lt;td&gt;Medium complexity workflow driven applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ToolJet&lt;/td&gt;
&lt;td&gt;Moderate, more focused on tool layer integration&lt;/td&gt;
&lt;td&gt;Supports workflows, conditional logic, and notifications&lt;/td&gt;
&lt;td&gt;Role, workspace, and custom group permissions&lt;/td&gt;
&lt;td&gt;Low to medium complexity tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your business is complex and you want to continue building complete business systems such as CRM, ERP, approvals, or ticketing on top of your existing database, NocoBase is the better fit.&lt;/li&gt;
&lt;li&gt;If your needs are lighter and your priority is to quickly build an internal tool, operations backend, or workflow app, platforms like Retool are easier to adopt.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwlp7lp2cpe65gtckohgn.png" alt="Retool2.png" width="800" height="434"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Efficiency in Building Business Pages
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Page Support&lt;/th&gt;
&lt;th&gt;Build Method&lt;/th&gt;
&lt;th&gt;Code Involvement&lt;/th&gt;
&lt;th&gt;Suitable Scenarios&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NocoBase&lt;/td&gt;
&lt;td&gt;Tables, forms, detail views, kanban boards, charts, action pages&lt;/td&gt;
&lt;td&gt;Block configuration + JS block extension + action configuration + AI employee assisted generation&lt;/td&gt;
&lt;td&gt;Low, with scripts or plugins available for more complex needs&lt;/td&gt;
&lt;td&gt;Data driven business pages and complex backends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retool&lt;/td&gt;
&lt;td&gt;Tables, forms, charts, panels, admin backends&lt;/td&gt;
&lt;td&gt;Canvas + drag and drop components + code&lt;/td&gt;
&lt;td&gt;Medium, with common scenarios often combining SQL and JS&lt;/td&gt;
&lt;td&gt;Operations consoles, data tools, and internal backends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Appsmith&lt;/td&gt;
&lt;td&gt;Tables, forms, charts, dashboards, CRUD pages&lt;/td&gt;
&lt;td&gt;Drag and drop components + JS customization&lt;/td&gt;
&lt;td&gt;Medium to high, better suited for developer involvement&lt;/td&gt;
&lt;td&gt;Custom internal apps and developer led pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budibase&lt;/td&gt;
&lt;td&gt;Forms, tables, approval pages, request pages, backend pages&lt;/td&gt;
&lt;td&gt;Low code configuration + form workflows&lt;/td&gt;
&lt;td&gt;Low to medium, with extra configuration added for complex logic&lt;/td&gt;
&lt;td&gt;Form driven and workflow driven pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ToolJet&lt;/td&gt;
&lt;td&gt;Tables, forms, charts, dashboards, internal tool pages&lt;/td&gt;
&lt;td&gt;Drag and drop front end builder&lt;/td&gt;
&lt;td&gt;Medium, with complex tool pages usually requiring query and event setup&lt;/td&gt;
&lt;td&gt;Multi source tool pages and operations backends&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Retool, Appsmith, and ToolJet&lt;/strong&gt; are a better fit for teams with engineering resources that want to keep room for customization and logic control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budibase&lt;/strong&gt; is better for teams with a lower technical barrier that want to build pages and workflows quickly through configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic-docs.nocobase.com%2FBudibase2-jzwsgn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstatic-docs.nocobase.com%2FBudibase2-jzwsgn.png" alt="Budibase2.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NocoBase&lt;/strong&gt; is more flexible. It supports visual configuration while also lowering the setup barrier further through &lt;strong&gt;JS blocks&lt;/strong&gt; and &lt;strong&gt;AI employees&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Long Term Extensibility
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Extension Method&lt;/th&gt;
&lt;th&gt;Openness&lt;/th&gt;
&lt;th&gt;Long Term Maintainability&lt;/th&gt;
&lt;th&gt;Typical Fit Scenarios&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NocoBase&lt;/td&gt;
&lt;td&gt;Plugin extensions and extending pages, blocks, actions, and APIs around the data model&lt;/td&gt;
&lt;td&gt;High, with a microkernel and fully plugin based architecture&lt;/td&gt;
&lt;td&gt;Strong, suitable for gradual module expansion and long term development&lt;/td&gt;
&lt;td&gt;Complex business systems, workflow driven applications, and enterprise apps under continuous iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retool&lt;/td&gt;
&lt;td&gt;Module reuse, custom components, code extensions, version control&lt;/td&gt;
&lt;td&gt;High, with reusable components and queries and support for custom React components&lt;/td&gt;
&lt;td&gt;Strong, suitable for continuous internal software iteration by multiple team members&lt;/td&gt;
&lt;td&gt;Internal software, operations tools, data applications, and continuously evolving projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Appsmith&lt;/td&gt;
&lt;td&gt;JavaScript customization, custom components, Git workflows, package version management&lt;/td&gt;
&lt;td&gt;High, with room for deep developer involvement&lt;/td&gt;
&lt;td&gt;Strong, but relies more on continued support from the development team&lt;/td&gt;
&lt;td&gt;Custom internal apps, developer led projects, and continuously evolving backend systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budibase&lt;/td&gt;
&lt;td&gt;Automation, custom plugins, custom data sources, self hosted extensions&lt;/td&gt;
&lt;td&gt;Medium to high, with more flexibility for plugin and data source extension in self hosted environments&lt;/td&gt;
&lt;td&gt;Moderately strong, suitable for gradually expanding workflows and applications&lt;/td&gt;
&lt;td&gt;Workflow driven applications, approval and request systems, and internal operations apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ToolJet&lt;/td&gt;
&lt;td&gt;Component configuration, query logic, workflow extensions, custom components&lt;/td&gt;
&lt;td&gt;Medium to high, supports extension but remains more focused on expanding the tool layer&lt;/td&gt;
&lt;td&gt;Medium, suitable for continuing to add pages and integrate more data sources&lt;/td&gt;
&lt;td&gt;Tool based apps, multi system integration, internal backends, and operations tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NocoBase has a particularly strong plugin mechanism, making it more suitable for teams that need a high degree of control and deep customization. It also offers more room for ongoing maintenance and continued expansion.&lt;/li&gt;
&lt;li&gt;Appsmith also allows developers to take deeper control of page and logic behavior, and it performs well in long term iteration and customization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux93o7cteo0qsyuqyhma.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux93o7cteo0qsyuqyhma.png" alt="Appsmith2.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. AI Capabilities
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Current AI Capabilities&lt;/th&gt;
&lt;th&gt;How AI Connects with Business Data / Workflows&lt;/th&gt;
&lt;th&gt;Future AI Integration Potential&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NocoBase&lt;/td&gt;
&lt;td&gt;Built in AI employees, with support for defining AI roles and capabilities in the system based on business needs&lt;/td&gt;
&lt;td&gt;Can understand business context through the current page, data, and table structure, and can directly perform real business actions such as querying databases, filling forms, and updating data&lt;/td&gt;
&lt;td&gt;Strong, well suited for connecting AI directly into existing business systems and workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retool&lt;/td&gt;
&lt;td&gt;Supports AI generated apps, AI generated workflows, and Retool Agents&lt;/td&gt;
&lt;td&gt;Agents can connect to external systems, workflows, and data sources, and can also be called directly from apps or workflows&lt;/td&gt;
&lt;td&gt;Strong, suitable for bringing AI into internal software, workflows, and operational layers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Appsmith&lt;/td&gt;
&lt;td&gt;Provides Appsmith AI query capabilities&lt;/td&gt;
&lt;td&gt;More focused on using AI at the application layer to add text generation, classification, analysis, and similar functions&lt;/td&gt;
&lt;td&gt;Medium to high, suitable for adding AI interaction to existing apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budibase&lt;/td&gt;
&lt;td&gt;Already offers Agents, Agent Chat, and AI automation&lt;/td&gt;
&lt;td&gt;Agents can connect to automation flows and also work with data and tools inside the workspace&lt;/td&gt;
&lt;td&gt;Strong, suitable for bringing AI into approvals, request handling, and workflow driven applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ToolJet&lt;/td&gt;
&lt;td&gt;Supports generating apps, queries, and workflows with natural language, and also offers an OpenAI plugin&lt;/td&gt;
&lt;td&gt;Can use AI to generate applications and then continue building logic with workflows and data sources&lt;/td&gt;
&lt;td&gt;Medium to high, suitable for using AI as a build accelerator and support capability in the tool layer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retool, ToolJet, and Appsmith&lt;/strong&gt; focus their AI capabilities more on app generation, query generation, or development efficiency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Budibase&lt;/strong&gt; is better suited for putting AI directly into business pages and workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NocoBase&lt;/strong&gt; can use AI both during setup to lower the configuration barrier and later inside business pages and workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc0ajnudy8rspazzcmsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcc0ajnudy8rspazzcmsg.png" alt="NocoBase3.png" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NocoBase&lt;/strong&gt; is centered on a data model and plugin architecture. It supports a wide range of external data sources and is especially well suited for continuing to build more complete business systems such as CRM, ERP, approvals, and ticketing on top of existing databases. It is also positioned to bring AI into the system over time. If you have a technical team and want deeper control and customization on top of your existing data, NocoBase is the stronger choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retool&lt;/strong&gt; is a strong option for quickly connecting databases, APIs, and workflows into an internal operations layer. Its main advantage is the delivery speed of internal software, operations backends, and data tools. If your priority is to build a usable internal system quickly and your team already has some development capability, Retool will likely feel more efficient. Its official website also emphasizes connecting data, systems, and rules to build internal software, with support for databases, APIs, workflows, and version control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Appsmith&lt;/strong&gt; is more of a developer friendly low code front end layer, making it a good fit for quickly building custom internal apps on top of existing databases and APIs. If your team wants to keep strong control over JavaScript, custom components, and Git workflows, Appsmith is more suitable. Its official positioning is also that of an open source low code application platform that enables developers to build custom applications on top of existing systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Budibase&lt;/strong&gt; is a better fit for forms, approvals, request handling, and workflow driven applications. Its strength lies in helping teams organize internal applications more quickly around data and workflows. If your technical threshold is lower and your focus is on approvals, ticketing, and operational workflows, Budibase will feel more natural. Its official website also places internal tools, workflows, and business process automation at the center.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ToolJet&lt;/strong&gt; can connect databases, APIs, and third party systems into a unified tool layer interface. Its key advantage lies in building enterprise internal tools across multiple data sources. If your needs focus more on multi system integration, operations backends, or tool based apps, ToolJet is a more direct option. Its official website positions it as a platform for quickly building enterprise applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  If we care more about complex business relationships, not just simple CRUD, which platform should we focus on?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;NocoBase.&lt;/strong&gt; If your business involves many multi table relationships, related objects, role differences, and business actions, NocoBase is better suited for continuing to build the system around the data model.&lt;/p&gt;

&lt;h3&gt;
  
  
  If we have more than one data source, with databases and APIs mixed together, what should we pay most attention to when choosing?
&lt;/h3&gt;

&lt;p&gt;Whether the platform supports &lt;strong&gt;multiple data sources at the same time&lt;/strong&gt;, whether it can connect both databases and APIs together, whether pages and workflows become harder to maintain as more data sources are added, and whether it stays easy to connect new sources later.&lt;/p&gt;

&lt;h3&gt;
  
  
  If our database will continue to add fields, add tables, or even change relationships later, what should we look at when choosing a platform?
&lt;/h3&gt;

&lt;p&gt;The key is whether the platform’s data layer and page layer are tightly bound together. In this kind of scenario, a &lt;strong&gt;data model driven&lt;/strong&gt; platform is usually more suitable, such as NocoBase. When the data structure changes, pages, workflows, and permissions are easier to adjust and carry forward.&lt;/p&gt;

&lt;h3&gt;
  
  
  If we only want to build an admin backend or internal tool first, and then gradually add approvals, ticketing, and more modules later, how should we choose?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Retool&lt;/strong&gt; is better suited for first turning an existing database into a tool layer or operations interface, so you can quickly build admin backends, data tools, and internal apps. &lt;strong&gt;NocoBase&lt;/strong&gt; is more suitable if you want to keep adding workflows, permissions, and modules over time. If you already know the project will eventually grow into a more complete business system, then a platform like &lt;strong&gt;NocoBase&lt;/strong&gt; that is better at supporting business structure is the more recommended choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  If my needs are mainly workflow driven applications such as approvals, request handling, and ticket routing, what should I choose?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Budibase&lt;/strong&gt;. In this kind of application, the database is more of a foundational data source. What really shapes the user experience is usually the platform’s support for forms, status transitions, workflow automation, and permission settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  My team already knows JavaScript, and we also want developers to lead page and logic control. What kind of platform is suitable?
&lt;/h3&gt;

&lt;p&gt;If your team already has front end or JavaScript capability and wants developers to stay in control of pages, queries, and interaction logic, then platforms like &lt;strong&gt;Appsmith&lt;/strong&gt; and &lt;strong&gt;Retool&lt;/strong&gt; are a better fit. These products are usually more suitable for developer led internal tools, operations consoles, and custom pages built on top of existing databases and APIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can use the official websites, documentation, and data source links collected in this article to further review how each platform supports your current data sources. Once you confirm that your data sources can be connected smoothly, you can then choose the platform that best fits your business workflows, page requirements, and future expansion plans.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/open-source-project-management-tool-selection-guide-2026-edition" rel="noopener noreferrer"&gt;Open Source Project Management Tool Selection Guide, 2026 Edition &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/how-to-build-a-custom-crm-with-postgresql" rel="noopener noreferrer"&gt;How to Build a Custom CRM with PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/best-open-source-ai-projects-github-2026" rel="noopener noreferrer"&gt;Top 20 AI Projects on GitHub to Watch in 2026: Not Just OpenClaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/best-ai-crm-open-source-nocobase-twenty-krayin" rel="noopener noreferrer"&gt;Best Open Source AI CRM: NocoBase vs Twenty vs Krayin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/top-3-open-source-erp-with-ai-on-github-nocobase-vs-odoo-vs-erpnext" rel="noopener noreferrer"&gt;Top 3 Open Source ERP with AI on GitHub: NocoBase vs Odoo vs ERPNext&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/5-most-popular-open-source-ai-project-management-tools-on-github" rel="noopener noreferrer"&gt;5 Most Popular Open-Source AI Project Management Tools on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/6-best-open-source-ai-ticketing-systems" rel="noopener noreferrer"&gt;6 Best Open-Source AI Ticketing Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/4-open-source-data-management-tools-for-business-systems" rel="noopener noreferrer"&gt;4 Open Source Data Management Tools for Business Systems&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/4-lightweight-enterprise-software-for-business-processes" rel="noopener noreferrer"&gt;4 Lightweight Enterprise Software for Business Processes (With Real-World Cases)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>nocode</category>
      <category>postgressql</category>
    </item>
    <item>
      <title>NocoBase 2.0 Beginner Tutorial - Chapter 7: Dashboard</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:23:32 +0000</pubDate>
      <link>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-7-dashboard-4ffo</link>
      <guid>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-7-dashboard-4ffo</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://docs.nocobase.com/tutorials/v2/07-dashboard" rel="noopener noreferrer"&gt;https://docs.nocobase.com/tutorials/v2/07-dashboard&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Chapter 7: Dashboard — The Big Picture at a Glance
&lt;/h1&gt;

&lt;p&gt;In the last chapter, we used workflows to make the system send notifications and record timestamps automatically. The system is getting smarter, but we're still missing one thing — &lt;strong&gt;a bird's-eye view&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How many tickets are there? How many have been resolved? Which category has the most issues? How many new tickets come in each day? You can't answer these questions by scrolling through a list. In this chapter, we'll use &lt;a href="https://dev.to/data-visualization"&gt;chart blocks&lt;/a&gt; (pie, line, bar charts) and &lt;a href="https://dev.to/interface-builder/blocks/other/markdown"&gt;Markdown blocks&lt;/a&gt; to build a &lt;strong&gt;data dashboard&lt;/strong&gt; that turns raw data into something you can understand at a glance.&lt;/p&gt;

&lt;h2&gt;
  
  
  7.1 Adding a Dashboard Page
&lt;/h2&gt;

&lt;p&gt;First, let's add a new &lt;a href="https://dev.to/interface-builder/menus"&gt;menu&lt;/a&gt; item to the top navigation bar.&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="https://dev.to/get-started/how-nocobase-works"&gt;configuration mode&lt;/a&gt;, click &lt;strong&gt;"Add menu item"&lt;/strong&gt; (&lt;code&gt;+&lt;/code&gt; icon) on the top menu bar, select &lt;strong&gt;"Modern page (v2)"&lt;/strong&gt;, and name it "Dashboard."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti4sv6toa2uv52ofawqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fti4sv6toa2uv52ofawqo.png" alt="07-dashboard-2026-03-15-21-39-35" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This &lt;a href="https://dev.to/interface-builder/pages"&gt;page&lt;/a&gt; is dedicated to charts — it's our dashboard home base.&lt;/p&gt;

&lt;h2&gt;
  
  
  7.2 Pie Chart: Ticket Status Distribution
&lt;/h2&gt;

&lt;p&gt;For our first chart, we'll use a pie chart to show how many tickets are "Pending," "In Progress," and "Completed."&lt;/p&gt;

&lt;p&gt;On the Dashboard page, click &lt;strong&gt;Add block → &lt;a href="https://dev.to/data-visualization"&gt;Chart&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After adding it, click the &lt;strong&gt;Configure&lt;/strong&gt; button in the top-right corner of the &lt;a href="https://dev.to/interface-builder/blocks"&gt;block&lt;/a&gt;. A chart configuration panel will open on the right side.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring the Data Query
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://dev.to/data-sources/main/collection"&gt;Collection&lt;/a&gt;&lt;/strong&gt;: Select "Tickets"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measures&lt;/strong&gt;: Select any unique &lt;a href="https://dev.to/data-sources/field"&gt;field&lt;/a&gt; (e.g., ID), set the aggregation to &lt;strong&gt;Count&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimensions&lt;/strong&gt;: Select the "Status" field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foc1prpcuhxdo1bkdeb5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foc1prpcuhxdo1bkdeb5h.png" alt="07-dashboard-2026-03-15-21-44-32" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Run query&lt;/strong&gt; to preview the returned data below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring Chart Options
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chart type&lt;/strong&gt;: Select &lt;strong&gt;Pie&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field mapping&lt;/strong&gt;: Set Category to "Status" and Value to the count value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Labels&lt;/strong&gt;: Turn on the toggle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A nice-looking pie chart should now appear on the page. Each slice represents a status, showing the exact count and percentage by default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnran80uy2ofcmkm7xjrm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnran80uy2ofcmkm7xjrm.png" alt="07-dashboard-2026-03-15-21-45-40" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt; — your first chart is done.&lt;/p&gt;

&lt;h2&gt;
  
  
  7.3 Line Chart: Daily New Ticket Trend
&lt;/h2&gt;

&lt;p&gt;The pie chart shows "how things are distributed right now." A line chart shows "how things change over time."&lt;/p&gt;

&lt;p&gt;Add another chart block to the page with the following configuration:&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Query
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collection&lt;/strong&gt;: Select "Tickets"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measures&lt;/strong&gt;: ID, Count&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimensions&lt;/strong&gt;: Select the "Created at" field, set the format to &lt;strong&gt;YYYY-MM-DD&lt;/strong&gt; (group by day)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: The date dimension format matters. Choosing &lt;code&gt;YYYY-MM-DD&lt;/code&gt; groups by day; choosing &lt;code&gt;YYYY-MM&lt;/code&gt; groups by month. Pick the right granularity based on your data volume.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Chart Options
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chart type&lt;/strong&gt;: Select &lt;strong&gt;Line&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field mapping&lt;/strong&gt;: Set xField to "Created at" and yField to the count value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwk0jadr8wke13xlpx6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgwk0jadr8wke13xlpx6c.png" alt="07-dashboard-2026-03-15-21-48-33" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After saving, you'll see how ticket volume changes over time. If there's a sudden spike on a particular day, something happened worth looking into.&lt;/p&gt;

&lt;h2&gt;
  
  
  7.4 Bar Chart: Tickets by Category
&lt;/h2&gt;

&lt;p&gt;For our third chart, let's see which category has the most tickets. We'll use a &lt;strong&gt;horizontal bar chart&lt;/strong&gt; instead of a vertical column chart — when there are many categories, vertical X-axis labels tend to overlap and get hidden, so horizontal display is much clearer.&lt;/p&gt;

&lt;p&gt;Add a third chart block:&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Query
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collection&lt;/strong&gt;: Select "Tickets"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measures&lt;/strong&gt;: ID Count&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimensions&lt;/strong&gt;: Select the "Category" relation field (choose the category's Name field)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Chart Options
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chart type&lt;/strong&gt;: Select &lt;strong&gt;Bar&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field mapping&lt;/strong&gt;: Set xField to the count value (ID Count) and yField to "Category Name"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozizdxfef9wvrk4hgq32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozizdxfef9wvrk4hgq32.png" alt="07-dashboard-2026-03-15-22-05-11" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After saving, it's immediately clear which category has the most issues. If the "Network Failure" bar stretches far beyond the rest, maybe it's time to upgrade the network equipment.&lt;/p&gt;

&lt;h2&gt;
  
  
  7.5 Table Block: Unresolved Tickets
&lt;/h2&gt;

&lt;p&gt;Charts give a summary view, but admins usually need to see specific details too. Let's add an &lt;strong&gt;Unresolved Tickets&lt;/strong&gt; table that shows all tickets that haven't been completed yet.&lt;/p&gt;

&lt;p&gt;Add a &lt;strong&gt;Table block&lt;/strong&gt; to the page, selecting the "Tickets" collection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Filter Conditions
&lt;/h3&gt;

&lt;p&gt;Click the table block's settings and find &lt;strong&gt;Set data scope&lt;/strong&gt;. Add a &lt;a href="https://dev.to/interface-builder/blocks/filter-blocks/form"&gt;filter&lt;/a&gt; condition:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Status&lt;/strong&gt; is not equal to &lt;strong&gt;Completed&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This way the table only shows unfinished tickets — once a ticket is completed, it automatically disappears from the list.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Fields
&lt;/h3&gt;

&lt;p&gt;Select the columns to display: Title, Status, Priority, Assignee, Created at.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vh4jd32ivv8rxahwecv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vh4jd32ivv8rxahwecv.png" alt="07-dashboard-2026-03-15-22-20-11" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: You can also add a &lt;strong&gt;default sort&lt;/strong&gt; (by Created at, descending) so the newest tickets appear at the top.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  7.6 Markdown Block: System Announcements
&lt;/h2&gt;

&lt;p&gt;Beyond charts, we can also put some text information on the dashboard.&lt;/p&gt;

&lt;p&gt;Add a &lt;strong&gt;&lt;a href="https://dev.to/interface-builder/blocks/other/markdown"&gt;Markdown block&lt;/a&gt;&lt;/strong&gt; and write a system announcement or usage instructions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## IT HelpDesk System&lt;/span&gt;

Welcome! If you run into any issues, please submit a ticket and the tech team will handle it ASAP.

&lt;span class="gs"&gt;**For urgent issues**&lt;/span&gt;, call the IT hotline directly: 8888
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09wz0veffy0vnzq12sgx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09wz0veffy0vnzq12sgx.png" alt="07-dashboard-2026-03-15-21-53-54" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Place the Markdown block at the top of the dashboard — it works as both a welcome message and a bulletin board. The content can be updated anytime, making it very flexible.&lt;/p&gt;

&lt;h2&gt;
  
  
  7.7 JS Block: Personalized Welcome Banner
&lt;/h2&gt;

&lt;p&gt;Markdown has a fairly fixed format — what if you want richer effects? NocoBase provides a &lt;strong&gt;JS Block (JavaScript Block)&lt;/strong&gt; that lets you freely customize display content with code.&lt;/p&gt;

&lt;p&gt;We'll use it to create a business-style welcome banner that shows a personalized greeting based on the current user and time of day.&lt;/p&gt;

&lt;p&gt;Add a &lt;strong&gt;JS block&lt;/strong&gt; to the page (Add block → Other blocks → JS block).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4n84bl34rv314r8d1cns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4n84bl34rv314r8d1cns.png" alt="07-dashboard-2026-03-15-22-33-24" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the JS block, you can use &lt;code&gt;ctx.getVar("ctx.user.username")&lt;/code&gt; to get the current user's username. Here's a clean, business-style welcome banner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ctx.user.username&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;uname&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;getHours&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Good morning&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Good afternoon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Good evening&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFullYear&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;weekDay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLocaleDateString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en-US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;long&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
&amp;lt;div style="padding: 24px 32px; background: #f7f8fa; border-radius: 8px;"&amp;gt;
  &amp;lt;div style="display: flex; justify-content: space-between; align-items: flex-end;"&amp;gt;
    &amp;lt;div&amp;gt;
      &amp;lt;div style="font-size: 22px; font-weight: 600; color: #1d2129;"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/div&amp;gt;
      &amp;lt;div style="font-size: 14px; color: #86909c; margin-top: 4px;"&amp;gt;Welcome back to IT HelpDesk&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div style="font-size: 14px; color: #86909c;"&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;　&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;weekDay&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsxmhmw9wwnxhgi72crf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsxmhmw9wwnxhgi72crf.png" alt="07-dashboard-2026-03-15-22-51-27" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The result is a light gray card with the greeting on the left and date on the right. Clean, practical, and unobtrusive.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: &lt;code&gt;ctx.getVar("ctx.user.xxx")&lt;/code&gt; is how you access current user info in JS blocks. Common fields include &lt;code&gt;nickname&lt;/code&gt;, &lt;code&gt;username&lt;/code&gt;, and &lt;code&gt;email&lt;/code&gt;. JS blocks can also call APIs to query data — you can use them for much more custom content later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  7.8 Action Panel: Quick Links + Popup Reuse
&lt;/h2&gt;

&lt;p&gt;A dashboard isn't just for viewing data — it should also be a starting point for actions. Let's add an &lt;strong&gt;Action Panel&lt;/strong&gt; so users can submit tickets and jump to the ticket list directly from the homepage.&lt;/p&gt;

&lt;p&gt;Add an &lt;strong&gt;Action Panel&lt;/strong&gt; block (Add block → Other blocks → Action Panel), then add two &lt;a href="https://dev.to/interface-builder/actions"&gt;actions&lt;/a&gt; inside it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkjgiavx62jv04xiw0u0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkjgiavx62jv04xiw0u0.png" alt="07-dashboard-2026-03-15-22-54-06" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Link: Go to ticket list&lt;/strong&gt; — Add a "Link" action and configure the URL to point to the ticket list page (e.g., &lt;code&gt;/admin/camcwbox2uc&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8eqi563gyepc7zres5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8eqi563gyepc7zres5w.png" alt="07-dashboard-2026-03-15-22-57-49" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Button: Add Ticket&lt;/strong&gt; — Add a "Popup" action button and change the title to "Add Ticket"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxs6bywqia6njahlr2kb5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxs6bywqia6njahlr2kb5.png" alt="07-dashboard-2026-03-15-23-00-36" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But clicking "Add Ticket" opens an empty popup — we need to configure its content. Rebuilding the entire new ticket form from scratch would be tedious. This is where a very handy feature comes in: &lt;strong&gt;Popup Reuse&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Saving a Popup Template
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Popup templates are different from the "block templates" we covered in Chapter 4. Block templates save a single form block's fields and layout, while popup templates save the &lt;strong&gt;entire popup&lt;/strong&gt; — including all blocks, fields, and action buttons inside it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;Tickets list page&lt;/strong&gt; and find the "Add Ticket" button&lt;/li&gt;
&lt;li&gt;Click the button's settings and find &lt;strong&gt;"Save as template"&lt;/strong&gt; — save the current popup&lt;/li&gt;
&lt;li&gt;Give the template a name (e.g., "New Ticket Popup")&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9egc1gr8pe172euax7jj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9egc1gr8pe172euax7jj.png" alt="07-dashboard-2026-03-15-23-05-17" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reusing the Popup on the Dashboard
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go back to the Dashboard page and click the "Add Ticket" button's settings in the action panel&lt;/li&gt;
&lt;li&gt;Find &lt;strong&gt;"Popup settings"&lt;/strong&gt; and select the "New Ticket Popup" template you just saved&lt;/li&gt;
&lt;li&gt;After saving, clicking the button will open the exact same new ticket form popup as on the ticket list page&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fak5f7842g4fw94lbpgw9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fak5f7842g4fw94lbpgw9.png" alt="07-dashboard-2026-03-15-23-06-33" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft88emi0k8svuxxc2xtdq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft88emi0k8svuxxc2xtdq.gif" alt="07-dashboard-2026-03-15-23-07-20" width="760" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Click Title to Open Detail Popup
&lt;/h3&gt;

&lt;p&gt;Using the same approach, we can make ticket titles in the unresolved tickets table clickable to open the detail view directly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, go to the &lt;strong&gt;Tickets list page&lt;/strong&gt;, find the "View" button's settings, and similarly &lt;strong&gt;"Save as template"&lt;/strong&gt; (e.g., "Ticket Detail Popup")&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbs2vc7v4slw9gihejet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbs2vc7v4slw9gihejet.png" alt="07-dashboard-2026-03-15-23-08-02" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go back to the Dashboard page. In the unresolved tickets table, click the "Title" field's settings&lt;/li&gt;
&lt;li&gt;Turn on the &lt;strong&gt;"Enable click to open"&lt;/strong&gt; toggle — a "Popup settings" option will appear&lt;/li&gt;
&lt;li&gt;In the popup settings, select the "Ticket Detail Popup" template you just saved&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzl0phm64j2jv9p53g960.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzl0phm64j2jv9p53g960.png" alt="07-dashboard-2026-03-15-23-11-24" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now users can click a ticket title on the dashboard to view its details instantly, without navigating to the ticket list page. The whole dashboard becomes more compact and efficient.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbx5t8srkrn0rj1hyqfcp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbx5t8srkrn0rj1hyqfcp.png" alt="07-dashboard-2026-03-15-23-12-36" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Benefits of popup reuse&lt;/strong&gt;: The same popup template can be used across multiple pages. When you modify the template, all references update automatically. This is similar to the "Reference" mode from Chapter 4 — maintain in one place, apply everywhere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  7.9 Adjusting the Layout
&lt;/h2&gt;

&lt;p&gt;We now have 6 blocks on the page (JS welcome banner + Action panel + 3 charts + tickets table). Let's adjust the layout to make it look better.&lt;/p&gt;

&lt;p&gt;In configuration mode, you can &lt;strong&gt;drag and drop&lt;/strong&gt; to reposition and resize each block. Suggested layout:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Row 1&lt;/strong&gt;: JS welcome banner (left) + Action panel (right)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Row 2&lt;/strong&gt;: Pie chart (left) + Tickets table (right)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Row 3&lt;/strong&gt;: Line chart (left) + Bar chart (right)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11997i0gm519wi64ssbd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11997i0gm519wi64ssbd.png" alt="07-dashboard-2026-03-15-23-14-19" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: you may find that block heights don't align. You can manually adjust this in Block settings → Block height — for example, set both blocks in row 2 to 500px.&lt;/p&gt;

&lt;p&gt;Drag the edges to adjust block widths so the two charts each take up half the row. Try a few arrangements until you find what looks best.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkvtq8osu5s9ivivalae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkvtq8osu5s9ivivalae.png" alt="07-dashboard-2026-03-15-23-18-57" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this chapter, we built a rich and practical data dashboard with 6 blocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JS welcome banner&lt;/strong&gt;: Personalized greeting based on current user and time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action panel&lt;/strong&gt;: Quick link to ticket list + one-click ticket creation (popup reuse)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pie chart&lt;/strong&gt;: See the ticket status distribution at a glance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line chart&lt;/strong&gt;: Track how ticket volume changes over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bar chart&lt;/strong&gt;: Compare ticket counts across categories horizontally — no label overlap even with many categories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unresolved tickets table&lt;/strong&gt;: All pending tickets at a glance, click title to view details (popup reuse)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also learned an important technique — &lt;strong&gt;Popup Reuse&lt;/strong&gt;: save a popup from one page as a template and reference it on other pages, avoiding repetitive configuration.&lt;/p&gt;

&lt;p&gt;Data visualization is a built-in NocoBase plugin — no additional installation needed. Configuring it is just as simple as building a page: pick your data, choose a chart type, map the fields — three steps and you're done.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;At this point, our ticket system is quite feature-complete: data modeling, page building, form entry, access control, automated workflows, and a data dashboard — we've got it all. We're planning an &lt;strong&gt;AI Agent version of this tutorial&lt;/strong&gt; — using AI Agents to build the system locally and automatically. Stay tuned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/data-visualization"&gt;Data Visualization&lt;/a&gt; — Chart configuration guide&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/interface-builder/blocks/other/markdown"&gt;Markdown Block&lt;/a&gt; — Markdown block usage&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/interface-builder/blocks"&gt;Block Layout&lt;/a&gt; — Page layout and block configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  About NocoBase
&lt;/h3&gt;

&lt;p&gt;NocoBase is the most extensible AI-powered no-code platform.&lt;br&gt;
Total control. Infinite extensibility. AI collaboration.&lt;br&gt;
Enable your team to adapt quickly and cut costs dramatically.&lt;br&gt;
No years of development. No millions wasted.&lt;br&gt;
Deploy NocoBase in minutes — and take control of everything.&lt;/p&gt;

&lt;p&gt;Discover NocoBase in 3 Minutes!&lt;/p&gt;

&lt;h3&gt;
  
  
  👇 Get NocoBase
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;Homepage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.nocobase.com/new" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://v2.docs.nocobase.com/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>nocode</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>NocoBase 2.0 Beginner Tutorial - Chapter 6: Workflows</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Fri, 27 Mar 2026 09:31:56 +0000</pubDate>
      <link>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-6-workflows-hkm</link>
      <guid>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-6-workflows-hkm</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://docs.nocobase.com/tutorials/v2/06-workflows" rel="noopener noreferrer"&gt;https://docs.nocobase.com/tutorials/v2/06-workflows&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Chapter 6: Workflows — Let the System Do the Work
&lt;/h1&gt;

&lt;p&gt;In the last chapter, we added permissions so different roles see different content. But all operations are still done manually — when a new ticket comes in, someone has to go check; when a status changes, nobody gets notified.&lt;/p&gt;

&lt;p&gt;In this chapter, we'll use NocoBase's &lt;a href="https://docs.nocobase.com/workflow" rel="noopener noreferrer"&gt;Workflow&lt;/a&gt; engine to make the system &lt;strong&gt;do things automatically&lt;/strong&gt; — configure &lt;a href="https://docs.nocobase.com/workflow/nodes/condition" rel="noopener noreferrer"&gt;condition&lt;/a&gt; checks and &lt;a href="https://docs.nocobase.com/workflow/nodes/update" rel="noopener noreferrer"&gt;update&lt;/a&gt; nodes for automatic ticket status transitions and timestamp recording.&lt;/p&gt;

&lt;h2&gt;
  
  
  6.1 What Is a Workflow?
&lt;/h2&gt;

&lt;p&gt;A workflow is a set of automated "if... then..." rules.&lt;/p&gt;

&lt;p&gt;Think of it like an alarm on your phone that goes off every morning at 8 AM. That alarm is the simplest workflow — &lt;strong&gt;when a condition is met (it's 8 AM), an action executes automatically (the alarm rings)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;NocoBase workflows follow the same idea:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aq4v1yrk034b3zqibew.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aq4v1yrk034b3zqibew.jpg" alt="06-workflows-2026-03-20-13-25-38" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.nocobase.com/workflow/triggers/collection" rel="noopener noreferrer"&gt;Trigger&lt;/a&gt;&lt;/strong&gt;: The entry point for the workflow. For example, "someone created a new ticket" or "a record was updated"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condition&lt;/strong&gt;: An optional filtering step. For example, "only continue if the assignee is not empty"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: The step that does the actual work. For example, "send a notification" or "update a &lt;a href="https://docs.nocobase.com/data-sources/field" rel="noopener noreferrer"&gt;field&lt;/a&gt;"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actions can be chained with multiple nodes. Common node types include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flow control&lt;/strong&gt;: Condition, Parallel &lt;a href="https://docs.nocobase.com/workflow/nodes/condition" rel="noopener noreferrer"&gt;branch&lt;/a&gt;, Loop, Delay&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data operations&lt;/strong&gt;: &lt;a href="https://docs.nocobase.com/workflow/nodes/create" rel="noopener noreferrer"&gt;Create record&lt;/a&gt;, Update record, Query record, Delete record&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notifications &amp;amp; external&lt;/strong&gt;: Notification, HTTP request, Calculation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tutorial only covers a few of the most common ones — once you learn to combine them, you'll be able to handle most scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trigger Types at a Glance
&lt;/h3&gt;

&lt;p&gt;NocoBase offers several trigger types, which you select when creating a workflow:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Typical Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://docs.nocobase.com/workflow/triggers/collection" rel="noopener noreferrer"&gt;Collection event&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fires when a record is created, updated, or deleted&lt;/td&gt;
&lt;td&gt;New ticket notification, status change logging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://docs.nocobase.com/workflow/triggers/schedule" rel="noopener noreferrer"&gt;Schedule&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fires on a Cron expression or fixed time&lt;/td&gt;
&lt;td&gt;Daily reports, periodic data cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://docs.nocobase.com/workflow/triggers/action" rel="noopener noreferrer"&gt;Post-action event&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fires after a user performs a UI action&lt;/td&gt;
&lt;td&gt;Send notification after form submission&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Approval&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Initiates an approval flow with multi-level support&lt;/td&gt;
&lt;td&gt;Leave requests, purchase approvals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom action&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bound to a custom button, fires on click&lt;/td&gt;
&lt;td&gt;One-click archiving, batch operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pre-action event&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intercepts a user action synchronously before it completes&lt;/td&gt;
&lt;td&gt;Pre-submit validation, auto-fill fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Employee&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Exposes the workflow as a tool for AI employees to call&lt;/td&gt;
&lt;td&gt;AI-driven business operations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This tutorial uses both &lt;strong&gt;Collection event&lt;/strong&gt; and &lt;strong&gt;Custom action event&lt;/strong&gt; triggers. The other types work similarly; once you've learned these, you can pick up the rest quickly.&lt;/p&gt;

&lt;p&gt;NocoBase workflows are a built-in plugin — no extra installation needed, ready to use out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  6.2 Scenario 1: Automatically Notify the Assignee on New Tickets
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Requirement&lt;/strong&gt;: When someone creates a new ticket and specifies an assignee, the system automatically sends an in-app message to the assignee, letting them know "there's work to do."&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create a Workflow
&lt;/h3&gt;

&lt;p&gt;Open the plugin settings menu in the top-right corner and go to &lt;strong&gt;Workflow management&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihj3lvkv0i71kji9yhs0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihj3lvkv0i71kji9yhs0.png" alt="06-workflows-2026-03-14-23-50-45" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;New&lt;/strong&gt;, and in the dialog that appears:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: Enter "Notify assignee on new ticket"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger type&lt;/strong&gt;: Select &lt;strong&gt;Collection event&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82r4ws3zdxtlia61g0i3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82r4ws3zdxtlia61g0i3.png" alt="06-workflows-2026-03-14-23-53-37" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After submitting, click the &lt;strong&gt;Configure&lt;/strong&gt; link in the list to enter the flow editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Configure the Trigger
&lt;/h3&gt;

&lt;p&gt;Click the trigger card at the top to open its configuration drawer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://docs.nocobase.com/data-sources/main/collection" rel="noopener noreferrer"&gt;Collection&lt;/a&gt;&lt;/strong&gt;: Select Main datasource / "Tickets"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trigger on&lt;/strong&gt;: Select "After record created or updated"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Changed fields&lt;/strong&gt;: Check "Assignee" — the workflow only triggers when the Assignee field changes, avoiding unnecessary notifications from other field updates (when creating a record, all fields are considered changed, so new tickets will also trigger)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Only triggers when conditions are met&lt;/strong&gt;: Set the mode to "Match &lt;strong&gt;any&lt;/strong&gt; condition in the group," then add two conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;assignee_id&lt;/code&gt; is not empty&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Assignee / ID&lt;/code&gt; is not empty&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Why two conditions? Because at trigger time, the form may only have the foreign key (assignee_id) without the associated object loaded, or vice versa. Using OR ensures the workflow triggers as long as an assignee is specified.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Preload associations&lt;/strong&gt;: Check "Assignee" — the notification node needs the assignee's information, so it must be preloaded in the trigger&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx8zbs1ry12qw2gblp0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdx8zbs1ry12qw2gblp0u.png" alt="06-workflows-2026-03-14-23-58-31" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Save. The trigger itself now handles the condition filtering — it only fires when the Assignee is not empty, so there's no need for a separate condition node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Add a Notification Node
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;+&lt;/strong&gt; below the trigger and select a &lt;strong&gt;Notification&lt;/strong&gt; node.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi943x69g24uxetuy1rzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi943x69g24uxetuy1rzi.png" alt="06-workflows-2026-03-15-00-00-55" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the notification node's configuration. The first option is to select a &lt;strong&gt;Notification channel&lt;/strong&gt; — but we haven't created one yet, so the dropdown is empty. Let's go create one first.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx29wovp1v0beu05w8dp2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx29wovp1v0beu05w8dp2.png" alt="06-workflows-2026-03-15-00-10-12" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Create a Notification Channel
&lt;/h3&gt;

&lt;p&gt;NocoBase supports multiple notification channel types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Channel Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;In-app message&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Browser notifications, pushed in real-time to the user's notification center&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Email&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sends via SMTP, requires email server configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For this tutorial, we'll use the simplest option — &lt;strong&gt;In-app message&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the plugin settings in the top-right corner and go to &lt;strong&gt;Notification management&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create channel&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9ggr5n2sw7rd5lw2sfv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9ggr5n2sw7rd5lw2sfv.png" alt="06-workflows-2026-03-15-00-13-07" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;In-app message&lt;/strong&gt; as the channel type, and enter a name (e.g., "System In-App Messages")&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvt0da8seqeuke2l5l70i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvt0da8seqeuke2l5l70i.png" alt="06-workflows-2026-03-15-00-17-55" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Configure the Notification Node
&lt;/h3&gt;

&lt;p&gt;Go back to the workflow editor and open the notification node's configuration.&lt;/p&gt;

&lt;p&gt;The notification node has the following configuration options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Notification channel&lt;/strong&gt;: Select the "System In-App Messages" channel you just created&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receivers&lt;/strong&gt;: Click to select Query users → set &lt;code&gt;id = Trigger variable / Trigger data / Assignee / ID&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Title&lt;/strong&gt;: Enter a notification title, e.g., "You have a new ticket to handle." Supports variables — for example, include the ticket title: &lt;code&gt;New ticket: {{Trigger data / Title}}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content&lt;/strong&gt;: Enter the notification body. You can also insert variables to reference the ticket's priority, description, and other fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn43q77ludfkvha7kslbt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn43q77ludfkvha7kslbt.png" alt="06-workflows-2026-03-15-20-10-11" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Before leaving the popup for the next step, remember to save first!)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Desktop detail page&lt;/strong&gt;: Enter the URL path of the ticket detail page. To get it: open any ticket's detail popup in the frontend, then copy the path from the browser address bar — it looks like &lt;code&gt;/admin/camcwbox2uc/view/d8f8e122d37/filterbytk/353072988225540&lt;/code&gt;. Paste the path into the field, then replace the number after &lt;code&gt;filterbytk/&lt;/code&gt; with the trigger data's ID variable (click the variable selector → Trigger data → ID). Once configured, clicking the notification in the list will navigate directly to that ticket's detail page and automatically mark it as read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz8zdk4kh064js9b3ijf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftz8zdk4kh064js9b3ijf.png" alt="06-workflows-2026-03-15-00-28-32" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnkveisbhncsod0mmslq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flnkveisbhncsod0mmslq.png" alt="06-workflows-2026-03-15-20-15-19" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continue on failure&lt;/strong&gt;: Optional. If checked, the workflow won't stop even if the notification fails to send&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;After the notification is sent, the assignee can see the message in the &lt;strong&gt;Notification center&lt;/strong&gt; (top-right corner of the page). Unread items will show a red dot indicator. Clicking the notification takes you directly to the ticket detail page.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 6: Test and Enable
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;The complete flow for Scenario 1 has just two nodes: Trigger (with condition filtering) → Notification. Simple and direct.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't rush to enable it — workflows provide a &lt;strong&gt;manual execution&lt;/strong&gt; feature that lets you test the flow with specific data first:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;strong&gt;Execute&lt;/strong&gt; button in the top-right corner (not the enable toggle)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select an existing ticket record as the trigger data&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the ticket selector shows IDs instead of titles, go to Data sources → Collections → Tickets and set the "Title" column as the title field.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42jipjo22waf7ta3mkhn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42jipjo22waf7ta3mkhn.png" alt="06-workflows-2026-03-15-19-47-57" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click execute. The workflow will run and automatically switch to a duplicated new version.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffde5nxngk83yg3v55ek7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffde5nxngk83yg3v55ek7.png" alt="06-workflows-2026-03-15-19-57-19" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the three dots in the top-right corner and select Execution history. You should see the execution record we just created. Click to view the details — including trigger info, each node's execution details, and parameters.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frk6onkhjoyh6oeastx7q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frk6onkhjoyh6oeastx7q.png" alt="06-workflows-2026-03-15-19-58-34" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8svfrsyfsi85ggq5qj9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8svfrsyfsi85ggq5qj9m.png" alt="06-workflows-2026-03-15-20-01-02" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The ticket we just tested seems to be assigned to Alice. Let's switch to Alice's account — notification received!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frw2nifr1emv7axbll1tu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frw2nifr1emv7axbll1tu.png" alt="06-workflows-2026-03-15-20-16-22" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the notification to jump to the target ticket page. The notification is automatically marked as read.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4he193p24ltm07cmuxq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4he193p24ltm07cmuxq.png" alt="06-workflows-2026-03-15-20-16-54" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once confirmed, click the &lt;strong&gt;On/Off&lt;/strong&gt; toggle in the top-right corner to enable the workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfjogn1h3izdvsadagvq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnfjogn1h3izdvsadagvq.png" alt="06-workflows-2026-03-15-20-18-16" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Once a workflow has been executed (including manual execution), it becomes &lt;strong&gt;read-only&lt;/strong&gt; (grayed out) and can no longer be edited. If you need to make changes, click &lt;strong&gt;"Duplicate to new version"&lt;/strong&gt; in the top-right corner and continue editing the new version. The old version is automatically disabled.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1v144a897972vmnzjhh3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1v144a897972vmnzjhh3.png" alt="06-workflows-2026-03-15-20-19-11" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go back to the tickets page and create a new ticket — make sure to select an assignee. Then switch to the assignee's account and check the notification center — you should see a new notification.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvqres8804fea91rc7lb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxvqres8804fea91rc7lb.gif" alt="06-workflows-2026-03-15-20-22-00" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations, your first automation is up and running!&lt;/p&gt;

&lt;h2&gt;
  
  
  6.3 Scenario 2: Automatically Record Completion Time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Requirement&lt;/strong&gt;: When a ticket is marked as "Completed," the system automatically fills in the "Completion time" field with the current time. No manual entry needed, and it never gets forgotten.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you haven't created a "Completion time" field in the Tickets collection yet, go to &lt;strong&gt;Collection management → Tickets&lt;/strong&gt; and add a &lt;strong&gt;Date&lt;/strong&gt; type field named "Completion time." Refer to Chapter 2 for how to create fields — we won't repeat the steps here.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgap9891mxwg2fkajpb28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgap9891mxwg2fkajpb28.png" alt="06-workflows-2026-03-15-20-25-38" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 1: Create a Workflow
&lt;/h3&gt;

&lt;p&gt;Go back to the workflow management page and click New:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: Enter "Auto-record ticket completion time"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger type&lt;/strong&gt;: Select &lt;strong&gt;Custom action event&lt;/strong&gt; (fires when a user clicks a button bound to this workflow)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution mode&lt;/strong&gt;: Synchronous&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;About synchronous vs asynchronous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asynchronous: After the action, you can continue doing other things while the workflow runs in the background&lt;/li&gt;
&lt;li&gt;Synchronous: After the action, the UI waits for the workflow to finish before you can do anything else&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu68qvaa444pqp9y4fh2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu68qvaa444pqp9y4fh2.png" alt="06-workflows-2026-03-19-22-56-34" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Configure the Trigger
&lt;/h3&gt;

&lt;p&gt;Open the trigger configuration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collection&lt;/strong&gt;: Select "Tickets"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution mode&lt;/strong&gt;: Select &lt;strong&gt;Single record mode&lt;/strong&gt; (processes only the current ticket each time)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F728byga2t3dmku46d8ei.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F728byga2t3dmku46d8ei.png" alt="06-workflows-2026-03-19-22-58-21" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Add a Condition
&lt;/h3&gt;

&lt;p&gt;Unlike the collection event trigger which has built-in conditions, we need to add a condition node ourselves:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmmk7qu6m093hk4tvketa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmmk7qu6m093hk4tvketa.png" alt="06-workflows-2026-03-15-20-39-14" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We recommend selecting "Continue on 'Yes' and 'No' separately" for easier future expansion.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Condition: &lt;strong&gt;Trigger data → Status&lt;/strong&gt; does not equal &lt;strong&gt;Completed&lt;/strong&gt; (only incomplete tickets pass through; already completed tickets won't be processed again)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp1y2dor8r5p0a8nyyhp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgp1y2dor8r5p0a8nyyhp.png" alt="06-workflows-2026-03-19-22-37-59" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Add an Update Record Node
&lt;/h3&gt;

&lt;p&gt;On the "Yes" branch of the condition, click &lt;strong&gt;+&lt;/strong&gt; and select an &lt;strong&gt;Update record&lt;/strong&gt; node:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbs3vfm2zhdoisvg6o9q8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbs3vfm2zhdoisvg6o9q8.png" alt="06-workflows-2026-03-15-20-46-22" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collection&lt;/strong&gt;: Select "Tickets"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter condition&lt;/strong&gt;: ID equals Trigger data → ID (to ensure only the current ticket gets updated)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field values&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Status = &lt;strong&gt;Completed&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Completion time = &lt;strong&gt;System variables / System time&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtbbqlsa50k756pp0m90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtbbqlsa50k756pp0m90.png" alt="06-workflows-2026-03-19-22-39-27" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This way, a single node handles both "change status" and "record time" — no need to configure field values on the button separately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 5: Create a "Complete" Action Button
&lt;/h3&gt;

&lt;p&gt;The workflow is configured, but a "Custom action event" needs to be bound to a specific action button to trigger. Let's create a dedicated "Complete" button in the ticket list's action column:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter UI Editor mode. In the ticket table's action column, click &lt;strong&gt;"+"&lt;/strong&gt; and select a &lt;strong&gt;"Trigger workflow"&lt;/strong&gt; action button&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1eyr0icskv5lpq33x3ec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1eyr0icskv5lpq33x3ec.png" alt="06-workflows-2026-03-19-22-41-31" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the button settings and change the title to &lt;strong&gt;"Complete"&lt;/strong&gt;, then select a completion-related icon (e.g., a checkmark icon)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoken5rg7oec9xusco8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoken5rg7oec9xusco8k.png" alt="06-workflows-2026-03-19-22-43-39" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure &lt;strong&gt;linkage rules&lt;/strong&gt; for the button: hide it when the ticket status is already "Completed" (completed tickets don't need a "Complete" button)

&lt;ul&gt;
&lt;li&gt;Condition: Current data → Status equals Completed&lt;/li&gt;
&lt;li&gt;Action: Hide&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7s3oqqyx8jhs5p3iczq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy7s3oqqyx8jhs5p3iczq.png" alt="06-workflows-2026-03-15-21-15-29" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;"Bind workflows"&lt;/strong&gt; in the button settings and select the "Auto-record ticket completion time" workflow we just created&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwodx1ruuo38harmxc3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxwodx1ruuo38harmxc3p.png" alt="06-workflows-2026-03-19-23-00-53" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Configure Event Flow Refresh
&lt;/h3&gt;

&lt;p&gt;The button is created, but the table won't automatically refresh after clicking — users won't see the status change. We need to configure the button's &lt;strong&gt;event flow&lt;/strong&gt; to automatically refresh the table after the workflow completes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the second lightning bolt icon (⚡) in the button settings to open the &lt;strong&gt;Event flow&lt;/strong&gt; configuration&lt;/li&gt;
&lt;li&gt;Configure the trigger event:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger event&lt;/strong&gt;: Select &lt;strong&gt;Click&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution timing&lt;/strong&gt;: Select &lt;strong&gt;After all flows&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Append step"&lt;/strong&gt; and select &lt;strong&gt;"Refresh target block"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbmqbsbkxlu78wxqjdv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbmqbsbkxlu78wxqjdv2.png" alt="06-workflows-2026-03-20-16-46-59" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the ticket table on the current page, open its settings menu, and click &lt;strong&gt;"Copy UID"&lt;/strong&gt; at the bottom. Paste the UID into the refresh step's target block field&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdonsusmytqxk2wh5afsd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdonsusmytqxk2wh5afsd.png" alt="06-workflows-2026-03-20-16-48-39" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This way, after clicking the "Complete" button, the table automatically refreshes once the workflow finishes, and users immediately see the status and completion time changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Enable and Test
&lt;/h3&gt;

&lt;p&gt;Go back to the workflow management page and enable the "Auto-record ticket completion time" workflow.&lt;/p&gt;

&lt;p&gt;Then open a ticket with "In Progress" status and click the &lt;strong&gt;"Complete"&lt;/strong&gt; button in the action column. You should see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ticket's "Completion time" field is automatically filled with the current time&lt;/li&gt;
&lt;li&gt;The table refreshes automatically, and the "Complete" button has disappeared for this ticket (linkage rule in effect)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwumu4t9timhpcuxw6rn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwumu4t9timhpcuxw6rn.gif" alt="06-workflows-2026-03-15-21-25-11" width="1822" height="1138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Convenient, right? This is the second common use case for workflows — &lt;strong&gt;automatically updating data&lt;/strong&gt;. And by using the "Custom action event + Button binding" approach, we've created a precise trigger mechanism: the workflow only runs when a specific button is clicked.&lt;/p&gt;

&lt;h2&gt;
  
  
  6.4 Viewing Execution History
&lt;/h2&gt;

&lt;p&gt;How many times has the workflow run? Were there any errors? NocoBase keeps track of everything.&lt;/p&gt;

&lt;p&gt;In the workflow management list, each workflow shows an &lt;strong&gt;Execution count&lt;/strong&gt; link. Click it to see the detailed record of each execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Execution status&lt;/strong&gt;: Success (green) or failure (red) — easy to spot at a glance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger time&lt;/strong&gt;: When was it triggered&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node details&lt;/strong&gt;: Click in to see the execution result of each node&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bkd0j0koujt137io8ak.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bkd0j0koujt137io8ak.png" alt="06-workflows-2026-03-15-21-25-38" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If an execution failed, clicking into the details shows which node had the problem and the specific error message. This is the most important tool for debugging workflows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd3qzjdbul06q2m9ivz4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwd3qzjdbul06q2m9ivz4.png" alt="06-workflows-2026-03-15-21-36-16" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this chapter, we created two simple but practical workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New ticket notification&lt;/strong&gt; (Collection event trigger): Automatically notifies the assignee when a ticket is created or reassigned — no more yelling across the office&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-record completion time&lt;/strong&gt; (Custom action event trigger): Click "Complete" and the timestamp is filled automatically — no more human oversight&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These two workflows demonstrate two different trigger types, and together took less than 10 minutes to configure. The system can already do things automatically. NocoBase supports many more node types (HTTP requests, calculations, loops, etc.), but for getting started, mastering these combos is enough to handle most scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Chapter Preview
&lt;/h2&gt;

&lt;p&gt;The system can do things automatically now, but we're still missing a "big picture view" — how many tickets are there in total? Which category has the most? How many new tickets per day? In the next chapter, we'll use chart &lt;a href="https://docs.nocobase.com/interface-builder/blocks" rel="noopener noreferrer"&gt;blocks&lt;/a&gt; to build a &lt;strong&gt;data dashboard&lt;/strong&gt; to see everything at a glance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/workflow" rel="noopener noreferrer"&gt;Workflow Overview&lt;/a&gt; — Core workflow concepts and use cases&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/workflow/triggers/collection" rel="noopener noreferrer"&gt;Collection Event Trigger&lt;/a&gt; — Data change trigger configuration&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/workflow/nodes/update" rel="noopener noreferrer"&gt;Update Record Node&lt;/a&gt; — Automatic data update setup&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  About NocoBase
&lt;/h3&gt;

&lt;p&gt;NocoBase is the most extensible AI-powered no-code platform.&lt;br&gt;
Total control. Infinite extensibility. AI collaboration.&lt;br&gt;
Enable your team to adapt quickly and cut costs dramatically.&lt;br&gt;
No years of development. No millions wasted.&lt;br&gt;
Deploy NocoBase in minutes — and take control of everything.&lt;/p&gt;

&lt;p&gt;Discover NocoBase in 3 Minutes!&lt;/p&gt;

&lt;h3&gt;
  
  
  👇 Get NocoBase
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;Homepage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.nocobase.com/new" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://v2.docs.nocobase.com/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>nocode</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Weekly Updates Added SKILLS capability to AI employees</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Thu, 26 Mar 2026 06:39:06 +0000</pubDate>
      <link>https://forem.com/nocobase/weekly-updatesadded-skills-capability-to-ai-employees-4j6j</link>
      <guid>https://forem.com/nocobase/weekly-updatesadded-skills-capability-to-ai-employees-4j6j</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://www.nocobase.com/en/blog/weekly-updates-20260326" rel="noopener noreferrer"&gt;https://www.nocobase.com/en/blog/weekly-updates-20260326&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Summarize the weekly product update logs, and the latest releases can be checked on &lt;a href="https://www.nocobase.com/en/blog/timeline" rel="noopener noreferrer"&gt;our blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NocoBase is currently updated with three branches: &lt;code&gt;main&lt;/code&gt; , &lt;code&gt;next&lt;/code&gt; and &lt;code&gt;develop&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66qf0fuohv233at2nnzv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66qf0fuohv233at2nnzv.png" alt="version.png" width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;main&lt;/code&gt;：The most stable version to date, recommended for installation;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;next&lt;/code&gt;：Beta version, contains upcoming new features and has been preliminarily tested. There might be some known or unknown issues. It's mainly for test users to collect feedback and optimize functions further. Ideal for test users who want to experience new features early and give feedback;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;develop&lt;/code&gt;：Alpha version, contains the latest feature code, may be incomplete or unstable, mainly for internal dev and rapid iteration. Suited for tech users interested in product's cutting-edge, but with potential issues and incomplete functions. Not for production use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  main
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjmnc6cb7az5ofw9t1ip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjmnc6cb7az5ofw9t1ip.png" alt="main.png" width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.26" rel="noopener noreferrer"&gt;v2.0.26&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-25&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Optimize the horizontal layout of form actions (&lt;a href="https://github.com/nocobase/nocobase/pull/8869" rel="noopener noreferrer"&gt;#8869&lt;/a&gt;) by jiannx&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[flow-engine]&lt;/strong&gt; Synchronize status to field configuration when form field is deleted (&lt;a href="https://github.com/nocobase/nocobase/pull/8857" rel="noopener noreferrer"&gt;#8857&lt;/a&gt;) by jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Custom variables]&lt;/strong&gt; skip auth notify (&lt;a href="https://github.com/nocobase/nocobase/pull/8942" rel="noopener noreferrer"&gt;#8942&lt;/a&gt;) by chenos&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.25" rel="noopener noreferrer"&gt;v2.0.25&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-24&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Fix JSON field caused performance issue when loading approval records list by mytharcher&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[server]&lt;/strong&gt; Change close timing of Pub-Sub to &lt;code&gt;beforeStop&lt;/code&gt;, to avoid message sent or handled after database closed (&lt;a href="https://github.com/nocobase/nocobase/pull/8934" rel="noopener noreferrer"&gt;#8934&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Localization]&lt;/strong&gt; prevent localizationTexts:missing request on permission denial (&lt;a href="https://github.com/nocobase/nocobase/pull/8903" rel="noopener noreferrer"&gt;#8903&lt;/a&gt;) by chenos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Data source: External Oracle]&lt;/strong&gt; Fix an error that occurs when loading the Oracle external data source by 2013xile&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.24" rel="noopener noreferrer"&gt;v2.0.24&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-22&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[resourcer]&lt;/strong&gt; Fix an issue where external data sources fail to load correctly. (&lt;a href="https://github.com/nocobase/nocobase/pull/8929" rel="noopener noreferrer"&gt;#8929&lt;/a&gt;) by 2013xile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Action: Import records Pro]&lt;/strong&gt; Fix the issue where option of "Trigger workflow" not works when not checked by mytharcher&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.23" rel="noopener noreferrer"&gt;v2.0.23&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-21&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[database]&lt;/strong&gt; Use warning instead of error when any of appends parameters invalid (&lt;a href="https://github.com/nocobase/nocobase/pull/8923" rel="noopener noreferrer"&gt;#8923&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Fix translation, node selection, and return target issues in the v2 approval form return button by zhangzhonghe&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.22" rel="noopener noreferrer"&gt;v2.0.22&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-20&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[Migration manager]&lt;/strong&gt; Fixed the issue where the migration is interrupted due to an error caused by the target environment not having the new table created during the upload migration process. by Andrew1989Y&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.21" rel="noopener noreferrer"&gt;v2.0.21&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-20&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow]&lt;/strong&gt; Add filter executions list (&lt;a href="https://github.com/nocobase/nocobase/pull/8914" rel="noopener noreferrer"&gt;#8914&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Avoid to configure approvers' UI when no collection configured in trigger by mytharcher&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[resourcer]&lt;/strong&gt; Prevent the &lt;code&gt;filterByTk&lt;/code&gt; parameter array from being automatically converted into an object when it exceeds 100 items (&lt;a href="https://github.com/nocobase/nocobase/pull/8908" rel="noopener noreferrer"&gt;#8908&lt;/a&gt;) by 2013xile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; fix the issue where non-administrators cannot clear associated field values (&lt;a href="https://github.com/nocobase/nocobase/pull/8904" rel="noopener noreferrer"&gt;#8904&lt;/a&gt;) by jiannx&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[Action: Import records Pro]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix the issue where error thrown when import in sync mode by mytharcher&lt;/li&gt;
&lt;li&gt;Fix the issue where columns more than ~30 cause importing error, due to stream has been read duplicately by mytharcher&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Fix concurrency issue when add assignee by mytharcher&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.0.20" rel="noopener noreferrer"&gt;v2.0.20&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-19&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[server]&lt;/strong&gt; Fix the issue where lifecycle events sent by worker cause serving app stops (&lt;a href="https://github.com/nocobase/nocobase/pull/8906" rel="noopener noreferrer"&gt;#8906&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Data source manager]&lt;/strong&gt; Fixed issue that collection created by AI employee always missing &lt;code&gt;createBy&lt;/code&gt; and &lt;code&gt;updateBy&lt;/code&gt; fields (&lt;a href="https://github.com/nocobase/nocobase/pull/8895" rel="noopener noreferrer"&gt;#8895&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Action: Import records Pro]&lt;/strong&gt; Fix lazy import caused SES error by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Template print]&lt;/strong&gt; Fix sql collection printing error by jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Email manager]&lt;/strong&gt; Fixed page error when the email does not exist by jiannx&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  next
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fit0xys8cxci7kol0jjde.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fit0xys8cxci7kol0jjde.png" alt="next.png" width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.1.0-beta.11" rel="noopener noreferrer"&gt;v2.1.0-beta.11&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-20&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow]&lt;/strong&gt; Add filter executions list (&lt;a href="https://github.com/nocobase/nocobase/pull/8914" rel="noopener noreferrer"&gt;#8914&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Avoid to configure approvers' UI when no collection configured in trigger by mytharcher&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[server]&lt;/strong&gt; Fix the issue where lifecycle events sent by worker cause serving app stops (&lt;a href="https://github.com/nocobase/nocobase/pull/8906" rel="noopener noreferrer"&gt;#8906&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; fix the issue where non-administrators cannot clear associated field values (&lt;a href="https://github.com/nocobase/nocobase/pull/8904" rel="noopener noreferrer"&gt;#8904&lt;/a&gt;) by jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[resourcer]&lt;/strong&gt; Prevent the &lt;code&gt;filterByTk&lt;/code&gt; parameter array from being automatically converted into an object when it exceeds 100 items (&lt;a href="https://github.com/nocobase/nocobase/pull/8908" rel="noopener noreferrer"&gt;#8908&lt;/a&gt;) by 2013xile&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[Action: Import records Pro]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix the issue where error thrown when import in sync mode by mytharcher&lt;/li&gt;
&lt;li&gt;Fix the issue where columns more than ~30 cause importing error, due to stream has been read duplicately by mytharcher&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Fix concurrency issue when add assignee by mytharcher&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Migration manager]&lt;/strong&gt; Fixed the issue where the migration is interrupted due to an error caused by the target environment not having the new table created during the upload migration process. by Andrew1989Y&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.1.0-beta.10" rel="noopener noreferrer"&gt;v2.1.0-beta.10&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-19&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎉 New Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[AI employees]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allows to add AI employees in popup of sub tables (&lt;a href="https://github.com/nocobase/nocobase/pull/8873" rel="noopener noreferrer"&gt;#8873&lt;/a&gt;) by 2013xile&lt;/li&gt;
&lt;li&gt;Scheduled cleanup of AI conversation checkpoint data. (&lt;a href="https://github.com/nocobase/nocobase/pull/8855" rel="noopener noreferrer"&gt;#8855&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[App supervisor]&lt;/strong&gt; Support filtering in the application list&lt;br&gt;Add confirmation dialogs for start and stop actions&lt;br&gt;Sort application status entries by environment name by 2013xile&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[server]&lt;/strong&gt; improve pm add logic (&lt;a href="https://github.com/nocobase/nocobase/pull/8875" rel="noopener noreferrer"&gt;#8875&lt;/a&gt;) by chenos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[undefined]&lt;/strong&gt; README (&lt;a href="https://github.com/nocobase/nocobase/pull/8866" rel="noopener noreferrer"&gt;#8866&lt;/a&gt;) by gaston98765&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Support showing confirm message before closing popup. (&lt;a href="https://github.com/nocobase/nocobase/pull/8839" rel="noopener noreferrer"&gt;#8839&lt;/a&gt;) by gchust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow]&lt;/strong&gt; Fix the issue where gracefully shutdown not drain all events (&lt;a href="https://github.com/nocobase/nocobase/pull/8894" rel="noopener noreferrer"&gt;#8894&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Async task manager]&lt;/strong&gt; async tasks are added to support workers in post error messages (&lt;a href="https://github.com/nocobase/nocobase/pull/8849" rel="noopener noreferrer"&gt;#8849&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[client]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed the issue where the “Select record” popup in the subtable failed to load correctly when opened the second time. (&lt;a href="https://github.com/nocobase/nocobase/pull/8865" rel="noopener noreferrer"&gt;#8865&lt;/a&gt;) by gchust&lt;/li&gt;
&lt;li&gt;Fixed the issue where the default values of some fields did not take effect after refreshing the page. (&lt;a href="https://github.com/nocobase/nocobase/pull/8834" rel="noopener noreferrer"&gt;#8834&lt;/a&gt;) by gchust&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[database]&lt;/strong&gt; Fix the server-side validation issue for date fields (&lt;a href="https://github.com/nocobase/nocobase/pull/8867" rel="noopener noreferrer"&gt;#8867&lt;/a&gt;) by 2013xile&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Data source manager]&lt;/strong&gt; Fixed issue that collection created by AI employee always missing &lt;code&gt;createBy&lt;/code&gt; and &lt;code&gt;updateBy&lt;/code&gt; fields (&lt;a href="https://github.com/nocobase/nocobase/pull/8895" rel="noopener noreferrer"&gt;#8895&lt;/a&gt;) by cgyrock&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;[AI employees]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix issue with specified URL for LLM service not taking effect in text embedding model calls. (&lt;a href="https://github.com/nocobase/nocobase/pull/8892" rel="noopener noreferrer"&gt;#8892&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;li&gt;Fixed potential undefined variable errors in AI plugin upgrade migration scripts. (&lt;a href="https://github.com/nocobase/nocobase/pull/8883" rel="noopener noreferrer"&gt;#8883&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Localization]&lt;/strong&gt; localizationTexts:missing interface permission exception (&lt;a href="https://github.com/nocobase/nocobase/pull/8861" rel="noopener noreferrer"&gt;#8861&lt;/a&gt;) by jiannx&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;[Action: Import records Pro]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix &lt;code&gt;beforeStop&lt;/code&gt; event on sub app not fired by mytharcher&lt;/li&gt;
&lt;li&gt;Fix lazy import caused SES error by mytharcher&lt;/li&gt;
&lt;li&gt;Fix the issue where async tasks do not end after an error occurs in async import by cgyrock&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[AI: Knowledge base]&lt;/strong&gt; Prevent the vector database and vector storage in use from being deleted. by cgyrock&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Template print]&lt;/strong&gt; Fix sql collection printing error by jiannx&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Email manager]&lt;/strong&gt; Fixed page error when the email does not exist by jiannx&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  develop
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow9jd2rkp6w0rmrzuzwl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fow9jd2rkp6w0rmrzuzwl.png" alt="develop.png" width="800" height="162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.1.0-alpha.11" rel="noopener noreferrer"&gt;v2.1.0-alpha.11&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-25&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎉 New Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; add JS item action (&lt;a href="https://github.com/nocobase/nocobase/pull/8911" rel="noopener noreferrer"&gt;#8911&lt;/a&gt;) by jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[AI employees]&lt;/strong&gt; Added SKILLS capability to AI employees. (&lt;a href="https://github.com/nocobase/nocobase/pull/8797" rel="noopener noreferrer"&gt;#8797&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Data source manager]&lt;/strong&gt; Support on-demand loading of MCP tools (&lt;a href="https://github.com/nocobase/nocobase/pull/8936" rel="noopener noreferrer"&gt;#8936&lt;/a&gt;) by 2013xile&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[flow-engine]&lt;/strong&gt; Improve schema validation for ui building api. (&lt;a href="https://github.com/nocobase/nocobase/pull/8881" rel="noopener noreferrer"&gt;#8881&lt;/a&gt;) by gchust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Optimize the horizontal layout of form actions (&lt;a href="https://github.com/nocobase/nocobase/pull/8869" rel="noopener noreferrer"&gt;#8869&lt;/a&gt;) by jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[app]&lt;/strong&gt; Add an Rsbuild-based dev workflow for client-v1 while keeping local plugin development and the current &lt;code&gt;/v2/&lt;/code&gt; topology compatible (&lt;a href="https://github.com/nocobase/nocobase/pull/8902" rel="noopener noreferrer"&gt;#8902&lt;/a&gt;) by Molunerfinn&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Collection field: administrative divisions of China]&lt;/strong&gt; field-china-region 2.0 (&lt;a href="https://github.com/nocobase/nocobase/pull/8831" rel="noopener noreferrer"&gt;#8831&lt;/a&gt;) by jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow]&lt;/strong&gt; Add validation for all triggers and nodes (&lt;a href="https://github.com/nocobase/nocobase/pull/8930" rel="noopener noreferrer"&gt;#8930&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Fix JSON field caused performance issue when loading approval records list by mytharcher&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[flow-engine]&lt;/strong&gt; Synchronize status to field configuration when form field is deleted (&lt;a href="https://github.com/nocobase/nocobase/pull/8857" rel="noopener noreferrer"&gt;#8857&lt;/a&gt;) by jiannx&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[resourcer]&lt;/strong&gt; Fix an issue where external data sources fail to load correctly. (&lt;a href="https://github.com/nocobase/nocobase/pull/8929" rel="noopener noreferrer"&gt;#8929&lt;/a&gt;) by 2013xile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[database]&lt;/strong&gt; Use warning instead of error when any of appends parameters invalid (&lt;a href="https://github.com/nocobase/nocobase/pull/8923" rel="noopener noreferrer"&gt;#8923&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[server]&lt;/strong&gt; Change close timing of Pub-Sub to &lt;code&gt;beforeStop&lt;/code&gt;, to avoid message sent or handled after database closed (&lt;a href="https://github.com/nocobase/nocobase/pull/8934" rel="noopener noreferrer"&gt;#8934&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Custom variables]&lt;/strong&gt; skip auth notify (&lt;a href="https://github.com/nocobase/nocobase/pull/8942" rel="noopener noreferrer"&gt;#8942&lt;/a&gt;) by chenos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[AI employees]&lt;/strong&gt; Fix failing test cases in the ai module of the core package. (&lt;a href="https://github.com/nocobase/nocobase/pull/8941" rel="noopener noreferrer"&gt;#8941&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Localization]&lt;/strong&gt; prevent localizationTexts:missing request on permission denial (&lt;a href="https://github.com/nocobase/nocobase/pull/8903" rel="noopener noreferrer"&gt;#8903&lt;/a&gt;) by chenos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Action: Import records Pro]&lt;/strong&gt; Fix the issue where option of "Trigger workflow" not works when not checked by mytharcher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Data source: External Oracle]&lt;/strong&gt; Fix an error that occurs when loading the Oracle external data source by 2013xile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Fix translation, node selection, and return target issues in the v2 approval form return button by zhangzhonghe&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.nocobase.com/en/blog/v2.1.0-alpha.10" rel="noopener noreferrer"&gt;v2.1.0-alpha.10&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Release date: 2026-03-20&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎉 New Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[IdP: OAuth]&lt;/strong&gt; Add a new IdP: OAuth plugin to enable MCP services to authenticate via OAuth (&lt;a href="https://github.com/nocobase/nocobase/pull/8896" rel="noopener noreferrer"&gt;#8896&lt;/a&gt;) by 2013xile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[AI employees]&lt;/strong&gt; Scheduled cleanup of AI conversation checkpoint data. (&lt;a href="https://github.com/nocobase/nocobase/pull/8855" rel="noopener noreferrer"&gt;#8855&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[App supervisor]&lt;/strong&gt; Support filtering in the application listAdd confirmation dialogs for start and stop actionsSort application status entries by environment name by 2013xile&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;[server]&lt;/strong&gt; improve pm add logic (&lt;a href="https://github.com/nocobase/nocobase/pull/8875" rel="noopener noreferrer"&gt;#8875&lt;/a&gt;) by chenos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[client]&lt;/strong&gt; Support showing confirm message before closing popup. (&lt;a href="https://github.com/nocobase/nocobase/pull/8839" rel="noopener noreferrer"&gt;#8839&lt;/a&gt;) by gchust&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;[undefined]&lt;/strong&gt; Add a dedicated client-v2 entry and build it independently with rsbuild while keeping v1 unchanged. (&lt;a href="https://github.com/nocobase/nocobase/pull/8743" rel="noopener noreferrer"&gt;#8743&lt;/a&gt;) by Molunerfinn&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[Workflow]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix the issue where gracefully shutdown not drain all events (&lt;a href="https://github.com/nocobase/nocobase/pull/8894" rel="noopener noreferrer"&gt;#8894&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;li&gt;Add filter executions list (&lt;a href="https://github.com/nocobase/nocobase/pull/8914" rel="noopener noreferrer"&gt;#8914&lt;/a&gt;) by mytharcher&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Async task manager]&lt;/strong&gt; async tasks are added to support workers in post error messages (&lt;a href="https://github.com/nocobase/nocobase/pull/8849" rel="noopener noreferrer"&gt;#8849&lt;/a&gt;) by cgyrock&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Avoid to configure approvers' UI when no collection configured in trigger by mytharcher&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🐛 Bug Fixes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;[client]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fix the issue where non-administrators cannot clear associated field values (&lt;a href="https://github.com/nocobase/nocobase/pull/8904" rel="noopener noreferrer"&gt;#8904&lt;/a&gt;) by jiannx&lt;/li&gt;
&lt;li&gt;Fixed the issue where the “Select record” popup in the subtable failed to load correctly when opened the second time. (&lt;a href="https://github.com/nocobase/nocobase/pull/8865" rel="noopener noreferrer"&gt;#8865&lt;/a&gt;) by gchust&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[resourcer]&lt;/strong&gt; Prevent the &lt;code&gt;filterByTk&lt;/code&gt; parameter array from being automatically converted into an object when it exceeds 100 items (&lt;a href="https://github.com/nocobase/nocobase/pull/8908" rel="noopener noreferrer"&gt;#8908&lt;/a&gt;) by 2013xile&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[server]&lt;/strong&gt; Fix the issue where lifecycle events sent by worker cause serving app stops (&lt;a href="https://github.com/nocobase/nocobase/pull/8906" rel="noopener noreferrer"&gt;#8906&lt;/a&gt;) by mytharcher&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Data source manager]&lt;/strong&gt; Fixed issue that collection created by AI employee always missing &lt;code&gt;createBy&lt;/code&gt; and &lt;code&gt;updateBy&lt;/code&gt; fields (&lt;a href="https://github.com/nocobase/nocobase/pull/8895" rel="noopener noreferrer"&gt;#8895&lt;/a&gt;) by cgyrock&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;[AI employees]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix issue with specified URL for LLM service not taking effect in text embedding model calls. (&lt;a href="https://github.com/nocobase/nocobase/pull/8892" rel="noopener noreferrer"&gt;#8892&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;li&gt;Fixed potential undefined variable errors in AI plugin upgrade migration scripts. (&lt;a href="https://github.com/nocobase/nocobase/pull/8883" rel="noopener noreferrer"&gt;#8883&lt;/a&gt;) by cgyrock&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;[Action: Import records Pro]&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix the issue where columns more than ~30 cause importing error, due to stream has been read duplicately by mytharcher&lt;/li&gt;
&lt;li&gt;Fix the issue where error thrown when import in sync mode by mytharcher&lt;/li&gt;
&lt;li&gt;Fix &lt;code&gt;beforeStop&lt;/code&gt; event on sub app not fired by mytharcher&lt;/li&gt;
&lt;li&gt;Fix the issue where async tasks do not end after an error occurs in async import by cgyrock&lt;/li&gt;
&lt;li&gt;Fix lazy import caused SES error by mytharcher&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Template print]&lt;/strong&gt; Fix sql collection printing error by jiannx&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Workflow: Approval]&lt;/strong&gt; Fix concurrency issue when add assignee by mytharcher&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Email manager]&lt;/strong&gt; Fixed page error when the email does not exist by jiannx&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;[Migration manager]&lt;/strong&gt; Fixed the issue where the migration is interrupted due to an error caused by the target environment not having the new table created during the upload migration process. by Andrew1989Y&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  About NocoBase
&lt;/h3&gt;

&lt;p&gt;NocoBase is the most extensible AI-powered no-code platform.&lt;br&gt;
Total control. Infinite extensibility. AI collaboration.&lt;br&gt;
Enable your team to adapt quickly and cut costs dramatically.&lt;br&gt;
No years of development. No millions wasted.&lt;br&gt;
Deploy NocoBase in minutes — and take control of everything.&lt;/p&gt;

&lt;p&gt;Discover NocoBase in 3 Minutes!&lt;/p&gt;

&lt;h3&gt;
  
  
  👇 Get NocoBase
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;Homepage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.nocobase.com/new" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://v2.docs.nocobase.com/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>nocode</category>
      <category>news</category>
    </item>
    <item>
      <title>NocoBase 2.0 Beginner Tutorial - Chapter 5: Users &amp; Permissions</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Wed, 25 Mar 2026 03:21:36 +0000</pubDate>
      <link>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-5-users-permissions-3ef7</link>
      <guid>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-5-users-permissions-3ef7</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://docs.nocobase.com/tutorials/v2/05-roles-and-permissions" rel="noopener noreferrer"&gt;https://docs.nocobase.com/tutorials/v2/05-roles-and-permissions&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Chapter 5: Users &amp;amp; Permissions — Who Sees What
&lt;/h1&gt;

&lt;p&gt;In the last chapter, we built forms and detail &lt;a href="https://docs.nocobase.com/interface-builder/pages" rel="noopener noreferrer"&gt;pages&lt;/a&gt; — our ticket system can now handle data entry and viewing. But there's a problem: everyone sees the same thing after logging in. Regular employees who submit tickets can access the admin pages, technicians can delete categories... that's not going to work.&lt;/p&gt;

&lt;p&gt;In this chapter, we'll add "access control": create &lt;a href="https://docs.nocobase.com/users-permissions/role" rel="noopener noreferrer"&gt;roles&lt;/a&gt;, configure &lt;a href="https://docs.nocobase.com/users-permissions/role/menu-permissions" rel="noopener noreferrer"&gt;menu permissions&lt;/a&gt; and &lt;a href="https://docs.nocobase.com/users-permissions/role/data-scope" rel="noopener noreferrer"&gt;data scope&lt;/a&gt; restrictions — &lt;strong&gt;different people see different &lt;a href="https://docs.nocobase.com/interface-builder/menus" rel="noopener noreferrer"&gt;menus&lt;/a&gt; and operate on different data&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5.1 Understanding Roles
&lt;/h2&gt;

&lt;p&gt;In NocoBase, &lt;strong&gt;a &lt;a href="https://docs.nocobase.com/users-permissions/role" rel="noopener noreferrer"&gt;role&lt;/a&gt; is a collection of &lt;a href="https://docs.nocobase.com/users-permissions/role" rel="noopener noreferrer"&gt;permissions&lt;/a&gt;&lt;/strong&gt;. You don't need to configure permissions for each user individually — instead, you define a few roles first, then assign users to the appropriate roles.&lt;/p&gt;

&lt;p&gt;NocoBase comes with three built-in roles after installation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Root&lt;/strong&gt;: Super admin with full permissions — cannot be deleted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin&lt;/strong&gt;: Administrator with UI configuration permissions by default&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Member&lt;/strong&gt;: Regular member with limited default permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But these three built-in roles aren't enough for our needs. Our ticket system requires finer-grained control, so we'll create 3 custom roles next.&lt;/p&gt;

&lt;h2&gt;
  
  
  5.2 Creating Three Roles
&lt;/h2&gt;

&lt;p&gt;Open the settings menu in the top-right corner and go to &lt;strong&gt;Users &amp;amp; Permissions -&amp;gt; Roles&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Add role&lt;/strong&gt; and create the following roles one by one:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role Name&lt;/th&gt;
&lt;th&gt;Role Key&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HelpDesk Admin&lt;/td&gt;
&lt;td&gt;admin-helpdesk&lt;/td&gt;
&lt;td&gt;Can see all tickets, manage categories, assign handlers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Technician&lt;/td&gt;
&lt;td&gt;technician&lt;/td&gt;
&lt;td&gt;Can only see tickets assigned to them, can process and close&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regular User&lt;/td&gt;
&lt;td&gt;user&lt;/td&gt;
&lt;td&gt;Can only submit tickets and view their own submissions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvzg7ijl27wbpz8cezy8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvzg7ijl27wbpz8cezy8.png" alt="05-roles-and-permissions-2026-03-13-19-03-14" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;strong&gt;Role Key&lt;/strong&gt; is a unique internal ID used by the system. It cannot be changed after creation, so we recommend using lowercase English. The Role Name can be modified at any time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0ifnm2fkwk3n9bk8gxh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0ifnm2fkwk3n9bk8gxh.png" alt="05-roles-and-permissions-2026-03-13-18-57-47" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After creation, you should see our three new roles in the roles list.&lt;/p&gt;

&lt;h2&gt;
  
  
  5.3 Configuring Menu Permissions
&lt;/h2&gt;

&lt;p&gt;Now that the roles are set up, we need to tell the system which menus each role can access.&lt;/p&gt;

&lt;p&gt;Click on a role to enter its permission configuration page, and find the &lt;strong&gt;Menu permissions&lt;/strong&gt; tab. This lists all menu items in the system — check a box to allow access, uncheck it to hide it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HelpDesk Admin (admin-helpdesk)&lt;/strong&gt;: Check all&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tickets, Categories, Dashboard — all visible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technician (technician)&lt;/strong&gt;: Partial access&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Tickets&lt;/li&gt;
&lt;li&gt;✅ Dashboard&lt;/li&gt;
&lt;li&gt;❌ Categories (technicians don't need to manage categories)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Regular User (user)&lt;/strong&gt;: Minimum permissions&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ My Tickets (or the "Submit Ticket" page)&lt;/li&gt;
&lt;li&gt;❌ Tickets&lt;/li&gt;
&lt;li&gt;❌ Categories&lt;/li&gt;
&lt;li&gt;❌ Dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbema1vl3d1x7jswpwcui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbema1vl3d1x7jswpwcui.png" alt="05-roles-and-permissions-2026-03-13-19-09-11" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: NocoBase has a handy setting — "Allow access to new menu items by default." If you don't want to manually check every new page you add, you can enable this for the admin role. For the regular user role, we recommend keeping it disabled.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5.4 Configuring Data Permissions
&lt;/h2&gt;

&lt;p&gt;Menu permissions control "can I access this page?" while data permissions control "what data can I see once I'm on the page?"&lt;/p&gt;

&lt;p&gt;Key concept: &lt;strong&gt;&lt;a href="https://docs.nocobase.com/users-permissions/role/data-scope" rel="noopener noreferrer"&gt;Data Scope&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the role's permission settings, switch to the &lt;strong&gt;&lt;a href="https://docs.nocobase.com/users-permissions/role/action-permissions" rel="noopener noreferrer"&gt;Action permissions&lt;/a&gt;&lt;/strong&gt; tab. Find our "Tickets" &lt;a href="https://docs.nocobase.com/data-sources/main/collection" rel="noopener noreferrer"&gt;collection&lt;/a&gt; and click to configure it individually.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb670ortnv3oe8fjzuvx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb670ortnv3oe8fjzuvx8.png" alt="05-roles-and-permissions-2026-03-13-19-51-06" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Regular User: Only See Their Own Tickets
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Find the &lt;strong&gt;View&lt;/strong&gt; permission for the "Tickets" collection&lt;/li&gt;
&lt;li&gt;Set the data scope to &lt;strong&gt;Own records&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;This way, regular users can only see tickets where they are the creator (note: the default "Own records" is based on the system creator field, not the Submitter field, but this can be changed)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Similarly, set the "Edit" and "Delete" permissions to &lt;strong&gt;Own records&lt;/strong&gt; as well (or simply don't grant delete permission at all).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkhzbob79ve1tozr7ull.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkhzbob79ve1tozr7ull.png" alt="05-roles-and-permissions-2026-03-13-19-53-02" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;About global configuration: if you only configure the Tickets collection, other data and settings (like categories, assignees) may become invisible. Since our system is fairly simple, we'll check "View all data" globally for now, and only set specific data scopes for sensitive collections.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffch1yshu2zu47w9rqqp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffch1yshu2zu47w9rqqp0.png" alt="05-roles-and-permissions-2026-03-13-19-57-24" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Technician: Only See Tickets Assigned to Them
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Find the &lt;strong&gt;View&lt;/strong&gt; permission for the "Tickets" collection&lt;/li&gt;
&lt;li&gt;Set the data scope to &lt;strong&gt;Own records&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;There's a nuance here — NocoBase's "Own records" filters by creator by default. If we want to filter by "Assignee" instead, we can further adjust this in the global operation permissions, or achieve it on the frontend by setting &lt;strong&gt;filter conditions on the data &lt;a href="https://docs.nocobase.com/interface-builder/blocks" rel="noopener noreferrer"&gt;block&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7dhg8wpziumyw1hrz3h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7dhg8wpziumyw1hrz3h.png" alt="05-roles-and-permissions-2026-03-13-20-01-54" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Practical tip&lt;/strong&gt;: You can also set default filter conditions on table blocks to assist permission control, e.g., "Assignee = Current user." But note that page configuration applies globally — admins would be limited too. A compromise: configure "Assignee = Current user &lt;strong&gt;or&lt;/strong&gt; Submitter = Current user" to cover both regular users and technicians; if admins need a full view, create a separate page without filter conditions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw22hb5mkwtq9sksmtwpx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw22hb5mkwtq9sksmtwpx.png" alt="05-roles-and-permissions-2026-03-13-22-21-34" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  HelpDesk Admin: See All Data
&lt;/h3&gt;

&lt;p&gt;For the admin role, set the data scope to &lt;strong&gt;All records&lt;/strong&gt; and enable all operations. Simple and straightforward.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kkytcm44vkh5ewljaa2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kkytcm44vkh5ewljaa2.png" alt="05-roles-and-permissions-2026-03-13-21-45-14" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5.5 Ticket Assignment Action
&lt;/h2&gt;

&lt;p&gt;Before testing permissions, let's add a handy feature to the ticket list: &lt;strong&gt;assigning a handler&lt;/strong&gt;. Admins can assign a ticket to a technician directly from the list, without opening the full edit form and dealing with a bunch of fields.&lt;/p&gt;

&lt;p&gt;The implementation is simple — add a custom popup button to the table row actions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter &lt;a href="https://docs.nocobase.com/get-started/how-nocobase-works" rel="noopener noreferrer"&gt;UI Editor&lt;/a&gt; mode. In the ticket list table's actions column, click &lt;strong&gt;"+"&lt;/strong&gt; to add a &lt;strong&gt;"Popup"&lt;/strong&gt; action button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gqz8ho12sk9mfb9od4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gqz8ho12sk9mfb9od4g.png" alt="05-roles-and-permissions-2026-03-14-13-57-31" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Change the button title to &lt;strong&gt;"Assign"&lt;/strong&gt; (click the button settings to modify the title).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lmagxgnm9ao3zp4bboe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lmagxgnm9ao3zp4bboe.png" alt="05-roles-and-permissions-2026-03-14-13-59-22" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since there's only a simple assignment to make, a compact dialog is more appropriate than a drawer. Click the popup settings in the button's top-right corner, select &lt;strong&gt;Dialog (narrow)&lt;/strong&gt; &amp;gt; Confirm.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcirl9j2d47lmbqap7xn1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcirl9j2d47lmbqap7xn1.png" alt="05-roles-and-permissions-2026-03-14-14-08-16" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the "Assign" button to open the popup. In the popup, go to &lt;strong&gt;"Add block → Data blocks → Form (Edit)"&lt;/strong&gt;, and select the current collection.&lt;/li&gt;
&lt;li&gt;In the form, only check the &lt;strong&gt;"Assignee"&lt;/strong&gt; field, and set it as &lt;strong&gt;required&lt;/strong&gt; in the field settings.&lt;/li&gt;
&lt;li&gt;Add a &lt;strong&gt;"Submit"&lt;/strong&gt; action button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw424jui527wqcotvg9lo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw424jui527wqcotvg9lo.png" alt="05-roles-and-permissions-2026-03-14-14-10-50" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now admins can click "Assign" in the ticket list, pick a handler from a minimal form, and submit. Quick, precise, and no risk of accidentally changing other fields.&lt;/p&gt;

&lt;h3&gt;
  
  
  Controlling Button Visibility with Linkage Rules
&lt;/h3&gt;

&lt;p&gt;The "Assign" button is only needed by admins — showing it to regular users and technicians would be confusing. We can use &lt;strong&gt;linkage rules&lt;/strong&gt; to show or hide the button based on the current user's role:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In UI Editor mode, click the "Assign" button's settings and find &lt;strong&gt;"Linkage rules"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add a rule with the condition: &lt;strong&gt;Current user / Roles / Role name&lt;/strong&gt; is not equal to &lt;strong&gt;HelpDesk Admin&lt;/strong&gt; (the name corresponding to the admin-helpdesk role).&lt;/li&gt;
&lt;li&gt;Set the action when the condition is met: &lt;strong&gt;Hide&lt;/strong&gt; the button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This way, only users with the admin role can see the "Assign" button — it's automatically hidden for all other roles.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j6sakvhaqa749xbrd8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2j6sakvhaqa749xbrd8k.png" alt="05-roles-and-permissions-2026-03-14-14-17-37" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5.6 Creating Test Users and Trying It Out
&lt;/h2&gt;

&lt;p&gt;Permissions are configured — let's verify them in practice.&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;User Management&lt;/strong&gt; (in the settings center or the user management page you built earlier) and create 3 test users:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Username&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Alice&lt;/td&gt;
&lt;td&gt;HelpDesk Admin (admin-helpdesk)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bob&lt;/td&gt;
&lt;td&gt;Technician (technician)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Charlie&lt;/td&gt;
&lt;td&gt;Regular User (user)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1q7a74tf7li67q68t2ko.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1q7a74tf7li67q68t2ko.png" alt="05-roles-and-permissions-2026-03-13-22-23-47" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After creating them, log in with each account and check two things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Are the menus displayed as expected?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alice → Can see all menus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ty6p7429biyshdr0ifr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ty6p7429biyshdr0ifr.png" alt="05-roles-and-permissions-2026-03-14-14-19-29" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bob → Only sees Tickets and Dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cgy85ktw41g4xfkvjap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cgy85ktw41g4xfkvjap.png" alt="05-roles-and-permissions-2026-03-13-22-26-50" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Charlie → Only sees "My Tickets"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46nrieaku6ou2cmxpwv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F46nrieaku6ou2cmxpwv2.png" alt="05-roles-and-permissions-2026-03-13-22-30-57" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Is the data filtered as expected?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First, log in as Alice and create a few tickets assigned to different people&lt;/li&gt;
&lt;li&gt;Switch to Bob → Only sees tickets assigned to them&lt;/li&gt;
&lt;li&gt;Switch to Charlie → Only sees tickets they submitted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretty cool, right? The same system, completely different content for different users! That's the power of permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this chapter, we completed the ticket system's permission framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3 roles&lt;/strong&gt;: HelpDesk Admin, Technician, Regular User&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Menu permissions&lt;/strong&gt;: Control which pages each role can access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data permissions&lt;/strong&gt;: Control which data each role can see (via data scope)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test verification&lt;/strong&gt;: Log in with different accounts to confirm permissions work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, our ticket system is shaping up nicely — it can handle data entry, viewing, and role-based access control. But everything is still manual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Chapter Preview
&lt;/h2&gt;

&lt;p&gt;In the next chapter, we'll learn about &lt;strong&gt;Workflows&lt;/strong&gt; — letting the system do work for us automatically. For example, automatically notifying the assignee when a ticket is submitted, or logging a timestamp when the status changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/users-permissions/user" rel="noopener noreferrer"&gt;User Management&lt;/a&gt; — User administration guide&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/users-permissions/role" rel="noopener noreferrer"&gt;Roles &amp;amp; Permissions&lt;/a&gt; — Role configuration reference&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/users-permissions/role/data-scope" rel="noopener noreferrer"&gt;Data Scope&lt;/a&gt; — Row-level permission control&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  About NocoBase
&lt;/h3&gt;

&lt;p&gt;NocoBase is the most extensible AI-powered no-code platform.&lt;br&gt;
Total control. Infinite extensibility. AI collaboration.&lt;br&gt;
Enable your team to adapt quickly and cut costs dramatically.&lt;br&gt;
No years of development. No millions wasted.&lt;br&gt;
Deploy NocoBase in minutes — and take control of everything.&lt;/p&gt;

&lt;p&gt;Discover NocoBase in 3 Minutes!&lt;/p&gt;

&lt;h3&gt;
  
  
  👇 Get NocoBase
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;Homepage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.nocobase.com/new" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://v2.docs.nocobase.com/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>nocode</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The NocoBase Partner Program Is Live</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Tue, 24 Mar 2026 03:44:13 +0000</pubDate>
      <link>https://forem.com/nocobase/the-nocobase-partner-program-is-live-329l</link>
      <guid>https://forem.com/nocobase/the-nocobase-partner-program-is-live-329l</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://www.nocobase.com/en/blog/nocobase-partner-program" rel="noopener noreferrer"&gt;https://www.nocobase.com/en/blog/nocobase-partner-program&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The NocoBase Partner Program is now officially launched, open to software development companies, system integrators, IT consulting firms, and other teams with enterprise digital delivery capabilities worldwide. The program primarily supports two areas of collaboration: channel distribution and service delivery. As more and more customers build their business systems on NocoBase, market demand for implementation, custom development, and long-term service support continues to grow. The launch of the Partner Program is designed to systematically address this trend and foster a more stable, professional, and sustainable ecosystem of collaboration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.nocobase.com/en/partner" rel="noopener noreferrer"&gt;Apply Now&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We're Launching a Partner Program
&lt;/h2&gt;

&lt;p&gt;As NocoBase continues to expand across different regions and industries, an increasing number of customers are seeking professional support for system development and project delivery—including requirements analysis, implementation and deployment, custom development, training, and ongoing maintenance.&lt;/p&gt;

&lt;p&gt;At the same time, the NocoBase team will continue to focus on product development and platform capabilities, and does not provide implementation services directly. Within this positioning, partners play a vital role in bridging customer needs and platform capabilities: on one hand, helping customers advance their projects more efficiently; on the other, expanding their own service capabilities and business opportunities through NocoBase.&lt;/p&gt;

&lt;p&gt;The launch of the Partner Program is intended to formalize this collaborative relationship and lay the foundation for long-term ecosystem development.&lt;/p&gt;

&lt;p&gt;Looking ahead, NocoBase will continue to advance its AI capabilities, progressively enabling the construction and operation of reliable business systems through AI. This will mark a key inflection point in the platform's evolution, opening up new service scenarios, solution opportunities, and business growth potential for partners. For teams looking to invest in this ecosystem for the long term, now is an important moment to get involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Partnership Models
&lt;/h2&gt;

&lt;p&gt;At this stage, the NocoBase Partner Program includes two partnership models. Partners can choose to participate in one based on their capabilities and business direction, or pursue both simultaneously based on their situation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Channel Distribution
&lt;/h3&gt;

&lt;p&gt;The channel distribution model is designed for teams with market development capabilities, customer resources, or industry connections. Partners can promote NocoBase products within target regions or vertical industries, connect with potential customers, facilitate commercial license purchases, and earn corresponding commission rebates.&lt;/p&gt;

&lt;p&gt;This model is suited for teams looking to collaborate around product promotion, customer conversion, and market coverage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Service Delivery
&lt;/h3&gt;

&lt;p&gt;The service delivery model is designed for teams with technical delivery capabilities and project implementation experience. Partners can provide professional services to customers based on NocoBase, including requirements analysis, solution design, system implementation, custom development, training, and technical support.&lt;/p&gt;

&lt;p&gt;This model is suited for teams looking to collaborate around project delivery, industry solution development, and ongoing service capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ideal Partner Profiles
&lt;/h2&gt;

&lt;p&gt;The NocoBase Partner Program is best suited for teams that are already familiar with NocoBase and possess real delivery capabilities. Generally, the following types of teams are a strong fit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Already familiar with NocoBase with relevant project experience&lt;/li&gt;
&lt;li&gt;Capable of independently completing system implementation, custom development, or customer delivery&lt;/li&gt;
&lt;li&gt;Have expansion capabilities within specific regions, industries, or customer segments&lt;/li&gt;
&lt;li&gt;Committed to long-term collaboration rather than short-term transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Our Vision for the Partner Ecosystem
&lt;/h2&gt;

&lt;p&gt;Through the Partner Program, NocoBase aims to gradually build a long-term, open, and sustainable partner ecosystem.&lt;/p&gt;

&lt;p&gt;The core objectives of this ecosystem include: enabling customers to access professional services and reliable delivery more conveniently; providing capable partners with clearer business opportunities; and ensuring that outstanding implementation experience, industry solutions, and extension outcomes are continuously accumulated within the ecosystem.&lt;/p&gt;

&lt;p&gt;The Partner Program is not just the launch of a collaboration framework—it is the beginning of long-term ecosystem development. Going forward, NocoBase will continue to advance the partner system across areas including partnership support, market collaboration, joint case studies, and ecosystem improvement, driving a long-term, stable value cycle among the platform, partners, and customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Apply
&lt;/h2&gt;

&lt;p&gt;We welcome qualified teams to join the NocoBase Partner Program.&lt;/p&gt;

&lt;p&gt;For more information on partnership models, application requirements, and related details, please visit the &lt;a href="https://www.nocobase.com/en/partner" rel="noopener noreferrer"&gt;Become a Partner page&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>nocode</category>
      <category>news</category>
    </item>
    <item>
      <title>NocoBase 2.0 Beginner Tutorial - Chapter 4: Forms &amp; Details</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Mon, 23 Mar 2026 03:33:56 +0000</pubDate>
      <link>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-4-forms-details-19mp</link>
      <guid>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-4-forms-details-19mp</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://docs.nocobase.com/tutorials/v2/04-forms-and-details" rel="noopener noreferrer"&gt;https://docs.nocobase.com/tutorials/v2/04-forms-and-details&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Chapter 4: Forms &amp;amp; Details — Input, Display, All in One
&lt;/h1&gt;

&lt;p&gt;In the last chapter, we built the ticket list and used a quick form to enter test data. In this chapter, we'll &lt;strong&gt;refine the form experience&lt;/strong&gt; — optimize &lt;a href="https://docs.nocobase.com/interface-builder/blocks/data-blocks/form" rel="noopener noreferrer"&gt;Form block&lt;/a&gt; field layouts, add &lt;a href="https://docs.nocobase.com/interface-builder/blocks/data-blocks/details" rel="noopener noreferrer"&gt;Details blocks&lt;/a&gt;, configure &lt;a href="https://docs.nocobase.com/interface-builder/linkage-rules" rel="noopener noreferrer"&gt;linkage rules&lt;/a&gt;, and use &lt;a href="https://docs.nocobase.com/record-history/" rel="noopener noreferrer"&gt;change history&lt;/a&gt; to track every modification.&lt;/p&gt;

&lt;p&gt;:::tip&lt;br&gt;
Section 4.4 "Change History" requires the &lt;a href="https://www.nocobase.com/en/commercial" rel="noopener noreferrer"&gt;Professional edition&lt;/a&gt;. Skipping it won't affect later chapters.&lt;br&gt;
:::&lt;/p&gt;

&lt;h2&gt;
  
  
  4.1 Refining the New Ticket Form
&lt;/h2&gt;

&lt;p&gt;In the last chapter, we quickly created a working "Add new" form. Now let's refine it — adjust field order, set default values, and optimize the layout. If you skipped the quick form in the previous chapter, no worries — we'll walk through creating one from scratch here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding the "Add new" Action Button
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Make sure you're in &lt;a href="https://docs.nocobase.com/get-started/how-nocobase-works" rel="noopener noreferrer"&gt;UI Editor&lt;/a&gt; mode (top-right toggle is on).&lt;/li&gt;
&lt;li&gt;Go to the "All Tickets" page, and click &lt;strong&gt;"&lt;a href="https://docs.nocobase.com/interface-builder/actions" rel="noopener noreferrer"&gt;Actions&lt;/a&gt;"&lt;/strong&gt; above the Table block.&lt;/li&gt;
&lt;li&gt;Check the &lt;strong&gt;"Add new"&lt;/strong&gt; action button.&lt;/li&gt;
&lt;li&gt;An "Add new" button will appear above the table. Clicking it opens a &lt;a href="https://docs.nocobase.com/interface-builder/actions/pop-up" rel="noopener noreferrer"&gt;popup&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipm345ur7w50h5qmzn1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipm345ur7w50h5qmzn1u.png" alt="04-forms-and-details-2026-03-13-09-43-54" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring the Form in the Popup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click the "Add new" button to open the popup.&lt;/li&gt;
&lt;li&gt;In the popup, click &lt;strong&gt;"Add block" -&amp;gt; Data blocks -&amp;gt; &lt;a href="https://docs.nocobase.com/interface-builder/blocks/data-blocks/form" rel="noopener noreferrer"&gt;Form (Add new)&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"Current collection"&lt;/strong&gt;. The popup already knows which collection it's associated with — no need to specify manually.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq566o084mr6cswhu1uxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq566o084mr6cswhu1uxr.png" alt="04-forms-and-details-2026-03-13-09-44-50" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the form, click &lt;strong&gt;"&lt;a href="https://docs.nocobase.com/data-sources/field" rel="noopener noreferrer"&gt;Fields&lt;/a&gt;"&lt;/strong&gt; and check the following fields:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Configuration Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;Required (auto-inherited)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description&lt;/td&gt;
&lt;td&gt;Rich text input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;Dropdown select (we'll set a default via linkage rules later)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priority&lt;/td&gt;
&lt;td&gt;Dropdown select&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Category&lt;/td&gt;
&lt;td&gt;A relation field that automatically appears as a dropdown selector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Submitter&lt;/td&gt;
&lt;td&gt;Relation field (we'll set a default via linkage rules later)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Assignee&lt;/td&gt;
&lt;td&gt;Relation field&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw74uedsvb6u3gbhtiydh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw74uedsvb6u3gbhtiydh.png" alt="04-forms-and-details-2026-03-13-12-44-49" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll notice a red asterisk &lt;code&gt;*&lt;/code&gt; next to "Title" automatically — because we set it as required when creating the field in Chapter 2. Forms automatically inherit required rules from the &lt;a href="https://docs.nocobase.com/data-sources/main/collection" rel="noopener noreferrer"&gt;collection&lt;/a&gt;'s field settings; no extra configuration needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F008s1klub2gybfjgb91y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F008s1klub2gybfjgb91y.png" alt="04-forms-and-details-2026-03-13-12-46-34" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: If a field isn't required at the collection level but you want it required in this specific form, you can set it individually in the field's settings.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffj6tydqu3c88xghnl945.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffj6tydqu3c88xghnl945.png" alt="04-forms-and-details-2026-03-13-12-47-26" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding the Submit Button
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Below the Form block, click &lt;strong&gt;"Actions"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check the &lt;strong&gt;"Submit"&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5eru997vrsvvirdinlh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5eru997vrsvvirdinlh9.png" alt="04-forms-and-details-2026-03-13-16-30-06" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After filling in the form, users can click Submit to create a new ticket.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbb5b7jljnujz8y7qiqh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbb5b7jljnujz8y7qiqh.gif" alt="04-forms-and-details-2026-03-13-16-32-19" width="1822" height="1138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4.2 Linkage Rules: Defaults &amp;amp; Field Linkage
&lt;/h2&gt;

&lt;p&gt;Some fields should be auto-filled (e.g., Status defaults to "Pending"), while others need to change dynamically based on conditions (e.g., urgent tickets require a description). The default value feature in 2.0 is still evolving, so in this tutorial we'll use &lt;strong&gt;Linkage Rules&lt;/strong&gt; for both default values and field linkage.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;block settings&lt;/strong&gt; icon (three-line icon) in the top-right corner of the Form block.&lt;/li&gt;
&lt;li&gt;Find &lt;strong&gt;"Linkage rules"&lt;/strong&gt; — clicking it opens a configuration panel in the sidebar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fplo4xsyj7mgk5wzwi80o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fplo4xsyj7mgk5wzwi80o.png" alt="04-forms-and-details-2026-03-13-16-43-35" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Default Values
&lt;/h3&gt;

&lt;p&gt;Let's first set default values for "Status" and "Submitter":&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;"Add linkage rule"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leave the condition empty&lt;/strong&gt; — an unconditional linkage rule executes immediately when the form loads.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8iiy2h9bts6xqpq649k9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8iiy2h9bts6xqpq649k9.png" alt="04-forms-and-details-2026-03-13-16-47-34" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure the Actions:

&lt;ul&gt;
&lt;li&gt;Status field -&amp;gt; &lt;strong&gt;Set default value&lt;/strong&gt; -&amp;gt; Pending&lt;/li&gt;
&lt;li&gt;Submitter field -&amp;gt; &lt;strong&gt;Set default value&lt;/strong&gt; -&amp;gt; Current user&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important notes on setting values&lt;/strong&gt;: Always select &lt;strong&gt;"Current form"&lt;/strong&gt; as the data source first. For relation fields (like Category, Submitter, Assignee — any many-to-one field), you must select the object property itself, not its expanded sub-fields.&lt;/p&gt;

&lt;p&gt;When selecting variables (like "Current user"), first &lt;strong&gt;single-click&lt;/strong&gt; to select it, then &lt;strong&gt;double-click&lt;/strong&gt; to fill it into the selection bar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxvvk1bzlwtbkaricmdr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxvvk1bzlwtbkaricmdr.png" alt="04-forms-and-details-2026-03-13-17-01-06" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwuv57vp7m26xomatw1id.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwuv57vp7m26xomatw1id.png" alt="04-forms-and-details-2026-03-13-17-02-20" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk54uxm2rw77tuxet8k5q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk54uxm2rw77tuxet8k5q.png" alt="04-forms-and-details-2026-03-13-17-03-41" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want a field to be non-editable by the submitter (e.g., Status), you can set its &lt;strong&gt;"Display mode"&lt;/strong&gt; to &lt;strong&gt;"Readonly"&lt;/strong&gt; in the field settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvbh77fyj46ycs96i4ct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgvbh77fyj46ycs96i4ct.png" alt="04-forms-and-details-2026-03-13-17-22-15" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Three display modes&lt;/strong&gt;: Editable, Readonly (editing disabled but field appearance preserved), and Easy-reading (displays as plain text only).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fms9spsdr9f0jiyze3qmy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fms9spsdr9f0jiyze3qmy.png" alt="04-forms-and-details-2026-03-13-12-54-53" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Urgent Ticket Requires Description
&lt;/h3&gt;

&lt;p&gt;Next, add a conditional linkage rule: when a user selects Priority as "Urgent", the Description field becomes &lt;strong&gt;required&lt;/strong&gt;, reminding the submitter to clearly describe the situation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;"Add linkage rule"&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04fiwnhvhmmzf3w5j4dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04fiwnhvhmmzf3w5j4dm.png" alt="04-forms-and-details-2026-03-13-17-07-34" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure the rule:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Condition&lt;/strong&gt;: Current form / Priority &lt;strong&gt;equals&lt;/strong&gt; Urgent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actions&lt;/strong&gt;: Description field -&amp;gt; set to &lt;strong&gt;Required&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx3z629k82o17uskr645.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgx3z629k82o17uskr645.png" alt="04-forms-and-details-2026-03-13-17-08-46" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1avsxbcyeduso35rohei.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1avsxbcyeduso35rohei.png" alt="04-forms-and-details-2026-03-13-17-18-16" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save the rule.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now test it: select Priority as "Urgent" and a red asterisk &lt;code&gt;*&lt;/code&gt; will appear next to the Description field, indicating it's required. Select any other priority and it reverts to optional.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuum14991txqgw11xtwdu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuum14991txqgw11xtwdu.gif" alt="04-forms-and-details-2026-03-13-17-20-18" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, apply what we've learned and adjust the layout a bit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknxew3ain1tj7zsycbh3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknxew3ain1tj7zsycbh3.png" alt="04-forms-and-details-2026-03-13-17-25-55" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What else can linkage rules do?&lt;/strong&gt; Beyond setting defaults and controlling required status, they can also show/hide fields and dynamically assign values. For example: when Status is "Closed", hide the Assignee field. We'll explore more in later chapters as we encounter these scenarios.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4.3 Details Block
&lt;/h2&gt;

&lt;p&gt;In the last chapter, we added a "View" button to table rows that opens a Drawer. Now let's configure what goes inside the Drawer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the table, click the &lt;strong&gt;"View"&lt;/strong&gt; button on any row to open the Drawer.&lt;/li&gt;
&lt;li&gt;In the Drawer, click &lt;strong&gt;"Add block" -&amp;gt; Data blocks -&amp;gt; &lt;a href="https://docs.nocobase.com/interface-builder/blocks/data-blocks/details" rel="noopener noreferrer"&gt;Details&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"Current collection"&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rpqzwnfxugvcufmmoye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rpqzwnfxugvcufmmoye.png" alt="04-forms-and-details-2026-03-13-17-27-02" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the Details block, click &lt;strong&gt;"Fields"&lt;/strong&gt; with this layout:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Fields&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Top&lt;/td&gt;
&lt;td&gt;Title, Status (tag style)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main body&lt;/td&gt;
&lt;td&gt;Description (rich text area)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Side info&lt;/td&gt;
&lt;td&gt;Category name, Priority, Submitter, Assignee, Created at&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;How to add a large title? Select Fields &amp;gt; Markdown &amp;gt; Edit Markdown &amp;gt; in the editing area, select a variable &amp;gt; Current record &amp;gt; Title. This dynamically inserts the record's title into a Markdown block. Delete the default text and use Markdown syntax to make it a heading (add &lt;code&gt;##&lt;/code&gt; followed by a space before it).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1gwnron56n9lcj0xt4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1gwnron56n9lcj0xt4n.png" alt="04-forms-and-details-2026-03-13-17-36-26" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2w7qlzeuiq7e5wian2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa2w7qlzeuiq7e5wian2l.png" alt="04-forms-and-details-2026-03-13-17-39-51" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the original Title field can be removed. Adjust the details layout:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2oaa4ptqk5lwvg5hts9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2oaa4ptqk5lwvg5hts9b.png" alt="04-forms-and-details-2026-03-13-17-43-36" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: You can drag multiple fields onto the same row for a more compact and visually appealing layout.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;In the Details block's &lt;strong&gt;"Actions"&lt;/strong&gt;, check the &lt;strong&gt;"Edit"&lt;/strong&gt; button so users can jump straight from the details view into edit mode.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xtplgp8cf68ygueidko.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0xtplgp8cf68ygueidko.png" alt="04-forms-and-details-2026-03-13-17-45-15" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring the Edit Form
&lt;/h3&gt;

&lt;p&gt;Click the "Edit" button and a new popup opens — it needs an edit form inside. The edit form has nearly the same fields as the "Add new" form. Do we really have to check all those fields again from scratch?&lt;/p&gt;

&lt;p&gt;Nope. Let's &lt;strong&gt;save the "Add new" form as a template&lt;/strong&gt; first, then the edit form can reference it directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Go back to the "Add new" form and save as template&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Close the current drawer, go back to the ticket list, and click "Add new" to open the form.&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;block settings&lt;/strong&gt; icon (three-line icon) at the top-right of the Form block, and find &lt;strong&gt;"Save as template"&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3n0jjjhimtncbxehkito.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3n0jjjhimtncbxehkito.png" alt="04-forms-and-details-2026-03-13-17-47-21" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click save — it defaults to &lt;strong&gt;"Reference"&lt;/strong&gt;. All forms referencing this template share the same configuration. Update one place and all stay in sync.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn5g6jnxkeukkj4n348x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn5g6jnxkeukkj4n348x.png" alt="04-forms-and-details-2026-03-13-17-47-44" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fos418yxqrvf0k5s6qsob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fos418yxqrvf0k5s6qsob.png" alt="04-forms-and-details-2026-03-13-18-39-05" width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Since our ticket form isn't complex, "Reference" is simpler to maintain. If you choose "Duplicate", each form gets an independent copy that can be modified separately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Reference the template in the edit popup&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go back to the details drawer or the table's row actions, and click the "Edit" button to open the edit popup.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You might think: just use &lt;strong&gt;"Add block -&amp;gt; Other blocks -&amp;gt; Block templates"&lt;/strong&gt; to create the form, right? Try it and you'll find — this creates an &lt;strong&gt;"Add new" form&lt;/strong&gt;, and the fields aren't actually populated. This is a common pitfall.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3jrtg5iblxukrpm3uaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3jrtg5iblxukrpm3uaf.png" alt="04-forms-and-details-2026-03-13-17-59-36" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The correct approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the popup, click &lt;strong&gt;"Add block" -&amp;gt; Data blocks -&amp;gt; Form (Edit)&lt;/strong&gt; to create an edit form block first.&lt;/li&gt;
&lt;li&gt;In the edit form, click &lt;strong&gt;"Fields" -&amp;gt; "Field templates"&lt;/strong&gt;, and select the template you saved earlier.&lt;/li&gt;
&lt;li&gt;All fields will be populated at once, matching the "Add new" form exactly.&lt;/li&gt;
&lt;li&gt;Don't forget to add a &lt;strong&gt;"Submit"&lt;/strong&gt; action button so users can save their changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef9gnypbc87y4x5w25g3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef9gnypbc87y4x5w25g3.png" alt="04-forms-and-details-2026-03-13-18-05-13" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdz4qx4gpixsd0nksa5tc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdz4qx4gpixsd0nksa5tc.gif" alt="04-forms-and-details-2026-03-13-18-15-11" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to add a field later? Just modify the template once — both the "Add new" and edit forms update automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Editing: Change Data Without Opening a Popup
&lt;/h3&gt;

&lt;p&gt;Besides popup editing, NocoBase also supports &lt;strong&gt;quick editing&lt;/strong&gt; directly in the table — no popups needed, just hover and click.&lt;/p&gt;

&lt;p&gt;There are two places to enable it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Table block level&lt;/strong&gt;: Click the Table block's &lt;strong&gt;block settings&lt;/strong&gt; (three-line icon), find &lt;strong&gt;"Quick editing"&lt;/strong&gt;, and toggle it on. This enables quick editing for all fields in the table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Individual field level&lt;/strong&gt;: Click a column's field settings, find &lt;strong&gt;"Quick editing"&lt;/strong&gt;, and toggle it on per field.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F45e3v4wbu4l40pj308na.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F45e3v4wbu4l40pj308na.png" alt="04-forms-and-details-2026-03-13-18-20-07" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once enabled, hovering over a table cell reveals a small pencil icon. Click it to open an inline editor for that field — changes save automatically.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7ia0l3vg79denhswesk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg7ia0l3vg79denhswesk.gif" alt="04-forms-and-details-2026-03-13-18-21-09" width="1822" height="1138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;When is this useful?&lt;/strong&gt; Quick editing is perfect for batch updates like changing status or assignee. For example, an admin browsing the ticket list can click the "Status" column to quickly change a ticket from "Pending" to "In Progress" without opening each one individually.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4.4 Enabling Change History
&lt;/h2&gt;

&lt;p&gt;:::info Commercial Plugin&lt;br&gt;
"&lt;a href="https://docs.nocobase.com/record-history/" rel="noopener noreferrer"&gt;Record History&lt;/a&gt;" is included in the NocoBase &lt;a href="https://www.nocobase.com/en/commercial" rel="noopener noreferrer"&gt;Professional edition&lt;/a&gt; and requires a commercial license. If you're using the Community edition, feel free to skip this section — it won't affect later chapters.&lt;br&gt;
:::&lt;/p&gt;

&lt;p&gt;One of the most important aspects of a ticket system: &lt;strong&gt;who changed what and when must be traceable&lt;/strong&gt;. NocoBase's "Record History" plugin automatically logs every data change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring Change History
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings -&amp;gt; Plugin manager&lt;/strong&gt; and make sure the "Record History" plugin is enabled.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F68d8r6cirb3pzyb3st1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F68d8r6cirb3pzyb3st1b.png" alt="04-forms-and-details-2026-03-13-18-22-44" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter the plugin configuration page and click &lt;strong&gt;"Add collection"&lt;/strong&gt;, then select &lt;strong&gt;"Tickets"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose which fields to track: &lt;strong&gt;Title, Status, Priority, Assignee, Description&lt;/strong&gt;, etc.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvp9upmkbgwse9f2vyfog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvp9upmkbgwse9f2vyfog.png" alt="04-forms-and-details-2026-03-13-18-25-11" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: You don't need to track every field. Fields like ID and Created at that are never manually changed don't need to be tracked. Only record changes to fields that matter for the business.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Back in the settings, click &lt;strong&gt;"Sync history data snapshot"&lt;/strong&gt;. The plugin will automatically create an initial history record for all existing tickets. Every subsequent change will add a new history entry.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgi8i1rcj7uibsh2ndq77.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgi8i1rcj7uibsh2ndq77.png" alt="04-forms-and-details-2026-03-13-18-27-01" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sfvewnlx0pw3yv5cquu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sfvewnlx0pw3yv5cquu.png" alt="04-forms-and-details-2026-03-13-18-28-50" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Viewing History in the Details Page
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go back to the ticket details Drawer (click the "View" button on a table row).&lt;/li&gt;
&lt;li&gt;In the Drawer, click &lt;strong&gt;"Add block" -&amp;gt; Record History&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"Current collection"&lt;/strong&gt; and choose &lt;strong&gt;"Current record"&lt;/strong&gt; as the data source.&lt;/li&gt;
&lt;li&gt;A timeline will appear at the bottom of the details page, clearly showing every change: who changed which field from what value to what value, and when.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe55n7h1amynjthohlk9b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe55n7h1amynjthohlk9b.png" alt="04-forms-and-details-2026-03-13-18-31-45" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhg6fgehe07l5pw0wbaxp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhg6fgehe07l5pw0wbaxp.gif" alt="04-forms-and-details-2026-03-13-18-33-00" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This way, even if a ticket passes through multiple people, every change is crystal clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;In this chapter, we completed the full data lifecycle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Form&lt;/strong&gt; — Users can submit new tickets with default values and validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linkage rules&lt;/strong&gt; — Urgent tickets automatically require a description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Details block&lt;/strong&gt; — Clearly displays a ticket's complete information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://docs.nocobase.com/collection-templates/audit-log" rel="noopener noreferrer"&gt;Change history&lt;/a&gt;&lt;/strong&gt; — Automatically tracks every modification for worry-free auditing (commercial plugin, optional)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From "visible" to "enterable" to "traceable" — our ticket system now has basic usability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/interface-builder/blocks/data-blocks/form" rel="noopener noreferrer"&gt;Form Block&lt;/a&gt; — Form block configuration guide&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/interface-builder/blocks/data-blocks/details" rel="noopener noreferrer"&gt;Details Block&lt;/a&gt; — Details block setup&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/interface-builder/linkage-rules" rel="noopener noreferrer"&gt;Linkage Rules&lt;/a&gt; — Field linkage configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  About NocoBase
&lt;/h3&gt;

&lt;p&gt;NocoBase is the most extensible AI-powered no-code platform.&lt;br&gt;
Total control. Infinite extensibility. AI collaboration.&lt;br&gt;
Enable your team to adapt quickly and cut costs dramatically.&lt;br&gt;
No years of development. No millions wasted.&lt;br&gt;
Deploy NocoBase in minutes — and take control of everything.&lt;/p&gt;

&lt;p&gt;Discover NocoBase in 3 Minutes!&lt;/p&gt;

&lt;h3&gt;
  
  
  👇 Get NocoBase
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;Homepage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.nocobase.com/new" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://v2.docs.nocobase.com/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>nocode</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>NocoBase 2.0 Beginner Tutorial - Chapter 3: Building Pages</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Sun, 22 Mar 2026 09:07:44 +0000</pubDate>
      <link>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-3-building-pages-388d</link>
      <guid>https://forem.com/nocobase/nocobase-20-beginner-tutorial-chapter-3-building-pages-388d</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://docs.nocobase.com/tutorials/v2/03-building-pages" rel="noopener noreferrer"&gt;https://docs.nocobase.com/tutorials/v2/03-building-pages&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Chapter 3: Building Pages — From Blank to Functional
&lt;/h1&gt;

&lt;p&gt;In the last chapter, we built the skeleton of our data tables — but right now the data only lives in the "backend." Users can't see it at all. In this chapter, we'll bring our data &lt;strong&gt;front and center&lt;/strong&gt;: create a &lt;a href="https://docs.nocobase.com/interface-builder/blocks/data-blocks/table" rel="noopener noreferrer"&gt;Table block&lt;/a&gt; to display ticket data, configure field visibility, sorting, &lt;a href="https://docs.nocobase.com/interface-builder/blocks/filter-blocks/form" rel="noopener noreferrer"&gt;filtering&lt;/a&gt;, and pagination, turning it into a real, usable ticket list.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.1 What Is a Block
&lt;/h2&gt;

&lt;p&gt;In NocoBase, a &lt;strong&gt;Block&lt;/strong&gt; is a building brick on a page. Want to show a table? Drop in a Table block. Need a form? Add a Form block. A single page can freely combine multiple blocks, and you can drag and drop to rearrange the layout.&lt;/p&gt;

&lt;p&gt;Common block types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Table&lt;/td&gt;
&lt;td&gt;Displays multiple records in rows and columns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Form&lt;/td&gt;
&lt;td&gt;Lets users input or edit data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Details&lt;/td&gt;
&lt;td&gt;Shows the full information of a single record&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filter Form&lt;/td&gt;
&lt;td&gt;Provides filter criteria to narrow down data in other blocks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chart&lt;/td&gt;
&lt;td&gt;Pie charts, line charts, and other visualizations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;A section of custom text or instructions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Remember this analogy: &lt;strong&gt;Blocks = building bricks&lt;/strong&gt;. We're about to use them to assemble our tickets page.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.2 Adding a Menu and Pages
&lt;/h2&gt;

&lt;p&gt;First, we need to create an entry point for "Tickets" in the system.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;&lt;a href="https://docs.nocobase.com/get-started/how-nocobase-works" rel="noopener noreferrer"&gt;UI Editor&lt;/a&gt;&lt;/strong&gt; toggle in the top-right corner to enter design mode (the entire page will show orange editable borders).&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;"Add menu item"&lt;/strong&gt; button (&lt;code&gt;+&lt;/code&gt; icon) in the top navigation bar, select &lt;strong&gt;"Add group"&lt;/strong&gt;, and name it &lt;strong&gt;"Tickets"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The "Tickets" &lt;a href="https://docs.nocobase.com/interface-builder/menus" rel="noopener noreferrer"&gt;menu&lt;/a&gt; appears immediately in the top navigation bar. &lt;strong&gt;Click on it&lt;/strong&gt; — a sidebar menu will expand on the left.&lt;/li&gt;
&lt;li&gt;In the sidebar, click the orange &lt;strong&gt;"Add menu item"&lt;/strong&gt; button, select &lt;strong&gt;"Modern page (v2)"&lt;/strong&gt;, and add two sub-&lt;a href="https://docs.nocobase.com/interface-builder/pages" rel="noopener noreferrer"&gt;pages&lt;/a&gt; one by one:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;All Tickets&lt;/strong&gt; — displays all tickets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categories&lt;/strong&gt; — manages category data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmyw8hrm8lrn3mwt5ldz0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmyw8hrm8lrn3mwt5ldz0.png" alt="03-building-pages-2026-03-12-09-38-36" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwnsk4n9tac7dcfyvf0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpwnsk4n9tac7dcfyvf0e.png" alt="03-building-pages-2026-03-12-09-41-26" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You'll see both "Classic page (v1)" and "Modern page (v2)" options. This tutorial uses &lt;strong&gt;v2&lt;/strong&gt; throughout.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3.3 Adding a Table Block
&lt;/h2&gt;

&lt;p&gt;Now go to the "All Tickets" page and add a Table block:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the blank page, click &lt;strong&gt;"Add block"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Data blocks -&amp;gt; Table&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;a href="https://docs.nocobase.com/data-sources/main/collection" rel="noopener noreferrer"&gt;collection&lt;/a&gt; list that pops up, select &lt;strong&gt;"Tickets"&lt;/strong&gt; (the table we created in the last chapter).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyu2comcwi1a5tt6sei0p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyu2comcwi1a5tt6sei0p.png" alt="03-building-pages-2026-03-13-08-44-07" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the Table block is added, you'll see an empty table on the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe6ou3bor15s54bikd1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe6ou3bor15s54bikd1k.png" alt="03-building-pages-2026-03-13-08-44-29" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An empty table with no data isn't very useful for testing. Let's quickly add an "Add new" button so we can enter some test data:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;"Configure actions"&lt;/strong&gt; in the top-right corner of the table, and check &lt;strong&gt;"Add new"&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77x5ysdtgt2qof3p4fr8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F77x5ysdtgt2qof3p4fr8.png" alt="03-building-pages-2026-03-17-14-58-39" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the new &lt;strong&gt;"Add new"&lt;/strong&gt; button, then in the popup select &lt;strong&gt;Add block → Form (Add New) → Current collection&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzc4is0yny3ulmdvhdytk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzc4is0yny3ulmdvhdytk.png" alt="03-building-pages-2026-03-17-14-59-42" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the popup, click &lt;strong&gt;"Configure fields"&lt;/strong&gt; and check the fields you need (Title, Status, Priority, etc.); click &lt;strong&gt;"Configure actions"&lt;/strong&gt; and enable the &lt;strong&gt;"Submit"&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0or6jo7rziispvm9x8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi0or6jo7rziispvm9x8t.png" alt="03-building-pages-2026-03-17-15-00-54" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58vukhnfp9r99jxpum5r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58vukhnfp9r99jxpum5r.png" alt="03-building-pages-2026-03-17-15-01-49" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fill in a few test tickets and submit — you'll see the data appear in the table.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zh76zsenvzzsfqwlgi2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2zh76zsenvzzsfqwlgi2.png" alt="03-building-pages-2026-03-17-15-03-04" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We'll cover form configuration in detail (field linkage, edit forms, detail popups, etc.) in &lt;a href="https://docs.nocobase.com/tutorials/v2/04-forms-and-details/" rel="noopener noreferrer"&gt;Chapter 4&lt;/a&gt;. For now, just being able to enter data is enough.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3.4 Configuring Display Columns
&lt;/h2&gt;

&lt;p&gt;By default, a table won't automatically show all &lt;a href="https://docs.nocobase.com/data-sources/field" rel="noopener noreferrer"&gt;fields&lt;/a&gt;. We need to manually choose which columns to display:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the right side of the Table block header, click &lt;strong&gt;"Fields"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check the fields you want to show:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Title&lt;/strong&gt; — the ticket subject, visible at a glance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status&lt;/strong&gt; — current processing progress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority&lt;/strong&gt; — urgency level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category&lt;/strong&gt; — a relation field that will display the category name&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submitter&lt;/strong&gt; — who submitted the ticket&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assignee&lt;/strong&gt; — who is responsible&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fields you don't need to display (like ID or Created at) can be left unchecked to keep the table clean.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vmgzijzm1hnk7aufi7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vmgzijzm1hnk7aufi7c.png" alt="03-building-pages-2026-03-13-08-47-18" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: You can drag and drop to reorder the displayed fields. Put the most important ones — "Title" and "Status" — up front so key information is visible at a glance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Relation Fields Showing IDs
&lt;/h3&gt;

&lt;p&gt;After enabling "Category," you'll notice the table shows category IDs (numbers) instead of names. That's because relation fields default to using ID as the title field. Two ways to fix this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A: Change it in the column settings (current table only)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click the column settings for the "Category" column and find &lt;strong&gt;"Title field"&lt;/strong&gt;. Change it from ID to &lt;strong&gt;Name&lt;/strong&gt;. This only affects the current Table block.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5x51kqdn7pgnadew8pk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5x51kqdn7pgnadew8pk.png" alt="03-building-pages-2026-03-13-09-23-03" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7g0nwv0waeo4nzpi12qd.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7g0nwv0waeo4nzpi12qd.gif" alt="03-building-pages-2026-03-13-09-24-44" width="1822" height="1138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B: Change it in the data source (global, recommended)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;Settings -&amp;gt; &lt;a href="https://docs.nocobase.com/data-sources" rel="noopener noreferrer"&gt;Data sources&lt;/a&gt; -&amp;gt; Collections -&amp;gt; Categories&lt;/strong&gt;, and change the &lt;strong&gt;"Title field"&lt;/strong&gt; to &lt;strong&gt;Name&lt;/strong&gt;. All blocks referencing the Categories collection will then display names by default. After the change, you'll need to re-add the field on the page for it to take effect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmiu55sjfatjo01o6qgqg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmiu55sjfatjo01o6qgqg.png" alt="03-building-pages-2026-03-13-09-23-41" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3.5 Adding Filtering and Sorting
&lt;/h2&gt;

&lt;p&gt;As tickets pile up, we'll need to quickly find specific ones. NocoBase provides several ways to filter data — let's start with the most common: the &lt;strong&gt;Filter Form block&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding a Filter Form
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;On the All Tickets page, click &lt;strong&gt;"Add block"&lt;/strong&gt; and select &lt;strong&gt;Filter blocks -&amp;gt; Filter form&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In v2 pages, there's no collection selection step — the Filter form is added directly to the page.&lt;/li&gt;
&lt;li&gt;In the Filter form, click &lt;strong&gt;"Fields"&lt;/strong&gt;. A list of all filterable data blocks on the current page will appear, e.g., &lt;code&gt;Table: Tickets #c48b&lt;/code&gt; (the code after &lt;code&gt;#&lt;/code&gt; is the block's UID, useful for distinguishing multiple blocks from the same collection).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gkbpsgy0g3ix4w6tvmf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gkbpsgy0g3ix4w6tvmf.png" alt="03-building-pages-2026-03-13-08-48-37" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hover over a block name to expand its list of filterable fields. Click to add them: &lt;strong&gt;Status&lt;/strong&gt;, &lt;strong&gt;Priority&lt;/strong&gt;, &lt;strong&gt;Category&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mdxke6z93wpvyzcogdm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mdxke6z93wpvyzcogdm.png" alt="03-building-pages-2026-03-13-09-25-44" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once added, users can type filter criteria and the table data will &lt;strong&gt;update automatically in real time&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79wo1mra42jh5oxluxft.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79wo1mra42jh5oxluxft.gif" alt="03-building-pages-2026-03-13-09-27-23" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Field Fuzzy Search
&lt;/h3&gt;

&lt;p&gt;What if you want a single search box to match across multiple fields at once?&lt;/p&gt;

&lt;p&gt;Click the settings icon in the top-right corner of a search field and you'll see &lt;strong&gt;"Connect fields"&lt;/strong&gt;. It lists all searchable fields from each block on the page — by default, only "Title" is connected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj3odcr9nqitidyj43x3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmj3odcr9nqitidyj43x3.png" alt="03-building-pages-2026-03-13-09-30-06" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select additional fields like &lt;strong&gt;Description&lt;/strong&gt; so that a keyword search matches all of them simultaneously.&lt;/p&gt;

&lt;p&gt;You can even search through relation fields — click "Category," then in the next level check "Category Name." Now searches will also match against category names.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3cg2oi88k92x71ueas85.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3cg2oi88k92x71ueas85.png" alt="03-building-pages-2026-03-13-09-31-35" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbr4uh55jlckcjpckuwf0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbr4uh55jlckcjpckuwf0.png" alt="03-building-pages-2026-03-13-09-32-20" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Connect fields is powerful&lt;/strong&gt;: it works across multiple blocks and multiple fields. If your page has several data blocks, try adding more and experiment!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Don't Want Auto-Filtering?
&lt;/h3&gt;

&lt;p&gt;If you'd prefer users to click a button before filtering takes effect, click &lt;strong&gt;"&lt;a href="https://docs.nocobase.com/interface-builder/actions" rel="noopener noreferrer"&gt;Actions&lt;/a&gt;"&lt;/strong&gt; at the bottom-right of the Filter form and enable the &lt;strong&gt;"Filter"&lt;/strong&gt; and &lt;strong&gt;"Reset"&lt;/strong&gt; buttons. Users will then need to click "Filter" to apply their criteria.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1y4kqvekv8fu9mg6m7me.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1y4kqvekv8fu9mg6m7me.png" alt="03-building-pages-2026-03-13-09-33-15" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Alternative: The Table's Built-in Filter Action
&lt;/h3&gt;

&lt;p&gt;Besides a dedicated Filter Form block, the Table block itself has a built-in &lt;strong&gt;"Filter"&lt;/strong&gt; action. Click &lt;strong&gt;"Actions"&lt;/strong&gt; above the Table block and enable &lt;strong&gt;"Filter"&lt;/strong&gt;. A filter button will appear in the table toolbar. Clicking it opens a condition panel where users can filter data by field values directly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt6a66bmmfak7qn8qveh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftt6a66bmmfak7qn8qveh.png" alt="03-building-pages-2026-03-13-09-34-25" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmijab2db9xk3i9p6t76.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmijab2db9xk3i9p6t76.png" alt="03-building-pages-2026-03-13-09-36-09" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't want users to hunt for fields every time they open the filter, you can pre-configure default filter fields in the Filter button's settings — so the most common criteria are ready to use right away.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2akxzwhtx5tjvnaa7nnd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2akxzwhtx5tjvnaa7nnd.png" alt="03-building-pages-2026-03-13-09-38-37" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: The table's built-in Filter action currently &lt;strong&gt;does not support fuzzy search&lt;/strong&gt; — it only handles exact matches and condition-based filtering. If you need fuzzy search, use the Filter Form block with "Connect fields" described above.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Setting Default Sorting
&lt;/h3&gt;

&lt;p&gt;We want the newest tickets to appear at the top:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click the &lt;strong&gt;block settings&lt;/strong&gt; icon (three-line icon) in the top-right corner of the Table block.&lt;/li&gt;
&lt;li&gt;Find &lt;strong&gt;"Set default sorting rules"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add a sort field: select &lt;strong&gt;Created at&lt;/strong&gt;, set the order to &lt;strong&gt;Descending&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakui9fljjw889d39ihzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fakui9fljjw889d39ihzd.png" alt="03-building-pages-2026-03-13-09-40-54" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This way, newly submitted tickets always appear at the top, making them easier to handle.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.6 Configuring Row Actions
&lt;/h2&gt;

&lt;p&gt;Viewing a list isn't enough — we also need to click into tickets to see details and make edits.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the actions column, click the second "+" icon.&lt;/li&gt;
&lt;li&gt;Click to add actions: &lt;strong&gt;View&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://docs.nocobase.com/interface-builder/actions/edit" rel="noopener noreferrer"&gt;Edit&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://docs.nocobase.com/interface-builder/actions/delete" rel="noopener noreferrer"&gt;Delete&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Each row will now have "View", "Edit", and "Delete" buttons in the actions column.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2t4emvhwyr6bofnwd5ly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2t4emvhwyr6bofnwd5ly.png" alt="03-building-pages-2026-03-13-09-42-42" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking the "View" or "Edit" button opens a Drawer where we can place blocks to show or edit the full record. We'll configure that in detail in the next chapter. Clicking "Delete" removes the row.&lt;/p&gt;

&lt;h2&gt;
  
  
  3.7 Adjusting Page Layout
&lt;/h2&gt;

&lt;p&gt;By now the page has both a Filter Form and a Table block, but they're stacked vertically by default — which may not look great. NocoBase lets you &lt;strong&gt;drag and drop&lt;/strong&gt; to rearrange blocks.&lt;/p&gt;

&lt;p&gt;In design mode, hover over the drag handle at the top-left corner of a block (the cursor will change to a crosshair), then hold and drag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drag the Filter Form above the Table&lt;/strong&gt;: Grab the Filter Form block and move it toward the top edge of the Table block. When a blue guide line appears, release — the Filter Form will snap into place above the Table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drag filter fields onto the same row&lt;/strong&gt;: Inside the Filter Form, fields are stacked vertically by default. Drag "Priority" to the right of "Status" — when a vertical guide line appears, release. The two fields will sit side by side on one row, saving vertical space.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Almost everything in NocoBase supports drag-and-drop — action buttons, table columns, menu items, and more. Feel free to explore!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3.8 Configuring the Categories Page
&lt;/h2&gt;

&lt;p&gt;Don't forget — we created a "Categories" sub-page back in section 3.2. Now let's add content to it. The setup is similar to the ticket list — add a Table block, check fields, configure actions — so we won't repeat every step. Just one key difference.&lt;/p&gt;

&lt;p&gt;Remember the "Categories" collection we created in Chapter 2? It's a &lt;strong&gt;tree table&lt;/strong&gt; (supports parent-child hierarchy). To display the tree structure correctly, you need to enable a setting:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the "Categories" page and add a Table block, selecting the "Categories" collection.&lt;/li&gt;
&lt;li&gt;Click the Table block's &lt;strong&gt;block settings&lt;/strong&gt; (three-line icon), find &lt;strong&gt;"Tree table"&lt;/strong&gt;, and toggle it on.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once enabled, the table will display categories in an indented hierarchy showing parent-child relationships, instead of listing all records flat.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check the fields you want to display (e.g., Name, Description), and configure row actions (&lt;a href="https://docs.nocobase.com/interface-builder/actions/add-new" rel="noopener noreferrer"&gt;Add new&lt;/a&gt;, Edit, Delete).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layout tip&lt;/strong&gt;: Put "Name" in the first column and "Actions" in the second. The categories table doesn't have many fields, so a two-column layout is more compact and user-friendly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;[Screenshot: Categories tree table configured]&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Congratulations! Our ticket system now has a proper &lt;strong&gt;management interface&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clear menu structure (Tickets -&amp;gt; All Tickets / Categories)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Table block&lt;/strong&gt; displaying ticket data&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Filter Form&lt;/strong&gt; for quick filtering by status, priority, and category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sorting rules&lt;/strong&gt; that order tickets by creation time, newest first&lt;/li&gt;
&lt;li&gt;Row action buttons for convenient viewing and editing&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;tree table&lt;/strong&gt; displaying category hierarchy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Easier than you expected, right? The entire process required zero lines of code — everything was done through drag-and-drop and configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Chapter Preview
&lt;/h2&gt;

&lt;p&gt;Being able to "see" data isn't enough — users also need to &lt;strong&gt;submit new tickets&lt;/strong&gt;. In the next chapter, we'll build Form blocks, configure field linkage rules, and enable change history to track every modification to a ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/interface-builder/blocks" rel="noopener noreferrer"&gt;Blocks Overview&lt;/a&gt; — All block types explained&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/interface-builder/blocks/data-blocks/table" rel="noopener noreferrer"&gt;Table Block&lt;/a&gt; — Table block configuration guide&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.nocobase.com/interface-builder/blocks/filter-blocks/form" rel="noopener noreferrer"&gt;Filter Block&lt;/a&gt; — Filter form setup&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  About NocoBase
&lt;/h3&gt;

&lt;p&gt;NocoBase is the most extensible AI-powered no-code platform.&lt;br&gt;
Total control. Infinite extensibility. AI collaboration.&lt;br&gt;
Enable your team to adapt quickly and cut costs dramatically.&lt;br&gt;
No years of development. No millions wasted.&lt;br&gt;
Deploy NocoBase in minutes — and take control of everything.&lt;/p&gt;

&lt;p&gt;Discover NocoBase in 3 Minutes!&lt;/p&gt;

&lt;h3&gt;
  
  
  👇 Get NocoBase
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;Homepage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://demo.nocobase.com/new" rel="noopener noreferrer"&gt;Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://v2.docs.nocobase.com/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>nocode</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Open Source Project Management Tool Selection Guide, 2026 Edition</title>
      <dc:creator>NocoBase</dc:creator>
      <pubDate>Sat, 21 Mar 2026 17:39:53 +0000</pubDate>
      <link>https://forem.com/nocobase/open-source-project-management-tool-selection-guide-2026-edition-4go5</link>
      <guid>https://forem.com/nocobase/open-source-project-management-tool-selection-guide-2026-edition-4go5</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://www.nocobase.com/en/blog/open-source-project-management-tool-selection-guide-2026-edition" rel="noopener noreferrer"&gt;https://www.nocobase.com/en/blog/open-source-project-management-tool-selection-guide-2026-edition&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many teams first start looking for an open source project management tool because they want to &lt;a href="https://www.nocobase.com/en/blog/jira-open-source-alternatives" rel="noopener noreferrer"&gt;move away from Jira and find an alternative&lt;/a&gt;. But &lt;a href="https://www.reddit.com/r/selfhosted/comments/1omw77i/finally_ditching_jira_what_should_we_migrate_to/" rel="noopener noreferrer"&gt;discussions on Reddit&lt;/a&gt; show that as teams go deeper into the evaluation process, most of them want a tool mature enough to cover core capabilities such as sprints, dependencies, and time tracking. At the same time, teams are paying increasing attention to data ownership, self-hosting, and the long-term cost of configuration and maintenance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnya43ogbsrdwe06mu2ev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnya43ogbsrdwe06mu2ev.png" alt="Jira.png" width="584" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As AI has advanced rapidly over the past two years, project management software has gradually started to introduce AI capabilities as well. As a result, the logic for evaluating open source project management tools has changed. Today, the comparison is no longer only about features, deployment, and cost. AI has also become a new evaluation dimension.&lt;/p&gt;

&lt;p&gt;💡Read more: &lt;a href="https://www.nocobase.com/en/blog/5-most-popular-open-source-ai-project-management-tools-on-github" rel="noopener noreferrer"&gt;The 5 Most Popular Open Source AI Project Management Tools on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So in the following guide, we will compare these two types of tools across several dimensions, including product positioning, out-of-the-box usability, core project management capabilities, fit with development workflows, business adaptability and customization, and AI capabilities.&lt;/p&gt;




&lt;p&gt;💬 Hey, you're reading the NocoBase blog. NocoBase is the most extensible AI-powered no-code/low-code development platform for building enterprise applications, internal tools, and all kinds of systems. It’s fully self-hosted, plugin-based, and developer-friendly. →&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt; Explore NocoBase on GitHub&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Today’s open source project management tools can generally be divided into two categories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One category is standard project management software, represented by products such as OpenProject, Plane, and Taiga.&lt;/li&gt;
&lt;li&gt;The other category is customizable business platforms, represented by products such as NocoBase, Appsmith, and Budibase.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉Before getting into the detailed analysis, you can first use the table below to get a quick overview of how these tools differ.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Tool Type&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Main Features&lt;/th&gt;
&lt;th&gt;Best-Fit Scenarios&lt;/th&gt;
&lt;th&gt;AI Direction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NocoBase&lt;/td&gt;
&lt;td&gt;Customizable business platform&lt;/td&gt;
&lt;td&gt;All kinds of teams, from lightweight tools to complex business systems&lt;/td&gt;
&lt;td&gt;Plugin-based and data-model-driven, suitable as a system foundation&lt;/td&gt;
&lt;td&gt;Multi-system integration, cross-department workflows, system-level project management&lt;/td&gt;
&lt;td&gt;AI inside business systems, with support for AI employees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Appsmith&lt;/td&gt;
&lt;td&gt;Customizable business platform&lt;/td&gt;
&lt;td&gt;Technical teams and internal tool building scenarios&lt;/td&gt;
&lt;td&gt;Better suited for quickly building internal tools, admin panels, and data dashboards&lt;/td&gt;
&lt;td&gt;Internal tools, admin panels, and supporting systems for project work&lt;/td&gt;
&lt;td&gt;Bringing AI into internal tools and data systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budibase&lt;/td&gt;
&lt;td&gt;Customizable business platform&lt;/td&gt;
&lt;td&gt;Small to medium-sized teams and process-oriented business scenarios&lt;/td&gt;
&lt;td&gt;Strong in forms, workflows, approvals, and data-driven applications&lt;/td&gt;
&lt;td&gt;Service requests, approval routing, and process-oriented project management&lt;/td&gt;
&lt;td&gt;More focused on AI in workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenProject&lt;/td&gt;
&lt;td&gt;Standard project management software&lt;/td&gt;
&lt;td&gt;Medium to large teams and enterprise project management scenarios&lt;/td&gt;
&lt;td&gt;A complete project management loop, strong planning capabilities, and more structured processes&lt;/td&gt;
&lt;td&gt;Enterprise project management, client delivery, and cross-department collaboration&lt;/td&gt;
&lt;td&gt;Supportive AI, focused on reports, suggestions, and document handling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plane&lt;/td&gt;
&lt;td&gt;Standard project management software&lt;/td&gt;
&lt;td&gt;Development teams and product development collaboration&lt;/td&gt;
&lt;td&gt;More modern, closer to issues, iterations, and development collaboration workflows&lt;/td&gt;
&lt;td&gt;Jira replacement, development collaboration, and agile iteration&lt;/td&gt;
&lt;td&gt;More focused on AI-native collaboration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Taiga&lt;/td&gt;
&lt;td&gt;Standard project management software&lt;/td&gt;
&lt;td&gt;Small and medium-sized teams and agile development scenarios&lt;/td&gt;
&lt;td&gt;More lightweight, with a simple and intuitive Agile collaboration experience&lt;/td&gt;
&lt;td&gt;Scrum, Kanban, and lightweight agile management&lt;/td&gt;
&lt;td&gt;Relatively conservative AI capabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  NocoBase
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fba60cloetap1turws6re.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fba60cloetap1turws6re.png" alt="NocoBase1.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Link&lt;/strong&gt;：&lt;a href="https://github.com/nocobase/nocobase" rel="noopener noreferrer"&gt;https://github.com/nocobase/nocobase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;：22k&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official Website&lt;/strong&gt;：&lt;a href="https://www.nocobase.com/" rel="noopener noreferrer"&gt;https://www.nocobase.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;：&lt;a href="https://docs.nocobase.com/" rel="noopener noreferrer"&gt;https://docs.nocobase.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎉 NocoBase has recently launched its &lt;a href="https://www.nocobase.com/en/solutions/project-management" rel="noopener noreferrer"&gt;Project Management Solution&lt;/a&gt;, which is open source, fully controllable, and highly extensible and customizable. Feel free to try it out.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Product Direction and Target Users
&lt;/h3&gt;

&lt;p&gt;NocoBase is an AI-driven open source no-code development platform. It is especially suitable for teams that need to build enterprise applications, internal tools, and various business systems. NocoBase provides native AI capabilities in the form of AI employees. Enterprises can configure different AI employees for different scenarios based on their own business needs, allowing them to take on clearly defined tasks within specific workflows. NocoBase is suitable not only for medium and large organizations, enterprise IT teams, outsourcing integrators, and teams undergoing digital transformation, but also for small teams and even solo operators. It is relatively easy to get started with while still offering a high degree of customization. This means it can be used both to quickly build lightweight tools and to gradually evolve into more complex business systems. Typical use cases include enterprise management systems, internal tools, business process automation, customer portals, data analytics platforms, and customized project management scenarios that need to connect project management with approvals, ticketing, customers, delivery, and other workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Out-of-the-Box Usability
&lt;/h3&gt;

&lt;p&gt;NocoBase works differently from standard PM tools in terms of out-of-the-box usability. Instead of providing a fixed project management structure, it offers capabilities such as data tables, forms, kanban boards, calendars, charts, and workflows, allowing teams to quickly build systems based on their own business structure. At the same time, the official team also provides a project management solution with one-click deployment, which preserves room for customization while making it easier to get started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcv8cdyq9e2tpsudkld4x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcv8cdyq9e2tpsudkld4x.png" alt="NocoBase2.png" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Core Project Management Loop Capabilities
&lt;/h3&gt;

&lt;p&gt;From a project management perspective, NocoBase already includes the foundational modules needed to build task management, kanban boards, calendars, form input, data dashboards, and workflow automation. Its key characteristic is that it breaks project management down into data models, blocks, actions, and workflows, which can then be freely combined based on the team’s needs. This makes it especially suitable for scenarios where project workflows and business workflows are naturally intertwined.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fssk63711t1zr1m84kak5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fssk63711t1zr1m84kak5.png" alt="NocoBase3.png" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fit with Development Workflows
&lt;/h3&gt;

&lt;p&gt;NocoBase is positioned as the foundation for enterprise business systems. It does not take backlog management, code hosting, or PR/MR workflows as its core selling points, but it supports REST APIs, GraphQL, webhooks, as well as extensible plugins and workflow nodes. As a result, it is more suitable as a system layer outside development itself, or between development and business collaboration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxfq7epks83cyr2m6mdb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxfq7epks83cyr2m6mdb.png" alt="NocoBase4.png" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Business Adaptability and Customization
&lt;/h3&gt;

&lt;p&gt;This is one of NocoBase’s core strengths. NocoBase adopts a data-model-driven architecture that emphasizes the data model first and decouples the UI from the data structure. It then extends fields, blocks, workflows, permissions, and integration capabilities through a plugin-based microkernel architecture. This makes it especially suitable for building complex business systems that require long-term iteration, such as CRM, ERP, OA, HRM, ticketing systems, approval systems, customer portals, and project management systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvichh79x1v7iza0doy5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvichh79x1v7iza0doy5w.png" alt="NocoBase5.png" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. AI Capabilities and Highlights
&lt;/h3&gt;

&lt;p&gt;NocoBase’s AI is not an add-on chat feature. Instead, it is natively integrated into the business system in the form of AI employees. It can understand the current page, selected data rows, and table structure, and can directly participate in practical actions such as querying databases, filling in forms, and updating data. In addition to capabilities such as knowledge bases, conversational memory, and role-based behavior, enterprises can define the responsibilities of AI employees according to their own business workflows, allowing them to take on clear tasks in scenarios such as customer service, sales, data analysis, content handling, and operational collaboration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cuo2mignvcvigbrgpq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cuo2mignvcvigbrgpq6.png" alt="NocoBase6.png" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Appsmith
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5htdwkdl87cp6p3s25a8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5htdwkdl87cp6p3s25a8.png" alt="Appsmith1.png" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Link&lt;/strong&gt;：&lt;a href="https://github.com/appsmithorg/appsmith" rel="noopener noreferrer"&gt;https://github.com/appsmithorg/appsmith&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;：39.4k&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official Website&lt;/strong&gt;：&lt;a href="https://www.appsmith.com/" rel="noopener noreferrer"&gt;https://www.appsmith.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;：&lt;a href="https://docs.appsmith.com/" rel="noopener noreferrer"&gt;https://docs.appsmith.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Product Direction and Target Users
&lt;/h3&gt;

&lt;p&gt;Appsmith is an open source low-code application platform suitable for technical teams, business systems teams, and organizations that need to deliver internal applications quickly. It allows teams to build applications that match their own workflows at relatively low cost. Typical scenarios include admin panels, operations backends, customer service dashboards, data dashboards, process tools, and custom business systems extended from project management needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Out-of-the-Box Usability
&lt;/h3&gt;

&lt;p&gt;Appsmith is not really an out-of-the-box product, because what it provides by default is the ability to build applications rather than a complete project management structure. It is better suited for teams that already know what kind of system they want to build and want to use ready-made components, database connections, and JavaScript logic to quickly create internal tools. As a result, the learning curve depends more on how clearly the team understands its own business processes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Core Project Management Loop Capabilities
&lt;/h3&gt;

&lt;p&gt;If a team simply wants a ready-made and mature end-to-end project management workflow, Appsmith is not the most direct choice. But if the team wants to define pages, forms, data, and interaction logic around its own project workflow, Appsmith becomes a more flexible option.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fit with Development Workflows
&lt;/h3&gt;

&lt;p&gt;Appsmith is developer-friendly, but this friendliness is mainly reflected in how it helps development teams build tools faster. The official platform emphasizes that it can connect to a variety of databases and any API, and it also supports native Git. This makes it more suitable as a platform for building supporting tools, backend systems, or operations panels for development teams.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmi32mue2qyg1hx1g58vv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmi32mue2qyg1hx1g58vv.png" alt="Appsmith2.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Business Adaptability and Customization
&lt;/h3&gt;

&lt;p&gt;This is one of Appsmith’s strengths. It supports connections to 25+ databases and any API, and it also supports custom JavaScript logic. The official website provides project management solution examples showing how teams can build project management tools based on its low-code capabilities, including task management, progress tracking, and team collaboration.&lt;/p&gt;

&lt;p&gt;💡Read more: &lt;a href="https://www.appsmith.com/use-case/project-management-tool" rel="noopener noreferrer"&gt;Build Your Project Management Tool Easily&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. AI Capabilities and Highlights
&lt;/h3&gt;

&lt;p&gt;Appsmith supports AI data sources, allowing developers to directly call models within applications for tasks such as text generation and sentiment analysis. It can also connect enterprise documents for knowledge-base-based Q&amp;amp;A, enabling AI to respond with business context. In addition, Appsmith is strengthening its Agents and workflow capabilities so that AI can do more than just answer questions. It can also trigger processes, handle tasks, or generate results by working with databases, APIs, and existing systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggv08pouloxr30i4tf90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggv08pouloxr30i4tf90.png" alt="Appsmith3.png" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Budibase
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kfckoxegtwc2cz57uu8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1kfckoxegtwc2cz57uu8.png" alt="Budibase1.png" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Link&lt;/strong&gt;：&lt;a href="https://github.com/Budibase/budibase" rel="noopener noreferrer"&gt;https://github.com/Budibase/budibase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;：27.7k&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official Website&lt;/strong&gt;：&lt;a href="https://budibase.com/" rel="noopener noreferrer"&gt;https://budibase.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;：&lt;a href="https://docs.budibase.com/" rel="noopener noreferrer"&gt;https://docs.budibase.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Product Direction and Target Users
&lt;/h3&gt;

&lt;p&gt;Budibase is an open source low-code platform for organizations that want to build custom systems on top of existing data, APIs, and workflows. It is not a standard project management tool designed for lightweight task collaboration. Instead, it is better suited for internal tools, service request systems, data-driven business applications, and customized project management scenarios that combine forms, workflows, permissions, and automation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hbz6i41db5wjabje3ye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hbz6i41db5wjabje3ye.png" alt="Budibase2.png" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Out-of-the-Box Usability
&lt;/h3&gt;

&lt;p&gt;From a project management software perspective, Budibase is not the kind of product you can install and immediately start using for sprints, Gantt charts, and dependency management. It is more like a development platform that is good at quickly generating CRUD applications, forms, backend pages, and automated workflows through visual configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Core Project Management Loop Capabilities
&lt;/h3&gt;

&lt;p&gt;Budibase is stronger at quickly combining tasks, forms, approvals, status flows, and automation into a usable internal application. It is suitable for project management scenarios where the process is relatively clear and the structure is relatively fixed.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fit with Development Workflows
&lt;/h3&gt;

&lt;p&gt;Budibase is better suited to serving the processes and tool needs around development teams rather than directly acting as the primary collaboration platform for development work. It can be used to build systems such as request submission, approvals, test records, and internal backends, but it is not particularly strong in backlog management, iteration planning, code linkage, or end-to-end development collaboration. So it is more suitable as a supplementary tool than as the main development project management system.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Business Adaptability and Customization
&lt;/h3&gt;

&lt;p&gt;It supports multiple databases, APIs, automation, and RBAC, and can also connect data to real business workflows through Apps, Automations, and Agents. It is suitable for building relatively well-defined systems such as service requests, approval routing, operations collaboration, and simple delivery tracking. It is also suitable for separating and implementing only part of a project management workflow as its own system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr285s98llqaaltvilo5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyr285s98llqaaltvilo5.png" alt="Budibase3.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. AI Capabilities and Highlights
&lt;/h3&gt;

&lt;p&gt;Budibase supports creating AI Agents and also allows large models to be connected into automation steps for text processing, result generation, data retrieval, and workflow execution. At the same time, it can connect to an enterprise’s own models, data sources, and APIs. For project management scenarios, it is suitable for process-oriented capabilities such as approval assistance, request routing, workflow handling, and internal collaboration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwdvd6yziyjs17oml95n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwdvd6yziyjs17oml95n.png" alt="Budibase4.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenProject
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxlgzicl2zh9r8sehehj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foxlgzicl2zh9r8sehehj.png" alt="OpenProject1.png" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Link&lt;/strong&gt;：&lt;a href="https://github.com/opf/openproject" rel="noopener noreferrer"&gt;https://github.com/opf/openproject&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;：14.6k&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official Website&lt;/strong&gt;：&lt;a href="https://www.openproject.org/" rel="noopener noreferrer"&gt;https://www.openproject.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;：&lt;a href="https://www.openproject.org/docs/" rel="noopener noreferrer"&gt;https://www.openproject.org/docs/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Product Direction and Target Users
&lt;/h3&gt;

&lt;p&gt;OpenProject is a typical standard project management tool designed for teams and organizations that need complete project management capabilities. It is better suited for medium to large teams, enterprise projects, and cross-team collaboration scenarios, especially for teams that want one system to cover classic project management, agile collaboration, and portfolio management at the same time. It supports custom workflows, project templates, and project phase management, making it relatively friendly for organizations with standardized management needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Out-of-the-Box Usability
&lt;/h3&gt;

&lt;p&gt;It already comes with built-in core modules such as task management, kanban boards, Gantt charts, time tracking, and roadmaps, so users do not need to build the system from scratch like they would with a low-code platform. However, it is also a heavier product in terms of functionality, so the learning curve for new users is higher than that of more lightweight agile tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Core Project Management Loop Capabilities
&lt;/h3&gt;

&lt;p&gt;OpenProject’s advantage lies in its relatively complete project management loop. It covers task and issue management, Agile boards, Scrum, Gantt charts, time tracking, costs and budgets, product roadmaps, and portfolio management. It is well suited for teams that want to place planning, execution, tracking, and review all within a single system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fze1lghktd5fqattbh9gq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fze1lghktd5fqattbh9gq.png" alt="OpenProject2.png" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fit with Development Workflows
&lt;/h3&gt;

&lt;p&gt;Its positioning is more that of a comprehensive project platform. It supports GitHub integration and can link work items with pull requests, so it is not isolated from development workflows. However, the overall experience is still more focused on project management and delivery collaboration.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Business Adaptability and Workflow Customization
&lt;/h3&gt;

&lt;p&gt;It offers a certain degree of process and workflow customization, making it suitable for configuration and extension within an existing project management framework. It supports custom workflows, project templates, and project phase management, which is useful for organizations with standardized management needs. However, once requirements move beyond project management and start involving CRM, approvals, ticketing, procurement, or more complex data model coordination, its flexibility is not as strong as that of a system-level platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7qdctpigv23ib9igwje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh7qdctpigv23ib9igwje.png" alt="OpenProject3.png" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. AI Capabilities and Highlights
&lt;/h3&gt;

&lt;p&gt;OpenProject has clearly started investing in AI, but overall it is still in the stage of development and gradual implementation. The capabilities currently being advanced mainly include project improvement suggestions, automatically generated status reports, and features within documents such as Ask AI, rewriting, translation, summarization, and draft generation. Its AI positioning is more focused on supportive project management and decision support, with an emphasis on privacy, compliance, and human final decision-making authority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnc0u4m379tvqlisnxcgs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnc0u4m379tvqlisnxcgs.png" alt="OpenProject4.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Plane
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbdpi1i2prsisuclostq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdbdpi1i2prsisuclostq.png" alt="Plane1.png" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Link&lt;/strong&gt;：&lt;a href="https://github.com/makeplane/plane" rel="noopener noreferrer"&gt;https://github.com/makeplane/plane&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;：46k+&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official Website&lt;/strong&gt;：&lt;a href="https://plane.so/" rel="noopener noreferrer"&gt;https://plane.so/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;：&lt;a href="https://docs.plane.so/" rel="noopener noreferrer"&gt;https://docs.plane.so/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Product Direction and Target Users
&lt;/h3&gt;

&lt;p&gt;Plane is a standard project management tool for development teams and is positioned as an open source alternative to Jira. It is better suited for product and engineering teams, emphasizing a modern experience around issues, iterations, and collaboration workflows. Overall, it is more like a daily work platform for development teams. Typical scenarios include product development management, agile iteration collaboration, and internal team project tracking.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Out-of-the-Box Usability
&lt;/h3&gt;

&lt;p&gt;Plane offers a relatively friendly out-of-the-box experience. Once installed, teams can directly start working with issues, projects, and iterations without requiring a large amount of upfront configuration. Compared with traditional project management tools, its interface is lighter, more intuitive, and easier to adopt.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Core Project Management Loop Capabilities
&lt;/h3&gt;

&lt;p&gt;Plane focuses on the core loop of development projects, covering issue management, sprints, module organization, project views, and basic documentation capabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvs9udnt929207fqtrzj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffvs9udnt929207fqtrzj.png" alt="Plane2.png" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fit with Development Workflows
&lt;/h3&gt;

&lt;p&gt;This is one of Plane’s strengths. It is designed specifically around development teams, and concepts such as issues, iterations, and modules align closely with real development workflows. It is also continuously strengthening integrations with platforms such as GitHub and GitLab, making the relationship between task flows and code flows more natural.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Business Adaptability and Workflow Customization
&lt;/h3&gt;

&lt;p&gt;Plane provides a certain degree of customization, but overall it is still extending within a predefined project management model and is better suited for collaboration within development teams. If the business starts to involve cross-department workflows, complex approvals, or multi-system integration, its adaptability becomes more limited.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6oa8qip54wlx4clkct3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6oa8qip54wlx4clkct3.png" alt="Plane3.png" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. AI Capabilities and Highlights
&lt;/h3&gt;

&lt;p&gt;Plane has already introduced AI capabilities into the product for issue handling assistance, content generation, and workflow optimization, and it also supports building AI-driven collaboration workflows combined with models. It also supports self-hosted AI and BYOK (Bring Your Own Key). Overall, its AI is still evolving quickly and is mainly reflected in capabilities that enhance collaboration efficiency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrgvlwj10541q4xx7ylc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrgvlwj10541q4xx7ylc.png" alt="Plane4.png" width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Taiga
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzbhx9uiu1escju8wttrx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzbhx9uiu1escju8wttrx.png" alt="Taiga1.png" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Link&lt;/strong&gt;：&lt;a href="https://github.com/taigaio/taiga-docker" rel="noopener noreferrer"&gt;https://github.com/taigaio/taiga-docker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;：2k&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Official Website&lt;/strong&gt;：&lt;a href="https://taiga.io/" rel="noopener noreferrer"&gt;https://taiga.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;：&lt;a href="https://docs.taiga.io/" rel="noopener noreferrer"&gt;https://docs.taiga.io/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Product Direction and Target Users
&lt;/h3&gt;

&lt;p&gt;Taiga is a fairly typical standard project management tool, but it is not positioned as broadly or comprehensively for enterprise use as OpenProject. Instead, it is more focused on agile teams and product development collaboration. It is suitable for teams that want a relatively lightweight and intuitive tool to manage backlogs, user stories, tasks, and iterations. Typical scenarios include product development management, agile iteration collaboration, and issue tracking.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Out-of-the-Box Usability
&lt;/h3&gt;

&lt;p&gt;Taiga has a relatively friendly learning curve. Its overall product structure is quite clear, and the foundational setup needed for agile projects is already in place, so users do not need to build everything from scratch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwl3d6ih9cy76a42mauy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwl3d6ih9cy76a42mauy.png" alt="Taiga2.png" width="800" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Core Project Management Loop Capabilities
&lt;/h3&gt;

&lt;p&gt;Taiga’s core capabilities are mainly built around Agile workflows, with a focus on the objects most commonly used by development teams, such as epics, user stories, tasks, issues, and sprints. It covers the agile collaboration loop from requirement breakdown to iteration progress and issue tracking quite well.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fit with Development Workflows
&lt;/h3&gt;

&lt;p&gt;Taiga itself is designed for developers and design teams, so it feels quite natural in a development context.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0t1frqgjyjotxxh1uxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk0t1frqgjyjotxxh1uxn.png" alt="Taiga3.png" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Business Adaptability and Customization
&lt;/h3&gt;

&lt;p&gt;It can meet most of the internal collaboration needs of agile teams, but in essence it is still a project management tool rather than a system-level business platform. In other words, if your main goal is to use a ready-made tool to manage development projects, it is a straightforward choice. But if you want to extend project workflows into CRM, approvals, procurement, delivery, or complex cross-department processes, Taiga offers less room for extension.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpct0fst8606x4ojdmn60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpct0fst8606x4ojdmn60.png" alt="Taiga4.png" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. AI Capabilities and Highlights
&lt;/h3&gt;

&lt;p&gt;Taiga still focuses mainly on traditional agile project management capabilities, and AI is not currently a major part of its public product roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions (FAQ)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q1: Our company has many internal systems, and data is scattered across different departments. Which type of tool is more suitable?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; NocoBase.&lt;/p&gt;

&lt;p&gt;It is better suited to serving as a unified business platform that places project management together with customer management, approvals, ticketing, delivery, data analysis, and other workflows within the same system framework, rather than adding another isolated PM tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2: If we want to take AI into account, how should we choose among these tools?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; NocoBase is more suitable for teams that want AI to directly enter business systems and participate in real work. OpenProject is more suitable for using AI in report generation, project suggestions, and document handling. Plane is more suitable for teams that value development collaboration and AI-assisted project execution. Budibase is more suitable for scenarios where AI is embedded into approvals, automation, and workflow handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3: Which open source project management tool is better for lightweight agile teams?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Taiga.&lt;/p&gt;

&lt;p&gt;It emphasizes a simple and intuitive agile collaboration experience and is suitable for small and medium-sized development and product teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4: Which open source project management tool is better for development teams?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Plane.&lt;/p&gt;

&lt;p&gt;It aligns more naturally with issues, iterations, and development collaboration workflows, and the overall experience also feels more modern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q5: Our team already has CRM, approval, ticketing, delivery, and other systems, and project management is only one part of the picture. Which type should we choose?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Choose a customizable business platform such as NocoBase, because the key in this type of scenario is connecting project workflows with existing business systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q6: If our needs are more process-driven and form-driven, which tool is a better fit?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Budibase.&lt;/p&gt;

&lt;p&gt;It is more suitable for relatively well-defined scenarios such as service requests, approval routing, and workflow handling. If your project management looks more like an internal process system than a development collaboration platform, it will feel more natural to use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q7: If project management workflows often need to be linked with approval flows, customer information, and delivery milestones, which tool is more suitable?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; NocoBase.&lt;/p&gt;

&lt;p&gt;Because this kind of requirement has already gone beyond the boundaries of standard PM software. In essence, what you need is a project management system built around business workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q8: What is the difference between NocoBase and Appsmith or Budibase?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Appsmith and Budibase are more like UI-driven tool builders, while NocoBase is an application development framework centered on the data model and designed to build complex business systems through plugins and workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core Comparison&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Appsmith&lt;/th&gt;
&lt;th&gt;Budibase&lt;/th&gt;
&lt;th&gt;NocoBase&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Core Paradigm&lt;/td&gt;
&lt;td&gt;React + API Builder (low-code frontend)&lt;/td&gt;
&lt;td&gt;Airtable + forms + automation&lt;/td&gt;
&lt;td&gt;Backend framework + Admin + workflow engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Driving Method&lt;/td&gt;
&lt;td&gt;UI + JS driven&lt;/td&gt;
&lt;td&gt;Form / data-table driven&lt;/td&gt;
&lt;td&gt;Data-model-driven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Modeling&lt;/td&gt;
&lt;td&gt;Relies on external APIs / DB&lt;/td&gt;
&lt;td&gt;Built-in tables, limited ability&lt;/td&gt;
&lt;td&gt;Strong relational modeling, which is a core strength&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business Logic&lt;/td&gt;
&lt;td&gt;Written in JS&lt;/td&gt;
&lt;td&gt;Automation&lt;/td&gt;
&lt;td&gt;Workflow + plugins + JS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission Control&lt;/td&gt;
&lt;td&gt;Basic / partially paid&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Fine-grained, including record- and field-level control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extension Method&lt;/td&gt;
&lt;td&gt;Write JS&lt;/td&gt;
&lt;td&gt;Components + automation&lt;/td&gt;
&lt;td&gt;Plugin system + JS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System Complexity Ceiling&lt;/td&gt;
&lt;td&gt;Medium (tool level)&lt;/td&gt;
&lt;td&gt;Medium-low&lt;/td&gt;
&lt;td&gt;High (system level)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Role&lt;/td&gt;
&lt;td&gt;Assists development&lt;/td&gt;
&lt;td&gt;Assists data handling&lt;/td&gt;
&lt;td&gt;Integrated into business systems&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you find this guide helpful, feel free to share it with more teams that are evaluating their options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/how-to-build-a-custom-crm-with-postgresql" rel="noopener noreferrer"&gt;How to Build a Custom CRM with PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/best-open-source-ai-projects-github-2026" rel="noopener noreferrer"&gt;Top 20 AI Projects on GitHub to Watch in 2026: Not Just OpenClaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/best-ai-crm-open-source-nocobase-twenty-krayin" rel="noopener noreferrer"&gt;Best Open Source AI CRM: NocoBase vs Twenty vs Krayin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/top-3-open-source-erp-with-ai-on-github-nocobase-vs-odoo-vs-erpnext" rel="noopener noreferrer"&gt;Top 3 Open Source ERP with AI on GitHub: NocoBase vs Odoo vs ERPNext&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/5-most-popular-open-source-ai-project-management-tools-on-github" rel="noopener noreferrer"&gt;5 Most Popular Open-Source AI Project Management Tools on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/6-best-open-source-ai-ticketing-systems" rel="noopener noreferrer"&gt;6 Best Open-Source AI Ticketing Systems &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/4-open-source-data-management-tools-for-business-systems" rel="noopener noreferrer"&gt;4 Open Source Data Management Tools for Business Systems &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nocobase.com/en/blog/4-lightweight-enterprise-software-for-business-processes" rel="noopener noreferrer"&gt;4 Lightweight Enterprise Software for Business Processes (With Real-World Cases) &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>nocode</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
