Turborepo continues hardening both performance and reliability. A spike of work landed on graceful shutdown semantics for persistent tasks—preserving exit codes and PTY state across interrupt scenarios—alongside moves to modernize authentication toward standard OAuth flows and compatibility fixes for emerging package manager versions like pnpm v11's multi-document lockfiles. In parallel, the team shipped incremental task caching, circular dependency detection in boundaries checking, and parallelize that work with Rayon, while pushing remote cache uploads from 8KB to 256KB chunks for better throughput. The 2.9 release bumped the major version; 2.8 saw sustained refinement on lockfile pruning across npm, pnpm, and Bun, moving pieces into native Rust to shed subprocess overhead.
Turborepo shipped a burst of activity in March centered on two major themes: stabilizing task-level execution and rearchitecting the logging pipeline.
The team landed affectedTasks query support and future flags like affectedUsingTaskInputs and filterUsingTasks to move change detection from package-level to task-level granularity, alongside new cache eviction controls via cacheMaxAge and cacheMaxSize. In parallel, they introduced turborepo-log as a unified logging crate, rerouted run output through TerminalSink and TuiSink for structured control, and deprecated turbo-ignore in favor of turbo query affected. The month also included a sustained performance push—replacing SWC with oxc for parsing, eliminating per-directory stat syscalls, streaming file contents during hashing, and racing parallel git operations against filesystem walks. Platform binaries shipped under @turbo/ scoped packages, and turbo ls gained a turbo query ls shorthand. Minor fixes throughout targeted lockfile handling across npm/pnpm/bun, watch mode hangs with persistent tasks, and symlink behavior during cache restore.
February focused on performance across the runtime, with aggressive hotpath optimization and memory efficiency gains. Startup was faster thanks to eliminating git subprocesses in favor of libgit2 and parallelizing workspace discovery with lockfile parsing, while turbo run saw CPU and allocation reductions through hash computation optimizations, deduplication, and parallelized task hashing across waves. OpenTelemetry observability landed as an experimental feature without requiring the --summarize flag, and the daemon was removed from turbo run with its flags deprecated. Test infrastructure shifted further toward Rust with prysk tests ported from Python, and dependency cleanup reduced compile times by deduplicating thiserror and itertools.