ellies-nix-environment

wizzeh's avatarfrom wizzeh

Nix environment patterns for Ellie's projects. Use when (1) a tool or command is not available on the system, or (2) setting up a new project that needs a development environment. Provides patterns for ad-hoc tool execution and flake-based devShells with direnv.

⭐0stars🔀0forks📁View on GitHub🕐Updated Jan 4, 2026

When & Why to Use This Skill

This Claude skill provides standardized Nix environment patterns to simplify development workflow management. It solves the 'it works on my machine' problem by offering reproducible templates for ad-hoc tool execution and flake-based development shells, ensuring consistent environments across different systems without cluttering global configurations.

Use Cases

  • Executing one-off CLI tools (like jq, ffmpeg, or ripgrep) using 'nix run' to avoid permanent system-wide installations.
  • Bootstrapping new software projects with Nix flakes to define precise, version-controlled development dependencies.
  • Automating the activation of project-specific environments using direnv integration for seamless terminal context switching.
  • Setting up specialized language toolchains, such as Rust nightly builds with specific extensions, using Nix overlays for consistent builds.
nameellies-nix-environment
descriptionNix environment patterns for Ellie's projects. Use when (1) a tool or command is not available on the system, or (2) setting up a new project that needs a development environment. Provides patterns for ad-hoc tool execution and flake-based devShells with direnv.

Ellie's Nix Environment

When a Tool Isn't Available

If a command fails because a tool isn't installed, use nix run to execute it:

nix run nixpkgs#<tool> -- <args>

Examples:

nix run nixpkgs#python3 -- script.py
nix run nixpkgs#jq -- '.field' file.json
nix run nixpkgs#ffmpeg -- -i input.mp4 output.gif
nix run nixpkgs#ripgrep -- "pattern" .

Do not suggest installing tools globally. Use nix run for one-off commands.

Setting Up a New Project

When a project needs a development environment, create a flake with direnv:

1. Create flake.nix

{
  description = "Project description";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs = nixpkgs.legacyPackages.${system};
      in
      {
        devShells.default = pkgs.mkShell {
          buildInputs = with pkgs; [
            # Add project dependencies here
          ];
        };
      });
}

2. Create .envrc

use flake .

3. Activate direnv

direnv allow

4. Add to .gitignore

.direnv/

Rust Projects

For Rust projects, use rust-overlay to get the toolchain:

{
  description = "Rust project";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, flake-utils, rust-overlay }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        overlays = [ (import rust-overlay) ];
        pkgs = import nixpkgs { inherit system overlays; };
        rust = pkgs.rust-bin.nightly.latest.default.override {
          extensions = [ "rust-src" "rust-analyzer" ];
        };
      in
      {
        devShells.default = pkgs.mkShell {
          buildInputs = [
            rust
          ];
        };
      });
}