Stylix, swaylock, etc. without flakes

Hiya folks,

I’m very new to nixos, but have been tinkering with various linux distros for years. I love it!

I’m running sway, waybar, have set up my laptop volume/brightness, etc. and want to look at theming!

NB I am not using flakes, because there seems to be a little “uncertainty” around their future, documentation, etc.

I expect my home.nix is setup very badly, but I’ve followed stylix guides as best as I can understand.

{ pkgs, config, lib, ... }:
let
  stylix = pkgs.fetchFromGitHub {
      owner = "danth";
      repo = "stylix";
      rev = "...";
      sha256 = "...";
  };
in {
  overlays = lib.mkOption {
    description = "List of overlays.";
    default = [];
    type = lib.types.raw;
  };
  imports = [ (import stylix).homeManagerModules.stylix ];

  stylix = {
    enable = true;
    autoEnable = true;
    image = ./wallpaper.png;
  };

  # Home Manager needs a bit of information about you and the paths it should
  # manage.
  home.username = "nathan";
  home.homeDirectory = "/home/nathan";

  # This value determines the Home Manager release that your configuration is
  # compatible with. This helps avoid breakage when a new Home Manager release
  # introduces backwards incompatible changes.
  #
  # You should not change this value, even if you update Home Manager. If you do
  # want to update the value, then make sure to first check the Home Manager
  # release notes.
  home.stateVersion = "24.05"; # Please read the comment before changing.

  # The home.packages option allows you to install Nix packages into your
  # environment.
  home.packages = [
    # # Adds the 'hello' command to your environment. It prints a friendly
    # # "Hello, world!" when run.
    # pkgs.hello

    # # It is sometimes useful to fine-tune packages, for example, by applying
    # # overrides. You can do that directly here, just don't forget the
    # # parentheses. Maybe you want to install Nerd Fonts with a limited number of
    # # fonts?
    # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })

    # # You can also create simple shell scripts directly inside your
    # # configuration. For example, this adds a command 'my-hello' to your
    # # environment:
    # (pkgs.writeShellScriptBin "my-hello" ''
    #   echo "Hello, ${config.home.username}!"
    # '')

    pkgs.wl-clipboard
    pkgs.nerdfonts
    pkgs.google-chrome
    pkgs.vscode
  ];

  # Home Manager is pretty good at managing dotfiles. The primary way to manage
  # plain files is through 'home.file'.
  home.file = {
    # # Building this configuration will create a copy of 'dotfiles/screenrc' in
    # # the Nix store. Activating the configuration will then make '~/.screenrc' a
    # # symlink to the Nix store copy.
    # ".screenrc".source = dotfiles/screenrc;

    # # You can also set the file content immediately.
    # ".gradle/gradle.properties".text = ''
    #   org.gradle.console=verbose
    #   org.gradle.daemon.idletimeout=3600000
    # '';
  };

  # Home Manager can also manage your environment variables through
  # 'home.sessionVariables'. These will be explicitly sourced when using a
  # shell provided by Home Manager. If you don't want to manage your shell
  # through Home Manager then you have to manually source 'hm-session-vars.sh'
  # located at either
  #
  #  ~/.nix-profile/etc/profile.d/hm-session-vars.sh
  #
  # or
  #
  #  ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
  #
  # or
  #
  #  /etc/profiles/per-user/nathan/etc/profile.d/hm-session-vars.sh
  #
  home.sessionVariables = {
    # EDITOR = "emacs";
  };

  home.pointerCursor = {
    name = "Adwaita";
    package = pkgs.gnome.adwaita-icon-theme;
    size = 24;
    x11 = {
      enable = true;
      defaultCursor = "Adwaita";
    };
  };

  # Let Home Manager install and manage itself.
  programs.home-manager.enable = true;
  programs.waybar.enable = true;
  programs.wofi.enable = true;

  services.wlsunset = {
    enable = true;
    sunrise = "06:30";
    sunset = "18:00";
  };
  services.swayosd.enable = true;
  services.swayidle.enable = true;
  services.swayidle.timeouts = [
    { timeout = 60; command = "${pkgs.swaylock}/bin/swaylock -fF"; }
    { timeout = 90; command = "${pkgs.systemd}/bin/systemctl suspend"; }
  ];
  services.mako.enable = true;

  nixpkgs.config.allowUnfree = true;
  fonts.fontconfig.enable = true;

  wayland.windowManager.sway.enable = true;
  wayland.windowManager.sway.config.defaultWorkspace = "workspace number 1";
  wayland.windowManager.sway.config.modifier = "Mod4";
  wayland.windowManager.sway.config.gaps = {
    smartBorders = "no_gaps";
    inner = 10;
  };
  wayland.windowManager.sway.config.input = {
    "type:keyboard" = {
      xkb_layout = "gb";
    };
    "type:touchpad" = {
      dwt = "disabled";
    };
  };
  wayland.windowManager.sway.config.keybindings = lib.mkOptionDefault {
    "Mod4+d" = "exec wofi --show drun";
    "XF86AudioRaiseVolume" = "exec swayosd-client --output-volume raise";
    "XF86AudioLowerVolume" = "exec swayosd-client --output-volume lower";
    "XF86AudioMute" = "exec swayosd-client --output-volume mute-toggle";
    "XF86MonBrightnessUp" = "exec swayosd-client --brightness +10";
    "XF86MonBrightnessDown" = "exec swayosd-client --brightness -10";
    "--release Caps_Lock" = "exec swayosd-client --caps-lock";
  };
  wayland.windowManager.sway.config.bars = [ { command = "swaybar_command waybar";  } ];
}

the error I get is

       … while evaluating the module argument `pkgs' in "/home/nathan/.config/home-manager/home.nix":

       error: infinite recursion encountered

Any help or guidance (general or specific!) very much appreciated :slight_smile:

I’d remove the overlays thing you have there, if you want to add overlays there’s already an option nixpkgs.overlays.

Also I hope you don’t literally use “…” for rev and hash and you actually chose a valid rev here.

You’d hope so, wouldn’t you! (I was using ... literally!)

I’m pretty sure I got the same error before adding in the overlays thing - I saw a bug report somewhere saying that the recursion error can be a result of trying to merge an empty overlays array or some such, with that as the recommended fix…

manually managing the rev seems a shame… should I bite the bullet and move over to using flakes?

Cheers for the response!

There are other options like GitHub - andir/npins: Nix dependency pinning. Very similar to Niv but has a few features that I personally wanted. or GitHub - berberman/nvfetcher: Generate nix sources expr for the latest version of packages to avoid having to manually maintain rev.

1 Like

You can’t depend on pkgs to fetch a module, that is the cause of the infinite recursion. If you’d prefer to keep using classic nix, definitely checkout npins as noted by @waffle8946. It will easily handle this:

❯ npins add github -b master danth stylix
[INFO ] Adding 'stylix' …
    repository: https://github.com/danth/stylix.git
    branch: master
    revision: 04afcfc0684d9bbb24bb1dc77afda7c1843ec93b
    url: https://github.com/danth/stylix/archive/04afcfc0684d9bbb24bb1dc77afda7c1843ec93b.tar.gz
    hash: 1dhrs6n041lcryjbxbd7ip664hxpkbzm9a9csg80f6g5zf7d6s5q

Updating is as simple as npins update. Then you can sources = import ./npins and

imports = [ (import sources.stylix).homeManagerModules.stylix ]
2 Likes