Runs page now updates in place: statuses change live, a banner flags new runs, and parent tooltips show child-run breakdowns.
Trigger.dev Changelog
Trigger.dev Cloud now meets HIPAA Business Associate requirements. Sign a BAA and run workloads that process Protected Health Information on our managed infrastructure.
HIPAA (Health Insurance Portability and Accountability Act) governs how Protected Health Information (PHI) must be handled. Vendors that process PHI on behalf of covered entities (such as hospitals or insurers) act as Business Associates and must have a signed Business Associate Agreement (BAA) in place.
Signing a BAA
If your tasks process PHI, you'll need a signed BAA with Trigger.dev. Once the agreement is in place, you'll be migrated onto HIPAA infrastructure. This is a paid add-on — reach out via their contact form for HIPAA requests.
Security & Compliance
Trigger.dev maintains SOC 2 Type II certification and GDPR compliance. Full details are available on their security page and Security Portal.
Faster failure on uncaught exceptions and a fix for dev workers spinning at 100% CPU.
1 improvement and 1 bug fix.
Improvements
- Fail attempts on uncaught exceptions instead of hanging to
MAX_DURATION_EXCEEDED. A NodeEventEmitter(e.g.node-redis) emitting"error"with no.on("error", ...)listener escalates touncaughtException, which the worker previously reported but did not act on: runs drifted to maxDuration with empty attempts. They now fail fast with the original error and statusFAILED, and respect the task's normal retry policy. You should still attach.on("error", ...)listeners to long-lived clients to handle errors gracefully. (#3529)
Bug Fixes
- Fix dev workers spinning at 100% CPU after the parent CLI disconnects. Orphaned
trigger-dev-run-worker(and indexer) processes were caught in anuncaughtExceptionfeedback loop: a periodic IPC send viaprocess.sendwould throwERR_IPC_CHANNEL_CLOSEDonce the parent closed the channel, which re-entered the same handler viasetImmediate, amplified by source-map-support'sprepareStackTrace. Fixed by silently dropping packets inZodIpcConnectionwhen the channel is disconnected, adding aprocess.on("disconnect", ...)handler in dev workers so they exit cleanly, and wrapping alluncaughtException-pathprocess.sendcalls in asafeSendguard. (#3491)
How to Upgrade
Update the trigger.dev/* packages to v4.4.6 using your package manager:
npx trigger.dev@latest update # npm
pnpm dlx trigger.dev@latest update # pnpm
yarn dlx trigger.dev@latest update # yarn
bunx trigger.dev@latest update # bun
Self-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.6.
Run replay detection with ctx.run.isReplay, a --no-browser CLI flag for headless environments, and a 24-hour grace window for API key rotations.
3 improvements and 12 server changes.
Highlights
ctx.run.isReplay
Tasks can now check whether the current run is a replay via ctx.run.isReplay, allowing you to skip side effects like email sends or payments during replays.
export const myTask = task({
id: "my-task",
run: async (payload, { ctx }) => {
if (ctx.run.isReplay) {
// Skip side effects like sending emails or charging cards on replay
return;
}
await sendEmail(payload.to);
},
});
Improvements
--no-browserCLI flag: Add--no-browserflag toinitandloginto skip auto-opening the browser during authentication. Useful for CI and headless environments. Also errors loudly wheninitis run without--yesunder non-TTY stdin, instead of silently half-initializing the project. Both commands now include anExamplessection in--help.- Stack trace truncation: Truncate large error stacks and messages to prevent OOM crashes: stack traces capped at 50 frames (top 5 + bottom 45 with an omission notice), individual lines at 1024 chars, and error messages at 1000 chars. Applied in
parseError,sanitizeError, and OTel span recording.
Server Changes
Changes included in the v4.4.5 Docker image and live on Trigger.dev Cloud:
- Add a server-side deprecation gate for deploys from v3 CLI versions, controlled by the
DEPRECATE_V3_CLI_DEPLOYS_ENABLEDenv var. v4 CLI deploys are unaffected. - Regenerating an environment API key no longer invalidates the previous key immediately. The old key gets a 24-hour grace window via a new
RevokedApiKeytable, and PATs signed with the rotated key also remain valid during that window. - Ship the Errors page to all users, with Slack alert improvements (viewer-timezone timestamps via
<!date^>token, pinned "No channel" picker item), activity sparkline peak tooltips, and several dashboard UI fixes. - Session primitive server infrastructure: Postgres
Session+SessionRuntables, ClickHousesessions_v1+ replication, thesessionsJWT scope, and CRUD + realtime routes includingend-and-continuefor server-orchestrated run handoffs. - Increase the default maximum project count per organization from 10 to 25.
- Replace the DISTINCT query for task filter dropdowns with a dedicated
TaskIdentifierregistry table backed by Redis. Fixes duplicate entries when a task changes trigger source and adds active/archived grouping. Environments migrate automatically on their next deploy. - Stop writing per-tick state (
lastScheduledTimestamp,nextScheduledTimestamp,lastRunTriggeredAt) onTaskSchedule. Customer-facingpayload.lastTimestampsemantics are unchanged. - Batch items that hit the environment queue size limit now fast-fail without retries and without creating pre-failed TaskRuns.
- Fix RSS memory leak in realtime proxy routes: thread
getRequestAbortSignal()throughRealtimeClientto cancel upstream Electric requests on client disconnect. Isolated reproducer showed ~44 KB retained per leaked request. - Fix memory leak where aborted SSE connections pinned the full request/response graph on Node 20, caused by
AbortSignal.any()retaining source signals indefinitely. Also clears thesetTimeout(abort)timer inentry.server.tsxso successful HTML renders don't retain the React tree for 30 seconds. - Fix Redis connection leak in realtime streams: non-blocking methods now share a single connection, and streaming connections tear down via
disconnect()immediately with a 15-second inactivity fallback. - Upgrade Remix from 2.1.0 to 2.17.4 to address React Router security vulnerabilities.
How to Upgrade
Update trigger.dev packages to v4.4.5:
npx trigger.dev@latest update # npm
pnpm dlx trigger.dev@latest update # pnpm
yarn dlx trigger.dev@latest update # yarn
bunx trigger.dev@latest update # bun
Self-hosted: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.5.
Quickly track down what's causing your runs to fail with error alerts. Then bulk replay when you've shipped the fix.
The new Errors page collapses failed runs into groups. A bad deploy that fails 800 times sends 1 alert, not 800. Ship the fix, click bulk replay, and the count flattens as the runs succeed.
Fingerprinted error groups
Every failed run gets fingerprinted by its error class and message. Dynamic parts (IDs, UUIDs, timestamps) are stripped, so 200 instances of User abc-123 not found and User xyz-789 not found collapse into one row.
The group page shows the timeline, the runs that hit it, the task versions contributing, and the first / last seen timestamps. Click any run to jump into the run detail.
One alert per group
A new group, or one firing again after being resolved, sends a Slack message, email, or webhook. The payload has the message, the stack, and a link straight to the dashboard.
Alerts are configured per project under Alerts, scoped to specific tasks and environments.
Status: unresolved, resolved, ignored
Three states. Mark one resolved when you've shipped the fix. Ignore it for hours or days when you're not ready (revert anytime).
If a resolved group fires again, it flips back to unresolved and a fresh alert goes out.
Bulk actions let you triage many at once. Select 50 stale groups, mark them resolved, move on.
Bulk replay
Replay every run in a group from the group page. The replays stay attached to the original group, so the count drops as they succeed.
Useful for the obvious case (a deploy nuked 200 jobs, you shipped the fix, you want them all to re-run) and for the less obvious one: verifying the fix actually held. 200 runs failed, 200 replays succeed, the group quiets down, you know.
Filter by task version
The list and individual error page filter by task version. The chart on the individual page stacks errors by version, so you can pinpoint which deploy introduced a regression and which one fixed it.
Every postmortem starts with "which deploy introduced this?" The version chart answers it before you've finished asking.
Get started
Open Errors in the sidebar of any project. Configure alerts under Alerts.
Reach private databases, caches, and APIs from your tasks over AWS PrivateLink — no public endpoints, IP allowlists, or VPN required.
With AWS PrivateLink support, Trigger.dev tasks can connect directly to private AWS resources inside your VPC:
- RDS (Postgres, MySQL, Aurora)
- ElastiCache (Redis, Memcached)
- Internal microservices and APIs
- Self-hosted databases on EC2
- Anything else reachable inside your VPC
How it works
- Create a Network Load Balancer and VPC Endpoint Service in your AWS account.
- Add Trigger.dev's account as an allowed principal.
- Provision a VPC Endpoint — Trigger.dev handles the rest.
Connections are isolated using a CiliumNetworkPolicy (eBPF kernel-level traffic filtering) targeting pods labeled with your org ID, so your private resources are only reachable from your own tasks.
Setup options
- Enter an existing VPC Endpoint Service name
- Generate a pre-filled Terraform script
- Use an AI agent prompt to create resources automatically
- Follow a step-by-step AWS Console walkthrough
All configured via Settings → Private Connections.
Availability
- Plans: Pro and Enterprise
- Default limit: 2 connections per organization
- Regions: Available across 28 AWS regions on the customer side; consumed in
us-east-1andeu-central-1 - Connections are organization-wide, accessible across all projects and environments
Bidirectional task communication — send typed data into running tasks from your backend or frontend, with four receiving patterns from suspending (frees compute) to non-blocking.
Requires SDK v4.4.2+: npm install @trigger.dev/sdk@latest @trigger.dev/react-hooks@latest
Four receiving patterns
.on(): listen in the background
Fires your handler every time data arrives. The task keeps running. Useful for cancel signals and agent steering.
cancelSignal.on((data) => {
console.log("Cancelled:", data.reason);
controller.abort();
});
.wait(): suspend until data arrives
The task process is freed entirely — no compute cost while you wait. Resumes at the exact stopping point when data arrives, like a typed waitpoint.
const result = await approval.wait({ timeout: "7d" });
if (result.ok && result.output.approved) {
await publish(draft);
}
.once(): block for the next message
Blocks for the next message while keeping the process alive.
const data = await approval.once({ timeoutMs: 300_000 }).unwrap();
.peek(): check without waiting
Non-blocking. Returns the latest buffered value, or undefined if nothing has arrived yet.
const latest = cancelSignal.peek();
if (latest) {
// Someone already sent a cancel before we checked
}
Send from your backend
await userMessage.send(runId, {
type: "follow-up",
text: "Focus on competitor pricing",
});
Send from your frontend
Use the useInputStreamSend React hook with full type safety.
"use client";
import { useInputStreamSend } from "@trigger.dev/react-hooks";
import { userMessage } from "@/trigger/streams";
export function ResearchChat({ runId, accessToken }: {
runId: string;
accessToken: string;
}) {
const { send, isReady } = useInputStreamSend(
userMessage.id, runId, { accessToken }
);
return (
<div>
<button disabled={!isReady}
onClick={() => send({ type: "follow-up", text: "Go deeper on the pricing model" })}>
Go deeper
</button>
<button disabled={!isReady}
onClick={() => send({ type: "wrap-up", text: "That's enough, compile the report" })}>
Wrap up
</button>
</div>
);
}
Get started
Define a typed stream:
// trigger/streams.ts
import { streams } from "@trigger.dev/sdk";
export const userMessage = streams.input<{
type: "instruction" | "follow-up" | "wrap-up";
text: string;
}>({ id: "user-message" });
Listen in your task:
// trigger/research.ts
import { task } from "@trigger.dev/sdk";
import { userMessage } from "./streams";
export const researchAgent = task({
id: "research-agent",
run: async (payload: { topic: string }) => {
const messages: string[] = [];
let shouldWrapUp = false;
userMessage.on((data) => {
if (data.type === "wrap-up") {
shouldWrapUp = true;
}
messages.push(data.text);
});
let context = payload.topic;
while (!shouldWrapUp) {
const result = await generateResearch(context);
await saveFindings(result);
if (messages.length > 0) {
context = `${context}\n\nUser feedback:\n${messages.splice(0).join("\n")}`;
}
}
return await compileFinalReport(context);
},
});2 new features, 11 new MCP tools, 6 bug fixes, and 15 server changes.
Highlights
Task-level and global TTL defaults
You can now set TTL (time-to-live) defaults at the task level in your task definition and globally in trigger.config.ts. If a run isn't dequeued within the configured window, it expires and never executes. Per-trigger overrides still take precedence over both.
// trigger.config.ts — set a project-wide default
import { defineConfig } from "@trigger.dev/sdk";
export default defineConfig({
project: "<project ref>",
ttl: "1h", // runs expire after 1 hour if not dequeued
});
// task — override the global default for this task
export const myTask = task({
id: "my-task",
ttl: "30m", // this task's runs expire after 30 minutes
run: async (payload) => {
// ...
},
});
Set ttl: 0 on a task to opt out of the global default entirely.
Multi-provider object storage for large run outputs
Large run outputs now use a new storage API that supports switching object storage providers with zero-downtime migration via protocol-based routing. IAM role-based authentication is also supported, eliminating the need for access keys.
CLI improvements
- Platform notifications: the
trigger devandtrigger logincommands now fetch and display notifications (info, warn, error, success) from the server with color markup rendering. Discovery-based filtering shows notifications based on your project file patterns. Use--skip-platform-notificationsto disable.
MCP server improvements
New tools
get_span_details— inspect individual spans within a run trace, including attributes, timing, events, and AI enrichment (model, tokens, cost). Span IDs are now shown inget_run_detailstrace output for easy discovery.get_query_schema— discover available TRQL tables and columnsquery— execute TRQL queries against your datalist_dashboards— list built-in dashboards and their widgetsrun_dashboard_query— execute a single dashboard widget querywhoami— show current profile, user, and API URLlist_profiles— list all configured CLI profilesswitch_profile— switch the active profile for the MCP sessionstart_dev_server— starttrigger devin the background and stream outputstop_dev_server— stop the running dev serverdev_server_status— check dev server status and view recent logs
Improvements
--readonlyflag hides write tools (deploy,trigger_task,cancel_run) so the AI cannot make changesget_run_detailstrace output is now paginated with cursor supportget_query_schemanow requires a table name and returns only that table's schemaget_current_workerno longer inlines payload schemas — use the newget_task_schematool instead- Query results formatted as text tables instead of JSON (~50% fewer tokens)
cancel_run,list_deploys,list_preview_branchesformatted as text instead of raw JSON- Schema and dashboard API responses cached to avoid redundant fetches
- MCP tool annotations (
readOnlyHint,destructiveHint) added to all tools read:queryJWT scope added for query endpoint authorization- CLI API client now propagates the trigger source via HTTP headers
Bug fixes
- Fix dev CLI leaking build directories on rebuild. Deprecated workers are now pruned (capped at 2 retained) when no active runs reference them.
- Fix
--loadflag being silently ignored on local and self-hosted builds. - Fixed
search_docsMCP tool failing due to a renamed upstream Mintlify tool (SearchTriggerDev→search_trigger_dev). - Fixed
list_deploysMCP tool failing when deployments have nullruntimeorruntimeVersionfields. - Fixed
list_preview_branchesMCP tool crashing due to incorrect response shape access. - Fixed
metricsTRQL table column documented asvalueinstead ofmetric_value.
Server changes
These changes are included in the v4.4.4 Docker image and are already live on Trigger.dev Cloud:
- Add admin UI for viewing and editing feature flags with org-level overrides and global defaults.
- Add
allowRollbacksquery param to the promote deployment API to support version downgrades. - Automatic LLM cost calculation for spans with GenAI semantic conventions. Costs are calculated from an in-memory pricing registry and written to span attributes.
- New
GET /api/v1/runs/:runId/spans/:spanIdendpoint returning span properties, events, AI enrichment, and triggered child runs. - Multi-provider object storage with protocol-based routing for zero-downtime migration. Adds IAM role-based auth for object stores (no access keys required).
- Platform notifications for informing users about new features and platform events directly in the CLI and dashboard.
- Private networking support via AWS PrivateLink. Includes BillingClient methods for managing connections, org settings UI for connection management, and supervisor pod labels for CiliumNetworkPolicy matching.
- Reduce run start latency by skipping the intermediate queue when concurrency is available, rolled out per-region and enabled automatically for development environments.
- Environment variable page search now matches on environment type (production, staging, development, preview) and branch name, not just variable name and value.
- Set
application_nameon Prisma connections fromSERVICE_NAMEfor DB load attribution by service. - Add p-retry (3 attempts, 500ms–2s exponential backoff) around object store uploads in
BatchPayloadProcessor. - Concurrency-keyed queues now use a single master queue entry per base queue instead of one per key, preventing high-CK-count tenants from starving others on the same shard.
- Reduce lock contention when processing large
batchTriggerAndWaitbatches by removing the per-item Redis lock acquisition. - Strip
securequery parameter fromQUERY_CLICKHOUSE_URLbefore passing to the ClickHouse client, fixing a startup crash withError: Unknown URL parameters: secure. - Fix dev environment selection for teams with multiple members: now filters DEVELOPMENT environments by
orgMember.userIdto ensure the logged-in user's dev environment is returned.
How to upgrade
Update the trigger.dev/* packages to v4.4.4 using your package manager:
npx trigger.dev@latest update # npm
pnpm dlx trigger.dev@latest update # pnpm
yarn dlx trigger.dev@latest update # yarn
bunx trigger.dev@latest update # bun
Self-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.4.
Connect your Vercel project to Trigger.dev and never run a manual deploy command again. Automatic deploys, env var sync, and atomic deployments.
What it does
Three things, all automatic:
- Automatic deployments: Push code, Vercel deploys your app, Trigger.dev deploys your tasks. No
trigger.dev deploycommand, no CI/CD config to maintain. - Environment variable sync: Variables flow both ways. Your Vercel env vars get pulled into Trigger.dev before each build. Trigger.dev syncs API keys (like
TRIGGER_SECRET_KEY) back to Vercel. - Atomic deployments: Your Vercel app and Trigger.dev tasks deploy in lockstep. Your app never goes live with a mismatched task version.
Atomic deployments
When atomic deployments are enabled, Trigger.dev gates your Vercel deployment until the task build completes, sets the correct TRIGGER_VERSION, then triggers a Vercel redeployment.
Environment mapping
| Vercel environment | Trigger.dev environment |
|---|---|
| Production | Production |
| Custom environment | Staging |
| Preview | Preview |
| Development | Development |
Environment variable sync
Sync happens in both directions between Vercel and Trigger.dev per-environment.
Build options
- Atomic deployments: Sync Vercel and Trigger.dev deployments
- Pull env vars before build: Retrieve latest Vercel env vars before each build
- Discover new env vars: Auto-create new Trigger.dev vars when they appear in Vercel
Getting started
Connect from Trigger.dev Settings or the Vercel Marketplace. Deploy the Next.js starter app with one click.
Error tracking dashboard, Supabase environment variable sync, and dev run auto-cancel on CLI exit.
Improvements
syncSupabaseEnvVarsautomates Supabase connection string integration into environment variables. The feature retrieves database credentials and eliminates manual configuration steps for Supabase-connected tasks. (docs, #3152)
// trigger.config.ts
import { defineConfig } from "@trigger.dev/sdk";
import { syncSupabaseEnvVars } from "@trigger.dev/build/extensions/core";
export default defineConfig({
build: {
extensions: [syncSupabaseEnvVars()],
},
});
- Auto-cancel in-flight dev runs when CLI terminates, using a detached watchdog process that survives pnpm SIGKILL. (#3191)
Server Changes
These changes are included in the v4.4.3 Docker image and are already live on Trigger.dev Cloud:
-
New Errors page for viewing and tracking run failures. Errors are grouped by fingerprint — view top errors for a time period, filter by task, search by text, and see occurrences over time. Users can list affected runs and bulk replay them from the error detail view. (#3172)
Private alpha on Trigger.dev Cloud — The Errors page is available now for self-hosted users. On Trigger.dev Cloud it's currently in private alpha, with a full public release coming soon.
-
Test page AI payload generation automatically creates example payloads using AI. For
schemaTasktasks, the AI uses your task's JSON schema to generate valid payloads. New sidebar tabs provide visibility into Options, AI, and Schema. (#3188)
How to Upgrade
Update the trigger.dev/* packages to v4.4.3 using your package manager:
npx trigger.dev@latest update # npm
pnpm dlx trigger.dev@latest update # pnpm
yarn dlx trigger.dev@latest update # yarn
bunx trigger.dev@latest update # bun
Self-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.3.
Trigger.dev has launched Query & Dashboards, enabling users to analyze task data using SQL-style queries or custom dashboards with visualizations.
TRQL Query Language
- SQL-style language compiling to ClickHouse for analytical queries
- Two queryable tables:
runs(status, timing, costs, machine type, tags, metadata) andmetrics(CPU, memory, custom OpenTelemetry metrics) - Built-in functions:
timeBucket()for time-series aggregation,quantile()for percentiles
AI-Powered Query Assistant
- Natural language query generation — describe desired data in plain English
- Automatic error detection with "Try fix error" suggestions
- Schema-aware responses handling cost analysis, error breakdowns, and duration percentiles
Pre-Built Dashboard
Automatic project dashboard covering: run volume, success rates, failure analysis, costs (by task/machine), and deployment version metrics.
Custom Dashboard Widgets
- Big Numbers: Single-value KPIs with customizable formatting (abbreviations, prefixes/suffixes)
- Charts: Bar, stacked bar, line, and area charts with automatic zero-filling and intelligent time bucketing
- Tables: Sortable, detailed breakdowns with column reordering and filtering
- Layout: Drag-and-drop arrangement on 12-column grid, auto-saving
Real-Time Filtering
- Time (presets + custom ranges), task selection, queue filtering, scope (environment/project/organization)
- Applied simultaneously across all dashboard widgets
- Auto-refresh every 60 seconds
SDK & API Integration
query.execute()function for type-safe queries withQueryTableautocomplete- REST API endpoint for custom views, monitoring tool integration, and AI agent debugging
Input streams for bidirectional task communication, batch queue performance improvements, and security hardening.
1 new feature, 2 improvements, 2 bug fixes, and 7 server changes.
Input Streams for Bidirectional Communication with Running Tasks
Tasks now support typed input streams for receiving data during execution, including the ability to suspend tasks while awaiting responses.
// streams.ts — define once, share everywhere
import { streams } from "@trigger.dev/sdk";
export const approval = streams.input<{ approved: boolean; reviewer: string }>({
id: "approval",
});
// task — suspend until a reviewer responds (frees compute while waiting)
const result = await approval.wait({ timeout: "7d" });
if (result.ok && result.output.approved) {
await publish(draft);
}
// backend — send data to the running task
await approval.send(runId, { approved: true, reviewer: "alice@example.com" });
Additional capabilities include .once() for non-suspending waits, .on() for persistent listeners (useful for cancel signals on AI tasks), and a useInputStreamSend React hook for frontend integration. (#3146)
Improvements
- Increased Batch trigger processing concurrency limits: Free plan 1 → 5, Hobby plan stays at 10, Pro plan 10 → 50. (#3079)
- Added
PAYLOAD_TOO_LARGEerror code for oversized batch trigger items to fail gracefully with pre-failed runs instead of aborting entire batches. (#3137)
Bug Fixes
- Fixed slow batch queue processing caused by spurious cooloff on concurrency blocks and race condition with non-atomic retry attempt count updates during message re-queue. (#3079)
- Fixed
batchTriggerAndWaitvariants returningunknownforrun.taskIdentifierinstead of correct values. (#3080)
Server Changes
Available in v4.4.2 Docker image and live on Trigger.dev Cloud:
- Two-level tenant dispatch replacing single master queue with two-level index for O(1) tenant selection and fair scheduling. (#3133)
- Server-side input streams support: API routes, SSE reading, waitpoint creation, and Redis caching for
.send()-to-.wait()bridging. Includes dashboard span support and s2-lite support. (#3146) - Batch queue processing concurrency limits increased with disabled cooloff. (#3079)
- Batch queue global rate limiter moved to per-item limiting with worker queue depth cap. (#3166)
- Fixed waitpoint race condition where runs could be blocked indefinitely due to PostgreSQL MVCC issue. (#3075)
- Oversized NDJSON batch items now emit as pre-failed runs with
PAYLOAD_TOO_LARGE. (#3137) - Impersonation sessions now verify real user admin status on every request. (#3078)
How to Upgrade
npx trigger.dev@latest update # npm
pnpm dlx trigger.dev@latest update # pnpm
yarn dlx trigger.dev@latest update # yarn
bunx trigger.dev@latest update # bun
Self-hosted: Update Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.2.
OTEL metrics pipeline for task workers, MFA fix, and server improvements.
1 new feature and 3 server fixes.
Highlights
OTEL metrics pipeline for task workers
Workers now collect process CPU/memory, Node.js runtime metrics (event loop utilization, event loop delay, heap usage), and user-defined custom metrics via otel.metrics.getMeter(). Metrics are exported to ClickHouse with 10-second aggregation buckets and 1m/5m rollups, and are queryable through the dashboard query engine with typed attribute columns, prettyFormat() for human-readable values, and AI query support. (#3061)
Server changes
These changes are included in the v4.4.1 Docker image and are already live on Trigger.dev Cloud:
- Fix broken MFA by only committing one auth session set-cookie call (#3104)
- Fix logs button and table row link (#3107)
- Show v3 deprecation notice in the sidebar (#3090)
How to upgrade
Update the trigger.dev/* packages to v4.4.1 using your package manager.
Self-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.1.
Metrics dashboards and query engine, Vercel integration, debounce maxDelay, and more.
Metrics dashboards and query engine, Vercel integration, debounce maxDelay, and more.
3 new features, 8 improvements, 7 bug fixes, and 16 server changes.
Highlights
Metrics and query dashboards
New metrics dashboards and a query engine for monitoring task worker performance and exploring your Trigger.dev data. Workers collect process CPU/memory and Node.js runtime metrics, which are queryable through the dashboard using TRQL (Trigger Query Language). The SDK also exposes query.execute() for programmatic access to your data with typed results.
Vercel integration
Automatically deploy your Trigger.dev tasks whenever you deploy to Vercel. The integration syncs environment variables bidirectionally, maps Vercel environments to Trigger.dev environments, and supports atomic deployments that gate your Vercel deployment until the task build completes — ensuring your app and tasks always use matching versions.
Debounce maxDelay
New maxDelay option sets a maximum time limit for how long a debounced run can be delayed, ensuring execution happens within a specified window even with continuous triggers.
await myTask.trigger(payload, {
debounce: {
key: "my-key",
delay: "5s",
maxDelay: "30m", // Execute within 30 minutes regardless of continuous triggers
},
});
Improvements
- New
query.execute()SDK method for querying Trigger.dev data using TRQL with typed JSON or CSV results, configurable scope, and time filtering - Export
AnyOnStartAttemptHookFunctiontype for definingonStartAttempthooks on individual tasks - Add optional
timeoutInSecondsparameter to the MCPwait_for_run_to_completetool, defaulting to 60 seconds - Aligned SDK
getRunIdForOptionslogic with core package to handle semantic targets (root,parent) in root tasks
Bug fixes
- Fix
onCompletecallback firing prematurely when the realtime stream disconnects before the run finishes - Vendor superjson to fix
ERR_REQUIRE_ESMerrors on Node.js versions that don't supportrequire(ESM)by default and AWS Lambda - Fix runner getting stuck indefinitely when
execute()is called on a dead child process - Fix deployment command distinguishing between local builds for cloud vs self-hosting setups
Server changes
These changes are included in the v4.4.0 Docker image and are already live on Trigger.dev Cloud:
- Collapsible side menu for more workspace
- Queue Management API endpoints
- Region selector for test and replay
- Link git SHA and ref to GitHub on project settings page
- Priority option in task test and replay
- Show Betterstack incident title in the dashboard
- Project-based scheduling affinity for image cache locality
- Optimized logs search with new database table
- Logs materialized view and UI improvements
- Fix queue cache memory leak, replace MemoryStore with LRU cache
- Avoid NAPI string overflow in getExecutionSnapshotsSince by only fetching waitpoints for latest snapshot
- Recover runs that failed to dequeue
- Fix batch completion to prevent heavy row-level contention under load
- Show error to user when add-on upgrade payment fails
How to upgrade
Update the trigger.dev/* packages to v4.4.0 using your package manager:
npx trigger.dev@latest update # npm
pnpm dlx trigger.dev@latest update # pnpm
yarn dlx trigger.dev@latest update # yarn
bunx trigger.dev@latest update # bun
Self-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.0.
Install our official agent skills to teach any AI coding assistant best practices for writing tasks, agents, and workflows.
Install our official agent skills to teach any AI coding assistant best practices for writing tasks, agents, and workflows.
Skills are built on the open Agent Skills standard. Each skill is a directory containing a SKILL.md file with patterns, examples, and best practices that AI assistants automatically discover and follow.
Installation
Install the full suite of Trigger.dev skills:
npx skills add triggerdotdev/skills
Or install individual skills:
npx skills add triggerdotdev/skills/trigger-setup
npx skills add triggerdotdev/skills/trigger-tasks
npx skills add triggerdotdev/skills/trigger-agents
npx skills add triggerdotdev/skills/trigger-realtime
npx skills add triggerdotdev/skills/trigger-config
Available skills
| Skill | Purpose | Coverage |
|---|---|---|
trigger-setup | Initial configuration | SDK installation, project structure |
trigger-tasks | Async workflows | Triggering, queues, retries, scheduling |
trigger-agents | AI orchestration | Prompt chaining, routing, parallelization |
trigger-realtime | Live updates | React hooks, streaming responses |
trigger-config | Build configuration | Configuration file and extensions |
Supported AI assistants
Skills work with any AI coding assistant that supports the Agent Skills standard, including Claude Code, Cursor, Windsurf, GitHub Copilot, Cline, Codex CLI, Gemini CLI, OpenCode, and more.
Skills replace vendor-specific config files with a single install that works across every major AI coding assistant.
AI SDK 6 support, new limits page, better date and time filtering, improvements, bug fixes and server changes.
AI SDK 6 support, new limits page, better date and time filtering, improvements, bug fixes and server changes.
Highlights
AI SDK v6 support
Updated the AI SDK peer dependency to allow ai@^6.0.0 alongside existing v4 and v5 support. If you're using the Vercel AI SDK, you can now upgrade to v6 without any changes to your Trigger.dev tasks. (#2919)
Expose idempotency key in task context
ctx.run.idempotencyKey now returns the original key you passed instead of the internal hash, and ctx.run.idempotencyKeyScope exposes the scope. This makes it possible to use the idempotency key for downstream deduplication logic inside your tasks. (#2903)
Improvements
- Upgrade Node.js to 20.20.0 for async_hooks security fix, and add
maxDepthoption toflatten/unflattenAttributesas defense-in-depth (#2890) - Upgraded date and time filter UI with calendar navigation and quick presets (#2864)
- Display correct batch rate limit current token value in error messages (#2927)
- Fix cancel button in API key regeneration modal (#2878)
Bug fixes
- Fix batch trigger "ReadableStream is locked" error during network retries (#2917)
- Fix batch queue consumers to run independently from the run engine worker (#2916)
- Properly clean up trace pubsub Redis clients on disconnect (#2901)
- Fix schedule limit counting to exclude inactive schedules and archived preview branch environments (#2899)
- Fix missing table row divider lines in Safari (#2873)
- Fix logs page search, filtering, and performance with
attributes_textmigration and event store error handling (#2889)
Server changes
These changes are included in the v4.3.3 Docker image and are already live on Trigger.dev Cloud:
- Use the replica database for API auth queries to reduce primary load (#2932)
- Redesign batch completion to prevent heavy row-level contention under load (#2930)
- New limits page for managing concurrency limits (#2885)
- Aggregated logs page with improved search and filtering (#2862)
- TRQL query language and the Query page (#2843)
- Impersonation session logging for admin audit trails (#2896)
How to upgrade
Update the trigger.dev/* packages to v4.3.3 using your package manager:
npx trigger.dev@latest update # npm
pnpm dlx trigger.dev@latest update # pnpm
yarn dlx trigger.dev@latest update # yarn
bunx trigger.dev@latest update # bun
Self-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.3.3.



