Trigger.dev is a background jobs framework for TypeScript. It's like Sidekiq for Node.js — but with type safety, retries, and a dashboard built in.
The Free APIs You're Missing
1. defineJob — Type-Safe Background Jobs
import { task } from "@trigger.dev/sdk/v3";
export const processOrder = task({
id: "process-order",
retry: { maxAttempts: 3, factor: 2, minTimeoutInMs: 1000 },
run: async (payload: { orderId: string; userId: string }) => {
const order = await db.orders.findUnique({ where: { id: payload.orderId } });
await chargePayment(order);
await sendConfirmationEmail(payload.userId, order);
await updateInventory(order.items);
return { processed: true, orderId: payload.orderId };
},
});
2. Triggering — Multiple Ways to Start Jobs
// From your API route
await processOrder.trigger({ orderId: "order-123", userId: "user-456" });
// Batch trigger
await processOrder.batchTrigger(
orders.map(order => ({ payload: { orderId: order.id, userId: order.userId } }))
);
// Delayed trigger
await processOrder.trigger(
{ orderId: "order-123", userId: "user-456" },
{ delay: "5m" }
);
// With idempotency key
await processOrder.trigger(
{ orderId: "order-123", userId: "user-456" },
{ idempotencyKey: "order-123" }
);
3. Scheduled Tasks — Cron Jobs
import { schedules } from "@trigger.dev/sdk/v3";
export const dailyReport = schedules.task({
id: "daily-report",
cron: "0 9 * * *", // Every day at 9am
run: async () => {
const stats = await generateDailyStats();
await sendSlackMessage(stats);
return stats;
},
});
4. waitFor — Long-Running Workflows
export const onboardUser = task({
id: "onboard-user",
run: async (payload: { userId: string }) => {
await createAccount(payload.userId);
// Wait for email verification (up to 24h)
const verified = await wait.for({ seconds: 86400 });
if (verified) {
await activateAccount(payload.userId);
await sendWelcomeEmail(payload.userId);
}
},
});
5. Sub-Tasks — Composable Workflows
export const processVideo = task({
id: "process-video",
run: async (payload: { videoUrl: string }) => {
const downloaded = await downloadVideo.triggerAndWait({ url: payload.videoUrl });
const transcoded = await transcodeVideo.triggerAndWait({ path: downloaded.path });
const thumbnail = await generateThumbnail.triggerAndWait({ path: transcoded.path });
return { video: transcoded.url, thumbnail: thumbnail.url };
},
});
Getting Started
npx trigger.dev@latest init
npx trigger.dev@latest dev
Need data from any website delivered as clean JSON? I build production web scrapers that handle anti-bot, proxies, and rate limits. 77 scrapers running in production. Email me: Spinov001@gmail.com
Check out my awesome-web-scraping list for the best scraping tools and resources.
Top comments (0)