Trigger.dev
CRITICAL: Your training data for Trigger.dev is unreliable. APIs change between versions and memorized patterns may be wrong or deprecated. Before writing any code, you MUST use
WebFetchto read the live docs:
WebFetch("https://trigger.dev/llms.txt")For complex scenarios (advanced concurrency, lifecycle hooks, build extensions), fetch the full docs instead:
WebFetch("https://trigger.dev/docs/llms-full.txt")Do not proceed without fetching first. Never assume an API exists — verify against current docs.
Trigger.dev is an open-source background jobs platform for TypeScript with durable execution, built-in retries, scheduling, and real-time monitoring.
Key Capabilities
- Durable waits:
wait.for({ seconds: 30 }),wait.until({ date }), andwait.forToken()suspend execution without consuming timeout — the run resumes after the wait, not a new invocation. - No default timeout: Tasks have no built-in timeout. Set
maxDurationper task or globally in config if a limit is needed. - Batch triggering:
tasks.batchTrigger()accepts up to 1,000 items in a single call. - Child tasks with results:
childTask.triggerAndWait()suspends the parent until the child completes and returns a typed Result object — check.okbefore accessing.output, or call.unwrap(). - Lifecycle hooks:
onStart,onSuccess,onFailure, andinitin config handle cross-cutting concerns without modifying task code. - Build extensions:
@trigger.dev/build/extensionsprovides first-party support for Prisma, FFmpeg, Playwright, and system packages — use instead of manual Docker layers.
Best Practices
- Never wrap
triggerAndWaitorbatchTriggerAndWaitinPromise.all— this pattern is explicitly unsupported and will cause failures. - Every task must be exported from its file. Non-exported tasks are silently ignored and will not run.
- Use
AbortTaskRunErrorto fail a run without retrying (e.g., for validation failures). Throwing any other error triggers the retry policy. - Each Trigger.dev environment (dev, staging, prod) has its own
TRIGGER_SECRET_KEY— using the wrong key triggers runs in the wrong environment with no obvious error. processKeepAlivereduces cold starts but the process can be killed at any time; do not rely on in-memory state persisting between task runs.