# Trigger Dev

> Trigger.dev — open-source background jobs platform for TypeScript with durable execution, retries, scheduling, and real-time monitoring. Use when building with Trigger.dev or asking about its task definitions, schedules, delays, batching, concurrency, or deployment. Fetch live documentation for up-to-date details.

- Skill: `mikkelkrogsholm/trigger-dev` (Agent Skill)
- Install (CLI): `npx skillmds@latest add mikkelkrogsholm/trigger-dev`
- Raw SKILL.md: https://api.skillmd.com/api/skills/mikkelkrogsholm/trigger-dev/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: mikkelkrogsholm (https://skillmd.com/u/mikkelkrogsholm)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/mikkelkrogsholm/trigger-dev

---


# 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 `WebFetch` to 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 })`, and `wait.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 `maxDuration` per 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 `.ok` before accessing `.output`, or call `.unwrap()`.
- **Lifecycle hooks**: `onStart`, `onSuccess`, `onFailure`, and `init` in config handle cross-cutting concerns without modifying task code.
- **Build extensions**: `@trigger.dev/build/extensions` provides first-party support for Prisma, FFmpeg, Playwright, and system packages — use instead of manual Docker layers.

## Best Practices

- Never wrap `triggerAndWait` or `batchTriggerAndWait` in `Promise.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 `AbortTaskRunError` to 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.
- `processKeepAlive` reduces cold starts but the process can be killed at any time; do not rely on in-memory state persisting between task runs.

