
Inngest
Add durable, serverless background jobs and event-driven steps in Next.js or Express without operating Redis queues or worker fleets.
Overview
inngest is an agent skill for the Build phase that helps solo builders implement serverless event-driven workflows and durable background jobs with Inngest steps, sleeps, and retries.
Install
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill inngestWhat is this skill?
- Event-first triggers instead of hand-rolled queue consumers
- Step functions with durable checkpoints and configurable retry policies
- Native sleep, fan-out, concurrency limits, and idempotency keys
- Deploy as ordinary HTTP handlers on Vercel, Cloudflare Workers, Fly, Railway, Netlify
- Scoped routing: BullMQ/Redis, Temporal, and raw streaming called out as separate skills
- 8 integration principles (events, steps, sleep, retries, HTTP handlers, concurrency, idempotency, fan-out)
Adoption & trust: 899 installs on skills.sh; 40.1k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need reliable async work and schedules on serverless hosts but do not want to own queues, workers, or brittle cron scripts.
Who is it for?
Indie SaaS on Vercel/Netlify/Fly adding onboarding emails, webhooks, billing side effects, or scheduled syncs via Inngest.
Skip if: High-throughput Redis stream processing, cross-service saga orchestration that belongs on Temporal, or infra-only provisioning with no application events.
When should I use this skill?
You are implementing Inngest for serverless-first background jobs, event-driven workflows, or durable execution without managing queues or workers.
What do I get? / Deliverables
You get an event-driven function design with stepped checkpoints, retry and concurrency policy, and deployable HTTP handlers aligned to your framework host.
- Inngest function handlers with steps
- Event schemas and retry/concurrency configuration notes
Recommended Skills
Journey fit
Builders install Inngest while wiring product behavior—webhooks, async work, schedules—so the canonical shelf is Build, not post-launch ops tuning. Integrations captures third-party execution platforms and event buses that sit between your HTTP app and long-running or retried work.
How it compares
Inngest integration guidance—not BullMQ Redis workers or Temporal workflow DSL (those are separate skills in the same family).
Common Questions / FAQ
Who is inngest for?
Solo and indie builders shipping on serverless or edge-friendly stacks who need durable jobs without operating message brokers.
When should I use inngest?
Use it during Build when defining event schemas, step handlers, sleeps, fan-out, and concurrency for features like webhooks, billing hooks, or scheduled maintenance in your app repo.
Is inngest safe to install?
The skill describes integration patterns that imply network calls and secrets in your deployment; review the Security Audits panel on this Prism page and scope API keys in your environment.
SKILL.md
READMESKILL.md - Inngest
# Inngest Integration Inngest expert for serverless-first background jobs, event-driven workflows, and durable execution without managing queues or workers. ## Principles - Events are the primitive - everything triggers from events, not queues - Steps are your checkpoints - each step result is durably stored - Sleep is not a hack - Inngest sleeps are real, not blocking threads - Retries are automatic - but you control the policy - Functions are just HTTP handlers - deploy anywhere that serves HTTP - Concurrency is a first-class concern - protect downstream services - Idempotency keys prevent duplicates - use them for critical operations - Fan-out is built-in - one event can trigger many functions ## Capabilities - inngest-functions - event-driven-workflows - step-functions - serverless-background-jobs - durable-sleep - fan-out-patterns - concurrency-control - scheduled-functions ## Scope - redis-queues -> bullmq-specialist - workflow-orchestration -> temporal-craftsman - message-streaming -> event-architect - infrastructure -> infra-architect ## Tooling ### Core - inngest - inngest-cli ### Frameworks - nextjs - express - hono - remix - sveltekit ### Deployment - vercel - cloudflare-workers - netlify - railway - fly-io ### Patterns - step-functions - event-fan-out - scheduled-cron - webhook-handling ## Patterns ### Basic Function Setup Inngest function with typed events in Next.js **When to use**: Starting with Inngest in any Next.js project // lib/inngest/client.ts import { Inngest } from 'inngest'; export const inngest = new Inngest({ id: 'my-app', schemas: new EventSchemas().fromRecord<Events>(), }); // Define your events with types type Events = { 'user/signed.up': { data: { userId: string; email: string } }; 'order/placed': { data: { orderId: string; total: number } }; }; // lib/inngest/functions.ts import { inngest } from './client'; export const sendWelcomeEmail = inngest.createFunction( { id: 'send-welcome-email' }, { event: 'user/signed.up' }, async ({ event, step }) => { // Step 1: Get user details const user = await step.run('get-user', async () => { return await db.users.findUnique({ where: { id: event.data.userId } }); }); // Step 2: Send welcome email await step.run('send-email', async () => { await resend.emails.send({ to: user.email, subject: 'Welcome!', template: 'welcome', }); }); // Step 3: Wait 24 hours, then send tips await step.sleep('wait-for-tips', '24h'); await step.run('send-tips', async () => { await resend.emails.send({ to: user.email, subject: 'Getting Started Tips', template: 'tips', }); }); } ); // app/api/inngest/route.ts (Next.js App Router) import { serve } from 'inngest/next'; import { inngest } from '@/lib/inngest/client'; import { sendWelcomeEmail } from '@/lib/inngest/functions'; export const { GET, POST, PUT } = serve({ client: inngest, functions: [sendWelcomeEmail], }); ### Multi-Step Workflow Complex workflow with parallel steps and error handling **When to use**: Processing that involves multiple services or long waits export const processOrder = inngest.createFunction( { id: 'process-order', retries: 3, concurrency: { limit: 10 }, // Max 10 orders processing at once }, { event: 'order/placed' }, async ({ event, step }) => { const { orderId } = event.data; // Parallel steps - both run simultaneously const [inventory, payment] = await Promise.all([ step.run('check-inventory', () => checkInventory(orderId)), step.run('validate-payment', () => validatePayment(orderId)), ]); if (!inventory.available) { // Send even