trigger-dev-tasks
Specialized assistance for building reliable background job systems in Trigger.dev using the official SDK.
Install
mkdir -p .claude/skills/trigger-dev-tasks && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/8014" && unzip -o skill.zip -d .claude/skills/trigger-dev-tasks && rm skill.zipInstalls to .claude/skills/trigger-dev-tasks
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Use this skill when writing, designing, or optimizing Trigger.dev background tasks and workflows. This includes creating reliable async tasks, implementing AI workflows, setting up scheduled jobs, structuring complex task hierarchies with subtasks, configuring build extensions for tools like ffmpeg or Puppeteer/Playwright, and handling task schemas with Zod validation.Key capabilities
- →Create reliable async background tasks
- →Implement Zod schema validation for payloads
- →Structure complex task hierarchies with subtasks
- →Configure idempotency keys for retries
- →Set up scheduled cron jobs
How it works
The skill defines tasks using the Trigger.dev SDK, utilizing Zod for payload validation and idempotency keys to ensure reliable execution during retries.
Inputs & outputs
When to use trigger-dev-tasks
- →Create a reliable async background job
- →Set up a scheduled cron task
- →Implement Zod validation for task schemas
About this skill
Trigger.dev Task Expert
You are an expert Trigger.dev developer specializing in building production-grade background job systems. Tasks deployed to Trigger.dev run in Node.js 21+ and use the @trigger.dev/sdk package.
Critical Rules
- Always use
@trigger.dev/sdk- Never use@trigger.dev/sdk/v3or deprecatedclient.defineJobpattern - Never use
node-fetch- Use the built-infetchfunction - Export all tasks - Every task must be exported, including subtasks
- Never wrap wait/trigger calls in Promise.all -
triggerAndWait,batchTriggerAndWait, andwait.*calls cannot be wrapped inPromise.allorPromise.allSettled
Basic Task Pattern
import { task } from "@trigger.dev/sdk";
export const processData = task({
id: "process-data",
retry: {
maxAttempts: 10,
factor: 1.8,
minTimeoutInMs: 500,
maxTimeoutInMs: 30_000,
},
run: async (payload: { userId: string; data: any[] }) => {
console.log(`Processing ${payload.data.length} items`);
return { processed: payload.data.length };
},
});
Schema Task (with validation)
import { schemaTask } from "@trigger.dev/sdk";
import { z } from "zod";
export const validatedTask = schemaTask({
id: "validated-task",
schema: z.object({
name: z.string(),
email: z.string().email(),
}),
run: async (payload) => {
// Payload is automatically validated and typed
return { message: `Hello ${payload.name}` };
},
});
Triggering Tasks
From Backend Code (type-only import to prevent dependency leakage)
import { tasks } from "@trigger.dev/sdk";
import type { processData } from "./trigger/tasks";
const handle = await tasks.trigger<typeof processData>("process-data", {
userId: "123",
data: [{ id: 1 }],
});
From Inside Tasks
export const parentTask = task({
id: "parent-task",
run: async (payload) => {
// Trigger and wait - returns Result object, NOT direct output
const result = await childTask.triggerAndWait({ data: "value" });
if (result.ok) {
console.log("Output:", result.output);
} else {
console.error("Failed:", result.error);
}
// Or unwrap directly (throws on error)
const output = await childTask.triggerAndWait({ data: "value" }).unwrap();
},
});
Idempotency (Critical for Retries)
Always use idempotency keys when triggering tasks from inside other tasks:
import { idempotencyKeys } from "@trigger.dev/sdk";
export const paymentTask = task({
id: "process-payment",
run: async (payload: { orderId: string }) => {
// Scoped to current run - survives retries
const key = await idempotencyKeys.create(`payment-${payload.orderId}`);
await chargeCustomer.trigger(payload, {
idempotencyKey: key,
idempotencyKeyTTL: "24h",
});
},
});
Trigger Options
await myTask.trigger(payload, {
delay: "1h", // Delay execution
ttl: "10m", // Cancel if not started within TTL
idempotencyKey: key,
queue: "my-queue",
machine: "large-1x", // micro, small-1x, small-2x, medium-1x, medium-2x, large-1x, large-2x
maxAttempts: 3,
tags: ["user_123"], // Max 10 tags
debounce: { // Consolidate rapid triggers
key: "unique-key",
delay: "5s",
mode: "trailing", // "leading" (default) or "trailing"
},
});
Debouncing
Consolidate multiple triggers into a single execution:
// Rapid triggers with same key = single execution
await myTask.trigger({ userId: "123" }, {
debounce: {
key: "user-123-update",
delay: "5s",
},
});
// Trailing mode: use payload from LAST trigger
await myTask.trigger({ data: "latest" }, {
debounce: {
key: "my-key",
delay: "10s",
mode: "trailing",
},
});
Use cases: user activity updates, webhook deduplication, search indexing, notification batching.
Batch Triggering
Up to 1,000 items per batch, 3MB per payload:
const results = await myTask.batchTriggerAndWait([
{ payload: { userId: "1" } },
{ payload: { userId: "2" } },
]);
for (const result of results) {
if (result.ok) console.log(result.output);
}
Machine Presets
| Preset | vCPU | Memory |
|---|---|---|
| micro | 0.25 | 0.25GB |
| small-1x | 0.5 | 0.5GB |
| small-2x | 1 | 1GB |
| medium-1x | 1 | 2GB |
| medium-2x | 2 | 4GB |
| large-1x | 4 | 8GB |
| large-2x | 8 | 16GB |
Design Principles
- Break complex workflows into subtasks that can be independently retried and made idempotent
- Don't over-complicate - Sometimes
Promise.allSettledinside a single task is better than many subtasks (each task has dedicated process and is charged by millisecond) - Always configure retries - Set appropriate
maxAttemptsbased on the operation - Use idempotency keys - Especially for payment/critical operations
- Group related subtasks - Keep subtasks only used by one parent in the same file, don't export them
- Use logger - Log at key execution points with
logger.info(),logger.error(), etc.
Reference Documentation
For detailed documentation on specific topics, read these files:
basic-tasks.md- Task basics, triggering, waitsadvanced-tasks.md- Tags, queues, concurrency, metadata, error handlingscheduled-tasks.md- Cron schedules, declarative and imperativerealtime.md- Real-time subscriptions, streams, React hooksconfig.md- trigger.config.ts, build extensions (Prisma, Playwright, FFmpeg, etc.)
When not to use it
- →Wrapping wait/trigger calls in Promise.all
- →Using node-fetch instead of built-in fetch
Prerequisites
Limitations
- →Tasks must run in Node.js 21+
- →Batch triggers limited to 1,000 items per batch
How it compares
It enforces production-grade patterns like idempotency and schema validation, avoiding deprecated client patterns found in generic task implementations.
Compared to similar skills
trigger-dev-tasks side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| trigger-dev-tasks (this skill) | 0 | 7mo | No flags | Advanced |
| write-script-bun | 1 | 2mo | No flags | Intermediate |
| bullmq-specialist | 25 | 6mo | No flags | Intermediate |
| workflow | 4 | 2mo | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
write-script-bun
windmill-labs
MUST use when writing Bun/TypeScript scripts.
bullmq-specialist
davila7
BullMQ expert for Redis-backed job queues, background processing, and reliable async execution in Node.js/TypeScript applications. Use when: bullmq, bull queue, redis queue, background job, job queue.
workflow
vercel
Creates durable, resumable workflows using Vercel's Workflow DevKit. Use when building workflows that need to survive restarts, pause for external events, retry on failure, or coordinate multi-step operations over time. Triggers on mentions of "workflow", "durable functions", "resumable", "workflow devkit", or step-based orchestration.
trigger-dev
davila7
Trigger.dev expert for background jobs, AI workflows, and reliable async execution with excellent developer experience and TypeScript-first design. Use when: trigger.dev, trigger dev, background task, ai background job, long running task.
pnpm-upgrade
openai
Keep pnpm current: run pnpm self-update/corepack prepare, align packageManager in package.json, and bump pnpm/action-setup + pinned pnpm versions in .github/workflows to the latest release. Use this when refreshing the pnpm toolchain manually or in automation.
convex-cron-jobs
waynesutton
Scheduled function patterns for background tasks including interval scheduling, cron expressions, job monitoring, retry strategies, and best practices for long-running tasks