GLFW Error 65542 while trying to launch simulation gui with frc-nix

I’ve been trying to set up frc-nix for wpilib development on NixOS, and everything seems to be working well except for launching the simulation GUI with ./gradlew SimulateJava.

The actual simulation works fine, but the GUI doesn’t launch. I see the following output as it tries to launch the GUI:

> Task :simulateJavaRelease
HAL Extensions: Attempting to load: libhalsim_gui
Simulator GUI Initializing.
GLFW Error 65542: GLX: Failed to load GLX
HAL Extensions: Successfully loaded extension
********** Robot program starting **********

The error is mentioned in frc-nix’s documentation, but the given solution didn’t work for me. Here’s my nix-ld configuration:

    programs.nix-ld = {
      enable = true;
      libraries = with pkgs; [
        # Core C++ and GCC
        stdenv.cc.cc.lib
        
        # Graphics / OpenGL
        libGL
        libglvnd
        
        # X11 Libraries
        xorg.libX11
        xorg.libXext
        xorg.libXxf86vm
        xorg.libXcursor
        xorg.libXrandr
        xorg.libXinerama
        xorg.libXi
        
        # Wayland
        wayland
      ];
    };

Additionally, here’s the flake.nix for my dev environment:

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

  outputs = {self, nixpkgs, ...}: let 
    system = "x86_64-linux";
  in  {
    devShells."${system}".default = let
      pkgs = import nixpkgs { inherit system; };
    in pkgs.mkShell {
      packages = with pkgs; [
        jdk
        jdk17
        gradle
        glfw
        wayland
        xorg.libXrandr
        xorg.libXinerama
        xorg.libXcursor
        xorg.libXi
        libglvnd
        xorg.libXxf86vm
      ];

      nativeBuildInputs = [
        pkgs.libGL
        pkgs.libGLX
      ];

      # LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [
      #   # libGL
      #   # libGLX
      #   libglvnd
      # ];

      shellHook = ''
        echo "Hello world!"
        export HALSIM_EXTENSIONS="$PWD"/build/jni/release/libhalsim_gui.so
        export JAVA_HOME="${pkgs.jdk17}/lib/openjdk"
        # export LD_LIBRARY_PATH="''${LD_LIBRARY_PATH}''${LD_LIBRARY_PATH:+:}${pkgs.libglvnd}/lib"
        export LD_LIBRARY_PATH="/run/opengl-driver/lib:${pkgs.lib.makeLibraryPath [
          pkgs.stdenv.cc.cc.lib
          pkgs.libglvnd
          pkgs.xorg.libX11
          pkgs.xorg.libXrandr
          pkgs.xorg.libXinerama
          pkgs.xorg.libXcursor
          pkgs.xorg.libXi
        ]}:$LD_LIBRARY_PATH"
      '';
    };
  };
}

I tried running LD_DEBUG=libs ./gradlew simulatejava and got this output prior to the error msg:

Simulator GUI Initializing.
     70287:	find library=libXxf86vm.so.1 [0]; searching
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libXxf86vm.so.1
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libXxf86vm.so.1
     70287:	 search cache=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/etc/ld.so.cache
     70287:	 search path=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib:/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib/glibc-hwcaps/x86-64-v3:/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib/glibc-hwcaps/x86-64-v2:/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib		(system search path)
     70287:	  trying file=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib/libXxf86vm.so.1
     70287:	  trying file=/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib/glibc-hwcaps/x86-64-v3/libXxf86vm.so.1
     70287:	  trying file=/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib/glibc-hwcaps/x86-64-v2/libXxf86vm.so.1
     70287:	  trying file=/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib/libXxf86vm.so.1
     70287:	
     70287:	find library=libX11-xcb.so.1 [0]; searching
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libX11-xcb.so.1
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libX11-xcb.so.1
     70287:	 search cache=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/etc/ld.so.cache
     70287:	 search path=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib:/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib		(system search path)
     70287:	  trying file=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib/libX11-xcb.so.1
     70287:	  trying file=/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib/libX11-xcb.so.1
     70287:	
     70287:	find library=libGLX.so.0 [0]; searching
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/releaseHAL Extensions: Successfully loaded extension
		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libGLX.so.0
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libGLX.so.0
     70287:	 search cache=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/etc/ld.so.cache
     70287:	 search path=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib:/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib		(system search path)
     70287:	  trying file=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib/libGLX.so.0
     70287:	  trying file=/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib/libGLX.so.0
     70287:	
     70287:	find library=libGL.so.1 [0]; searching
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libGL.so.1
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libGL.so.1
     70287:	 search cache=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/etc/ld.so.cache
     70287:	 search path=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib:/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib		(system search path)
     70287:	  trying file=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib/libGL.so.1
     70287:	  trying file=/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib/libGL.so.1
     70287:	
     70287:	find library=libGL.so [0]; searching
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libGL.so
     70287:	 search path=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release		(LD_LIBRARY_PATH)
     70287:	  trying file=/home/ash/Projects/prog/aembot/frc/2026/build/jni/release/libGL.so
     70287:	 search cache=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/etc/ld.so.cache
     70287:	 search path=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib:/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib		(system search path)
     70287:	  trying file=/nix/store/fjkx1l5cnskzrqacf08z7i8z17256w0j-glibc-2.42-61/lib/libGL.so
     70287:	  trying file=/nix/store/xx0z77494lfxr8qjwpck246fry05n3nm-xgcc-15.2.0-libgcc/lib/libGL.so
     70287:	
GLFW Error 65542: GLX: Failed to load GLX

Any help would be greatly appreciated.

I still haven’t been able to get it working normally. From discussion I read in the unofficial FRC discord, I think the primary issue might be that GradleRIO is overwriting the $LD_LIBRARY_PATH variable. I’m getting around this for now by just running the jar file directly, which allows the sim gui to show up. Here’s my current flake:

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-parts.url = "github:hercules-ci/flake-parts";
    systems.url = "github:nix-systems/default";
  };

  outputs = inputs:
    inputs.flake-parts.lib.mkFlake { inherit inputs; } {
      systems = import inputs.systems;

      perSystem = { config, self, pkgs, lib, system, ... }: let 
        libs = with pkgs; [
          stdenv.cc.cc.lib
          libGL
        ];
      in  {
        devShells.default = pkgs.mkShell {
          packages = with pkgs; [
            jdk

            # This is janky. I know it's possible to get the sim gui to launch the proper way, but this is the only way I've got working.
            # Credit to ip.a on the unofficial FRC discord for the command
            (pkgs.writeShellScriptBin "launch-simgui" ''
              HALSIM_EXTENSIONS=./build/jni/release/libhalsim_gui.so LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./build/jni/release java -jar build/libs/2026.jar
            '')

            (pkgs.writeShellScriptBin "frcsim" ''
              ./gradlew build && launch-simgui
            '')
          ] ++ libs;

          LD_LIBRARY_PATH = lib.makeLibraryPath libs;
        };
      };
    };
}