Develop natively • Deploy containers • 80.000+ packages • Write scripts • 50+ supported languages • Define processes • Reuse services • Run tests • Enforce git hooks
Simple JSON-like language
Declaratively define your development environment by toggling basic options.
env
attribute set to define environment variables.
If you'd like to also include secrets from .env
file, set dotenv.enable = true;
.
direnv
will automatically load the environment when you enter the project
directory.
{ pkgs, config, ... }: {
env.GREET = "determinism";
packages = [
pkgs.ncdu
];
enterShell = ''
echo hello ${config.env.GREET}
ncdu --version
'';
}
devenv shell hello determinism ncdu 2.3
{ pkgs, ... }: {
scripts.build.exec = "parcel build";
# Runs on git commit and CI
pre-commit.hooks = {
black.enable = true;
# Your custom hooks
generate-css = {
enable = true;
name = "generate-css";
entry = "build";
};
};
}
devenv shell build
...
Scripts and Git hooks
Define scripts and git hooks to automate your development workflow.
devenv search devenv
+--------------+---------------+------------------------------------------------------------------------+
| Package | Version | Description |
+--------------+---------------+------------------------------------------------------------------------+
| pkgs.devenv | 1.0.3 | Fast, Declarative, Reproducible, and Composable Developer Environments |
+--------------+---------------+------------------------------------------------------------------------+
+--------------------------+---------+-----------+------------------------------------------------------------+
| Option | Type | Default | Description |
+--------------------------+---------+-----------+------------------------------------------------------------+
| devenv.debug | boolean | false | Whether to enable debug mode of devenv enterShell script. |
+--------------------------+---------+-----------+------------------------------------------------------------+
| devenv.warnOnNewVersion | boolean | true | Whether to warn when a new version of devenv is available. |
+--------------------------+---------+-----------+------------------------------------------------------------+
| devenv.latestVersion | string | "1.0.3" | The latest version of devenv. |
+--------------------------+---------+-----------+------------------------------------------------------------+
• Found 1 package and 3 options for 'devenv'.
Languages
Supports over 50 programming languages.
{ pkgs, config, ... }: {
languages.python = {
enable = true;
version = "3.11";
venv.enable = true;
venv.requirements = ''
requests
torch
'';
uv.enable = true;
};
languages.rust = {
enable = true;
channel = "nightly";
rustflags = "-Z threads=8";
targets = [ "wasm32-unknown-unknown" ];
};
languages.php = {
enable = true;
version = "8.1";
ini = ''
memory_limit = 256M
'';
fpm.pools.web = {
settings = {
"pm" = "dynamic";
};
};
};
}
{ pkgs, ... }: {
packages = [
pkgs.mkdocs
pkgs.watchexec
];
processes = {
docs.exec = "mkdocs serve";
tailwind.exec = "watchexec -e html,css,js npx tailwindcss build extra.css -o output.css";
};
}
devenv up
• Building processes ...
• Starting processes ...
...
Run processes
Define your processes in a declarative way
and start them with devenv up
.
Procfile
, declare development processes that have
access to your environment.
Run services
Pick from a number of community maintained services like PostgreSQL, Redis, MySQL, RabbitMQ, WireMock, MinIO, Caddy, ElasticSearch, and more are being added each day.
devenv up
.
{ pkgs, ... }: {
services.postgres = {
enable = true;
package = pkgs.postgresql_15;
initialDatabases = [{ name = "mydb"; }];
extensions = extensions: [
extensions.postgis
extensions.timescaledb
];
settings.shared_preload_libraries = "timescaledb";
initialScript = "CREATE EXTENSION IF NOT EXISTS timescaledb;";
};
}
devenv up
...
{ pkgs, ... }: {
packages = [
pkgs.mkdocs
pkgs.curl
];
processes = {
docs.exec = "mkdocs serve";
};
enterTest = ''
wait_for_port 8000
curl http://localhost:8000 | grep "Hello, world!"
'';
}
devenv test
...
Run tests
Running a script inside your development environment
with all processes running should be as simple as devenv test
.
All process management is taken care for you.
Container interoperability
Generate containers from your development environment and build/copy/run them.
shell
container allows you to run your environment in a container.
Use devenv container run shell
to enter your
environment in a container.
processes
container allows you to run your processes in a
container.
Use devenv container run processes
to run your
processes in a container.
containers.mycontainer.*
to customize your container.
{ pkgs, ... }: {
packages = [
pkgs.mkdocs
pkgs.curl
];
processes = {
docs.exec = "mkdocs serve";
};
}
devenv container build processes ...
devenv container copy processes ...
devenv container run processes ...
inputs:
myorg-devenv:
url: github:myorg/myorg-devenv
imports:
- ./frontend
- ./backend
- myorg-devenv/service1
- myorg-devenv/service2
Poly/Mono repo composability
Compose multiple environments into a single environment.
A great way to get started is to use central repository with all the shared configuration until your team is comfortable maintaining their own environments.