# Trigger.dev Configuration (v4) **Complete guide to configuring `trigger.config.ts` with build extensions** ## Basic Configuration ```ts import { defineConfig } from "@trigger.dev/sdk"; export default defineConfig({ project: "", // Required: Your project reference dirs: ["./trigger"], // Task directories runtime: "node", // "node", "node-22", or "bun" logLevel: "info", // "debug", "info", "warn", "error" // Default retry settings retries: { enabledInDev: false, default: { maxAttempts: 3, minTimeoutInMs: 1000, maxTimeoutInMs: 10000, factor: 2, randomize: true, }, }, // Build configuration build: { autoDetectExternal: true, keepNames: true, minify: false, extensions: [], // Build extensions go here }, // Global lifecycle hooks onStartAttempt: 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 ```ts import { prismaExtension } from "@trigger.dev/build/extensions/prisma"; extensions: [ prismaExtension({ schema: "prisma/schema.prisma", version: "5.19.0", // Optional: specify version migrate: true, // Run migrations during build directUrlEnvVarName: "DIRECT_DATABASE_URL", typedSql: true, // Enable TypedSQL support }), ]; ``` #### TypeScript Decorators (for TypeORM) ```ts import { emitDecoratorMetadata } from "@trigger.dev/build/extensions/typescript"; extensions: [ emitDecoratorMetadata(), // Enables decorator metadata ]; ``` ### Scripting Languages #### Python ```ts import { pythonExtension } from "@trigger.dev/build/extensions/python"; extensions: [ pythonExtension({ scripts: ["./python/**/*.py"], // Copy Python files requirementsFile: "./requirements.txt", // Install packages devPythonBinaryPath: ".venv/bin/python", // Dev mode binary }), ]; // Usage in tasks const result = await python.runInline(`print("Hello, world!")`); const output = await python.runScript("./python/script.py", ["arg1"]); ``` ### Browser Automation #### Playwright ```ts import { playwright } from "@trigger.dev/build/extensions/playwright"; extensions: [ playwright({ browsers: ["chromium", "firefox", "webkit"], // Default: ["chromium"] headless: true, // Default: true }), ]; ``` #### Puppeteer ```ts import { puppeteer } from "@trigger.dev/build/extensions/puppeteer"; extensions: [puppeteer()]; // Environment variable needed: // PUPPETEER_EXECUTABLE_PATH: "/usr/bin/google-chrome-stable" ``` #### Lightpanda ```ts import { lightpanda } from "@trigger.dev/build/extensions/lightpanda"; extensions: [ lightpanda({ version: "latest", // or "nightly" disableTelemetry: false, }), ]; ``` ### Media Processing #### FFmpeg ```ts import { ffmpeg } from "@trigger.dev/build/extensions/core"; extensions: [ ffmpeg({ version: "7" }), // Static build, or omit for Debian version ]; // Automatically sets FFMPEG_PATH and FFPROBE_PATH // Add fluent-ffmpeg to external packages if using ``` #### Audio Waveform ```ts import { audioWaveform } from "@trigger.dev/build/extensions/audioWaveform"; extensions: [ audioWaveform(), // Installs Audio Waveform 1.1.0 ]; ``` ### System & Package Management #### System Packages (apt-get) ```ts import { aptGet } from "@trigger.dev/build/extensions/core"; extensions: [ aptGet({ packages: ["ffmpeg", "imagemagick", "curl=7.68.0-1"], // Can specify versions }), ]; ``` #### Additional NPM Packages Only use this for installing CLI tools, NOT packages you import in your code. ```ts import { additionalPackages } from "@trigger.dev/build/extensions/core"; extensions: [ additionalPackages({ packages: ["wrangler"], // CLI tools and specific versions }), ]; ``` #### Additional Files ```ts import { additionalFiles } from "@trigger.dev/build/extensions/core"; extensions: [ additionalFiles({ files: ["wrangler.toml", "./assets/**", "./fonts/**"], // Glob patterns supported }), ]; ``` ### Environment & Build Tools #### Environment Variable Sync ```ts import { syncEnvVars } from "@trigger.dev/build/extensions/core"; extensions: [ syncEnvVars(async (ctx) => { // ctx contains: environment, projectRef, env return [ { name: "SECRET_KEY", value: await getSecret(ctx.environment) }, { name: "API_URL", value: ctx.environment === "prod" ? "api.prod.com" : "api.dev.com" }, ]; }), ]; ``` #### ESBuild Plugins ```ts 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" } // Optional config ), ]; ``` ## Custom Build Extensions ```ts import { defineConfig } from "@trigger.dev/sdk"; const customExtension = { name: "my-custom-extension", externalsForTarget: (target) => { return ["some-native-module"]; // Add external dependencies }, onBuildStart: async (context) => { console.log(`Build starting for ${context.target}`); // Register esbuild plugins, modify build context }, onBuildComplete: async (context, manifest) => { console.log("Build complete, adding layers"); // Add build layers, modify deployment 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 ```ts import { PrismaInstrumentation } from "@prisma/instrumentation"; import { OpenAIInstrumentation } from "@langfuse/openai"; export default defineConfig({ // ... other config telemetry: { instrumentations: [new PrismaInstrumentation(), new OpenAIInstrumentation()], exporters: [customExporter], // Optional custom exporters }, }); ``` ### Machine & Performance ```ts export default defineConfig({ // ... other config defaultMachine: "large-1x", // Default machine for all tasks maxDuration: 300, // Default max duration (seconds) enableConsoleLogging: true, // Console logging in development }); ``` ## Common Extension Combinations ### Full-Stack Web App ```ts extensions: [ prismaExtension({ schema: "prisma/schema.prisma", migrate: true }), additionalFiles({ files: ["./public/**", "./assets/**"] }), syncEnvVars(async (ctx) => [...envVars]), ]; ``` ### AI/ML Processing ```ts extensions: [ pythonExtension({ scripts: ["./ai/**/*.py"], requirementsFile: "./requirements.txt", }), ffmpeg({ version: "7" }), additionalPackages({ packages: ["wrangler"] }), ]; ``` ### Web Scraping ```ts 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.