Build powerful customizable workflows directly in your product using Inngest as the reliable orchestration engine. Develop locally and ship to your existing production systems ready for any scale.
Florian Works develops custom-built software products for fire departments, incorporating custom workflows built directly on top of Inngest to ship reliable products faster and easier than ever before.
Utilizing Inngest's core workflow engine and primitives such as step.waitForEvent
, FlorianWorks ships scheduling, roster management, a rules engine, and finance management without spending effort developing custom distributed systems primitives or reliability concerns.
“Inngest is a great platform to build reliability into your long running tasks without drowning in complexity.”
You bring the application code, we bring the engine. Allow your own users to create workflows composed of reusable logic that you define. Our engine runs workflows as steps, taking care of scale, orchestration, idempotency, retries, and observability for you.
Build simple linear workflows or complex DAG-based workflows with parallelism and fan-in out of the box. Leverage our step primitives for human-in-the-loop or paused functions which automatically resume based off of conditions being met.
1import { runAction } from "@/actions";
2import { inngest } from "@/inngest";
3
4const fnOptions = {
5 id: "user-workflows",
6 // limit to 10 workflows for each tenant in your system.
7 concurrency: {
8 limit: 10,
9 key: "event.data.account_id",
10 },
11};
12
13const fnListener = { event: "api/workflow.invoked" };
14
15// Create a durable function which runs user defined workflows any time
16// the "api/workflow.invoked" event is received. This loads the specified
17// user's workflow from your own system, and executes each step of the flow.
18export const userWorkflow = inngest.createFunction(
19 fnOptions,
20 fnListener,
21 async ({ event, step }) => {
22 const workflow = await step.run("load-workflow", async () => {
23 return db.workflows.find({ where: { id: event.data.workflowID } });
24 });
25
26 // Iterate over a simple stack, or create a graph and iteerate over a full
27 // blown DAG whioch a user can define.
28 for (let action of workflow) {
29 const result = await step.run("run-action", async () => {
30 return runAction(event, action);
31 });
32 }
33 }
34);
Ship background functions & workflows like never before
$ npx inngest-cli dev
Get started for free