- Fixed
devenv mcpignoring termination signals. A single SIGTERM or SIGINT now shuts the server down immediately, without waiting for further input on stdin; previously it kept running until it was killed forcefully or its client closed stdin (#3065). - Fixed
devenv mcpignoring most of the session's configuration; it previously fell back to default Nix, cache, and shell settings for everything except inputs and imports.
- Fixed profiles failing to override package-valued options, such as
languages.python.package, unless the profile usedlib.mkForce. Automatic profile priorities now apply to derivation values while mergeable package lists continue to combine (#3057). - Fixed
devenv hook zshand the other shell hooks starting Bash when an editor terminal inherited a valid but stale Bash$SHELL. Auto-activation now passes the known outer shell as a non-authoritative hint, below explicit CLI, environment, anddevenv.yamlshell settings but above ambient$SHELLdetection (#2880). - Fixed
devenv shelloccasionally losing the exit code of the shell it ran, reporting success for a session that exited nonzero. - Fixed
devenv --profile <name> allowignoring the selected profile for projects with a localdevenv.nix. Allowed in-tree projects now persist their auto-activation profiles just like out-of-tree--frombindings; explicit--profileflags still take priority. - Fixed
devenv inithanging when an existing file differs from the template and there is no terminal to confirm on. - Fixed devenv freezing until killed when run on a terminal from a background process group, for example under GNU
timeoutor other wrappers that start commands in their own process group. - Fixed
devenv shellfailing with an incorrectoutenvironment variable when the experimentalca-derivationsfeature is enabled (#2364).
- Fixed TUI commands continuing to run as CPU-spinning background processes after their terminal closed.
- Fixed a potential stack overflow in
devenv mcpwhile it indexed packages and options in the background. Indexing now runs with the large stack required by Nix evaluation and is interrupted when the server exits instead of delaying shutdown. - Fixed several failures in Cachix netrc setup: authenticated pulls could return HTTP 401, devenv could replace credentials in Nix's existing
netrc-file, and caches could disappear as substituters when the managed netrc could not be prepared. devenv now installs credentials before opening the Nix store, merges them with Nix's existingnetrc-fileinstead of replacing it, and keeps the cache available when a netrc file cannot be read or written. Generated credential files are private to the user and unique per process; stale files left behind by crashed or killed processes are removed. - Fixed SecretSpec providers such as SOPS being unavailable from the bundled CLI by enabling SecretSpec's default provider features.
- Fixed the SecretSpec profile and provider selected in
devenv.yamlbeing applied only duringdevenv.nixevaluation. devenv now exports the resolved values asSECRETSPEC_PROFILEandSECRETSPEC_PROVIDERin the development shell, sosecretspec runand other SecretSpec commands use the same configuration. The matchingsecretspecCLI is also included in the devenv package instead of requiring a separate installation. - Fixed the Nushell hook failing to deactivate the environment when
cd-ing out of a project. Nushell'sexitcannot terminate a shell from an environment-change hook: it reportedExit doesn't catch internallyand left the hook-spawned shell running. The hook now terminates that shell so the parent hook can resume and follow.devenv/exit-dir(#3033). - Fixed shell hooks skipping reactivation when returning immediately to a project after
cd-ing out. The activation guard remained set after the parent hook followed the user out, so the environment only reactivated after leaving and returning a second time. The guard is now cleared for Bash, Zsh, Fish, and Nushell (#3034). - Fixed
devenv tasks runhanging indefinitely when a task depended on a process with areadyprobe (for example a task gated onservices.mysql). The process started, but its readiness probe could not run, so the process never became ready and the dependent task waited indefinitely. The same configuration already worked underdevenv upanddevenv test(#3030). - Fixed a process crashing with "address already in use" when a second project reused a port still held by the first. After a project's detached process manager was stopped (
devenv up -dthendevenv processes down), its control socket could remain responsive briefly after its PID file was removed. A subsequentdevenv upwould then reuse stale port allocations instead of choosing a free port. devenv now reads running-manager port allocations only from a manager backed by a live PID file. - Fixed
importsindevenv.yamlsilently dropping a directory imported transitively through another project'sdevenv.yaml, rather than directly by the root project, when that directory had nodevenv.yamlof its own. Itsdevenv.nixis now loaded regardless of the import depth. - Fixed editor-launched terminals and stripped environments defaulting to Bash when
$SHELLis absent. devenv now checks the user's login shell from the system account database before defaulting to Bash, including undersudoandsu. The shell's absolute path is used in both PTY and non-PTY interactive sessions, so it works even when$PATHdoes not contain its Nix store directory; stale login-shell paths fall back to the standard shell-resolution logic. devenv now also warns when an unsupported shell is explicitly requested via--shellordevenv.yamlbefore falling back to Bash (#2880, #2992). - Fixed the shell hook closing a pane or session in a terminal multiplexer such as tmux or zellij when leaving a project directory. Shells started from an active devenv shell, such as a new pane, an SSH session, or a manually started nested shell, inherited the hook marker and incorrectly treated themselves as hook-spawned. The marker is now consumed and removed from the environment as soon as the intended shell receives it, so it cannot leak to processes started afterward (#2861).
- Fixed a hook-activated shell sometimes remaining active after leaving a project outside a terminal multiplexer. Deactivation depended on the spawned shell's rc file re-sourcing the hook script, which some configurations skip (for example, a Fish config gated behind
status is-login, which a hook-spawned non-loginfish -inever satisfies). Each shell's generated init file now handles leaving the project directly, independently of the user's rc file. - Fixed the Fish hook spawning a redundant devenv shell over an environment that direnv or another tool had already activated for the same directory via
use devenvin.envrc. The hook decides whether to activate at one prompt and acts at the next to avoid spawning duringcd, but it did not recheck whether another tool had activated the directory in the meantime. - Fixed
cd -not returning to the project directory after the Fish hook followed the user out of it (#2853). The hook usesbuiltin cdto avoid retriggering a user-overriddencd(for example,zoxide init --cmd=cd), but this bypasses Fish's directory-history bookkeeping. The hook now updates that history itself. - Fixed input-relative imports (for example,
imports: [myinput/some/dir]) being wrongly rejected with "Import path resolves outside the git repository" when a symlinked path was used to reach the project root, as occurs with macOS temporary directories under/var. - Fixed
devenv shellappearing to hang in the TUI when the file watcher failed to register a watch, most commonly after reaching the inotify watch limit (fs.inotify.max_user_watches). The watcher now continues after a failed registration and surfaces a warning in the TUI instead of logging it only under--verbose --no-tui. - Fixed a task whose
statuscommand exits nonzero being rendered as a failedcheck statusactivity, making successful runs look like they contained a failure. A nonzero status is a normal cache miss that runs the task's command; only a failure to spawn the status command itself is now reported as a failure (#2984). - Fixed
devenv processes restartleaving a restarted process reported as "exited" bydevenv processes list/statuseven though it was running. When the process had previously exited (restart policy said stop), the restart spawned a fresh job and supervisor but never published a new status, and processes without readiness probes produce no further status events until they exit again. Restarting such a process now also replaces a supervisor parked after exit (kept alive only for file watching), which previously stopped monitoring the restarted job (#2982). - Fixed devenv overriding user-configured experimental features in
nix.conf(#2931). - Fixed
devenv hook bash/zshskipping activation for a sibling project after following.devenv/exit-dirfrom a hook-spawned shell that left the previous project (#2944). - Fixed misleading evaluation errors where evaluation warnings replaced the real error message, hiding syntax errors and suggestions like
devenv inputs add …(#2820). - Fixed
devenv shellfailing withFailed to parse output store path … is not in the Nix storewhen using a relocated or chrooted Nix store (e.g.NIX_REMOTE='local?root=…'or a bind-mounted store). The realized shell path was translated to its physical location and then fed back into store-path parsing, which only accepts the logical/nix/store/…form; the logical path is now recovered before creating the GC root (#2499). - Fixed the TUI crashing on activity names or store paths containing multibyte characters (e.g. non-ASCII package names or evaluation paths) when shortened for narrow terminals.
- Fixed the TUI crashing with an arithmetic overflow when a download or task reported progress beyond its expected total.
- Fixed the quit confirmation prompt overflowing past the right edge on terminals narrower than about 82 columns; the prompt now adapts to the available width.
- Fixed the bottom navigation hint bar overflowing the right edge on standard 80-column terminals when a process was selected; the hints are now more compact on narrower terminals.
- Fixed devenv invocations with different
$TMPDIRvalues choosing different runtime directories and therefore failing to find each other's process manager. The runtime path now uses$XDG_RUNTIME_DIR, falling back to/tmp;$TMPDIRis no longer consulted. A daemon still using its previous runtime path may need to be restarted once (#2923). - Fixed edits to local
path:inputs (e.g.url: path:../shared-config) never taking effect: the evaluation cache served the old configuration until.devenvwas deleted, anddevenv updatedid not help. Files from local path inputs are now read directly from disk and tracked by the cache, so changes apply on the next command and direnv reloads when they change. - Fixed the evaluation cache missing a
devenv.local.nix(or any other tracked file) created within the same second as the previous evaluation, which could happen in scripts that run devenv commands back to back. - Fixed edits to
enterShellcausing a parse error (e.g.(eval):6: parse error near '\n') when a runningdevenv shellreloaded under Zsh or Fish. TheenterShelloutput was being mixed into the environment data applied during reload; it now goes to the terminal as it does on a fresh shell entry (#2919). - Fixed
devenv up(and other TUI commands) burning significant CPU while idle — roughly 10-15% per managed process — even when every process was quiet. The foreground UI was recomputing its layout dozens of times per second regardless of whether anything changed, and each idle process woke the whole UI twice a second. The TUI now only redraws when the model actually changes, with a slow heartbeat to keep elapsed timers ticking (#2915). - Fixed
devenv containerplacingcopyToRootdirectories under a hash-prefixed subdirectory (e.g./env/<hash>-source) instead of in the working directory. The project root and other directory paths now land directly under the working directory, and single files keep their original name (#2914). - Fixed local files and directories pulled into the Nix store by path (e.g.
scripts.foo.exec = ./foo.sh;orlanguages.rust.import ./.) not being tracked as eval-cache dependencies, so editing them returned stale results fromdevenv buildanddevenv shelluntil the cache was manually refreshed. Such sources are now tracked, with directories hashed recursively over their contents so nested edits are detected (#2886, #2893). - Fixed
devenv shelllingering as a background process, often pinned at 100%+ CPU, after its terminal window or tab was closed. The shell now reacts to the SIGHUP/SIGINT/SIGTERM that already trigger devenv's graceful shutdown by killing the inner shell, instead of orphaning it (#2845). - Fixed
devenv shell/devenv updatefailing withauthentication required but no callback setwhen aurl."ssh://git@github.com/".insteadOfGit configuration rewrites GitHub HTTPS URLs to SSH. GitHub flake inputs now resolve over SSH using your SSH agent (#2842). - Fixed the "N files" counter under "Evaluating shell" inflating from generic Nix log lines. The counter now only includes actual file reads.
- Fixed
devenv up/test/tasksfailing witherror: could not find a flake.nix filewhen the devenv shell is loaded from a remote flake via direnv (#2599). - Fixed
devenv shellprinting internal reload warnings (e.g. "Watched path became unavailable, forcing reload") to the user's terminal, clobbering scrollback, prompts, and editors. - Fixed
devenv upcorrupting a running daemon's PID file and socket when started in the foreground, leaving the daemon unmanageable. Foregroundupnow rejects with "Processes already running" when a daemon is active. - Fixed a remaining case in which the shell hook spawned a nested
devenv shellafterdevenv shellwas entered manually (a follow-up to #2815). - Fixed "zoxide: infinite loop detected" when using
zoxide init --cmd=cd fishandcd-ing into a devenv project. The Fish hook now defers spawningdevenv shellto the next prompt instead of spawning inside thePWDevent handler, so in-progress shell state never leaks into the devenv shell (#2841). - Fixed the Nushell hook behaving differently from the Bash, Zsh, and Fish hooks: outer shells with
DEVENV_ROOTexported (e.g. via direnv) no longerexitwhen leaving the project, and a manually entereddevenv shellno longer respawns a nested shell. - Fixed stale task and option results that lingered when
devenv.nixwas edited while a command was already evaluating. The eval cache no longer stores results whose tracked input files were modified mid-evaluation, so the next run sees the new definitions without deleting.devenv/nix-eval-cache.db*(#2745). - Fixed long lines in
devenv shellgetting a hard newline inserted at the wrap point when copied to the clipboard. The shell now preserves soft wrapping when flushing output into the terminal's scrollback, so clipboard copies keep the original single line (#2865). - Fixed files declared with the
filesoption not being regenerated when an auto-loaded (devenv allow) shell reloaded afterdevenv update.enterShelltasks (includingdevenv:files) now rerun on hot reload, matching a fresh shell entry, instead of only updating environment variables (#2864). - Fixed
devenv test --no-tui(and any other non-TUI invocation) silently discarding all output from theenterTestscript, so the test runner's output, traces, and failure messages never reached the terminal or CI logs. Output from commands run in the shell is now printed in non-TUI mode. - Fixed
watchpaths being ignored for one-shot processes that exit immediately (e.g. code generators). The file watcher was torn down as soon as the process exited, so later edits never triggered a rerun. Watched one-shot processes now stay parked after exiting and rerun when a watched file changes. - Fixed
devenv upintermittently failing to start processes withFailed to initialize task cache: … pool timed out while waiting for an open connection, most often in CI. Processes launched by a non-native process manager (e.g.process-compose) opened the same task-cache database concurrently and raced to create and migrate it; the database is now initialized once before the processes start (#2897). - Fixed
devenv inputs addfrom a subdirectory writing to a straydevenv.yamlin the subdirectory instead of the enclosing project. It now walks up to finddevenv.nixthe same waydevenv shelldoes, so the input is added where the rest of devenv reads it. - Fixed
devenv gcfailing with "File devenv.nix does not exist" when run outside of a project. Garbage collection operates on the global devenv store and no longer requires adevenv.nix(#2928). - Fixed unfree package errors suggesting only generic Nix/NixOS configuration. They now point devenv users to
allow_unfree: trueornixpkgs.permitted_unfree_packagesindevenv.yaml(#2850). - Fixed
devenv shellfailing outright with a SQLitedisk I/O erroron filesystems that don't support shared-memory mmap (seen on virtiofs/9p VM mounts and similar). The eval cache and task cache databases now fall back to plain rollback-journal mode on these filesystems instead of crashing (#2947). - Fixed failure diagnostics being buried in evaluation output in non-TUI mode. A failing evaluation no longer replays accumulated progress logs, such as
evaluating file …, after the error, anddevenv-run-testsnow reports test failures after the diagnostic output instead of racing it. - Fixed lifecycle races in the native process manager: a process being relaunched could be started twice, leaving an orphaned copy that kept its port bound but no longer appeared in
devenv processes list; a process whose dependency could not be satisfied vanished from the list instead of showing as stopped; and a relaunched process that had previously failed left its dependents permanently blocked on the stale failure. - Fixed
devenv processes waithanging forever when a process is waiting on a dependency that is stopped or not started. - Fixed
devenv up -dsilently scheduling processes into another terminal's foregrounddevenv upsession; it now asks you to attach with plaindevenv upor stop the session first. - Fixed
devenv upattaching to a running process manager and then blocking, with no way to interrupt it, when run under an AI coding agent or with piped output. It now attaches only at an interactive terminal and otherwise reports that processes are already running. - Fixed
devenv processes waitreturning before a process was up while it was still waiting for a one-shot setup task (e.g. a migration); a running setup task now counts as in progress. - Fixed detaching from a running native process manager completing the attached process activities in the client TUI even though the daemon-owned processes were still alive. Attached rows are now non-owning proxies, and self-exited and crash-loop-exhausted processes retain distinct
exitedandgave upstates. - Fixed two concurrent cold
devenv up -dinvocations racing to spawn separate native managers for the same project, which could orphan the losing daemon and its children. Daemon startup is now serialized until one manager publishes its PID, after which the other invocation attaches normally. - Fixed dynamically discovered process dependency closures remaining pending forever when an unseen one-shot failed or a shutdown cancelled it. Terminal failure and cancellation now propagate through the retained graph, and task cancellation reliably terminates the task's whole subprocess group.
- Fixed
processes.<name>.linux.capabilitiesbeing silently dropped when process definitions were translated into internal tasks, so the native process manager now receives and applies the configured capabilities. - Fixed a shutdown racing with a task dependency failure reporting unstarted tasks as dependency failures instead of cancellations. Shutdown now consistently takes precedence across the remaining dependency closure.
- Fixed
devenv processes logs --linesreturning the wrong number of lines when the last log line had no trailing newline, and normalized CRLF output so stray carriage returns are not printed. Native manager port-allocation snapshots are now returned in a stable order as well. - Fixed a process that exited on its own and was then explicitly stopped still showing as exited (and counting as succeeded in run summaries) instead of stopped.
- Fixed
devenv upwith no arguments not starting a process whose configuration omitsstart.enable, even though it defaults to enabled anddevenv up <name>would start it. - Fixed a process that exits on its own (a crash or a one-shot that runs to completion with no restart) continuing to show as
runningin thedevenv upTUI after it had stopped; it now shows as exited, while an exhausted crash loop shows as failed.
devenv shellreload sessions now redraw only the terminal rows that changed instead of the whole screen every time output scrolls, reducing flicker and output bandwidth. Resizing the terminal mid-session no longer risks dropping pending lines from scrollback.- Reduced renderer fragmentation in
devenv shellby reading PTY output in larger batches, lowering syscall and event-allocation overhead during full-screen repaint bursts. DEVENV_HOMEnow overrides where devenv stores all per-user data (GC roots, trust database, cached keys), not just the trust database.- Non-TUI console output is now buffered and flushed in batches, reducing write overhead during verbose evaluation.
- Traces now identify whether devenv was invoked by the CLI, direnv, or the native shell hook with a
devenv.callerspan attribute. Caller information is passed explicitly by integrations, so nested commands are not mistaken for automatic activation (#2965). - Reduced the size of the devenv closure and container image by about 550 MiB by linking
nixd(used bydevenv lsp) statically against LLVM, so the monolithic LLVM shared library is no longer bundled. - Reduced the size of the devenv binary's closure and container image by no longer bundling a debug build of
libghostty-vt, which pulled Zig and LLVM (about 1 GiB) into every installation. - Added
DEVENV_TRACE_DEFAULT_TOfor configuring default trace destinations that apply only when no explicit--trace-to,DEVENV_TRACE_TO, or legacy trace output is set. SetDEVENV_TRACE_DEFAULT_TOto an empty string to suppress the default for a command or session (#2963). - Upgraded SecretSpec to 0.17.0, adding provider aliases, AWS Secrets Manager key prefixes, audit logging and access reasons, custom Bitwarden instances, and clearer provider-outage errors.
- Cachix now authenticates pulls and pushes without exporting
CACHIX_AUTH_TOKEN: setsecretspec.cachix_auth_tokentotrue(or a custom secret name) to enable a built-in required SecretSpec secret without asecretspec.tomldeclaration. If SecretSpec does not resolve a token, devenv falls back to the auth token stored by the Cachix CLI (cachix authtoken) in~/.config/cachix/cachix.dhall. The resolved token is passed to the Cachix push daemon as well. - Added
devenv tasks list --jsonfor machine-readable task graph inspection (#2966). devenv replnow exposesinputsalongsidedevenvandpkgs, so you can inspect inputs declared indevenv.yamldirectly from the REPL (e.g.inputs.nixpkgs.lib.version).- The TUI now shows each process's state as a status dot whose shape encodes the lifecycle (waiting, starting, running, ready, stopped, failed) instead of an identical spinner on every process. The state remains recognizable without relying on color, while transient states gently pulse to signal progress.
- Non-TUI console output now surfaces Nix evaluation and build progress while hiding internal debug noise.
- Automatic TUI disabling and quiet output now use the
detect-coding-agentcrate, expanding detection beyond Claude Code to Aider, autonomous and cloud-based agents, and others. SetDEVENV_NO_AI_AGENT=1to opt out. - Added
devenv downas a shorthand fordevenv processes down, mirroringdevenv up(#2862). devenv hook fishanddevenv hook nuare now loaded automatically by Fish and Nushell viashare/fish/vendor_conf.d/devenv.fishandshare/nushell/vendor/autoload/devenv.nu, respectively. Bash and Zsh have no equivalent mechanism, so they still need manual configuration.- Added a
--include-envrcflag todevenv init(also settable viaDEVENV_INCLUDE_ENVRC) to scaffold a direnv.envrcfile (#2859). devenv --from <source> allownow binds a directory to an out-of-tree source, so you can use a devenv configuration without a localdevenv.nix. Every subsequentdevenvcommand in that directory loads its configuration from<source>without repeating--from, and the shell hook auto-activates the environment oncdjust as it does for a local project.--from path:<dir>sources now load their full configuration: the source'sdevenv.yaml(inputs and imports, including sibling imports within its git repository) is merged, and its modules are imported from the live directory so edits apply immediately without re-fetching.devenv --from <source> --profile <name> allowalso persists the selected profiles, so every subsequent command in the bound directory activates them automatically; explicit--profileflags still take priority.devenv upnow attaches to an already-running process manager (started bydevenv up -d) instead of failing with "Processes already running". It streams status, ports, and logs over the control socket; honors the requested process subset (e.g.devenv up foo) andafter/beforeordering; and reports when it has attached. On Ctrl-C, it prompts you to detach and leave the processes running or stop the whole manager (#971).- Added
devenv processes attachto attach to running processes and stream their status, ports, and logs until Ctrl-C, leaving them running (native process manager only). devenv processes start <name>anddevenv up <name>now share the same dependency-aware launch path. They honorafter/beforeordering; always start explicitly named processes, even withprocesses.<name>.start.enable = false; report unknown names with guidance; and register the full process set so other processes can be started later. When no manager is running, a named start launches one in the background, as withdevenv up -d <name>(#2930).- Process port listings now include ports derived from
listenreadiness probes, not just explicitly declared ports, in both the TUI anddevenv processes list.
- Dropped
x86_64-darwin(Intel macOS): devenv is no longer built, tested, or released forx86_64-darwin. Intel Mac users should pin an older devenv CLI release.x86_64-darwinenvironments can still be run via Rosetta 2 on Apple Silicon; however, nixpkgs 26.05 will be the last release supporting the platform. - Shell hook auto-activation: The shell hook (
devenv hook bash/zsh/fish/nu) anddevenv allownow detect a project by looking fordevenv.nixinstead ofdevenv.yaml. Projects with only adevenv.yamland nodevenv.nixwill no longer auto-activate; add adevenv.nixto restore activation. devenv initno longer creates.envrcby default: Pass--include-envrcor setDEVENV_INCLUDE_ENVRCto include the file (#2859).
- Fixed
devenv --profile <name> <subcommand>failing when the profile name shadows a subcommand (e.g.devenv --profile test test). The profile value is now consumed before clap's subcommand precedence check (#2821). - Fixed Nix syntax errors in
devenv.nixbeing reported as unrelated warnings (e.g.warning: Ignoring the client-specified setting 'system'...) instead of the actual syntax error. Warning-prefixed log entries emitted before the failing operation no longer shadow the real diagnostic (#2820). - Fixed the shell hook's "exit on cd-out" feature silently breaking under
clean.enabled = true._DEVENV_HOOK_DIRis now always preserved across env cleaning, so the hook-spawned shell still exits when the usercds out of the project. Also aligned the fish hook's marker check with the posix one (non-empty value, not just "set"). - Fixed TUI panic ("attempt to read state after owner was dropped") when pressing Esc with content that fits in the viewport. The Esc handler now only scrolls when the ScrollView is actually mounted, matching the existing guard on up/down navigation.
- Fixed private Cachix caches failing with HTTP 401 on
nix-cache-infoafter the v2.1 lazy Cachix refactor.apply_store_settingsnow sets thenetrc-fileglobal before adding substituters, so the authenticated probe Nix sends when registering a private substituter picks up the credentials written by the Cachix manager. - Fixed
devenv hook <shell>panicking withfailed printing to stdout: Broken pipe (os error 32)when its downstream reader (e.g.sourceindevenv hook fish | source) closes the pipe before the script is fully flushed.
- Long log lines (structured logs, stack traces, etc.) in the TUI now wrap onto continuation rows instead of being truncated at the terminal width. Applies to both the inline log view (shown for selected/failed activities and
devenv upprocesses) and the expanded log view, matching the default behavior oflessandjournalctl. Carriage returns are also stripped from captured log lines so pty-induced CRLF endings no longer move the cursor mid-row and erase rendered content (#2818).
- Fixed gaps in terminal scrollback during heavy output with the auto-reloading shell. The internal VT scrollback buffer is now larger and cleared after each flush to the native terminal, so its cap is never reached and lines are no longer dropped mid-stream due to GC (#2810).
$SHELLis now set to the target shell beforeenterShellhooks run, so scripts that branch on$SHELLsee the shell the user is actually entering.- Fixed
zoxide: infinite loop detectedin the fish hook whencdis overridden to behave likez(e.g.zoxide init --cmd=cd) (#2801). - Fixed
devenv --versionanddevenv -Vfailing with'devenv' requires a subcommand but one was not provided. The flags now print the version and exit, matching the behavior ofdevenv --help(#2791). - Fixed
devenv hook fishnot activating when starting a new fish shell directly inside a project directory. The initial activation now runs on the firstfish_promptevent instead of inline duringsource, so the spawneddevenv shellinherits the real terminal as stdin instead of the closed pipe fromdevenv hook fish | source(#2798). - Fixed
devenv shellskipping the user's.zshenvwhen launching zsh, which could mangle prompts and break.zshrcconfigurations that depend on env vars defined in.zshenv. The user's.zshenvis now sourced before.zshrcduring shell init, matching zsh's documented startup order (#2802). - Fixed the bash/zsh shell hook (
devenv hook bash/zsh) re-launchingdevenv shellon every prompt redraw after the user interrupted a slow eval with Ctrl-C. The hook now caches$PWDbefore launching the subshell, so an aborted or failed activation no longer retries until the usercds away and back. - Fixed the shell hook closing the user's terminal when cd-ing out of a project directory while
DEVENV_ROOTwas exported into the outer shell (e.g. via direnv). The "exit on cd-out" path now keys off_DEVENV_HOOK_DIR, which is only set on shells the hook spawned, instead ofDEVENV_ROOTalone (#2805).
devenv shellnow registers zsh completions from packages in the devenv profile. A generated.zshenvprepends$DEVENV_PROFILE/share/zsh/site-functionstofpathbefore/etc/zshrcruns, so the systemcompinitpicks up the new directory.devenvnow walks up parent directories to finddevenv.nix, so commands likedevenv shellwork from any subdirectory of a project. The shell anddevenv shell -- <cmd>still run from the directory you invoked them in, so relative paths resolve where you expect (#2232).- Bumped
secretspectov0.10.1. The newbws(Bitwarden Secrets Manager) feature is not enabled because its transitivebitwardencrate conflicts withsqlx0.8 onlibsqlite3-sysand pinstypenumto 1.18. - Bumped
iocraftto0.8.2and switched the[patch.crates-io]entry from thecachix/iocraftfork to upstreamccbrown/iocraftmain, now that the row-level diff and stderr rendering patches are merged upstream. devenv.yamloptions are now documented insnake_case(e.g.allow_unfree,clean_env). The previouscamelCasespellings remain supported for backward compatibility.
- Fixed dynamic process port allocation reusing stale eval/build-cache entries without replaying port reservations, which could make parallel
devenv upinstances both try the same base port (#2779). - Fixed
exec_if_modifiedtask checks walking the filesystem twice per run. - Fixed
set: Tried to change the read-only variable "PWD"and"SHLVL"errors in fish afterdevenv shellreloads. - Fixed wrong background color in TUI apps (e.g. neovim) inside
devenv shell. Cells the app cleared with a custom background now keep that color instead of falling back to the terminal default. - Fixed substituter
nix-cache-infodownloads appearing at the top level by nesting them under "Configuring cachix". - Fixed TUI rendering glitches during lock validation, and nested fetch activities (e.g. tarball downloads) under "Validating lock".
- Fixed TUI freezing while Cachix finishes uploading on shell entry. Push progress is now visible during cleanup.
- Fixed Cachix push progress getting stuck at
0/N. Already-cached paths now count toward progress. - Fixed tracked path log lines showing as dot-prefixed rows under "Evaluating shell" in the TUI instead of attaching to the eval activity.
- Fixed "suspicious ownership" errors when using Nix installed in single-user mode. Nix requires read-only group permissions on outputs (#2751).
- Fixed hot reload not watching files transitively imported by
devenv.nix(e.g.imports = [ ./nested/child.nix ]). - Fixed the root
devenv.nixbeing imported twice whendevenv.yamlimported a sub-project that also had its owndevenv.yaml(#2755). - Fixed
devenv shellanddevenv buildfailing withpath '...drv' is required, but there is no substituter that can build itafter the cached derivation was garbage-collected. The stale eval-cache entry is now invalidated when its referenced store paths no longer exist, forcing a re-evaluation that re-materializes the.drvon disk. - Fixed hot reload missing file and directory changes that occurred during a build or during the brief gap between watch refreshes. The reload watcher now tracks path state (file/directory/missing) across reload cycles, queues deferred events while a build is in progress, and reconciles drift after rewatching so missed changes still trigger a follow-up rebuild.
- Fixed MCP server segfault on exit by waiting for the cache init thread to finish before exiting (#2699).
- Fixed independent one-shot tasks (e.g.
devenv:filesanddevenv:python:virtualenv) running sequentially instead of in parallel, causing unnecessary waterfall delays duringdevenv shellstartup. - Fixed
nix buildfailing withE0463: can't find crate for devenv_reloadby switching the iocraft[patch.crates-io]entry to therow-level-diffbranch, which carries iocraft 0.8.0. The previouscachixbranch was stuck at 0.7.18 so the patch no longer applied, leaving two iocraft versions in the dependency graph and causing rustc metadata hash mismatches. - Fixed
processes.<name>.watchrestarting processes multiple times for a single burst of queued file watcher events by draining the watch queue before restart (#2735). - Fixed
processes.<name>.watchrestarting processes on read-only access, directory listing, and metadata-only file events (#2734). - Fixed
importsoverriding the base project'sinputs(e.g.inputs.nixpkgs.url) instead of the base config taking precedence (#2728). - Fixed Boehm GC "Repeated allocation of very large block" warnings being printed to stderr during
devenv shell. - Fixed
devenv hooknot changing directory whencding out of a devenv project. The shell would deactivate but remain in the project directory instead of following the user to the target directory. - Fixed
devenv hook fishcausing infinite recursion / hang when entering a devenv project, because the nestedfish -cinvocation re-sourced~/.config/fish/config.fishwhich re-ran the hook. The nested fish now uses--no-config(#2741). - Fixed the Cachix daemon failing to start because the evaluated store path for the Cachix binary was never realized. It now uses the Cachix binary bundled with devenv via
PATH, falling back to evaluatingcachix.binaryonly when needed. - Fixed warning messages from Nix not being forwarded and displayed during evaluation.
- Fixed
devenv testleaving orphaned processes after test failures by ensuring processes are always stopped before propagating errors. - Fixed adding a new input to
devenv.yamlcausing all existing inputs to be re-fetched instead of only resolving the new one (#2688). - Fixed
processes.<name>.watch.pathsnot triggering process restarts because Nix paths were serialized as store paths instead of source directory paths (#2657). - Fixed cursor shape escape sequences (DECSCUSR) not being forwarded to the terminal in
devenv shell, which caused programs like neovim to not change cursor shape between modes (e.g. block in normal mode, bar in insert mode). - Fixed shift+mouse configuration (XTSHIFTESCAPE) not being forwarded to the terminal in
devenv shell. - Fixed
devenv shellhanging indefinitely when exiting the shell during a hot-reload build by interrupting the lingering Nix evaluation on shutdown. - Fixed
devenv replbroken TUI output and hanging evaluation by adding proper TUI handoff support, showing evaluation progress in the TUI before handing the terminal to the interactive REPL. - Fixed Ghostty shell integration not working in
devenv shellby sourcingghostty.bashfrom the rcfile whenGHOSTTY_RESOURCES_DIRis set. - Fixed TUI panic when expanding error details containing multi-byte UTF-8 characters (e.g. miette underlines) by using character-based truncation instead of byte-based slicing.
- Fixed
devenv:git-hooks:installin linked worktrees and submodules by updatingrollingtoprek 0.3.9, which honors repo-local and worktree-localcore.hooksPath. - Fixed
devenv processes stopremoving the process from the manager state, making it impossible to start or restart afterwards. - Fixed process exec probes failing with "No such file or directory" during
devenv testwhen a task depends on a process (e.g.after = [ "devenv:processes:postgres" ]), because the bash path was not resolved for the enterTest task runner (#2713). - Fixed processes with
restart = "never"not satisfying@completedtask dependencies, causing a hot loop and dependencies to never resolve (#2712). - Fixed the TUI hiding Nix evaluation error details and showing only a failure mark without the actual error message. Failed "Evaluating" activities now automatically fetch and display their propagated error logs (#2720).
- The TUI now shuts down ~50ms faster.
- TUI operation activities (
Configuring shell,Configuring cachix,Loading tasks, etc.) now nest under their parent activity instead of being forced to the top level. "Configuring cachix" appears as a child of "Configuring shell" (next to "Evaluating shell"), reflecting that Cachix setup runs as part of shell configuration. - "Validating lock" is now visible in the TUI by default instead of hidden behind the Debug filter.
- Sped up
devenv shellstartup on projects with many cached input paths by batching file watcher registration into a single pathset update and readiness wait, instead of reconciling the pathset once per path. This removes long hangs beforeenterShellon large inputs. - Fixed port allocation values (
config.processes.<name>.ports.<port>.value) resolving to the baseallocateport indevenv shell,devenv tasks run, and other commands. When the native process manager is running, port values now match the ports allocated bydevenv up(#2710). - Standardized keyboard shortcut notation across
devenv upTUI anddevenv shellto use consistentCtrl-Eformat instead of mixed^e/Ctrl-Alt-Estyles. macOS now showsOptinstead ofAlt(#2736). - Auto-detect AI coding agents (via
CLAUDECODE,OPENCODE_CLIENT, andAI_AGENTenvironment variables) and enable quiet mode to avoid wasting LLM tokens on TUI progress output. Override with--verbose,--tui, or setDEVENV_NO_AI_AGENT=1to disable detection entirely (#2723). - Always enable Nix's
show-tracesetting so full evaluation stack traces are shown on error, instead of a truncated trace suggesting the nonexistent--show-traceflag (#2725). - Upgraded Nix to 2.34, bringing multithreaded tarball unpacking, evaluator performance improvements, and REPL enhancements.
- Added
require_versionfield todevenv.yamlto enforce a devenv CLI version. Set totrueto match the modules version, or use a constraint string like">=2.1"(#2391). - Added Ctrl-X keybinding to stop individual processes from the TUI while keeping them visible and restartable.
- Added Ctrl-H keybinding to toggle hiding stopped processes in the TUI. Failed processes remain visible, and the process count shows how many are hidden (#2692).
- Tasks can now display messages when entering the shell by writing
{"devenv":{"messages":["..."]}}to$DEVENV_TASK_OUTPUT_FILE(#2500). - Added
devenv hook <shell>for native directory based auto-activation without direnv. Supports bash, zsh, fish, and nushell. Automatically deactivates when you leave the project directory. Addeval "$(devenv hook bash)"to your shell config to activate. Usedevenv allowanddevenv revoketo manage trust (#2488). - Shell environment now auto-reloads at the next prompt when watched files change, instead of requiring a manual Ctrl-Alt-R keybind (#2595).
- Added
nixpkgs.rocmSupportoption to enable ROCm support in nixpkgs configuration. - Added process management subcommands and MCP tools:
devenv processes list,status,logs,restart,start,stopfor interacting with running native processes (#2621). - Added
--modeflag todevenv up/devenv processes upto control dependency resolution for process tasks. Supportssingle,before,after, andallmodes, matchingdevenv tasks run --mode. Defaults toall, sodevenv upstarts all processes by default (#2721). - Added OpenTelemetry OTLP trace export support via
--trace-to(otlp-grpc,otlp-http-protobuf,otlp-http-json) with configurable endpoints or standardOTEL_*environment variables. OTLP spans include rich attributes (devenv.activity.kind,devenv.derivation_path,devenv.url,devenv.fetch.kind) and outcome tracking (devenv.outcome,otel.status_code). Enabled by default with theotlp-grpccargo feature;otlp-http-protobufandotlp-http-jsonare opt-in (#2415). - Added OTEL trace context propagation to subprocesses: tasks, shell commands, and processes automatically receive
TRACEPARENT/TRACESTATEenvironment variables when OTLP export is enabled, allowing instrumented child processes to join the same trace (#2415). - Added
--trace-tounified tracing flag with[format:]destinationsyntax, supporting multiple simultaneous outputs (e.g.--trace-to pretty:stderr --trace-to json:file:/tmp/trace.json). Also available asDEVENV_TRACE_TOenv var (comma-separated). Legacy--trace-output/--trace-formatflags are still supported but hidden.
devenv tasks run: The default execution mode is nowbeforeinstead ofsingle, so task dependencies declared viabefore/afterare respected by default. Runningdevenv tasks run admin:deploynow also runs any tasks thatadmin:deploydepends on. Use--mode singleto restore the previous behavior of running only the specified task (#2551).- Calling
devenvwithout a command now shows the help text. This used to print the version. Usedevenv versionordevenv --versioninstead.
- Fixed task cache initialization failing with "unable to open database file" when the state directory does not yet exist.
- Fixed Cachix daemon log output leaking into and corrupting the TUI display by capturing daemon stderr and forwarding it through the push activity (#2648).
- Fixed
devenv testhanging when a process outputs non-UTF-8 bytes by using lossy UTF-8 decoding instead of closing the pipe, which caused a deadlock between the parent waiting for the child to exit and the child blocking on a full stdout pipe (#2590). - Fixed hot reload sometimes picking up stale configuration or crashing due to the old Nix evaluator not being fully cleaned up before creating a new one. Errors during reload are now reported instead of silently breaking subsequent evaluations.
- Fixed
DEVENV_TUI=falseandDEVENV_TUI=0not disabling the TUI (#2646). - Migrated
certificatesandhostsmodules to use tasks instead ofprocess.manager.before/process.manager.afterfor the native process manager (#2569). - Fixed stale shell eval cache entries causing
devenv shellanddirenvactivation to ignore changes todevenv.nixconfig such aslanguages,env,packages, andscripts(#2643). - Fixed services failing to start with E2BIG when the shell environment is large by moving env/cwd/stdio setup from the bash wrapper script to the spawned process directly (#2638).
- Fixed processes failing to start when exported bash functions are present in the environment (#2587).
- Fixed eval cache storing inconsistent port allocations across different cached attributes (#2631).
- Fixed stale eval cache invalidation for
devenv upprocess config changes caused by overlapping evaluations clearing each other's file dependency observers (#2632). - Fixed strict port restarts failing with "port already in use" when the kernel hasn't released the socket yet after process shutdown, by distinguishing ownerless transient conflicts from real ones and retrying accordingly (#2647).
- Fixed false-positive
--strict-portsfailures on macOS when IPv6 loopback binding returns a benign error after a clean shutdown and cache invalidation (#2640). - Fixed child processes being left running on shutdown when using non-native process managers like process-compose (#2586).
- Fixed
devenv updateresolving stale revisions when Nix's fetcher cache contains outdated entries by settingtarball-ttlto 0 during update, equivalent tonix --refresh(#2616). - Fixed Nix backend initialization crash when
impure: trueby removing use of nonexistentimpureNix setting; impure mode now works by skippingpure-eval(which defaults to false). - Fixed
execIfModifiedglob walker entering gitignored directories, causing extreme slowdowns in repos with large ignored trees (#2588). - Fixed
devenv up -dnot keeping processes running with the native process manager by spawning a daemon via re-exec instead of fork, which is unsafe in multithreaded programs (#2630). - Fixed environment variable precedence in process manager: per-process env now correctly wins over global env.
- Fixed hot reload triggering a fork bomb by ignoring file change events while a build is already in progress, preventing cascading zombie builds.
- The TUI now shows a "stopping" status during graceful process shutdown (#2647).
- Process
stop_all()now stops processes concurrently instead of serially (#2647). --quietnow disables the TUI and suppresses all output except warnings and errors (#2617).- Bumped Nix input to fix
devenv shellfailing with "suspicious ownership or permission" on single user Nix installations where umask causes store outputs to have incorrect permissions (#2585). - Bumped iocraft to use row level diff rendering (ccbrown/iocraft#179), reducing TUI flicker.
- Containers now report all missing inputs at once instead of one at a time (#2598).
- Extracted container, search, and gc methods from
devenv.rsinto separate submodule files for better code organization. - Added
allowUnsupportedSystemoption fordevenv.yamlto allow packages not supported on the current system. Can be set at the top level, undernixpkgs, or per platform vianixpkgs.per-platform.<system>(#2639). - Added new nixpkgs config options to
devenv.yaml:allowNonSource,allowlistedLicenses,blocklistedLicenses, andandroidSdk.acceptLicense(#2634). - Added
allowInsecurePredicategeneration frompermittedInsecurePackagesso insecure package allowlisting works correctly.
process.manager.before/process.manager.after: These options are no longer supported with the native process manager. Use tasks withbefore/afterdependencies instead. See the tasks documentation.
- Show a quit prompt on the first Ctrl-C in the TUI instead of immediately terminating (#2607).
- Patched Nix to avoid hitting GitHub rate limits when fetching flake inputs (upstreamed as NixOS/nix#15470).
- Improved eval performance by caching the initial Nix Value, avoiding re-evaluation of nixpkgs and the module system on subsequent attribute lookups (~2x time-to-shell improvement).
devenv-run-tests:--onlyand--excludenow support glob patterns (e.g.--only 'python-*').- Added Fish and Nushell support for interactive devenv sessions (
--shell fish,--shell nu).
- Fixed
devenv testnot runningenterTesttasks (e.g.,git-hooks:run) in devenv 2.0+. Also:devenv testnow fails early when enterTest tasks fail, and skips redundantload_tasks()when tasks are already handled. - Fixed file watcher dropping change events during the initial bootstrap file flood by switching from
try_sendto backpressure, which causeddevenv.nixchanges to go undetected during hot reload. - Fixed
exec_if_modifiedperformance when negation patterns were used, avoiding a full walk of the parent directory for literal file paths. - Fixed child processes (postgres, redis, etc.) being left running after
devenv upexits ordevenv processes downis called. The native manager wrapper now forwards TERM/INT signals to the child process group, and the process-compose backend creates a proper process group for signaling (#2619). - Fixed SecretSpec prompting for secrets in non-interactive contexts like direnv.
- Fixed
devenv searchshowing truncated package names (e.g.pkgs.instead ofpkgs.ncdu). - Fixed runtime directory path (
devenv-<hash>) being inconsistent on macOS when paths contain symlinks (e.g./tmpvs/private/tmp), which could cause processes to look for sockets in the wrong directory. - Fixed TUI hanging when the backend encounters an error in the PTY shell path (e.g. Nix evaluation failure).
- Fixed
nix runtrying to rundevenv-wrappedwhich doesn't exist. - Fixed in-band resize events being sent to the shell when the app did not opt-in to receiving them.
- Fixed a nixpkgs packaging error that caused macOS builds of devenv to include two conflicting copies of the Boehm GC (#2552, #2576).
- Fixed
devenv init,devenv test, and SecretSpec hint messages being silently dropped due to a missing user-message marker.
- Fixed
filesand other task-based features not working via direnv in devenv v2 becausedevenv direnv-exportdid not run enterShell tasks (#2602). - Fixed
devenv shellhanging in certain CI environments by requiring both stdin and stdout to be a real terminal before launching the PTY reload shell (#2597). - Added a timeout to the terminal cursor position query to prevent hangs in PTY environments that don't respond to DSR queries.
- Fixed process dependencies not being respected in the native process manager (#2554).
- Fixed
execIfModifiedtask cache not invalidating when a previously watched file is deleted, renamed, or moved outside the glob pattern (#2577). - Fixed task exports (e.g.
VIRTUAL_ENV,PATHfrom venv) not being set in the reload shell. - Fixed port allocation not detecting ports bound to
0.0.0.0or[::], causing multiple devenv instances to allocate the same port (#2567). - Fixed cursor position requests not being passed through in the shell (#2570).
- Fixed "Threads explicit registering is not previously enabled" crash on some Nix versions by calling
GC_allow_register_threads()afterlibexpr_init()(#2576). - Fixed
-O packages:pkgscausing infinite recursion by using NixOS module system merging instead of self-referencingconfig.packages. - Fixed
--cleanshell environment capture keeping all host variables except the keep list (inverted filter). - Fixed
devenv searchoutput being drawn directly to stdout over the TUI. - Fixed the shell not forwarding several terminal escape sequences (DA2, DA3, XTVERSION, DCS, DECRQM, Kitty keyboard protocol, XTMODIFYOTHERKEYS, mouse modes, and color scheme reporting), which broke TUI programs like neovim and helix.
- Fixed the shell not cleaning up Kitty keyboard protocol and XTMODIFYOTHERKEYS state on exit, which left the terminal in a broken state after a program crash.
- Fixed the shell not sending in-band resize notifications (mode 2048) through the PTY, which caused programs that rely on this protocol to miss resize events.
- Fixed the shell forwarding text area size queries (CSI 18 t) to the real terminal, which returned incorrect dimensions that included the status line row.
- Fixed the devenv main thread and REPL thread using the default stack size instead of 64MB, which could cause stack overflows during deep Nix evaluations.
- Fixed TUI sometimes overwriting the shell prompt/command line after commands like
devenv update, caused by cancelling iocraft's render loop mid-frame.
- Added
strictPortsoption todevenv.yamlfor configuring strict port mode as a project default, along with--no-strict-portsCLI flag to override it (#2606). - Bumped SecretSpec to 0.8.0 and enabled all provider features (Google Cloud Secret Manager, AWS Secrets Manager, HashiCorp Vault).
- Replaced the stdout-based
DEVENV_EXPORT:protocol in tasks with file-based exports ($DEVENV_TASK_EXPORTS_FILE), simplifying the encoding and moving JSON construction into Rust. - Task exports are now always produced, including when a task is skipped via its
statuscommand. - Validation errors for
@readyprocess dependencies now include a link to the documentation.
- Removed
devenv-tasks exportsubcommand, replaced by file-based exports via$DEVENV_TASK_EXPORTS_FILE.
- Fixed
devenv testconflicting with older pinned devenv modules that setdevenv.statewithoutlib.mkDefault. - Removed debug watchexec logs from showing up in
--no-reloadshells. - Fixed TUI colors being unreadable on light terminal backgrounds.
- Disabled the PTY in non-interactive environments (CI) preventing the shell from hanging.
- Fixed
navigateExclusion ranges overlaperror in the Nix backend (#2552). - Increased thread stack size to 64MB to prevent stack overflows during deep Nix evaluations (#2555).
- Fixed
devenv testnot using the eval cache due to a temporary state directory being created on every run. - Fixed TUI overflow being sent to scrollback instead of being clipped.
- Fixed first Esc keypress being swallowed in shell reload mode (#2548).
- Fixed TUI displaying incorrect expected download count.
- Fixed TCP readiness probes only checking IPv4, causing hangs when processes bind to IPv6 loopback (#2549).
- Fixed TUI panic when navigating up/down with many processes (#2542).
- Fixed exec readiness probes not inheriting the process environment (e.g.
PGDATA,PGHOST), causing probes to always fail.
- TUI now displays the readiness probe type when a process is in the starting state (e.g.
starting (exec: pg_isready)orstarting (http: localhost:8080/health)).
This is a major release with significant architectural changes. devenv 2.0 introduces a native Rust process manager, a full terminal UI, hot-reload for shell environments, automatic port allocation, an eval caching layer, and many more improvements. See the migration guide for detailed upgrade instructions.
- Native process manager is now the default. The built-in Rust process manager replaces process-compose as the default for
devenv up. If you rely on process-compose features, setprocess.manager.implementation = "process-compose";in yourdevenv.nix. devenv buildnow returns JSON output instead of plain store paths. Scripts that parse the output need to be updated, for example usingjqto extract values.--log-formatCLI flag is removed. Use--trace-outputand--trace-formatinstead for controlling log output.devenv container --copy <name>is removed. Use the subcommand formdevenv container copy <name>instead.devenv container --registryoption is removed fromcontainer run.git-hooksinput is no longer included by default. If you usegit-hooks.hooks, add the input explicitly in yourdevenv.yaml.- The
devenv-generatecrate is removed from the workspace. devenv testno longer overrides.devenvby default. The.devenvdirectory is preserved across test runs to allow eval cache to persist. Use--override-dotfileto opt-in to temporary directory isolation. The--dont-override-dotfileflag is kept as a hidden no-op for backward compatibility.
- New terminal UI is enabled by default. devenv now displays a rich, interactive progress view for all operations. The TUI shows evaluation progress, build/download status, task execution, and process output in a structured tree view.
- Activity hierarchy with nested evaluation, build, and download tracking.
- Expandable log views for activities and processes (Ctrl-E to expand).
- Text selection and OSC 52 clipboard copy in expanded log view.
- Keyboard navigation with up/down arrows to select activities.
- Mouse scroll support in expanded view.
- Process output prefixed with
|for clear visual separation. - Running process count displayed in the status line.
- Millisecond-precision timestamps for completed activities.
- Completion checkmarks for finished activities.
- Automatically expanded logs for failed activities.
- The TUI is automatically disabled in CI environments and when trace output is set to stdout/stderr.
--tuiand--no-tuiflags for explicit control.
- Built-in Rust process manager with full supervisor state machine.
- Unified
readyoption for processes and tasks:ready.execfor command-based readiness checks.ready.http.getfor HTTP health probes.ready.tcpfor TCP port probes.ready.notifyfor sd_notify (READY=1) protocol.
- Unified
restartoption withon("never","always","on_failure"),maxrestart count, andwindowfor rate limiting. - Watchdog heartbeat and timeout extension support for the sd_notify protocol.
processes.<name>.linux.capabilitiesoption for granting specific Linux capabilities (e.g.,net_bind_service).processes.<name>.envoption for declarative per-process environment variables.processes.<name>.cwdoption for setting the working directory.- Startup timeout and rate limit configuration.
- File watching with configurable throttle for automatic process restarts.
- Process output streaming to TUI with tail display.
- Automatic
execwrapping for proper SIGTERM signal handling.
- All service modules now use automatic port allocation by default, eliminating port conflicts between projects.
- Port allocations are cached and replayed through the eval cache for deterministic rebuilds.
- Allocated ports are displayed in the TUI alongside process activities.
- Strict mode rejects in-use ports during cache replay.
- Transparent caching for Nix evaluation results. The eval cache stores and replays evaluation outputs, speeding up repeated
devenv shellanddevenv upinvocations. - File and environment dependency tracking for automatic cache invalidation.
- Support for caching resource allocations (ports) with replay validation.
- Detection of changes to unlocked inputs.
- Configurable via
--eval-cache/--no-eval-cacheflags.
devenv shellnow supports hot-reload. Whendevenv.nixor tracked files change, the shell environment is automatically re-evaluated and updated without restarting the shell session.- Status line showing reload progress with elapsed time and error toggle.
- Ctrl-Alt-D shortcut to pause/resume file watching.
- Direnv-style environment diffing for clean reloads.
- Scroll region support to keep the status line visible.
devenv eval <attribute>: Evaluate devenv.nix attributes and return results as JSON.devenv lsp: Launch the nixd language server with devenv-specific configuration for IDE integration. Provides hover, completion, and diagnostics fordevenv.nixfiles.devenv tasks list: Lists tasks with entry points at the top level, matching the TUI hierarchy.
--inputand--input-jsonCLI flags for passing inputs to tasks.--refresh-task-cacheflag to force task re-execution.- Soft dependencies with
@completesuffix:after = [ "devenv:processes:cleanup@complete" ]waits for exit regardless of success/failure. - Per-task
envoption for declarative environment variables. enterShelltasks now run with TUI display before shell entry.enterShelltask failures are non-fatal by default.- Failed tasks are no longer cached when using
execIfModified. - Dynamic task name completion for bash, zsh, and fish shells.
- Task hierarchy visualization in the TUI via dependency edges.
- Tasks can run inside PTY shells for commands that require a terminal.
- Proper CWD validation before spawning tasks.
- HTTP transport support via
--httpflag for the MCP server. - HTTP headers support for authentication.
- Package search now covers all packages instead of only "cachix".
- Default MCP server configured at
mcp.devenv.sh.
- Simplified
.envrcsetup with singledevenv direnv-exportcommand. - TUI support when running inside direnv.
--secretspec-providerand--secretspec-profileCLI flags.- Git revision shown in
devenv versionoutput. - The Nix backend now uses C FFI bindings for direct API access, eliminating subprocess spawning.
- Fixed process duplication when using
before/afterwith process-compose. - Fixed circular dependency in env vars with conditional processes (process-compose).
- Fixed infinite recursion in default settings for Kafka, Kafka Connect, and Keycloak services.
- Fixed terminal hang on Ctrl-C during shell building.
- Fixed missing prompt after task execution in shell.
- Fixed relative path inputs with
..components. - Fixed
devenv.local.nixloading from imported directories. - Fixed
devenv.cli.versionallowing null for flakes integration. - Fixed
TMPDIRseparation fromDEVENV_RUNTIMEto avoid pollutingXDG_RUNTIME_DIR. - Fixed PATH preservation in shell and direnv environments.
- Fixed cursor position preservation after Ctrl-L clear in shell.
- Fixed eval cache handling of percent-encoded characters in database paths.
- Fixed changelog generation when assemble fails during
devenv update. - Fixed profile state isolation in separate directories.
- Fixed processes preventing infinite recursion when conditionally defining processes.
- Fixed load-exports permission error when file is owned by a different user.
- Fixed
-O packages:pkgsreplacing all packages instead of appending. Thepkgstype now appends to existing packages by default. Usepkgs!to force-replace the entire list.