Minecraft with Nix/NixOS

10 min read

June 21, 2025

What is Nix/NixOS?

Nix is a package manager that uses a scripting language called Nix to manage packages and configurations. It is a purely functional package manager that allows for reproducible builds and easy version management. NixOS is a Linux distribution that uses Nix as its package manager.

About direnv

direnv is an extension for your shell that manages environment variables based on the current directory. For example, when you enter a folder, it will load all environment variables that are defined in a .envrc file into a bash sub-shell and all exported variables are then captured by direnv and then made available to the current shell.

I suggest using nix-direnv. For more information, you can read here.

Minecraft mod/modpack development

For mod developers

One of the most common issues when running a Minecraft client in your mod is the GLFW library not found error. This happens because NixOS does not have a /lib directory, so Minecraft cannot locate the GLFW library.

The solution is to create a Nix shell and explicitly tell Minecraft where to find the GLFW library. Here’s a sample shell script (this shell script had tested on Minecraft 1.21.1):

{
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

  outputs = inputs: let
    # openal doesn't support Darwin, I may add it back if I know an alternative package
    supportedSystems = ["x86_64-linux" "aarch64-linux"];
    forEachSupportedSystem = f:
      inputs.nixpkgs.lib.genAttrs supportedSystems (system:
        f rec {
          pkgs = import inputs.nixpkgs {inherit system;};

          libs = with pkgs; [
            glfw3-minecraft
            openal

            ## openal
            alsa-lib
            libjack2
            libpulseaudio
            pipewire

            ## glfw
            libGL
            xorg.libX11
            xorg.libXcursor
            xorg.libXext
            xorg.libXrandr
            xorg.libXxf86vm

            udev # oshi

            vulkan-loader # VulkanMod's lwjgl
            flite # text2speech
          ];
        });
  in {
    devShells = forEachSupportedSystem ({
      pkgs,
      libs,
    }: {
      default = pkgs.mkShell {
        packages = with pkgs; [mesa-demos pciutils xorg.xrandr];
        buildInputs = libs;
        LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath libs;
      };
    });
  };
}

As you can see, Minecraft does not only require GLFW, but also other libraries such as OpenAL, JACK, PipeWire, libGL, and flite.
You can define a JDK version inside packages. For example:

packages = with pkgs; ["other packages" zulu21]

For modpack developers

The most popular CLI tool for creating Minecraft modpacks is Packwiz. You have 2 ways to install Packwiz, the first way is install it like other packages (using home-manager is suggested), and the second way is using Nix shell. Example script for the second option:

{
  inputs.nixpkgs.url = "github:nixos/nixpkgs";

  outputs = inputs: let
    supportedSystems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"];
    forEachSupportedSystem = f:
      inputs.nixpkgs.lib.genAttrs supportedSystems (system:
        f {
          pkgs = import inputs.nixpkgs {inherit system;};
        });
  in {
    devShells = forEachSupportedSystem ({pkgs}: {
      default = pkgs.mkShell {
        packages = with pkgs; [packwiz];
      };
    });
  };
}