<?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>DEV Community: informat</title>
    <description>The latest articles on DEV Community by informat (@informat).</description>
    <link>https://dev.to/informat</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3901489%2Fab8d13c5-0932-420d-9f96-849a0743c7cd.png</url>
      <title>DEV Community: informat</title>
      <link>https://dev.to/informat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/informat"/>
    <language>en</language>
    <item>
      <title>How Should Scripting Work in a Low-Code Platform?</title>
      <dc:creator>informat</dc:creator>
      <pubDate>Mon, 10 Aug 2026 13:41:58 +0000</pubDate>
      <link>https://dev.to/informat/how-should-scripting-work-in-a-low-code-platform-1mfn</link>
      <guid>https://dev.to/informat/how-should-scripting-work-in-a-low-code-platform-1mfn</guid>
      <description>&lt;p&gt;In the previous post about automation, I ended with a question:&lt;/p&gt;

&lt;p&gt;Once automation connects business actions, where should the complex logic live?&lt;/p&gt;

&lt;p&gt;The answer is scripts.&lt;/p&gt;

&lt;p&gt;Scripting is easily misunderstood in a low-code platform.&lt;/p&gt;

&lt;p&gt;Some people ask why a low-code product needs scripts at all. Others worry that adding scripts turns low-code back into traditional software development.&lt;/p&gt;

&lt;p&gt;My view is that scripting is not the opposite of low-code.&lt;/p&gt;

&lt;p&gt;It is the controlled escape hatch that a low-code platform needs when it encounters genuinely complex business requirements.&lt;/p&gt;

&lt;p&gt;The important questions are not whether scripts exist. They are where scripts run, how they are invoked, which boundaries apply, and whether the platform can govern their lifecycle.&lt;/p&gt;

&lt;p&gt;Without boundaries, scripts pull the platform back toward scattered custom code. Without scripts, the platform becomes rigid when it meets real enterprise complexity.&lt;/p&gt;

&lt;p&gt;A scripting system should not let users write arbitrary code anywhere. It should provide a controlled runtime for logic that cannot be expressed clearly through configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why low-code platforms need scripts
&lt;/h2&gt;

&lt;p&gt;Low-code configuration can handle a large share of common requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Field validation&lt;/li&gt;
&lt;li&gt;Conditional form behavior&lt;/li&gt;
&lt;li&gt;Approval workflows&lt;/li&gt;
&lt;li&gt;Permission control&lt;/li&gt;
&lt;li&gt;Automation orchestration&lt;/li&gt;
&lt;li&gt;Data queries and updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The platform should provide these capabilities directly whenever possible.&lt;/p&gt;

&lt;p&gt;Enterprise applications still contain logic that is difficult to express elegantly as configuration.&lt;/p&gt;

&lt;p&gt;Examples include complex quotation calculations, signing requests to external APIs, cleaning data across several tables, generating identifiers from historical rules, transforming imported data, validating purchase lines against maximum material prices, or assigning an owner based on industry, region, customer level, and sales workload.&lt;/p&gt;

&lt;p&gt;Trying to convert every one of these cases into visual configuration makes the configuration system increasingly complicated. Each new option requires UI, expressions, validation, compatibility rules, boundaries, and performance considerations.&lt;/p&gt;

&lt;p&gt;Eventually, the platform can reach an awkward outcome: in an attempt to avoid code, it creates a configuration language that is harder to understand than code.&lt;/p&gt;

&lt;p&gt;That is not the goal of low-code.&lt;/p&gt;

&lt;p&gt;Scripts should carry logic that the configuration system would otherwise express poorly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scripts should not swallow the entire business process
&lt;/h2&gt;

&lt;p&gt;Once scripting is available, the easiest mistake is to put everything inside it.&lt;/p&gt;

&lt;p&gt;Consider the actions that follow customer creation. One script could check for duplicates, assign an owner, update the customer, send notifications, call external services, and write logs.&lt;/p&gt;

&lt;p&gt;This is fast in the short term. A developer can open the editor and implement the complete path in one place.&lt;/p&gt;

&lt;p&gt;It is painful in the long term.&lt;/p&gt;

&lt;p&gt;Business users cannot see the process. Implementation teams have difficulty troubleshooting it. The automation log only says that a script ran. Permission boundaries are easier to bypass. Even changing a notification rule requires someone to search through code.&lt;/p&gt;

&lt;p&gt;I prefer a clear division of responsibility:&lt;/p&gt;

&lt;p&gt;Automation handles orchestration.&lt;/p&gt;

&lt;p&gt;Scripts handle complex logic.&lt;/p&gt;

&lt;p&gt;An automation can query data, invoke a script to calculate a result, then use that result to update records, send notifications, and return a response.&lt;/p&gt;

&lt;p&gt;A script should not consume the entire business process. It should behave like a calculation, validation, or transformation node inside automation.&lt;/p&gt;

&lt;p&gt;This preserves the flexibility of code without losing the visual governance of automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Server-side and client-side scripts need different boundaries
&lt;/h2&gt;

&lt;p&gt;The first distinction in a scripting system is where the code runs.&lt;/p&gt;

&lt;p&gt;Some scripts belong on the server. Others belong in the client. They solve different problems and require different security models.&lt;/p&gt;

&lt;p&gt;Server-side scripts are suited to business logic such as querying and writing data, calling external services, performing complex calculations, processing batches, and generating structured results.&lt;/p&gt;

&lt;p&gt;They run in the platform backend, where they can access a richer business context and where permissions, logging, timeouts, and error handling can be enforced consistently.&lt;/p&gt;

&lt;p&gt;For INFORMAT, JavaScript is the practical language for server-side scripting.&lt;/p&gt;

&lt;p&gt;It is familiar to frontend and full-stack developers, which reduces the learning curve. Most enterprise scripts are not large applications. They implement a business rule, data transformation, or integration call, and JavaScript is flexible and lightweight enough for those jobs.&lt;/p&gt;

&lt;p&gt;Server-side scripts access platform functions through the &lt;code&gt;informat&lt;/code&gt; object. Their runtime state is isolated by application so that one application's script context cannot leak casually into another.&lt;/p&gt;

&lt;p&gt;This makes server-side scripting especially useful in two areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business processing behind APIs&lt;/li&gt;
&lt;li&gt;Complex calculations that become too cumbersome in visual automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not to replace automation. It is to give automation an efficient execution layer when a step needs to calculate something, query something, transform data, sign a request, or assemble a complex result.&lt;/p&gt;

&lt;p&gt;Client-side scripts are better suited to interface behavior.&lt;/p&gt;

&lt;p&gt;A form may calculate one field immediately after another field changes. A button may update local page state. A custom control may need lightweight logic. The interface may display instant feedback based on user input.&lt;/p&gt;

&lt;p&gt;These actions are close to the user experience and should not always require a round trip to the server.&lt;/p&gt;

&lt;p&gt;Client-side scripting still needs restraint. It must not become a permission backdoor. A page script cannot be allowed to read data that the user cannot access or modify protected fields through a direct request.&lt;/p&gt;

&lt;p&gt;Client scripts should handle interaction and lightweight calculations. Actions that affect persistent data or business state should return to server-side scripts, automation, or governed platform actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The &lt;code&gt;informat&lt;/code&gt; object is the capability gateway
&lt;/h2&gt;

&lt;p&gt;A business script cannot be only bare JavaScript.&lt;/p&gt;

&lt;p&gt;The language alone can manipulate strings, arrays, and objects, but it cannot participate in enterprise operations. Scripts need controlled access to platform capabilities.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;informat&lt;/code&gt; object is that gateway. It exposes platform, utility, and integration functions to scripts through a consistent interface.&lt;/p&gt;

&lt;p&gt;Its capabilities can be viewed in several groups.&lt;/p&gt;

&lt;p&gt;The first group covers platform business objects, including applications, companies, departments, designers, and BPMN workflows. These APIs give a script access to the relevant application, organization, and process context.&lt;/p&gt;

&lt;p&gt;The second group covers data and integration, including data sources, JDBC, HTTP, FTP, and LDAP. These functions let scripts communicate with external systems and existing enterprise infrastructure.&lt;/p&gt;

&lt;p&gt;The third group covers files and documents, including files, CSV, Excel, and PDF. Importing, exporting, handling attachments, and generating documents are routine parts of enterprise digital operations. They should not require every team to rebuild the same foundation.&lt;/p&gt;

&lt;p&gt;The fourth group contains general utilities and runtime support, such as dates, console logging, encoding, and email. These capabilities look ordinary, but scripts use them constantly.&lt;/p&gt;

&lt;p&gt;The fifth group provides AI capabilities through AI agents.&lt;/p&gt;

&lt;p&gt;This opens interesting possibilities. Scripts can use AI for text generation, content extraction, data explanation, or business suggestions instead of limiting themselves to deterministic calculations.&lt;/p&gt;

&lt;p&gt;AI output requires stricter boundaries. It should not be written directly into critical business data without validation. A safer design lets AI generate a candidate result, then uses scripts or automation to validate its structure and business constraints.&lt;/p&gt;

&lt;p&gt;In this model, scripting becomes more than a place to write code. It is a programmatic gateway to platform capabilities.&lt;/p&gt;

&lt;p&gt;That role differs from visual automation. Automation emphasizes visible process orchestration. Scripts emphasize logic and function calls. The two should cooperate instead of competing for the same responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code snippets belong inside local automation steps
&lt;/h2&gt;

&lt;p&gt;Automation also needs a local form of scripting. I think of this as a code snippet rather than an independent script module.&lt;/p&gt;

&lt;p&gt;A code snippet handles a specific piece of logic inside one automation step.&lt;/p&gt;

&lt;p&gt;Suppose an automation loops over purchase order lines and evaluates whether each material exceeds its maximum purchase price. A simple comparison belongs in a visual condition.&lt;/p&gt;

&lt;p&gt;But the rule may become more complicated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different suppliers use different pricing policies.&lt;/li&gt;
&lt;li&gt;Material categories allow different variance percentages.&lt;/li&gt;
&lt;li&gt;Purchase types use different approval thresholds.&lt;/li&gt;
&lt;li&gt;Historical pricing must use the latest valid quotation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encoding all of this in visual conditions makes the automation difficult to read. A code snippet can calculate the result and return it to the automation branch.&lt;/p&gt;

&lt;p&gt;The value of a code snippet is that it keeps the canvas readable, gives complex calculations a clear home, and leaves the overall execution path visible in automation.&lt;/p&gt;

&lt;p&gt;This is the most natural relationship between scripts and automation.&lt;/p&gt;

&lt;p&gt;Automation decides what happens first, what happens next, and what should occur after failure.&lt;/p&gt;

&lt;p&gt;The code snippet decides how one particular step is calculated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Script functions should be reusable
&lt;/h2&gt;

&lt;p&gt;Logic used in one place can remain a code snippet. Logic shared by several automations, buttons, or listeners should become a script function.&lt;/p&gt;

&lt;p&gt;Common examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generating a business identifier&lt;/li&gt;
&lt;li&gt;Calculating a quotation&lt;/li&gt;
&lt;li&gt;Validating inventory&lt;/li&gt;
&lt;li&gt;Parsing an external API response&lt;/li&gt;
&lt;li&gt;Building notification content&lt;/li&gt;
&lt;li&gt;Converting imported data into a standard structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These functions should not be copied into every automation. They should be reusable platform assets.&lt;/p&gt;

&lt;p&gt;A script function needs an explicit contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are its inputs?&lt;/li&gt;
&lt;li&gt;What does it return?&lt;/li&gt;
&lt;li&gt;Does it modify data?&lt;/li&gt;
&lt;li&gt;Does it call an external service?&lt;/li&gt;
&lt;li&gt;What happens when it fails?&lt;/li&gt;
&lt;li&gt;Does it depend on the current user?&lt;/li&gt;
&lt;li&gt;Does it depend on the current application?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once a function is reused, its author cannot be the only person who understands how to call it. The platform should make its parameters, return value, description, and effects visible to callers.&lt;/p&gt;

&lt;p&gt;This resembles ordinary software engineering, but there is an additional constraint in a low-code platform: the people using script functions may not be full-time developers.&lt;/p&gt;

&lt;p&gt;Readability matters more than cleverness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permission boundaries cannot depend on author discipline
&lt;/h2&gt;

&lt;p&gt;Permissions are the most sensitive part of scripting because scripts are highly flexible.&lt;/p&gt;

&lt;p&gt;Without runtime controls, scripts can bypass the platform's existing boundaries. A script may retrieve a field that the current user cannot view, modify an approved amount, or query company-wide data for a user limited to one department.&lt;/p&gt;

&lt;p&gt;The platform cannot rely on every script author to avoid these mistakes voluntarily. It must enforce the boundaries at runtime.&lt;/p&gt;

&lt;p&gt;Data reads must pass permission evaluation.&lt;/p&gt;

&lt;p&gt;Data writes must have an explicit execution identity.&lt;/p&gt;

&lt;p&gt;External calls must record their source.&lt;/p&gt;

&lt;p&gt;Scripts running as the system require stronger auditing.&lt;/p&gt;

&lt;p&gt;Scripts invoked by automation must inherit the relevant automation permission boundaries.&lt;/p&gt;

&lt;p&gt;System identity is the difficult case. Some background work genuinely needs it, including nightly synchronization, repairing historical records, and receiving status updates from external systems.&lt;/p&gt;

&lt;p&gt;But system identity cannot mean unlimited authority. It needs an authorization scope that defines which applications it can access, which tables it can read or write, which scripts it can call, and which external resources it can reach.&lt;/p&gt;

&lt;p&gt;The more capable the scripting runtime becomes, the more important these boundaries become.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logging and errors are first-class capabilities
&lt;/h2&gt;

&lt;p&gt;Once scripts enter real business operations, logging is not optional.&lt;/p&gt;

&lt;p&gt;For every execution, the platform should be able to answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who triggered it?&lt;/li&gt;
&lt;li&gt;Where was it triggered?&lt;/li&gt;
&lt;li&gt;Which parameters were passed?&lt;/li&gt;
&lt;li&gt;Which script version ran?&lt;/li&gt;
&lt;li&gt;How long did it take?&lt;/li&gt;
&lt;li&gt;What did it return?&lt;/li&gt;
&lt;li&gt;Did it throw an exception?&lt;/li&gt;
&lt;li&gt;What was the stack trace?&lt;/li&gt;
&lt;li&gt;Which data did it affect?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When automation invokes a script, the two execution records should be linked. An operator should be able to open the script step from an automation run and inspect its inputs, output, duration, and exception details.&lt;/p&gt;

&lt;p&gt;That is what makes scripting governable.&lt;/p&gt;

&lt;p&gt;Error handling also needs a unified model.&lt;/p&gt;

&lt;p&gt;After a script fails, should automation continue or terminate? Should the script return a structured error or throw an exception? Should the failure be shown to the user or recorded only in backend logs?&lt;/p&gt;

&lt;p&gt;These decisions should not be improvised in every script. The runtime needs consistent error behavior so callers can handle failures predictably.&lt;/p&gt;

&lt;h2&gt;
  
  
  Script management is more than a code editor
&lt;/h2&gt;

&lt;p&gt;When people imagine script management, they often begin with an editor: syntax highlighting, a save button, and a run button.&lt;/p&gt;

&lt;p&gt;That is only the visible surface.&lt;/p&gt;

&lt;p&gt;The real challenge is managing the script lifecycle.&lt;/p&gt;

&lt;p&gt;How should scripts be organized and searched? How are they published into the runtime? Can they synchronize with a Git repository? Which automations depend on a changed function? Can a new version be rolled out gradually? Can it be rolled back? Who sees failures? Which NPM packages does a script depend on? Which platform objects does it call? Does it introduce a permission risk?&lt;/p&gt;

&lt;p&gt;Repository URL, branch, synchronization path, and authentication may sound like developer concerns. Once an application contains many scripts, however, they determine whether teams can collaborate, review changes, recover from mistakes, and synchronize environments.&lt;/p&gt;

&lt;p&gt;Scripts should not exist only as text stored in a database. They need a management model closer to software engineering.&lt;/p&gt;

&lt;p&gt;The editor is where a person writes a script. Script management governs everything from creation and dependency tracking to publishing, execution, auditing, and rollback.&lt;/p&gt;

&lt;p&gt;If the lifecycle is not managed, every additional script makes the platform harder to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matters in the initial version
&lt;/h2&gt;

&lt;p&gt;I would not begin by building a complete browser-based IDE. I would first clarify the runtime model and governance boundaries.&lt;/p&gt;

&lt;p&gt;First, distinguish server-side and client-side scripts. Server scripts carry business logic; client scripts handle interface interactions and lightweight calculations.&lt;/p&gt;

&lt;p&gt;Second, support reusable script functions with clear inputs, return values, descriptions, and invocation contracts.&lt;/p&gt;

&lt;p&gt;Third, support code snippets inside automation so local complex calculations do not consume the entire process.&lt;/p&gt;

&lt;p&gt;Fourth, establish a unified execution context containing the current user, current application, invocation source, input parameters, and execution instance.&lt;/p&gt;

&lt;p&gt;Fifth, keep permissions restrictive by default. Data access, platform functions, and external resources must remain behind platform boundaries.&lt;/p&gt;

&lt;p&gt;Sixth, expose capabilities through allowlists. NPM packages and Java objects should not be opened without control. Begin with a small, stable surface and expand deliberately.&lt;/p&gt;

&lt;p&gt;Seventh, implement logging and a unified error model early. Every execution must be traceable across automation, listeners, buttons, and other callers.&lt;/p&gt;

&lt;p&gt;Eighth, provide version management. At minimum, the platform should record who changed a script, what changed, when it became active, and whether it can be rolled back.&lt;/p&gt;

&lt;p&gt;Only after these foundations are stable would I invest heavily in the editor experience.&lt;/p&gt;

&lt;p&gt;A beautiful editor cannot compensate for an ungoverned runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  The direction
&lt;/h2&gt;

&lt;p&gt;Scripting is not an exception inside a low-code platform. It is a necessary capability for real business complexity.&lt;/p&gt;

&lt;p&gt;But scripts must be placed correctly.&lt;/p&gt;

&lt;p&gt;They do not replace forms, workflows, automation, or the permission system.&lt;/p&gt;

&lt;p&gt;They carry complex logic that configuration cannot express clearly.&lt;/p&gt;

&lt;p&gt;Automation handles orchestration.&lt;/p&gt;

&lt;p&gt;Scripts handle calculations, validation, transformation, and limited complex processing.&lt;/p&gt;

&lt;p&gt;The platform handles permissions, logs, runtime limits, and lifecycle management.&lt;/p&gt;

&lt;p&gt;With those boundaries, scripting does not pull low-code back toward uncontrolled customization. It makes the platform capable of addressing the business cases that visual configuration alone cannot handle.&lt;/p&gt;

&lt;p&gt;Learn more about &lt;a href="https://www.ainformat.com/" rel="noopener noreferrer"&gt;INFORMAT&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>software</category>
    </item>
    <item>
      <title>Automation Is Not a Scheduled Task. It Is Business Action Orchestration</title>
      <dc:creator>informat</dc:creator>
      <pubDate>Sun, 09 Aug 2026 14:05:12 +0000</pubDate>
      <link>https://dev.to/informat/automation-is-not-a-scheduled-task-it-is-business-action-orchestration-1kll</link>
      <guid>https://dev.to/informat/automation-is-not-a-scheduled-task-it-is-business-action-orchestration-1kll</guid>
      <description>&lt;p&gt;In the previous post about plugin mechanisms, I made one distinction clear:&lt;/p&gt;

&lt;p&gt;Plugins provide entry points.&lt;/p&gt;

&lt;p&gt;Listeners are event entry points.&lt;/p&gt;

&lt;p&gt;APIs are external entry points.&lt;/p&gt;

&lt;p&gt;Custom controls are interface entry points.&lt;/p&gt;

&lt;p&gt;Automation should organize the business actions that follow.&lt;/p&gt;

&lt;p&gt;So this post continues with automation.&lt;/p&gt;

&lt;p&gt;In INFORMAT, automation is not simply a scheduled task. A more accurate description is a visual programming environment.&lt;/p&gt;

&lt;p&gt;It uses variables, flow control, and automation steps to organize business actions into a program that can be invoked, accept parameters, and return a result.&lt;/p&gt;

&lt;p&gt;This positioning matters. If automation is understood only as "run a task at a particular time," its role in a low-code platform is severely underestimated.&lt;/p&gt;

&lt;p&gt;Enterprise automation is more often about reliably completing a chain of actions after a business event occurs.&lt;/p&gt;

&lt;p&gt;A new record may need additional fields populated automatically.&lt;/p&gt;

&lt;p&gt;An approved process may need to generate a project.&lt;/p&gt;

&lt;p&gt;A button may open a form so the user can provide additional information before execution continues.&lt;/p&gt;

&lt;p&gt;An external system may call an automation over HTTP and receive the processing result.&lt;/p&gt;

&lt;p&gt;None of these scenarios is primarily a scheduled task. They are business action orchestration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation should behave like a small program
&lt;/h2&gt;

&lt;p&gt;When I first thought about an automation module, I did not imagine a task list.&lt;/p&gt;

&lt;p&gt;A task list can express when an action should run. Enterprise processes need much more.&lt;/p&gt;

&lt;p&gt;An automation often needs input parameters. It needs variables, conditional logic, and loops over collections. It may query or update tables, invoke scripts, and return a result. In some cases, it must pause halfway through, ask a user to complete a form, and then resume.&lt;/p&gt;

&lt;p&gt;Automation is therefore closer to a small program.&lt;/p&gt;

&lt;p&gt;The difference is that developers do not have to write the whole program from scratch. They assemble it from steps on a visual canvas.&lt;/p&gt;

&lt;p&gt;This makes the business path visible.&lt;/p&gt;

&lt;p&gt;Who triggered the automation?&lt;/p&gt;

&lt;p&gt;Which parameters were provided?&lt;/p&gt;

&lt;p&gt;Which conditional branch ran?&lt;/p&gt;

&lt;p&gt;Which steps were executed?&lt;/p&gt;

&lt;p&gt;What result was returned?&lt;/p&gt;

&lt;p&gt;When all of this is hidden inside code, troubleshooting is expensive. When it is expressed on an automation canvas, both implementation teams and developers can understand the execution path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input parameters are the automation entry point
&lt;/h2&gt;

&lt;p&gt;An automation needs input parameters if it is going to be called from multiple places.&lt;/p&gt;

&lt;p&gt;A listener can pass the current record.&lt;/p&gt;

&lt;p&gt;A button can pass the current page context.&lt;/p&gt;

&lt;p&gt;An external system can pass request parameters through an HTTP call.&lt;/p&gt;

&lt;p&gt;Another automation can pass the result of an earlier step.&lt;/p&gt;

&lt;p&gt;Input parameters turn an automation from an isolated task into a reusable capability.&lt;/p&gt;

&lt;p&gt;Consider an automation that generates customer numbers. It may be called by a listener when a customer is created, by an import automation, or by an external customer synchronization. With a clear input contract, the same automation can serve every entry point.&lt;/p&gt;

&lt;p&gt;There is an important design detail here: the selected parameter type mainly improves expression suggestions at design time. The runtime does not strictly validate the type of every incoming value.&lt;/p&gt;

&lt;p&gt;That means an automation must treat its input carefully. It cannot always assume that every caller passed a valid value.&lt;/p&gt;

&lt;p&gt;Critical automations should begin with conditional checks or use a script to normalize parameters. Once an automation is exposed through several entry points, invalid input can otherwise make failures deep in the execution path difficult to diagnose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Variables let steps hand data to each other
&lt;/h2&gt;

&lt;p&gt;Automation rarely ends after one step. It is usually a sequence.&lt;/p&gt;

&lt;p&gt;Data found by one step must be used by the next. A calculated result may need to be written back to a record. A response from an API call may determine whether processing should continue.&lt;/p&gt;

&lt;p&gt;This requires variables.&lt;/p&gt;

&lt;p&gt;Variables hold temporary state inside the automation context. They may come from input parameters, be created by a variable step, or contain the return value of another automation step.&lt;/p&gt;

&lt;p&gt;For example, an automation could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Query a customer record.&lt;/li&gt;
&lt;li&gt;Store the customer's region in a variable.&lt;/li&gt;
&lt;li&gt;Select a sales team based on that region.&lt;/li&gt;
&lt;li&gt;Update the customer owner.&lt;/li&gt;
&lt;li&gt;Return the owner information.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step passes data to the next. Without variables, automation can express only simple sequential actions. With variables, it can express business logic.&lt;/p&gt;

&lt;p&gt;But variables should not accumulate without discipline. The more variables a canvas contains, the harder it becomes to read. Interactive steps also require the runtime to persist the current execution state, so excessive variables have a performance cost.&lt;/p&gt;

&lt;p&gt;I prefer to distinguish between two kinds of variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business variables that genuinely need to survive across steps&lt;/li&gt;
&lt;li&gt;Temporary variables used only for intermediate calculations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first group should have clear names. The second should be discarded after use or kept within the smallest practical scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flow control determines how far automation can go
&lt;/h2&gt;

&lt;p&gt;Without flow control, automation can only execute from top to bottom.&lt;/p&gt;

&lt;p&gt;That solves simple problems, but real business logic quickly reaches the limit.&lt;/p&gt;

&lt;p&gt;Imagine validating a purchase order. The automation first queries the order details, loops through each line item, retrieves the related material, and compares the tax-inclusive price with the material's maximum purchase price.&lt;/p&gt;

&lt;p&gt;If a condition fails, execution stops. Otherwise, the automation continues by updating status, displaying a message, and refreshing the form and table modules.&lt;/p&gt;

&lt;p&gt;This is no longer "run a task." It is a business program expressed visually.&lt;/p&gt;

&lt;p&gt;Real processes contain branches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different customer levels use different assignment rules.&lt;/li&gt;
&lt;li&gt;Different contract amounts notify different people.&lt;/li&gt;
&lt;li&gt;Different data sources require different validation.&lt;/li&gt;
&lt;li&gt;Every row in an import must be processed individually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conditional branches and collection loops are therefore foundational automation capabilities.&lt;/p&gt;

&lt;p&gt;A condition uses an expression to control the path. When the expression evaluates to true, the matching branch runs. Otherwise, execution follows the alternative branch.&lt;/p&gt;

&lt;p&gt;A collection loop executes a group of child steps for every item in a list.&lt;/p&gt;

&lt;p&gt;These capabilities look ordinary, but they determine whether automation can perform a few simple actions or express an entire business procedure.&lt;/p&gt;

&lt;p&gt;Another essential step is terminate execution.&lt;/p&gt;

&lt;p&gt;Termination is not merely stopping. It ends the automation and rolls back the transaction after the latest blocking step.&lt;/p&gt;

&lt;p&gt;This behavior acknowledges that automation needs transaction boundaries and data consistency. Many enterprise automations modify data. If a critical validation fails, later writes must not continue.&lt;/p&gt;

&lt;p&gt;In that situation, termination is not a convenience. It is a safety mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation steps must represent real business actions
&lt;/h2&gt;

&lt;p&gt;An automation ultimately performs work through steps. Those steps need to cover the actions that enterprise applications actually use.&lt;/p&gt;

&lt;p&gt;Table steps handle querying, creating, updating, and deleting records, as well as recalculating lookup and summary fields.&lt;/p&gt;

&lt;p&gt;Control and variable steps handle loops, conditions, variable assignment, variable updates, termination, code snippets, script calls, automation calls, return values, and execution progress.&lt;/p&gt;

&lt;p&gt;Function steps handle HTTP requests, notifications, waiting, application events, client events, and messages shown inside modules.&lt;/p&gt;

&lt;p&gt;AI-related steps can invoke language models such as ChatGPT.&lt;/p&gt;

&lt;p&gt;Together, these steps make automation more than a flowchart. They make it part of the platform runtime.&lt;/p&gt;

&lt;p&gt;Consider a customer lead entering the system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Query whether a duplicate customer already exists.&lt;/li&gt;
&lt;li&gt;If no duplicate exists, create the customer record.&lt;/li&gt;
&lt;li&gt;Select an owner based on region and industry.&lt;/li&gt;
&lt;li&gt;Update the customer owner.&lt;/li&gt;
&lt;li&gt;Send a notification.&lt;/li&gt;
&lt;li&gt;Invoke a script to generate follow-up suggestions.&lt;/li&gt;
&lt;li&gt;Return the processing result to the caller.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This sequence combines table operations, conditions, scripts, notifications, and a return value. Writing every step as custom code is expensive. Providing them as configurable automation steps lets the platform carry a large share of everyday enterprise operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Return values make automation composable
&lt;/h2&gt;

&lt;p&gt;Many automations should not simply finish after executing their actions. They need to return a result to the caller.&lt;/p&gt;

&lt;p&gt;An application API may use the automation result as its HTTP response.&lt;/p&gt;

&lt;p&gt;An expression may invoke an automation and continue calculating with its result.&lt;/p&gt;

&lt;p&gt;Another automation may choose its next step based on the returned value.&lt;/p&gt;

&lt;p&gt;A script may also invoke an automation and consume its result.&lt;/p&gt;

&lt;p&gt;This makes the ability to set an automation return value essential. It changes automation from a background action into a composable platform capability.&lt;/p&gt;

&lt;p&gt;The model is similar to a function. A function without a return value can only perform side effects. An automation with an explicit return value can participate in larger programs.&lt;/p&gt;

&lt;p&gt;Consider a quotation automation. It accepts a customer, products, quantities, and discounts. Internally, it queries pricing rules, calculates taxes, and evaluates available promotions. Finally, it returns the quotation details.&lt;/p&gt;

&lt;p&gt;The same automation can be called from a form button, an API, another automation, or a script.&lt;/p&gt;

&lt;p&gt;It is no longer merely an action behind a button. It is a business function inside the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interactive steps connect automation with human judgment
&lt;/h2&gt;

&lt;p&gt;Automation is usually associated with background execution, but INFORMAT also supports interactive steps.&lt;/p&gt;

&lt;p&gt;When execution reaches such a step, the system persists the current variables and asks a user to complete an interaction. It may open a custom form, for example. After the user submits it, the runtime restores the variables and continues from the paused step.&lt;/p&gt;

&lt;p&gt;This design is valuable because many enterprise processes are only partially automatic.&lt;/p&gt;

&lt;p&gt;The system may complete most of the work while still requiring a person to provide information or make a judgment in the middle.&lt;/p&gt;

&lt;p&gt;After importing a spreadsheet, the system may parse the data but ask the user to map several incomplete fields.&lt;/p&gt;

&lt;p&gt;Before generating a contract, it may retrieve the customer and products but ask the salesperson to confirm the reason for a discount.&lt;/p&gt;

&lt;p&gt;Before starting a project, it may create a draft from the contract but ask the delivery owner to confirm the start date.&lt;/p&gt;

&lt;p&gt;Pure background automation is too rigid for these cases. Turning every step into a separate page loses the continuity of the automation.&lt;/p&gt;

&lt;p&gt;Interactive steps connect the two models.&lt;/p&gt;

&lt;p&gt;Automation pauses. A user participates. After submission, automation resumes.&lt;/p&gt;

&lt;p&gt;This allows automation to carry business processes that include both machine execution and human judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  HTTP calls turn automation into a business API
&lt;/h2&gt;

&lt;p&gt;An automation can also be invoked over HTTP. Once enabled, an external system calls a dedicated endpoint, passes parameters, and receives the automation's return value.&lt;/p&gt;

&lt;p&gt;This gives automation a natural API capability.&lt;/p&gt;

&lt;p&gt;An external system does not always need direct access to a collection of low-level APIs. It can call one automation that performs input validation, data queries, business decisions, record updates, and result construction internally.&lt;/p&gt;

&lt;p&gt;The exposed interface then represents a business action instead of a scattered set of data operations.&lt;/p&gt;

&lt;p&gt;Suppose an external ERP needs to synchronize a customer status. It could call a generic "update record" API. A better option may be to call a "synchronize customer status" automation.&lt;/p&gt;

&lt;p&gt;That automation can verify that the customer exists, validate the new status, write a status-change record, update the customer table, send a notification when necessary, and return a structured result.&lt;/p&gt;

&lt;p&gt;This model is closer to the real needs of enterprise integration.&lt;/p&gt;

&lt;p&gt;An automation invoked through HTTP cannot contain interactive output steps. That restriction is reasonable. An HTTP call requires a single request and response; it cannot pause indefinitely while waiting for a user.&lt;/p&gt;

&lt;p&gt;Automations exposed as APIs must therefore distinguish synchronous processing paths from interactive business paths.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits are part of the design
&lt;/h2&gt;

&lt;p&gt;Unrestricted automation is easy to misuse.&lt;/p&gt;

&lt;p&gt;A loop can accidentally become infinite. Processing a large dataset can take too long. Automations can call other automations recursively until the execution path becomes impossible to control.&lt;/p&gt;

&lt;p&gt;The runtime increments a step counter each time a step runs. Once execution exceeds the configured limit, the system terminates the automation and raises an error.&lt;/p&gt;

&lt;p&gt;This may look like a technical limit, but I see it as part of platform governance.&lt;/p&gt;

&lt;p&gt;The more open a low-code platform becomes, the more clearly it needs boundaries. A single configuration error should not be able to exhaust the resources of an entire application.&lt;/p&gt;

&lt;p&gt;Large loops and complex calculations are often better implemented as code snippets. This follows the same boundary described in the previous article:&lt;/p&gt;

&lt;p&gt;Automation is for orchestration.&lt;/p&gt;

&lt;p&gt;Scripts are for complex logic.&lt;/p&gt;

&lt;p&gt;The two should not try to replace each other. Automation connects business steps. Heavy calculations, complicated loops, and data cleansing belong in scripts or code snippets so the visual canvas remains readable and execution remains manageable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matters in the initial version
&lt;/h2&gt;

&lt;p&gt;I would not begin by pursuing an extremely sophisticated orchestration engine. I would first make the core runtime model clear.&lt;/p&gt;

&lt;p&gt;First, automation needs input parameters and return values so listeners, buttons, APIs, scripts, and other automations can call it.&lt;/p&gt;

&lt;p&gt;Second, automation needs a variable context. Steps must pass data to each other, scopes must be clear, and expressions should provide useful suggestions.&lt;/p&gt;

&lt;p&gt;Third, automation needs basic flow control. Conditions, collection loops, termination, automation calls, and script calls form the foundation for business logic.&lt;/p&gt;

&lt;p&gt;Fourth, automation needs stable business steps. Table operations, HTTP requests, notifications, logging, progress updates, and application events should come first.&lt;/p&gt;

&lt;p&gt;Fifth, automation needs interactive steps. Many enterprise processes are not purely background actions. The ability to pause, preserve variables, wait for user input, and resume is critical.&lt;/p&gt;

&lt;p&gt;Sixth, automation needs HTTP invocation so it can serve as a business interface for external systems.&lt;/p&gt;

&lt;p&gt;Seventh, automation needs runtime limits and termination controls. Step-count limits, infinite-loop protection, and execution monitoring are baseline requirements for platform stability.&lt;/p&gt;

&lt;p&gt;Once these capabilities are reliable, automation becomes more than a set of configured actions. It becomes a business runtime unit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The direction
&lt;/h2&gt;

&lt;p&gt;Automation occupies a central position in a low-code platform.&lt;/p&gt;

&lt;p&gt;Forms collect data.&lt;/p&gt;

&lt;p&gt;The data model organizes it.&lt;/p&gt;

&lt;p&gt;The workflow engine handles approval and state transitions.&lt;/p&gt;

&lt;p&gt;The plugin mechanism defines extension entry points.&lt;/p&gt;

&lt;p&gt;Scripts carry complex logic.&lt;/p&gt;

&lt;p&gt;Automation determines how business actions move across all of them.&lt;/p&gt;

&lt;p&gt;It can be triggered by a listener or a button. It can be called by another automation, a script, or an external HTTP request.&lt;/p&gt;

&lt;p&gt;It can accept parameters, assign variables, evaluate conditions, process collections, invoke scripts, interact with users, and return results.&lt;/p&gt;

&lt;p&gt;That is no longer a scheduled task.&lt;/p&gt;

&lt;p&gt;It is the business action orchestration layer of a low-code platform.&lt;/p&gt;

&lt;p&gt;Learn more about &lt;a href="https://www.ainformat.com/" rel="noopener noreferrer"&gt;INFORMAT&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Low-Code Platforms Need a Plugin Mechanism</title>
      <dc:creator>informat</dc:creator>
      <pubDate>Sat, 08 Aug 2026 12:43:16 +0000</pubDate>
      <link>https://dev.to/informat/why-low-code-platforms-need-a-plugin-mechanism-5ag3</link>
      <guid>https://dev.to/informat/why-low-code-platforms-need-a-plugin-mechanism-5ag3</guid>
      <description>&lt;p&gt;In the previous post about workflow engines, I ended with a distinction:&lt;/p&gt;

&lt;p&gt;Workflows determine how business moves forward. Automation and plugins determine how the platform extends those actions beyond its core.&lt;/p&gt;

&lt;p&gt;This post is about the plugin mechanism.&lt;/p&gt;

&lt;p&gt;But first, the term "plugin" needs some clarification.&lt;/p&gt;

&lt;p&gt;In INFORMAT, a plugin is not a package where developers install a large block of isolated business logic. I think of it as a set of extension points.&lt;/p&gt;

&lt;p&gt;Automation and scripts still carry most of the business logic. Event listeners, APIs, and custom controls act as entry points and connection points. At the right moment, they pass events, data, and user actions into automation or scripts for processing.&lt;/p&gt;

&lt;p&gt;This distinction matters because a low-code platform should not encourage teams to scatter logic everywhere.&lt;/p&gt;

&lt;p&gt;It should provide enough entry points for business-specific extensions while keeping the actual logic inside a unified automation and scripting system.&lt;/p&gt;

&lt;h2&gt;
  
  
  A plugin should not be an isolated block of code
&lt;/h2&gt;

&lt;p&gt;When designing a plugin mechanism, it is tempting to begin with a simple idea: open up a place where developers can write code.&lt;/p&gt;

&lt;p&gt;That sounds flexible.&lt;/p&gt;

&lt;p&gt;In practice, it can make a platform difficult to control. Every customer adds a little code. Every project introduces another rule. Every page hides one more condition. Delivery may be fast in the short term, but long-term maintenance becomes painful.&lt;/p&gt;

&lt;p&gt;A sustainable plugin mechanism should answer three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When does the business need an extension?&lt;/li&gt;
&lt;li&gt;Where should that extension enter the platform?&lt;/li&gt;
&lt;li&gt;What should execute the actual business logic?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My answer is that entry points can be distributed, but logic should be centralized.&lt;/p&gt;

&lt;p&gt;Listeners can respond to data changes.&lt;/p&gt;

&lt;p&gt;APIs can expose platform capabilities to external systems.&lt;/p&gt;

&lt;p&gt;Custom controls can introduce specialized interactions into a page.&lt;/p&gt;

&lt;p&gt;But these entry points should avoid accumulating complex logic themselves. Whenever possible, they should invoke automation, scripts, or reusable platform actions.&lt;/p&gt;

&lt;p&gt;That separation prevents the platform from turning into a collection of scattered custom code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Listeners are event entry points
&lt;/h2&gt;

&lt;p&gt;An event listener has a direct job: when a particular event occurs, it triggers a configured automation or invokes a script.&lt;/p&gt;

&lt;p&gt;Common events include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Before a table record is created&lt;/li&gt;
&lt;li&gt;After a table record is created&lt;/li&gt;
&lt;li&gt;Before a table record is updated&lt;/li&gt;
&lt;li&gt;After a table record is updated&lt;/li&gt;
&lt;li&gt;Before a table record is deleted&lt;/li&gt;
&lt;li&gt;After a table record is deleted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These events may look basic, but they are critical extension points in enterprise systems.&lt;/p&gt;

&lt;p&gt;After a customer is created, the system may generate a customer number.&lt;/p&gt;

&lt;p&gt;Before a contract is updated, it may validate the amount against the available budget.&lt;/p&gt;

&lt;p&gt;After an order is created, it may synchronize the order with an external ERP system.&lt;/p&gt;

&lt;p&gt;Before a record is deleted, it may determine whether deletion is allowed.&lt;/p&gt;

&lt;p&gt;After data changes, it may notify the responsible team.&lt;/p&gt;

&lt;p&gt;If every requirement is implemented inside the core table logic, the platform becomes heavier with every new use case. If the platform emits events through listeners and lets automation or scripts handle the response, its core can remain stable.&lt;/p&gt;

&lt;p&gt;That is the value of a listener.&lt;/p&gt;

&lt;p&gt;It is not the business logic itself. It is the entry point that triggers the business logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  APIs are entry points for external systems
&lt;/h2&gt;

&lt;p&gt;Listeners primarily handle events inside the platform. APIs connect INFORMAT with the systems around it.&lt;/p&gt;

&lt;p&gt;Enterprise digital operations never depend on a single system. A company may already use ERP, finance, MES, office automation, collaboration tools, or an internal data platform.&lt;/p&gt;

&lt;p&gt;INFORMAT should not assume that it will replace every one of them. It needs APIs so external systems and the platform can call each other.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An external system creates a customer record.&lt;/li&gt;
&lt;li&gt;A finance system writes back a payment status.&lt;/li&gt;
&lt;li&gt;A button in a collaboration tool triggers an INFORMAT workflow.&lt;/li&gt;
&lt;li&gt;An AI assistant calls a business API to retrieve authorized data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are also plugin entry points. An external system enters through an API, and INFORMAT uses automation and scripts to perform the subsequent actions.&lt;/p&gt;

&lt;p&gt;The difficult part is not merely making the request succeed. The platform must also handle permissions, logs, errors, and business state after the call.&lt;/p&gt;

&lt;p&gt;A bare API eventually produces a collection of disconnected integrations. An API connected to the automation and scripting system can bring external actions into the same runtime as internal processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom controls are interface entry points
&lt;/h2&gt;

&lt;p&gt;Standard form and page controls cover most common scenarios: text, numbers, dates, users, departments, attachments, related records, and sub-tables.&lt;/p&gt;

&lt;p&gt;Enterprise applications still encounter specialized interactions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecting a location on a map&lt;/li&gt;
&lt;li&gt;Scanning a code to enter data&lt;/li&gt;
&lt;li&gt;Displaying an equipment status panel&lt;/li&gt;
&lt;li&gt;Editing contract clauses&lt;/li&gt;
&lt;li&gt;Building a complex quotation component&lt;/li&gt;
&lt;li&gt;Calling an external pricing service when a user clicks a button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building every possible interaction into the platform would make the core product bloated. Custom controls should therefore serve as extension points for the interface.&lt;/p&gt;

&lt;p&gt;But a custom control should not become a container for all business logic either.&lt;/p&gt;

&lt;p&gt;The control handles interaction.&lt;/p&gt;

&lt;p&gt;Automation handles business actions.&lt;/p&gt;

&lt;p&gt;Scripts handle complex calculations.&lt;/p&gt;

&lt;p&gt;APIs handle external calls.&lt;/p&gt;

&lt;p&gt;With these boundaries, a custom control does not become a black box. It collects a user action and hands that action to the platform's unified runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation is the orchestration layer
&lt;/h2&gt;

&lt;p&gt;If listeners, APIs, and custom controls are entry points, automation is the orchestration layer.&lt;/p&gt;

&lt;p&gt;It determines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a process is triggered&lt;/li&gt;
&lt;li&gt;Which conditions must be satisfied&lt;/li&gt;
&lt;li&gt;Which actions should run&lt;/li&gt;
&lt;li&gt;What happens after a failure&lt;/li&gt;
&lt;li&gt;Whether subsequent actions should continue&lt;/li&gt;
&lt;li&gt;Whether users should be notified&lt;/li&gt;
&lt;li&gt;What should be written to the execution log&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider what happens after a customer record is created.&lt;/p&gt;

&lt;p&gt;A listener captures the event. Automation checks whether the customer came from the company website. If so, it assigns the customer to a salesperson, sends a notification, and creates a follow-up task. If the customer is rated as level A, it also alerts a manager.&lt;/p&gt;

&lt;p&gt;This business chain should not live inside the listener.&lt;/p&gt;

&lt;p&gt;The listener triggers it. Automation organizes it.&lt;/p&gt;

&lt;p&gt;That makes the system easier to understand and much easier to troubleshoot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scripts are the complex logic layer
&lt;/h2&gt;

&lt;p&gt;Automation is effective for orchestration, but not every kind of logic belongs in visual configuration.&lt;/p&gt;

&lt;p&gt;Some logic is inherently complex:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quotation calculations&lt;/li&gt;
&lt;li&gt;Budget validation&lt;/li&gt;
&lt;li&gt;Data cleansing&lt;/li&gt;
&lt;li&gt;Signing external API requests&lt;/li&gt;
&lt;li&gt;Evaluating complicated conditions across multiple tables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Forcing all of this into configuration can make the visual editor harder to use than code. Scripts are necessary for logic that automation cannot express well.&lt;/p&gt;

&lt;p&gt;Scripts still need clear boundaries. They should run inside a context provided by the platform. A script should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify the current user and application&lt;/li&gt;
&lt;li&gt;Access the current table and record&lt;/li&gt;
&lt;li&gt;Read only permitted fields&lt;/li&gt;
&lt;li&gt;Return a structured result&lt;/li&gt;
&lt;li&gt;Be invoked by automation&lt;/li&gt;
&lt;li&gt;Produce an execution log&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this model, scripts are not fragments of code hidden around the system. They become governed parts of the platform runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why these layers should remain separate
&lt;/h2&gt;

&lt;p&gt;Separating entry points, orchestration, and logic keeps the platform manageable.&lt;/p&gt;

&lt;p&gt;Complex logic inside listeners becomes difficult to maintain.&lt;/p&gt;

&lt;p&gt;Direct external calls from custom controls turn pages into business black boxes.&lt;/p&gt;

&lt;p&gt;API calls that modify core data without automation or logging become difficult to trace when something goes wrong.&lt;/p&gt;

&lt;p&gt;I prefer a structure with explicit responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listeners handle event entry points.&lt;/li&gt;
&lt;li&gt;APIs handle external entry points.&lt;/li&gt;
&lt;li&gt;Custom controls handle interface entry points.&lt;/li&gt;
&lt;li&gt;Automation handles orchestration.&lt;/li&gt;
&lt;li&gt;Scripts handle complex logic.&lt;/li&gt;
&lt;li&gt;Permissions enforce boundaries.&lt;/li&gt;
&lt;li&gt;Logs provide traceability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these parts form a sustainable plugin mechanism for a low-code platform.&lt;/p&gt;

&lt;p&gt;This is not primarily a plugin marketplace. It is an extension architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extension mechanisms must be observable
&lt;/h2&gt;

&lt;p&gt;Once extensions enter real business operations, the greatest risk is often not missing functionality. It is being unable to find where a failure occurred.&lt;/p&gt;

&lt;p&gt;Did the listener fire?&lt;/p&gt;

&lt;p&gt;Did the automation run?&lt;/p&gt;

&lt;p&gt;Did the script fail?&lt;/p&gt;

&lt;p&gt;Did the API call time out?&lt;/p&gt;

&lt;p&gt;What parameters did the custom control send?&lt;/p&gt;

&lt;p&gt;Which fields were ultimately changed?&lt;/p&gt;

&lt;p&gt;Did the failure prevent the main process from continuing?&lt;/p&gt;

&lt;p&gt;The platform must be able to answer these questions. Every execution should leave a record that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The event source&lt;/li&gt;
&lt;li&gt;The identity that triggered it&lt;/li&gt;
&lt;li&gt;The application, table, and record involved&lt;/li&gt;
&lt;li&gt;The automation that was called&lt;/li&gt;
&lt;li&gt;The script that was executed&lt;/li&gt;
&lt;li&gt;Its input and output&lt;/li&gt;
&lt;li&gt;Execution time&lt;/li&gt;
&lt;li&gt;The reason for any failure&lt;/li&gt;
&lt;li&gt;Whether the action was retried&lt;/li&gt;
&lt;li&gt;Whether it blocked subsequent processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without these records, every increase in extensibility makes the system harder to govern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extensions must not bypass permissions
&lt;/h2&gt;

&lt;p&gt;Plugin entry points introduce another risk: they can accidentally become permission backdoors.&lt;/p&gt;

&lt;p&gt;A user may be unable to edit a field in the standard interface, while a custom control modifies it through an API.&lt;/p&gt;

&lt;p&gt;A user may only be allowed to view their own customers, while a script queries every customer.&lt;/p&gt;

&lt;p&gt;An AI assistant may call an API and retrieve data that the current user should never see.&lt;/p&gt;

&lt;p&gt;Listeners, APIs, custom controls, automation, and scripts must all remain inside the permission system.&lt;/p&gt;

&lt;p&gt;They can extend business capabilities, but they cannot bypass business boundaries.&lt;/p&gt;

&lt;p&gt;Every execution needs an explicit identity. Is it running as the current user or as the system? If it uses a system identity, what is that identity allowed to do?&lt;/p&gt;

&lt;p&gt;The platform must define which fields can be read or written, which external services can be called, and which actions require an audit record.&lt;/p&gt;

&lt;p&gt;These boundaries must be designed from the beginning. Otherwise, a mechanism that looks flexible in the short term creates significant data risk over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matters in the initial version
&lt;/h2&gt;

&lt;p&gt;I would not begin by building a sophisticated plugin marketplace. I would first complete the internal extension path.&lt;/p&gt;

&lt;p&gt;First, listeners should support the core data events: before and after create, update, and delete.&lt;/p&gt;

&lt;p&gt;Second, listeners should be able to trigger automation. They remain entry points while automation owns the business sequence.&lt;/p&gt;

&lt;p&gt;Third, automation should be able to invoke scripts. Scripts handle special validation, complex calculations, and external integrations.&lt;/p&gt;

&lt;p&gt;Fourth, custom controls should be able to trigger platform actions. They pass user interactions to automation or scripts instead of carrying heavy logic in the frontend.&lt;/p&gt;

&lt;p&gt;Fifth, API calls should enter the unified logging system. The platform should trace their source, parameters, results, and effects.&lt;/p&gt;

&lt;p&gt;Sixth, permissions and auditing should be restrictive by default. The more powerful an extension mechanism becomes, the less reasonable it is to grant broad access automatically.&lt;/p&gt;

&lt;p&gt;Only after these foundations are reliable does a broader plugin ecosystem become meaningful.&lt;/p&gt;

&lt;h2&gt;
  
  
  The direction
&lt;/h2&gt;

&lt;p&gt;A plugin mechanism should not turn a low-code platform back into a conventional coding platform.&lt;/p&gt;

&lt;p&gt;Its purpose is to leave room for differentiated enterprise requirements without destabilizing the platform core.&lt;/p&gt;

&lt;p&gt;For INFORMAT, the most accurate model is a set of extension points:&lt;/p&gt;

&lt;p&gt;Listeners provide event entry points.&lt;/p&gt;

&lt;p&gt;APIs provide external entry points.&lt;/p&gt;

&lt;p&gt;Custom controls provide interface entry points.&lt;/p&gt;

&lt;p&gt;Automation orchestrates business actions.&lt;/p&gt;

&lt;p&gt;Scripts carry complex business logic.&lt;/p&gt;

&lt;p&gt;Permissions and logs keep the system governable.&lt;/p&gt;

&lt;p&gt;That architecture creates space for customization while preserving a coherent runtime. For an enterprise low-code platform, that balance matters far more than simply allowing more code.&lt;/p&gt;

&lt;p&gt;Learn more about &lt;a href="https://www.ainformat.com/" rel="noopener noreferrer"&gt;INFORMAT&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>automation</category>
      <category>backend</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>A Workflow Engine Is More Than an Approval Diagram</title>
      <dc:creator>informat</dc:creator>
      <pubDate>Thu, 06 Aug 2026 13:59:42 +0000</pubDate>
      <link>https://dev.to/informat/a-workflow-engine-is-more-than-an-approval-diagram-24nj</link>
      <guid>https://dev.to/informat/a-workflow-engine-is-more-than-an-approval-diagram-24nj</guid>
      <description>&lt;p&gt;In the previous post about permissions, I ended with one judgment:&lt;/p&gt;

&lt;p&gt;Permissions define boundaries. Workflows define how business moves forward.&lt;/p&gt;

&lt;p&gt;This post continues with the workflow engine.&lt;/p&gt;

&lt;p&gt;When many people hear "workflow", their first reaction is approval flow.&lt;/p&gt;

&lt;p&gt;Leave approval, reimbursement approval, contract approval, purchase approval. Draw a few nodes, configure approvers, add a few conditional branches, and it feels like the workflow engine is finished.&lt;/p&gt;

&lt;p&gt;I used to think this way too.&lt;/p&gt;

&lt;p&gt;But after building a low-code platform, I realized that a workflow engine is far more than drawing approval flows.&lt;/p&gt;

&lt;p&gt;It has to answer a deeper question: can the platform stably describe, execute, and trace the entire process of a business record from creation, submission, review, rejection, modification, completion, and then onward into automation and data changes?&lt;/p&gt;

&lt;p&gt;In other words, the workflow engine is not an isolated feature. It is part of the business runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  A workflow is not a diagram, but state change
&lt;/h2&gt;

&lt;p&gt;The most visible part of a workflow designer is the diagram.&lt;/p&gt;

&lt;p&gt;Start nodes, approval nodes, conditional branches, copy nodes, and end nodes.&lt;/p&gt;

&lt;p&gt;These shapes matter because users need them to understand the business path.&lt;/p&gt;

&lt;p&gt;But for the system, the truly important thing is not the diagram. It is state change.&lt;/p&gt;

&lt;p&gt;A contract moves from draft to under approval, then to legal review, finance review, approved, rejected, and archived. These state changes are what actually happen in the business.&lt;/p&gt;

&lt;p&gt;If a workflow stays only at the diagram level, a problem appears:&lt;/p&gt;

&lt;p&gt;The diagram may look beautiful, but data state, permissions, notifications, logs, and downstream automation are not really connected.&lt;/p&gt;

&lt;p&gt;So I prefer to understand workflow as a state machine.&lt;/p&gt;

&lt;p&gt;Nodes are states.&lt;/p&gt;

&lt;p&gt;Lines are state-transition paths.&lt;/p&gt;

&lt;p&gt;Approval actions are triggers for state transition.&lt;/p&gt;

&lt;p&gt;Workflow records are the history of state transition.&lt;/p&gt;

&lt;p&gt;With this design, workflow is no longer only about who approves. It is about which state a business object enters under which conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflows must bind to business objects
&lt;/h2&gt;

&lt;p&gt;Workflows in a low-code platform cannot exist apart from the data model.&lt;/p&gt;

&lt;p&gt;If a workflow is only an empty approval template, it is hard for it to truly enter the business.&lt;/p&gt;

&lt;p&gt;A workflow must bind to a specific business object.&lt;/p&gt;

&lt;p&gt;Contract approval binds to the contract table.&lt;/p&gt;

&lt;p&gt;Expense reimbursement binds to the reimbursement table.&lt;/p&gt;

&lt;p&gt;Purchase requests bind to the purchase request table.&lt;/p&gt;

&lt;p&gt;Project initiation binds to the project table.&lt;/p&gt;

&lt;p&gt;Once bound, the workflow can read business fields.&lt;/p&gt;

&lt;p&gt;What is the contract amount?&lt;/p&gt;

&lt;p&gt;What is the customer level?&lt;/p&gt;

&lt;p&gt;Which department submitted the request?&lt;/p&gt;

&lt;p&gt;What is the project budget?&lt;/p&gt;

&lt;p&gt;Does it involve an external vendor?&lt;/p&gt;

&lt;p&gt;These fields decide how the workflow moves.&lt;/p&gt;

&lt;p&gt;For example, if a contract amount is below 100,000, it may only need department-lead approval. If it exceeds 100,000, it may also require finance review. If it contains special terms, it may require legal review.&lt;/p&gt;

&lt;p&gt;This shows that workflows do not run in the air. They depend on the data model.&lt;/p&gt;

&lt;p&gt;The clearer the data model is, the more stable workflow expression becomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approvers should not be hard-coded
&lt;/h2&gt;

&lt;p&gt;One easily underestimated problem in workflow design is the approver.&lt;/p&gt;

&lt;p&gt;In simple scenarios, a specific person can be assigned directly.&lt;/p&gt;

&lt;p&gt;But real enterprise workflows are rarely that simple.&lt;/p&gt;

&lt;p&gt;The approver may be the initiator's direct manager.&lt;/p&gt;

&lt;p&gt;It may be the head of the initiator's department.&lt;/p&gt;

&lt;p&gt;It may be a role such as finance, legal, or procurement owner.&lt;/p&gt;

&lt;p&gt;It may come from a form field, such as project owner, customer owner, or contract owner.&lt;/p&gt;

&lt;p&gt;It may also change dynamically based on amount, region, or business line.&lt;/p&gt;

&lt;p&gt;If approvers can only be hard-coded, workflows quickly lose flexibility.&lt;/p&gt;

&lt;p&gt;So the workflow engine must support dynamic approvers.&lt;/p&gt;

&lt;p&gt;This involves organization structure, roles, user fields, department fields, and rule expressions.&lt;/p&gt;

&lt;p&gt;In other words, the workflow engine naturally depends on the permission system and organization model.&lt;/p&gt;

&lt;p&gt;That is why I do not like treating workflow as an isolated module.&lt;/p&gt;

&lt;p&gt;It appears to handle approval, but it is actually scheduling responsibility relationships inside the enterprise organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conditional branches must not become black boxes
&lt;/h2&gt;

&lt;p&gt;Conditional branches are also critical in workflows.&lt;/p&gt;

&lt;p&gt;A branch may look like a simple judgment:&lt;/p&gt;

&lt;p&gt;Amount greater than 100,000 goes to finance.&lt;/p&gt;

&lt;p&gt;Customer level A goes to senior approval.&lt;/p&gt;

&lt;p&gt;The R&amp;amp;D department goes to a technical lead.&lt;/p&gt;

&lt;p&gt;An empty field returns for completion.&lt;/p&gt;

&lt;p&gt;When there are only a few rules, this is fine.&lt;/p&gt;

&lt;p&gt;But as rules grow, branches can easily become black boxes.&lt;/p&gt;

&lt;p&gt;Users will ask:&lt;/p&gt;

&lt;p&gt;Why did this request go to legal?&lt;/p&gt;

&lt;p&gt;Why did it not go to finance?&lt;/p&gt;

&lt;p&gt;Why was my request returned?&lt;/p&gt;

&lt;p&gt;Why did two contracts with the same amount take different paths?&lt;/p&gt;

&lt;p&gt;If the system can only answer "because that is how the workflow is configured", that is not enough.&lt;/p&gt;

&lt;p&gt;I think the workflow engine should at least leave explainable execution records.&lt;/p&gt;

&lt;p&gt;Which branch was hit.&lt;/p&gt;

&lt;p&gt;Which fields were read during evaluation.&lt;/p&gt;

&lt;p&gt;What the field values were at that time.&lt;/p&gt;

&lt;p&gt;Which condition was true and which condition was false.&lt;/p&gt;

&lt;p&gt;This information is extremely important for troubleshooting.&lt;/p&gt;

&lt;p&gt;Otherwise, when a workflow goes wrong, the final answer is often that developers have to check logs, while business users cannot understand the process themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rejection is not simply going back one step
&lt;/h2&gt;

&lt;p&gt;Many workflow engines have "reject" or "return" actions.&lt;/p&gt;

&lt;p&gt;But returning is actually complex.&lt;/p&gt;

&lt;p&gt;Return to the initiator?&lt;/p&gt;

&lt;p&gt;Return to the previous node?&lt;/p&gt;

&lt;p&gt;Return to a specified node?&lt;/p&gt;

&lt;p&gt;After return and resubmission, should the workflow start from the beginning or continue from the returned node?&lt;/p&gt;

&lt;p&gt;Which fields can be modified during return?&lt;/p&gt;

&lt;p&gt;Should the return record be kept?&lt;/p&gt;

&lt;p&gt;Are previous approvers' opinions still valid?&lt;/p&gt;

&lt;p&gt;For example, in contract approval, legal may return the contract to sales to add terms. After sales modifies it, does it need to go through the department lead again? Does the previous finance review still count?&lt;/p&gt;

&lt;p&gt;There is no single answer to these questions. It depends on the business.&lt;/p&gt;

&lt;p&gt;So the workflow engine should not implement return as one fixed action.&lt;/p&gt;

&lt;p&gt;It should be a configurable transition.&lt;/p&gt;

&lt;p&gt;Where to return, whether to rerun previous steps, which fields can be opened for modification, and how previous approval opinions are handled should all enter workflow design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflows change permissions
&lt;/h2&gt;

&lt;p&gt;In the previous post about permissions, I wrote that workflows and permissions cannot be separated.&lt;/p&gt;

&lt;p&gt;From the workflow perspective, this becomes even clearer.&lt;/p&gt;

&lt;p&gt;For the same reimbursement form, permissions differ across workflow states.&lt;/p&gt;

&lt;p&gt;In draft state, the initiator can edit it.&lt;/p&gt;

&lt;p&gt;After submission, the initiator can no longer change the amount.&lt;/p&gt;

&lt;p&gt;During department-lead approval, the approver can fill in approval comments.&lt;/p&gt;

&lt;p&gt;During finance review, finance can modify the expense category.&lt;/p&gt;

&lt;p&gt;After the workflow ends, ordinary users can only view it.&lt;/p&gt;

&lt;p&gt;This shows that workflow nodes change field permissions and action permissions.&lt;/p&gt;

&lt;p&gt;If the workflow engine is not connected to the permission system, temporary frontend controls become the only protection.&lt;/p&gt;

&lt;p&gt;That is dangerous.&lt;/p&gt;

&lt;p&gt;Users may bypass frontend restrictions through APIs, imports, automation, or AI.&lt;/p&gt;

&lt;p&gt;So permissions on workflow nodes must become part of backend permission evaluation.&lt;/p&gt;

&lt;p&gt;Where the workflow goes, permissions should follow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow is not only approval; it also includes automatic actions
&lt;/h2&gt;

&lt;p&gt;In enterprise workflows, not every step should require human handling.&lt;/p&gt;

&lt;p&gt;Many nodes should be completed automatically.&lt;/p&gt;

&lt;p&gt;After contract approval, automatically generate a contract number.&lt;/p&gt;

&lt;p&gt;After purchase request approval, automatically create a purchase order.&lt;/p&gt;

&lt;p&gt;After project initiation approval, automatically create a task template.&lt;/p&gt;

&lt;p&gt;When a customer stage becomes won, automatically notify the implementation team.&lt;/p&gt;

&lt;p&gt;After reimbursement approval, automatically write into the payment plan.&lt;/p&gt;

&lt;p&gt;If all these actions require manual handling, the workflow only moves responsibility from one person to another. It does not truly reduce work.&lt;/p&gt;

&lt;p&gt;So the workflow engine must support automatic nodes.&lt;/p&gt;

&lt;p&gt;Automatic nodes can update fields, change status, send notifications, create records, call APIs, execute scripts, or trigger automation.&lt;/p&gt;

&lt;p&gt;This turns workflow from an approval tool into a business orchestration tool.&lt;/p&gt;

&lt;p&gt;I think this is an important difference between a low-code platform and an ordinary approval system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow records matter more than workflow diagrams
&lt;/h2&gt;

&lt;p&gt;A workflow diagram describes the design.&lt;/p&gt;

&lt;p&gt;Workflow records describe the facts.&lt;/p&gt;

&lt;p&gt;When an enterprise needs accountability and review, it looks at facts.&lt;/p&gt;

&lt;p&gt;Who submitted at what time?&lt;/p&gt;

&lt;p&gt;Who approved?&lt;/p&gt;

&lt;p&gt;Who returned it?&lt;/p&gt;

&lt;p&gt;What was the return reason?&lt;/p&gt;

&lt;p&gt;Which conditional branch was hit?&lt;/p&gt;

&lt;p&gt;What automatic action did the system execute?&lt;/p&gt;

&lt;p&gt;Did the API call succeed?&lt;/p&gt;

&lt;p&gt;How long did the workflow take?&lt;/p&gt;

&lt;p&gt;How long was a certain node blocked?&lt;/p&gt;

&lt;p&gt;This information is not only logs. It is part of business data.&lt;/p&gt;

&lt;p&gt;If workflow records are incomplete, later statistics, audit, and AI analysis all become difficult.&lt;/p&gt;

&lt;p&gt;For example, if managers want to know the average contract approval time, they cannot only look at the current contract status. They need the start and completion time of each node.&lt;/p&gt;

&lt;p&gt;If AI wants to summarize "this week's approval bottlenecks", it also depends on workflow records.&lt;/p&gt;

&lt;p&gt;So the workflow engine should design execution records from the beginning.&lt;/p&gt;

&lt;p&gt;Adding them later is painful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matters most in the initial workflow engine
&lt;/h2&gt;

&lt;p&gt;A workflow engine can easily grow very large.&lt;/p&gt;

&lt;p&gt;BPMN, countersign, either-or approval, additional signing, transfer, withdraw, return, subprocesses, timers, message events, exception boundaries, compensation mechanisms...&lt;/p&gt;

&lt;p&gt;All of these capabilities matter, but the initial version cannot swallow everything at once.&lt;/p&gt;

&lt;p&gt;If I were building the initial version, I would first make sure of several things.&lt;/p&gt;

&lt;p&gt;First, workflows must bind to data tables.&lt;/p&gt;

&lt;p&gt;Workflows cannot be isolated templates. They must run around business objects.&lt;/p&gt;

&lt;p&gt;Second, node types should be controlled at the beginning.&lt;/p&gt;

&lt;p&gt;Start, manual approval, conditional branch, automatic action, and end should first make the main path work.&lt;/p&gt;

&lt;p&gt;Third, approvers must support dynamic configuration.&lt;/p&gt;

&lt;p&gt;At minimum, the platform should support specified members, roles, department heads, user fields, and the initiator's manager.&lt;/p&gt;

&lt;p&gt;Fourth, workflow state must be written back to business data.&lt;/p&gt;

&lt;p&gt;A business record should know whether it is in draft, under approval, approved, rejected, withdrawn, and so on.&lt;/p&gt;

&lt;p&gt;Fifth, node permissions must enter backend permission evaluation.&lt;/p&gt;

&lt;p&gt;Which fields are visible, which fields are editable, and which actions are executable cannot rely only on the frontend.&lt;/p&gt;

&lt;p&gt;Sixth, workflow records must be complete.&lt;/p&gt;

&lt;p&gt;Every submission, approval, return, and automatic execution should leave structured records.&lt;/p&gt;

&lt;p&gt;Seventh, automatic nodes should first support the most common actions.&lt;/p&gt;

&lt;p&gt;Field updates, record creation, notifications, and API calls are among the most practical actions.&lt;/p&gt;

&lt;p&gt;After these capabilities are stable, countersign, additional signing, subprocesses, and more complex event mechanisms can be added gradually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes in workflow design
&lt;/h2&gt;

&lt;p&gt;The first mistake is focusing only on the workflow diagram.&lt;/p&gt;

&lt;p&gt;Drawing the diagram does not mean the workflow can truly run. State, permissions, records, and exception handling must all follow.&lt;/p&gt;

&lt;p&gt;The second mistake is hard-coding approvers.&lt;/p&gt;

&lt;p&gt;It is simple at the beginning, but once the organization changes, people move, and cross-department workflows increase, maintenance becomes very hard.&lt;/p&gt;

&lt;p&gt;The third mistake is making return logic too rough.&lt;/p&gt;

&lt;p&gt;Returning is not simply "go back one step." It affects data modification, approval opinions, and later paths.&lt;/p&gt;

&lt;p&gt;The fourth mistake is separating workflow and permissions.&lt;/p&gt;

&lt;p&gt;If node permissions do not enter the permission-evaluation system, workflow state can easily be bypassed.&lt;/p&gt;

&lt;p&gt;The fifth mistake is leaving no records for automatic actions.&lt;/p&gt;

&lt;p&gt;If the system automatically changes fields, creates records, or calls APIs without logs, problems become hard to investigate.&lt;/p&gt;

&lt;p&gt;The sixth mistake is making the workflow engine too complex from the beginning.&lt;/p&gt;

&lt;p&gt;A workflow engine can certainly be very complex, but the first version of a low-code platform needs stability, explainability, and extensibility more.&lt;/p&gt;

&lt;p&gt;It is more important to make common enterprise workflows run steadily than to chase every advanced capability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The direction
&lt;/h2&gt;

&lt;p&gt;The workflow engine is a module that is very easy to misunderstand in a low-code platform.&lt;/p&gt;

&lt;p&gt;On the surface, it draws processes and configures approvers.&lt;/p&gt;

&lt;p&gt;But deeper down, it connects the data model, permission system, organization structure, automation, integration, and audit.&lt;/p&gt;

&lt;p&gt;The data model tells the workflow what object it is handling.&lt;/p&gt;

&lt;p&gt;The permission system decides what each node can see and change.&lt;/p&gt;

&lt;p&gt;The organization structure decides who should take responsibility.&lt;/p&gt;

&lt;p&gt;Automation makes the workflow more than human handoff.&lt;/p&gt;

&lt;p&gt;Integration lets the workflow connect to external systems.&lt;/p&gt;

&lt;p&gt;Workflow records make the business process traceable and reviewable.&lt;/p&gt;

&lt;p&gt;So the workflow engine is not an approval plugin.&lt;/p&gt;

&lt;p&gt;It is the track on which enterprise business runs.&lt;/p&gt;

&lt;p&gt;For INFORMAT, the workflow engine is not about whether a user can draw an approval diagram. It is about whether business objects can move forward along clear, controllable, and traceable paths.&lt;/p&gt;

&lt;p&gt;In the next post, I want to write about automation and the plugin mechanism.&lt;/p&gt;

&lt;p&gt;Workflows define business paths. Automation and plugins define how the platform extends actions outward.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Why Permission Systems Are So Hard in Low-Code Platforms</title>
      <dc:creator>informat</dc:creator>
      <pubDate>Wed, 05 Aug 2026 14:35:34 +0000</pubDate>
      <link>https://dev.to/informat/why-permission-systems-are-so-hard-in-low-code-platforms-16eh</link>
      <guid>https://dev.to/informat/why-permission-systems-are-so-hard-in-low-code-platforms-16eh</guid>
      <description>&lt;p&gt;In the previous post about data models, I left one question:&lt;/p&gt;

&lt;p&gt;The data model defines business objects, but in an enterprise organization, who can view, edit, approve, and export those objects eventually becomes the responsibility of the permission system.&lt;/p&gt;

&lt;p&gt;I underestimated permissions at the beginning.&lt;/p&gt;

&lt;p&gt;When first building enterprise software, it is easy to think permissions are mostly roles, menus, and buttons. Administrators can see everything. Ordinary employees can only see their own data. Department managers can see their department. That sounds almost enough.&lt;/p&gt;

&lt;p&gt;After building a low-code platform, I realized this understanding was far too light.&lt;/p&gt;

&lt;p&gt;In a fixed business system, permissions can be complex, but the boundaries are relatively clear because objects, fields, workflows, and pages are determined during development.&lt;/p&gt;

&lt;p&gt;But in a low-code platform, users can create tables, add fields, configure workflows, modify pages, and build automation by themselves. Business objects are dynamic. Organization structures are dynamic. Workflow nodes are dynamic too.&lt;/p&gt;

&lt;p&gt;At that point, permissions are no longer just about who can open which menu. They become an underlying platform question:&lt;/p&gt;

&lt;p&gt;When the business model keeps changing, can the system still stably and accurately decide whether a person has permission for a record, a field, or an action?&lt;/p&gt;

&lt;h2&gt;
  
  
  The hardest part of permissions is not menus
&lt;/h2&gt;

&lt;p&gt;Menu permissions are the easiest to understand.&lt;/p&gt;

&lt;p&gt;Sales can enter CRM. Finance can enter the payment collection module. Administrators can enter the configuration center.&lt;/p&gt;

&lt;p&gt;This type of permission is usually not hard because it controls the entrance.&lt;/p&gt;

&lt;p&gt;The real trouble in enterprise systems is not the entrance. It is the data.&lt;/p&gt;

&lt;p&gt;Inside the same customer module, different people may see completely different data.&lt;/p&gt;

&lt;p&gt;Salespeople can only see the customers they own.&lt;/p&gt;

&lt;p&gt;Sales managers can see customers in their department.&lt;/p&gt;

&lt;p&gt;Regional leaders can see data for certain regions.&lt;/p&gt;

&lt;p&gt;The CEO wants to see everything.&lt;/p&gt;

&lt;p&gt;There are also special cases, such as a customer being shared by multiple salespeople, or a project temporarily authorized for an external consultant to view.&lt;/p&gt;

&lt;p&gt;Now the problem appears:&lt;/p&gt;

&lt;p&gt;Everyone opens the same customer module, but each person sees a different customer list.&lt;/p&gt;

&lt;p&gt;Menu permissions cannot solve this.&lt;/p&gt;

&lt;p&gt;This is data permission.&lt;/p&gt;

&lt;h2&gt;
  
  
  A record is not only "visible" or "invisible"
&lt;/h2&gt;

&lt;p&gt;Data permission is also not simply visible or invisible.&lt;/p&gt;

&lt;p&gt;In real business, a record usually has many operation layers.&lt;/p&gt;

&lt;p&gt;Can the user see it in the list?&lt;/p&gt;

&lt;p&gt;Can the user view the detail page?&lt;/p&gt;

&lt;p&gt;Can the user edit it?&lt;/p&gt;

&lt;p&gt;Can the user delete it?&lt;/p&gt;

&lt;p&gt;Can the user export it?&lt;/p&gt;

&lt;p&gt;Can the user start approval?&lt;/p&gt;

&lt;p&gt;Can the user transfer this record to someone else?&lt;/p&gt;

&lt;p&gt;Can the user modify several sensitive fields?&lt;/p&gt;

&lt;p&gt;For customer data, an ordinary salesperson may edit customer name, phone number, and source, but cannot change the customer owner.&lt;/p&gt;

&lt;p&gt;A manager may change the owner, but cannot delete the customer.&lt;/p&gt;

&lt;p&gt;Finance may view contract amount and payment collection, but may not see customer follow-up records.&lt;/p&gt;

&lt;p&gt;Administrators may be able to do everything, but their operations must leave audit records.&lt;/p&gt;

&lt;p&gt;This shows that permissions cannot stop at whether a record can be viewed.&lt;/p&gt;

&lt;p&gt;They must be split into data scope, field permission, action permission, special rules, and audit requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Field permissions are more troublesome than they look
&lt;/h2&gt;

&lt;p&gt;Field permissions are often added late in enterprise systems.&lt;/p&gt;

&lt;p&gt;For speed, many systems build the form first. Later, when a customer says certain fields cannot be shown to certain people, temporary controls are added.&lt;/p&gt;

&lt;p&gt;But in a low-code platform, if field permissions do not enter the design from the beginning, the cost later becomes painful.&lt;/p&gt;

&lt;p&gt;Fields are not fixed.&lt;/p&gt;

&lt;p&gt;Today a user adds "contract amount." Tomorrow they add "customer rating." The day after that, they add "cost budget." Any of these fields may need permission control.&lt;/p&gt;

&lt;p&gt;More troublesome, field permissions have many states.&lt;/p&gt;

&lt;p&gt;Hidden.&lt;/p&gt;

&lt;p&gt;Read-only.&lt;/p&gt;

&lt;p&gt;Editable.&lt;/p&gt;

&lt;p&gt;Required.&lt;/p&gt;

&lt;p&gt;Editable inside a workflow node.&lt;/p&gt;

&lt;p&gt;Editable under specific conditions.&lt;/p&gt;

&lt;p&gt;For example, in an expense reimbursement form, the amount can be edited before the initiator submits it. After submission, the initiator can no longer change the amount, but finance may modify the expense category during review. After the workflow ends, everyone can only view it and cannot modify it anymore.&lt;/p&gt;

&lt;p&gt;The same field may have completely different permissions under different roles, workflow nodes, and data states.&lt;/p&gt;

&lt;p&gt;That is the real complexity of field permissions.&lt;/p&gt;

&lt;p&gt;It is not a static configuration. It changes together with workflow, state, role, and conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Row permissions and field permissions affect each other
&lt;/h2&gt;

&lt;p&gt;There is another easily overlooked issue in permission design:&lt;/p&gt;

&lt;p&gt;Row permissions and field permissions are not isolated.&lt;/p&gt;

&lt;p&gt;Row permissions decide whether a person can see a record.&lt;/p&gt;

&lt;p&gt;Field permissions decide which fields are visible or editable after that person sees the record.&lt;/p&gt;

&lt;p&gt;But often, fields themselves participate in row permission checks.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Owner equals current user, so the record is visible.&lt;/p&gt;

&lt;p&gt;Department equals the current user's department, so the record is visible.&lt;/p&gt;

&lt;p&gt;Customer level is strategic customer, so only specified roles may view it.&lt;/p&gt;

&lt;p&gt;Project status is confidential, so only project members may view it.&lt;/p&gt;

&lt;p&gt;Owner, department, customer level, and project status are all fields.&lt;/p&gt;

&lt;p&gt;In other words, the system must first read field values before it can decide whether the record is visible to the current user.&lt;/p&gt;

&lt;p&gt;If the boundary between field permission and row permission is unclear, a loop appears:&lt;/p&gt;

&lt;p&gt;The user has no field permission, so the system cannot read the field.&lt;/p&gt;

&lt;p&gt;But the system needs to read the field to decide whether the user has data permission.&lt;/p&gt;

&lt;p&gt;This problem is not obvious in simple systems, but it is amplified in platform products.&lt;/p&gt;

&lt;p&gt;So the permission system must distinguish between fields required for system permission evaluation and fields visible to users.&lt;/p&gt;

&lt;p&gt;The system can read necessary fields to evaluate permissions, but that does not mean those fields must be displayed to the user.&lt;/p&gt;

&lt;p&gt;This boundary must be very clear.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permissions cannot rely only on roles
&lt;/h2&gt;

&lt;p&gt;Many enterprise systems start with role-based permissions.&lt;/p&gt;

&lt;p&gt;Sales, sales manager, finance, administrator.&lt;/p&gt;

&lt;p&gt;Roles are necessary, but if permissions rely only on roles, they quickly become rigid.&lt;/p&gt;

&lt;p&gt;Real enterprise permissions are often not decided purely by roles.&lt;/p&gt;

&lt;p&gt;They also depend on organization structure.&lt;/p&gt;

&lt;p&gt;They depend on data ownership.&lt;/p&gt;

&lt;p&gt;They depend on workflow nodes.&lt;/p&gt;

&lt;p&gt;They depend on temporary collaboration.&lt;/p&gt;

&lt;p&gt;They depend on business state.&lt;/p&gt;

&lt;p&gt;The same sales manager may manage the East region or the South region.&lt;/p&gt;

&lt;p&gt;The same finance role may only process data for one legal entity.&lt;/p&gt;

&lt;p&gt;The same project member may view costs, while another can only view tasks.&lt;/p&gt;

&lt;p&gt;If all of this is expressed through roles, the number of roles explodes.&lt;/p&gt;

&lt;p&gt;Sales manager, East sales manager, South sales manager, project member who can view cost, project member who cannot view cost...&lt;/p&gt;

&lt;p&gt;Eventually the system contains a pile of roles nobody can explain clearly.&lt;/p&gt;

&lt;p&gt;So I now prefer splitting permissions into several categories:&lt;/p&gt;

&lt;p&gt;Roles answer "what identity do you have?"&lt;/p&gt;

&lt;p&gt;Organization answers "where do you belong?"&lt;/p&gt;

&lt;p&gt;Data ownership answers "what relationship does this data have with you?"&lt;/p&gt;

&lt;p&gt;Workflow nodes answer "whose turn is it now?"&lt;/p&gt;

&lt;p&gt;Rule expressions answer "how should special conditions be evaluated?"&lt;/p&gt;

&lt;p&gt;Only then does permission pressure stop being pushed entirely onto roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow permissions are the easiest to get wrong
&lt;/h2&gt;

&lt;p&gt;If a system has no workflow, permissions are already complex enough.&lt;/p&gt;

&lt;p&gt;Once workflows exist, permission complexity rises another level.&lt;/p&gt;

&lt;p&gt;Workflows change data state, and they also change the boundary of user operations.&lt;/p&gt;

&lt;p&gt;For example, in a contract approval workflow:&lt;/p&gt;

&lt;p&gt;Before submission, the initiator can edit contract content.&lt;/p&gt;

&lt;p&gt;After submission, the initiator can no longer change core fields.&lt;/p&gt;

&lt;p&gt;During department-lead approval, the approver can fill in review comments but cannot change contract amount.&lt;/p&gt;

&lt;p&gt;During legal review, legal terms can be modified.&lt;/p&gt;

&lt;p&gt;During finance review, the payment plan can be viewed.&lt;/p&gt;

&lt;p&gt;After the workflow ends, the contract enters archived status and ordinary users can only view it.&lt;/p&gt;

&lt;p&gt;Permissions here are not static.&lt;/p&gt;

&lt;p&gt;The same person may have different permissions for the same record before, during, and after the workflow.&lt;/p&gt;

&lt;p&gt;If a low-code platform supports user-configured workflows, it also has to support this dynamic permission change.&lt;/p&gt;

&lt;p&gt;That is why I think workflows and permissions cannot be designed separately.&lt;/p&gt;

&lt;p&gt;A workflow does not only push a task to the next person. It also affects which fields can be seen, which fields can be edited, and which actions can be performed at each node.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permissions must also serve AI
&lt;/h2&gt;

&lt;p&gt;Permission design now has a new question that did not exist before:&lt;/p&gt;

&lt;p&gt;Can AI safely access business data?&lt;/p&gt;

&lt;p&gt;If AI is only a chat tool, the issue is less severe.&lt;/p&gt;

&lt;p&gt;But if AI connects to a low-code platform and helps users query data, analyze data, generate reports, modify configurations, and trigger workflows, permissions must keep up.&lt;/p&gt;

&lt;p&gt;When a user asks AI:&lt;/p&gt;

&lt;p&gt;"Help me look at this customer's recent contracts and payments."&lt;/p&gt;

&lt;p&gt;AI cannot bypass user permissions just because it is a system capability.&lt;/p&gt;

&lt;p&gt;It should only see the data the current user is allowed to see.&lt;/p&gt;

&lt;p&gt;When a user asks AI:&lt;/p&gt;

&lt;p&gt;"Change this customer's owner to Alex."&lt;/p&gt;

&lt;p&gt;AI must first check whether the current user has permission to modify the owner field.&lt;/p&gt;

&lt;p&gt;When a user asks AI:&lt;/p&gt;

&lt;p&gt;"Export all contracts from this month."&lt;/p&gt;

&lt;p&gt;AI needs to check export action permission, data-scope permission, and field masking requirements.&lt;/p&gt;

&lt;p&gt;So after AI enters the platform, permissions do not become simpler. They become more important.&lt;/p&gt;

&lt;p&gt;AI should be an extension of user capability, not a permission backdoor.&lt;/p&gt;

&lt;p&gt;This is the baseline that enterprise AI applications must hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matters most in the initial permission system
&lt;/h2&gt;

&lt;p&gt;The permission system should not be made omnipotent from the beginning.&lt;/p&gt;

&lt;p&gt;If permission configuration is too complex, users will be afraid of it, and development will also lose control.&lt;/p&gt;

&lt;p&gt;I care more about several basic capabilities in the initial design.&lt;/p&gt;

&lt;p&gt;First, role permissions must be clear.&lt;/p&gt;

&lt;p&gt;Whether a user can enter an application, module, or page, and whether they can perform actions such as create, edit, delete, and export, should be clearly configurable.&lt;/p&gt;

&lt;p&gt;Second, data scope must be expressible.&lt;/p&gt;

&lt;p&gt;At minimum, the platform should support common patterns such as self, department, department and sub-departments, all, field-based ownership, and expression-based rules.&lt;/p&gt;

&lt;p&gt;Third, field permissions must enter the model.&lt;/p&gt;

&lt;p&gt;Field visibility, read-only state, and editability cannot rely only on temporary frontend checks. They must become platform capabilities.&lt;/p&gt;

&lt;p&gt;Fourth, workflow-node permissions must be configurable.&lt;/p&gt;

&lt;p&gt;At each workflow node, which fields are editable and which actions are executable should be configurable.&lt;/p&gt;

&lt;p&gt;Fifth, system permission evaluation and user display must be separated.&lt;/p&gt;

&lt;p&gt;The system can read necessary fields for permission evaluation, but what users ultimately see must be decided by field permissions.&lt;/p&gt;

&lt;p&gt;Sixth, permission results should be explainable.&lt;/p&gt;

&lt;p&gt;When a user asks "why can't I see this data?", the system should ideally give a reason instead of only returning "no permission."&lt;/p&gt;

&lt;p&gt;This is difficult, but it matters a lot in enterprise systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes in permission design
&lt;/h2&gt;

&lt;p&gt;The first mistake is only building menu permissions.&lt;/p&gt;

&lt;p&gt;Menu permissions may look enough, but once real business arrives, data permissions and field permissions appear immediately.&lt;/p&gt;

&lt;p&gt;The second mistake is pushing all permissions into roles.&lt;/p&gt;

&lt;p&gt;Roles keep growing until nobody knows what each role actually means.&lt;/p&gt;

&lt;p&gt;The third mistake is adding field permissions late.&lt;/p&gt;

&lt;p&gt;If field permissions do not enter the model at the beginning, combining them later with workflows, forms, lists, exports, and AI becomes very hard.&lt;/p&gt;

&lt;p&gt;The fourth mistake is doing too much permission evaluation on the frontend.&lt;/p&gt;

&lt;p&gt;The frontend can control display, but real permission checks must be held on the backend. Otherwise, a different entry point may bypass the restriction.&lt;/p&gt;

&lt;p&gt;The fifth mistake is having no audit for permissions.&lt;/p&gt;

&lt;p&gt;In enterprise systems, who viewed what, who changed what, and who exported what can sometimes be even more important than the permission itself.&lt;/p&gt;

&lt;p&gt;The sixth mistake is making permission configuration too flexible.&lt;/p&gt;

&lt;p&gt;That sounds like a good thing, but without boundaries, users can easily create contradictory rules, and the system becomes hard to explain.&lt;/p&gt;

&lt;p&gt;A permission system is not better just because it is freer. It should make common scenarios simple and leave exits for complex scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  The direction
&lt;/h2&gt;

&lt;p&gt;Permissions are the least feature-like feature in a low-code platform.&lt;/p&gt;

&lt;p&gt;They are not as intuitive as forms, not as easy to demonstrate as workflows, and not as topical as AI.&lt;/p&gt;

&lt;p&gt;But they decide whether a platform can truly enter core enterprise business.&lt;/p&gt;

&lt;p&gt;Whether a company is willing to put customer, contract, order, project, and financial data into the platform depends heavily on whether it trusts the permission system.&lt;/p&gt;

&lt;p&gt;For INFORMAT, the permission system is not an auxiliary module.&lt;/p&gt;

&lt;p&gt;It should form the foundation together with the data model, form engine, and workflow engine.&lt;/p&gt;

&lt;p&gt;The data model defines business objects.&lt;/p&gt;

&lt;p&gt;The form engine carries data entry and display.&lt;/p&gt;

&lt;p&gt;The workflow engine moves business forward.&lt;/p&gt;

&lt;p&gt;The permission system answers throughout the whole process:&lt;/p&gt;

&lt;p&gt;Who can do what to which data under what conditions?&lt;/p&gt;

&lt;p&gt;If this question is not answered well, the more flexible the platform is, the greater the risk becomes.&lt;/p&gt;

&lt;p&gt;If this question is answered well, a low-code platform has a chance to move from building tools to carrying business.&lt;/p&gt;

&lt;p&gt;In the next post, I want to write about the workflow engine.&lt;/p&gt;

&lt;p&gt;Permissions define boundaries, while workflows define how business moves forward.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>How Should a Low-Code Platform Design Its Data Model?</title>
      <dc:creator>informat</dc:creator>
      <pubDate>Tue, 04 Aug 2026 23:00:48 +0000</pubDate>
      <link>https://dev.to/informat/how-should-a-low-code-platform-design-its-data-model-j6n</link>
      <guid>https://dev.to/informat/how-should-a-low-code-platform-design-its-data-model-j6n</guid>
      <description>&lt;p&gt;In the previous post about the form engine, I mentioned one judgment:&lt;/p&gt;

&lt;p&gt;A form is not a page. It is the entry point into a business model.&lt;/p&gt;

&lt;p&gt;Following that thought leads to a deeper question inside low-code platforms: how should the data model be designed?&lt;/p&gt;

&lt;p&gt;When many people think about low-code platforms, they first see visible capabilities such as forms, pages, workflows, reports, and dashboards. But what really determines how far a platform can go is often not how quickly pages can be assembled, but whether the underlying data model can carry complex business.&lt;/p&gt;

&lt;p&gt;If the data model is weak, forms become isolated pages.&lt;/p&gt;

&lt;p&gt;If the data model is messy, workflows, permissions, reports, and AI all become difficult to build.&lt;/p&gt;

&lt;p&gt;So in this post, I want to write about data-model design in INFORMAT.&lt;/p&gt;

&lt;h2&gt;
  
  
  A data model is not just table creation
&lt;/h2&gt;

&lt;p&gt;When many systems start designing a data model, it is easy to understand it as "create a few tables and add a few fields."&lt;/p&gt;

&lt;p&gt;For CRM, create customer, contact, and follow-up tables.&lt;/p&gt;

&lt;p&gt;For project management, create project, task, and member tables.&lt;/p&gt;

&lt;p&gt;For inventory and sales, create product, inventory, purchase order, and sales order tables.&lt;/p&gt;

&lt;p&gt;These are certainly part of the data model, but they are far from enough for a low-code platform.&lt;/p&gt;

&lt;p&gt;The problem a low-code platform faces is that these tables and fields are not hard-coded once by developers. Users must be able to dynamically create, adjust, and extend them inside the platform.&lt;/p&gt;

&lt;p&gt;That brings a new requirement:&lt;/p&gt;

&lt;p&gt;The platform must store business data, and it must also store the data that describes business data.&lt;/p&gt;

&lt;p&gt;That is metadata.&lt;/p&gt;

&lt;p&gt;A "customer table" is itself a piece of configuration. Fields such as customer name, customer level, owner, and contact list are also configuration. Field type, display style, validation rule, permission rule, and relationship are configuration too.&lt;/p&gt;

&lt;p&gt;So the data model of a low-code platform has two layers:&lt;/p&gt;

&lt;p&gt;The first layer is the platform's own metadata model.&lt;/p&gt;

&lt;p&gt;The second layer is the business data model created by users.&lt;/p&gt;

&lt;p&gt;The former decides the platform's capability boundary. The latter carries the specific business of each company.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start by abstracting business objects
&lt;/h2&gt;

&lt;p&gt;When designing the data model, I first ask one question:&lt;/p&gt;

&lt;p&gt;What objects truly exist in the business?&lt;/p&gt;

&lt;p&gt;A customer is an object.&lt;/p&gt;

&lt;p&gt;A contract is an object.&lt;/p&gt;

&lt;p&gt;An order is an object.&lt;/p&gt;

&lt;p&gt;A project is an object.&lt;/p&gt;

&lt;p&gt;A task is an object.&lt;/p&gt;

&lt;p&gt;Equipment is an object.&lt;/p&gt;

&lt;p&gt;An approval request is also an object.&lt;/p&gt;

&lt;p&gt;These objects are not pages, and they are not just collections of fields. They are things in enterprise business that can be identified, moved, related, and measured.&lt;/p&gt;

&lt;p&gt;If the design starts only from pages, the system becomes "what fields does this page have?"&lt;/p&gt;

&lt;p&gt;If the design starts from objects, the system becomes "what attributes, relationships, and behaviors does this business object have?"&lt;/p&gt;

&lt;p&gt;These two ways of thinking are very different.&lt;/p&gt;

&lt;p&gt;For example, a customer object is not only fields such as customer name, phone number, and address. It may also have an owner, customer level, lifecycle stage, follow-up records, contacts, contracts, orders, payments, and service tickets.&lt;/p&gt;

&lt;p&gt;When we treat the customer as a business object, workflows, permissions, reports, and AI analysis all gain a shared foundation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fields need business semantics
&lt;/h2&gt;

&lt;p&gt;Field design is not simply choosing text, number, or date.&lt;/p&gt;

&lt;p&gt;The truly important part of a field is whether it can express business semantics.&lt;/p&gt;

&lt;p&gt;Take the same "owner" field. If it is designed as plain text, the system only knows that there are a few characters.&lt;/p&gt;

&lt;p&gt;But if it is designed as a user field, the system can know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which user this owner corresponds to&lt;/li&gt;
&lt;li&gt;which department the user belongs to&lt;/li&gt;
&lt;li&gt;whether the user can receive notifications&lt;/li&gt;
&lt;li&gt;whether the user participates in data permission checks&lt;/li&gt;
&lt;li&gt;whether the user can act as a workflow approver&lt;/li&gt;
&lt;li&gt;whether the user can be used in user-dimension statistics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the value of field semantics.&lt;/p&gt;

&lt;p&gt;Field types in a low-code platform cannot serve only page display. They must also support data queries, permission checks, workflow conditions, automation triggers, report statistics, and AI understanding.&lt;/p&gt;

&lt;p&gt;For example, date fields can support time filtering and due-date reminders.&lt;/p&gt;

&lt;p&gt;Amount fields can support aggregation and threshold checks.&lt;/p&gt;

&lt;p&gt;Status fields can support workflow transitions and kanban grouping.&lt;/p&gt;

&lt;p&gt;Relationship fields can establish relationships between business objects.&lt;/p&gt;

&lt;p&gt;User fields can connect to the organization structure and permission system.&lt;/p&gt;

&lt;p&gt;The more semantic the field types are, the easier it is for the platform's later capabilities to grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Relationships are easier to underestimate than fields
&lt;/h2&gt;

&lt;p&gt;Many business systems are complex not because there are many fields, but because relationships are complex.&lt;/p&gt;

&lt;p&gt;A customer and contacts are one-to-many.&lt;/p&gt;

&lt;p&gt;A customer and contracts are one-to-many.&lt;/p&gt;

&lt;p&gt;A contract and orders may be one-to-many.&lt;/p&gt;

&lt;p&gt;A project and tasks are one-to-many.&lt;/p&gt;

&lt;p&gt;Tasks and members may be many-to-many.&lt;/p&gt;

&lt;p&gt;A purchase order and product line items are master-detail.&lt;/p&gt;

&lt;p&gt;If these relationships are not expressed well, the system can only become a pile of isolated data tables.&lt;/p&gt;

&lt;p&gt;Isolated data tables quickly run into problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;customer details cannot show historical follow-ups&lt;/li&gt;
&lt;li&gt;contracts cannot find related customers&lt;/li&gt;
&lt;li&gt;orders cannot be traced back to projects&lt;/li&gt;
&lt;li&gt;reports cannot aggregate across objects&lt;/li&gt;
&lt;li&gt;AI struggles to answer questions such as "What contracts and follow-up records does this customer have recently?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So relationships must be taken seriously in the data model.&lt;/p&gt;

&lt;p&gt;In a low-code platform, relationships are not only database-level relationships. They also affect page display, permission control, data linkage, workflow conditions, and report analysis.&lt;/p&gt;

&lt;p&gt;A good relationship field should not merely store an ID. It should let the platform know what relationship exists between two business objects and how that relationship can be used.&lt;/p&gt;

&lt;h2&gt;
  
  
  Balancing dynamism and stability
&lt;/h2&gt;

&lt;p&gt;Low-code platforms naturally pursue dynamism.&lt;/p&gt;

&lt;p&gt;Users can dynamically create tables, add fields, adjust views, and configure workflows.&lt;/p&gt;

&lt;p&gt;But enterprise systems cannot be infinitely dynamic.&lt;/p&gt;

&lt;p&gt;The system also has to consider performance, querying, analytics, permissions, security, upgrades, and maintenance.&lt;/p&gt;

&lt;p&gt;This creates a long-term tension:&lt;/p&gt;

&lt;p&gt;If the model is too dynamic, the platform is flexible, but the underlying system becomes increasingly complex.&lt;/p&gt;

&lt;p&gt;If the model is too fixed, the platform is stable, but it loses the value of low-code when the business changes.&lt;/p&gt;

&lt;p&gt;So the most important part of data-model design is not absolute flexibility. It is drawing the boundary.&lt;/p&gt;

&lt;p&gt;Which capabilities should users configure?&lt;/p&gt;

&lt;p&gt;Which capabilities should the platform fix in place?&lt;/p&gt;

&lt;p&gt;Which changes can be driven by metadata?&lt;/p&gt;

&lt;p&gt;Which changes must go through development extensions?&lt;/p&gt;

&lt;p&gt;For example, fields, views, form layouts, and basic validation are suitable as configuration.&lt;/p&gt;

&lt;p&gt;But data permissions, system audit, underlying storage, transaction boundaries, and performance indexes cannot be handed over entirely to arbitrary user configuration.&lt;/p&gt;

&lt;p&gt;The platform should give users freedom, but it should also help them hold system boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data model must support permissions
&lt;/h2&gt;

&lt;p&gt;In enterprise systems, the data model and permission model cannot be separated.&lt;/p&gt;

&lt;p&gt;Who can view which data?&lt;/p&gt;

&lt;p&gt;Who can edit which fields?&lt;/p&gt;

&lt;p&gt;Who can delete records?&lt;/p&gt;

&lt;p&gt;Who can export data?&lt;/p&gt;

&lt;p&gt;Who can view related objects?&lt;/p&gt;

&lt;p&gt;These questions all depend on the data model.&lt;/p&gt;

&lt;p&gt;If the data model does not have clear boundaries around objects, fields, and relationships, permissions can only be hard-coded.&lt;/p&gt;

&lt;p&gt;Once permissions are hard-coded, the flexibility of the low-code platform declines.&lt;/p&gt;

&lt;p&gt;So in a system like INFORMAT, the data model must leave room for permissions.&lt;/p&gt;

&lt;p&gt;Data tables can correspond to data permissions.&lt;/p&gt;

&lt;p&gt;Fields can correspond to field permissions.&lt;/p&gt;

&lt;p&gt;Actions can correspond to operation permissions.&lt;/p&gt;

&lt;p&gt;Relationships can affect visibility scope.&lt;/p&gt;

&lt;p&gt;Workflow nodes can change whether certain fields are editable.&lt;/p&gt;

&lt;p&gt;From this perspective, permissions are not a late add-on. They are a foundational capability that must be considered during data-model design.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data model must support workflows
&lt;/h2&gt;

&lt;p&gt;The workflow engine also depends on the data model.&lt;/p&gt;

&lt;p&gt;A purchase request workflow moves the purchase request business object.&lt;/p&gt;

&lt;p&gt;A contract approval workflow moves the contract business object.&lt;/p&gt;

&lt;p&gt;A project initiation workflow moves the project business object.&lt;/p&gt;

&lt;p&gt;Workflows do not run in the air. They always happen around a certain type of business data.&lt;/p&gt;

&lt;p&gt;Condition checks on workflow nodes also depend on fields.&lt;/p&gt;

&lt;p&gt;For example, an amount greater than 100,000 goes to general manager approval.&lt;/p&gt;

&lt;p&gt;A contract type marked as strategic customer goes through special review.&lt;/p&gt;

&lt;p&gt;Different applicant departments take different approval paths.&lt;/p&gt;

&lt;p&gt;Different current owners lead to different task assignments.&lt;/p&gt;

&lt;p&gt;All of this requires the data model to be read reliably by the workflow engine.&lt;/p&gt;

&lt;p&gt;If fields are only page controls, workflows can hardly understand them.&lt;/p&gt;

&lt;p&gt;If fields have clear types and semantics, workflow conditions can become configurable, visual, and maintainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data model must support reports
&lt;/h2&gt;

&lt;p&gt;After many enterprise systems go online, report requirements appear almost immediately.&lt;/p&gt;

&lt;p&gt;Customer count by source.&lt;/p&gt;

&lt;p&gt;Contract amount by month.&lt;/p&gt;

&lt;p&gt;Project tasks by owner.&lt;/p&gt;

&lt;p&gt;Inventory quantity by warehouse.&lt;/p&gt;

&lt;p&gt;Sales by region.&lt;/p&gt;

&lt;p&gt;These look like reporting problems, but they are data-model problems first.&lt;/p&gt;

&lt;p&gt;If fields do not have types, amounts cannot be aggregated correctly.&lt;/p&gt;

&lt;p&gt;If date fields are not standardized, trend charts will not work well.&lt;/p&gt;

&lt;p&gt;If relationships are unclear, cross-object statistics become painful.&lt;/p&gt;

&lt;p&gt;If status fields are arbitrary text, future kanban views and statistics become messy.&lt;/p&gt;

&lt;p&gt;So reporting should not be left until the end.&lt;/p&gt;

&lt;p&gt;When designing the data model, the platform must already consider how the data will later be filtered, grouped, aggregated, and analyzed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data model must support AI
&lt;/h2&gt;

&lt;p&gt;When designing a low-code platform now, AI must be part of the consideration.&lt;/p&gt;

&lt;p&gt;If AI wants to truly enter enterprise business, it cannot rely only on a chat window.&lt;/p&gt;

&lt;p&gt;It needs to understand business objects, field meanings, relationship structures, permission scopes, and executable actions.&lt;/p&gt;

&lt;p&gt;For example, when a user asks:&lt;/p&gt;

&lt;p&gt;"Help me analyze the sources of customers won in the last three months."&lt;/p&gt;

&lt;p&gt;AI needs to know what a customer is, what won means, which field represents source, and which field represents win time.&lt;/p&gt;

&lt;p&gt;When a user says:&lt;/p&gt;

&lt;p&gt;"Add a customer level field to the customer table."&lt;/p&gt;

&lt;p&gt;AI needs to know where the customer table is, what field type should be used, whether options are needed, and whether views and permissions are affected.&lt;/p&gt;

&lt;p&gt;When a user says:&lt;/p&gt;

&lt;p&gt;"When this contract amount exceeds 100,000, send it to the general manager for approval."&lt;/p&gt;

&lt;p&gt;AI needs to understand the contract object, amount field, workflow condition, and approver rule.&lt;/p&gt;

&lt;p&gt;All of these capabilities depend on a clear data model.&lt;/p&gt;

&lt;p&gt;Without a data model, AI can only generate content that looks plausible.&lt;/p&gt;

&lt;p&gt;With a data model, AI has a chance to become an assistant that can truly participate in building and operating business systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matters most in the initial data model
&lt;/h2&gt;

&lt;p&gt;If I focus only on the initial design, I would not try to finish every complex capability at once.&lt;/p&gt;

&lt;p&gt;I care more about a few fundamentals.&lt;/p&gt;

&lt;p&gt;First, business objects must be clear.&lt;/p&gt;

&lt;p&gt;The platform must know what business object each data table represents, not only that it is a table.&lt;/p&gt;

&lt;p&gt;Second, field types must have semantics.&lt;/p&gt;

&lt;p&gt;Fields cannot be only input controls. They must be usable by querying, permissions, workflows, reports, and AI.&lt;/p&gt;

&lt;p&gt;Third, relationships must be expressible.&lt;/p&gt;

&lt;p&gt;At minimum, the platform should support common scenarios such as one-to-one, one-to-many, master-detail, related records, and related aggregation.&lt;/p&gt;

&lt;p&gt;Fourth, the model must be able to evolve.&lt;/p&gt;

&lt;p&gt;When users later add fields, adjust relationships, or modify views, the system should not break easily.&lt;/p&gt;

&lt;p&gt;Fifth, the platform must hold boundaries.&lt;/p&gt;

&lt;p&gt;Low-code is not infinite freedom. It is allowing business to change quickly within controlled boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some mistakes I ran into
&lt;/h2&gt;

&lt;p&gt;There are several common mistakes in data-model design.&lt;/p&gt;

&lt;p&gt;The first mistake is treating fields as page controls.&lt;/p&gt;

&lt;p&gt;This is fast early on, but when workflows, permissions, statistics, and AI arrive later, the fields lack semantics.&lt;/p&gt;

&lt;p&gt;The second mistake is underestimating relationships.&lt;/p&gt;

&lt;p&gt;Enterprise business is rarely single-table business. The relationships between customers, contracts, orders, projects, and tasks are the real source of system complexity.&lt;/p&gt;

&lt;p&gt;The third mistake is being overly dynamic.&lt;/p&gt;

&lt;p&gt;Letting users configure everything looks powerful in the short term, but it makes the platform uncontrollable in the long term.&lt;/p&gt;

&lt;p&gt;The fourth mistake is adding permissions late.&lt;/p&gt;

&lt;p&gt;If permissions do not enter the data model, field-level permissions, data scopes, and workflow-node permissions all become heavy later.&lt;/p&gt;

&lt;p&gt;The fifth mistake is leaving no semantics for AI.&lt;/p&gt;

&lt;p&gt;If fields, relationships, and actions are only technical configuration, AI will struggle to understand business meaning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The direction
&lt;/h2&gt;

&lt;p&gt;The data model is one of the deepest and easiest-to-ignore capabilities in a low-code platform.&lt;/p&gt;

&lt;p&gt;Forms, workflows, permissions, reports, and AI look like different modules, but they all return to the same question:&lt;/p&gt;

&lt;p&gt;Does the platform have a clear, stable, and evolvable data model?&lt;/p&gt;

&lt;p&gt;In my view, the real value of a low-code platform is not that users write a few fewer lines of code. It is that enterprise business can be abstracted into models that continue to evolve.&lt;/p&gt;

&lt;p&gt;Forms are the entry point.&lt;/p&gt;

&lt;p&gt;The data model is the foundation.&lt;/p&gt;

&lt;p&gt;Workflows, permissions, reports, and AI are capabilities that continue to grow from that foundation.&lt;/p&gt;

&lt;p&gt;This is something I have become increasingly certain of while building INFORMAT:&lt;/p&gt;

&lt;p&gt;Platform products cannot only pursue more features. They must get the underlying model right.&lt;/p&gt;

&lt;p&gt;When the model is clear, features have roots.&lt;/p&gt;

&lt;p&gt;In the next post, I want to write about the permission system.&lt;/p&gt;

&lt;p&gt;The data model defines business objects, while the permission system decides how those objects can be safely viewed, operated on, and moved through the enterprise organization.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>database</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Designing a Form Engine from Zero to One</title>
      <dc:creator>informat</dc:creator>
      <pubDate>Tue, 04 Aug 2026 06:50:06 +0000</pubDate>
      <link>https://dev.to/informat/designing-a-form-engine-from-zero-to-one-4be5</link>
      <guid>https://dev.to/informat/designing-a-form-engine-from-zero-to-one-4be5</guid>
      <description>&lt;p&gt;Author: Skydu&lt;/p&gt;

&lt;p&gt;Summary: A form engine may look like the most basic capability in a low-code platform, but it is really the entry point for business modeling, data structure, permissions, workflows, and future AI understanding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opening
&lt;/h2&gt;

&lt;p&gt;In the previous post, I wrote about why INFORMAT is not meant to be only a low-code tool. Starting from this post, I want to go into specific modules.&lt;/p&gt;

&lt;p&gt;The first module I want to write about is the form engine.&lt;/p&gt;

&lt;p&gt;The reason is simple: in a low-code platform, forms look basic, but a form is not just a page. Many enterprise business systems begin with a form. Customer registration, contract approval, project initiation, purchase requests, inventory receiving, equipment inspections, and production reporting are all, at their core, ways to collect, organize, and move business data.&lt;/p&gt;

&lt;p&gt;So a form engine is not about dragging a few input boxes onto a canvas. It is the entry point for the platform's business modeling capability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The initial requirement looked simple
&lt;/h2&gt;

&lt;p&gt;Before building the form engine, my most straightforward idea was this: users should be able to create business forms, configure fields, and let the system automatically generate data-entry pages and data lists.&lt;/p&gt;

&lt;p&gt;That idea does not sound complicated. A form name, a group of fields, a save button, and a data list seem like enough.&lt;/p&gt;

&lt;p&gt;But once implementation begins, a series of questions appear quickly. What field types should exist? Can fields be grouped? Can fields depend on each other? Should data be validated? Should a workflow be triggered after submission? Can different people see different fields? How will form data be used by reports, automation, and AI?&lt;/p&gt;

&lt;p&gt;When these questions stack together, the form engine stops being only a frontend component. It becomes a core module that connects the data model, permission system, workflow system, and automation system.&lt;/p&gt;

&lt;h2&gt;
  
  
  A form is not a page, but a business model
&lt;/h2&gt;

&lt;p&gt;I gradually became more certain of one judgment: forms in a low-code platform should not be designed only as pages. They should be designed around business models.&lt;/p&gt;

&lt;p&gt;A page answers the question of what users see and how they fill it in. A business model answers what the business object is, how the data is stored, how relationships are expressed, and how the object moves later.&lt;/p&gt;

&lt;p&gt;For example, a customer form may appear to be only fields such as customer name, contact person, phone number, source, and owner. But behind it is a customer object. This object may relate to follow-up records, contracts, orders, payments, and projects. It may also participate in CRM workflows, sales dashboards, and customer segmentation analysis.&lt;/p&gt;

&lt;p&gt;If a form is treated only as a page, every capability that comes later becomes fragmented. If a form is treated as the entry point to a model, workflows, permissions, reports, and AI can continue to expand around the same business object.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core objects in the first design
&lt;/h2&gt;

&lt;p&gt;When designing the initial form engine, I first split the form system into several core objects.&lt;/p&gt;

&lt;p&gt;The first is the application. An application is the container for a business system, such as CRM, project management, procurement management, or equipment management.&lt;/p&gt;

&lt;p&gt;The second is the data table. A data table carries one type of business object, such as customer, contract, order, task, or equipment.&lt;/p&gt;

&lt;p&gt;The third is the field. A field describes an attribute of a business object, such as text, number, date, option, user, department, attachment, or related data.&lt;/p&gt;

&lt;p&gt;The fourth is the view. A view decides how data is presented, such as table view, detail page, form page, kanban, calendar, or dashboard.&lt;/p&gt;

&lt;p&gt;The fifth is the action. An action decides what users can do with data, such as create, edit, delete, submit for approval, import, export, or trigger automation.&lt;/p&gt;

&lt;p&gt;After this split, a form is no longer an isolated page. It becomes one interaction shape assembled from data tables, fields, views, and actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Field design is the first hard problem
&lt;/h2&gt;

&lt;p&gt;The easiest thing to underestimate in a form engine is field design.&lt;/p&gt;

&lt;p&gt;A field may look like a type selector, but different fields carry completely different data structures and business semantics. Text fields can support fuzzy search. Number fields can be aggregated. Date fields can support time filtering. User fields can connect to the organization structure. Relationship fields can establish links between business objects.&lt;/p&gt;

&lt;p&gt;So fields cannot serve only data entry. They must also support querying, statistics, permissions, workflow conditions, and AI understanding.&lt;/p&gt;

&lt;p&gt;For example, if an "owner" field is only plain text, the system does not know who that person is. It cannot evaluate permissions, send notifications, or create user-based statistics. But if it is a user field, it can connect to organizations, roles, data permissions, notifications, and workflow approvers.&lt;/p&gt;

&lt;p&gt;That is the value of field type design: it stores business meaning inside the platform model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The second hard problem is balancing dynamism and stability
&lt;/h2&gt;

&lt;p&gt;A low-code platform requires fields to be dynamically configurable, but enterprise systems also require data to be stable and reliable.&lt;/p&gt;

&lt;p&gt;There is a very real tension here. If everything is too dynamic, the system is flexible, but queries, analytics, performance, and maintenance all become more complex. If everything is too fixed, the system is stable, but every business change requires new development.&lt;/p&gt;

&lt;p&gt;So the core of form-engine design is not to pursue absolute dynamism. It is to find the boundary between dynamism and stability.&lt;/p&gt;

&lt;p&gt;Which things should users be able to configure? Which things should the platform fix in place? Which capabilities can be metadata-driven? Which areas must retain engineering constraints? These questions matter more than whether something can be dragged on a canvas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Forms and permissions must be considered together
&lt;/h2&gt;

&lt;p&gt;Many systems start by designing forms only around fields and pages, leaving permissions for later.&lt;/p&gt;

&lt;p&gt;But in enterprise systems, permissions are not an add-on. They should enter form design from the beginning.&lt;/p&gt;

&lt;p&gt;For the same form, different roles may see different fields. For the same field, some people may edit it while others can only read it. For the same record, a department lead, creator, collaborator, and administrator may all have different permissions.&lt;/p&gt;

&lt;p&gt;If the form engine does not leave room for field-level permissions, record-level permissions, and action permissions, connecting real business scenarios later becomes painful.&lt;/p&gt;

&lt;p&gt;So in INFORMAT, I want forms to connect naturally to the permission system instead of being isolated generated pages. Form fields, data scopes, and operation buttons should all be controllable by permission rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Forms and workflows cannot be separated
&lt;/h2&gt;

&lt;p&gt;In enterprises, many forms are not simply saved after completion. They enter a business process.&lt;/p&gt;

&lt;p&gt;Purchase requests need approval. Contracts need legal review. Project initiation needs owner confirmation. Expense reimbursements need finance processing.&lt;/p&gt;

&lt;p&gt;This means the form engine must work with the workflow engine. Forms collect and display data; workflows move that data across different nodes.&lt;/p&gt;

&lt;p&gt;More importantly, each workflow node may have its own form permissions. Which fields can the initiator fill in? Which fields can the approver modify? What can a copied recipient only view?&lt;/p&gt;

&lt;p&gt;So the form engine, as I understand it, is not only a data-entry page generator. It is the carrier layer for business data inside workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Form data must also be understood by AI
&lt;/h2&gt;

&lt;p&gt;When building a form engine now, AI has to be considered.&lt;/p&gt;

&lt;p&gt;If AI is expected to help users generate forms, analyze data, configure workflows, and answer business questions, then the form model must be clear enough.&lt;/p&gt;

&lt;p&gt;AI needs to know what each field means, which fields represent users, which represent amounts, which represent status, which represent time, and which relate to other business objects.&lt;/p&gt;

&lt;p&gt;If a form is only a set of input boxes without semantics, AI will have a hard time truly understanding the business. It may generate a page, but it will struggle to participate safely and accurately in enterprise processes.&lt;/p&gt;

&lt;p&gt;So AI plus low-code is not about adding a chat box outside the form. It is about making the platform's internal models, fields, relationships, and permissions understandable and callable by AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matters most in the initial design
&lt;/h2&gt;

&lt;p&gt;If I am only building the initial design, I would not try to finish every advanced capability at once.&lt;/p&gt;

&lt;p&gt;There are three things I care about most.&lt;/p&gt;

&lt;p&gt;First, the model must be clear. The relationships between applications, data tables, fields, views, and actions must be stable so the platform can keep expanding later.&lt;/p&gt;

&lt;p&gt;Second, fields must have semantics. Field types cannot be only frontend controls. They must support querying, analytics, permissions, workflows, and AI.&lt;/p&gt;

&lt;p&gt;Third, the boundaries must be prepared. Forms should be able to connect to permissions, workflows, automation, and reports, even if the first implementation does not push every capability to the extreme. The key is that the architecture must not block those paths.&lt;/p&gt;

&lt;p&gt;For platform products, the biggest risk is not that the initial feature set is small. It is that the initial model is wrong. Missing features can be added. A wrong model makes every later step heavier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some mistakes I ran into
&lt;/h2&gt;

&lt;p&gt;I also ran into plenty of mistakes while building the form engine.&lt;/p&gt;

&lt;p&gt;The first mistake was paying attention to the interface too early. Drag-and-drop experience, control styling, and layout details are exciting, but if the underlying model is unclear, the prettier the interface is, the more painful later changes become.&lt;/p&gt;

&lt;p&gt;The second mistake was underestimating field dependencies and validation. In real business, fields are not isolated. Selecting a customer may bring out contact people. Selecting a department may restrict the user range. An amount above a threshold may trigger approval. These all require rule capabilities inside the form.&lt;/p&gt;

&lt;p&gt;The third mistake was treating lists and forms separately. Many business scenarios do not only need data entry. They also need filtering, sorting, batch operations, import and export, and aggregation. Forms and lists are really two views over the same data model.&lt;/p&gt;

&lt;p&gt;The fourth mistake was adding permissions late. If permissions do not enter the model at the beginning, adding field-level permissions, data permissions, and workflow-node permissions later affects almost everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The direction
&lt;/h2&gt;

&lt;p&gt;The form engine is the most basic module in a low-code platform, but basic does not mean simple.&lt;/p&gt;

&lt;p&gt;It connects the most central question in enterprise business systems: how to settle business objects, business data, and business rules into the platform.&lt;/p&gt;

&lt;p&gt;In my view, a good form engine should not only help users build pages faster. It should help companies define their business more clearly.&lt;/p&gt;

&lt;p&gt;That is also the direction INFORMAT keeps moving toward: starting from forms, but not stopping at forms; starting from low-code, but ultimately serving enterprise digitization and intelligence.&lt;/p&gt;

&lt;p&gt;In the next post, I want to continue with the data model. Forms are only the entry point. What really supports the platform's long-term evolution is the data model behind the forms.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>software</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Why I Am Rebuilding Enterprise Low-Code for the AI Era</title>
      <dc:creator>informat</dc:creator>
      <pubDate>Sun, 02 Aug 2026 13:43:49 +0000</pubDate>
      <link>https://dev.to/informat/why-i-am-rebuilding-enterprise-low-code-for-the-ai-era-5el0</link>
      <guid>https://dev.to/informat/why-i-am-rebuilding-enterprise-low-code-for-the-ai-era-5el0</guid>
      <description>&lt;p&gt;Low-code has become a familiar phrase.&lt;/p&gt;

&lt;p&gt;Drag-and-drop forms. Generated pages. Approval flows. Dashboards. Internal tools. We have all seen the demos, and many of them are genuinely useful.&lt;/p&gt;

&lt;p&gt;But after spending years around enterprise digitization projects, I became less interested in how quickly a page can be assembled, and more interested in a harder question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can the system still be understood, maintained, governed, and extended after the business changes?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the question behind &lt;a href="https://www.ainformat.com/" rel="noopener noreferrer"&gt;INFORMAT&lt;/a&gt;, the international version of the enterprise low-code platform I have been building.&lt;/p&gt;

&lt;p&gt;This post is the first entry in a development log. It is not a polished product announcement. It is a record of why I think enterprise low-code needs to be rebuilt as a durable digital foundation, especially now that AI is becoming part of how software is designed, configured, and operated.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem was not "no software"
&lt;/h2&gt;

&lt;p&gt;When I first worked with enterprise digital transformation, the problem I saw most often was not that companies had no tools.&lt;/p&gt;

&lt;p&gt;Usually, they had too many.&lt;/p&gt;

&lt;p&gt;Customer information lived in spreadsheets. Approvals happened in chat groups. Contracts were stored in cloud drives. Tasks lived in project management tools. Finance had a separate system. Each tool made sense on its own, but once the real business process crossed those boundaries, things began to break.&lt;/p&gt;

&lt;p&gt;Data did not match.&lt;/p&gt;

&lt;p&gt;Nobody knew where a process was stuck.&lt;/p&gt;

&lt;p&gt;Permissions were unclear.&lt;/p&gt;

&lt;p&gt;Renaming one field could affect pages, reports, import templates, APIs, and approval conditions.&lt;/p&gt;

&lt;p&gt;Business users felt the system was hard to use. Developers felt requirements never stopped changing. Managers no longer trusted the data. Eventually, people quietly moved back to manual spreadsheets and offline communication.&lt;/p&gt;

&lt;p&gt;That pattern shaped my view of enterprise software:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A company does not just need another app. It needs the ability to continuously model, run, and govern its business.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Low-code is the entry point, not the destination
&lt;/h2&gt;

&lt;p&gt;Low-code is valuable because it shortens the path from business idea to working system.&lt;/p&gt;

&lt;p&gt;If the goal is a customer registration form, a leave request flow, or a task list, low-code can help build it quickly.&lt;/p&gt;

&lt;p&gt;But enterprise work rarely stops at one form.&lt;/p&gt;

&lt;p&gt;A customer record leads to contacts, follow-ups, contracts, orders, payments, support tickets, and renewal risk.&lt;/p&gt;

&lt;p&gt;A leave request connects to organization structure, attendance rules, payroll, and permission boundaries.&lt;/p&gt;

&lt;p&gt;A project task connects to members, workload, cost, timeline, risk, and reporting.&lt;/p&gt;

&lt;p&gt;If a platform only answers "how do we generate this page?", then relationships, workflow, permissions, analytics, and integrations will eventually become isolated again.&lt;/p&gt;

&lt;p&gt;This is why I do not want to define INFORMAT as only a low-code tool.&lt;/p&gt;

&lt;p&gt;I think of it as an enterprise digital foundation.&lt;/p&gt;

&lt;p&gt;Low-code is the entry point because it helps teams create business systems faster. The foundation is the real goal because companies need those systems to keep running, keep changing, and stay internally consistent over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  A platform is different from an application
&lt;/h2&gt;

&lt;p&gt;When you build a fixed business application, many decisions can be hard-coded.&lt;/p&gt;

&lt;p&gt;In a CRM, you can define the objects, fields, flows, roles, and reports ahead of time.&lt;/p&gt;

&lt;p&gt;A low-code platform is different.&lt;/p&gt;

&lt;p&gt;Users create their own applications. They define tables, add fields, configure views, design workflows, set permissions, and connect automations. Today the app may be customer management. Tomorrow it may be procurement approval, equipment inspection, or project delivery.&lt;/p&gt;

&lt;p&gt;That means the platform cannot only know how to render the current page.&lt;/p&gt;

&lt;p&gt;It has to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the business object represents&lt;/li&gt;
&lt;li&gt;what each field means&lt;/li&gt;
&lt;li&gt;how objects relate to each other&lt;/li&gt;
&lt;li&gt;who can see or change which data&lt;/li&gt;
&lt;li&gt;how a workflow moves under different conditions&lt;/li&gt;
&lt;li&gt;which tools automation and AI are allowed to call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, the platform must store business data and also the metadata that describes the business.&lt;/p&gt;

&lt;p&gt;This idea drives many design decisions in INFORMAT:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A form is not just a page.&lt;/li&gt;
&lt;li&gt;A field is not just an input control.&lt;/li&gt;
&lt;li&gt;Permission is not just a menu setting.&lt;/li&gt;
&lt;li&gt;A workflow is not just a diagram.&lt;/li&gt;
&lt;li&gt;AI is not just a chatbot attached to the side of the product.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why AI makes this worth rebuilding
&lt;/h2&gt;

&lt;p&gt;AI coding tools are already very good at producing screens, APIs, scripts, and small features.&lt;/p&gt;

&lt;p&gt;But an enterprise system is not just a collection of generated code snippets.&lt;/p&gt;

&lt;p&gt;Enterprise systems need to answer precise operational questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the relationship between a customer and a contract?&lt;/li&gt;
&lt;li&gt;Who is allowed to view this record?&lt;/li&gt;
&lt;li&gt;Which fields can be edited during approval?&lt;/li&gt;
&lt;li&gt;How do we trace a failed automation?&lt;/li&gt;
&lt;li&gt;Can AI-generated changes be audited?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that knowledge is scattered across code, prompts, documents, and people's memory, the system becomes harder to govern as it grows.&lt;/p&gt;

&lt;p&gt;Low-code platforms have an important advantage here: they can make business objects, fields, relationships, permissions, workflows, and operation logs explicit.&lt;/p&gt;

&lt;p&gt;Once those structures are explicit, AI can work inside a real business context instead of guessing from thin air.&lt;/p&gt;

&lt;p&gt;To me, AI plus low-code should not mean placing a chat box next to a traditional builder. It should mean allowing AI to understand the platform's models, rules, and tools, then participate in modeling, configuration, analysis, and execution within authorized boundaries.&lt;/p&gt;

&lt;p&gt;That is the direction I want INFORMAT to move toward.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matters in the first stage
&lt;/h2&gt;

&lt;p&gt;From an engineering perspective, the first stage is not about piling up as many features as possible.&lt;/p&gt;

&lt;p&gt;It is about getting the foundation right.&lt;/p&gt;

&lt;p&gt;There are five things I care about most:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Business objects must be clear.&lt;/strong&gt; Applications, tables, fields, views, and actions need a coherent model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fields must carry semantics.&lt;/strong&gt; Text, numbers, dates, users, departments, related records, attachments, and statuses should support querying, analytics, permissions, workflows, and AI understanding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions must be modeled early.&lt;/strong&gt; Retrofitting permissions after data, workflows, and reports are already running is painful and risky.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflows and automation should happen around data.&lt;/strong&gt; A workflow is not an isolated approval chart; it changes the state of a business object.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The system must be traceable.&lt;/strong&gt; Who changed what, where a workflow is, whether an automation succeeded, and which tools AI used should all leave records.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These capabilities are less visually impressive than a drag-and-drop page builder.&lt;/p&gt;

&lt;p&gt;But they decide whether the platform can support real enterprise operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I am writing this log
&lt;/h2&gt;

&lt;p&gt;Writing development logs is also a way to force myself to review the design.&lt;/p&gt;

&lt;p&gt;Platform products easily become complex. If the motivation behind a design is not written down, even the builder can forget why certain trade-offs were made.&lt;/p&gt;

&lt;p&gt;So this series will try to stay close to the engineering process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what the feature is&lt;/li&gt;
&lt;li&gt;why it exists&lt;/li&gt;
&lt;li&gt;where the boundary is&lt;/li&gt;
&lt;li&gt;what turned out harder than expected&lt;/li&gt;
&lt;li&gt;what still needs to be improved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next posts, I plan to write about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why the form engine is not just a page generator&lt;/li&gt;
&lt;li&gt;how the data model of a low-code platform should be designed&lt;/li&gt;
&lt;li&gt;why permissions are more complicated than they look&lt;/li&gt;
&lt;li&gt;how workflow, automation, reporting, integration, and AI connect to the same foundation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;INFORMAT is not trying to be another tool that only makes page creation faster.&lt;/p&gt;

&lt;p&gt;It is my attempt to build a system foundation where enterprise business can be continuously modeled, continuously operated, and continuously evolved.&lt;/p&gt;

&lt;p&gt;You can learn more about the overseas version here: &lt;a href="https://www.ainformat.com/" rel="noopener noreferrer"&gt;https://www.ainformat.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
  </channel>
</rss>
