Configuration.nix syntax error when setting up lanzaboote

I am setting up my first nixos system and am running into an issue with enabling secure boot via lanzaboote.

I have followed the official lanzaboote setup guide and get through all steps until inserting the lanzaboote fragment into my configuration.nix.

This is the recommended fragment I am inserting:

# file: configuration.nix
{ pkgs, lib, ... }:
let
  sources = import ./lon.nix;
  lanzaboote = import sources.lanzaboote;
in
{
  imports = [ lanzaboote.nixosModules.lanzaboote ];

  environment.systemPackages = [
    # For debugging and troubleshooting Secure Boot.
    pkgs.sbctl
  ];

  # Lanzaboote currently replaces the systemd-boot module.
  # This setting is usually set to true in configuration.nix
  # generated at installation time. So we force it to false
  # for now.
  boot.loader.systemd-boot.enable = lib.mkForce false;

  boot.lanzaboote = {
    enable = true;
    pkiBundle = "/var/lib/sbctl";
  };
}

When I use nixos-rebuild switch I get the following syntax error:

 error: syntax error, unexpected LET, expecting INHERIT
       at /etc/nixos/configuration.nix:18:1:
           17| # file: configuration.nix
           18| let
             | ^
           19|   sources = import ./lon.nix;

I am new to the Nix language and declarative programming and working on learning, but unsure how to correct the error. I’ve tried:

  • Omitting the { pkgs, lib, … }: string
  • Commenting out the boot.loader.systemd-boot.enable = true;
  • Made the recommended fix of changing ‘let’ to ‘inherit’

I’m sure there’s an obvious mistake I’m making but would love some help in identifying it.

Can you please post your whole configuration.nix? When you say you’ve inserted this segment, did you actually just insert it in your configuration as-is, or you just added the parts that were needed?

Edit: Depending on how you’ve imported Lanzaboote, you might need to edit the import line like this:

lanzaboote = import sources.lanzaboote { inherit pkgs; };

Thanks for your help! Sure, here’s my configuration.nix file:

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];

  # Bootloader.
  boot.loader.systemd-boot.enable = true;
  # boot.loader.efi.canTouchEfiVariables = true;

  networking.hostName = "nixos"; # Define your hostname.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Enable networking
  networking.networkmanager.enable = true;

  # Set your time zone.
  time.timeZone = "Europe/London";

  # Select internationalisation properties.
  i18n.defaultLocale = "en_GB.UTF-8";

  i18n.extraLocaleSettings = {
    LC_ADDRESS = "en_GB.UTF-8";
    LC_IDENTIFICATION = "en_GB.UTF-8";
    LC_MEASUREMENT = "en_GB.UTF-8";
    LC_MONETARY = "en_GB.UTF-8";
    LC_NAME = "en_GB.UTF-8";
    LC_NUMERIC = "en_GB.UTF-8";
    LC_PAPER = "en_GB.UTF-8";
    LC_TELEPHONE = "en_GB.UTF-8";
    LC_TIME = "en_GB.UTF-8";
  };

  # Enable the X11 windowing system.
  services.xserver.enable = true;

  # Enable the GNOME Desktop Environment.
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;

  # Enable the gnome-keyring secrets vault. 
  # Will be exposed through DBus to programs willing to store secrets.
  services.gnome.gnome-keyring.enable = true;

  # enable Sway window manager
  programs.sway = {
    enable = true;
    wrapperFeatures.gtk = true;
  };

let
  sources = import ./lon.nix;
  lanzaboote = import sources.lanzaboote;
in
{
  imports = [ lanzaboote.nixosModules.lanzaboote ];

  environment.systemPackages = [
    # For debugging and troubleshooting Secure Boot.
    pkgs.sbctl
  ];

  # Lanzaboote currently replaces the systemd-boot module.
  # This setting is usually set to true in configuration.nix
  # generated at installation time. So we force it to false
  # for now.
  boot.loader.systemd-boot.enable = lib.mkForce false;

  boot.lanzaboote = {
    enable = true;
    pkiBundle = "/var/lib/sbctl";
  };
}

  # Enable fish

  programs.fish.enable = true;

  users.defaultUserShell = pkgs.fish;

programs.bash = {
  interactiveShellInit = ''
    if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
    then
      shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
      exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
    fi
  '';
};

  # kanshi systemd service
  systemd.user.services.kanshi = {
    description = "kanshi daemon";
    environment = {
      WAYLAND_DISPLAY="wayland-1";
      DISPLAY = ":0";
    }; 
    serviceConfig = {
      Type = "simple";
      ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file'';
    };                                                                 
  };

  # Configure keymap in X11
  services.xserver.xkb = {
    layout = "us";
    variant = "";
  };

  # Enable CUPS to print documents.
  services.printing.enable = true;

  # Enable sound with pipewire.
  services.pulseaudio.enable = false;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    # If you want to use JACK applications, uncomment this
    #jack.enable = true;

    # use the example session manager (no others are packaged yet so this is enabled by default,
    # no need to redefine it in your config for now)
    #media-session.enable = true;
  };

  # Enable touchpad support (enabled default in most desktopManager).
  # services.xserver.libinput.enable = true;

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.eli = {
    isNormalUser = true;
    description = "Eli Lassman";
    extraGroups = [ "networkmanager" "wheel" ];
    packages = with pkgs; [
    #  thunderbird
    ];
  };

  # Install firefox.
  programs.firefox.enable = true;

  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
  
  bash-completion
  bind
  blueman
  brightnessctl
  dex
  efibootmgr
  emacs
  file-roller
  firefox
  fish
  flatpak
  fwupd
  gimp
  git
  google-chrome
  kanshi
  kitty
  libreoffice-fresh
  lon
  man-db
  nano
  nerdfix
  networkmanagerapplet
  noto-fonts
  noto-fonts-color-emoji
  font-awesome
  font-awesome_4
  font-awesome_5
  font-awesome_6
  pasystray
  pavucontrol
  rsync
  sbctl
  sudo
  sway
  swaybg
  swayidle
  swaylock
  swaynotificationcenter
  vim
  vlc
  waybar
  wdisplays
  wget
  wine
  wofi
  wttrbar
  grim # screenshot functionality
  slurp # screenshot functionality
  wl-clipboard # wl-copy and wl-paste for copy/paste from stdin / stdout
  mako # notification system developed by swaywm maintainer
 # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
  #  wget
  ];

  # Installing fonts
  fonts.packages = with pkgs; [
nerd-fonts._3270
nerd-fonts.agave
nerd-fonts.anonymice
nerd-fonts.arimo
nerd-fonts.aurulent-sans-mono
nerd-fonts.bigblue-terminal
nerd-fonts.bitstream-vera-sans-mono
nerd-fonts.blex-mono
nerd-fonts.caskaydia-cove
nerd-fonts.caskaydia-mono
nerd-fonts.code-new-roman
nerd-fonts.comic-shanns-mono
nerd-fonts.commit-mono
nerd-fonts.cousine
nerd-fonts.d2coding
nerd-fonts.daddy-time-mono
nerd-fonts.departure-mono
nerd-fonts.dejavu-sans-mono
nerd-fonts.droid-sans-mono
nerd-fonts.envy-code-r
nerd-fonts.fantasque-sans-mono
nerd-fonts.fira-code
nerd-fonts.fira-mono
nerd-fonts.geist-mono
nerd-fonts.go-mono
nerd-fonts.gohufont
nerd-fonts.hack
nerd-fonts.hasklug
nerd-fonts.heavy-data
nerd-fonts.hurmit
nerd-fonts.im-writing
nerd-fonts.inconsolata
nerd-fonts.inconsolata-go
nerd-fonts.inconsolata-lgc
nerd-fonts.intone-mono
nerd-fonts.iosevka
nerd-fonts.iosevka-term
nerd-fonts.iosevka-term-slab
nerd-fonts.jetbrains-mono
nerd-fonts.lekton
nerd-fonts.liberation
nerd-fonts.lilex
nerd-fonts.martian-mono
nerd-fonts.meslo-lg
nerd-fonts.monaspace
nerd-fonts.monofur
nerd-fonts.monoid
nerd-fonts.mononoki
nerd-fonts.noto
nerd-fonts.open-dyslexic
nerd-fonts.overpass
nerd-fonts.profont
nerd-fonts.proggy-clean-tt
nerd-fonts.recursive-mono
nerd-fonts.roboto-mono
nerd-fonts.shure-tech-mono
nerd-fonts.sauce-code-pro
nerd-fonts.space-mono
nerd-fonts.symbols-only
nerd-fonts.terminess-ttf
nerd-fonts.tinos
nerd-fonts.ubuntu
nerd-fonts.ubuntu-mono
nerd-fonts.ubuntu-sans
nerd-fonts.victor-mono
nerd-fonts.zed-mono
  noto-fonts
  noto-fonts-cjk-sans
  noto-fonts-color-emoji
  noto-fonts-monochrome-emoji
  nerd-fonts.fira-code
  nerd-fonts.droid-sans-mono
  nerd-fonts.noto
  nerd-fonts.hack
  nerd-fonts.ubuntu
  nerd-fonts.symbols-only
  font-awesome
  font-awesome_4
  font-awesome_5
  font-awesome_6
];

services.fwupd.enable = true;
# For network issues, you might need something like this:
# networking.networkmanager.enable = true;
# services.fwupd.extraConfig = ''
#   [GSettings]
# GIO_USE_NETWORK_MONITOR=base
# '';


  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "25.11"; # Did you read the comment?

}

As I suspected - you have duplicated code fragments and that’s why the build fails. Here’s the cleaned-up version (notice the single configuration block). It has systemd disabled, and sbctlis moved to the system’s environmentPackagesdeclaration.

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

let
  sources = import ./lon.nix;
  lanzaboote = import sources.lanzaboote;
in
{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
      lanzaboote.nixosModules.lanzaboote
    ];

  # Bootloader.
  # boot.loader.systemd-boot.enable = true;
  # boot.loader.efi.canTouchEfiVariables = true;
  # Lanzaboote currently replaces the systemd-boot module.
  # This setting is usually set to true in configuration.nix
  # generated at installation time. So we force it to false
  # for now.
  boot.loader.systemd-boot.enable = lib.mkForce false;

  boot.lanzaboote = {
    enable = true;
    pkiBundle = "/var/lib/sbctl";
  };

  networking.hostName = "nixos"; # Define your hostname.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Enable networking
  networking.networkmanager.enable = true;

  # Set your time zone.
  time.timeZone = "Europe/London";

  # Select internationalisation properties.
  i18n.defaultLocale = "en_GB.UTF-8";

  i18n.extraLocaleSettings = {
    LC_ADDRESS = "en_GB.UTF-8";
    LC_IDENTIFICATION = "en_GB.UTF-8";
    LC_MEASUREMENT = "en_GB.UTF-8";
    LC_MONETARY = "en_GB.UTF-8";
    LC_NAME = "en_GB.UTF-8";
    LC_NUMERIC = "en_GB.UTF-8";
    LC_PAPER = "en_GB.UTF-8";
    LC_TELEPHONE = "en_GB.UTF-8";
    LC_TIME = "en_GB.UTF-8";
  };

  # Enable the X11 windowing system.
  services.xserver.enable = true;

  # Enable the GNOME Desktop Environment.
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;

  # Enable the gnome-keyring secrets vault. 
  # Will be exposed through DBus to programs willing to store secrets.
  services.gnome.gnome-keyring.enable = true;

  # enable Sway window manager
  programs.sway = {
    enable = true;
    wrapperFeatures.gtk = true;
  };

  # Enable fish

  programs.fish.enable = true;

  users.defaultUserShell = pkgs.fish;

programs.bash = {
  interactiveShellInit = ''
    if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
    then
      shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
      exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
    fi
  '';
};

  # kanshi systemd service
  systemd.user.services.kanshi = {
    description = "kanshi daemon";
    environment = {
      WAYLAND_DISPLAY="wayland-1";
      DISPLAY = ":0";
    }; 
    serviceConfig = {
      Type = "simple";
      ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file'';
    };                                                                 
  };

  # Configure keymap in X11
  services.xserver.xkb = {
    layout = "us";
    variant = "";
  };

  # Enable CUPS to print documents.
  services.printing.enable = true;

  # Enable sound with pipewire.
  services.pulseaudio.enable = false;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    # If you want to use JACK applications, uncomment this
    #jack.enable = true;

    # use the example session manager (no others are packaged yet so this is enabled by default,
    # no need to redefine it in your config for now)
    #media-session.enable = true;
  };

  # Enable touchpad support (enabled default in most desktopManager).
  # services.xserver.libinput.enable = true;

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.eli = {
    isNormalUser = true;
    description = "Eli Lassman";
    extraGroups = [ "networkmanager" "wheel" ];
    packages = with pkgs; [
    #  thunderbird
    ];
  };

  # Install firefox.
  programs.firefox.enable = true;

  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [
  sbctl # needed for Lanzaboote
  bash-completion
  bind
  blueman
  brightnessctl
  dex
  efibootmgr
  emacs
  file-roller
  firefox
  fish
  flatpak
  fwupd
  gimp
  git
  google-chrome
  kanshi
  kitty
  libreoffice-fresh
  lon
  man-db
  nano
  nerdfix
  networkmanagerapplet
  noto-fonts
  noto-fonts-color-emoji
  font-awesome
  font-awesome_4
  font-awesome_5
  font-awesome_6
  pasystray
  pavucontrol
  rsync
  sbctl
  sudo
  sway
  swaybg
  swayidle
  swaylock
  swaynotificationcenter
  vim
  vlc
  waybar
  wdisplays
  wget
  wine
  wofi
  wttrbar
  grim # screenshot functionality
  slurp # screenshot functionality
  wl-clipboard # wl-copy and wl-paste for copy/paste from stdin / stdout
  mako # notification system developed by swaywm maintainer
 # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
  #  wget
  ];

  # Installing fonts
  fonts.packages = with pkgs; [
nerd-fonts._3270
nerd-fonts.agave
nerd-fonts.anonymice
nerd-fonts.arimo
nerd-fonts.aurulent-sans-mono
nerd-fonts.bigblue-terminal
nerd-fonts.bitstream-vera-sans-mono
nerd-fonts.blex-mono
nerd-fonts.caskaydia-cove
nerd-fonts.caskaydia-mono
nerd-fonts.code-new-roman
nerd-fonts.comic-shanns-mono
nerd-fonts.commit-mono
nerd-fonts.cousine
nerd-fonts.d2coding
nerd-fonts.daddy-time-mono
nerd-fonts.departure-mono
nerd-fonts.dejavu-sans-mono
nerd-fonts.droid-sans-mono
nerd-fonts.envy-code-r
nerd-fonts.fantasque-sans-mono
nerd-fonts.fira-code
nerd-fonts.fira-mono
nerd-fonts.geist-mono
nerd-fonts.go-mono
nerd-fonts.gohufont
nerd-fonts.hack
nerd-fonts.hasklug
nerd-fonts.heavy-data
nerd-fonts.hurmit
nerd-fonts.im-writing
nerd-fonts.inconsolata
nerd-fonts.inconsolata-go
nerd-fonts.inconsolata-lgc
nerd-fonts.intone-mono
nerd-fonts.iosevka
nerd-fonts.iosevka-term
nerd-fonts.iosevka-term-slab
nerd-fonts.jetbrains-mono
nerd-fonts.lekton
nerd-fonts.liberation
nerd-fonts.lilex
nerd-fonts.martian-mono
nerd-fonts.meslo-lg
nerd-fonts.monaspace
nerd-fonts.monofur
nerd-fonts.monoid
nerd-fonts.mononoki
nerd-fonts.noto
nerd-fonts.open-dyslexic
nerd-fonts.overpass
nerd-fonts.profont
nerd-fonts.proggy-clean-tt
nerd-fonts.recursive-mono
nerd-fonts.roboto-mono
nerd-fonts.shure-tech-mono
nerd-fonts.sauce-code-pro
nerd-fonts.space-mono
nerd-fonts.symbols-only
nerd-fonts.terminess-ttf
nerd-fonts.tinos
nerd-fonts.ubuntu
nerd-fonts.ubuntu-mono
nerd-fonts.ubuntu-sans
nerd-fonts.victor-mono
nerd-fonts.zed-mono
  noto-fonts
  noto-fonts-cjk-sans
  noto-fonts-color-emoji
  noto-fonts-monochrome-emoji
  nerd-fonts.fira-code
  nerd-fonts.droid-sans-mono
  nerd-fonts.noto
  nerd-fonts.hack
  nerd-fonts.ubuntu
  nerd-fonts.symbols-only
  font-awesome
  font-awesome_4
  font-awesome_5
  font-awesome_6
];

services.fwupd.enable = true;
# For network issues, you might need something like this:
# networking.networkmanager.enable = true;
# services.fwupd.extraConfig = ''
#   [GSettings]
# GIO_USE_NETWORK_MONITOR=base
# '';


  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "25.11"; # Did you read the comment?

}

Thanks. I’m getting a new error (but feels like progress) with the systemd line:


       error: undefined variable 'lib'
       at /etc/nixos/configuration.nix:25:37:
           24|   # for now.
           25|   boot.loader.systemd-boot.enable = lib.mkForce false;
             |                                     ^
           26|

Ah, yes. Just modify the top line like this:

{ config, pkgs, lib, ... }:

Edit: I highly suggest you familiarize yourself with the basics of the Nix language so you understand what you’re actually doing. There’s a lot of documentation on https://nix.dev and https://wiki.nixos.org

1 Like

Specifically, you’re looking for the basic language tutorial and the module tutorial. The lib thing for example is explained in the first paragraph of the module tutorial.

The wiki is sadly largely useless or outright misleading, in spite of efforts to improve the situation.

It’s not so much that you have duplicated anything, it’s that you were writing code that was inherently nonsensical from a syntax perspective. You assume you can just copy modules into the middle of an attribute set and have nix figure it out, unaware of what attribute sets even are, let alone what the modules you’re writing are :wink:

1 Like

I fixed it up for you (just enough to make nixfmt happy).

I’d recommend getting a language server (nixd) and a formatter (nixfmt) configured for your editor, it’ll help you catch errors as you write them :slight_smile:

Read nix pills too, they’re great for learning Nix quickly.

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{
  config,
  lib,
  pkgs,
  ...
}:
let
  sources = import ./lon.nix;
  lanzaboote = import sources.lanzaboote;
in
{
  imports = [
    # Include the results of the hardware scan.
    ./hardware-configuration.nix
    lanzaboote.nixosModules.lanzaboote
  ];

  networking.hostName = "nixos"; # Define your hostname.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Enable networking
  networking.networkmanager.enable = true;

  # Set your time zone.
  time.timeZone = "Europe/London";

  # Select internationalisation properties.
  i18n.defaultLocale = "en_GB.UTF-8";

  i18n.extraLocaleSettings = {
    LC_ADDRESS = "en_GB.UTF-8";
    LC_IDENTIFICATION = "en_GB.UTF-8";
    LC_MEASUREMENT = "en_GB.UTF-8";
    LC_MONETARY = "en_GB.UTF-8";
    LC_NAME = "en_GB.UTF-8";
    LC_NUMERIC = "en_GB.UTF-8";
    LC_PAPER = "en_GB.UTF-8";
    LC_TELEPHONE = "en_GB.UTF-8";
    LC_TIME = "en_GB.UTF-8";
  };

  # Enable the X11 windowing system.
  services.xserver.enable = true;

  # Enable the GNOME Desktop Environment.
  services.xserver.displayManager.gdm.enable = true;
  services.xserver.desktopManager.gnome.enable = true;

  # Enable the gnome-keyring secrets vault.
  # Will be exposed through DBus to programs willing to store secrets.
  services.gnome.gnome-keyring.enable = true;

  # enable Sway window manager
  programs.sway = {
    enable = true;
    wrapperFeatures.gtk = true;
  };

  environment.systemPackages = [
    # For debugging and troubleshooting Secure Boot.
    pkgs.sbctl
  ];

  # Lanzaboote currently replaces the systemd-boot module.
  # This setting is usually set to true in configuration.nix
  # generated at installation time. So we force it to false
  # for now.
  boot.loader.systemd-boot.enable = lib.mkForce false;

  boot.lanzaboote = {
    enable = true;
    pkiBundle = "/var/lib/sbctl";
  };
  # Enable fish

  programs.fish.enable = true;

  users.defaultUserShell = pkgs.fish;

  programs.bash = {
    interactiveShellInit = ''
      if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
      then
        shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
        exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
      fi
    '';
  };

  # kanshi systemd service
  systemd.user.services.kanshi = {
    description = "kanshi daemon";
    environment = {
      WAYLAND_DISPLAY = "wayland-1";
      DISPLAY = ":0";
    };
    serviceConfig = {
      Type = "simple";
      ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file'';
    };
  };

  # Configure keymap in X11
  services.xserver.xkb = {
    layout = "us";
    variant = "";
  };

  # Enable CUPS to print documents.
  services.printing.enable = true;

  # Enable sound with pipewire.
  services.pulseaudio.enable = false;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    # If you want to use JACK applications, uncomment this
    #jack.enable = true;

    # use the example session manager (no others are packaged yet so this is enabled by default,
    # no need to redefine it in your config for now)
    #media-session.enable = true;
  };

  # Enable touchpad support (enabled default in most desktopManager).
  # services.xserver.libinput.enable = true;

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.eli = {
    isNormalUser = true;
    description = "Eli Lassman";
    extraGroups = [
      "networkmanager"
      "wheel"
    ];
    packages = with pkgs; [
      #  thunderbird
    ];
  };

  # Install firefox.
  programs.firefox.enable = true;

  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;

  # List packages installed in system profile. To search, run:
  # $ nix search wget
  environment.systemPackages = with pkgs; [

    bash-completion
    bind
    blueman
    brightnessctl
    dex
    efibootmgr
    emacs
    file-roller
    firefox
    fish
    flatpak
    fwupd
    gimp
    git
    google-chrome
    kanshi
    kitty
    libreoffice-fresh
    lon
    man-db
    nano
    nerdfix
    networkmanagerapplet
    noto-fonts
    noto-fonts-color-emoji
    font-awesome
    font-awesome_4
    font-awesome_5
    font-awesome_6
    pasystray
    pavucontrol
    rsync
    sbctl
    sudo
    sway
    swaybg
    swayidle
    swaylock
    swaynotificationcenter
    vim
    vlc
    waybar
    wdisplays
    wget
    wine
    wofi
    wttrbar
    grim # screenshot functionality
    slurp # screenshot functionality
    wl-clipboard # wl-copy and wl-paste for copy/paste from stdin / stdout
    mako # notification system developed by swaywm maintainer
    # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
    #  wget
  ];

  # Installing fonts
  fonts.packages = with pkgs; [
    nerd-fonts._3270
    nerd-fonts.agave
    nerd-fonts.anonymice
    nerd-fonts.arimo
    nerd-fonts.aurulent-sans-mono
    nerd-fonts.bigblue-terminal
    nerd-fonts.bitstream-vera-sans-mono
    nerd-fonts.blex-mono
    nerd-fonts.caskaydia-cove
    nerd-fonts.caskaydia-mono
    nerd-fonts.code-new-roman
    nerd-fonts.comic-shanns-mono
    nerd-fonts.commit-mono
    nerd-fonts.cousine
    nerd-fonts.d2coding
    nerd-fonts.daddy-time-mono
    nerd-fonts.departure-mono
    nerd-fonts.dejavu-sans-mono
    nerd-fonts.droid-sans-mono
    nerd-fonts.envy-code-r
    nerd-fonts.fantasque-sans-mono
    nerd-fonts.fira-code
    nerd-fonts.fira-mono
    nerd-fonts.geist-mono
    nerd-fonts.go-mono
    nerd-fonts.gohufont
    nerd-fonts.hack
    nerd-fonts.hasklug
    nerd-fonts.heavy-data
    nerd-fonts.hurmit
    nerd-fonts.im-writing
    nerd-fonts.inconsolata
    nerd-fonts.inconsolata-go
    nerd-fonts.inconsolata-lgc
    nerd-fonts.intone-mono
    nerd-fonts.iosevka
    nerd-fonts.iosevka-term
    nerd-fonts.iosevka-term-slab
    nerd-fonts.jetbrains-mono
    nerd-fonts.lekton
    nerd-fonts.liberation
    nerd-fonts.lilex
    nerd-fonts.martian-mono
    nerd-fonts.meslo-lg
    nerd-fonts.monaspace
    nerd-fonts.monofur
    nerd-fonts.monoid
    nerd-fonts.mononoki
    nerd-fonts.noto
    nerd-fonts.open-dyslexic
    nerd-fonts.overpass
    nerd-fonts.profont
    nerd-fonts.proggy-clean-tt
    nerd-fonts.recursive-mono
    nerd-fonts.roboto-mono
    nerd-fonts.shure-tech-mono
    nerd-fonts.sauce-code-pro
    nerd-fonts.space-mono
    nerd-fonts.symbols-only
    nerd-fonts.terminess-ttf
    nerd-fonts.tinos
    nerd-fonts.ubuntu
    nerd-fonts.ubuntu-mono
    nerd-fonts.ubuntu-sans
    nerd-fonts.victor-mono
    nerd-fonts.zed-mono
    noto-fonts
    noto-fonts-cjk-sans
    noto-fonts-color-emoji
    noto-fonts-monochrome-emoji
    nerd-fonts.fira-code
    nerd-fonts.droid-sans-mono
    nerd-fonts.noto
    nerd-fonts.hack
    nerd-fonts.ubuntu
    nerd-fonts.symbols-only
    font-awesome
    font-awesome_4
    font-awesome_5
    font-awesome_6
  ];

  services.fwupd.enable = true;
  # For network issues, you might need something like this:
  # networking.networkmanager.enable = true;
  # services.fwupd.extraConfig = ''
  #   [GSettings]
  # GIO_USE_NETWORK_MONITOR=base
  # '';

  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "25.11"; # Did you read the comment?
}
1 Like