Repository navigation
Releases: triggerdotdev/trigger.dev
Release list
trigger.dev v4.8.3
trigger.dev v4.8.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.8.3
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-8-3
What's changed
Improvements
- CLI and MCP logins are now bound to the machine that started them. Approving a login in your browser sends you back to the CLI automatically, or, when the browser is on another machine, shows a code to paste into the terminal (or pass with
trigger.dev login --code). Older CLI versions will need to upgrade to log in. (1a36c23fb) - Add
trigger webhooks set-secretandtrigger webhooks generate-secret, which store a webhook endpoint's signing secret without printing it.set-secretreads the secret from a pipe, an environment variable or a.envfile, andgenerate-secretsaves the new secret to an env file. When the endpoint already has a secret, both ask how long the old one keeps working (or take--previous-secret-ttl 24hin scripts). The MCP server'sset_webhook_secretandgenerate_webhook_secretdescriptions now point AI agents at these commands, so the secret stays out of the agent's context. (daaaa41db) - Deprecates the legacy Bun runtime.
runtime: "bun"(and its explicit spelling"bun-legacy"), which deploys Bun 1.3.3 with Node.js 20 alongside it, now prints a deprecation warning, and deploys that use it will be rejected from January 5, 2027. Switch toruntime: "bun-1.4"(Bun 1.4.4 on an image with no Node.js binary) and redeploy. (5f8171cab) - Add
trigger.refresh(ctx, id)to request an earlier status check for a Convex-tracked run, so applications using Trigger Realtime can publish results without waiting for the next scheduled poll. Requests are coalesced and rate-limited, use the existing completion callback, and retain polling as a recovery fallback. (ee5e5da40) - Add private-beta OIDC authentication for deployed Cloud tasks, with an AWS credential provider and environment-specific setup instructions. Install
@aws-sdk/client-ststo use@trigger.dev/sdk/oidc/aws, upgrade your deployment CLI, and redeploy. Contact us to enable access for your organization. (65352bc90)
Bug fixes
- Fix parent and root metadata updates being lost after one update could not be applied. Only that update is now skipped, and the rest are written. Metadata keys that name only the root, such as
$.or$.., are now ignored on a run's own metadata instead of throwing, and rejected for parent and root metadata, which fails the whole request. (53441fd20) - Fix reloading a chat mid-turn after its access token was refreshed. A token refresh during a streaming turn persisted a resume cursor from the middle of the turn, so a reload resumed past chunks the page needed and failed to rebuild the assistant message ("No tool invocation found for tool call ID"). The persisted cursor now stays at the start of the turn until it completes, so a reload replays the whole turn. (
9fd1de656)
Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
- The CLI and MCP login consent page now shows when and from which IP address the login was started, and you get an email whenever a new CLI or MCP login is authorized on your account.
- Searching, filtering to errors, and expanding or collapsing spans in the run trace view are faster on large traces.
- Guide switching from shared root keys to individually managed API keys, while keeping root key regeneration directly available.
- CLI and MCP login codes now work once, and every login mints its own personal access token instead of reusing an existing CLI token.
- Fix run traces occasionally going missing when a span recorded an exception with no message, type or stack trace.
All packages: v4.8.3
@trigger.dev/build, @trigger.dev/convex, @trigger.dev/core, @trigger.dev/linear, @trigger.dev/python, @trigger.dev/react-hooks, @trigger.dev/redis-worker, @trigger.dev/rsc, @trigger.dev/schema-to-json, @trigger.dev/sdk, @trigger.dev/slack, trigger.dev
Contributors
Chris Arderne, Eric Allam, @Mariefay, Saadi Myftija, Oskar Otwinowski, github-actions[bot]
Full changelog: v4.8.2...v4.8.3
Helm Chart 4.8.3
Installation
helm upgrade --install trigger \
oci://ghcr.io/triggerdotdev/charts/trigger \
--version "4.8.3"Changes
See commit history for detailed changes in this release.
trigger.dev v4.8.2
trigger.dev v4.8.2
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.8.2
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-8-2
What's changed
Breaking changes
- Query dashboard APIs reject run tokens and public access tokens without user delegation. Existing API key access, including restricted keys with the required query scopes, is unchanged. MCP dashboard access remains supported through delegated tokens for current organization members.
- The legacy
clickhouseevent store is retired: task events now go toclickhouse_v2. If you self-host withEVENT_REPOSITORY_DEFAULT_STORE=clickhouse, switch it toclickhouse_v2and follow the self-hosting guide to copy older events, which no longer show until you do.
Improvements
-
Deployed tasks now keep a valid short-lived run token for their whole run: the token is refreshed during long runs and before a run resumes from a checkpoint. A warm-started task no longer keeps the previous run's token when the next run has none, and run credentials are left out of runner debug logs. (
aa9de9d94) -
Upgrade
socket.io-clientto 4.8.4 so projects using the SDK and CLI installws8.21 instead of 8.17.1, which has published advisories (GHSA-96hv-2xvq-fx4p, GHSA-58qx-3vcg-4xpx). The old pin blocked upgradingwswithout a package manager override. (2df9860b4) -
Adds the
bun-1.4runtime.runtime: "bun-1.4"deploys on Bun 1.4.4 in a Bun-only image with no Node.js binary, and the run controller itself runs under Bun.runtime: "bun"is unchanged (Bun 1.3 with Node.js alongside it);bun-legacyis accepted as an explicit spelling of the same runtime. On Bun 1.4 the worker no longer crashes at startup on the--no-warnings=ExperimentalWarningflag. (a8a87850b) -
Add an experimental Convex component for triggering tasks transactionally and reading their status and results through reactive queries, without configuring webhooks. (
3c1cf656c) -
Run metadata operations now reject JSON-path keys that use escaped dots to reach
__proto__,constructororprototype. (dce5048a8) -
Use short-lived run tokens for supported SDK operations inside deployed tasks when available, retaining environment-key compatibility for unsupported operations and missing or expired tokens. Explicit credentials still take precedence. Public-token helpers use server-side minting with run tokens rather than signing locally. (
5a1c14239)Project and organization queries, and branch overrides targeting another PREVIEW or DEVELOPMENT environment, keep using compatibility credentials. Branch headers do not change credential selection in STAGING or PRODUCTION. Chat subscriptions reread implicit credentials for each connection.
-
runs.subscribeToRunnow ends after the run completes. Thefor awaitloop exits right after the update with the final status, and the subscription stops its connection, so a script that subscribes to a run exits on its own. PassstopOnCompletion: falseto keep the subscription open after completion. (485ab83aa) -
Add
SupervisorHttpClient.releaseRun, which gives back a dequeued run the worker never started so the platform requeues it at once instead of after the pending execution timeout. (ba51e5573) -
The supervisor keeps its run notification subscriptions across reconnects to the webapp, and reconnects when the webapp turns its handshake away, so cancellations and resolved waits keep reaching running tasks after a webapp restart or deploy. (
a9e69ab7d) -
Asymmetric webhook sources can now verify ECDSA P-384 signatures (
algorithm: "ecdsa-p384", SHA-384) and providers that sign a SHA-256 digest of the signing string (prehash: "sha256"). ECDSA signatures are accepted in DER or rawr||sform. (4ed2e3780) -
The bundled
trigger-cost-savingsskill now notes that a webhook delivery starts no run when no subscriber's filter matches, so it costs no compute. (#5051) -
Stream a sub-agent's reply through a parent tool call with
chat.forwardSubAgent. Each chunk is written to the parent chat once and the tool resolves with the sub-agent's final message, so streaming a sub-agent costs bytes in proportion to its reply. Yieldingstream.messages()snapshots resends the whole message on every chunk, which grows with the square of the reply. (bdc994c4d)execute: async ({ topic }, { toolCallId, abortSignal }) => { const stream = await researcher.sendMessage(topic, { abortSignal }); return await chat.forwardSubAgent(stream, { toolCallId }); },
Render it while it runs with
useSubAgentMessages()from@trigger.dev/sdk/chat/react(orcreateSubAgentMessages()outside React).
Bug fixes
- Fix
chat.injectmessages added from a tool mid-turn being saved before the assistant's response. They now stay after the tool result, where the model saw them, so the next turn keeps the same prompt prefix. If you roll@trigger.dev/sdkback to an earlier version, chats saved by this version lose these mid-turnchat.injectmessages from the model's context, though the chat history shown in the UI keeps them. (fc33769a5) - Fix a
chat.agentturn failing after a head start that ended with two or more parallel tool calls. When those tools finished out of call order, the agent sent their results to the model twice on the next step, and the provider rejected the request (Anthropic: "each tool_use must have a single result"). Each handed-over tool result is now sent once. (d06ee5825)
Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
- Add "Ignored paths" to the Git settings: pushes and pull request updates that only change files matching these patterns no longer create a deployment. Ignored paths don't apply while the Vercel integration is connected.
- The
metricsquery table now includes queue size (queue.size.*) and webhook limit metrics (webhook.waiters.*,webhook.processing.*,webhook.ingress.*), so you can chart and alert on queue capacity and webhook rate limits. - New Limits alerts: watch the limits that can interrupt or degrade runtime flow, one at a time or combined into a single alert with "any" or "all" and the signals you choose (limit reached or approaching), in the dashboard, the API and the agent.
- Expand short-lived run-token support to task APIs, with permission checks for packets, metadata, streams and waits. Run tokens last one hour independently of root-key rotation and cannot be individually revoked. They can mint public access tokens for up to 30 days; those tokens may outlive the run token that minted them.
- Hosted webhook endpoints can verify ECDSA P-384 (SHA-384) signatures, ECDSA signatures in raw
r||sform, and RSA signatures made over a SHA-256 digest of the signing string (prehash: "sha256"). - Older runs now load their trace, span details and run events faster. A span that finishes more than a week after its run shows as still in progress.
- The run page now loads large traces progressively and updates live runs incrementally, so big traces open faster and open run pages no longer reload the whole trace while a run is executing. The run trace API can also page large traces.
- Query alerts now accept queries whose columns are computed from other aggregate columns, such as a percentage of two aggregates. When a query can't be watched, the Watch button stays visible but disabled and explains why.
- Archiving unused queues from the Concurrency page is now available on all instances, including self-hosted.
- Runs whose container or pod could not be created, or whose pod failed before the run started, can now be requeued straight away instead of waiting for the pending execution timeout. Both are off by default: set
RELEASE_UNSTARTED_RUNS_ENABLED=trueon a supervisor for creates that fail, andRELEASE_FAILED_POD_RUNS_ENABLED=truefor pods that fail. - Session external ids can no longer contain a
/channelspath segment (for examplechat-1/channels/support) or end in:channels, since both forms name a session's channels. Creating a session with one now returns a 422 validation error. - Selecting a span that started a session now shows a link to that session in the span panel, so you can jump from an orchestrator's run to its sub-agents.
- Fix the batch results API returning an empty list of items for completed batches. It now re...
Helm Chart 4.8.2
Installation
helm upgrade --install trigger \
oci://ghcr.io/triggerdotdev/charts/trigger \
--version "4.8.2"Changes
See commit history for detailed changes in this release.
trigger.dev v4.8.1
trigger.dev v4.8.1
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.8.1
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-8-1
What's changed
Bug fixes
- Fix
trigger deployfailing on self-hosted instances with custom base images. Stages built on a custom image now keep the trust store that image ships with. (b5ed66b74)
Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
- Alerts can now watch the result of any supported query: raise when a value crosses a threshold, when matching rows stop appearing, or when new matching rows appear. Create them from the Query page, the Dashboard Agent or the API, and see the alert's values charted on its page.
All packages: v4.8.1
@trigger.dev/build, @trigger.dev/core, @trigger.dev/linear, @trigger.dev/python, @trigger.dev/react-hooks, @trigger.dev/redis-worker, @trigger.dev/rsc, @trigger.dev/schema-to-json, @trigger.dev/sdk, @trigger.dev/slack, trigger.dev
Contributors
@Mariefay, Eric Allam, Wes Mason, github-actions[bot], @nicktrn, Katia Bulatova, Paul Cioanca
Full changelog: v4.8.0...v4.8.1
trigger.dev v4.8.0
trigger.dev v4.8.0
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.8.0
Release notes
Read the full release notes: https://trigger.dev/changelog/v4-8-0
What's changed
Improvements
-
Route verified webhooks into agent sessions with
chat.event({ endpoint, key }), and connect external chat surfaces withchat.channels.custom({ endpoint }). Both subscribe to a shared webhook endpoint, so an agent and your other webhook tasks can use the same provider URL. Channels support reply delivery, session binding, conversation seeding, and lifecycle reactions, and a failed turn posts a short line instead of the error (errorMessagesets it, as a string or a function of the failure). Usechat.createWatchToken()to watch a session from another surface. (d6955ee9f)A connector can also stream replies natively (
stream()), mirror the session's state into the surface (lifecycle()), show tool calls as they run (progress()), stop a running turn from the surface (onControl()), post approvals and tool controls and resume the run from a verified click, download files only the surface can read (download()), and acknowledge or fold in messages that arrive mid-turn (received(),pendingMessages). -
Add hosted webhooks: declare an endpoint once with
webhooks.endpoint.define({ id, source })and Trigger.dev hosts its URL, verifies every request, and routes each event to the endpoint's subscribers. Subscribe tasks withwebhook({ endpoint, filter, onEvent }), each with its own type-safe filter, and pause a run until a matching webhook arrives withwebhooks.waiter.create()andwebhooks.waiter.wait(). (d6955ee9f)export const stripe = webhooks.endpoint.define({ id: "stripe", source: webhooks.stripe(), }); export const fulfill = webhook({ id: "fulfill", endpoint: stripe, filter: "event.type == 'checkout.session.completed'", onEvent: async ({ event }) => {}, }); const waiter = await webhooks.waiter.create(stripe, { match: { "event.data.object.metadata.orderId": order.id }, }); const { event } = await webhooks.waiter.wait(waiter).unwrap();
Sources cover presets (
webhooks.stripe(),webhooks.github(),webhooks.svix(),webhooks.discord(), and others), named providers (webhooks.clerk(),webhooks.shopify(), and more) andwebhooks.custom<T>(config), and most carry a setup prompt an AI coding agent can follow to register the endpoint. Retries are deduplicated on the provider's own event or delivery id where it sends one. Filters, keys and waitermatchpaths share theevent.,header.andwebhook.namespaces, and filters accept== null/!= nullpresence checks andevent any (...)over a payload that is an array of events.webhook()takestask()options such asqueue,machineandretry. The HTTP API lists endpoints and deliveries, replays deliveries, and creates and cancels waiters, and both it and the MCP server can read an endpoint's setup prompt and generate or store its signing secret. -
The
generate_webhook_secretandset_webhook_secretMCP tools take an optionalpreviousSecretTtlSecondsto keep accepting a webhook endpoint's old signing secret while the provider switches to the new one (up to 7 days), and report when the old secret stops working. (98adb6662) -
Realtime streams now reconnect and resume when the stream backend reports a failed read mid-stream, instead of ending early as if the stream had finished. This affects
runs.subscribeToRunwith streams,useRealtimeRunWithStreams, and chat streams. (23730b034) -
HMAC webhook verifier configs accept
additionalSignatureHeaders: more headers that can carry a signature, matched as alternatives tosignatureHeader. Providers that send a second signature during a secret rotation (Hookdeck'sx-hookdeck-signature-2) keep verifying through the rotation. (08d1ddbd3) -
Add
webhooks.hookdeck(), a source for deliveries relayed through a Hookdeck connection. It verifies thex-hookdeck-signatureheader with the project's signing secret, keeps verifying while the secret is being rolled (Hookdeck sends the previous secret's signature inx-hookdeck-signature-2), and deduplicates retries onx-hookdeck-eventid. The event is the original provider's payload, so pass its type:webhooks.hookdeck<Stripe.Event>(). If the Hookdeck project's header prefix was changed, pass it aswebhooks.hookdeck({ headerPrefix })so retries keep deduplicating. (51b39fbc6) -
Add
@trigger.dev/linear: turn achat.agentinto a Linear agent. Assign it an issue or @mention it, and Linear's agent session becomes a durable Trigger.dev session: the reply posts back to Linear, tool calls show as activities,linearPlanTool()keeps the plan Linear shows as a checklist, and approvals are Approve and Deny options that resume the run. (1586c4a3f)import { linear, webhookSource } from "@trigger.dev/linear"; const linearEvents = webhooks.endpoint.define({ id: "linear", source: webhookSource(), }); export const triage = chat.agent({ id: "triage", channels: [ linear({ id: "linear", endpoint: linearEvents, token: process.env.LINEAR_ACCESS_TOKEN!, }), ], run: async ({ messages, signal, streamText }) => streamText({ model, messages, abortSignal: signal }), });
The first turn gets the issue's context and earlier comments, images and PDFs in the issue reach the model, a Stop in Linear winds the turn down, and
errorMessagesets the text a failed turn shows. -
Add
@trigger.dev/slack: turn achat.agentinto a native Slack agent. Each DM or channel thread is a durable session, the reply streams into the thread with the turn's tool calls shown as a plan, approvals are Approve and Deny buttons, and Slack's stop button stops the turn. (6e715da77)import { appMentions, slack, webhookSource } from "@trigger.dev/slack"; const slackEvents = webhooks.endpoint.define({ id: "slack", source: webhookSource(), }); export const support = chat.agent({ id: "support", channels: [ slack({ id: "slack", endpoint: slackEvents, token: process.env.SLACK_BOT_TOKEN!, startOn: appMentions(), }), ], run: async ({ messages, signal, streamText }) => streamText({ model, messages, abortSignal: signal }), });
startOndecides which channel messages start a session (appMentions()answers when the agent is @mentioned). Images and PDFs people share reach the model, messages sent while the agent is answering can be folded into the reply, tools can post their own buttons, andownWorkspaceOnlyignores Slack Connect guests. -
The
streamTextpassed to achat.agent'srun()now turns AI SDK telemetry on by default, so each model step and tool call shows up as a span in the run trace even when the agent doesn't store a prompt withchat.prompt.set(). An agent withtelemetry: { recordUserMessage: false }gets these spans without prompt and response content, including when it stores a prompt (whose variables are left out of the span metadata). Passexperimental_telemetry: { isEnabled: false }at the call site to turn them off, orrecordInputs: false/recordOutputs: falseto keep them without content. (bd7cc3525)
Server changes
These changes affect the self-hosted Docker image and Trigger.dev Cloud:
- When regenerating an environment's API key you can now revoke the previous key immediately instead of keeping it working for 24 hours. Use this when a key may have leaked.
- Set
KUBERNETES_POD_RESERVED_SOURCE_PORTSon the supervisor (for example50080,50081) to stop runs using those ports for outbound connections, which is useful to avoid port clashes. - Rotating a webhook endpoint's signing secret can keep the old one valid for a while, so you can rotate without failing deliveries that are still signed with it. The rotate and regenerate dialogs let you choose how long the old secret stays valid (up to 7 days, 24 hours by default). The
rotate-secretandsecretendpoints accept an optionalpreviousSecretTtlSecondsand returnpreviousSecretExpiresAt. With no value, the old secret stops working immediately, as before. - Alerts are now checked every minute instead of every 5–10 minutes, so they raise and recover sooner.
- Run traces and trace APIs load faster for older runs.
- The API keys page now always lists your root API key, masked to its last 4 characters when it's hidden, so you can regenerate it and revoke the previous key. When the root key is hidden, the page points you to creating an API key for your backend.
- Runs whose deployment has no compute template now go to containers when they are triggered, instead of first passing through the compute worker queue.
- Runs now...
Helm Chart 4.8.1
Installation
helm upgrade --install trigger \
oci://ghcr.io/triggerdotdev/charts/trigger \
--version "4.8.1"Changes
See commit history for detailed changes in this release.
Helm Chart 4.8.0
Installation
helm upgrade --install trigger \
oci://ghcr.io/triggerdotdev/charts/trigger \
--version "4.8.0"Changes
See commit history for detailed changes in this release.
trigger.dev v4.7.7
This is a security release. Update the CLI and redeploy to pick up the fixes.
Security fixes
- Deployed tasks on the
node,node-22,node-24andnode-26runtimes now run on Node.js 22.23.4, 24.22.1 and 26.12.1, the October 2026 security releases. They fix CVE-2026-111497 (an out-of-bounds write in the Brotli decoder) and several TLS hostname verification bypasses. Existing deployments keep the old runtime until you redeploy with this version. - Self-hosted: the webapp and supervisor images now run on Node.js 24.22.1. The supervisor no longer trusts certificates issued under the compromised emSign (eMudhra) certificate authorities, and the webapp image builds its database migration tool with Go 1.26.10, which rejects the compromised eMudhra intermediates.
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 # bunThen redeploy your tasks with npx trigger.dev@latest deploy.
Self-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.7.7
All packages are at v4.7.7: @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.7.6...v4.7.7
Helm Chart 4.7.7
Installation
helm upgrade --install trigger \
oci://ghcr.io/triggerdotdev/charts/trigger \
--version "4.7.7"Changes
See commit history for detailed changes in this release.