Specify language version (available for some languages)
languages.python.version = "3.11.3";
languages.ruby.version = "3.2.1";
languages.rust.channel = "stable";
Use custom package instead of default
languages.go.package = pkgs.go_1_21;
languages.java.jdk.package = pkgs.jdk17;
Read version from file (Ruby, Python)
languages.ruby.versionFile = "./.ruby-version";
languages.python.versionFile = "./.python-version";
Configure LSP, debugger, linter, formatter (devenv 1.8+)
languages.rust.dev = {
lsp.enable = true;
debugger.enable = true;
linter.enable = true;
formatter.enable = true;
};
languages.rust = {
enable = true;
channel = "stable"; # or "nightly", "beta"
components = [ "rustc" "cargo" "clippy" "rustfmt" "rust-analyzer" ];
targets = [ "wasm32-unknown-unknown" ];
};
outputs.rust-app = config.languages.rust.import ./rust-app {};
languages.go = {
enable = true;
package = pkgs.go_1_22;
};
outputs.go-app = config.languages.go.import ./go-app {};
languages.c.enable = true;
languages.cplusplus.enable = true;
languages.zig = {
enable = true;
package = pkgs.zig;
zls.package = pkgs.zls;
};
languages.nim = {
enable = true;
package = pkgs.nim;
};
languages.odin = {
enable = true;
package = pkgs.odin;
};
languages.v = {
enable = true;
package = pkgs.vlang;
};
languages.python = {
enable = true;
version = "3.12";
uv.enable = true;
uv.sync.enable = true;
};
languages.python = {
enable = true;
poetry = {
enable = true;
install.enable = true;
install.allExtras = true;
};
};
outputs.python-app = config.languages.python.import ./python-app {};
languages.ruby = {
enable = true;
version = "3.3.0";
bundler.enable = true;
};
languages.php = {
enable = true;
package = pkgs.php83;
extensions = [ "opcache" "redis" ];
};
languages.perl.enable = true;
languages.lua.enable = true;
languages.java = {
enable = true;
jdk.package = pkgs.jdk21;
maven.enable = true;
gradle.enable = true;
};
languages.kotlin.enable = true;
languages.scala = {
enable = true;
package = pkgs.scala_3;
sbt.enable = true;
};
languages.clojure.enable = true;
languages.haskell = {
enable = true;
languageServer = pkgs.haskell-language-server;
stack = {
enable = true;
args = [ "--no-nix" "--system-ghc" "--no-install-ghc" ];
};
};
languages.ocaml = {
enable = true;
packages = pkgs.ocaml-ng.ocamlPackages_5_1;
};
languages.elixir.enable = true;
languages.erlang.enable = true;
languages.elm.enable = true;
languages.purescript = {
enable = true;
package = pkgs.purescript;
};
languages.gleam.enable = true;
languages.idris = {
enable = true;
package = pkgs.idris2;
};
languages.lean4 = {
enable = true;
package = pkgs.lean4;
};
languages.unison.enable = true;
languages.javascript = {
enable = true;
package = pkgs.nodejs_22;
npm.enable = true;
npm.install.enable = true;
};
languages.javascript = {
enable = true;
pnpm.enable = true;
pnpm.install.enable = true;
};
languages.javascript = {
enable = true;
bun.enable = true;
bun.install.enable = true;
};
languages.javascript = {
enable = true;
yarn.enable = true;
yarn.install.enable = true;
};
languages.javascript = {
enable = true;
corepack.enable = true;
};
languages.typescript.enable = true;
languages.deno.enable = true;
languages.nix = {
enable = true;
lsp.package = pkgs.nil; # or pkgs.nixd
};
languages.swift.enable = true;
languages.crystal.enable = true;
languages.dart.enable = true;
languages.r.enable = true;
languages.julia.enable = true;
languages.fortran.enable = true;
languages.pascal = {
enable = true;
lazarus.enable = true;
};
languages.raku.enable = true;
languages.racket.enable = true;
languages.standardml.enable = true;
languages.solidity = {
enable = true;
package = pkgs.solc;
};
languages.terraform.enable = true;
languages.opentofu.enable = true;
languages.ansible = {
enable = true;
package = pkgs.ansible;
};
languages.helm = {
enable = true;
languageServer.enable = true;
};
languages.cue = {
enable = true;
package = pkgs.cue;
};
languages.jsonnet.enable = true;
languages.typst = {
enable = true;
fontPaths = [ "${pkgs.roboto}/share/fonts/truetype" ];
};
languages.texlive.enable = true;
languages.gawk.enable = true;
languages.shell.enable = true;
languages.robotframework.enable = true;
languages.vala.enable = true;
languages.dotnet.enable = true;
What type of project are you building?
Use Rust, Go, Zig, or C/C++
Use JavaScript/TypeScript, Python, Ruby, Go, or Rust
Use JavaScript/TypeScript with npm/pnpm/bun
Use Python with uv or poetry
Use Haskell, OCaml, Elixir, or Gleam
Use Java, Kotlin, or Scala with gradle/maven/sbt
Use Terraform, OpenTofu, Ansible, or Nix
Which JavaScript/TypeScript package manager to use?
Match existing lock file (package-lock.json=npm, pnpm-lock.yaml=pnpm, yarn.lock=yarn, bun.lockb=bun)
Use pnpm or bun
Use npm (most widely supported)
Use pnpm or yarn with workspaces
Use corepack.enable with packageManager in package.json
Should you use devenv or pure Nix flakes?
Use devenv - services. is simpler
Use devenv - git-hooks integration built-in
Use devenv - process-compose integration
Use devenv - languages. handles versions
Use flakes - devenv adds overhead
Use flakes - devenv is for dev environments
services.mysql = {
enable = true;
package = pkgs.mysql80;
initialDatabases = [{ name = "myapp"; }];
};
services.mongodb = {
enable = true;
};
services.redis = {
enable = true;
port = 6379;
};
services.memcached = {
enable = true;
};
services.minio = {
enable = true;
};
services.elasticsearch = {
enable = true;
};
services.opensearch = {
enable = true;
};
services.kafka = {
enable = true;
};
services.caddy = {
enable = true;
};
services.varnish = {
enable = true;
vcl = ''
vcl 4.0;
backend default {
.host = "127.0.0.1";
.port = "8080";
}
'';
};
services.mailpit.enable = true;
What type of storage/service do you need?
Use postgres or mysql
Use mongodb
Use redis or memcached
Use minio
Use elasticsearch or opensearch
Use rabbitmq or kafka
Use nginx or caddy
Use mailhog or mailpit
Linters
eslint.enable = true;
clippy.enable = true;
shellcheck.enable = true;
Security
detect-private-keys.enable = true;
check-merge-conflicts.enable = true;
Git hygiene
check-case-conflicts.enable = true;
editorconfig-checker.enable = true;
};
git-hooks.hooks.my-custom-hook = {
enable = true;
name = "my-custom-hook";
entry = "${pkgs.bash}/bin/bash -c 'echo Running custom hook'";
files = "\.nix$";
pass_filenames = true;
};
Nix code formatter (RFC style)
JavaScript/TypeScript/CSS/HTML formatter
Python code formatter
Rust code formatter
Haskell code formatter
Go code formatter
JavaScript/TypeScript linter
Rust linter
Shell script linter
YAML linter
GitHub Actions linter
Dockerfile linter
Markdown linter
Prevent committing private keys
Prevent committing merge conflicts
Detect case conflicts in filenames
Check editorconfig compliance
Universal formatter via treefmt
With description
deploy = {
exec = "kubectl apply -f k8s/";
description = "Deploy to Kubernetes";
};
Using packages
migrate = {
exec = "${pkgs.dbmate}/bin/dbmate up";
description = "Run database migrations";
};
};
processes = {
web = {
exec = "npm run dev";
process-compose = {
depends_on.api.condition = "process_healthy";
readiness_probe = {
http_get = {
host = "localhost";
port = 3000;
};
};
};
};
api = {
exec = "cargo run";
process-compose = {
readiness_probe = {
http_get = {
host = "localhost";
port = 8080;
path = "/health";
};
};
};
};
};
dotenv.enable = true;
dotenv.filename = ".env.local";
outputs = {
rust-app = config.languages.rust.import ./rust-app {};
python-app = config.languages.python.import ./python-app {};
go-app = config.languages.go.import ./go-app {};
};
}
profiles = {
"python-3.11".config = {
languages.python.version = "3.11";
};
"python-3.10".config = {
languages.python.version = "3.10";
};
};
}
devenv shell --profile python-3.11
profiles = {
backend.module = {
languages.rust.enable = true;
services.postgres.enable = true;
services.redis.enable = true;
};
frontend.module = {
languages.javascript.enable = true;
languages.typescript.enable = true;
};
fullstack.extends = [ "backend" "frontend" ];
};
}
user."developer".module = {
packages = [ pkgs.gh ];
};
};
}
languages = {
javascript = {
enable = true;
package = pkgs.nodejs_22;
pnpm.enable = true;
};
typescript.enable = true;
};
services = {
postgres = {
enable = true;
initialDatabases = [{ name = "app_dev"; }];
};
redis.enable = true;
};
processes = {
frontend.exec = "pnpm dev";
api.exec = "pnpm api:dev";
};
scripts = {
db-migrate.exec = "pnpm db:migrate";
db-seed.exec = "pnpm db:seed";
};
git-hooks.hooks = {
prettier.enable = true;
eslint.enable = true;
};
}
packages = [ pkgs.nixfmt-rfc-style ];
git-hooks.hooks = {
nixfmt-rfc-style.enable = true;
editorconfig-checker.enable = true;
};
}
What type of project are you setting up?
Use minimal_config pattern
Use full_stack pattern
Use nix_project pattern
Use profiles with team modules
Hardcoding specific package versions instead of using version options
Use languages.
.version or languages.
.package with nixpkgs packages
Use languages.*.enable instead of adding language packages directly to packages list
/cachix/devenv
9.7
1354
Fetch specific language configuration options
Fetch service configuration details
Fetch available pre-commit hooks
Fetch packaging patterns
Fetch profile configuration (1.9+)
Missing optional configuration attribute
Note in output, suggest improvement
Service configuration incomplete or enterShell too slow
Document issue, suggest refactoring approach
Configuration fails to evaluate or services fail to start
Debug with devenv info, present options to user
Security issue in configuration (secrets exposed, unsafe permissions)
Block operation, require explicit user acknowledgment
Finding existing devenv configurations and patterns
Evaluating devenv architecture and service dependencies
Reviewing devenv configuration for security issues
Nix language fundamentals, flakes, Home Manager (devenv uses Nix)
Symbol operations for navigating devenv configurations
Fetch latest devenv documentation