inngest-cli
Use when installing or running the Inngest CLI and Dev Server for local development, local testing, serve endpoint debugging, Docker or Docker Compose setup, MCP configuration, self-hosted `inngest start`, or deployment workflow checks. Covers `inngest dev`, `inngest start`, auto-discovery, config f
By inngest · 562 installs
npx skills add inngest/inngest-skills --skill inngest-cli
Source repository · Upstream listing
Inngest CLI
Master the Inngest CLI for local development, testing, and self hosted production. The CLI provides the Dev Server — a fully featured, open source local version of the Inngest Platform.
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.
Use this skill for CLI setup, Dev Server workflows, local testing, Docker, MCP, and self hosted server operations. For run/trace inspection through inngest api , use inngest api cli when available.
Installation
If your npm configuration disables lifecycle scripts and the binary is missing, retry with npx ignore scripts=false inngest cli@latest dev . Bun does not support lifecycle scripts by default, so prefer npx for the CLI even in Bun projects.
inngest dev — Local Dev Server
Starts an in memory local version of Inngest with a browser UI at http://localhost:8288 .
CLI Flags
Flag Short Default Description
sdk url u http://localhost:3000/api/inngest App serve endpoint URL(s)
port p 8288 Dev Server port
host Dev Server host
no discovery false Disable auto discovery of apps
no poll false Disable polling apps for changes
config Path to configuration file
connect gateway port 8289 Connect gateway endpoint port
persist false Persist data between restarts
poll interval 5 Seconds between app polling checks
queue workers 100 Number of executor workers
retry interval 0 Linear retry interval in seconds
tick 150 Executor queue polling interval in milliseconds
Auto Discovery
Without no discovery , the Dev Server scans common ports and endpoints automatically:
Ports scanned: Common development ports including 3000, 3030, and others
Endpoints scanned:
/api/inngest
/x/inngest
/.netlify/functions/inngest
/.redwood/functions/inngest
Configuration File
Create an inngest.json (or .yaml , .toml ) in your project root. The CLI walks up directories to find it.
Environment Variables
Variable Description
INNGEST DEV =1 enables Dev Mode (disables signature verification). =0 forces Cloud mode. Accepts a URL (e.g., http://localhost:8288 ). Defaults to Cloud mode if unset.
INNGEST BASE URL Host for SDK to Inngest communication (e.g., http://localhost:8288 ). Leave unset in most cases.
INNGEST EVENT KEY Authentication key for sending events. Use any dummy value locally — Dev Server does not validate.
INNGEST SIGNING KEY Secures requests between Inngest and your app. Required in production. Determines which Inngest environment receives syncs.
INNGEST SIGNING KEY FALLBACK Fallback key for signing key rotation (v3.18.0+).
INNGEST SERVE ORIGIN Full origin URL for Inngest to reach your app (e.g., https://my app.com ). Auto inferred from request headers; set explicitly for AWS Lambda, proxies, or tunnels.
INNGEST SERVE PATH URL path to your serve endpoint (e.g., /api/inngest ). Auto inferred in most cases.
INNGEST STREAMING Enable response streaming ( true / false ). Extends timeout limits on Vercel and edge runtimes.
INNGEST ENV Target Inngest Environment. Auto detected on some platforms.
Debugging Your Serve Endpoint
Verify your serve() endpoint is configured correctly:
If functionsFound is 0 , check that your functions are passed to the serve() call.
Testing Functions Locally
Send Events via SDK
Send Events via curl
The event key in the URL path ( test above) can be any value locally.
Unit Testing with @inngest/test
Requires inngest@ =4.0.0 .
Mock external dependencies with your test framework's standard mocking ( jest.mock , vi.mock , etc.) — @inngest/test handles only Inngest specific mocking.
Docker Setup
Standalone
Use host.docker.internal to reach your app running on the host machine (works out of the box on Docker Desktop). On Linux, add add host=host.docker.internal:host gateway or use an equivalent host access method.
Docker Compose
Port 8288 is the main server and UI. Port 8289 is the connect() WebSocket gateway.
Critical: Set INNGEST DEV=1 on your app — the TypeScript SDK defaults to Cloud mode, which will skip the Dev Server.
MCP Server (AI Dev Tools)
The Dev Server exposes an MCP server at http://127.0.0.1:8288/mcp (HTTP transport).
Available MCP Tools
Tool Description
send event Send events to trigger functions
list functions List all registered functions and triggers
invoke function Execute a function synchronously (default 30s timeout)
get run status Get detailed status of a function run
poll run status Poll multiple runs until completion
grep docs Search Inngest documentation by regex pattern
read doc Read a specific documentation page
list docs List available documentation structure
inngest start — Self Hosted Production
Runs Inngest as a self hosted production server. Not the same as inngest dev — this is for production workloads.
Flag Short Default Description
port p 8288 Server port
signing key Hex key for request signing (even character count)
event key Authentication key for apps (repeatable)
sdk url u App serve URLs (repeatable)
redis uri External Redis connection
postgres uri External PostgreSQL connection
sqlite dir SQLite database directory
poll interval 0 App sync polling interval (seconds)
queue workers 100 Number of executor workers
connect gateway port 8289 Connect gateway port
retry interval 0 Linear retry interval in seconds
tick 150 Executor queue polling interval in milliseconds
no ui Disable web UI and GraphQL API
postgres conn max idle time 5 PostgreSQL idle connection lifetime in minutes
postgres conn max lifetime 30 PostgreSQL maximum connection reuse time in minutes
postgres max idle conns 10 PostgreSQL max idle connections
postgres max open conns 100 PostgreSQL max open connections
Global flags such as log level , verbose , and json are also available. For environment variables, follow the current CLI and deployment docs; do not assume every flag has an INNGEST environment variable equivalent.
Default persistence: in memory Redis + SQLite at ./.inngest/main.db . For production, use external Redis and PostgreSQL.
Deployment Workflow
Local Development → Production
1. Develop locally with inngest dev — no keys needed, no code changes for production
2. Deploy your app to your hosting platform
3. Sync with Inngest using one of three methods:
4. Set environment variables in production:
No code changes are needed when moving from local dev to production. The SDK automatically detects the environment.
Platform Specific Gotchas
Platform Gotcha
Express Requires express.json() middleware; default body limit is 100kb — increase to handle Inngest payloads (up to 4MB)
AWS Lambda Set INNGEST SERVE ORIGIN and INNGEST SERVE PATH explicitly — auto inference fails
Firebase Cloud Functions Must set INNGEST SERVE PATH env var
DigitalOcean Functions Both serveOrigin and servePath required in serve() config
Cloudflare Workers (Wrangler remote ) Requires tunnel (ngrok/localtunnel) for Dev Server connection
Supabase Edge Functions servePath must match function name — Supabase rewrites request paths
Google Cloud Run (1st gen) Not officially supported; may cause signature verification errors
Docker Must set INNGEST DEV=1 — SDK defaults to Cloud mode
External webhooks (Stripe, Clerk) Require tunnel solution (ngrok, localtunnel) for local testing
Quick Reference
Troubleshooting
Issue Cause Solution
Dev Server doesn't find functions App not running or wrong port Start your app first; use u to specify the correct URL
functionsFound: 0 in debug output Functions not passed to serve() Verify all functions are in the array passed to serve()
SDK connects to Cloud instead of Dev Server INNGEST DEV not set Set INNGEST DEV=1 in your environment
Functions sync to wrong Inngest environment Wrong signing key Check INNGEST SIGNING KEY matches target environment
Duplicate app in Inngest dashboard App id was changed Keep the id in new Inngest({ id }) stable across deploys
Webhook events not reaching Dev Server No tunnel configured Use ngrok or localtunnel for external webhook sources
"Unattached sync" in dashboard Auto sync failed silently Check integration logs; resync manually
See [inngest setup](../inngest setup/SKILL.md) for SDK installation and [inngest durable functions](../inngest durable functions/SKILL.md) for function configuration.