Trigger.dev v4.5.12

v4.5.12

trigger.dev v4.5.12

Added 4
  • Define stable execution windows on declarative scheduled tasks with Schedule API responses now exposing both the nominal CRON time and its assigned time, and the dashboard showing configured windows and upcoming assignments
  • Deploy with --external-id to tag a deployment with an id of your own such as a commit SHA, CI run id, or release tag so runs triggered by that release of your app go to that deployment
  • List the current Production runtime for every accessible project with trigger projects list and use --needs-update to identify projects currently running Node.js 21
  • Set TRIGGER_EXTERNAL_DEPLOYMENT_ID to pin runs to the deployment your calling code came from, or set TRIGGER_AUTOMATIC_SKEW_VERSION_PROTECTION=1 to detect the commit automatically on Vercel and most CI systems
Changed 7
  • New projects created with trigger init use Node.js 24 by default
  • Deployments without explicit runtime now use their project's configured default runtime
  • Deployment builds now use custom base layer images and no longer install system packages during every build, improving layer caching for faster deployments and faster image pulls
  • Unrelated runs are no longer merged into a single trace in external observability tools when they execute on the same warm worker process
  • Dashboard pages load faster on projects with many preview branches by no longer loading every environment on each page
  • Global log search now supports faster bounded substring matching and clearer time-range expansion
  • Archiving a branch now returns you to the same page of the branches list, keeping your place, search and filters instead of resetting to the first page
Fixed 8
  • Task metrics no longer go missing for projects that configure their own metricExporters or metricReaders, and the flush error that came with it is gone
  • idempotencyKeys.reset() now works when your idempotency key is itself 64 characters long
  • Fair queue tenants can no longer get permanently stuck behind leaked concurrency slots with slots now freed on every path that finishes a message
  • Failed AI SDK tool call and embedding spans now show the error message and stack trace in the run inspector below the tool input
  • A brief window after promoting or rolling back a deployment where newly triggered runs could still execute on the previous version is now fixed
  • Using * as a concurrency key no longer stops a queue from being processed
  • Root API keys no longer show an environment creation timestamp as their creation date
  • Triggering tasks is now more resilient to brief, transient service interruptions so short stalls are less likely to surface as errors
Security 1
  • Operators can now route an organization's runs to specific Kubernetes node pools

From Trigger.dev

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.5.12

Release notes

Read the full release notes: https://trigger.dev/changelog/v4-5-12

What's changed
Highlights
  • Define stable execution windows on declarative scheduled tasks. Schedule API responses now expose both the nominal CRON time and its assigned time, while the dashboard shows configured windows and upcoming assignments. (#4572)
Improvements
  • trigger.dev deploy --external-id tags a deployment with an id of your own — a commit SHA, a CI run id, a release tag — so runs triggered by that release of your app go to that deployment. Deploying an id that is already deployed builds nothing and reports the existing version instead of creating a duplicate; use --force to rebuild it. (#4663)
  • List the current Production runtime for every accessible project with trigger projects list. Add --needs-update to identify projects currently running Node.js 21. (#4659)
  • New projects created with trigger init use Node.js 24 by default. Deployments without explicit runtime now use their project's configured default runtime. (#4649)
  • Deployment builds now use custom base layer images and no longer install system packages during every build. This improves layer caching resulting in both faster deployments and faster image pulls on the worker cluster side. (#4602)
  • Unrelated runs are no longer merged into a single trace in your external observability tool when they happen to execute on the same warm worker process. (#4534)
  • Task metrics no longer go missing for projects that configure their own metricExporters or metricReaders, and the flush error that came with it is gone. (#4613)
  • idempotencyKeys.reset() now works when your idempotency key is itself 64 characters long (for example if you use a hash of your own as the key). Previously any 64-character key was assumed to be already hashed, so passing one along with a scope silently ignored the scope and the reset never found a matching run. Keys returned by idempotencyKeys.create() continue to be reset exactly as before. (#4626)
  • Pin runs to the deployment your calling code came from, so an old release never triggers tasks from a new one: set TRIGGER_EXTERNAL_DEPLOYMENT_ID to the id you deployed with, or TRIGGER_AUTOMATIC_SKEW_VERSION_PROTECTION=1 to detect the commit automatically on Vercel and most CI systems. Runs triggered before that deployment finishes building wait for it, then start pinned. (#4664)
  • Fair queue tenants can no longer get permanently stuck behind leaked concurrency slots. Slots are now freed on every path that finishes a message, a failed release no longer causes a message to run twice or lose its retry, and a background sweep frees any slot that does leak, so a tenant's queues recover on their own instead of needing manual cleanup. (#4540)
Server changes

These changes affect the self-hosted Docker image and Trigger.dev Cloud:

  • Deployments and runs now show the external ID they were deployed or pinned with, so you can trace a run back to the release of your app that triggered it. (#4665)
  • Operators can now route an organization's runs to specific Kubernetes node pools. (#4655)
  • Dashboard pages load faster on projects with many preview branches by no longer loading every environment on each page. (#4606)
  • Global log search now supports faster bounded substring matching and clearer time-range expansion. (#4615)
  • Triggering tasks is now more resilient to brief, transient service interruptions, so short stalls are less likely to surface as errors. (#4623)
  • Failed AI SDK tool call and embedding spans now show the error message and stack trace in the run inspector, below the tool input. (#4653)
  • Archiving a branch now returns you to the same page of the branches list, keeping your place, search and filters instead of resetting to the first page. (#4724)
  • Using * as a concurrency key no longer stops a queue from being processed. Triggering a single run with that key could leave the whole queue stalled, including runs using other concurrency keys on it, until something else was triggered on the same queue. (#4628)
  • Fixed a brief window after promoting or rolling back a deployment where newly triggered runs could still execute on the previous version. New runs now pick up the current version immediately. (#4622)
  • Root API keys no longer show an environment creation timestamp as their creation date. (#4612)
  • The app version shown on the organization settings page now reports the real version instead of v0.0.0. (#4611)
  • Fix paused environments starting to run work again after a deploy: a paused environment now stays paused until you resume it. (#4625)
  • Reject alert webhook destinations in reserved benchmarking IP ranges. (#4735)
  • TRQL queries using the PREWHERE clause are now rejected with a clear error message. Use WHERE instead, which is filtered the same way but keeps your data isolation guarantees intact. (#4735)
  • Run trace rows now respond consistently to mouse and keyboard selection, including Alt-click expansion controls. (#4701)
  • The "Back to app" button in organization settings now returns you to that organization instead of your most recently used one. (#4632)
  • Runs triggered with a ttl could get permanently stuck in the queued state if they started executing and were then requeued after a failure (for example a worker dying mid-run) once the TTL had already elapsed. Requeued runs now dequeue normally: a run's TTL only applies while it is waiting to start for the first time. (#4669)
All packages: v4.5.12

@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

Chris Arderne, @nicktrn, Eric Allam, Oskar Otwinowski, claude[bot], Matt Aitken, Saadi Myftija, github-actions[bot], @NERLOE, Katia Bulatova, Wes Mason

Full changelog: https://github.com/triggerdotdev/trigger.dev/compare/v4.5.11...v4.5.12

View original

Upgraded? How did it go?

Discussion