Nix flake for "too much bleeding-edge" and unreleased packages (e.g., mesa_git, linux_cachyos, firefox_nightly, sway_git, gamescope_git). And experimental modules (e.g., HDR, duckdns). https://nyx.chaotic.cx
  • Nix 99.2%
  • Shell 0.6%
  • Python 0.2%
Find a file
2026-07-04 06:45:10 -03:00
.github ci/build: drop concurrency from Garuda builder 2026-06-29 07:42:47 -03:00
checks treewide: lint 2026-06-18 19:24:32 -03:00
maintenance failures: update aarch64-{darwin,linux} 2026-06-30 18:00:21 -03:00
modules nordvpn: drop it 2026-06-27 08:16:20 -03:00
overlays builder: fix firefox skipping on aarch64 2026-06-29 22:11:08 -03:00
pkgs chore: bump nss_git (#1773) 2026-07-04 06:45:10 -03:00
shared treewide: s/matchAnyAttrs/matchAnyPattern/g 2026-06-27 08:16:12 -03:00
vendor rust-overlay: 1782962170 -> 1783058364 2026-07-04 03:46:11 +00:00
.editorconfig docs: fix syntax 2026-06-16 14:18:21 -03:00
.gitignore flake: split maintenance into its flake (#871) 2024-09-09 11:58:18 -03:00
.gitlab-ci.yml ci/linter: stronger 2026-06-08 13:06:39 -03:00
CODE_OF_CONDUCT.md coc: link 2023-11-15 08:30:17 -03:00
flake.lock flakes: bump 20260704 2026-07-04 03:46:05 +00:00
flake.nix flake: update schemas, expose vendored inputs 2026-06-19 16:31:08 -03:00
LICENSE flake-20230716-1: mesa, wlroots (#210) 2023-07-16 14:37:46 -03:00
README.md README: scx_git is long gone 2026-06-30 13:10:43 -03:00
statix.toml statix: tweak 2025-03-09 13:44:51 -03:00

Chaotic's Nyx

Six frogs with capes, aligned like the NixOS logo, with intercalated shades of green

GitHub's menu buttons re-ordered and re-labeled to say: Make Pull requests Not Issues. Sounding like Make Love Not War

Nix flake for "too much bleeding-edge" and unreleased packages (e.g., mesa_git, linux_cachyos, firefox_nightly, sway_git, gamescope_git). And experimental modules (e.g., HDR, duckdns).

From the Chaotic Linux User Group (LUG), the same one that maintains Chaotic-AUR! 🧑🏻‍💻

The official source-code repository is available as "chaotic-cx/nyx" at GitHub.

PLEASE AVOID POSTING ISSUES IN NIXOS' MATRIX, DISCOURSE, DISCORD, ETC. USE OUR REPO'S ISSUES, TELEGRAM GROUP, OR #chaotic-nyx:ubiquelambda.dev ON MATRIX INSTEAD.

News

A news channel can be found on Telegram.

How to use it

On NixOS unstable

This tutorial does not apply for users using NixOS 24.11 and other stable channels. This tutorial is for unstable users.

We recommend integrating this repo using Flakes:


# flake.nix
{
  description = "My configuration";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable"; # IMPORTANT
  };

  outputs = { nixpkgs, chaotic, ... }: {
    nixosConfigurations = {
      hostname = nixpkgs.lib.nixosSystem { # Replace "hostname" with your system's hostname
        system = "x86_64-linux";
        modules = [
          ./configuration.nix
          chaotic.nixosModules.default # IMPORTANT
        ];
      };
    };
  };
}

In your configuration.nix enable the packages and options that you prefer:


# configuration.nix
{ pkgs, ... }:
{
  environment.systemPackages = [ pkgs.lan-mouse_git ];
  chaotic.mesa-git.enable = true;
}

On NixOS stable

Chaotic-Nyx is NOT compatible with NixOS 25.05 and older.

This tutorial does not apply for users using NixOS unstable channel. This tutorial is for 24.11 and other stable channels.

You won't have access to all the modules and options available to unstable users, as those are prone to breaking due to the divergence between the channels. But you'll have access to all packages, the cache, and the registry.

We recommend integrating this repo using Flakes:


# flake.nix
{
  description = "My configuration";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
    chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
  };

  outputs = { nixpkgs, chaotic, ... }: {
    nixosConfigurations = {
      hostname = nixpkgs.lib.nixosSystem { # Replace "hostname" with your system's hostname
        system = "x86_64-linux";
        modules = [
          ./configuration.nix # Your system configuration.
          chaotic.nixosModules.nyx-cache
          chaotic.nixosModules.nyx-overlay
          chaotic.nixosModules.nyx-registry
        ];
      };
    };
  };
}

In your configuration.nix enable the packages that you prefer:


# configuration.nix
{ pkgs, ... }:
{
  environment.systemPackages = [ pkgs.lan-mouse_git ];
  boot.kernelPackages = pkgs.linuxPackages_cachyos;
}

On Home-Manager

This method is for home-manager setups without NixOS.

We recommend integrating this repo using Flakes:


# flake.nix
{
  description = "My configuration";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable"; # IMPORTANT
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { nixpkgs, chaotic, ... }: {
    # ... other outputs
    homeConfigurations = {
      # ... other configs
      configName = home-manager.lib.homeManagerConfiguration { # Replace "configName" with a significant unique name
        pkgs = nixpkgs.legacyPackages.x86_64-linux;
        modules = [
          ./home-manager/default.nix
          chaotic.homeModules.default # IMPORTANT
        ];
      };
    };
  };
}

In your home-manager/default.nix add a nix.package, and enable the desired packages:


# configuration.nix
{ pkgs, ... }:
{
  nix.package = pkgs.nix;
  home.packages = [ pkgs.lan-mouse_git ];
}

Running packages (without installing)

Besides using our module/overlay, you can run packages (without installing them) using:


nix run github:chaotic-cx/nyx/nyxpkgs-unstable#firefox_nightly

Binary Cache notes

You'll get the binary cache added to your configuration as soon as you add our default module. We do this automatically, so we can gracefully update the cache's address and keys without prompting you for manual work.

If you dislike this behavior for any reason, you can disable it with chaotic.nyx.cache.enable = false.

!!!!!!!!!:: You'll need to enable our module and rebuild your system before adding these derivations to your configuration. Another option, or if you want to use the cache right from the installation media, install your system adding --option 'extra-substituters' 'https://nyx-cache.chaotic.cx/' --option extra-trusted-public-keys "nyx-cache.chaotic.cx:dJxTrgMC3V3cFfyIiBQDQorG6k1LsqurH/srpMSq7qk=" to the end of the nixos-install (or nixos-rebuild) command.

Commands like nix run ..., nix develop ..., and others, when using our flake as input, will ask you to add the cache interactively when missing from your user's nix settings.

We offer cache for x86_64-linux, aarch64-linux, and aarch64-darwin.

FlakeHub notes

FlakeHub

Add chaotic to your flake.nix, make sure to use the rolling *.tar.gz to keep using the latest packages:


# flake.nix
{
  # ... description
  inputs = {
    # ... nixpkgs, home-manager, etc
    chaotic.url = "https://flakehub.com/f/chaotic-cx/nyx/*.tar.gz";
  };
  # ... outputs
}

Then follow one of the guides above.

CachyOS notes

A major selling point of using Chaotic-Nyx's downstream CachyOS kernels is that they achieve **kconfig parity** with the upstream CachyOS. Other flakes and Nixpkgs typically do not attempt to maintain this strict 1:1 configuration parity for their custom or downstream kernels.


# configuration.nix
{ config, pkgs, ... }:
{
  boot.kernelPackages = pkgs.linuxPackages_cachyos;
  # other (optional) custom CachyOS packages that may be fit for your setup include:
  boot.zfs.package = pkgs.zfs_cachyos;
  hardware.nvidia.package = pkgs.nvidia_cachyos;
}

The default variant matches the upstream (at the time of writing, LTO+BORE), check the equivalent PKGBUILD variables in pkgs/linux-cachyos/config-vars/cachyos-lto.json. Here's an example using LTS:


# configuration.nix
{ config, pkgs, ... }:
{
  boot.kernelPackages = pkgs.linuxPackages_cachyos-lts;
  # other (optional) custom CachyOS packages that may be fit for your setup include:
  hardware.nvidia.package = pkgs.nvidia_cachyos-lts;
  boot.zfs.package = pkgs.zfs_cachyos; # Userspace package here, doesn't follow kernel variants.
}

We offer other variants: hardened, lts, rc, server, and lto-znver4 (for AMD's Zen4 or superior). They all update individually. Plus a gcc that follows the default, in case Clang+LTO is causing you any trouble.

You may install the CachyOS kernel directly using the default modules and overlays with pkgs.linuxPackages_cachyos. Alternatively, use chaotic.legacyPackages.x86_64-linux.linuxPackages_cachyos if you would like to use the package directly without using modules and overlay.

Not all the variants have kernel modules pre-compiled. We would love to, but don't have enough resources.

CachyOS upstream doesn't support aarch64, due to the parity goal, we ignore it too.

One can validate the kconfig parity with pkgs/linux-cachyos/conformance-test.sh, you'll need to tweak the envvars. Please, open an issue if drifted.

CachyOS x86-64 microarchitecture optimisations


{ pkgs, ... }:
{
  boot.kernelPackages =
    pkgs.linuxPackages_cachyos.cachyOverride
      { cachyVars = pkgs.linuxPackages_cachyos.kernel.cachyConfig.cachyVars // { "_processor_opt" = "GENERIC_V3"; }; }
}

Use either GENERIC_V2, GENERIC_V3, GENERIC_V4, or ZEN4. We don't provide cache for these.

We support a few other variables from CachyOS' PKGBUILD in the cachyVars atttrset.

Using sched-ext schedulers

From version 6.12 onwards, sched-ext support is officially available on the upstream kernel. You can use the latest kernel (pkgs.linuxPackages_latest) or our provided CachyOS kernel (pkgs.linuxPackages_cachyos). Not all variants of CachyOS support it.

Just add this to your configuration:


# configuration.nix
{
  boot.kernelPackages = pkgs.linuxPackages_cachyos;
  services.scx.enable = true; # by default uses scx_rustland scheduler
}

Then, reboot with the new configuration, check if the scheduler is running:


╰─λ systemctl status scx.service

If this is not working, check if the current kernel support sched-ext feature.


╰─λ ls /sys/kernel/sched_ext/
enable_seq  hotplug_seq  nr_rejected  root  state  switch_all

You can also manually start a scheduler like:


╰─λ sudo scx_rusty
21:38:53 [INFO] CPUs: online/possible = 24/32
21:38:53 [INFO] DOM[00] cpumask 00000000FF03F03F (20 cpus)
21:38:53 [INFO] DOM[01] cpumask 0000000000FC0FC0 (12 cpus)
21:38:53 [INFO] Rusty Scheduler Attached

You can choose a different scheduler too.


# configuration.nix
{
  services.scx.scheduler = "scx_rusty";
}

There are other scx_* binaries for you to play with, or head to github.com/sched-ext/scx for instructions on how to write one of your own.

Using with read-only pkgs

If you use nixpkgs.nixosModules.readOnlyPkgs in your setup, you need to disable our overlay module, and import the cache-friendly overlay directly instead.


# flake.nix
{
  # ... description, inputs
  outputs = { nixpkgs, chaotic, ... }: {
    nixosConfigurations = {
      # ... other systems
      hostname = nixpkgs.lib.nixosSystem { # Replace "hostname" with your system's hostname
        modules = [
          nixpkgs.nixosModules.readOnlyPkgs
          # ... ./configuration.nix, ./hardware-configuration.nix, etc
          {
            nixpkgs.pkgs = import nixpkgs {
              system = "x86_64-linux";
              config = { allowUnfree = true; };
              overlays = [ chaotic.overlays.cache-friendly ]; # IMPORTANT
            };
            chaotic.nyx.overlay.enable = false; # IMPORTANT
          }
          chaotic.nixosModules.default # IMPORTANT
        ];
      };
    };
  };
}

Using with Jovian

We provide binary cache for most packages in Jovian NixOS.

Remember to read all our Binary Cache notes, and you must follow jovian through chaotic to avoid hash mismatches:


# flake.nix
{
  # ... description
  inputs = {
    # ... nixpkgs, home-manager, etc
    chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
    # no need to add jovian here, we vendor it
  };

  outputs = { nixpkgs, chaotic, ... }:
    let
      inherit (chaotic.vendored) jovian;
    in
    {
      nixosConfigurations = {
        steamdeck = nixpkgs.lib.nixosSystem {
          system = "x86_64-linux";
          modules = [
            jovian.nixosModules.default
            chaotic.nixosModules.default
            ./configuration.nix
            {
              # This entre { ... } is an example of what could be inside ./configuration.nix
              jovian.steam.enable = true;
              jovian.steam.autoStart = true;
              jovian.devices.steamdeck.enable = true;
            }
          ];
        };
      };
    };
}

Lists of options and packages

An always up-to-date list of all our options and packages is available at: List page.

Notes

Our branches

:godmode: Our nyxpkgs-unstable branch is the one that's always cached.

:shipit: The main branch is the primary target for contribution.

Contributions

We do accept third-party authored PRs.

Upstream to nixpkgs

If you are interested in pushing any of these packages to the upstream nixpkgs, you have our blessing.

If one of our contributors is mentioned in the deveriation's mantainers list (in this repository) please keep it when pushing to nixpkgs. But, please, tag us on the PR so we can participate in the reviewing.

Forks and partial code-taking

You are free to use our code, or portions of our code, following the MIT license restrictions.

Suggestions

If you have any suggestion to enhance our packages, modules, or even the CI's codes, let us know through the GitHub repo's issues.

Building over the user's pkgs

For cache reasons, Chaotic-Nyx now defaults to always use nixpkgs as provider of its dependencies.

If you need to change this behavior, set chaotic.nyx.onTopOf = "user-pkgs";. Be warned that you mostly won't be able to benefit from our binary cache after this change.

You can also disable our overlay entirely by configuring chaotic.nyx.overlay.enable = false;.

Criteria for new packages

We'll only accept new packages given the following circumstances:

  • Package was rejected in Nixpkgs due to lack of stability or Nixpkgs cannot provide updates as fast as needed;
  • A derivation for it already exists, working without IFD.

Why am I building a kernel? Basic cache troubleshooting

For starters, suppose you're using our linuxPackages_cachyos as the kernel and an up-to-date flake lock. Check if all these three hashes prompt the same:


╰─λ nix eval 'github:chaotic-cx/nyx/nyxpkgs-unstable#linuxPackages_cachyos.kernel.outPath'
"/nix/store/441qhriiz5fa4l3xvvjw3h4bps7xfk08-linux-6.8.7"

╰─λ nix eval 'chaotic#linuxPackages_cachyos.kernel.outPath'
"/nix/store/441qhriiz5fa4l3xvvjw3h4bps7xfk08-linux-6.8.7"

╰─λ nix eval '/etc/nixos#nixosConfigurations.{{HOSTNAME}}.config.boot.kernelPackages.kernel.outPath'
"/nix/store/441qhriiz5fa4l3xvvjw3h4bps7xfk08-linux-6.8.7"

If the second is different from the first, you're probably adding a inputs.nixpkgs.follows to chaotic, simply remove it.

If the third is different from the first, you're most likely using an overlay that's changing the kernel or one of its dependencies; check your nixpkgs.overlays config.


If they all match, and you're still rebuilding the kernel, copy the hash from the result above, then change it in the following curl command:


╰─λ curl -L 'http://nyx-cache.chaotic.cx/3w8ad8iysc2v0ic8m3ffrid4j7m20p27.narinfo'
StorePath: /nix/store/3w8ad8iysc2v0ic8m3ffrid4j7m20p27-libdrm-b8b7c57-bin
URL: nar/0529rfk9kp4ff0w0ljfa88mz46f8iq51sb020jdw7qb6z17n477m.nar.zst
Compression: zstd
NarHash: sha256:0529rfk9kp4ff0w0ljfa88mz46f8iq51sb020jdw7qb6z17n477m
NarSize: 550808
References: 57iz36553175g3178pvxjij8z5rcsd4n-glibc-2.42-61 zyiv5lp015g94xjw499wapk121qcarc1-libdrm-b8b7c57
Deriver: 79g0hvd6lmg76gyl7sqwvac38dxnlbg1-libdrm-b8b7c57.drv
Sig: nyx-cache.chaotic.cx:6q6x88p+CMjaa42DBYs7Fi4OYxrTj/nlpaK2BbHb68ke0TEKpXOaSUsCUybazLbv2snUWgA9jGs/E4NtJxp9CA==

If the command above fails without an 404, then you have an issue with your internet connection. If it fails with 404, then tag pedrohlc (Matrix, Telegram or GitHub), he really broke the cache.

If the command succeeds, and you're still building the cache, it can happen because of two things: (1) you might have tried to fetch said package before we deployed, then Nix will cache the 404 and won't try again; (2) you might have a misconfigured /etc/nix/nix.conf or outdated nix-daemon.

For the second one, check if it looks like this (the word “chaotic” should appear three times):


╰─λ grep chaotic /etc/nix/nix.conf
substituters = https://nyx-cache.chaotic.cx/ https://cache.nixos.org/
trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= nyx-cache.chaotic.cx:dJxTrgMC3V3cFfyIiBQDQorG6k1LsqurH/srpMSq7qk=

An outdated nix-daemon can happen when you change nix settings, then nixos-rebuilt your system, but you didn't restart the nix-daemon service. The easiest way to fix it is to reboot.

Special Thanks

  • The 50 contributors;
  • Original sponsors: Silvan, Kai, Elite, and Keenan;
  • lonerOrz for keeping a wonderful fork;
  • Everybody that provided feedback through Github, Telegram, and Matrix.