I've installed NixOS in my laptop -a Thinkpad x280- for my very first time, and the installation process was pretty straightforward.
Everything is working as expected after some tweaking: X11, power management, acpi -including the backlight-, the touchpad, suspend, audio, camera and all of my applications are working fine with the (almost) same configuration as I had in my previous Arch Linux system.
After a week working with NixOS, still is "a stranger" distro to me because there are something "weird things" like non-standard directories (and everything is "packed") in the /nix path and there are some "concepts" around the configuration, which can be splited into more files and also some concepts like flakes and home-manager configurations, which makes sense to me if you want to perform post configurations into your dotfiles and declare all the custom parameters for your tool chain.
NixOS is like a sort of ansible/chef tools integrated with the operating system and this is a very cool concept.
This is an experiment anyway, I'm still learning a lots of new concepts and it's is a long way to run. Still, I'm thinking on try another desktop installation but with Wayland and with the sway echosystem. Also I want to tweak again the configuration in order to perform a new installation but with encrypted filesystems and start using my Yubikey, but that's another history...
This is my current running configuration.nix file (use at your own risk!):
{ config, pkgs, ... }: { imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix ]; boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; boot.kernelParams = [ "quiet" "ipv6.disable=1" "i915.enable_dpcd_backlight=3" ]; networking.hostName = "hyperion"; # Define your hostname. networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. time.timeZone = "Europe/London"; i18n.defaultLocale = "en_GB.UTF-8"; console = { font = "Lat2-Terminus16"; # keyMap = "uk"; useXkbConfig = true; # use xkbOptions in tty. }; hardware.bluetooth.enable = true; hardware.pulseaudio.enable = true; programs.thunar.enable = true; services.blueman.enable = true; services.xserver.enable = true; services.xserver.layout = "uk"; services.xserver.libinput.enable = true; services.xserver.windowManager.bspwm.enable = true; services.xserver.displayManager.lightdm.enable = true; services.xserver.displayManager.lightdm.background = "/home/iban/Pictures/wallpapers/fu5RgsM.jpg"; services.xserver.displayManager.lightdm.greeters.gtk.cursorTheme.name = "Catppuccin-Macchiato-Dark-Cursors"; services.xserver.displayManager.lightdm.greeters.gtk.theme.name = "Materia-dark-compact"; services.xserver.displayManager.lightdm.greeters.gtk.iconTheme.name = "Materia-dark-compact"; services.xserver.displayManager.lightdm.greeters.gtk.indicators = [ "~power" ]; services.gnome.gnome-keyring.enable = true; # services.printing.enable = true; sound.enable = true; users.users.iban = { isNormalUser = true; initialPassword = "1234567"; shell = pkgs.zsh; extraGroups = [ "wheel" "networkmanager" "audio" "video" "docker" "input" "storage" ]; packages = with pkgs; [ zsh thunderbird ]; }; nixpkgs.config.allowUnfree = true; nixpkgs.config.pulseaudio = true; virtualisation.docker.enable = true; virtualisation.docker.storageDriver = "btrfs"; environment.systemPackages = with pkgs; [ (polybar.override { mpdSupport = true; }) accountsservice amfora argocd arp-scan aseprite awscli2 bat bc calc catppuccin-cursors.macchiatoDark cargo chromium clippy dmenu docker dos2unix drawterm dunst feh ffmpeg fftw figlet file flac fluxcd fzf-zsh gcc gh git gnumake go gotop gpg-tui gummi gvfs hut imagemagick jq k9s keepass keepassxc killall kitty kube3d kubectl kubectx kubernetes-helm-wrapped lagrange libmpdclient libreoffice libvdpau lightlocker lsd lsof lxappearance materia-theme mc microcodeIntel microsoft-edge milkytracker moc mpd mpv ncdu ncmpcpp neofetch neovim nerdfonts netcat-gnu networkmanager_dmenu nfs-utils nmap nmapsi4 obs-studio oh-my-zsh pass pass-git-helper pavucontrol picom pkg-config plymouth power-profiles-daemon powertop profanity pulseaudio python3 python310Packages.mechanicalsoup python310Packages.pip pywal qbittorrent qtpass qutebrowser ranger ripgrep rofi rsync rustc rustfmt scrot starship sxhkd tdesktop terraform tiled tmux todo-txt-cli toot unzip upower vaapiIntel velero vim vlc vscode w3m weather-icons wget wmname xbanish xclip xdotool xfce.thunar xfce.thunar-archive-plugin xfce.thunar-media-tags-plugin xfce.thunar-volman xfce.xfce4-screenshooter xorg.xbacklight xournalpp yad youtube-dl yubikey-manager yubikey-manager-qt yubikey-personalization-gui zathura zsh zsh-autosuggestions zstd ]; fonts.fonts = with pkgs; [ cascadia-code noto-fonts (nerdfonts.override { fonts = [ "FiraCode" "DroidSansMono" ]; }) dina-font fira-code fira-code-symbols liberation_ttf mplus-outline-fonts.githubRelease nerdfonts noto-fonts-cjk noto-fonts-emoji proggyfonts ]; security.pam.mount.enable = true; security.pam.mount.createMountPoints = true; programs.gnupg.agent = { enable = true; enableSSHSupport = true; }; programs.light.enable = true; programs.zsh = { enable = true; ohMyZsh = { enable = true; plugins = [ "docker" "git" "gh" "golang" "history" "kubectl" "kubectx" "pass" "rust" "ssh-agent" "sudo" "systemd" "terraform" "tmux" "vault"]; # theme = "robbyrussell"; }; }; hardware.pulseaudio.extraConfig = "load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1"; services.mpd.extraConfig = '' audio_output { type "pulse" name "Pulseaudio" server "127.0.0.1" } audio_output { type "fifo" name "Visualizer feed" path "/tmp/mpd.fifo" format "44100:16:2" } ''; services.mpd.enable = true; services.mpd.musicDirectory = "nfs://192.168.0.2/Music/"; services.power-profiles-daemon.enable = true; services.upower.enable = true; services.udisks2.enable = true; security.polkit.enable = true; services.accounts-daemon.enable = true; services.gnome.glib-networking.enable = true; services.gvfs.enable = true; services.tumbler.enable = true; services.xserver.updateDbusEnvironment = true; services.openssh.enable = true; networking.firewall.enable = true; networking.firewall.allowedTCPPorts = [ 22 ]; system.copySystemConfiguration = true; system.stateVersion = "22.11"; }
NOTE: "1234567" is NOT my password ;-)