No description
Find a file
2025-07-10 11:57:54 -04:00
.vscode Initial configuration, untested. 2025-06-29 19:34:36 -04:00
lib Refactor argument handling in toCliArgs to filter out empty strings 2025-06-30 23:50:40 -04:00
modules Refactor module input to use self for better input handling 2025-07-10 11:57:54 -04:00
pkgs/proton-cachyos Update file name and description for proton-cachyos package 2025-06-30 18:44:28 -04:00
flake.nix Refactor module input to use self for better input handling 2025-07-10 11:57:54 -04:00
readme.md create readme 2025-06-30 18:10:29 -04:00
test-config.nix Actually fix steam input error 2025-07-10 11:22:04 -04:00

🎮 play.nix

A NixOS flake for gaming on Wayland with Gamescope integration and declarative configuration.

Features

  • Gamescope Integration: Intelligent wrapper with monitor-aware defaults (HDR, VRR, resolution)
  • Application Wrappers: Create custom game launchers that run through Gamescope
  • AMD GPU Support: LACT daemon and performance optimizations
  • Gaming Stack: Steam with Proton-CachyOS, Lutris, Gamemode, and process scheduling

Installation

Add to your flake.nix:

{
  inputs = {
    play-nix.url = "github:TophC7/play.nix";
    # chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable"; # Not needed, but useful
  };

  outputs = { play-nix, chaotic, ... }: {
    nixosConfigurations.yourhostname = nixpkgs.lib.nixosSystem {
      modules = [
        play-nix.nixosModules.play
        # chaotic.nixosModules.default
      ];
    };
  };
}

Configuration

NixOS Configuration

play = {
  amd.enable = true;           # AMD GPU optimization
  steam.enable = true;         # Steam with Proton-CachyOS
  lutris.enable = true;        # Lutris game manager
  gamemode.enable = true;      # Performance optimization
  ananicy.enable = true;       # Process scheduling
};

Home Manager Configuration

play = {
  # Configure monitors for automatic gamescope settings
  monitors = [{
    name = "DP-1";
    primary = true;
    width = 2560;
    height = 1440;
    refreshRate = 165;
    hdr = true;
    vrr = true;
  }];

  # Enable gamescope wrapper
  gamescoperun.enable = true;
  
  # Create application wrappers
  wrappers = {
    # If you wish to override the "steam" command/bin, remove "-gamescope"
    # Overriding the executables makes it so already existing .desktop launchers use the new wrapper
    steam-gamescope = {
      enable = true;
      # Note: Special case for steam, this is the pkg you should use
      # Also sas of 06/25, steam does not open in normal "desktop mode" with gamescope
      # You can however exit big picture mode once already open to access the normal ui
      command = "${lib.getExe osConfig.programs.steam.package} -tenfoot -bigpicture";
      extraOptions = {
        "steam" = true;
      };
    };
    
    lutris-gamescope = {
      enable = true;
      package = osConfig.play.lutris.package; # play.nix provides readonly packages
      extraOptions."force-windows-fullscreen" = true;
    };

    heroic-gamescope = { 
      enable = true;
      package = pkgs.heroic;
      extraOptions."fsr-upscaling" = true;
    };
  };
};

# Recomendation: Override desktop entries to use gamescope wrappers
xdg.desktopEntries = {
  steam = {
    name = "Steam";
    comment = "Steam Big Picture (Gamescope Session)";
    exec = "${lib.getExe config.play.wrappers.steam.wrappedPackage}";
    icon = "steam";
    type = "Application";
    terminal = false;
    categories = [ "Game" ];
    mimeType = [
      "x-scheme-handler/steam"
      "x-scheme-handler/steamlink"
    ];
    settings = {
      StartupNotify = "true";
      StartupWMClass = "Steam";
      PrefersNonDefaultGPU = "true";
      X-KDE-RunOnDiscreteGpu = "true";
      Keywords = "gaming;";
    };
    actions = {
      bigpicture = {
        name = "Steam Client (No Gamescope)";
        exec = "${lib.getExe (config.play.steam.package or pkgs.steam)}";
      };
    };
  };
  
  heroic = {
    name = "Heroic (Gamescope)";
    exec = "${lib.getExe config.play.wrappers.heroic-gaming.wrappedPackage}";
    icon = "com.heroicgameslauncher.hgl";
    type = "Application";
    categories = [ "Game" ];
  };
};

Usage

# Basic usage
gamescoperun heroic

# With custom options
gamescoperun -x "--fsr-upscaling-sharpness 5" heroic

# Legacy environment variable support
GAMESCOPE_EXTRA_OPTS="--steam" gamescoperun steam

The gamescoperun script automatically configures resolution, refresh rate, HDR, and VRR based on your primary monitor settings.

Requirements

  • NixOS with Home Manager
  • Chaotic Nix (for latest Gamescope)
  • Wayland desktop environment

🤝 Contributing

Contributions are welcome! Please feel free to submit issues and pull requests.