Using Stable And Unstable Nix/NixOS Channels Together

  • 3rd May 2025
  • 2 min read
  • • 
  • Tags: 
  • Nix
  • NixOS

For one of my servers that is running NixOS I have been using the stable channel for all packages. However I wanted for one package to use the version of the package that the unstable channel had and had to learn how to do it.

I am using flakes and this is what I originally had as my input:

inputs = {
    nixpkgs = {
      url = "github:NixOS/nixpkgs/nixos-24.11";
    };
  };

I added the unstable channel as an input:

inputs = {
    nixpkgs = {
      url = "github:NixOS/nixpkgs/nixos-24.11";
    };
    nixpkgs-unstable = { # <-- added this !
      url = "github:NixOS/nixpkgs/nixos-unstable";
    };
  };

I changed my output to make sure my system is configured with both channels as follows (see comments in code snippet for what I added):

outputs =
    {
      self,
      nixpkgs,
      nixpkgs-unstable, # <--- added this
    }:
    let
      system = "x86_64-linux";

      # Define the pkgs from both stable and unstable channels
      pkgs = import nixpkgs {
        inherit system;
      };

      unstablePkgs = import nixpkgs-unstable {
        inherit system;
      };
    in
    {
      nixosConfigurations = {
        myserver = nixpkgs.lib.nixosSystem {
          inherit system;
          modules = [
            ./configuration.nix
          ];
          specialArgs = {
            inherit pkgs unstablePkgs;   # <--- inheriting both!
          };
        };
      };
    };

Now where ever I define a nix function I include both pkgs and unstablePkgs as arguments and am able to chose what package from which channel to use.

For example when choosing what system packages I want to install:

environment.systemPackages = with pkgs; [
    eza
    unstablePkgs.ripgrep
];

Happy Days!