Bug Fixes
- Fixed reload-shell shortcuts intercepting Ctrl-Alt input from full-screen terminal applications such as Neovim (#3107).
- Fixed
showOutput = true/--show-outputbeing ignored when AI-agent auto-quiet (or--quiet) is active. Explicit task output now streams even at Quiet, without treating stdout as an error (#3038). - Fixed
devenv tasks runskipping a process that a task depends on via@completedwhen that process hasstart.enable = false. The process now runs to completion as the dependency requires;devenv upstill does not auto-start it (#3005). - Fixed
devenv tasks run --no-tuistaying silent until the run finished when AI-agent auto-quiet was active (CLAUDECODE, and similar). Quiet mode now prints task running/succeeded/failed lines incrementally, without streaming full task output (#3115). - Fixed
devenv --fromalso loading the current directory'sdevenv.local.nix. Options set there for the local project, such as tuning a process the external project doesn't define, no longer leak into the external environment and break evaluation. - Fixed
devenv upfailing after a CLI upgrade when the project's pinned modules predate the localhost proxy. The proxy remains disabled when those modules do not provide the option. - Fixed the interactive
devenv shellsession crashing with "terminal error: invalid value" when the terminal briefly reports a0x0size, most commonly seen on WSL2 right afterdevenv's shell hook auto-activates oncd. - Certificate generation uses Nix-provided mkcert and its helper tools instead of relying on the development shell's
PATH. - Fixed
devenv upincorrectly reporting that the proxy exited while its capability broker child was still dropping root privileges. - Fixed concurrent
devenv shellentries into a project without.devenv/failing withdatabase is locked(and related task-cache init / GC-root races). First-time eval and task cache initialization now takes a process lock so a concurrent creator can wait instead of deleting the database, and removing an existing GC root ignores a concurrent delete (#3133). - Fixed environment capture accumulating unbounded
.devenv/shell-*.shfiles. Capture-specific activation scripts are now temporary, and non-interactive commands are passed as arguments instead of being embedded in persistent activation scripts (#3149). - Restored dotenv compatibility with older devenv CLIs whose project inputs resolve newer modules. These CLIs now fall back to the legacy Nix parser instead of failing because the
loadDotenvprimop is unavailable. - Fixed
devenv shellhanging on exit or repeatedly reloading when a configured dotenv file was missing, especially in large repositories. - Fixed
devenv tasks runleaving processes running after it exits, in both TUI and non-TUI mode. A task depending on a process, such asafter = [ "devenv:processes:postgres@ready" ], started that process but never stopped it, so services like PostgreSQL and Redis were orphaned and kept holding their ports and data directories. - Interrupting devenv a second time no longer leaves processes running. The second Ctrl+C exits straight away instead of waiting for shutdown to finish, which used to abandon any process still shutting down. This was easy to hit, since a process that is slow to stop is given five seconds before it is killed.
- Existing GC root symlinks are now updated atomically when their store path changes.
- Fixed JSON trace output (
--trace-to json:...) writing invalid JSON lines for activity events that contain lists, such as the task hierarchy event. - Fixed
devenv upleaving stale proxy URLs behind in task metadata when proxy hostname validation failed. Route planning now updates process URLs only after validation succeeds, so error paths no longer partially mutate the task configuration. - Fixed short-lived processes staying active under process-compose. External managers now own restart and readiness, while
devenv-tasksruns the process once and exits when it settles (#2879). - Fixed services surviving a crash of
devenv-tasksor the native process manager. A guardian now cleans abandoned service sessions, and the next manager reconciles them before starting the same process. - Fixed
devenv-tasksleaving processes running after errors or parent death. It now stops processes before returning and when it loses its parent. - Fixed the native manager missing descendants in separate process groups. Stop and restart now clean the whole service session.
- Fixed
devenv downleaving external-manager descendants running. Shutdown now tracks the complete process scope and gracefully stops Overmind before cleanup. - Fixed external-manager start/stop races, false-positive detached starts, and process names containing shell metacharacters.
- Fixed
devenv processes downreturning before Overmind had finished stopping. Overmind left its control socket behind, and the nextdevenv uprefused to start. devenv now waits for the manager to exit before it cleans up. - Fixed a foreground
devenv upwith an external process manager being invisible to other devenv commands.devenv processes downin another terminal now stops it, and a seconddevenv upattaches instead of starting a rival manager. - Fixed
devenv processes downdoing nothing after you log out and back in. systemd removes/run/user/$UIDwhen your last session ends, which used to lose a detached process manager: it kept running, nothing could stop it, and the nextdevenv upstarted a second one beside it. devenv now keeps a copy of the manager state in.devenv. - Fixed devenv suppressing the TUI and forcing quiet output for every shell started from Warp. AI-agent auto-detection now matches only autonomous agents, not "hybrid" environments.
Improvements
- Added
languages.rust.rustdocflagsfor extendingRUSTDOCFLAGSwithout conflicting with linker flags configured by the Rust module (#3111). - The
(devenv)shell prompt prefix can now be disabled withprompt_prefix: falseindevenv.yaml, or globally withshell.prompt_prefix: falsein the user configuration. - Added opt-in HTTPS process URLs with
processes.<name>.proxy.https.enable, using the project's existing mkcert certificate authority. - Added an opt-in localhost process proxy. Set
process.proxy.enable = trueto give processes with declared ports.localhostHTTP URLs, with hostname overrides and URLs shown in the TUI; the proxy is disabled by default (#3141). devenv hook <shell>can now pass arguments to its auto-activateddevenv shell. Arguments following--are forwarded safely in Bash, Zsh, Fish, and Nushell, for exampledevenv hook fish -- --no-tui(#3128).- OTLP trace destinations now also export Nix evaluator heap and garbage-collection metrics for diagnosing memory use.
- When the Nix daemon is running version 2.35 or newer,
devenv gcnow cleans up old environments in a single batch, making it much faster. It also shows clear progress while it runs. - File watching now uses substantially fewer allocations and less peak memory for large dependency sets, batches registrations and change bursts more efficiently, and keeps tracking files that are created later or replaced atomically.
- Pinning several package versions no longer costs a separate nixpkgs fetch and evaluation for each one.
multiverse.pins { cmake = "3.26.4"; bun = "0.7.0"; }resolves a whole set of versions, at exactly those versions, through the fewest nixpkgs revisions that can serve them and returns the packages. - Replaced the Nix-based dotenv parser with
dotenv-ng, called through the devenv CLI during evaluation. Dotenv files now support quotes, multiline values, comments,export, optional variable substitution, ordered files in subdirectories, task-generated files, and hot reloads. Values remain available throughconfig.env, explicitenvdefinitions take precedence, and file and substitution dependencies invalidate the evaluation cache when they change (#775, #1208, #1333, #1591, #1652, #1994, #2176). devenv-run-testsreports the runtime and shell closure size of every test and can fail a test whose closure exceedsmax_closure_sizein its.test-config.yml.- Reduced the size of the devenv closure from 528 MB to 376 MB. It no longer contains duplicate copies of glibc, OpenSSL, curl, Boost, ICU and the Nix libraries, which were pulled in by
cachixandnixdbeing built against different package sets than devenv itself. devenv tasks listnow prints a more readable human tree: task names are colored (processes in cyan), descriptions are shown inline, and details like status checks and watched files are broken onto their own indented lines instead of being crammed into a single parenthetical.- Module errors now point at the
devenv.nix(or imported module) that defined the offending option, instead of<unknown-file>. - Updated the bundled Nix from
v2.34.8tov2.35.2. - Added
processes.<name>.shutdown.signaland.gracefor the native manager and process-compose. The same settings apply to restarts, and PostgreSQL now uses SIGINT for fast shutdown. - Added process-manager capability checks. Detached mode is supported by process-compose, Honcho, Hivemind, and Overmind; unsupported operations now fail before launch, and mprocs remains foreground-only.
- Process-manager metadata is compatible with older CLIs and Nix modules; no public Nix options changed.
- Enabling
--trace-tono longer serializes every activity event up front. Trace sinks now walk the typed event only when they write it, so tracing no longer allocates a JSON tree per Nix build log line on the Nix logger thread. Benchmarks of JSON activity export show 2.6× the throughput, 89% fewer allocation calls, and 78% fewer allocated bytes. With trace output disabled, lazy config logging eliminates serialization entirely—3,967 allocations and 287 KB for a representative 128-task config. - Process activities in
--trace-to jsonoutput now carry structuredportsandready_probefields, and process exits and supervisor restarts are exported asexitedandrestartedevents instead of free-form log lines. The TUI and console show aProcess exited (success)orProcess exited (failure)line for every exit.