<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="370151" data-post-id="370151">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bluzky" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bluzky/120/1694_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bluzky
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks <a class="mention" href="/u/venkatd" rel="nofollow">@venkatd</a>, I wish I know libgraph before, so I don’t have to implement my own graph builder. Oban Workflow builder helpers are so clean.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370151" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-370151" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370151"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #11"></div>
  </section>
</div>
    <div class="postbit" id="370152" data-post-id="370152">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bluzky" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bluzky/120/1694_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bluzky
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thank you, OpenFn look interesting, I don’t know it’s opensource before.</p>
<p>Regarding to your questions:</p>
<ul>
<li>I want to support: multi-input node, conditional branching, loop, trigger sub-workflow(async-resume, synchronous), these patterns have been tested in my application.</li>
<li>I want to define reusable steps, then workflow combines those steps.</li>
<li>This library focuses only on execute workflow. Application handle the rest: database persistent, trigger sub workflow, suspend-resume, and integration. Application should provide environment variable, secrets, integration API keys …</li>
<li>I’ve not thought of json schema for inputs, just schema for reusable step config.</li>
<li>User may define workflow using json map. But it’s easy to make mistake so I’m working to build minimal UI for workflow editor.</li>
</ul>
<p>as <a class="mention" href="/u/gtcode" rel="nofollow">@gtcode</a> mentioned above, my biggest challenge is how recover from failing: node crashed, restart while execution running. Even I save execution state to DB, I don’t know if it’s running or it crashed and DB status is <code>running</code>. How to detect if the node which run that workflow is dead or alive.<br>
Another challenge is how to handle workflow retry: should retry whole workflow or single node, because some steps are not idempotent</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370152" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-370152" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370152"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #12"></div>
  </section>
</div>
    <div class="postbit" id="370477" data-post-id="370477">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="ghannam80" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ghannam80/120/35232_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  ghannam80
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>It would be great to have open source workflow system.</p>
<p>Have you checked Reactor from Ash team as maybe it could supply some of the required functions while the new  system should handle issues like data/steps persistence and pausing the flow for manual actions “approve/decline” ,..etc<br>
Also I think maybe you can look at BPM like <a href="https://github.com/synrc/bpe" class="inline-onebox" rel="noopener nofollow ugc">GitHub - synrc/bpmn: BPMN: Business Process Model Notation ISO 19510:2015 · GitHub</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370477" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-370477" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370477"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #13"></div>
  </section>
</div>
    <div class="postbit" id="370559" data-post-id="370559">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bluzky" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bluzky/120/1694_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bluzky
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thank you for your references</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370559" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-370559" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370559"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #14"></div>
  </section>
</div>
    <div class="postbit" id="372668" data-post-id="372668">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="ghannam80" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ghannam80/120/35232_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  ghannam80
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/bluzky" rel="nofollow">@bluzky</a></p>
<p>I found this one too could be interesting</p>
<aside class="onebox allowlistedgeneric" data-onebox-src="https://temporal.io/">
  <header class="source">
      <img src="https://temporal.io/favicon.ico" class="site-icon" alt="" width="48" height="48">

      <a href="https://temporal.io/" target="_blank" rel="noopener nofollow ugc">temporal.io</a>
  </header>

  <article class="onebox-body">
    <div class="aspect-image" style="--aspect-ratio:690/361;"><img src="https://temporal.io/images/open-graph/shiny.png" class="thumbnail" alt="" width="690" height="362"></div>

<h3><a href="https://temporal.io/" target="_blank" rel="noopener nofollow ugc">Durable Execution Solutions</a></h3>

  <p>Build invincible apps with Temporal's open source durable execution platform. Eliminate complexity and ship features faster. Talk to an expert today!</p>


  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>
 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="372668" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-372668" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="372668"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #16"></div>
  </section>
</div>
    <div class="postbit" id="372827" data-post-id="372827">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bluzky" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bluzky/120/1694_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bluzky
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thank you, we’re in integration phase so it’s hard to change the current implementation</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="372827" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-372827" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="372827"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #17"></div>
  </section>
</div>
    <div class="postbit" id="372829" data-post-id="372829">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="markmark206" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/markmark206/120/23227_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  markmark206
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Oooh this is so cool!</p>
<p>For some of my projects, I built what is, essentially, a “durable reactive graph“ library (<a href="https://hexdocs.pm/journey/" rel="noopener nofollow ugc">journey</a>). It is not exactly what you are building (I think, since this is very different from n8n in many respects), but it has some similarities that you might find useful, at least at the level of concepts, in that <strong>it lets you define a graph</strong> with inputs and computations, with direct or conditional dependencies:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">import Journey.Node
graph = Journey.new_graph(
  "demo graph",
  "v1",
  [
    input(:x),
    input(:y),
    # :sum is unblocked when :x and :y are provided.
    compute(:sum, [:x, :y], fn %{x: x, y: y} -&gt; {:ok, x + y} end),
    # :large_value_alert is unblocked when :sum is provided and is greater than 40.
    compute(
        :large_value_alert,
        [sum: fn sum_node -&gt; sum_node.node_value &gt; 40 end],
        fn %{sum: sum} -&gt; {:ok, "🚨, at #{sum}"} end,
        f_on_save: fn _execution_id, _result -&gt;
           # (e.g. send a pubsub notification to the LiveView process, to update the UI)
           :ok
        end
    )
  ]
)
</code></pre>
<p>and then to <strong>create and run executions of that graph</strong> (set their input values, and read their computed values):</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">execution = Journey.start_execution(graph)
execution = Journey.set_value(execution, :x, 12)
execution = Journey.set_value(execution, :y, 2)
Journey.get_value(execution, :sum, wait_any: true)
{:ok, 14}
Journey.get_value(execution, :large_value_alert)
{:error, :not_set}
</code></pre>
<p>I think this might be different from your use case in some ways (?), and so Journey takes care of a number of things behind the scenes that I needed for my use cases (e.g. Phoenix applications that guide users through a multi-step, conditional flow).</p>
<p>(For my use cases, I needed <strong>persistence</strong> (and so the value of every node is persisted as soon as it is set or computed), <strong>reliability of computations</strong> (so the functions in those compute nodes are subject to retry policies), <strong>horizontal scalability of computations</strong> (those functions will be picked up and called on any of the replicas of my application). I also needed careful <strong>mutability</strong> and one-time and recurring <strong>scheduling</strong> (so journey also has <code>mutate()</code>, <code>schedule_once()</code> and <code>schedule_recurring()</code> types of nodes, in addition to <code>input()</code> and <code>compute()</code> that you see in this example), and <strong>durability</strong> (so that I can always <code>Journey.load()</code> an execution by its id, even after all kinds of outages / redeployments / page reloads, at any time in the future, and it will continue as if nothing happened).)</p>
<p>I also needed some niceties, which may or may not be relevant for your case – things like <strong>visualizing</strong> the graph:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">Journey.Tools.generate_mermaid_graph(graph)
</code></pre>
<p>here is the <code>mermaid</code> that gets generated:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">graph TD
    %% Graph
    subgraph Graph["🧩 'demo graph', version v1"]
        execution_id[execution_id]
        last_updated_at[last_updated_at]
        x[x]
        y[y]
        sum["sum&lt;br/&gt;(anonymous fn)"]
        large_value_alert["large_value_alert&lt;br/&gt;(anonymous fn)"]

        x --&gt;  sum
        y --&gt;  sum
        sum --&gt;  large_value_alert
    end

    %% Styling
    classDef inputNode fill:#e1f5fe,stroke:#01579b,stroke-width:2px,color:#000000
    classDef computeNode fill:#f3e5f5,stroke:#4a148c,stroke-width:2px,color:#000000
    classDef scheduleNode fill:#fff3e0,stroke:#e65100,stroke-width:2px,color:#000000
    classDef mutateNode fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px,color:#000000

    %% Apply styles to actual nodes
    class y,x,last_updated_at,execution_id inputNode
    class large_value_alert,sum computeNode
</code></pre>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/b/7/b70c00b22136f580a077086818442bcbdb2cba80.png" data-download-href="https://forum.elixirforum.com/uploads/default/b70c00b22136f580a077086818442bcbdb2cba80" title="image" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/3X/b/7/b70c00b22136f580a077086818442bcbdb2cba80_2_690x379.png" alt="image" data-base62-sha1="q7j5KI7skPLzhKgp2sWSOkb0HK0" width="690" height="379" srcset="https://forum.elixirforum.com/uploads/default/optimized/3X/b/7/b70c00b22136f580a077086818442bcbdb2cba80_2_690x379.png, https://forum.elixirforum.com/uploads/default/optimized/3X/b/7/b70c00b22136f580a077086818442bcbdb2cba80_2_1035x568.png 1.5x, https://forum.elixirforum.com/uploads/default/optimized/3X/b/7/b70c00b22136f580a077086818442bcbdb2cba80_2_1380x758.png 2x" data-dominant-color="64666B"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">image</span><span class="informations">1456×800 32.4 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p>
<p>To help me understand the state of things (e.g. “hey did Mario get their reminder email?”), Journey has some <strong>introspection tooling</strong> that tells me the state of an execution. In this example you can see that <code>:sum</code> didn’t get computed because <code>:y</code> is yet to be provided:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">iex(8)&gt; Journey.Tools.summarize_as_text(execution.id) |&gt; IO.puts
Execution summary:
- ID: 'EXECAT36JBH8VTM82150REVX'
- Graph: 'demo graph' | 'v1'
- Archived at: not archived
- Created at: 2025-09-04 05:06:04Z UTC | 54 seconds ago
- Last updated at: 2025-09-04 05:06:39Z UTC | 19 seconds ago
- Duration: 35 seconds
- Revision: 1
- # of Values: 3 (set) / 6 (total)
- # of Computations: 2

Values:
- Set:
  - last_updated_at: '1756962399' | :input
    set at 2025-09-04 05:06:39Z | rev: 1

  - x: '12' | :input
    set at 2025-09-04 05:06:39Z | rev: 1

  - execution_id: 'EXECAT36JBH8VTM82150REVX' | :input
    set at 2025-09-04 05:06:04Z | rev: 0


- Not set:
  - large_value_alert: &lt;unk&gt; | :compute
  - sum: &lt;unk&gt; | :compute
  - y: &lt;unk&gt; | :input

Computations:
- Completed:


- Outstanding:
  - sum: ⬜ :not_set (not yet attempted) | :compute
       :and
        ├─ ✅ :x | &amp;provided?/1 | rev 1
        └─ 🛑 :y | &amp;provided?/1
  - large_value_alert: ⬜ :not_set (not yet attempted) | :compute
       🛑 :sum | &amp;-normalize_gated_by/1-fun-0-/1
</code></pre>
<p>I have been using Journey in Phoenix applications, and since every customer flow is a Journey execution, it is easy for Journey to generate a bit of <strong>“flow analytics” / “flow funnel”</strong> data. This example, with just 3 executions in the system, is not particularly rich, ; ) and its too new to have any retrospective “flow ends here” data, but think of a web analytics funnel, and you get the idea:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">iex(18)&gt; Journey.Insights.FlowAnalytics.flow_analytics(graph.name, graph.version)  |&gt; Journey.Insights.FlowAnalytics.to_text()|&gt; IO.puts
Graph: 'demo graph'
Version: 'v1'
Analyzed at: 2025-09-04T05:10:16.228250Z

EXECUTION STATS:
----------
Total executions: 3
Average duration: 23 seconds
Median duration: 20 seconds

NODE STATS (4 nodes):
----------
Node Name: 'x'
Type: input
Reached by: 3 executions (100.0%)
Average time to reach: 19 seconds
Flow ends here: 0 executions (0.0% of all, 0.0% of reached)

Node Name: 'sum'
Type: compute
Reached by: 2 executions (66.7%)
Average time to reach: 17 seconds
Flow ends here: 0 executions (0.0% of all, 0.0% of reached)

Node Name: 'y'
Type: input
Reached by: 2 executions (66.7%)
Average time to reach: 17 seconds
Flow ends here: 0 executions (0.0% of all, 0.0% of reached)

Node Name: 'large_value_alert'
Type: compute
Reached by: 1 executions (33.3%)
Average time to reach: 13 seconds
Flow ends here: 0 executions (0.0% of all, 0.0% of reached)
</code></pre>
<p>, etc.</p>
<p>I don’t know how this aligns with your particular use case, but this has been quite useful for building Phoenix applications that take a user through a flow that needs to be durable and reliable. I don’t need to keep reimplementing the same plumbing, and my applications have become thin and lightweight, and well-structured.</p>
<p>I am excited to see where your project takes you!  ; )</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="372829" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-372829" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="372829"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #18"></div>
  </section>
</div>
    <div class="postbit" id="372879" data-post-id="372879">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="ghannam80" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ghannam80/120/35232_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  ghannam80
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>It is fine. Actually I found out about it while checking implementation plan with Claude code <img src="https://forum.elixirforum.com/images/emoji/apple/grin.png?v=15" title=":grin:" class="emoji" alt=":grin:" loading="lazy" width="20" height="20"> so for the workflow need it recommended Temporal so hopefully soon a full backed elixir solution can be the answer.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="372879" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/20">Post #19</a>
	                </div>
	            </div>
              <div id="likers-container-372879" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="372879"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #19"></div>
  </section>
</div>
    <div class="postbit" id="375364" data-post-id="375364">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bluzky" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bluzky/120/1694_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bluzky
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>It’s been a couple of months since we started integrating the engine to our project.<br>
I recognized the best approach is to build the base and then use in real project and improve the engine gradually. As there are many unknowns so it took much effort to figure out and much more effort to refactor but it’s worthy. <img src="https://forum.elixirforum.com/images/emoji/apple/smiley.png?v=15" title=":smiley:" class="emoji" alt=":smiley:" loading="lazy" width="20" height="20"></p>
<p>I also build an admin UI to manage the workflow and run with test input</p>
<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/b/1/b191520ef4dc5e42af73e71867aae71f3a79ec8e.jpeg" data-download-href="https://forum.elixirforum.com/uploads/default/b191520ef4dc5e42af73e71867aae71f3a79ec8e" title="image" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/optimized/3X/b/1/b191520ef4dc5e42af73e71867aae71f3a79ec8e_2_690x410.jpeg" alt="image" data-base62-sha1="pkPRkc17g26jxkbDePUjltwopUW" width="690" height="410" srcset="https://forum.elixirforum.com/uploads/default/optimized/3X/b/1/b191520ef4dc5e42af73e71867aae71f3a79ec8e_2_690x410.jpeg, https://forum.elixirforum.com/uploads/default/optimized/3X/b/1/b191520ef4dc5e42af73e71867aae71f3a79ec8e_2_1035x615.jpeg 1.5x, https://forum.elixirforum.com/uploads/default/optimized/3X/b/1/b191520ef4dc5e42af73e71867aae71f3a79ec8e_2_1380x820.jpeg 2x" data-dominant-color="F8F8F8"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">image</span><span class="informations">2730×1624 120 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="375364" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/21">Post #20</a>
	                </div>
	            </div>
              <div id="likers-container-375364" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="375364"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #20"></div>
  </section>
</div>
    <div class="postbit" id="375367" data-post-id="375367">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="olivermt" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/olivermt/120/2354_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  olivermt
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I have spent the last four months making an execution engine for my agent coder (and basically all other agentic use) and if I was to build something like n8n I would start where my agent building took me:</p>
<p>Lua <em>all the things!</em></p>
<p>lua is an extremely good llm target so you can build a ton of execution points in elixir and expose them as an api to the lua tool. Build a ui that maps to lua and you cross the ui/code divide as well.</p>
<p>(Credit where credit is due, this is almost word for word what <a class="mention" href="/u/davydog187" rel="nofollow">@davydog187</a> said at codebeam a year ago and boy was he right)</p>
<p>Every single ai feature I make these days is well considered elixir code that is given a lua intetface for the llm to use. Or you could give it a ui interface that maps to lua..</p>
<p>(You would get chat interface n8n building for free fwiw).</p>
<p>I am not convinced visual builders are the future, but I am not sure chat based builders are it either <img src="https://forum.elixirforum.com/images/emoji/apple/man_shrugging/2.png?v=15" title=":man_shrugging:t2:" class="emoji" alt=":man_shrugging:t2:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="375367" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/any-tips-on-building-a-workflow-engine-similar-to-n8n/71782/22">Post #21</a>
	                </div>
	            </div>
              <div id="likers-container-375367" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="375367"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #21"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/71782/load_more?page=3">Load more posts (1 remaining)</a>
</div></template></turbo-stream>