feat: Remove daemon from turbo run, deprecate daemon flags and config#11910
Merged
anthonyshew merged 1 commit intomainfrom Feb 19, 2026
Merged
feat: Remove daemon from turbo run, deprecate daemon flags and config#11910anthonyshew merged 1 commit intomainfrom
turbo run, deprecate daemon flags and config#11910anthonyshew merged 1 commit intomainfrom
Conversation
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
Coverage Report
|
9bc833f to
3bc85bc
Compare
The daemon provided no measurable performance benefit for turbo run and added IPC overhead. Benchmarks across multiple repos showed --no-daemon consistently matching or beating daemon mode. The daemon is still used by turbo watch and the Turborepo LSP. The --daemon, --no-daemon flags and the daemon turbo.json option are deprecated and will be removed in version 3.0.
085802b to
43e777a
Compare
github-actions Bot
added a commit
that referenced
this pull request
Feb 19, 2026
## Release v2.8.11-canary.6 Versioned docs: https://v2-8-11-canary-6.turborepo.dev ### Changes - release(turborepo): 2.8.11-canary.5 (#11909) (`59e7c9e`) - feat: Remove daemon from `turbo run`, deprecate daemon flags and config (#11910) (`0f22994`) --------- Co-authored-by: Turbobot <turbobot@vercel.com>
anthonyshew
added a commit
that referenced
this pull request
Feb 25, 2026
## Summary Fixes #11964 — `turbo watch` enters an infinite rebuild loop since `2.8.11-canary.19`. When the daemon was removed from `turbo run` in #11910, the daemon client was also removed from `RunCache`/`TaskCache`. This broke `turbo watch`: without `get_changed_outputs` and `notify_outputs_written`, every cache hit unconditionally restores files to disk. The file watcher sees these writes as changes, triggers another rebuild, which hits cache again — infinite loop. ## What changed - Restored the optional `daemon_client` field in `RunCache` and `TaskCache` - `RunBuilder` accepts a daemon client via `with_daemon_client()` builder method - `WatchClient` connects a daemon client and passes it to every `RunBuilder` it creates - Normal `turbo run` passes `None`, keeping the daemon removal from #11910 fully intact The daemon client allows the run cache to: 1. **Skip unnecessary cache restores** — `get_changed_outputs` checks if outputs are already on disk and unchanged, avoiding file writes that trigger the watcher 2. **Register output globs** — `notify_outputs_written` tells the daemon's `GlobWatcher` which outputs were just written, so future checks can skip them ## Testing Verified by reproducing the original issue: ```sh git clone https://github.com/remotion-dev/remotion cd remotion git checkout 41763f0290db417900551013a1bc8376a1f42103 bun i bun run watch # should stop after building, not loop forever ```
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
turbo run— it provided no measurable performance benefit compared to its overhead now that Turborepo is dramatically faster than it used to be--daemon/--no-daemonCLI flags (hidden from help, emit warnings when used)daemonoption inturbo.json(getter always returnsNone, warns when set)The daemon is still used by
turbo watchand the Turborepo LSP — those paths are untouched.Why
Benchmarks across multiple repos (small, medium, large) showed
--no-daemonconsistently matching (or beating) daemon mode. The daemon's IPC overhead negated any benefit from pre-computed package graphs and file hashes duringturbo run. We've dramatically improved baseline performance such that the daemon no longer ands real benefit. It adds a wealth of complexity to our codebase, and many bugs.What stays
turbo daemonsubcommand (unchanged)turbo watchdaemon connection (creates its ownDaemonConnectorindependently)DaemonPackageDiscovery(still exported for LSP)turbo infodaemon status check (unchanged)Testing
A reviewer can verify the deprecation warnings by running:
You can also add
"daemon": falsetoturbo.jsonto see similar deprecation warnings for the configuration.Passing
--daemonand--no-daemontogether still errors as before.