Releases: triggerdotdev/trigger.dev
trigger.dev v4.5.0-rc.1
Upgrade
npx trigger.dev@4.5.0-rc.1 update
pnpm dlx trigger.dev@4.5.0-rc.1 update
yarn dlx trigger.dev@4.5.0-rc.1 update
bunx trigger.dev@4.5.0-rc.1 updateSelf-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.5.0-rc.1
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-5-0-rc-1
What's changed
Bug fixes
- Fix
chat.agentskills silently missing intrigger devfor projects whose task files readprocess.envat module top level (e.g. a third-party SDK client initialized at import). Skill folders now bundle into.trigger/skills/reliably regardless of which env vars are set when the CLI launches. (#3690) - Fix
COULD_NOT_FIND_EXECUTORwhen a task's definition is loaded viaawait import(...)from inside another task'srun(). The runtime workers now register such tasks with a sentinel file context, and the catalog logs a one-time warning per task id. (#3688)
All packages: v4.5.0-rc.1
@trigger.dev/build, @trigger.dev/core, @trigger.dev/plugins, @trigger.dev/python, @trigger.dev/react-hooks, @trigger.dev/redis-worker, @trigger.dev/rsc, @trigger.dev/schema-to-json, @trigger.dev/sdk, trigger.dev
Full changelog: v4.4.0.1...v4.5.0-rc.1
trigger.dev v4.5.0-rc.0
Upgrade
npx trigger.dev@4.5.0-rc.0 update
pnpm dlx trigger.dev@4.5.0-rc.0 update
yarn dlx trigger.dev@4.5.0-rc.0 update
bunx trigger.dev@4.5.0-rc.0 updateSelf-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.5.0-rc.0
What's changed
Improvements
- AI Prompts — define prompt templates as code alongside your tasks, version them on deploy, and override the text or model from the dashboard without redeploying. Prompts integrate with the Vercel AI SDK via
toAISDKTelemetry()(links every generation span back to the prompt) and withchat.agentviachat.prompt.set()+chat.toStreamTextOptions(). (#3629) - Code-defined, deploy-versioned templates — define with
prompts.define({ id, model, config, variables, content }). Every deploy creates a new version visible in the dashboard. Mustache-style placeholders ({{var}},{{#cond}}...{{/cond}}) with Zod / ArkType / Valibot-typed variables. - Dashboard overrides — change a prompt's text or model from the dashboard without redeploying. Overrides take priority over the deployed "current" version and are environment-scoped (dev / staging / production independent).
- Resolve API —
prompt.resolve(vars, { version?, label? })returns the compiledtext, resolvedmodel,version, and labels. Standaloneprompts.resolve<typeof handle>(slug, vars)for cross-file resolution with full type inference on slug and variable shape. - AI SDK integration — spread
resolved.toAISDKTelemetry({ ...extra })into anygenerateText/streamTextcall and every generation span links to the prompt in the dashboard alongside its input variables, model, tokens, and cost. chat.agentintegration —chat.prompt.set(resolved)stores the resolved prompt run-scoped;chat.toStreamTextOptions({ registry })pullssystem,model(resolved via the AI SDK provider registry),temperature/maxTokens/ etc., and telemetry into a single spread forstreamText.- Management SDK —
prompts.list(),prompts.versions(slug),prompts.promote(slug, version),prompts.createOverride(slug, body),prompts.updateOverride(slug, body),prompts.removeOverride(slug),prompts.reactivateOverride(slug, version). - Dashboard — prompts list with per-prompt usage sparklines; per-prompt detail with Template / Details / Versions / Generations / Metrics tabs. AI generation spans get a custom inspector showing the linked prompt's metadata, input variables, and template content alongside model, tokens, cost, and the message thread.
- Adds
onBoottochat.agent— a lifecycle hook that fires once per worker process picking up the chat. Runs for the initial run, preloaded runs, AND reactive continuation runs (post-cancel, crash,endRun,requestUpgrade, OOM retry), before any other hook. Use it to initializechat.local, open per-process resources, or re-hydrate state from your DB on continuation — anywhere the SAME run picking up after suspend/resume isn't enough. (#3543) - AI SDK
useChatintegration — a customChatTransport(useTriggerChatTransport) plugs straight into Vercel AI SDK'suseChathook. Text streaming, tool calls, reasoning, anddata-*parts all work natively over Trigger.dev's realtime streams. No custom API routes needed. - First-turn fast path (
chat.headStart) — opt-in handler that runs the first turn'sstreamTextstep in your warm server process while the agent run boots in parallel, cutting cold-start TTFC by roughly half (measured 2801ms → 1218ms onclaude-sonnet-4-6). The agent owns step 2+ (tool execution, persistence, hooks) so heavy deps stay where they belong. Web Fetch handler works natively in Next.js, Hono, SvelteKit, Remix, Workers, etc.; bridge to Express/Fastify/Koa viachat.toNodeListener. New@trigger.dev/sdk/chat-serversubpath. - Multi-turn durability via Sessions — every chat is backed by a durable Session that outlives any individual run. Conversations resume across page refreshes, idle timeout, crashes, and deploys;
resume: truereconnects vialastEventIdso clients only see new chunks.sessions.listenumerates chats for inbox-style UIs. - Auto-accumulated history, delta-only wire — the backend accumulates the full conversation across turns; clients only ship the new message each turn. Long chats never hit the 512 KiB body cap. Register
hydrateMessagesto be the source of truth yourself. - Lifecycle hooks —
onPreload,onChatStart,onValidateMessages,hydrateMessages,onTurnStart,onBeforeTurnComplete,onTurnComplete,onChatSuspend,onChatResume— for persistence, validation, and post-turn work. - Stop generation — client-driven
transport.stopGeneration(chatId)aborts mid-stream; the run stays alive for the next message, partial response is captured, and aborted parts (stuckpartial-calltools, in-progress reasoning) are auto-cleaned. - Tool approvals (HITL) — tools with
needsApproval: truepause until the user approves or denies viaaddToolApprovalResponse. The runtime reconciles the updated assistant message by ID and continuesstreamText. - Steering and background injection —
pendingMessagesinjects user messages between tool-call steps so users can steer the agent mid-execution;chat.inject()+chat.defer()adds context from background work (self-review, RAG, safety checks) between turns. - Actions — non-turn frontend commands (undo, rollback, regenerate, edit) sent via
transport.sendAction. FirehydrateMessages+onActiononly — no turn hooks, norun().onActioncan return aStreamTextResultfor a model response, orvoidfor side-effect-only. - Typed state primitives —
chat.local<T>for per-run state accessible from hooks,run(), tools, and subtasks (auto-serialized throughai.toolExecute);chat.storefor typed shared data between agent and client;chat.historyfor reading and mutating the message chain;clientDataSchemafor typedclientDatain every hook. chat.toStreamTextOptions()— one spread intostreamTextwires up versioned system Prompts, model resolution, telemetry metadata, compaction, steering, and background injection.- Multi-tab coordination —
multiTab: true+useMultiTabChatprevents duplicate sends and syncs state across browser tabs viaBroadcastChannel. Non-active tabs go read-only with live updates. - Network resilience — built-in indefinite retry with bounded backoff, reconnect on
online/ tab refocus / bfcache restore,Last-Event-IDmid-stream resume. No app code needed. - Sessions — a durable, run-aware stream channel keyed on a stable
externalId. A Session is the unit of state that owns a multi-run conversation: messages flow through.in, responses through.out, both survive run boundaries. Sessions back the newchat.agentruntime, and you can build on them directly for any pattern that needs durable bi-directional streaming across runs. (#3542) - Add
ai.toolExecute(task)so you can wire a Trigger subtask in as theexecutehandler of an AI SDKtool()while definingdescriptionandinputSchemayourself — useful when you want full control over the tool surface and just need Trigger's subtask machinery for the body. (#3546) - Type
chat.createStartSessionActionagainst your chat agent soclientDatais typed end-to-end on the first turn: (#3684) - Add
regionto the runs list / retrieve API: filter runs by region (runs.list({ region: "..." })/filter[region]=<masterQueue>) and read each run's executing region from the newregionfield on the response. (#3612) - Add
TRIGGER_BUILD_SKIP_REWRITE_TIMESTAMP=1escape hatch for local self-hosted builds whose buildx driver doesn't supportrewrite-timestampalongside push (e.g. orbstack's defaultdockerdriver). (#3618) - Reject overlong
idempotencyKeyvalues at the API boundary so they no longer trip an internal size limit on the underlying unique index and surface as a generic 500. Inputs are capped at 2048 characters — well above whatidempotencyKeys.create()produces (a 64-character hash) and above any realistic raw key. Applies totasks.trigger,tasks.batchTrigger,batch.create(Phase 1 streaming batches),wait.createToken,wait.forDuration, and the input/session stream waitpoint endpoints. Over-limit requests now return a structured 400 instead. (#3560) - AI SDK
useChatintegration — a customChatTransport(useTriggerChatTransport) plugs straight into Vercel AI SDK'suseChathook. Text streaming, tool calls, reasoning, anddata-*parts all work natively over Trigger.dev's realtime streams. No custom API routes needed. - First-turn fast path (
chat.headStart) — opt-in handler that runs the first turn'sstreamTextstep in your warm server process while the agent run boots in parallel, cutting cold-start TTFC by roughly half (measured 2801ms → 1218ms onclaude-sonnet-4-6). The agent owns step 2+ (tool execution, persistence, hooks) so heavy deps stay where they belong. Web Fetch handler works natively in Next.js, Hono, SvelteKit, Remix, Workers, etc.; bridge to Express/Fastify/Koa viachat.toNodeListener. New@trigger.dev/sdk/chat-serversubpath. - **Mul...
trigger.dev v4.4.6
trigger.dev v4.4.6
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 # bunSelf-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.4.6
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-4-6
What's changed
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 that itself calledprocess.send, scheduled viasetImmediateand amplified by source-map-support'sprepareStackTrace. Fixed by (1) silently dropping packets inZodIpcConnectionwhen the channel is disconnected, (2) adding aprocess.on("disconnect", ...)handler in dev workers so they exit cleanly when the CLI closes the IPC channel, and (3) wrapping alluncaughtException-pathprocess.sendcalls in asafeSendguard that checksprocess.connectedand swallows synchronous throws. (#3491)
All packages: v4.4.6
@trigger.dev/build, @trigger.dev/core, @trigger.dev/python, @trigger.dev/react-hooks, @trigger.dev/redis-worker, @trigger.dev/rsc, @trigger.dev/schema-to-json, @trigger.dev/sdk, trigger.dev
Contributors
Eric Allam, @nicktrn, James Ritchie, @isshaddad, @d-cs, github-actions[bot], Matt Aitken, Saadi Myftija, Oskar Otwinowski
Full changelog: v4.4.5...v4.4.6
trigger.dev v4.4.5
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 # bunSelf-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.4.5
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-4-5
What's changed
Breaking changes
- Add server-side deprecation gate for deploys from v3 CLI versions (gated by
DEPRECATE_V3_CLI_DEPLOYS_ENABLED). v4 CLI deploys are unaffected. (#3415)
Improvements
- Add
--no-browserflag toinitandloginto skip auto-opening the browser during authentication. Also error loudly wheninitis run without--yesunder non-TTY stdin (previously default-and-exited silently, leaving the project half-initialized). Both commands now show anExamplessection in--help. (#3483) - Add
isReplayboolean to the run context (ctx.run.isReplay), derived from the existingreplayedFromTaskRunFriendlyIddatabase field. Defaults tofalsefor backwards compatibility. (#3454) - Redact the
resolveWaitpointruntime log so it only emitsidandtypeinstead of the full completed waitpoint. Previously the log printed the entire waitpoint (includingoutput) to stdout in production runs, which could leak sensitive payloads. The value returned bywait.forToken()is unchanged. (#3490) - Add
SessionIdfriendly ID generator and schemas for the new durable Session primitive. Exported from@trigger.dev/core/v3/isomorphicalongsideRunId,BatchId, etc. Ships theCreateSessionStreamWaitpointrequest/response schemas alongside the main Session CRUD. (#3417) - Truncate large error stacks and messages to prevent OOM crashes. Stack traces are capped at 50 frames (keeping top 5 + bottom 45 with an omission notice), individual stack lines at 1024 chars, and error messages at 1000 chars. Applied in parseError, sanitizeError, and OTel span recording. (#3405)
Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
-
Add a "Back office" tab to
/adminand a per-organization detail page at/admin/back-office/orgs/:orgId. The first action available on that page is editing the org's API rate limit: admins can save atokenBucketoverride (refill rate, interval, max tokens) and see a plain-English preview of the resulting sustained rate and burst allowance. Writes are audit-logged via the server logger. (#3434) -
Optional
DEPLOY_REGISTRY_ECR_DEFAULT_REPOSITORY_POLICYenv var to apply a default repository policy when the webapp creates new ECR repos (#3467) -
Ship the Errors page to all users, with a polish + bug-fix pass: pinned "No channel" item in the Slack alert channel picker, viewer-timezone alert timestamps via Slack's
<!date^>token, Activity sparkline peak tooltip, centered loading spinner and bug-icon empty state on the error detail page, ellipsis on the Configure alerts trigger. (#3477) -
Configure the set of machine presets to build boot snapshots for at deploy time via
COMPUTE_TEMPLATE_MACHINE_PRESETS(CSV of preset names, defaultsmall-1x). UseCOMPUTE_TEMPLATE_MACHINE_PRESETS_REQUIRED(CSV, default = full PRESETS list) to scope which preset failures fail a required-mode deploy. Optional preset failures are logged and don't block the deploy. (#3492) -
Regenerating a RuntimeEnvironment API key no longer invalidates the previous key immediately. The old key is recorded in a new
RevokedApiKeytable with a 24 hour grace window, andfindEnvironmentByApiKeyfalls back to it when the submitted key doesn't match any live environment. The grace window can be ended early (or extended) by updatingexpiresAton the row. (#3420) -
Add the
Sessionprimitive — a durable, task-bound, bidirectional I/O channel that outlives a single run and acts as the run manager forchat.agent. Ships the PostgresSession+SessionRuntables, ClickHousesessions_v1+ replication service, thesessionsJWT scope, and the public CRUD + realtime routes (/api/v1/sessions,/realtime/v1/sessions/:session/:io) includingend-and-continuefor server-orchestrated run handoffs and session-stream waitpoints. (#3417) -
Add
KUBERNETES_POD_DNS_NDOTS_OVERRIDE_ENABLEDflag (off by default) that overrides the cluster default and setsdnsConfig.options.ndotson runner pods (defaulting to 2, configurable viaKUBERNETES_POD_DNS_NDOTS). Kubernetes defaults pods tondots: 5, so any name with fewer than 5 dots — including typical external domains likeapi.example.com— is first walked through every entry in the cluster search list (<ns>.svc.cluster.local,svc.cluster.local,cluster.local) before being tried as-is, turning one resolution into 4+ CoreDNS queries (×2 with A+AAAA). Using a lowerndotsvalue reduces DNS query amplification in thecluster.localzone.Note: before enabling, make sure no code path relies on search-list expansion for names with dots ≥ the configured value — those names will hit their as-is form first and could resolve externally before falling back to the cluster search path. (#3441)
-
Vercel integration option to disable auto promotions (#3376)
-
Make it clear in the admin that feature flags are global and should rarely be changed. (#3408)
-
Admin worker groups API: add GET loader and expose more fields on POST. (#3390)
-
Add 60s fresh / 60s stale SWR cache to
getEntitlementinplatform.v3.server.ts. Eliminates a synchronous billing-service HTTP round trip on every trigger. Reuses the existingplatformCache(LRU memory + Redis) pattern already used forlimitsandusage. Cache key is${orgId}. Errors return a permissive{ hasAccess: true }fallback (existing behavior) and are also cached to prevent thundering-herd on billing outages. (#3388) -
Show a
MicroVMbadge next to the region name on the regions page. (#3407) -
Increase default maximum project count per organization from 10 to 25 (#3409)
-
Merge execution snapshot creation into the dequeue taskRun.update transaction, reducing 2 DB commits to 1 per dequeue operation (#3395)
-
Add per-worker Node.js heap metrics to the OTel meter —
nodejs.memory.heap.used,nodejs.memory.heap.total,nodejs.memory.heap.limit,nodejs.memory.external,nodejs.memory.array_buffers,nodejs.memory.rss. Host-metrics only publishes RSS, which overstates V8 heap by the external + native footprint; these give direct heap visibility per cluster worker soNODE_MAX_OLD_SPACE_SIZEcan be sized against observed heap peaks rather than RSS. (#3437) -
Tag Prisma spans with
db.datasource: "writer" | "replica"so monitors and trace queries can distinguish the writer pool from the replica pool. Applies to allprisma:engine:*spans (includingprisma:engine:connectionused by the connection-pool monitors) and the outerprisma:client:operationspan. (#3422) -
Clarify the cross-region intent in the Terraform and AI-prompt helpers on the Add Private Connection page. Both already default
supported_regionsto["us-east-1", "eu-central-1"]; added an inline comment / parenthetical so the user understands why both regions are listed (Trigger.dev runs in both, so the service must be consumable from either). (#3465) -
Add
RUN_ENGINE_READ_REPLICA_SNAPSHOTS_SINCE_ENABLEDflag (default off) to route the Prisma reads insideRunEngine.getSnapshotsSincethrough the read-only replica client. Offloads the snapshot polling queries (fired by every running task runner) from the primary. When disabled, behavior is unchanged. (#3423) -
Stop creating TaskRunTag records and _TaskRunToTaskRunTag join table entries during task triggering. The denormalized runTags string array on TaskRun already stores tag names, making the M2M relation redundant write overhead. (#3369)
-
Stop writing per-tick state (
lastScheduledTimestamp,nextScheduledTimestamp,lastRunTriggeredAt) onTaskScheduleandTaskScheduleInstance. The schedule engine now carries the previous fire time forward via the worker queue payload, eliminating ~270K dead-tuple-driven autovacuums per year on these hot tables and the associatedIO:XactSyncmini-spikes on the writer. Customer-facingpayload.lastTimestampsemantics are unchanged. (#3476) -
Replace the expensive DISTINCT query for task filter dropdowns with a dedicated TaskIde...
trigger.dev v4.4.4
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 # bunSelf-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.4.4
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-4-4
What's changed
Highlights
- Add support for setting TTL (time-to-live) defaults at the task level and globally in trigger.config.ts, with per-trigger overrides still taking precedence (#3196)
- Large run outputs can use the new API which allows switching object storage providers. (#3275)
CLI Improvements
- Add platform notifications support to the CLI. The
trigger devandtrigger logincommands now fetch and display platform notifications (info, warn, error, success) from the server. Includes discovery-based filtering to conditionally show notifications based on project file patterns, color markup rendering for styled terminal output, and a non-blocking display flow with a spinner fallback for slow fetches. Use--skip-platform-notificationsflag withtrigger devto disable the notification check. (#3254)
MCP Server improvements
- Add
get_span_detailsMCP tool for inspecting individual spans within a run trace. (#3255) - Span IDs now shown in
get_run_detailstrace output for easy discovery - New API endpoint
GET /api/v1/runs/:runId/spans/:spanId 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 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 logsGET /api/v1/query/schema— query table schema discoveryGET /api/v1/query/dashboards— list built-in dashboards--readonlyflag hides write tools (deploy,trigger_task,cancel_run) so the AI cannot make changesread:queryJWT scope for query endpoint authorizationget_run_detailstrace output is now paginated with cursor support- MCP tool annotations (
readOnlyHint,destructiveHint) for all tools get_query_schemanow requires a table name and returns only one table's schema (was returning all tables)get_current_workerno longer inlines payload schemas; use 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
- Adapted the CLI API client to propagate the trigger source via http headers. (#3241)
--readonlyflag hides write tools (deploy,trigger_task,cancel_run) so the AI cannot make changesget_run_detailstrace output is now paginated with cursor support- MCP tool annotations (
readOnlyHint,destructiveHint) for all tools get_query_schemanow requires a table name and returns only one table's schema (was returning all tables)get_current_workerno longer inlines payload schemas; use 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
Bug fixes
- Fix dev CLI leaking build directories on rebuild, causing disk space accumulation. Deprecated workers are now pruned (capped at 2 retained) when no active runs reference them. The watchdog process also cleans up
.trigger/tmp/when the dev CLI is killed ungracefully (e.g. SIGKILL from pnpm). (#3224) - Fix
--loadflag being silently ignored on local/self-hosted builds. (#3114) - Fixed
search_docstool failing due to renamed upstream Mintlify tool (SearchTriggerDev→search_trigger_dev) - Fixed
list_deploysfailing when deployments have nullruntime/runtimeVersionfields (#3139) - Fixed
list_preview_branchescrashing due to incorrect response shape access - Fixed
metricstable column documented asvalueinstead ofmetric_valuein query docs - Fixed dev CLI leaking build directories on rebuild — deprecated workers now clean up their build dirs when their last run completes
- Fixed
search_docstool failing due to renamed upstream Mintlify tool (SearchTriggerDev→search_trigger_dev) - Fixed
list_deploysfailing when deployments have nullruntime/runtimeVersionfields (#3139) - Fixed
list_preview_branchescrashing due to incorrect response shape access - Fixed
metricstable column documented asvalueinstead ofmetric_valuein query docs - Fixed dev CLI leaking build directories on rebuild — deprecated workers now clean up their build dirs when their last run completes
Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
- Add admin UI for viewing and editing feature flags (org-level overrides and global defaults). (#3291)
Other improvements:
-
Add allowRollbacks query param to the promote deployment API to enable version downgrades (#3214)
-
Add automatic LLM cost calculation for spans with GenAI semantic conventions. When a span arrives with
gen_ai.response.modeland token usage data, costs are calculated from an in-memory pricing registry backed by Postgres and dual-written to both span attributes (trigger.llm.*) and a newllm_metrics_v1ClickHouse table that captures usage, cost, performance (TTFC, tokens/sec), and behavioral (finish reason, operation type) metrics. (#3213) -
Add API endpoint
GET /api/v1/runs/:runId/spans/:spanIdthat returns detailed span information including properties, events, AI enrichment (model, tokens, cost), and triggered child runs. (#3255) -
Multi-provider object storage with protocol-based routing for zero-downtime migration (#3275)
-
Add IAM role-based auth support for object stores (no access keys required). (#3275)
-
Add platform notifications to inform users about new features, changelogs, and platform events directly in the dashboard. (#3254)
-
Add private networking support via AWS PrivateLink. Includes BillingClient methods for managing private connections, org settings UI pages for connection management, and supervisor changes to apply
privatelinkpod labels for CiliumNetworkPolicy matching. (#3264) -
Reduce run start latency by skipping the intermediate queue when concurrency is available. This optimization is rolled out per-region and enabled automatically for development environments. (#3299)
-
Extended the search filter on the environment variables page to match on environment type (production, staging, development, preview) and branch name, not just variable name and value. (#3302)
-
Set
application_nameon Prisma connections from SERVICE_NAME so DB load can be attributed by service (#3348) -
Fix transient R2/object store upload failures during batchTrigger() item streaming.
- Added p-retry (3 attempts, 500ms–2s exponential backoff) around
uploadPacketToObjectStoreinBatchPayloadProcessor.process()so transient network errors self-heal server-side rather than aborting the entire batch stream. - Removed
x-should-retry: falsefrom the 500 response on the batch items route so the SDK's existing 5xx retry path can recover if server-side retries are exhausted. Item deduplication by index makes full-stream retries safe. (#3331)
- Added p-retry (3 attempts, 500ms–2s exponential backoff) around
-
Concurrency-keyed queues now use a single master queue entry per base queue instead of one entry per key. Prevents high-CK-count tenants from consuming the entire parentQueueLimit window and starving other tenants on the same shard. (#3219)
-
Reduce lock contention when processing large
batchTriggerAndWaitbatches. Previously, each batch item acquired a Redis lock on the parent run to insert aTaskRunWaitpointrow, causingLockAcquisitionTimeoutErrorwith high concurrency (880 errors/24h in prod). SinceblockRunWithCreatedBatchalready transitions the parent toEXECUTING_WITH_WAITPOINTSbefore items are processed, the per-item lock is unnecessary. The newblockRunWithWaitpointLocklessmethod performs only the idempotent CTE insert without acquiring the lock. (#3232) -
Strip...
trigger.dev v4.4.3
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 # bunSelf-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.4.3
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-4-3
What's changed
Improvements
- Add syncSupabaseEnvVars to pull database connection strings and save them as trigger.dev environment variables (#3152)
- Auto-cancel in-flight dev runs when the CLI exits, using a detached watchdog process that survives pnpm SIGKILL (#3191)
Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
-
A new Errors page for viewing and tracking errors that cause runs to fail
- Errors are grouped using error fingerprinting
- View top errors for a time period, filter by task, or search the text
- View occurrences over time
- View all the runs for an error and bulk replay them (#3172)
-
Add sidebar tabs (Options, AI, Schema) to the Test page for schemaTask payload generation and schema viewing. (#3188)
All packages: v4.4.3
@trigger.dev/build, @trigger.dev/core, @trigger.dev/python, @trigger.dev/react-hooks, @trigger.dev/redis-worker, @trigger.dev/rsc, @trigger.dev/schema-to-json, @trigger.dev/sdk, trigger.dev
Contributors
Eric Allam, Matt Aitken, James Ritchie, Oskar Otwinowski
Full changelog: v4.4.2...v4.4.3
trigger.dev v4.4.2
Upgrade
npx trigger.dev@latest update
pnpm dlx trigger.dev@latest update
yarn dlx trigger.dev@latest update
bunx trigger.dev@latest update Self-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.4.2
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-4-2
What's changed
Improvements
- Add input streams for bidirectional communication with running tasks. Define typed input streams with
streams.input<T>({ id }), then consume inside tasks via.wait()(suspends the process),.once()(waits for next message), or.on()(subscribes to a continuous stream). Send data from backends with.send(runId, data)or from frontends with the newuseInputStreamSendReact hook. (#3146) - Add PAYLOAD_TOO_LARGE error to handle graceful recovery of sending batch trigger items with payloads that exceed the maximum payload size (#3137)
Bug fixes
- Fix slow batch queue processing by removing spurious cooloff on concurrency blocks and fixing a race condition where retry attempt counts were not atomically updated during message re-queue. (#3079)
- fix(sdk): batch triggerAndWait variants now return correct run.taskIdentifier instead of unknown (#3080)
Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
-
Two-level tenant dispatch architecture for batch queue processing. Replaces the
single master queue with a two-level index: a dispatch index (tenant → shard)
and per-tenant queue indexes (tenant → queues). This enables O(1) tenant
selection and fair scheduling across tenants regardless of queue count. Improves batch queue processing performance. (#3133) -
Add input streams with API routes for sending data to running tasks, SSE reading, and waitpoint creation. Includes Redis cache for fast
.send()to.wait()bridging, dashboard span support for input stream operations, and s2-lite support with configurable S2 endpoint, access token skipping, and S2-Basin headers for self-hosted deployments. Adds s2-lite to Docker Compose for local development. (#3146) -
Speed up batch queue processing by disabling cooloff and increasing the batch queue processing concurrency limits on the cloud:
- Pro plan: increase to 50 from 10.
- Hobby plan: increase to 10 from 5.
- Free plan: increase to 5 from 1. (#3079)
-
Move batch queue global rate limiter from FairQueue claim phase to BatchQueue worker queue consumer for accurate per-item rate limiting. Add worker queue depth cap to prevent unbounded growth that could cause visibility timeouts. (#3166)
-
Fix a race condition in the waitpoint system where a run could be blocked by a completed waitpoint but never be resumed because of a PostgreSQL MVCC issue. This was most likely to occur when creating a waitpoint via
wait.forToken()at the same moment as completing the token withwait.completeToken(). Other types of waitpoints (timed, child runs) were not affected. (#3075) -
Fix metrics dashboard chart series colors going out of sync and widgets not reloading stale data when scrolled back into view (#3126)
-
Gracefully handle oversized batch items instead of aborting the stream.
When an NDJSON batch item exceeds the maximum size, the parser now emits an error marker instead of throwing, allowing the batch to seal normally. The oversized item becomes a pre-failed run with
PAYLOAD_TOO_LARGEerror code, while other items in the batch process successfully. This preventsbatchTriggerAndWaitfrom seeing connection errors and retrying with exponential backoff.Also fixes the NDJSON parser not consuming the remainder of an oversized line split across multiple chunks, which caused "Invalid JSON" errors on subsequent lines. (#3137)
-
Require the user is an admin during an impersonation session. Previously only the impersonation cookie was checked; now the real user's admin flag is verified on every request. If admin has been revoked, the session falls back to the real user's ID. (#3078)
All packages: v4.4.2
@trigger.dev/build, @trigger.dev/core, @trigger.dev/python, @trigger.dev/react-hooks, @trigger.dev/redis-worker, @trigger.dev/rsc, @trigger.dev/schema-to-json, @trigger.dev/sdk, trigger.dev
Full changelog: v4.4.1...v4.4.2
trigger.dev@4.4.1
Patch Changes
- Add OTEL metrics pipeline for task workers. Workers 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) - Updated dependencies:
@trigger.dev/build@4.4.1@trigger.dev/core@4.4.1@trigger.dev/schema-to-json@4.4.1
@trigger.dev/sdk@4.4.1
Patch Changes
- Add OTEL metrics pipeline for task workers. Workers 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) - Updated dependencies:
@trigger.dev/core@4.4.1
@trigger.dev/schema-to-json@4.4.1
Patch Changes
- Updated dependencies:
@trigger.dev/core@4.4.1