Convert Figma logo to code with AI

cachix logodevenv

Fast, Declarative, Reproducible, and Composable Developer Environments using Nix

6,763
487
6,763
331

Top Related Projects

A fast, persistent use_nix/use_flake implementation for direnv [maintainer=@Mic92 / @bbenne10]

Per project developer environments

Simplified nix packaging for various programming language ecosystems [maintainer=@DavHau]

16,817

Nix, the purely functional package manager

Quick Overview

Devenv is a powerful, declarative developer environment manager. It allows developers to create reproducible, project-specific development environments using Nix, without requiring deep knowledge of Nix itself. Devenv aims to simplify the process of setting up and managing development environments across different projects and team members.

Pros

  • Reproducible environments across different machines and team members
  • Declarative configuration using a simple YAML-like syntax
  • Integrates well with existing tools and workflows
  • Supports a wide range of languages and frameworks out of the box

Cons

  • Requires Nix to be installed on the system
  • Learning curve for those unfamiliar with declarative environment management
  • May have performance overhead compared to native system installations
  • Limited documentation for advanced use cases

Code Examples

  1. Basic Python environment:
{ pkgs, ... }:

{
  packages = [ pkgs.python3 pkgs.poetry ];

  enterShell = ''
    echo "Welcome to the Python development environment!"
  '';
}
  1. Node.js environment with specific version:
{ pkgs, ... }:

{
  packages = [
    pkgs.nodejs-16_x
    pkgs.yarn
  ];

  env.NODE_ENV = "development";
}
  1. Multi-language environment with PostgreSQL:
{ pkgs, ... }:

{
  packages = [
    pkgs.go
    pkgs.ruby
    pkgs.postgresql
  ];

  services.postgres.enable = true;

  env.DATABASE_URL = "postgresql://postgres@localhost:5432/myapp";
}

Getting Started

  1. Install Nix and enable flakes:

    sh <(curl -L https://nixos.org/nix/install) --daemon
    echo "experimental-features = nix-command flakes" >> ~/.config/nix/nix.conf
    
  2. Install devenv:

    nix-env -if https://github.com/cachix/devenv/tarball/latest
    
  3. Create a devenv.nix file in your project root with your desired configuration.

  4. Run devenv init to generate a .envrc file for direnv integration.

  5. Enter the development environment:

    devenv shell
    

Competitor Comparisons

A fast, persistent use_nix/use_flake implementation for direnv [maintainer=@Mic92 / @bbenne10]

Pros of nix-direnv

  • Lightweight and focused on integrating Nix with direnv
  • Seamless integration with existing direnv workflows
  • Supports caching of Nix-shell environments for faster loading

Cons of nix-direnv

  • Limited to direnv functionality, less comprehensive development environment setup
  • Requires manual configuration of Nix expressions for project dependencies
  • Less user-friendly for those unfamiliar with Nix syntax

Code Comparison

nix-direnv:

use nix

devenv:

{ pkgs, ... }:
{
  packages = [ pkgs.hello ];
  enterShell = ''
    hello
  '';
}

Key Differences

  1. Scope: nix-direnv focuses on integrating Nix with direnv, while devenv provides a more comprehensive development environment solution.

  2. Configuration: nix-direnv requires manual Nix expression configuration, whereas devenv offers a higher-level abstraction for environment setup.

  3. Learning Curve: nix-direnv may be easier for users already familiar with direnv and Nix, while devenv aims to simplify the process for newcomers.

  4. Features: devenv includes additional features like process management and service integration, which are not present in nix-direnv.

  5. Flexibility: nix-direnv provides more flexibility in terms of Nix usage, while devenv offers a more opinionated and structured approach to development environments.

Per project developer environments

Pros of devshell

  • Lighter weight and more focused on shell environments
  • Easier to integrate with existing Nix projects
  • More flexible for customizing shell prompts and environment variables

Cons of devshell

  • Less comprehensive development environment management
  • Fewer built-in features for managing project dependencies
  • Limited support for non-Nix workflows

Code Comparison

devshell:

{ pkgs ? import <nixpkgs> {} }:
pkgs.devshell.mkShell {
  imports = [ (pkgs.devshell.importTOML ./devshell.toml) ];
}

devenv:

{ pkgs, ... }:
{
  packages = [ pkgs.hello ];
  languages.python.enable = true;
  processes.web.exec = "python -m http.server";
}

devshell focuses on creating customized shell environments, while devenv provides a more comprehensive development environment setup. devshell is better suited for projects already using Nix, offering flexibility in shell customization. devenv, on the other hand, offers a broader range of features for managing development environments, including language-specific tools and process management, making it more accessible for users less familiar with Nix.

Simplified nix packaging for various programming language ecosystems [maintainer=@DavHau]

Pros of dream2nix

  • Broader scope, aiming to support multiple languages and ecosystems
  • More flexible and customizable for complex project setups
  • Provides a framework for creating custom builders and importers

Cons of dream2nix

  • Steeper learning curve due to its more complex nature
  • Less opinionated, requiring more configuration for basic setups
  • May have slower development cycles for simple projects

Code Comparison

dream2nix:

{
  inputs.dream2nix.url = "github:nix-community/dream2nix";
  outputs = { self, dream2nix }:
    dream2nix.lib.makeFlakeOutputs {
      systems = ["x86_64-linux"];
      config.projectRoot = ./.;
      source = ./.;
    };
}

devenv:

{ pkgs, ... }:
{
  packages = [ pkgs.nodejs ];
  enterShell = ''
    echo "Welcome to the development environment!"
  '';
}

dream2nix offers a more complex but flexible configuration, while devenv provides a simpler, more opinionated approach. dream2nix is better suited for projects requiring extensive customization across multiple languages, whereas devenv excels in quickly setting up consistent development environments with less configuration overhead.

16,817

Nix, the purely functional package manager

Pros of nix

  • More mature and established project with a larger community
  • Offers a complete package management and system configuration solution
  • Provides reproducible builds across different environments

Cons of nix

  • Steeper learning curve due to its unique approach and custom language
  • Can be complex to set up and configure for newcomers
  • Less focused on development environments specifically

Code Comparison

nix:

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  buildInputs = [ pkgs.nodejs pkgs.yarn ];
}

devenv:

{ pkgs, ... }:
{
  packages = [ pkgs.nodejs pkgs.yarn ];
}

Key Differences

  • devenv focuses specifically on development environments, while nix is a more comprehensive system
  • devenv aims to simplify the configuration process compared to nix
  • nix offers more flexibility and power, but devenv provides a more streamlined experience for development setups

Use Cases

  • Choose nix for complete system management and complex build configurations
  • Opt for devenv when setting up isolated development environments quickly and easily

Community and Support

  • nix has a larger, more established community with extensive documentation
  • devenv is newer but growing, with a focus on user-friendly documentation and examples

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

devenv logo

devenv.sh - Fast, Declarative, Reproducible, and Composable Developer Environments

Built with devenv Built with Nix Discord channel License: Apache 2.0 Version CI

Features

Developer experience

Languages, packages, and services

  • 50+ languages with built in tooling: compilers, LSP servers, formatters, linters, and version selection
  • 100,000+ packages from Nixpkgs for Linux, macOS, x64, and ARM64 (including WSL2)
  • 40+ services like PostgreSQL, Redis, MySQL, MongoDB, Elasticsearch, Caddy, and more

Processes and tasks

  • Native process manager written in Rust with dependency ordering, restart policies, readiness probes (exec, HTTP, systemd notify), socket activation, watchdog heartbeats, and file watching
  • Automatic port allocation that finds free ports so parallel environments never collide
  • Tasks with DAG based execution, caching, parallel runs, and namespace support
  • Scripts with access to all environment packages

Packaging and deployment

  • OCI containers built from your environment without Docker
  • Outputs for packaging apps using each language's best tools (crate2nix, uv2nix, ...)
  • Polyrepo support to reference outputs and options across repositories

Composition and configuration

  • Profiles for environment variants (--profile backend --profile testing)
  • Composable via imports to share and reuse environments across projects
  • Inputs for pinning and overriding Nix dependencies

Security and integrations

  • SecretSpec for declarative, provider agnostic secrets management (keyring, 1Password, dotenv)
  • Git hooks via git-hooks.nix with pre configured formatters and linters
  • Testing with devenv test that automatically starts and stops processes
  • direnv integration for automatic shell activation when entering a directory
  • MCP server for AI assistant integration (package and option search)
  • AI generation to scaffold environments from a natural language description

Quick start

Running devenv init generates devenv.nix:

{ pkgs, lib, config, inputs, ... }:

{
  # https://devenv.sh/basics/
  env.GREET = "devenv";

  # https://devenv.sh/packages/
  packages = [ pkgs.git ];

  # https://devenv.sh/languages/
  # languages.rust.enable = true;

  # https://devenv.sh/processes/
  # processes.dev.exec = "${lib.getExe pkgs.watchexec} -n -- ls -la";

  # https://devenv.sh/services/
  # services.postgres.enable = true;

  # https://devenv.sh/scripts/
  scripts.hello.exec = ''
    echo hello from $GREET
  '';

  # https://devenv.sh/basics/
  enterShell = ''
    hello         # Run scripts directly
    git --version # Use packages
  '';

  # https://devenv.sh/tasks/
  # tasks = {
  #   "myproj:setup".exec = "mytool build";
  #   "devenv:enterShell".after = [ "myproj:setup" ];
  # };

  # https://devenv.sh/tests/
  enterTest = ''
    echo "Running tests"
    git --version | grep --color=auto "${pkgs.git.version}"
  '';

  # https://devenv.sh/outputs/
  # outputs = {
  #   rust-app = config.languages.rust.import ./rust-app {};
  #   python-app = config.languages.python.import ./python-app {};
  # };

  # https://devenv.sh/git-hooks/
  # git-hooks.hooks.shellcheck.enable = true;

  # See full reference at https://devenv.sh/reference/options/
}

And devenv shell activates the environment.

Commands

$ devenv
https://devenv.sh 2.0.0: Fast, Declarative, Reproducible, and Composable Developer Environments

Usage: devenv [OPTIONS] [COMMAND]

Commands:
  init        Scaffold devenv.yaml, devenv.nix, and .gitignore.
  generate    Generate devenv.yaml and devenv.nix using AI
  shell       Activate the developer environment. https://devenv.sh/basics/
  update      Update devenv.lock from devenv.yaml inputs. http://devenv.sh/inputs/
  search      Search for packages and options in nixpkgs. https://devenv.sh/packages/#searching-for-a-file
  info        Print information about this developer environment.
  up          Start processes in the foreground. https://devenv.sh/processes/
  processes   Start or stop processes. https://devenv.sh/processes/
  tasks       Run tasks. https://devenv.sh/tasks/
  test        Run tests. http://devenv.sh/tests/
  container   Build, copy, or run a container. https://devenv.sh/containers/
  inputs      Add an input to devenv.yaml. https://devenv.sh/inputs/
  changelogs  Show relevant changelogs.
  repl        Launch an interactive environment for inspecting the devenv configuration.
  gc          Delete previous shell generations. See https://devenv.sh/garbage-collection
  build       Build any attribute in devenv.nix.
  eval        Evaluate any attribute in devenv.nix and return JSON.
  direnvrc    Print a direnvrc that adds devenv support to direnv. See https://devenv.sh/integrations/direnv/.
  version     Print the version of devenv.
  mcp         Launch Model Context Protocol server for AI assistants
  lsp         Start the nixd language server for devenv.nix.
  help        Print this message or the help of the given subcommand(s)

Input overrides:
      --from <FROM>
          Source for devenv.nix.

          Can be either a filesystem path (with path: prefix) or a flake input reference.

          Examples:
            --from github:cachix/devenv
            --from github:cachix/devenv?dir=examples/simple
            --from path:/absolute/path/to/project
            --from path:./relative/path

  -o, --override-input <NAME> <URI>
          Override inputs in devenv.yaml.

          Examples:
            --override-input nixpkgs github:NixOS/nixpkgs/nixos-unstable
            --override-input nixpkgs path:/path/to/local/nixpkgs

  -O, --option <OPTION:TYPE> <VALUE>
          Override configuration options with typed values.

          OPTION must include a type: <attribute>:<type>
          Supported types: string, int, float, bool, path, pkg, pkgs

          List types (pkgs) append to existing values by default.
          Add a ! suffix to replace instead: pkgs!

          Examples:
            --option languages.rust.channel:string beta
            --option services.postgres.enable:bool true
            --option languages.python.version:string 3.10
            --option packages:pkgs "ncdu git"       (appends to packages)
            --option packages:pkgs! "ncdu git"      (replaces all packages)

Nix options:
  -j, --max-jobs <MAX_JOBS>
          Maximum number of Nix builds to run concurrently.

          Defaults to 1/4 of available CPU cores (minimum 1).

          [env: DEVENV_MAX_JOBS=]

  -u, --cores <CORES>
          Number of CPU cores available to each build.

          Defaults to available cores divided by max-jobs (minimum 1).

          [env: DEVENV_CORES=]

  -s, --system <SYSTEM>
          Override the target system.

          Defaults to the host system (e.g. aarch64-darwin, x86_64-linux).

  -i, --impure
          Relax the hermeticity of the environment.

      --no-impure
          Force a hermetic environment, overriding config.

      --offline
          Disable substituters and consider all previously downloaded files up-to-date.

      --nix-option <NAME> <VALUE>
          Pass additional options to nix commands.

          These options are passed directly to Nix using the --option flag.
          See `man nix.conf` for the full list of available options.

          Examples:
            --nix-option sandbox false
            --nix-option keep-outputs true
            --nix-option system x86_64-darwin

      --nix-debugger
          Enter the Nix debugger on failure.

Shell options:
  -c, --clean [<CLEAN>...]
          Ignore existing environment variables when entering the shell. Pass a list of comma-separated environment variables to let through.

  -P, --profile <PROFILES>
          Activate one or more profiles defined in devenv.nix.

          Profiles allow you to define different configurations that can be merged with your base configuration.

          See https://devenv.sh/profiles for more information.

          Examples:
            --profile python-3.14
            --profile backend --profile fast-startup

      --reload
          Enable auto-reload when config files change (default).

      --no-reload
          Disable auto-reload when config files change.

Cache options:
      --eval-cache
          Enable caching of Nix evaluation results (default).

      --no-eval-cache
          Disable caching of Nix evaluation results.

      --refresh-eval-cache
          Force a refresh of the Nix evaluation cache.

      --refresh-task-cache
          Force a refresh of the task cache.

Secretspec options:
      --secretspec-provider <SECRETSPEC_PROVIDER>
          Override the secretspec provider

          [env: SECRETSPEC_PROVIDER=]

      --secretspec-profile <SECRETSPEC_PROFILE>
          Override the secretspec profile

          [env: SECRETSPEC_PROFILE=]

Tracing options:
      --trace-output <TRACE_OUTPUT>
          Enable tracing and set the output destination: stdout, stderr, or file:<path>. Tracing is disabled by default.

          [env: DEVENV_TRACE_OUTPUT=]

      --trace-format <TRACE_FORMAT>
          Set the trace output format. Only takes effect when tracing is enabled via --trace-output.

          Possible values:
          - full:   A verbose structured log format used for debugging
          - json:   A JSON log format used for machine consumption
          - pretty: A pretty human-readable log format used for debugging

          [env: DEVENV_TRACE_FORMAT=]
          [default: json]

Global options:
  -v, --verbose
          Enable additional debug logs.

  -q, --quiet
          Silence all logs

      --tui
          Enable the interactive terminal interface (default when interactive).

          [env: DEVENV_TUI=]

      --no-tui
          Disable the interactive terminal interface.

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version information and exit

Documentation