{"id":"9f3f0fc0-9ea6-4694-8818-402d50d99a0b","shortId":"fAaaAd","kind":"skill","title":"inngest-setup","tagline":"Use when adding durable execution to a TypeScript project — building retry-safe webhook handlers, background jobs that survive crashes, scheduled tasks, or long-running workflows that outlive a single request. Covers Inngest SDK installation, client config, environment variables,","description":"# Inngest Setup\n\nThis skill sets up Inngest in a TypeScript project from scratch, covering installation, client configuration, connection modes, and local development.\n\n> **These skills are focused on TypeScript.** For Python or Go, refer to the [Inngest documentation](https://www.inngest.com/llms.txt) for language-specific guidance. Core concepts apply across all languages.\n\n## Prerequisites\n\n- Node.js 18+ (Node.js 22.4+ r ecommended for WebSocket support)\n- TypeScript project\n- Package manager (npm, yarn, pnpm, or bun)\n\n## Step 1: Install the Inngest SDK\n\nInstall the `inngest` npm package in your project:\n\n```bash\nnpm install inngest\n# or\nyarn add inngest\n# or\npnpm add inngest\n# or\nbun add inngest\n```\n\n## Step 2: Create an Inngest Client\n\nCreate a shared client file that you'll import throughout your codebase:\n\n```typescript\n// src/inngest/client.ts\nimport { Inngest } from \"inngest\";\n\nexport const inngest = new Inngest({\n  id: \"my-app\" // Unique identifier for your application (hyphenated slug)\n});\n// IMPORTANT: v4 defaults to Cloud mode. For local dev, set INNGEST_DEV=1 env var.\n// Without it, your serve endpoint will return 500 (\"In cloud mode but no signing key\").\n// In production, set INNGEST_SIGNING_KEY (required for Cloud mode).\n```\n\n### Key Configuration Options\n\n- **`id`** (required): Unique identifier for your app. Use a hyphenated slug like `\"my-app\"` or `\"user-service\"`\n- **`eventKey`**: Event key for sending events (prefer `INNGEST_EVENT_KEY` env var)\n- **`env`**: Environment name for Branch Environments\n- **`isDev`**: Force Dev mode (`true`) or Cloud mode (`false`). **v4 defaults to Cloud mode**, so set `INNGEST_DEV=1` env var for local development. **Never hardcode `isDev: true` in source code** — it will silently break in production. Always use the env var.\n- **`signingKey`**: Signing key for production (prefer `INNGEST_SIGNING_KEY` env var). Moved from `serve()` to client in v4\n- **`signingKeyFallback`**: Fallback signing key for key rotation (prefer `INNGEST_SIGNING_KEY_FALLBACK` env var)\n- **`baseUrl`**: Custom Inngest API base URL (prefer `INNGEST_BASE_URL` env var)\n- **`logger`**: Custom logger instance (e.g. winston, pino) — enables `logger` in function context\n- **`middleware`**: Array of middleware (see **inngest-middleware** skill)\n\n### Typed Events with eventType()\n\n```typescript\nimport { Inngest, eventType } from \"inngest\";\nimport { z } from \"zod\";\n\nconst signupCompleted = eventType(\"user/signup.completed\", {\n  schema: z.object({\n    userId: z.string(),\n    email: z.string(),\n    plan: z.enum([\"free\", \"pro\"])\n  })\n});\n\nconst orderPlaced = eventType(\"order/placed\", {\n  schema: z.object({\n    orderId: z.string(),\n    amount: z.number()\n  })\n});\n\nexport const inngest = new Inngest({ id: \"my-app\" });\n\n// Use event types as triggers for full type safety:\ninngest.createFunction(\n  { id: \"handle-signup\", triggers: [signupCompleted] },\n  async ({ event }) => {\n    event.data.userId; /* typed as string */\n  }\n);\n\n// Use event types when sending events:\nawait inngest.send(\n  signupCompleted.create({\n    userId: \"user_123\",\n    email: \"user@example.com\",\n    plan: \"pro\"\n  })\n);\n```\n\n### Environment Variables Setup\n\nSet these environment variables in your `.env` file or deployment environment:\n\n```env\n# Required for production\nINNGEST_EVENT_KEY=your-event-key-here\nINNGEST_SIGNING_KEY=your-signing-key-here\n\n# Force dev mode during local development\nINNGEST_DEV=1\n\n# Optional - custom dev server URL (default: http://localhost:8288)\nINNGEST_BASE_URL=http://localhost:8288\n```\n\n**⚠️ Common Gotcha**: Never hardcode keys in your source code. Always use environment variables for `INNGEST_EVENT_KEY` and `INNGEST_SIGNING_KEY`.\n\n## CRITICAL: Enable Dev Mode for Local Development\n\n**Before creating serve endpoints or connecting workers, ensure dev mode is enabled.** Without it, Inngest defaults to Cloud mode and your endpoints will fail with 500 errors.\n\nAdd to your `.env` file (or your dev script in package.json):\n\n```env\nINNGEST_DEV=1\n```\n\nOr in `package.json` scripts:\n\n```json\n{\n  \"scripts\": {\n    \"dev\": \"INNGEST_DEV=1 tsx --watch src/server.ts\"\n  }\n}\n```\n\n**Symptoms of missing INNGEST_DEV:**\n- GET `/api/inngest` returns `{\"code\":\"internal_server_error\"}`\n- Server logs: \"In cloud mode but no signing key found\"\n- Dev server can't sync with your app\n\n## Step 3: Choose Your Connection Mode\n\nInngest supports two connection modes:\n\n### Mode A: Serve Endpoint (HTTP)\n\nBest for serverless platforms (Vercel, Lambda, etc.) and existing APIs.\n\n### Mode B: Connect (WebSocket)\n\nBest for container runtimes (Kubernetes, Docker) and long-running processes.\n\n## Step 4A: Serving an Endpoint (HTTP Mode)\n\nCreate an API endpoint that exposes your functions to Inngest:\n\n```typescript\n// For Next.js App Router: src/app/api/inngest/route.ts\nimport { serve } from \"inngest/next\";\nimport { inngest } from \"../../../inngest/client\";\nimport { myFunction } from \"../../../inngest/functions\";\n\nexport const { GET, POST, PUT } = serve({\n  client: inngest,\n  functions: [myFunction]\n});\n```\n\n```typescript\n// For Next.js Pages Router: pages/api/inngest.ts\nimport { serve } from \"inngest/next\";\nimport { inngest } from \"../../inngest/client\";\nimport { myFunction } from \"../../inngest/functions\";\n\nexport default serve({\n  client: inngest,\n  functions: [myFunction]\n});\n```\n\n```typescript\n// For Express.js\nimport express from \"express\";\nimport { serve } from \"inngest/express\";\nimport { inngest } from \"./inngest/client\";\nimport { myFunction } from \"./inngest/functions\";\n\nconst app = express();\napp.use(express.json({ limit: \"10mb\" })); // Required for Inngest, increase limit for larger function state\n\napp.use(\n  \"/api/inngest\",\n  serve({\n    client: inngest,\n    functions: [myFunction]\n  })\n);\n```\n\n**🔧 Framework-Specific Notes**:\n\n- **Express**: Must use `express.json({ limit: \"10mb\" })` middleware to support larger function state.\n- **Fastify**: Use `fastifyPlugin` from `inngest/fastify`\n- **Cloudflare Workers**: Use `inngest/cloudflare`\n- **AWS Lambda**: Use `inngest/lambda`\n- For all other frameworks, check the `serve` reference here: https://www.inngest.com/docs-markdown/learn/serving-inngest-functions\n\n**⚠️ v4 Change:** Options like `signingKey`, `signingKeyFallback`, and `baseUrl` are now configured on the `Inngest` client constructor, not on `serve()`. The `serve()` function only accepts `client`, `functions`, and `streaming`.\n\n**⚠️ Common Gotcha**: Always use `/api/inngest` as your endpoint path. This enables automatic discovery. If you must use a different path, you'll need to configure discovery manually with the `-u` flag.\n\n## Step 4B: Connect as Worker (WebSocket Mode)\n\nFor long-running applications that maintain persistent connections:\n\n```typescript\n// src/worker.ts\nimport { connect } from \"inngest/connect\";\nimport { inngest } from \"./inngest/client\";\nimport { myFunction } from \"./inngest/functions\";\n\n(async () => {\n  const connection = await connect({\n    apps: [{ client: inngest, functions: [myFunction] }],\n    instanceId: process.env.HOSTNAME, // Unique worker identifier\n    maxWorkerConcurrency: 10 // Max concurrent steps\n  });\n\n  console.log(\"Worker connected:\", connection.state);\n\n  // Graceful shutdown handling\n  await connection.closed;\n  console.log(\"Worker shut down\");\n})();\n```\n\n**Requirements for Connect Mode**:\n\n- Node.js 22.4+ (or Deno 1.4+, Bun 1.1+) for WebSocket support\n- Long-running server environment (not serverless)\n- `INNGEST_SIGNING_KEY` and `INNGEST_EVENT_KEY` for production\n- Set the `appVersion` parameter on the `Inngest` client for production to support rolling deploys\n\n**v4 Connect Changes:**\n\n- **Worker thread isolation** is enabled by default — WebSocket connections execute in a worker thread to prevent event loop starvation. Set `isolateExecution: false` to use a single process (or `INNGEST_CONNECT_ISOLATE_EXECUTION=false`)\n- **`rewriteGatewayEndpoint`** callback has been replaced with the `gatewayUrl` string option (or `INNGEST_CONNECT_GATEWAY_URL` env var)\n\n## Step 5: Organizing with Apps\n\nAs your system grows, organize functions into logical apps:\n\n```typescript\n// User service\nconst userService = new Inngest({ id: \"user-service\" });\n\n// Payment service\nconst paymentService = new Inngest({ id: \"payment-service\" });\n\n// Email service\nconst emailService = new Inngest({ id: \"email-service\" });\n```\n\nEach app gets its own section in the Inngest dashboard and can be deployed independently. Use descriptive, hyphenated IDs that match your service architecture.\n\n**⚠️ Common Gotcha**: Changing an app's `id` creates a new app in Inngest. Keep IDs consistent across deployments.\n\n## Step 6: Local Development with inngest-cli\n\nStart the Inngest Dev Server for local development:\n\n```bash\n# Auto-discover your app on common ports/endpoints\nnpx --ignore-scripts=false inngest-cli@latest dev\n\n# Specify your app's URL manually\nnpx --ignore-scripts=false inngest-cli@latest dev -u http://localhost:3000/api/inngest\n\n# Custom port for dev server\nnpx --ignore-scripts=false inngest-cli@latest dev -p 9999\n\n# Disable auto-discovery\nnpx --ignore-scripts=false inngest-cli@latest dev --no-discovery -u http://localhost:3000/api/inngest\n\n# Multiple apps\nnpx --ignore-scripts=false inngest-cli@latest dev -u http://localhost:3000/api/inngest -u http://localhost:4000/api/inngest\n```\n\nThe dev server will be available at `http://localhost:8288` by default.\n\n### Configuration File (Optional)\n\nCreate `inngest.json` for complex setups:\n\n```json\n{\n  \"sdk-url\": [\n    \"http://localhost:3000/api/inngest\",\n    \"http://localhost:4000/api/inngest\"\n  ],\n  \"port\": 8289,\n  \"no-discovery\": true\n}\n```\n\n## Environment-Specific Setup\n\n### Local Development\n\n```env\nINNGEST_DEV=1\n# No keys required in dev mode\n```\n\n### Production\n\n```env\nINNGEST_EVENT_KEY=evt_your_production_event_key\nINNGEST_SIGNING_KEY=signkey_your_production_signing_key\n```\n\n### Custom Dev Server Port\n\n```env\nINNGEST_DEV=1\nINNGEST_BASE_URL=http://localhost:9999\n```\n\nIf your app runs on a non-standard port (not 3000), make sure the dev server can reach it by specifying the URL with `-u` flag.\n\n## Common Issues & Solutions\n\n**Port Conflicts**: If port 8288 is in use, specify a different port: `-p 9999`\n\n**Auto-discovery Not Working**: Use manual URL specification: `-u http://localhost:YOUR_PORT/api/inngest`. If using `--no-discovery` flag, the `-u` flag is **required** — the dev server will not find your app without it.\n\n**Functions Not Showing in Dev Server**: Your app must register with the dev server. This happens automatically when your serve endpoint receives its first request from the dev server. If registration isn't happening: (1) verify `INNGEST_DEV=1` is set, (2) verify the dev server can reach your app URL, (3) try restarting your app while the dev server is running.\n\n**Signature Verification Errors**: Ensure `INNGEST_SIGNING_KEY` is set correctly in production\n\n**WebSocket Connection Issues**: Verify Node.js version 22.4+ for connect mode\n\n**Docker Development**: Use `host.docker.internal` for app URLs when running dev server in Docker\n\n## Next Steps\n\n1. Create your first Inngest function with `inngest.createFunction()`\n2. Test functions using the dev server's \"Invoke\" button\n3. Send events with `inngest.send()` to trigger functions\n4. Deploy to production with proper environment variables\n5. See **inngest-middleware** for adding logging, error tracking, and other cross-cutting concerns\n6. Monitor functions in the Inngest dashboard\n\nThe dev server automatically reloads when you change functions, making development fast and iterative.","tags":["inngest","setup","skills","agent-skill-repository","agent-skills","agentic-skills","ai-agents","claude-code-skills","cursor-skills","openclaw-skills"],"capabilities":["skill","source-inngest","skill-inngest-setup","topic-agent-skill-repository","topic-agent-skills","topic-agentic-skills","topic-ai-agents","topic-claude-code-skills","topic-cursor-skills","topic-openclaw-skills"],"categories":["inngest-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/inngest/inngest-skills/inngest-setup","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add inngest/inngest-skills","source_repo":"https://github.com/inngest/inngest-skills","install_from":"skills.sh"}},"qualityScore":"0.461","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 22 github stars · SKILL.md body (11,586 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:05:31.553Z","embedding":null,"createdAt":"2026-04-18T23:06:58.984Z","updatedAt":"2026-05-18T19:05:31.553Z","lastSeenAt":"2026-05-18T19:05:31.553Z","tsv":"'/../../inngest/client':696 '/../../inngest/functions':700 '/../inngest/client':724 '/../inngest/functions':728 '/api/inngest':601,772,851 '/docs-markdown/learn/serving-inngest-functions':818 '/inngest/client':750,903 '/inngest/functions':754,907 '/llms.txt)':83 '1':115,196,282,498,581,591,1276,1308,1426,1430,1491 '1.1':951 '1.4':949 '10':924 '10mb':761,787 '123':451 '18':97 '2':145,1433,1499 '22.4':99,946,1472 '3':626,1443,1509 '3000':1325 '3000/api/inngest':1178,1215,1230,1258 '4':1517 '4000/api/inngest':1233,1260 '4a':667 '4b':879 '5':1039,1525 '500':206,565 '6':1126,1541 '8288':506,511,1242,1348 '8289':1262 '9999':1195,1313,1357 'accept':842 'across':92,1123 'ad':6,1531 'add':134,138,142,567 'alway':301,521,849 'amount':407 'api':341,650,675 'app':176,233,241,417,624,686,756,913,1042,1051,1084,1111,1117,1146,1162,1217,1316,1389,1399,1441,1447,1481 'app.use':758,771 'appli':91 'applic':181,889 'appvers':973 'architectur':1106 'array':363 'async':434,908 'auto':1143,1198,1359 'auto-discov':1142 'auto-discoveri':1197,1358 'automat':858,1408,1551 'avail':1239 'aw':803 'await':446,911,935 'b':652 'background':19 'base':342,346,508,1310 'baseurl':338,826 'bash':128,1141 'best':641,655 'branch':262 'break':298 'build':13 'bun':113,141,950 'button':1508 'callback':1022 'chang':820,987,1109,1555 'check':811 'choos':627 'cli':1132,1157,1173,1191,1207,1225 'client':40,59,149,153,321,707,732,774,833,843,914,978 'cloud':188,208,222,270,276,557,610 'cloudflar':799 'code':294,520,603 'codebas':161 'common':512,847,1107,1148,1341 'complex':1251 'concept':90 'concern':1540 'concurr':926 'config':41 'configur':60,225,829,871,1245 'conflict':1345 'connect':61,545,629,634,653,880,893,897,910,912,930,943,986,996,1017,1033,1467,1474 'connection.closed':936 'connection.state':931 'consist':1122 'console.log':928,937 'const':169,385,399,410,702,755,909,1055,1065,1075 'constructor':834 'contain':657 'context':361 'core':89 'correct':1463 'cover':36,57 'crash':23 'creat':146,150,541,673,1114,1248,1492 'critic':533 'cross':1538 'cross-cut':1537 'custom':339,351,500,1179,1301 'cut':1539 'dashboard':1092,1547 'default':186,274,504,555,730,994,1244 'deno':948 'deploy':468,984,1096,1124,1518 'descript':1099 'dev':192,195,266,281,491,497,501,535,548,574,580,588,590,599,617,1136,1159,1175,1182,1193,1209,1227,1235,1275,1281,1302,1307,1329,1383,1396,1404,1419,1429,1436,1450,1485,1504,1549 'develop':65,287,495,539,1128,1140,1272,1477,1558 'differ':865,1354 'disabl':1196 'discov':1144 'discoveri':859,872,1199,1212,1265,1360,1375 'docker':660,1476,1488 'document':80 'durabl':7 'e.g':354 'ecommend':101 'email':393,452,1073,1081 'email-servic':1080 'emailservic':1076 'enabl':357,534,551,857,992 'endpoint':203,543,561,639,670,676,854,1412 'ensur':547,1457 'env':197,256,258,283,304,315,336,348,465,470,570,578,1036,1273,1284,1305 'environ':42,259,263,456,461,469,523,959,1268,1523 'environment-specif':1267 'error':566,606,1456,1533 'etc':647 'event':247,251,254,372,419,435,441,445,475,479,527,967,1004,1286,1291,1511 'event.data.userid':436 'eventkey':246 'eventtyp':374,378,387,401 'evt':1288 'execut':8,997,1019 'exist':649 'export':168,409,701,729 'expos':678 'express':740,742,757,782 'express.js':738 'express.json':759,785 'fail':563 'fallback':325,335 'fals':272,1009,1020,1154,1170,1188,1204,1222 'fast':1559 'fastifi':794 'fastifyplugin':796 'file':154,466,571,1246 'find':1387 'first':1415,1494 'flag':877,1340,1376,1379 'focus':69 'forc':265,490 'found':616 'framework':779,810 'framework-specif':778 'free':397 'full':424 'function':360,680,709,734,769,776,792,840,844,916,1048,1392,1496,1501,1516,1543,1556 'gateway':1034 'gatewayurl':1028 'get':600,703,1085 'go':75 'gotcha':513,848,1108 'grace':932 'grow':1046 'guidanc':88 'handl':430,934 'handle-signup':429 'handler':18 'happen':1407,1425 'hardcod':289,515 'host.docker.internal':1479 'http':640,671 'hyphen':182,236,1100 'id':173,227,414,428,1059,1069,1079,1101,1113,1121 'identifi':178,230,922 'ignor':1152,1168,1186,1202,1220 'ignore-script':1151,1167,1185,1201,1219 'import':158,164,184,376,381,689,693,697,717,721,725,739,743,747,751,896,900,904 'increas':765 'independ':1097 'inngest':2,37,44,50,79,118,122,131,135,139,143,148,165,167,170,172,194,217,253,280,312,332,340,345,368,377,380,411,413,474,482,496,507,526,530,554,579,589,598,631,682,694,708,722,733,748,764,775,832,901,915,962,966,977,1016,1032,1058,1068,1078,1091,1119,1131,1135,1156,1172,1190,1206,1224,1274,1285,1293,1306,1309,1428,1458,1495,1528,1546 'inngest-c':1130,1155,1171,1189,1205,1223 'inngest-middlewar':367,1527 'inngest-setup':1 'inngest.createfunction':427,1498 'inngest.json':1249 'inngest.send':447,1513 'inngest/cloudflare':802 'inngest/connect':899 'inngest/express':746 'inngest/fastify':798 'inngest/lambda':806 'inngest/next':692,720 'instal':39,58,116,120,130 'instanc':353 'instanceid':918 'intern':604 'invok':1507 'isdev':264,290 'isn':1423 'isol':990,1018 'isolateexecut':1008 'issu':1342,1468 'iter':1561 'job':20 'json':586,1253 'keep':1120 'key':213,219,224,248,255,308,314,327,329,334,476,480,484,488,516,528,532,615,964,968,1278,1287,1292,1295,1300,1460 'kubernet':659 'lambda':646,804 'languag':86,94 'language-specif':85 'larger':768,791 'latest':1158,1174,1192,1208,1226 'like':238,822 'limit':760,766,786 'll':157,868 'local':64,191,286,494,538,1127,1139,1271 'localhost':505,510,1177,1214,1229,1232,1241,1257,1259,1312,1368 'log':608,1532 'logger':350,352,358 'logic':1050 'long':28,663,887,956 'long-run':27,662,886,955 'loop':1005 'maintain':891 'make':1326,1557 'manag':108 'manual':873,1165,1364 'match':1103 'max':925 'maxworkerconcurr':923 'middlewar':362,365,369,788,1529 'miss':597 'mode':62,189,209,223,267,271,277,492,536,549,558,611,630,635,636,651,672,884,944,1282,1475 'monitor':1542 'move':317 'multipl':1216 'must':783,862,1400 'my-app':174,239,415 'myfunct':698,710,726,735,752,777,905,917 'name':260 'need':869 'never':288,514 'new':171,412,1057,1067,1077,1116 'next':1489 'next.js':685,713 'no-discoveri':1210,1263,1373 'node.js':96,98,945,1470 'non':1321 'non-standard':1320 'note':781 'npm':109,123,129 'npx':1150,1166,1184,1200,1218 'option':226,499,821,1030,1247 'order/placed':402 'orderid':405 'orderplac':400 'organ':1040,1047 'outliv':32 'p':1194,1356 'packag':107,124 'package.json':577,584 'page':714 'pages/api/inngest.ts':716 'paramet':974 'path':855,866 'payment':1063,1071 'payment-servic':1070 'paymentservic':1066 'persist':892 'pino':356 'plan':395,454 'platform':644 'pnpm':111,137 'port':1180,1261,1304,1323,1344,1347,1355 'port/api/inngest':1370 'ports/endpoints':1149 'post':704 'prefer':252,311,331,344 'prerequisit':95 'prevent':1003 'pro':398,455 'process':665,1014 'process.env.hostname':919 'product':215,300,310,473,970,980,1283,1290,1298,1465,1520 'project':12,54,106,127 'proper':1522 'put':705 'python':73 'r':100 'reach':1332,1439 'receiv':1413 'refer':76,814 'regist':1401 'registr':1422 'reload':1552 'replac':1025 'request':35,1416 'requir':220,228,471,762,941,1279,1381 'restart':1445 'retri':15 'retry-saf':14 'return':205,602 'rewritegatewayendpoint':1021 'roll':983 'rotat':330 'router':687,715 'run':29,664,888,957,1317,1453,1484 'runtim':658 'safe':16 'safeti':426 'schedul':24 'schema':389,403 'scratch':56 'script':575,585,587,1153,1169,1187,1203,1221 'sdk':38,119,1255 'sdk-url':1254 'section':1088 'see':366,1526 'send':250,444,1510 'serv':202,319,542,638,668,690,706,718,731,744,773,813,837,839,1411 'server':502,605,607,618,958,1137,1183,1236,1303,1330,1384,1397,1405,1420,1437,1451,1486,1505,1550 'serverless':643,961 'servic':245,1054,1062,1064,1072,1074,1082,1105 'set':48,193,216,279,459,971,1007,1432,1462 'setup':3,45,458,1252,1270 'share':152 'show':1394 'shut':939 'shutdown':933 'sign':212,218,307,313,326,333,483,487,531,614,963,1294,1299,1459 'signatur':1454 'signingkey':306,823 'signingkeyfallback':324,824 'signkey':1296 'signup':431 'signupcomplet':386,433 'signupcompleted.create':448 'silent':297 'singl':34,1013 'skill':47,67,370 'skill-inngest-setup' 'slug':183,237 'solut':1343 'sourc':293,519 'source-inngest' 'specif':87,780,1269,1366 'specifi':1160,1335,1352 'src/app/api/inngest/route.ts':688 'src/inngest/client.ts':163 'src/server.ts':594 'src/worker.ts':895 'standard':1322 'start':1133 'starvat':1006 'state':770,793 'step':114,144,625,666,878,927,1038,1125,1490 'stream':846 'string':439,1029 'support':104,632,790,954,982 'sure':1327 'surviv':22 'symptom':595 'sync':621 'system':1045 'task':25 'test':1500 'thread':989,1001 'throughout':159 'topic-agent-skill-repository' 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agents' 'topic-claude-code-skills' 'topic-cursor-skills' 'topic-openclaw-skills' 'track':1534 'tri':1444 'trigger':422,432,1515 'true':268,291,1266 'tsx':592 'two':633 'type':371,420,425,437,442 'typescript':11,53,71,105,162,375,683,711,736,894,1052 'u':876,1176,1213,1228,1231,1339,1367,1378 'uniqu':177,229,920 'url':343,347,503,509,1035,1164,1256,1311,1337,1365,1442,1482 'use':4,234,302,418,440,522,784,795,801,805,850,863,1011,1098,1351,1363,1372,1478,1502 'user':244,450,1053,1061 'user-servic':243,1060 'user/signup.completed':388 'user@example.com':453 'userid':391,449 'userservic':1056 'v4':185,273,323,819,985 'var':198,257,284,305,316,337,349,1037 'variabl':43,457,462,524,1524 'vercel':645 'verif':1455 'verifi':1427,1434,1469 'version':1471 'watch':593 'webhook':17 'websocket':103,654,883,953,995,1466 'winston':355 'without':199,552,1390 'work':1362 'worker':546,800,882,921,929,938,988,1000 'workflow':30 'www.inngest.com':82,817 'www.inngest.com/docs-markdown/learn/serving-inngest-functions':816 'www.inngest.com/llms.txt)':81 'yarn':110,133 'your-event-key-her':477 'your-signing-key-her':485 'z':382 'z.enum':396 'z.number':408 'z.object':390,404 'z.string':392,394,406 'zod':384","prices":[{"id":"9cb25418-19fa-4fc3-b968-4ce778d44f79","listingId":"9f3f0fc0-9ea6-4694-8818-402d50d99a0b","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"inngest","category":"inngest-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T23:06:58.984Z"}],"sources":[{"listingId":"9f3f0fc0-9ea6-4694-8818-402d50d99a0b","source":"github","sourceId":"inngest/inngest-skills/inngest-setup","sourceUrl":"https://github.com/inngest/inngest-skills/tree/main/skills/inngest-setup","isPrimary":false,"firstSeenAt":"2026-04-18T23:06:58.984Z","lastSeenAt":"2026-05-18T19:05:31.553Z"},{"listingId":"9f3f0fc0-9ea6-4694-8818-402d50d99a0b","source":"skills_sh","sourceId":"inngest/inngest-skills/inngest-setup","sourceUrl":"https://skills.sh/inngest/inngest-skills/inngest-setup","isPrimary":true,"firstSeenAt":"2026-05-07T20:41:10.248Z","lastSeenAt":"2026-05-07T22:40:49.039Z"}],"details":{"listingId":"9f3f0fc0-9ea6-4694-8818-402d50d99a0b","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"inngest","slug":"inngest-setup","github":{"repo":"inngest/inngest-skills","stars":22,"topics":["agent-skill-repository","agent-skills","agentic-skills","ai-agents","claude-code-skills","cursor-skills","openclaw-skills"],"license":"other","html_url":"https://github.com/inngest/inngest-skills","pushed_at":"2026-05-06T18:21:48Z","description":"Agent Skills for building with Inngest","skill_md_sha":"9ab18640a1ef2d44648f89f3ace80199268e672f","skill_md_path":"skills/inngest-setup/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/inngest/inngest-skills/tree/main/skills/inngest-setup"},"layout":"multi","source":"github","category":"inngest-skills","frontmatter":{"name":"inngest-setup","description":"Use when adding durable execution to a TypeScript project — building retry-safe webhook handlers, background jobs that survive crashes, scheduled tasks, or long-running workflows that outlive a single request. Covers Inngest SDK installation, client config, environment variables, serve endpoints (Next.js, Express, Hono, Fastify), connect-as-worker mode, and the local dev server."},"skills_sh_url":"https://skills.sh/inngest/inngest-skills/inngest-setup"},"updatedAt":"2026-05-18T19:05:31.553Z"}}