Trigger.dev Release Notes
43 release notes curated from 26 sources by the Releasebot Team. Last updated: May 12, 2026
- May 12, 2026
- Date parsed from source:May 12, 2026
- First seen by Releasebot:May 12, 2026
trigger.dev v4.4.6
Trigger.dev ships v4.4.6 with faster failure handling for uncaught exceptions and fixes a dev worker CPU spin issue after CLI disconnects, improving reliability for self-hosted and local development workflows.
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 # bun Self-hosted Docker image: ghcr.io/triggerdotdev/trigger.dev:v4.4.6Release notes
Read the full release notes: https://trigger.dev/changelog/v4-4-6
What's changed
ImprovementsFail attempts on uncaught exceptions instead of hanging to MAX_DURATION_EXCEEDED. A Node EventEmitter (e.g. node-redis) emitting "error" with no .on("error", ...) listener escalates to uncaughtException, 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 status FAILED, 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 fixesFix dev workers spinning at 100% CPU after the parent CLI disconnects. Orphaned trigger-dev-run-worker (and indexer) processes were caught in an uncaughtException feedback loop: a periodic IPC send via process.send would throw ERR_IPC_CHANNEL_CLOSED once the parent closed the channel, which re-entered the same handler that itself called process.send, scheduled via setImmediate and amplified by source-map-support's prepareStackTrace. Fixed by (1) silently dropping packets in ZodIpcConnection when the channel is disconnected, (2) adding a process.on("disconnect", ...) handler in dev workers so they exit cleanly when the CLI closes the IPC channel, and (3) wrapping all uncaughtException-path process.send calls in a safeSend guard that checks process.connected and 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
Original source - May 12, 2026
- Date parsed from source:May 12, 2026
- First seen by Releasebot:May 12, 2026
v.docker.4.4.6: chore: release v4.4.6 (#3501)
Trigger.dev improves worker reliability with faster failure handling for uncaught exceptions and a fix for dev workers that could spin at 100% CPU after the CLI disconnects. The release helps tasks fail with the original error instead of hanging and exits orphaned processes cleanly.
Summary
1 improvement, 1 bug fix.
Improvements
Fail attempts on uncaught exceptions instead of hanging to MAX_DURATION_EXCEEDED. A Node EventEmitter (e.g. node-redis) emitting "error" with no .on("error", ...) listener escalates to uncaughtException, 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 status FAILED, 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 an uncaughtException feedback loop: a periodic IPC send via process.send would throw ERR_IPC_CHANNEL_CLOSED once the parent closed the channel, which re-entered the same handler that itself called process.send, scheduled via setImmediate and amplified by source-map-support's prepareStackTrace. Fixed by (1) silently dropping packets in ZodIpcConnection when the channel is disconnected, (2) adding a process.on("disconnect", ...) handler in dev workers so they exit cleanly when the CLI closes the IPC channel, and (3) wrapping all uncaughtException-path process.send calls in a safeSend guard that checks process.connected and swallows synchronous throws.
(#3491)Releases
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
- @trigger.dev/[email protected]
Patch Changes
- Fix dev workers spinning at 100% CPU after the parent CLI disconnects. Orphaned trigger-dev-run-worker (and indexer) processes were caught in an uncaughtException feedback loop: a periodic IPC send via process.send would throw ERR_IPC_CHANNEL_CLOSED once the parent closed the channel, which re-entered the same handler that itself called process.send, scheduled via setImmediate and amplified by source-map-support's prepareStackTrace. Fixed by (1) silently dropping packets in ZodIpcConnection when the channel is disconnected, (2) adding a process.on("disconnect", ...) handler in dev workers so they exit cleanly when the CLI closes the IPC channel, and (3) wrapping all uncaughtException-path process.send calls in a safeSend guard that checks process.connected and swallows synchronous throws.
(#3491) - Fail attempts on uncaught exceptions instead of hanging to MAX_DURATION_EXCEEDED. A Node EventEmitter (e.g. node-redis) emitting "error" with no .on("error", ...) listener escalates to uncaughtException, 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 status FAILED, and respect the task's normal retry policy. You should still attach .on("error", ...) listeners to long-lived clients to handle errors gracefully.
(#3529)
Updated dependencies:
- @trigger.dev/[email protected]
- @trigger.dev/[email protected]
- @trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
- Fix dev workers spinning at 100% CPU after the parent CLI disconnects. Orphaned trigger-dev-run-worker (and indexer) processes were caught in an uncaughtException feedback loop: a periodic IPC send via process.send would throw ERR_IPC_CHANNEL_CLOSED once the parent closed the channel, which re-entered the same handler that itself called process.send, scheduled via setImmediate and amplified by source-map-support's prepareStackTrace. Fixed by (1) silently dropping packets in ZodIpcConnection when the channel is disconnected, (2) adding a process.on("disconnect", ...) handler in dev workers so they exit cleanly when the CLI closes the IPC channel, and (3) wrapping all uncaughtException-path process.send calls in a safeSend guard that checks process.connected and swallows synchronous throws.
(#3491) - Fail attempts on uncaught exceptions instead of hanging to MAX_DURATION_EXCEEDED. A Node EventEmitter (e.g. node-redis) emitting "error" with no .on("error", ...) listener escalates to uncaughtException, 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 status FAILED, and respect the task's normal retry policy. You should still attach .on("error", ...) listeners to long-lived clients to handle errors gracefully.
(#3529)
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
- @trigger.dev/[email protected]
- @trigger.dev/[email protected]
- @trigger.dev/[email protected]
- @trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
- @trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
- @trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
- @trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
- @trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
- @trigger.dev/[email protected]
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Original source All of your release notes in one feed
Join Releasebot and get updates from Trigger.dev and hundreds of other software products.
- May 12, 2026
- Date parsed from source:May 12, 2026
- First seen by Releasebot:May 12, 2026
helm-v4.4.6: chore: release v4.4.6 (#3501)
Trigger.dev fixes dev workers stuck at 100% CPU after CLI disconnects and improves task handling so uncaught exceptions fail fast with the original error instead of hanging until max duration.
Summary
1 improvement, 1 bug fix.
Improvements
Fail attempts on uncaught exceptions instead of hanging to
MAX_DURATION_EXCEEDED. A Node EventEmitter (e.g. node-redis)
emitting "error" with no .on("error", ...) listener escalates to
uncaughtException, 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 status FAILED, 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
an uncaughtException feedback loop: a periodic IPC send via
process.send would throw ERR_IPC_CHANNEL_CLOSED once the parent
closed the channel, which re-entered the same handler that itself called
process.send, scheduled via setImmediate and amplified by
source-map-support's prepareStackTrace. Fixed by (1) silently dropping
packets in ZodIpcConnection when the channel is disconnected, (2)
adding a process.on("disconnect", ...) handler in dev workers so they
exit cleanly when the CLI closes the IPC channel, and (3) wrapping all
uncaughtException-path process.send calls in a safeSend guard that
checks process.connected and swallows synchronous throws.
(#3491)Raw changeset output
Releases
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
@trigger.dev/[email protected]
Patch Changes
Fix dev workers spinning at 100% CPU after the parent CLI disconnects.
Orphaned trigger-dev-run-worker (and indexer) processes were caught in
an uncaughtException feedback loop: a periodic IPC send via
process.send would throw ERR_IPC_CHANNEL_CLOSED once the parent
closed the channel, which re-entered the same handler that itself called
process.send, scheduled via setImmediate and amplified by
source-map-support's prepareStackTrace. Fixed by (1) silently dropping
packets in ZodIpcConnection when the channel is disconnected, (2)
adding a process.on("disconnect", ...) handler in dev workers so they
exit cleanly when the CLI closes the IPC channel, and (3) wrapping all
uncaughtException-path process.send calls in a safeSend guard that
checks process.connected and swallows synchronous throws.
(#3491)Fail attempts on uncaught exceptions instead of hanging to
MAX_DURATION_EXCEEDED. A Node EventEmitter (e.g. node-redis)
emitting "error" with no .on("error", ...) listener escalates to
uncaughtException, 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 status FAILED, and respect the task's
normal retry policy. You should still attach .on("error", ...)
listeners to long-lived clients to handle errors gracefully.
(#3529)Updated dependencies:
@trigger.dev/[email protected]
@trigger.dev/[email protected]
@trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Fix dev workers spinning at 100% CPU after the parent CLI disconnects.
Orphaned trigger-dev-run-worker (and indexer) processes were caught in
an uncaughtException feedback loop: a periodic IPC send via
process.send would throw ERR_IPC_CHANNEL_CLOSED once the parent
closed the channel, which re-entered the same handler that itself called
process.send, scheduled via setImmediate and amplified by
source-map-support's prepareStackTrace. Fixed by (1) silently dropping
packets in ZodIpcConnection when the channel is disconnected, (2)
adding a process.on("disconnect", ...) handler in dev workers so they
exit cleanly when the CLI closes the IPC channel, and (3) wrapping all
uncaughtException-path process.send calls in a safeSend guard that
checks process.connected and swallows synchronous throws.
(#3491)Fail attempts on uncaught exceptions instead of hanging to
MAX_DURATION_EXCEEDED. A Node EventEmitter (e.g. node-redis)
emitting "error" with no .on("error", ...) listener escalates to
uncaughtException, 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 status FAILED, and respect the task's
normal retry policy. You should still attach .on("error", ...)
listeners to long-lived clients to handle errors gracefully.
(#3529)@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
@trigger.dev/[email protected]
@trigger.dev/[email protected]
@trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
@trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
@trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
@trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
@trigger.dev/[email protected]
@trigger.dev/[email protected]
Patch Changes
Updated dependencies:
@trigger.dev/[email protected]
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Original source - May 12, 2026
- Date parsed from source:May 12, 2026
- First seen by Releasebot:May 12, 2026
Trigger.dev v4.4.6
Trigger.dev improves task failure handling and fixes a dev worker CPU spin issue. It now fails fast on uncaught exceptions instead of hanging until max duration, and dev workers exit cleanly after CLI disconnects with safer IPC handling.
1 improvement and 1 bug fix.
Improvements
- Fail attempts on uncaught exceptions instead of hanging to MAX_DURATION_EXCEEDED. A Node EventEmitter (e.g. node-redis) emitting "error" with no .on("error", ...) listener escalates to uncaughtException, 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 status FAILED, 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 an uncaughtException feedback loop: a periodic IPC send via process.send would throw ERR_IPC_CHANNEL_CLOSED once the parent closed the channel, which re-entered the same handler via setImmediate, amplified by source-map-support's prepareStackTrace. Fixed by silently dropping packets in ZodIpcConnection when the channel is disconnected, adding a process.on("disconnect", ...) handler in dev workers so they exit cleanly, and wrapping all uncaughtException-path process.send calls in a safeSend guard. (#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 # bunSelf-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.6.
Original source - May 6, 2026
- Date parsed from source:May 6, 2026
- First seen by Releasebot:May 8, 2026
re2-test-uncaught-exception
Trigger.dev fixes the CLI to fail attempts on uncaught exceptions instead of hanging.
fix(cli): fail attempt on uncaught exception instead of hanging to ma…
Original source - May 1, 2026
- Date parsed from source:May 1, 2026
- First seen by Releasebot:May 2, 2026
trigger.dev v4.4.5
Trigger.dev releases v4.4.5 with the new durable Session primitive, a Back office admin area, broader Errors page rollout, and safer CLI auth flows. It also adds memory, runtime, and deploy stability fixes across the platform.
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-browser flag to init and login to skip auto-opening the browser during authentication. Also error loudly when init is run without --yes under non-TTY stdin (previously default-and-exited silently, leaving the project half-initialized). Both commands now show an Examples section in --help. (#3483)
Add isReplay boolean to the run context (ctx.run.isReplay), derived from the existing replayedFromTaskRunFriendlyId database field. Defaults to false for backwards compatibility. (#3454)
Redact the resolveWaitpoint runtime log so it only emits id and type instead of the full completed waitpoint. Previously the log printed the entire waitpoint (including output) to stdout in production runs, which could leak sensitive payloads. The value returned by wait.forToken() is unchanged. (#3490)
Add SessionId friendly ID generator and schemas for the new durable Session primitive. Exported from @trigger.dev/core/v3/isomorphic alongside RunId, BatchId, etc. Ships the CreateSessionStreamWaitpoint request/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 /admin and 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 a tokenBucket override (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_POLICY env 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, default small-1x). Use COMPUTE_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 RevokedApiKey table with a 24 hour grace window, and findEnvironmentByApiKey falls back to it when the submitted key doesn't match any live environment. The grace window can be ended early (or extended) by updating expiresAt on the row. (#3420)
Add the Session primitive — a durable, task-bound, bidirectional I/O channel that outlives a single run and acts as the run manager for chat.agent. Ships the Postgres Session + SessionRun tables, ClickHouse sessions_v1 + replication service, the sessions JWT scope, and the public CRUD + realtime routes (/api/v1/sessions, /realtime/v1/sessions/:session/:io) including end-and-continue for server-orchestrated run handoffs and session-stream waitpoints. (#3417)
Add KUBERNETES_POD_DNS_NDOTS_OVERRIDE_ENABLED flag (off by default) that overrides the cluster default and sets dnsConfig.options.ndots on runner pods (defaulting to 2, configurable via KUBERNETES_POD_DNS_NDOTS). Kubernetes defaults pods to ndots: 5, so any name with fewer than 5 dots — including typical external domains like api.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 lower ndots value reduces DNS query amplification in the cluster.local zone.
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 getEntitlement in platform.v3.server.ts. Eliminates a synchronous billing-service HTTP round trip on every trigger. Reuses the existing platformCache (LRU memory + Redis) pattern already used for limits and usage. 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 MicroVM badge 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 so NODE_MAX_OLD_SPACE_SIZE can 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 all prisma:engine:* spans (including prisma:engine:connection used by the connection-pool monitors) and the outer prisma:client:operation span. (#3422)
Clarify the cross-region intent in the Terraform and AI-prompt helpers on the Add Private Connection page. Both already default supported_regions to ["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_ENABLED flag (default off) to route the Prisma reads inside RunEngine.getSnapshotsSince through 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) on TaskSchedule and TaskScheduleInstance. 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 associated IO:XactSync mini-spikes on the writer. Customer-facing payload.lastTimestamp semantics are unchanged. (#3476)
Replace the expensive DISTINCT query for task filter dropdowns with a dedicated TaskIdentifier registry table backed by Redis. Environments migrate automatically on their next deploy, with a transparent fallback to the legacy query for unmigrated environments. Also fixes duplicate dropdown entries when a task changes trigger source, and adds active/archived grouping for removed tasks. Moves BackgroundWorkerTask reads in the trigger hot path to the read replica. (#3368)
Public Access Tokens (PATs) minted before an API key rotation now keep working during the 24h grace window. validatePublicJwtKey falls back to any non-expired RevokedApiKey rows for the signing environment when the primary signature check against the env's current apiKey fails. The fallback query only runs on the failure path, so the hot success path is unchanged. (#3464)
Batch items that hit the environment queue size limit now fast-fail without retries and without creating pre-failed TaskRuns. (#3352)
Show the cancel button in the runs list for runs in DEQUEUED status. DEQUEUED was missing from NON_FINAL_RUN_STATUSES so the list hid the button even though the single run page allowed it. (#3421)
Reduce 5xx feedback loops on hot debounce keys by quantizing delayUntil, adding an unlocked fast-path skip, and gracefully handling redlock contention in handleDebounce so the SDK no longer retries into a herd. (#3453)
Fix RSS memory leak in the realtime proxy routes. /realtime/v1/runs, /realtime/v1/runs/:id, and /realtime/v1/batches/:id called fetch() into Electric with no abort signal, so when a client disconnected mid long-poll, undici kept the upstream socket open and buffered response chunks that would never be consumed — retained only in RSS, invisible to V8 heap tooling. Thread getRequestAbortSignal() through RealtimeClient.streamRun/streamRuns/streamBatch to longPollingFetch and cancel the upstream body in the error path. Isolated reproducer showed ~44 KB retained per leaked request; signal propagation releases it cleanly. (#3442)
Fix memory leak where every aborted SSE connection pinned the full request/response graph on Node 20, caused by AbortSignal.any() in sse.ts retaining its source signals indefinitely (see nodejs/node#54614, nodejs/node#55351). Also clear the setTimeout(abort) timer in entry.server.tsx so successful HTML renders don't pin the React tree for 30s per request. (#3430)
Preserve filters on the queues page when submitting modal actions. (#3471)
Fix Redis connection leak in realtime streams and broken abort signal propagation.
Redis connections: Non-blocking methods (ingestData, appendPart, getLastChunkIndex) now share a single Redis connection instead of creating one per request. streamResponse still uses dedicated connections (required for XREAD BLOCK) but now tears them down immediately via disconnect() instead of graceful quit(), with a 15s inactivity fallback.
Abort signal: request.signal is broken in Remix/Express due to a Node.js undici GC bug (nodejs/node#55428) that severs the signal chain when Remix clones the Request internally. Added getRequestAbortSignal() wired to Express res.on("close") via httpAsyncStorage, which fires reliably on client disconnect. All SSE/streaming routes updated to use it. (#3399)
Prevent dashboard crash (React error #31) when span accessory item text is not a string. Filters out malformed accessory items in SpanCodePathAccessory instead of passing objects to React as children. (#3400)
Upgrade Remix packages from 2.1.0 to 2.17.4 to address security vulnerabilities in React Router (#3372)
Fix Vercel integration settings page (remove redundant section toggles) and improve the Vercel onboarding flow so the modal closes after connecting a GitHub repo and the marketplace next URL is preserved across the GitHub app install redirect. (#3424)
All packages: v4.4.5
@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, @isshaddad, devin-ai-integration[bot], Matt Aitken, Oskar Otwinowski, @D-K-P, @ThullyoCunha, github-actions[bot], Saadi Myftija
Full changelog: v4.4.4...v4.4.5
Original source - May 1, 2026
- Date parsed from source:May 1, 2026
- First seen by Releasebot:May 2, 2026
Trigger.dev v4.4.5
Trigger.dev adds replay-aware tasks, better CLI auth for CI, and safer error handling, while expanding cloud and server capabilities with stronger deploy controls, improved keys, the Errors page for all users, session infrastructure, and multiple memory and reliability fixes.
Highlights
ctx.run.isReplay
ctx.run.isReplay
Tasks can now check whether the current run is a replay via ctx.run.isReplay. (#3454)
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
- Add --no-browser flag to init and login to skip auto-opening the browser during authentication. Useful for CI and headless environments. Also errors loudly when init is run without --yes under non-TTY stdin, instead of silently half-initializing the project. Both commands now include an Examples section in --help. (#3483)
- 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. (#3405)
Server changes
These changes are included in the v4.4.5 Docker image and are already live on Trigger.dev Cloud:
- Add a server-side deprecation gate for deploys from v3 CLI versions, controlled by the DEPRECATE_V3_CLI_DEPLOYS_ENABLED env var. v4 CLI deploys are unaffected. (#3415)
- Regenerating an environment API key no longer invalidates the previous key immediately. The old key gets a 24-hour grace window via a new RevokedApiKey table, and PATs signed with the rotated key also remain valid during that window. (#3420, #3464)
- 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. (#3477)
- Session primitive server infrastructure: Postgres Session + SessionRun tables, ClickHouse sessions_v1 + replication, the sessions JWT scope, and CRUD + realtime routes including end-and-continue for server-orchestrated run handoffs. (#3417)
- Increase the default maximum project count per organization from 10 to 25. (#3409)
- Replace the DISTINCT query for task filter dropdowns with a dedicated TaskIdentifier registry 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. (#3368)
- Stop writing per-tick state (lastScheduledTimestamp, nextScheduledTimestamp, lastRunTriggeredAt) on TaskSchedule. Customer-facing payload.lastTimestamp semantics are unchanged. (#3476)
- Batch items that hit the environment queue size limit now fast-fail without retries and without creating pre-failed TaskRuns. (#3352)
- Fix RSS memory leak in realtime proxy routes: thread getRequestAbortSignal() through RealtimeClient to cancel upstream Electric requests on client disconnect. Isolated reproducer showed ~44 KB retained per leaked request. (#3442)
- 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 the setTimeout(abort) timer in entry.server.tsx so successful HTML renders don't retain the React tree for 30 seconds. (#3430)
- 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. (#3399)
- Upgrade Remix from 2.1.0 to 2.17.4 to address React Router security vulnerabilities. (#3372)
How to upgrade
Update the trigger.dev/* packages to v4.4.5 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 # bunSelf-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.5.
Original source - Apr 30, 2026
- Date parsed from source:Apr 30, 2026
- First seen by Releasebot:May 12, 2026
AWS PrivateLink: connect your AWS resources without exposing them
Trigger.dev adds AWS PrivateLink support for private task connections to databases, caches, and internal APIs inside a VPC. Users can set it up manually, with AI, or via Terraform, keeping resources off the public internet and using private IPs for task pods.
How it works
Reach private databases, caches, and APIs from your tasks over AWS PrivateLink. No public endpoints, no IP allowlists, no VPN. Set it up manually, with AI, or with a generated Terraform script.
Connect your tasks directly to private AWS resources. RDS, ElastiCache, internal APIs, anything reachable inside your VPC: your tasks can talk to it without exposing the resource to the public internet.
Create a VPC Endpoint Service in your AWS account, paste the service name into the Trigger.dev dashboard, and your task pods connect over AWS PrivateLink. The resource stays inside your VPC. No public endpoint, no IP allowlist, no VPN.
Three things happen to wire it up:
- You create a Network Load Balancer + VPC Endpoint Service in your AWS account, pointing at the resource you want to expose (RDS, ElastiCache, an internal API, anything reachable inside your VPC).
- You add Trigger.dev's AWS account as an allowed principal on the Endpoint Service.
- We provision a VPC Endpoint on our side. Your tasks get a private IP they can use as the hostname in their connection string.
The assigned IP lives in our VPC, but it's only reachable from your organization's task pods. Every connection gets a dedicated CiliumNetworkPolicy that targets pods labeled with your org ID and allows egress only to your endpoint's IPs. Cilium compiles those rules into eBPF programs in the kernel, so traffic from any other organization is dropped at the network layer before it touches the endpoint.
Connections are organization-wide and work across all your projects and environments.
Adding a connection
Open Settings → Private Connections → New in the dashboard. Pick a region, enter your hostname and ports, then choose how you want to set up the AWS side. You can paste an existing VPC Endpoint Service name, copy a prefilled Terraform script, generate a prompt to paste into an AI agent of your choice to create the AWS resources for you, or follow a step-by-step Console walkthrough. Submit the service name, wait a minute or two for provisioning, and copy the assigned IP once the connection flips to ACTIVE.
What you can connect
Any TCP service reachable inside your VPC:
- RDS (Postgres, MySQL, Aurora)
- ElastiCache (Redis, Memcached)
- Internal microservices and APIs
- Self-hosted databases on EC2
PrivateLink supports 28 AWS regions on your side. Trigger.dev consumes them in us-east-1 and eu-central-1, where your tasks run.
Get started
AWS PrivateLink is on Pro and Enterprise plans. Default limit is 2 connections per organization (we'll raise it if you need more).
Open Settings → Private Connections in your org to create your first one.
Original source - Apr 29, 2026
- Date parsed from source:Apr 29, 2026
- First seen by Releasebot:Apr 29, 2026
build-ecr-default-policy.rc0
Trigger.dev adds default repository policy for ECR repo creation in the web app.
feat(webapp): apply default repository policy on ECR repo creation (#…
Original source - Apr 27, 2026
- Date parsed from source:Apr 27, 2026
- First seen by Releasebot:Apr 27, 2026
build-dependabot-q2.rc0
Trigger.dev tightens its lodash override lower bound to 4.17 for improved security.
chore(security): tighten lodash override lower bound to 4.17
Original source - Apr 24, 2026
- Date parsed from source:Apr 24, 2026
- First seen by Releasebot:Apr 24, 2026
re2-test-supervisor-ndots-override: feat(supervisor): optional ndots override for runner pods (#3441)
Trigger.dev adds a Kubernetes DNS override flag for runner pods, letting teams lower ndots from the cluster default to reduce DNS query amplification and speed up name resolution.
Adds KUBERNETES_POD_DNS_NDOTS_OVERRIDE_ENABLED flag (off by default)
that overrides the cluster default and sets dnsConfig.options.ndots on
runner pods (defaulting to 2, configurable via
KUBERNETES_POD_DNS_NDOTS).Kubernetes defaults pods to ndots: 5, so any name with fewer than 5
dots, including typical external domains like api.example.com, is
first walked through every entry in the cluster search list
(.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 lower ndots value reduces DNS query amplification in the
Original source
cluster.local zone. - Apr 24, 2026
- Date parsed from source:Apr 24, 2026
- First seen by Releasebot:Apr 24, 2026
re2-prod-supervisor-ndots-override: feat(supervisor): optional ndots override for runner pods (#3441)
Trigger.dev adds a Kubernetes DNS override flag for runner pods, letting teams lower ndots from the cluster default to reduce DNS query amplification and speed up name resolution for common external domains.
Adds KUBERNETES_POD_DNS_NDOTS_OVERRIDE_ENABLED flag (off by default)
that overrides the cluster default and sets dnsConfig.options.ndots on
runner pods (defaulting to 2, configurable via
KUBERNETES_POD_DNS_NDOTS).Kubernetes defaults pods to ndots: 5, so any name with fewer than 5
dots, including typical external domains like api.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 lower ndots value reduces DNS query amplification in the
Original source
cluster.local zone. - Apr 23, 2026
- Date parsed from source:Apr 23, 2026
- First seen by Releasebot:Apr 27, 2026
helm-v4.4.4
Trigger.dev bumps appVersion to v4.4.4.
chore(helm): bump appVersion to v4.4.4 (#3432)
Original source - Apr 16, 2026
- Date parsed from source:Apr 16, 2026
- First seen by Releasebot:Apr 22, 2026
Input streams: send data into running tasks
Trigger.dev adds input streams for sending typed data into running tasks, letting AI agents and other workflows react in real time. It supports background listening, suspending for free compute, frontend and backend sends, and four receive modes.
See it work
Here's a research agent that takes instructions from the user while it's running. The user can steer the research, ask for more detail, or tell it to wrap up:
// trigger/streams.ts — define the stream once import { streams } from "@trigger.dev/sdk"; export const userMessage = streams.input<{ type: "instruction" | "follow-up" | "wrap-up"; text: string; }>({ id: "user-message" });// trigger/research.ts — the task listens while it works 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; // Listen for user messages in the background userMessage.on((data) => { if (data.type === "wrap-up") { shouldWrapUp = true; } messages.push(data.text); }); // Agent loop — keeps running while user sends messages let context = payload.topic; while (!shouldWrapUp) { const result = await generateResearch(context); await saveFindings(result); // Incorporate any new instructions from the user if (messages.length > 0) { context = `${context} User feedback: ${messages.splice(0).join("\n")}`; } } return await compileFinalReport(context); }, });// components/ResearchChat.tsx — the user talks to the running task "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> ); }Three files. The stream definition is shared across all of them, so TypeScript enforces the message shape from the React button all the way into the running task.
Four receiving patterns
The example above uses
.on(), but there are four ways to receive data inside a task depending on what you need..on(): listen in the backgroundFires your handler every time data arrives. The task keeps running. Handlers clean up automatically when the run ends. Use this for cancel signals, chat, or steering a running agent (like the example above).
.wait(): suspend until data arrivesThe task process is freed entirely. No compute cost while you wait. When data lands, the task resumes exactly where it left off. Works like a waitpoint token but with a typed schema and no token management.
.once(): block for the next messageLike
.wait(), but the process stays alive. Use this when you need the task warm between messages..peek(): check without waitingNon-blocking. Returns the latest buffered value, or
undefinedif nothing's arrived yet.Send from your backend
Call
.send()with the run ID. Works from Next.js API routes, Remix actions, Express, whatever you're running.Send from your frontend
The
useInputStreamSendReact hook (shown in the example above) wires up any UI element to a running task. Pass the stream ID, a run ID, and an access token. You get back a typed send function.Get started
Input streams ship with SDK v4.4.2+:
npm install @trigger.dev/sdk@latest @trigger.dev/react-hooks@latestFull guide:
Streams documentation
Original source - Apr 13, 2026
- Date parsed from source:Apr 13, 2026
- First seen by Releasebot:Apr 16, 2026
Trigger.dev v4.4.4
Trigger.dev releases task-level and global TTL defaults, multi-provider object storage with zero-downtime migration, and a bigger MCP and CLI upgrade with new tools, platform notifications, span inspection, and multiple bug fixes.
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.
Set ttl: 0 on a task to opt out of the global default entirely. See trigger.config.ts for all configuration options. (#3196)
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, so no access keys are required. (#3275)
CLI improvements
- Platform notifications: the trigger dev and trigger login commands 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-notifications to disable. (#3254)
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 in get_run_details trace output for easy discovery. (#3255)
- get_query_schema — discover available TRQL tables and columns
- query — execute TRQL queries against your data
- list_dashboards — list built-in dashboards and their widgets
- run_dashboard_query — execute a single dashboard widget query
- whoami — show current profile, user, and API URL
- list_profiles — list all configured CLI profiles
- switch_profile — switch the active profile for the MCP session
- start_dev_server — start trigger dev in the background and stream output
- stop_dev_server — stop the running dev server
- dev_server_status — check dev server status and view recent logs
Improvements
- --readonly flag hides write tools (deploy, trigger_task, cancel_run) so the AI cannot make changes
- get_run_details trace output is now paginated with cursor support
- get_query_schema now requires a table name and returns only that table's schema
- get_current_worker no longer inlines payload schemas — use the new get_task_schema tool instead
- Query results formatted as text tables instead of JSON (~50% fewer tokens)
- cancel_run, list_deploys, list_preview_branches formatted 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:query JWT scope added for query endpoint authorization
- CLI API client now propagates the trigger source via HTTP headers (#3241)
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, and the watchdog cleans up .trigger/tmp/ when killed ungracefully (e.g. SIGKILL from pnpm). (#3224)
- Fix --load flag being silently ignored on local and self-hosted builds. (#3114)
- Fixed search_docs MCP tool failing due to a renamed upstream Mintlify tool (SearchTriggerDev → search_trigger_dev).
- Fixed list_deploys MCP tool failing when deployments have null runtime or runtimeVersion fields. (#3139)
- Fixed list_preview_branches MCP tool crashing due to incorrect response shape access.
- Fixed metrics TRQL table column documented as value instead of metric_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. (#3291)
- Add allowRollbacks query param to the promote deployment API to support version downgrades. (#3214)
- Automatic LLM cost calculation for spans with GenAI semantic conventions. Costs are calculated from an in-memory pricing registry and written to span attributes trigger.llm.* and a new llm_metrics_v1 ClickHouse table capturing usage, cost, latency, and finish reason. (#3213)
- New GET /api/v1/runs/:runId/spans/:spanId endpoint returning span properties, events, AI enrichment, and triggered child runs. (#3255)
- Multi-provider object storage with protocol-based routing for zero-downtime migration. Adds IAM role-based auth for object stores (no access keys required). (#3275)
- Platform notifications for informing users about new features and platform events directly in the CLI and dashboard. (#3254)
- 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. (#3264)
- Reduce run start latency by skipping the intermediate queue when concurrency is available, rolled out per-region and enabled automatically for development environments. (#3299)
- Environment variable page search now matches on environment type (production, staging, development, preview) and branch name, not just variable name and value. (#3302)
- Set application_name on Prisma connections from SERVICE_NAME for DB load attribution by service. (#3348)
- Add p-retry (3 attempts, 500ms–2s exponential backoff) around object store uploads in BatchPayloadProcessor and remove x-should-retry: false from batch 500 responses so the SDK's existing retry path can recover. (#3331)
- 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. (#3219)
- Reduce lock contention when processing large batchTriggerAndWait batches by removing the per-item Redis lock acquisition. (#3232)
- Strip secure query parameter from QUERY_CLICKHOUSE_URL before passing to the ClickHouse client, fixing a startup crash with Error: Unknown URL parameters: secure. (#3204)
- Fix dev environment selection for teams with multiple members: now filters DEVELOPMENT environments by orgMember.userId to ensure the logged-in user's dev environment is returned. (#3273)
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 # bunSelf-hosted users: update your Docker image to ghcr.io/triggerdotdev/trigger.dev:v4.4.4.
Original source
Curated by the Releasebot team
Releasebot is an aggregator of official release notes from hundreds of software vendors and thousands of sources.
Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.
Similar to Trigger.dev with recent updates:
- Smokeball release notes124 release notes · Latest May 4, 2026
- Cosmolex release notes20 release notes · Latest Jul 30, 2025
- PracticePanther release notes34 release notes · Latest Apr 8, 2026
- Salesforce release notes14 release notes · Latest May 1, 2026
- Microsoft release notes535 release notes · Latest May 12, 2026
- Zoom release notes135 release notes · Latest May 11, 2026