К основному содержанию
скилл CX Codex

inngest — скилл для Claude Code: фоновые задачи и event-driven

Скилл для работы с Inngest: настраивай фоновые задачи, event-driven workflows и долгоживущие процессы без управления очередями и воркерами. Пригодится, если нужны отложенные операции, многошаговые workflow или обработка вебхуков.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add sickn33/agentic-awesome-skills --skill inngest -a claude-code
Открыть на GitHub

Что делает inngest

Inngest — платформа для serverless-first фоновых задач. Скилл даёт агенту знание о её концепции: события как примитив, шаги как контрольные точки, встроенные sleep и retry, автоматический fan-out. Внутри примеры для Next.js, Express, Hono, Remix, SvelteKit, развёртывания на Vercel, Cloudflare Workers, Netlify, Railway, Fly.io.

Скилл охватывает базовую настройку функций с типизированными событиями, многошаговые workflow с параллельными шагами и обработкой ошибок, scheduled функции (cron), webhook-обработчики с дедупликацией. В примерах — отправка welcome-письма через 24 часа, обработка заказов с проверкой инвентаря и платежей, ежедневный digest, обработка Stripe-вебхуков. Требует Node.js и установленного SDK Inngest.

Особенность: дурабельные результаты шагов хранятся удалённо, поэтому не клади в них секреты и личные данные. Вебхук-события нужно валидировать на сервере и использовать idempotency-ключи платёжных систем — дедупликация workflow не гарантирует ровно-один раз для внешних побочных эффектов.

Какие задачи решает

  • настроить фоновую задачу, которая срабатывает по событию
  • сделать многошаговый workflow с проверками и параллельными шагами
  • обработать webhook без дублирования платежей и отправок
  • запустить регулярную задачу по расписанию (cron)
  • добавить sleep и retry в асинхронный процесс

Примеры запросов агенту

  • помоги настроить Inngest функцию, которая отправляет welcome-письмо когда пользователь зарегистрируется
  • создай workflow для обработки заказа: проверить инвентарь, зарядить платёж, отправить в исполнение
  • настрой webhook-обработчик Stripe с дедупликацией

Как установить inngest

1Через Skills CLI (Vercel)

npx skills add sickn33/agentic-awesome-skills --skill inngest -a claude-code

2Вручную: положить файлы

~/.claude/skills/inngest/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/inngest/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о inngest

Как установить inngest скилл в Claude Code?

Выполни npx skills add sickn33/agentic-awesome-skills --skill inngest -a claude-code, затем открой ~/.claude/skills/inngest/SKILL.md.

Что делает скилл inngest?

Даёт агенту знание о Inngest: как писать event-driven функции, многошаговые workflow, scheduled задачи и webhook-обработчики. Включает примеры для Next.js, Express, Hono и других фреймворков с развёртыванием на Vercel, Cloudflare, Railway и других платформах.

Какие данные опасно класть в результаты шагов?

Секреты, API-ключи и личные данные. Они хранятся удалённо в Inngest, поэтому лучше держать их в памяти агента или загружать при каждом шаге через авторизованный запрос к своему серверу.

Исходный текст

SKILL.md · MIT
---
name: inngest
description: Inngest expert for serverless-first background jobs, event-driven
  workflows, and durable execution without managing queues or workers.
risk: critical
source: vibeship-spawner-skills (Apache 2.0)
date_added: 2026-02-27
---

# Inngest Integration

Inngest expert for serverless-first background jobs, event-driven workflows,
and durable execution without managing queues or workers.

These are source sketches for a version-pinned SDK, not a complete deployable application. Supply reviewed database/email/payment adapters and compile against the installed SDK. Events and webhook payloads require server-side validation and authorization. Verify provider signatures before enqueueing webhook events. Keep secrets and unnecessary personal data out of durable step outputs; these may be retained remotely.

## 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
- Workflow deduplication does not make external side effects exactly-once; use provider idempotency keys and reconcile uncertain outcomes
- 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
- serverless-queues -> upstash-qstash
- 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

#Side effects such as messages, charges, fulfillment, deployments and remote indexing require the user's task scope. Use synthetic records in development and do not execute these examples during review.

## 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, EventSchemas } 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 event instead of direct call (fan-out pattern)
      await step.sendEvent('notify-backorder', {
        name: 'order/backordered',
        data: { orderId, items: inventory.missing },
      });
      return { status: 'backordered' };
    }

    // Read authoritative amount/currency and customer from the server-side order.
    // Never charge an amount accepted only from an untrusted event.
    const order = await step.run('load-order', () => loadAuthorizedOrder(orderId));

    // Process payment
    const charge = await step.run('charge-payment', async () => {
      return await stripe.charges.create({
        amount: order.totalMinorUnits,
        currency: order.currency,
        customer: payment.customerId,
      }, { idempotencyKey: `order:${orderId}:charge:v1` });
    });

    // Ship order
    await step.run('ship-order', () => fulfillment.ship(orderId));

    return { status: 'completed', chargeId: charge.id };
  }
);

### Scheduled/Cron Functions

Functions that run on a schedule

**When to use**: Recurring tasks like daily reports or cleanup jobs

export const dailyDigest = inngest.createFunction(
  { id: 'daily-digest' },
  { cron: '0 9 * * *' },  // Every day at 9am UTC
  async ({ step }) => {
    // Get all users who want digests
    const users = await step.run('get-users', async () => {
      return await db.users.findMany({
        where: { digestEnabled: true },
      });
    });

    // Send to each user (creates child events)
    await step.sendEvent(
      'send-digests',
      users.map(user => ({
        name: 'digest/send',
        data: { userId: user.id },
      }))
    );

    return { sent: users.length };
  }
);

// Separate function handles individual digest sending
export const sendDigest = inngest.createFunction(
  { id: 'send-digest', concurrency: { limit: 50 } },
  { event: 'digest/send' },
  async ({ event, step }) => {
    // ... send individual digest
  }
);

### Webhook Handler with Idempotency

Safely process webhooks with deduplication

**When to use**: Handling Stripe, GitHub, or other webhooks

export const handleStripeWebhook = inngest.createFunction(
  {
    id: 'stripe-webhook',
    // Deduplicate by Stripe event ID
    idempotency: 'event.data.stripeEventId',
  },
  { event: 'stripe/webhook.received' },
  async ({ event, step }) => {
    const { type, data } = event.data;

    switch (type) {
      case 'checkout.session.completed':
        await step.run('fulfill-order', async () => {
          await fulfillOrder(data.session.id);
        });
        break;

      case 'customer.subscription.deleted':
        await step.run('cancel-subscription', async () => {
          await cancelSubscription(data.subscription.id);
        });
        break;
    }
  }
);

### AI Pipeline with Long Processing

Multi-step AI processing with chunked work

**When to use**: AI workflows that may take minutes to complete

export const processDocument = inngest.createFunction(
  {
    id: 'process-document',
    retries: 2,
    concurrency: { limit: 5 },  // Limit API usage
  },
  { event: 'document/uploaded' },
  async ({ event, step }) => {
    // Step 1: Extract text (may take a while)
    const text = await step.run('extract-text', async () => {
      return await extractTextFromPDF(event.data.fileUrl);
    });

    // Step 2: Chunk for embedding
    const chunks = await step.run('chunk-text', async () => {
      return chunkText(text, { maxTokens: 500 });
    });

    // Step 3: Generate embeddings (API rate limited)
    const embeddings = await step.run('generate-embeddings', async () => {
      return await openai.embeddings.create({
        model: 'text-embedding-3-small',
        input: chunks,
      });
    });

    // Step 4: Store in vector DB
    await step.run('store-vectors', async () => {
      await vectorDb.upsert({
        vectors: embeddings.data.map((e, i) => ({
          id: `${event.data.documentId}-${i}`,
          values: e.embedding,
          metadata: { chunk: chunks[i] },
        })),
      });
    });

    return { chunks: chunks.length, status: 'indexed' };
  }
);

## Validation Checks

### Inngest serve handler present

Severity: CRITICAL

Message: Inngest requires a serve handler to receive events

Fix action: Create app/api/inngest/route.ts with serve() export

### Functions registered with serve

Severity: ERROR

Message: Ensure all Inngest functions are registered in the serve() call

Fix action: Add function to the functions array in serve()

### Step.run has descriptive name

Severity: WARNING

Message: Step names should be kebab-case and descriptive

Fix action: Use descriptive step names like 'fetch-user' or 'send-email'

### waitForEvent has timeout

Severity: ERROR

Message: waitForEvent should have a timeout to prevent infinite waits

Fix action: Add timeout option: { timeout: '24h' }

### Function has concurrency limit

Severity: WARNING

Message: Consider adding concurrency limits to protect downstream services

Fix action: Add concurrency: { limit: 10 } to function config

### Event types defined

Severity: WARNING

Message: Inngest client should define event schemas for type safety

Fix action: Add schemas: new EventSchemas().fromRecord<Events>()

### Function has unique ID

Severity: CRITICAL

Message: Every Inngest function must have a unique ID

Fix action: Add id: 'my-function-name' to function config

### Sleep uses duration string

Severity: WARNING

Message: step.sleep should use duration strings like '1h' or '30m', not milliseconds

Fix action: Use duration string: step.sleep('wait', '1h')

### Retry policy configured

Severity: WARNING

Message: Consider configuring retry policy for failure handling

Fix action: Configure the retries option supported by the pinned SDK; do not invent a backoff object schema

### Idempotency key for payment functions

Severity: ERROR

Message: Payment-related functions should use idempotency keys

Fix action: Bind workflow deduplication and provider-side idempotency to the authorized order; workflow configuration alone cannot prevent duplicate charges after a crash

## Collaboration

### Delegation Triggers

- redis|queue infrastructure|bullmq -> bullmq-specialist (Need Redis-based queue with existing infrastructure)
- serverless queue|http queue|scheduled http -> upstash-qstash (Need plain HTTP delivery and cron without an event framework)
- saga|compensation|rollback|long-running workflow -> temporal-craftsman (Need complex workflow orchestration with compensation)
- event sourcing|event store|cqrs -> event-architect (Need event sourcing patterns)
- vercel|deploy|production -> vercel-deployment (Need deployment configuration)
- database|schema|data model -> supabase-backend (Need database for event data)
- api|endpoint|route -> backend (Need API to trigger events)

### Vercel Background Jobs

Skills: inngest, nextjs-app-router, vercel-deployment

Workflow:

```
1. Define Inngest functions (inngest)
2. Set up serve handler in Next.js (nextjs-app-router)
3. Configure function timeouts (vercel-deployment)
4. Deploy and test (vercel-deployment)
```

### AI Pipeline

Skills: inngest, ai-agents-architect, supabase-backend

Workflow:

```
1. Design AI workflow steps (ai-agents-architect)
2. Implement with Inngest durability (inngest)
3. Store results in database (supabase-backend)
4. Handle retries for API failures (inngest)
```

### Webhook Processing

Skills: inngest, stripe-integration, backend

Workflow:

```
1. Receive webhook (backend)
2. Send to Inngest with idempotency (inngest)
3. Process payment logic (stripe-integration)
4. Update application state (backend)
```

### Email Automation

Skills: inngest, email-systems, supabase-backend

Workflow:

```
1. Trigger event from user action (inngest)
2. Schedule drip emails with step.sleep (inngest)
3. Send emails with retry (email-systems)
4. Track email status (supabase-backend)
```

### Scheduled Tasks

Skills: inngest, backend, analytics-architecture

Workflow:

```
1. Define cron triggers (inngest)
2. Implement processing logic (backend)
3. Aggregate and report data (analytics-architecture)
4. Handle failures with alerting (inngest)
```

## Related Skills

Works well with: `nextjs-app-router`, `vercel-deployment`, `supabase-backend`, `email-systems`, `ai-agents-architect`, `stripe-integration`

## When to Use
- User mentions or implies: inngest
- User mentions or implies: serverless background job
- User mentions or implies: event-driven workflow
- User mentions or implies: step function
- User mentions or implies: durable execution
- User mentions or implies: vercel background job
- User mentions or implies: scheduled function
- User mentions or implies: fan out

## Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.

© sickn33 · MIT · sickn33/agentic-awesome-skills

Похожие скиллы

Всё по теме «Бэкенд и API» →
inngest-steps inngest Учит агента проектировать надёжные шаги в воркфлоу Inngest на TypeScript. Пригодится при настройке задержек, ожидании вебхуков и фоновых задач. CX Codex +1 3 800установок inngest-durable-functions inngest Скилл учит агента писать отказоустойчивые функции Inngest: шаги, мемоизация, ретраи, идемпотентность и отмена. CX Codex +1 3 800установок amazon-eventbridge-event-bus aws Скилл для сборки и отладки приложений на новых кастомных шинах событий EventBridge. Пригодится, когда события расходятся по подписчикам и что-то не доходит. CX Codex +1 1 000установок webhook-development aj-geddes Скилл для проектирования вебхуков: доставка событий, проверка подписи, ретраи и обработка недоставленных сообщений. CX Codex +1 504установок trigger-setup triggerdotdev Помогает настроить Trigger.dev в проекте с нуля: создаёт конфигурационные файлы, подключает пакеты и подготавливает первую фоновую задачу. CX Codex +1 2 800установок vercel-queues официальный Vercel Labs Направляет агента при настройке Vercel Queues: публикации событий, push- и poll-обработчиках и конфигах vercel.json. Пригодится для асинхронных задач в Node.js 22+. CX Codex GP ChatGPT 6установок

Из того же набора101

Весь набор →
frontend-developer Помогает проектировать и писать интерфейсы на React и Next.js с адаптивностью, состоянием и доступностью. Нужен при разработке компонентов и страниц. CX Codex +1 1 300установок ai-engineer Скилл для Claude Code и других агентских CLI: задаёт агенту роль LLM-инженера и ведёт от постановки метрик до RAG-пайплайна, агентов и продакшн-обвязки. CX Codex +1 1 300установок radix-ui-design-system Скилл помогает создавать дизайн-системы и доступные интерфейсные компоненты на базе примитивов Radix UI без готовых стилей. CX Codex +1 1 300установок typescript-advanced-types Помогает агенту писать дженерики, условные и mapped-типы в TypeScript и честно говорит, где проверка типов заканчивается. CX Codex +1 1 300установок autonomous-agents Скилл о том, как собрать автономного агента и не утонуть в накоплении ошибок: циклы ReAct, декомпозиция цели, рефлексия, надёжность в продакшене. CX Codex +1 1 200установок code-refactoring-refactor-clean Скилл анализирует запахи кода и готовит пошаговый план рефакторинга по принципам SOLID. Пригодится при разборе запутанных модулей перед добавлением новых функций. CX Codex +1 1 200установок blockchain-developer Скилл направляет разработку смарт-контрактов, Web3-приложений и децентрализованных систем. Пригодится для проектирования, ревью и проверки рисков до действий в сети. CX Codex +1 1 200установок production-code-audit Скилл для комплексной проверки кода на уязвимости, ошибки и узкие места перед развёртыванием. Находит конкретные проблемы, предлагает исправления и проверяет результаты. CX Codex +1 1 200установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой