
Inngest Durable Functions
Implement Inngest durable functions with checkpointing so multi-step workflows run with near-zero inter-step latency instead of ~50–100ms per step round-trip.
Overview
Inngest-durable-functions is an agent skill most often used in Build (also Operate infra) that guides checkpointed Inngest execution for lower-latency durable workflows.
Install
npx skills add https://github.com/inngest/inngest-skills --skill inngest-durable-functionsWhat is this skill?
- Explains checkpointing: steps run on your server with periodic state checkpoints to Inngest
- Contrasts traditional per-step HTTP orchestration vs eager local execution
- TypeScript examples for traditional vs checkpointed Inngest createFunction patterns
- Targets real-time workflows where step latency dominates user experience
- Pairs with Inngest event triggers and step.run boundaries
- Traditional Inngest step orchestration cited at ~50–100ms per step (HTTP round-trip)
- Checkpointed execution described as near-zero latency between steps with periodic checkpoints
Adoption & trust: 2.7k installs on skills.sh; 23 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
Your Inngest workflow feels sluggish because every step waits on orchestration HTTP even though the work could run back-to-back on your server.
Who is it for?
Indie SaaS backends on Inngest TypeScript SDK optimizing user-visible pipelines (enrichment, realtime processing, multi-step agents).
Skip if: Greenfield projects with no Inngest setup, or teams that only need cron scripts without durable orchestration.
When should I use this skill?
Implementing or optimizing Inngest createFunction handlers where step-to-step latency matters and you want checkpointing instead of per-step orchestration waits.
What do I get? / Deliverables
You refactor functions to use checkpointing so steps run eagerly with safe periodic checkpoints, cutting perceived inter-step delay for real-time flows.
- Checkpointed Inngest function implementations
- Documented choice between traditional vs checkpointed execution for a workflow
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Durable function design is core backend work when wiring event-driven product logic before production traffic. Checkpointing and function definitions live in application code and Inngest SDK configuration, not frontend or launch channels.
Where it fits
Convert a three-step ingest pipeline from traditional step isolation to checkpointed execution for snappier completions.
Wire Gemini or third-party API calls inside checkpointed functions without extra orchestration hops between calls.
Benchmark step timing before launch and choose checkpointing for chatty agent tool chains.
Tune production Inngest functions after observing cumulative orchestration delay in traces.
How it compares
Skill package for Inngest execution models—not a generic job queue tutorial or raw BullMQ recipe.
Common Questions / FAQ
Who is inngest-durable-functions for?
Builders already using Inngest who need faster multi-step functions without giving up durability and replay.
When should I use inngest-durable-functions?
In build when implementing event handlers; in ship when load-testing step latency; in operate when production workflows feel slow between step.run calls.
Is inngest-durable-functions safe to install?
It describes SDK patterns only; confirm repo trust via the Security Audits panel on this Prism page before installing.
Workflow Chain
Requires first: inngest steps
Then invoke: inngest steps
SKILL.md
READMESKILL.md - Inngest Durable Functions
# Checkpointing for Performance Optimization Guide to using Inngest's checkpointing feature for dramatically lower latency in real-time workflows. ## What is Checkpointing? Checkpointing executes steps **immediately on your server** rather than waiting for orchestration from Inngest. Steps run eagerly with periodic state checkpoints sent to Inngest for safety. ### Performance Comparison - **Without checkpointing**: ~50-100ms per step (HTTP round-trip to Inngest) - **With checkpointing**: Near-zero latency between steps, periodic checkpoints ```typescript // Traditional execution: Each step = separate HTTP request const traditional = inngest.createFunction( { id: "traditional-execution", triggers: [{ event: "process/traditional" }] }, async ({ event, step }) => { // Step 1: HTTP request to Inngest → response → continue const data = await step.run("fetch-data", () => fetchData()); // Step 2: HTTP request to Inngest → response → continue const processed = await step.run("process", () => process(data)); // Step 3: HTTP request to Inngest → response → complete return await step.run("save", () => save(processed)); } ); // Checkpointed execution: Steps run immediately, periodic checkpoints const checkpointed = inngest.createFunction( { id: "checkpointed-execution", triggers: [{ event: "process/checkpointed" }] }, async ({ event, step }) => { // All steps run immediately, checkpoints sent periodically const data = await step.run("fetch-data", () => fetchData()); const processed = await step.run("process", () => process(data)); return await step.run("save", () => save(processed)); } ); ``` ## Basic Checkpointing Setup **Checkpointing is enabled by default in v4.** All functions automatically use checkpointing for optimal performance. You can configure `maxRuntime` for serverless environments or disable it per-function if needed. ### TypeScript Configuration ```typescript import { Inngest } from "inngest"; // Checkpointing is enabled by default - no configuration needed export const inngest = new Inngest({ id: "my-app" }); // Functions automatically use checkpointing const realTimeFunction = inngest.createFunction( { id: "real-time-function", triggers: [{ event: "realtime/process" }] }, async ({ event, step }) => { // Steps execute immediately with periodic checkpointing const result1 = await step.run("immediate-step-1", () => process1(event.data) ); const result2 = await step.run("immediate-step-2", () => process2(result1)); const result3 = await step.run("immediate-step-3", () => process3(result2)); return { result: result3 }; } ); // Configure maxRuntime for serverless environments const serverlessFunction = inngest.createFunction( { id: "serverless-function", triggers: [{ event: "realtime/serverless" }], checkpointing: { maxRuntime: "4m45s" // Leave buffer before platform timeout } }, async ({ event, step }) => { // Steps execute immediately with checkpointing const result = await step.run("process", () => process(event.data)); return { result }; } ); // Disable checkpointing for a specific function if needed const noCheckpointFunction = inngest.createFunction( { id: "no-checkpoint-function", triggers: [{ event: "legacy/process" }], checkpointing: false }, async ({ event, step }) => { // Uses traditional step-by-step orchestration const result = await step.run("process", () => process(event.data)); return { result }; } ); ``` ### Go Configuration ```go import ( "github.com/inngest/inngestgo" "github.com/inngest/inngestgo/pkg/checkpoint" ) _, err := inngestgo.CreateFunction( client, inngestgo.FunctionOpts{ ID: "checkpointed-function", Name: "Checkpointed Function", Checkpoint: checkpoint.ConfigSafe, // Enable checkpointing }, inngestgo.EventTrigger("process/checkpointed", nil), func(ctx contex