| name | trigger-config |
| description | Configure your Trigger.dev project with a trigger.config.ts file |
Source Cursor rule: .cursor/rules/trigger.config.mdc.
Original file scope: **/trigger.config.ts.
Original Cursor alwaysApply: false.
Trigger.dev Configuration (v4)
Complete guide to configuring trigger.config.ts with build extensions
Basic Configuration
import { defineConfig } from "@trigger.dev/sdk";
export default defineConfig({
project: "<project-ref>",
dirs: ["./trigger"],
runtime: "node",
logLevel: "info",
retries: {
enabledInDev: false,
default: {
maxAttempts: 3,
minTimeoutInMs: 1000,
maxTimeoutInMs: 10000,
factor: 2,
randomize: true,
},
},
build: {
autoDetectExternal: true,
keepNames: true,
minify: false,
extensions: [],
},
onStart: async ({ payload, ctx }) => {
console.log("Global task start");
},
onSuccess: async ({ payload, output, ctx }) => {
console.log("Global task success");
},
onFailure: async ({ payload, error, ctx }) => {
console.log("Global task failure");
},
});
Build Extensions
Database & ORM
Prisma
import { prismaExtension } from "@trigger.dev/build/extensions/prisma";
extensions: [
prismaExtension({
schema: "prisma/schema.prisma",
version: "5.19.0",
migrate: true,
directUrlEnvVarName: "DIRECT_DATABASE_URL",
typedSql: true,
}),
];
TypeScript Decorators (for TypeORM)
import { emitDecoratorMetadata } from "@trigger.dev/build/extensions/typescript";
extensions: [
emitDecoratorMetadata(),
];
Scripting Languages
Python
import { pythonExtension } from "@trigger.dev/build/extensions/python";
extensions: [
pythonExtension({
scripts: ["./python/**/*.py"],
requirementsFile: "./requirements.txt",
devPythonBinaryPath: ".venv/bin/python",
}),
];
const result = await python.runInline(`print("Hello, world!")`);
const output = await python.runScript("./python/script.py", ["arg1"]);
Browser Automation
Playwright
import { playwright } from "@trigger.dev/build/extensions/playwright";
extensions: [
playwright({
browsers: ["chromium", "firefox", "webkit"],
headless: true,
}),
];
Puppeteer
import { puppeteer } from "@trigger.dev/build/extensions/puppeteer";
extensions: [puppeteer()];
Lightpanda
import { lightpanda } from "@trigger.dev/build/extensions/lightpanda";
extensions: [
lightpanda({
version: "latest",
disableTelemetry: false,
}),
];
Media Processing
FFmpeg
import { ffmpeg } from "@trigger.dev/build/extensions/core";
extensions: [
ffmpeg({ version: "7" }),
];
Audio Waveform
import { audioWaveform } from "@trigger.dev/build/extensions/audioWaveform";
extensions: [
audioWaveform(),
];
System & Package Management
System Packages (apt-get)
import { aptGet } from "@trigger.dev/build/extensions/core";
extensions: [
aptGet({
packages: ["ffmpeg", "imagemagick", "curl=7.68.0-1"],
}),
];
Additional NPM Packages
Only use this for installing CLI tools, NOT packages you import in your code.
import { additionalPackages } from "@trigger.dev/build/extensions/core";
extensions: [
additionalPackages({
packages: ["wrangler"],
}),
];
Additional Files
import { additionalFiles } from "@trigger.dev/build/extensions/core";
extensions: [
additionalFiles({
files: ["wrangler.toml", "./assets/**", "./fonts/**"],
}),
];
Environment & Build Tools
Environment Variable Sync
import { syncEnvVars } from "@trigger.dev/build/extensions/core";
extensions: [
syncEnvVars(async (ctx) => {
return [
{ name: "SECRET_KEY", value: await getSecret(ctx.environment) },
{ name: "API_URL", value: ctx.environment === "prod" ? "api.prod.com" : "api.dev.com" },
];
}),
];
ESBuild Plugins
import { esbuildPlugin } from "@trigger.dev/build/extensions";
import { sentryEsbuildPlugin } from "@sentry/esbuild-plugin";
extensions: [
esbuildPlugin(
sentryEsbuildPlugin({
org: process.env.SENTRY_ORG,
project: process.env.SENTRY_PROJECT,
authToken: process.env.SENTRY_AUTH_TOKEN,
}),
{ placement: "last", target: "deploy" }
),
];
Custom Build Extensions
import { defineConfig } from "@trigger.dev/sdk";
const customExtension = {
name: "my-custom-extension",
externalsForTarget: (target) => {
return ["some-native-module"];
},
onBuildStart: async (context) => {
console.log(`Build starting for ${context.target}`);
},
onBuildComplete: async (context, manifest) => {
console.log("Build complete, adding layers");
context.addLayer({
id: "my-layer",
files: [{ source: "./custom-file", destination: "/app/custom" }],
commands: ["chmod +x /app/custom"],
});
},
};
export default defineConfig({
project: "my-project",
build: {
extensions: [customExtension],
},
});
Advanced Configuration
Telemetry
import { PrismaInstrumentation } from "@prisma/instrumentation";
import { OpenAIInstrumentation } from "@langfuse/openai";
export default defineConfig({
telemetry: {
instrumentations: [new PrismaInstrumentation(), new OpenAIInstrumentation()],
exporters: [customExporter],
},
});
Machine & Performance
export default defineConfig({
defaultMachine: "large-1x",
maxDuration: 300,
enableConsoleLogging: true,
});
Common Extension Combinations
Full-Stack Web App
extensions: [
prismaExtension({ schema: "prisma/schema.prisma", migrate: true }),
additionalFiles({ files: ["./public/**", "./assets/**"] }),
syncEnvVars(async (ctx) => [...envVars]),
];
AI/ML Processing
extensions: [
pythonExtension({
scripts: ["./ai/**/*.py"],
requirementsFile: "./requirements.txt",
}),
ffmpeg({ version: "7" }),
additionalPackages({ packages: ["wrangler"] }),
];
Web Scraping
extensions: [
playwright({ browsers: ["chromium"] }),
puppeteer(),
additionalFiles({ files: ["./selectors.json", "./proxies.txt"] }),
];
Best Practices
- Use specific versions: Pin extension versions for reproducible builds
- External packages: Add modules with native addons to the
build.external array
- Environment sync: Use
syncEnvVars for dynamic secrets
- File paths: Use glob patterns for flexible file inclusion
- Debug builds: Use
--log-level debug --dry-run for troubleshooting
Extensions only affect deployment, not local development. Use external array for packages that shouldn't be bundled.