Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
triggerdotdev avatar

Trigger Dev Tasks

  • 223 installs
  • 15.9k repo stars
  • Updated August 4, 2026
  • triggerdotdev/trigger.dev

Author durable Trigger.dev background tasks, schedules, and event-driven workflows inside a TypeScript/Node service without hand-rolling queues, retries, or deployment glue.

About

Guides developers building with triggerdotdev/trigger.dev to define, test, and ship Trigger.dev tasks—scheduled jobs, event handlers, and long-running workflows—with correct SDK usage, environment setup, and integration patterns for production async execution.

  • Durable background job and cron task patterns
  • Event triggers, retries, and idempotency guidance
  • Deploy and run tasks on Trigger.dev infrastructure
  • TypeScript-first task authoring from triggerdotdev/trigger.dev
  • Fits SaaS and agent backends needing reliable async work

Trigger Dev Tasks by the numbers

  • 223 all-time installs (skills.sh)
  • +4 installs in the week ending Jul 27, 2026 (Skillselion tracking)
  • Ranked #564 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/triggerdotdev/trigger.dev --skill trigger-dev-tasks

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs223
repo stars15.9k
Last updatedAugust 4, 2026
Repositorytriggerdotdev/trigger.dev

What it does

Author durable Trigger.dev background tasks, schedules, and event-driven workflows inside a TypeScript/Node service without hand-rolling queues, retries, or deployment glue.

Files

SKILL.mdMarkdownGitHub ↗

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

1. Always use `@trigger.dev/sdk` - Never use @trigger.dev/sdk/v3 or deprecated client.defineJob pattern 2. Never use `node-fetch` - Use the built-in fetch function 3. Export all tasks - Every task must be exported, including subtasks 4. Never wrap wait/trigger calls in Promise.all - triggerAndWait, batchTriggerAndWait, and wait.* calls cannot be wrapped in Promise.all or Promise.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

PresetvCPUMemory
micro0.250.25GB
small-1x0.50.5GB
small-2x11GB
medium-1x12GB
medium-2x24GB
large-1x48GB
large-2x816GB

Design Principles

1. Break complex workflows into subtasks that can be independently retried and made idempotent 2. Don't over-complicate - Sometimes Promise.allSettled inside a single task is better than many subtasks (each task has dedicated process and is charged by millisecond) 3. Always configure retries - Set appropriate maxAttempts based on the operation 4. Use idempotency keys - Especially for payment/critical operations 5. Group related subtasks - Keep subtasks only used by one parent in the same file, don't export them 6. 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, waits
  • advanced-tasks.md - Tags, queues, concurrency, metadata, error handling
  • scheduled-tasks.md - Cron schedules, declarative and imperative
  • realtime.md - Real-time subscriptions, streams, React hooks
  • config.md - trigger.config.ts, build extensions (Prisma, Playwright, FFmpeg, etc.)

Related skills

Automation & Workflowsbackendintegrationsdevops

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.