<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://nocode-js.com/blog</id>
    <title>NoCode JS Blog</title>
    <updated>2026-06-07T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://nocode-js.com/blog"/>
    <subtitle>NoCode JS Blog</subtitle>
    <icon>https://nocode-js.com/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Windows Workflow Foundation Alternative]]></title>
        <id>https://nocode-js.com/blog/windows-workflow-foundation-alternative</id>
        <link href="https://nocode-js.com/blog/windows-workflow-foundation-alternative"/>
        <updated>2026-06-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Modernize Windows Workflow Foundation with a browser-based workflow designer that can work with React, Angular, Svelte, TypeScript, and C# backends.]]></summary>
        <content type="html"><![CDATA[<div class="text--center"><p><img loading="lazy" alt="Windows Workflow Foundation Alternative" src="/assets/images/2026-06-07-windows-workflow-foundation-alternative-99858c0bca2dcd52d233f1ee5ab54d91.jpg" width="1920" height="960" class="img_ev3q"></p></div><p>Windows Workflow Foundation was once one of the most powerful ways to build workflow-driven applications in the Microsoft ecosystem. It gave .NET developers a visual designer, a runtime, and a structured model for creating business processes that could be configured without hard-coding every rule.</p><p>For many years, WF was a practical foundation for building internal tools, low-code workflow designer experiences, and even no-code workflow builder platforms.</p><p>But the software landscape has changed.</p><p>Today, users expect workflow tools to run in the browser. They expect modern web interfaces, easy integration with existing applications, and increasingly, AI-assisted ways to create, modify, and understand business processes. Maintaining a workflow product that depends on desktop-only tooling is becoming harder to justify.</p><p>The question is no longer whether Windows Workflow Foundation was a good technology. It was. The real question is whether it still fits the way modern software is built, deployed, and used.</p><p>For teams planning Windows Workflow Foundation migration, a practical first step is not always a full rewrite. In many cases, the best starting point is replacing the old desktop workflow designer with a modern workflow designer that runs directly in the browser.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-teams-look-for-a-windows-workflow-foundation-alternative">Why Teams Look for a Windows Workflow Foundation Alternative<a href="#why-teams-look-for-a-windows-workflow-foundation-alternative" class="hash-link" aria-label="Direct link to Why Teams Look for a Windows Workflow Foundation Alternative" title="Direct link to Why Teams Look for a Windows Workflow Foundation Alternative">​</a></h2><p>Many WF-based products are still valuable. They often contain years of business logic, customer-specific processes, integrations, and domain knowledge. The problem is not always the backend. The problem is often the user experience around workflow design.</p><p>Classic Windows Workflow Foundation applications were built for a different era. Desktop tools were normal. Browser-based workflow designer interfaces were not the default expectation. Teams could accept complex local installations, Windows-only tooling, and designer experiences that were tightly connected to the .NET Framework ecosystem.</p><p>That is much harder today.</p><p>Modern users expect to open a browser, edit a workflow, save changes, collaborate with others, and continue working from anywhere. Modern developers expect embeddable components, JSON-based definitions, frontend framework support, and clean integration with existing systems.</p><p>This is why many teams are searching for a Workflow Foundation alternative. They do not necessarily want to throw away their entire platform. They want a realistic path for .NET workflow modernization.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-wf-replacement-does-not-have-to-mean-a-full-rewrite">A WF Replacement Does Not Have to Mean a Full Rewrite<a href="#a-wf-replacement-does-not-have-to-mean-a-full-rewrite" class="hash-link" aria-label="Direct link to A WF Replacement Does Not Have to Mean a Full Rewrite" title="Direct link to A WF Replacement Does Not Have to Mean a Full Rewrite">​</a></h2><p>When people talk about a WF replacement, they often imagine a huge migration project: rewrite the designer, rewrite the runtime, rewrite the backend, convert all workflow definitions, and replace every piece of existing business logic.</p><p>That approach is possible, but it is not always the best first step.</p><p>A more practical strategy is to separate the problem into layers:</p><ol><li>The workflow designer</li><li>The workflow definition format</li><li>The workflow runtime</li><li>The business logic</li><li>The backend services</li><li>The user interface around workflow management</li></ol><p>Once you separate these layers, Windows Workflow Foundation migration becomes easier to reason about.</p><p>Maybe you only need to replace the designer first. Maybe your C# backend still works. Maybe your business logic should stay where it is. Maybe your first goal is simply to give users a modern workflow designer in the browser instead of forcing them to use desktop tooling.</p><p>That is where <a href="/sequential-workflow-designer">Sequential Workflow Designer</a> can be useful.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="sequential-workflow-designer-as-a-modern-workflow-designer">Sequential Workflow Designer as a Modern Workflow Designer<a href="#sequential-workflow-designer-as-a-modern-workflow-designer" class="hash-link" aria-label="Direct link to Sequential Workflow Designer as a Modern Workflow Designer" title="Direct link to Sequential Workflow Designer as a Modern Workflow Designer">​</a></h2><p>Sequential Workflow Designer is a browser-based workflow designer for building visual workflow editing experiences in modern web applications.</p><div class="text--center"><p><img loading="lazy" alt="Sequential Workflow Designer as a Modern Workflow Designer" src="/assets/images/2026-06-07-windows-workflow-foundation-alternative-2-ac042356a63b0c044cb177574a905acd.jpg" width="2514" height="1490" class="img_ev3q"></p></div><p>It can be used to create workflow builders, automation tools, low-code workflow designer interfaces, and no-code workflow builder experiences. Instead of depending on old desktop tooling, it allows teams to embed workflow design directly into a web application.</p><p>This is especially relevant for teams that are modernizing products built around Windows Workflow Foundation.</p><p>If your current WF-based application depends heavily on the visual designer experience, Sequential Workflow Designer gives you a way to move that part of the product into the browser. It does not require you to replace your whole backend on day one. It can become the new workflow UI while the rest of your system evolves step by step.</p><p>That makes it a practical Workflow Foundation alternative for teams that want modernization without unnecessary risk.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="replace-only-the-ui-and-keep-your-c-backend">Replace Only the UI and Keep Your C# Backend<a href="#replace-only-the-ui-and-keep-your-c-backend" class="hash-link" aria-label="Direct link to Replace Only the UI and Keep Your C# Backend" title="Direct link to Replace Only the UI and Keep Your C# Backend">​</a></h2><p>One of the most important migration ideas is this: you do not have to replace everything at once.</p><p>If your existing backend is written in C#, you can keep it. Sequential Workflow Designer can be used as the browser-based workflow designer while your backend continues to handle execution, validation, persistence, permissions, and business rules.</p><p>In this model, the workflow designer becomes a modern web UI. The workflow definition can be stored as JSON. Your existing backend can read that definition and map it to your current execution model or business services.</p><p>This approach is useful when the biggest problem is not the backend, but the old designer experience.</p><p>For example:</p><ul><li>You want to replace a desktop workflow editor with a browser-based workflow designer.</li><li>You want users to edit workflows inside your web application.</li><li>You want to modernize the UI without rewriting all business logic.</li><li>You want a better foundation for future .NET workflow modernization.</li><li>You want to move away from WF gradually instead of starting with a risky full rewrite.</li></ul><p>This is often the most realistic path for existing enterprise applications.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="use-it-with-react-angular-svelte-or-typescript">Use It with React, Angular, Svelte, or TypeScript<a href="#use-it-with-react-angular-svelte-or-typescript" class="hash-link" aria-label="Direct link to Use It with React, Angular, Svelte, or TypeScript" title="Direct link to Use It with React, Angular, Svelte, or TypeScript">​</a></h2><p>Sequential Workflow Designer is not limited to one frontend framework. That matters because modern software teams use different stacks.</p><p>If your product is built with React, you can use Sequential Workflow Designer in a React application.</p><p>If your frontend is Angular, you can use it there as well.</p><p>If you use Svelte, plain TypeScript, or a custom frontend architecture, the same idea applies. The designer is intended to be embedded into modern web applications rather than locked to one specific platform.</p><p>This flexibility is important for teams searching for a Windows Workflow Foundation alternative. WF came from a tightly integrated .NET Framework desktop world. Modern applications are usually more distributed. The frontend may be React. The backend may be C#. Some services may be Node.js. Some systems may be cloud-native. Some business logic may still live in existing enterprise services.</p><p>A modern workflow designer should fit into that reality.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="where-sequential-workflow-machine-fits">Where Sequential Workflow Machine Fits<a href="#where-sequential-workflow-machine-fits" class="hash-link" aria-label="Direct link to Where Sequential Workflow Machine Fits" title="Direct link to Where Sequential Workflow Machine Fits">​</a></h2><p>Sequential Workflow Designer focuses on the visual workflow design experience. It is the part users interact with when they build or edit workflows.</p><p>If you also want a JavaScript or TypeScript workflow execution layer, <a href="/sequential-workflow-machine">Sequential Workflow Machine</a> can be considered as the runtime counterpart.</p><p>This can be useful when:</p><ul><li>Your backend is moving to Node.js.</li><li>You want to execute workflows in a JavaScript or TypeScript environment.</li><li>You are building a new automation platform.</li><li>You want the designer and runtime to live closer to the same technology stack.</li><li>You are creating a no-code workflow builder from scratch.</li></ul><p>However, it is important to be precise. Sequential Workflow Designer alone is not a complete drop-in WF replacement. Windows Workflow Foundation included much more than a designer. It also included a runtime model, persistence concepts, and deep integration with the .NET Framework ecosystem.</p><p>A better way to describe Sequential Workflow Designer is this: it can be a practical part of a WF replacement strategy, especially when the first migration goal is to modernize the workflow design experience.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="possible-migration-paths">Possible Migration Paths<a href="#possible-migration-paths" class="hash-link" aria-label="Direct link to Possible Migration Paths" title="Direct link to Possible Migration Paths">​</a></h2><p>Different teams need different levels of migration. A Windows Workflow Foundation migration does not have to look the same for every product.</p><table><thead><tr><th>Situation</th><th>Practical path</th></tr></thead><tbody><tr><td>You only need a modern workflow UI</td><td>Use Sequential Workflow Designer and keep your existing backend</td></tr><tr><td>You want browser-based workflow editing</td><td>Embed Sequential Workflow Designer into your web application</td></tr><tr><td>You want to keep C# business logic</td><td>Store workflow definitions from the designer and execute them server-side</td></tr><tr><td>You use React, Angular, Svelte, or TypeScript</td><td>Use Sequential Workflow Designer in your frontend stack</td></tr><tr><td>You are moving execution to Node.js</td><td>Evaluate Sequential Workflow Machine</td></tr><tr><td>You need a complete enterprise BPM platform</td><td>Consider whether a larger workflow platform is required</td></tr></tbody></table><p>The key point is that .NET workflow modernization can be incremental.</p><p>You can start by replacing the old workflow designer. Then you can decide whether the runtime should stay in C#, move to another .NET model, or eventually move toward JavaScript or TypeScript with Sequential Workflow Machine.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="recommended-approach-for-wf-modernization">Recommended Approach for WF Modernization<a href="#recommended-approach-for-wf-modernization" class="hash-link" aria-label="Direct link to Recommended Approach for WF Modernization" title="Direct link to Recommended Approach for WF Modernization">​</a></h2><p>If you are maintaining a WF-based product, start by understanding what Windows Workflow Foundation actually does in your system.</p><p>Ask these questions:</p><ol><li>Do users still use the visual designer?</li><li>Is the biggest pain the desktop workflow editing experience?</li><li>Is the runtime still working well enough?</li><li>Is the C# business logic valuable and stable?</li><li>Are workflows mostly configuration, orchestration, or long-running processes?</li><li>Do you need a full runtime replacement now, or only a modern workflow designer?</li><li>Could the workflow definition be represented as JSON?</li><li>Could the browser UI be modernized before replacing the backend?</li></ol><p>In many cases, the answer is clear: start with the UI.</p><p>Replacing the designer first gives users an immediate improvement. It also gives developers a cleaner path toward future modernization. Instead of trying to replace the whole WF-based system in one step, you can gradually move toward a more flexible architecture.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-browser-based-workflow-design-matters">Why Browser-Based Workflow Design Matters<a href="#why-browser-based-workflow-design-matters" class="hash-link" aria-label="Direct link to Why Browser-Based Workflow Design Matters" title="Direct link to Why Browser-Based Workflow Design Matters">​</a></h2><p>A browser-based workflow designer is not just a cosmetic upgrade. It changes how users interact with workflows.</p><p>Users no longer need a desktop designer. They no longer need a specific Windows environment just to edit a process. They can work inside the same web application where the rest of the product already lives.</p><p>This also opens the door for more modern product experiences:</p><ul><li>collaborative workflow editing</li><li>workflow templates</li><li>embedded validation</li><li>AI-assisted workflow creation</li><li>AI-assisted workflow explanation</li><li>better integration with SaaS applications</li><li>easier deployment</li><li>better onboarding for business users</li><li>no-code workflow builder experiences directly in the browser</li></ul><p>This is one of the strongest reasons to consider a Workflow Foundation alternative. The goal is not only to remove old technology. The goal is to create a better workflow experience for users and a better architecture for developers.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2><p>Windows Workflow Foundation was a strong technology for its time. It helped many .NET teams build workflow-driven systems, low-code platforms, and configurable business applications.</p><p>But modern software has moved toward browser-based interfaces, cloud-connected systems, AI-assisted tools, and more flexible frontend and backend architectures. For many teams, continuing to depend on desktop-only workflow tooling is no longer the best path forward.</p><p>A Windows Workflow Foundation migration does not need to start with a full rewrite. A practical first step can be replacing the old designer with a modern workflow designer that runs in the browser.</p><p>Sequential Workflow Designer is a strong option for that first step. It can be embedded into modern web applications, used with different frontend stacks, and integrated with an existing C# backend. When a JavaScript or TypeScript runtime is needed, Sequential Workflow Machine can also be evaluated.</p><p>For teams looking for a Windows Workflow Foundation alternative, the most realistic strategy may be simple:</p><p>Modernize the workflow designer first. Keep what still works. Replace the rest only when it makes sense.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Top JavaScript Workflow Builder Libraries in 2026]]></title>
        <id>https://nocode-js.com/blog/top-javascript-workflow-builder-libraries</id>
        <link href="https://nocode-js.com/blog/top-javascript-workflow-builder-libraries"/>
        <updated>2026-03-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Compare Sequential Workflow Designer, React Flow, and JointJS to choose the right JavaScript workflow builder for your visual editor.]]></summary>
        <content type="html"><![CDATA[<div class="text--center"><p><img loading="lazy" alt="Top JavaScript Workflow Builder Libraries in 2026" src="/assets/images/2026-03-08-top-javascript-workflow-builder-libraries-991d9101a3bc320f836398dd48c7afdb.jpg" width="1920" height="960" class="img_ev3q"></p></div><p>Modern applications often need visual tools that allow users to design processes and automate tasks without writing code. From approval flows and task automation to no-code platforms and data pipelines, visual workflow editors are becoming a common feature in many web applications. Instead of building these editors from scratch, developers can rely on JavaScript libraries that provide ready-to-use workflow builder components.</p><p>In this guide, we compare three popular libraries used to build workflow editors in web applications:</p><ul><li>Sequential Workflow Designer  </li><li>React Flow  </li><li>JointJS  </li></ul><p>Each library approaches visual editors differently. Some focus specifically on workflows, while others provide general diagramming or graph editing capabilities that can be adapted for workflows.</p><hr><h1>What Is a JavaScript Workflow Builder?</h1><p>A <strong>JavaScript workflow builder</strong> is a UI component that allows users to visually design processes directly inside a web application.</p><p>Instead of writing code, users can create workflows by connecting steps in a graphical interface.</p><p>Typical workflow builder capabilities include:</p><ul><li>drag-and-drop step creation  </li><li>connecting steps with arrows  </li><li>editing step configuration  </li><li>exporting workflows as JSON  </li><li>visualizing execution order  </li></ul><p>These tools are commonly used in:</p><ul><li>approval workflows  </li><li>automation systems  </li><li>no-code platforms  </li><li>data processing pipelines  </li><li>AI workflow editors  </li></ul><p>Some libraries focus on <strong>workflow structures</strong>, while others provide <strong>general diagram or node graph tools</strong> that developers adapt to workflow systems.</p><hr><h1>Sequential Workflow Designer</h1><p><strong>Type:</strong> Workflow builder<br>
<strong>Framework:</strong> Framework-agnostic (JavaScript / TypeScript)</p><p><a href="https://github.com/nocode-js/sequential-workflow-designer" target="_blank" rel="noopener noreferrer">Sequential Workflow Designer</a> is a lightweight open-source library designed specifically for building <strong>step-based workflow editors</strong>.</p><p>Unlike general diagram libraries, it focuses on <strong>structured sequential workflows</strong>, where steps execute in a defined order. This makes it particularly useful for applications that need approval flows, automation pipelines, or internal process builders.</p><p>The library is framework-agnostic, meaning it can be integrated into <strong>React, Angular, Svelte, or plain JavaScript applications</strong>.</p><p>Explore the project:</p><p>👉 <a href="https://github.com/nocode-js/sequential-workflow-designer" target="_blank" rel="noopener noreferrer">https://github.com/nocode-js/sequential-workflow-designer</a></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="key-features">Key Features<a href="#key-features" class="hash-link" aria-label="Direct link to Key Features" title="Direct link to Key Features">​</a></h2><ul><li>visual workflow editor  </li><li>sequential step structure  </li><li>JSON workflow definitions  </li><li>customizable step configuration panels  </li><li>framework-agnostic core  </li><li>official wrappers for <strong>Angular, React, and Svelte</strong>  </li><li>no external dependencies  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="framework-support">Framework Support<a href="#framework-support" class="hash-link" aria-label="Direct link to Framework Support" title="Direct link to Framework Support">​</a></h2><p>Sequential Workflow Designer uses a <strong>framework-independent core</strong>, which means it can be integrated into almost any JavaScript application.</p><p>To simplify integration with modern frontend frameworks, official wrappers are available for:</p><ul><li>React  </li><li>Angular  </li><li>Svelte  </li></ul><p>These wrappers allow developers to embed the workflow editor directly into component-based applications while keeping workflow definitions portable via JSON.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="pros">Pros<a href="#pros" class="hash-link" aria-label="Direct link to Pros" title="Direct link to Pros">​</a></h2><ul><li>purpose-built for workflows  </li><li>lightweight and easy to integrate  </li><li>framework-agnostic  </li><li>official wrappers for modern frameworks  </li><li>MIT licensed and fully open source  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="cons">Cons<a href="#cons" class="hash-link" aria-label="Direct link to Cons" title="Direct link to Cons">​</a></h2><ul><li>optimized for sequential workflows rather than arbitrary graphs  </li><li>smaller ecosystem compared to large diagram libraries  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="best-for">Best For<a href="#best-for" class="hash-link" aria-label="Direct link to Best For" title="Direct link to Best For">​</a></h2><ul><li>approval processes  </li><li>automation pipelines  </li><li>SaaS workflow builders  </li><li>no-code tools  </li><li>applications built with <strong>React, Angular, or Svelte</strong></li></ul><hr><h1>React Flow</h1><p><strong>Type:</strong> Node-based editor<br>
<strong>Framework:</strong> React</p><p>React Flow is a widely used library for building <strong>node-based editors and visual graph interfaces</strong> in React applications.</p><p>Developers can create custom nodes, connect them with edges, and build highly interactive visual editors.</p><p>Because of its flexibility, React Flow is commonly used for:</p><ul><li>workflow editors  </li><li>visual programming tools  </li><li>AI pipelines  </li><li>data flow interfaces  </li></ul><p>However, React Flow is primarily a <strong>graph editor</strong>, so developers must implement workflow logic and execution themselves.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="key-features-1">Key Features<a href="#key-features-1" class="hash-link" aria-label="Direct link to Key Features" title="Direct link to Key Features">​</a></h2><ul><li>customizable nodes and edges  </li><li>drag-and-drop editor  </li><li>zoom and pan controls  </li><li>layout integrations  </li><li>strong React ecosystem support  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="pros-1">Pros<a href="#pros-1" class="hash-link" aria-label="Direct link to Pros" title="Direct link to Pros">​</a></h2><ul><li>extremely flexible  </li><li>strong developer community  </li><li>ideal for React applications  </li><li>supports complex graph structures  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="cons-1">Cons<a href="#cons-1" class="hash-link" aria-label="Direct link to Cons" title="Direct link to Cons">​</a></h2><ul><li>React-only  </li><li>requires custom workflow logic  </li><li>more implementation work for workflow features  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="best-for-1">Best For<a href="#best-for-1" class="hash-link" aria-label="Direct link to Best For" title="Direct link to Best For">​</a></h2><ul><li>React visual editors  </li><li>graph-based tools  </li><li>visual programming interfaces  </li></ul><hr><h1>JointJS</h1><p><strong>Type:</strong> Diagramming framework<br>
<strong>Framework:</strong> JavaScript / TypeScript</p><p>JointJS is a powerful diagramming framework used to build <strong>interactive diagrams and modeling tools</strong>.</p><p>It provides advanced capabilities such as custom shapes, connectors, and graph layouts, making it suitable for complex visual applications.</p><p>JointJS is often used to build:</p><ul><li>enterprise diagram editors  </li><li>BPMN modeling tools  </li><li>visual modeling platforms  </li></ul><p>However, like React Flow, it is not specifically designed for workflows and requires additional logic to implement workflow execution.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="key-features-2">Key Features<a href="#key-features-2" class="hash-link" aria-label="Direct link to Key Features" title="Direct link to Key Features">​</a></h2><ul><li>customizable diagram elements  </li><li>graph modeling tools  </li><li>advanced interactions  </li><li>layout algorithms  </li><li>modular architecture  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="pros-2">Pros<a href="#pros-2" class="hash-link" aria-label="Direct link to Pros" title="Direct link to Pros">​</a></h2><ul><li>powerful diagram capabilities  </li><li>suitable for complex modeling tools  </li><li>extensive customization options  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="cons-2">Cons<a href="#cons-2" class="hash-link" aria-label="Direct link to Cons" title="Direct link to Cons">​</a></h2><ul><li>higher integration complexity  </li><li>some advanced features require commercial licensing  </li><li>not workflow-specific  </li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="best-for-2">Best For<a href="#best-for-2" class="hash-link" aria-label="Direct link to Best For" title="Direct link to Best For">​</a></h2><ul><li>enterprise diagram tools  </li><li>BPMN editors  </li><li>modeling applications  </li><li>complex visual editors  </li></ul><hr><h1>Comparison: JavaScript Workflow Builder Libraries</h1><p>The following table summarizes the main differences between the three libraries.</p><table><thead><tr><th>Feature</th><th>Sequential Workflow Designer</th><th>React Flow</th><th>JointJS</th></tr></thead><tbody><tr><td>Primary purpose</td><td>Workflow builder ✅</td><td>Node graph editor</td><td>Diagramming framework</td></tr><tr><td>Framework support</td><td>Angular / React / Svelte / JS ✅</td><td>React only</td><td>JavaScript / TypeScript</td></tr><tr><td>Dependencies</td><td>None ✅</td><td>React ecosystem</td><td>Multiple modules</td></tr><tr><td>Built-in workflow structure</td><td>Yes ✅</td><td>No</td><td>No</td></tr><tr><td>Graph flexibility</td><td>Sequential workflows</td><td>High ✅</td><td>High</td></tr><tr><td>Integration complexity</td><td>Low ✅</td><td>Medium</td><td>High</td></tr><tr><td>License</td><td>MIT (Free) ✅</td><td>MIT (Free)</td><td>Commercial / Mixed</td></tr><tr><td>Best use case</td><td>Workflow automation tools ✅</td><td>React node editors</td><td>Enterprise diagram apps</td></tr></tbody></table><hr><h1>When to Use Each Tool</h1><p>Choosing the right library depends on the type of visual editor you want to build.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-sequential-workflow-designer-if">Use Sequential Workflow Designer if<a href="#use-sequential-workflow-designer-if" class="hash-link" aria-label="Direct link to Use Sequential Workflow Designer if" title="Direct link to Use Sequential Workflow Designer if">​</a></h3><ul><li>you need a <strong>workflow builder UI</strong></li><li>your processes follow <strong>ordered steps</strong></li><li>you want a <strong>lightweight solution</strong></li><li>your application includes <strong>automation workflows</strong></li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-react-flow-if">Use React Flow if<a href="#use-react-flow-if" class="hash-link" aria-label="Direct link to Use React Flow if" title="Direct link to Use React Flow if">​</a></h3><ul><li>your application is built with React  </li><li>you need flexible node graphs  </li><li>you want to create custom visual editors  </li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="use-jointjs-if">Use JointJS if<a href="#use-jointjs-if" class="hash-link" aria-label="Direct link to Use JointJS if" title="Direct link to Use JointJS if">​</a></h3><ul><li>you need advanced diagramming capabilities  </li><li>you are building enterprise modeling tools  </li><li>you need highly customized diagrams  </li></ul><hr><h1>Using Sequential Workflow Designer with React, Angular, or Svelte</h1><p>Sequential Workflow Designer can be integrated into any JavaScript application thanks to its framework-agnostic architecture.</p><p>Official wrappers simplify integration with modern frontend frameworks:</p><ul><li>React  </li><li>Angular  </li><li>Svelte  </li></ul><p>This allows developers to embed a workflow builder inside modern applications while keeping workflows portable and easy to manage.</p><hr><h1>Which JavaScript Workflow Builder Should You Choose?</h1><p>If your application needs a <strong>structured workflow builder</strong>, using a tool designed specifically for workflows can significantly reduce development time.</p><p><a href="https://github.com/nocode-js/sequential-workflow-designer" target="_blank" rel="noopener noreferrer">Sequential Workflow Designer</a> provides a lightweight approach to building <strong>visual step-based workflows</strong>, making it well suited for automation tools, SaaS platforms, and no-code applications.</p><p>For applications that require <strong>complex graph structures</strong>, tools like React Flow or JointJS provide greater flexibility but require additional implementation work.</p><hr><h1>Final Thoughts</h1><p>Visual workflow builders are becoming an essential component of modern web applications. Whether you are building automation systems, no-code tools, or visual programming interfaces, selecting the right library can greatly simplify development.</p><p>Sequential Workflow Designer, React Flow, and JointJS represent three different approaches:</p><ul><li>workflow-focused builders  </li><li>node graph editors  </li><li>diagramming frameworks  </li></ul><p>Understanding these differences will help you choose the right technology and build powerful workflow-driven applications.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Create Flow Builder with Multiple Triggers]]></title>
        <id>https://nocode-js.com/blog/flow-builder-with-multiple-triggers</id>
        <link href="https://nocode-js.com/blog/flow-builder-with-multiple-triggers"/>
        <updated>2025-06-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Flow builder tutorial, create triggers-only start section, restrict drag-and-drop, and organize tasks in a customizable designer.]]></summary>
        <content type="html"><![CDATA[<link rel="canonical" href="https://b4rtaz.medium.com/create-a-flow-builder-with-multiple-triggers-using-sequential-workflow-designer-7cfd0c539f0d"><div class="text--center"><p><img loading="lazy" alt="Create Flow Builder with Multiple Triggers JavaScript" src="/assets/images/2025-06-26-flow-builder-with-multiple-triggers-88ab533e7c2cdfad4dfe2eaab8f5cbf7.png" width="1920" height="960" class="img_ev3q"></p></div><p>Starting with version 0.30.0, Sequential Workflow Designer makes it easy to build flow builders that support multiple triggers to start a flow. This enables rapid development of <strong>visual programming</strong> applications, empowering users - without any coding skills - to define clear, deterministic logic, often enhanced by AI.</p><p>How to start? At the start you need to install the Sequential Workflow Designer using NPM:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">npm install sequential-workflow-designer</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now you need to import the designer to your code:</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Designer</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Uid</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sequential-workflow-designer'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// css</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sequential-workflow-designer/css/designer.css'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'sequential-workflow-designer/css/designer-light.css'</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Before we continue, we need to define the task types that our flow builder will support. In this article, I’ll introduce three example task types: “Save file”, “Send email”, and “Loop”. However, you’re free to define as many task types as your use case requires. For example, each integration with an external system could be represented as a separate task type.</p><p>Next, we want the flow builder to let users define when a flow should start. We refer to these starting points as triggers. Triggers are special blocks that users can drag and drop into the start section of the flow, then configure accordingly. In this article, we’ll define three example triggers that will be available in the designer: “On email received”, “On file created”, and “On file modified”.</p><p>The goal is to create a flow builder that enables users to build flows starting from an event and then define a predictable sequence of logic. This logic will eventually be executed by a state machine, although we won’t focus on that part in this article.</p><div class="text--center"><p><img loading="lazy" alt="Flow Builder - Drag and Drop Trigger" src="/assets/images/flow-builder-drag-and-drop-trigger-e9ce39ed2e95ea1b1da19b1c03251fe1.gif" width="800" height="526" class="img_ev3q"></p></div><p>Now, I’ll create two functions: one to generate a task and one to generate a trigger.</p><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createSaveFileStep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Uid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">next</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    componentType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'task'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'save-file'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Save file'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    properties</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createOnEmailReceivedStep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Uid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">next</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    componentType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'task'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'trigger-on-email-received'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'On email received'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    properties</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>These functions are needed to complete the toolbox configuration. Now we're ready to initialize the designer for the first time.</p><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> emptyDefinition </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sequence</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  properties</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> configuration </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  steps</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  toolbox</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    groups</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Triggers'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        steps</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createOnEmailReceivedStep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Tasks'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        steps</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createSaveFileStep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  controlBar</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  editors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  placeholder</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  validator</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  extensions</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> designer </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Designer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getElementById</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'placeholder'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  emptyDefinition</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  configuration</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>At this point, you should see the designer with an empty flow - no tasks added yet. Now, I’ll focus on creating a special section at the beginning of the flow where users can drag and drop only trigger blocks. It's important that this section accepts only triggers, not tasks. Likewise, triggers should not be allowed outside of this section. We can enforce these restrictions through the designer configuration.</p><p>Before we start, we need to add a special sequential step at the beginning of the flow definition. This step will act as a container for triggers. I’ll use the <code>launchPad</code> step component type to render it. This launch pad step component displays all nested steps aligned vertically and visually connected to the end of the container, creating the impression that any of the steps can trigger the flow.</p><p>While this component type can also be used for other use cases, such as parallel sections, it was primarily designed to handle triggers.</p><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> emptyDefinition </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  sequence</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'launchPad'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Launch Pad'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      componentType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'launchPad'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'launchPad'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      properties</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      sequence</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  properties</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now, when you refresh the page, you should see a flow with a small container inside. At this point, you can drag and drop any step from the toolbox into this section — but that's not what we want. We only want to allow triggers in this section. To achieve this, we need to implement a custom placeholder controller and pass it to the designer by extending the configuration.</p><div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">placeholder</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">canCreate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sequence</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> index</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> definition </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> designer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getDefinition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> isRoot </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sequence </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> definition</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sequence</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isRoot</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> index </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">canShow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">sequence</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> _</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> __</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> draggingStepType</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> definition </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> designer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getDefinition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> isTriggerStep </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> draggingStepType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">startsWith</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'trigger-'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> isLaunchPadSequence </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sequence </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> definition</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sequence</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sequence</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isLaunchPadSequence </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> isTriggerStep</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">||</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">isLaunchPadSequence </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">isTriggerStep</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>In the code above, I disabled the placeholder that appears before the launch pad step component, as I don’t want users to insert any steps before it. Then, in the <code>canShow</code> callback, I implemented a simple logic that hides placeholders if the dragged step type isn’t allowed in the target sequence.</p><p>After refreshing the page, you'll notice one issue: while drag-and-drop works as expected and the restrictions are in place, it's still possible to delete or move the launch pad step - which is not the intended behavior. To prevent this, I need to implement custom callbacks that restrict these actions.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token literal-property property" style="color:#36acaa">steps</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">isDuplicable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">step</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">componentType</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'launchPad'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">isDeletable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">step</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">componentType</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'launchPad'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">isDraggable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">step</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">componentType</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'launchPad'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">isSelectable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">step</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">componentType</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'launchPad'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Finally, everything is working as expected. We have created a flow designer that allows placing one or more triggers at the start of the flow, with various tasks arranged below.</p><p>To read the definition prepared by a user you need to call the <code>getDefinition</code> method on the designer instance. This will return a JSON object that represents the flow definition, including all steps and their properties.</p><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> definition </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> designer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">getDefinition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Of course, this is just the beginning. Next, we need to implement editors for configuring all supported steps. Another important part is how to execute the designed flow, but that won’t be covered in this article. For more examples and detailed documentation, I recommend visiting the nocode-js.com website.</p><p>Check out the final online example 👉 <a href="https://nocode-js.github.io/sequential-workflow-designer/examples/triggers.html" target="_blank" rel="noopener noreferrer">here</a>. You can also find the <a href="https://github.com/nocode-js/sequential-workflow-designer/tree/main/examples" target="_blank" rel="noopener noreferrer">source code</a> for this example and more on GitHub.</p><p>Links:</p><ul><li><a href="https://github.com/nocode-js/sequential-workflow-designer" target="_blank" rel="noopener noreferrer">Sequential Workflow Designer on GitHub</a></li><li><a href="/sequential-workflow-designer-examples">Sequential Workflow Designer Examples</a></li></ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Build Zapier Clone from No-Code Boilerplate]]></title>
        <id>https://nocode-js.com/blog/build-zapier-clone-from-no-code-boilerplate</id>
        <link href="https://nocode-js.com/blog/build-zapier-clone-from-no-code-boilerplate"/>
        <updated>2024-02-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Learn how to build a Zapier clone fast using the NoCode JS Boilerplate. Create your own no-code platform and automate workflows.]]></summary>
        <content type="html"><![CDATA[<div class="text--center"><p><img loading="lazy" alt="Build Zapier Clone from No-Code Boilerplate" src="/assets/images/2024-02-23-build-zapier-clone-7099145a393082539c508aa6b5170ba3.png" width="1280" height="640" class="img_ev3q"></p></div><p>Zapier is among the most popular automation tools available. It enables you to connect your favorite apps and automate workflows. However, it comes with a downside—it can be expensive, and you might need many custom integrations that it doesn't support. Privacy and security are also concerns; you may be hesitant to share your data with a third-party service. Until now, creating a no-code platform was challenging, but with the NoCode JS Boilerplate, you can now create customized automation tools effortlessly.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-nocode-js-boilerplate">What is NoCode JS Boilerplate?<a href="#what-is-nocode-js-boilerplate" class="hash-link" aria-label="Direct link to What is NoCode JS Boilerplate?" title="Direct link to What is NoCode JS Boilerplate?">​</a></h2><p>NoCode JS Boilerplate is a full-stack boilerplate that allows you to create a no-code platform. It comes with a lot of features out of the box. It's built using the latest technologies and is highly scalable. We prepared two versions of the boilerplate:</p><ul><li><strong>Basic</strong>: This version uses Next.js framework and it's recommended for small projects. This boilerplate is available in <a href="https://github.com/nocode-js/nocode-platform-boilerplate" target="_blank" rel="noopener noreferrer">GitHub</a>.</li><li><strong>Pro</strong>: This version uses Next.js and React and it's recommended for large projects and more complex use cases. This boilerplate is available in a private repository. To get access to the repository, you need to <a href="/nocode-platform-boilerplate-pro/pricing">buy a license here</a>.</li></ul><p align="center"><img loading="lazy" width="570" height="488" src="https://raw.githubusercontent.com/nocode-js/nocode-platform-boilerplate/main/.github/preview.webp" alt="Preview of No-Code Platform Boilerplate" class="img_ev3q"></p><p>The boilerplate basically is a tiny no-code platform that allows you to create custom flows by using a visual builder. These flows may be executed by HTTP requests or scheduled tasks (only in the Pro version). Of course you can modify the boilerplate to fit your needs.</p><p>The most important is that you can create custom integrations with your own services. You can implement own steps and allow your users to use them in their flows. You can change the shape of the data that is passed between steps, you can add custom UI for your steps. At the end you can deploy the platform to your own infrastructure or use a cloud provider.</p><p>By using the boilerplate you can create:</p><ul><li>SaaS (Software as a Service) platform,</li><li>Internal tool for your company,</li><li>Custom automation tool for your clients.</li><li>And many more.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-start">How to Start?<a href="#how-to-start" class="hash-link" aria-label="Direct link to How to Start?" title="Direct link to How to Start?">​</a></h2><p>We are big fans of the "learn by doing" approach. Before you determine which version of the boilerplate you need, you can try the basic version. We recommend to deploy for free the boilerplate to Vercel and play with it. Check details in the <a href="https://github.com/nocode-js/nocode-platform-boilerplate?tab=readme-ov-file#-deployment" target="_blank" rel="noopener noreferrer">GitHub repository</a>.</p><p>Next you need one developer or a team of developers to adjust the boilerplate to your needs. We prepared an extensive documentation that will help you to understand NoCode JS components and how to adjust them. You can find the documentation on Nocode JS website.</p>]]></content>
    </entry>
</feed>