# Trigger.dev v4.5.12 — trigger.dev v4.5.12 - Product: Trigger.dev (https://whatsnew.fyi/product/trigger-dev) - Vendor: Trigger.dev - Date: 2026-08-20 - Version: v4.5.12 - Original notes: https://github.com/triggerdotdev/trigger.dev/releases/tag/v4.5.12 - Permalink: https://whatsnew.fyi/product/trigger-dev/releases/v4.5.12 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — 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 - **added** — 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 - **added** — 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 - **added** — 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** — New projects created with trigger init use Node.js 24 by default - **changed** — Deployments without explicit runtime now use their project's configured default runtime - **changed** — 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 - **changed** — Unrelated runs are no longer merged into a single trace in external observability tools when they execute on the same warm worker process - **changed** — Dashboard pages load faster on projects with many preview branches by no longer loading every environment on each page - **changed** — Global log search now supports faster bounded substring matching and clearer time-range expansion - **changed** — 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** — 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 - **fixed** — idempotencyKeys.reset() now works when your idempotency key is itself 64 characters long - **fixed** — Fair queue tenants can no longer get permanently stuck behind leaked concurrency slots with slots now freed on every path that finishes a message - **fixed** — Failed AI SDK tool call and embedding spans now show the error message and stack trace in the run inspector below the tool input - **fixed** — A brief window after promoting or rolling back a deployment where newly triggered runs could still execute on the previous version is now fixed - **fixed** — Using * as a concurrency key no longer stops a queue from being processed - **fixed** — Root API keys no longer show an environment creation timestamp as their creation date - **fixed** — Triggering tasks is now more resilient to brief, transient service interruptions so short stalls are less likely to surface as errors - **security** — Operators can now route an organization's runs to specific Kubernetes node pools #### trigger.dev v4.5.12 ##### Upgrade ```sh 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`](https://github.com/triggerdotdev/trigger.dev/pkgs/container/trigger.dev/1153016783?tag=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](https://github.com/triggerdotdev/trigger.dev/pull/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](https://github.com/triggerdotdev/trigger.dev/pull/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](https://github.com/triggerdotdev/trigger.dev/pull/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](https://github.com/triggerdotdev/trigger.dev/pull/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](https://github.com/triggerdotdev/trigger.dev/pull/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](https://github.com/triggerdotdev/trigger.dev/pull/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](https://github.com/triggerdotdev/trigger.dev/pull/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](https://github.com/triggerdotdev/trigger.dev/pull/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](https://github.com/triggerdotdev/trigger.dev/pull/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](https://github.com/triggerdotdev/trigger.dev/pull/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 a _[Truncated at 4000 characters — full notes: https://github.com/triggerdotdev/trigger.dev/releases/tag/v4.5.12]_