I've spent the last while building Trigix — an open-source (MIT), self-hostable workflow automation platform. Think n8n, but the execution engine is in Rust and the AI nodes can run entirely against local models. This post is about a few engineering decisions I think are worth sharing, not a feature tour.

The node model: one trait, ~180 implementations

A workflow is a DAG of typed nodes. Every node is one variant of a NodeType enum and one async function:

match node.node_type {

NodeType::Http => execute_http(node, ctx, &client).await,