{ config, pkgs, lib, bonPkgs, bonLib, inputs, ... }: let user = "l-nafaryus"; in { # Users users.users.l-nafaryus = { isNormalUser = true; description = "L-Nafaryus"; extraGroups = ["networkmanager" "wheel" "audio" "libvirtd" "input" "video" "disk" "wireshark" "adbusers"]; group = "users"; uid = 1000; initialPassword = "nixos"; shell = pkgs.fish; openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG1YGp8AI48hJUSQBZpuKLpbj2+3Q09vq64NxFr0N1MS" ]; }; home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; home-manager.backupFileExtension = "hmbackup"; home-manager.users.${user} = {pkgs, ...}: let hmConfig = config.home-manager.users.${user}; in { home.stateVersion = "23.11"; home.username = "l-nafaryus"; home.homeDirectory = "/home/l-nafaryus"; imports = [ (bonLib.injectArgs { inherit hmConfig; }) inputs.catppuccin.homeManagerModules.catppuccin inputs.ags.homeManagerModules.default #bonLib.preconfiguredModules.homeManager.hyprland ]; home.packages = with pkgs; [ taskwarrior3 gparted firefox thunderbird pipewire.jack # pw-jack carla qpwgraph wireplumber yabridge yabridgectl lutris wine winetricks gamemode vlc lollypop gimp inkscape imagemagick blender ardour olive-editor openshot-qt musescore # soundux # unmaintained losslesscut-bin yt-dlp ffmpeg calf zynaddsubfx lsp-plugins x42-plugins cardinal gxplugins-lv2 xtuner aether-lv2 aeolus grandorgue qbittorrent transmission_3-qt telegram-desktop onlyoffice-bin jdk bonPkgs.ultimmc steamtinkerlaunch #dunst #libnotify # btop lua # bat mangohud gamescope libstrangle tree bonPkgs.bonvim freenect mpc-cli kdePackages.kmail kdePackages.kmail-account-wizard kdePackages.krdc flacon picard docker-compose podman-compose dive lazydocker ksshaskpass # virtiofsd ]; xdg.portal = { enable = true; configPackages = with pkgs; [ kdePackages.xdg-desktop-portal-kde ]; extraPortals = with pkgs; [ xdg-desktop-portal-gtk ]; }; # Theme catppuccin = { # global, for all enabled programs enable = true; flavor = "macchiato"; accent = "green"; }; programs = { nushell = { enable = true; # The config.nu can be anywhere you want if you like to edit your Nushell with Nu #configFile.source = ./.../config.nu; # for editing directly to config.nu extraConfig = '' let carapace_completer = {|spans| carapace $spans.0 nushell $spans | from json } $env.config = { show_banner: false, completions: { case_sensitive: false # case-sensitive completions quick: true # set to false to prevent auto-selecting completions partial: true # set to false to prevent partial filling of the prompt algorithm: "fuzzy" external: { enable: true max_results: 100 completer: $carapace_completer } } } ''; }; carapace = { enable = true; enableNushellIntegration = true; enableBashIntegration = true; }; starship = { enable = true; enableNushellIntegration = true; enableBashIntegration = true; settings = { add_newline = true; format = '' $all $fill $time $character ''; fill = { symbol = " "; }; line_break = { disabled = true; }; directory = { truncate_to_repo = false; }; time = { disabled = false; use_12hr = true; }; character = { success_symbol = "[❯](bold green)"; error_symbol = "[❯](bold red)"; }; nix_shell = { symbol = " "; heuristic = true; }; }; }; }; programs = { # General fish = { enable = true; interactiveShellInit = '' set fish_greeting ''; plugins = with pkgs.fishPlugins; map (p: { name = p.pname; src = p.src; }) [ fzf-fish tide grc hydro ]; functions = { fish-theme-configure = '' tide configure \ --auto \ --style=Lean \ --prompt_colors='True color' \ --show_time='12-hour format' \ --lean_prompt_height='Two lines' \ --prompt_connection=Disconnected \ --prompt_spacing=Compact \ --icons='Many icons' \ --transient=No ''; }; }; git = { enable = true; lfs.enable = true; userName = "L-Nafaryus"; userEmail = "l.nafaryus@gmail.com"; signing = { key = "86F1EA98B48FFB19"; signByDefault = true; }; extraConfig = { # ignore trends init.defaultBranch = "master"; core = { quotePath = false; commitGraph = true; whitespace = "trailing-space"; }; receive.advertisePushOptions = true; gc.writeCommitGraph = true; diff.submodule = "log"; }; aliases = { plog = "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"; }; }; # TODO: bat cannot determine catppuccin theme bat.enable = true; btop = { enable = true; settings = { cpu_bottom = true; proc_tree = true; }; }; fzf.enable = true; tmux.enable = true; lazygit.enable = true; gpg = { enable = true; homedir = "${hmConfig.xdg.configHome}/gnupg"; mutableKeys = true; mutableTrust = true; settings = { default-key = "B0B3 DFDB B842 BE9C 7468 B511 86F1 EA98 B48F FB19"; }; # TODO: replace existing ssh key with gpg provided }; nnn = { enable = true; package = pkgs.nnn.override {withNerdIcons = true;}; bookmarks = { d = "~/Downloads"; p = "~/projects"; i = "~/Pictures"; m = "~/Music"; v = "~/Videos"; }; plugins = { src = "${hmConfig.programs.nnn.finalPackage}/share/plugins"; mappings = { # TODO: add used programs for previews with FIFO support p = "preview-tui"; }; }; }; ncmpcpp.enable = true; # Graphical wezterm = { enable = false; package = inputs.wezterm.packages.x86_64-linux.default; extraConfig = '' return { color_scheme = "Catppuccin Macchiato", default_prog = { "fish" }, font_size = 10.0, enable_tab_bar = true, hide_tab_bar_if_only_one_tab = true, term = "wezterm", window_padding = { left = 0, right = 0, top = 0, bottom = 0 }, -- ISSUE: the terminal does not update after some time of use. It only updates with mouse movements. [Wayland, Hyprland] enable_wayland = false } ''; }; rofi = { enable = false; package = pkgs.rofi-wayland; terminal = "${lib.getExe hmConfig.programs.wezterm.package}"; cycle = true; extraConfig = { show-icons = true; disable-history = false; }; theme = let inherit (hmConfig.lib.formats.rasi) mkLiteral; in { "*" = { border-col = mkLiteral "#a6da95"; }; window = { border-radius = mkLiteral "5px"; }; # TODO: make window bigger, for 2k monitor, yeah }; }; obs-studio = { enable = true; plugins = with pkgs.obs-studio-plugins; [ obs-vkcapture input-overlay obs-pipewire-audio-capture wlrobs inputs.obs-image-reaction.packages.${pkgs.system}.default ]; }; mpv = { enable = true; # TODO: check ImPlay for packaging, it's may be better alternative to pure mpv }; }; services = { # General gpg-agent = { enable = true; defaultCacheTtl = 3600; defaultCacheTtlSsh = 3600; enableSshSupport = true; pinentryPackage = pkgs.pinentry-qt; enableFishIntegration = true; enableBashIntegration = true; }; #mpd = { # enable = true; #}; # TODO: meet mpdris2 with system mpd #mpdris2 = { # enable = true; #}; }; # Graphical # XDG xdg = { enable = true; mime.enable = true; userDirs.enable = true; }; # dconf dconf.settings = { "org/virt-manager/virt-manager/connections" = { autoconnect = ["qemu:///system"]; uris = ["qemu:///system"]; }; }; home.sessionVariables = { HYPRSHOT_DIR = "${hmConfig.xdg.userDirs.pictures}/screenshots"; }; }; environment.variables = let makePluginPath = name: (lib.makeSearchPath name [ "/etc/profiles/per-user/$USER/lib" "/run/current-system/sw/lib" "$HOME/.nix-profile/lib" ]) + ":$HOME/.${name}"; in { LADSPA_PATH = makePluginPath "ladspa"; LV2_PATH = makePluginPath "lv2"; VST_PATH = makePluginPath "vst"; VST3_PATH = makePluginPath "vst3"; }; environment.sessionVariables = { # hint electron applications to use wayland NIXOS_OZONE_WL = "1"; DOCKER_HOST = "unix:///run/user/${toString config.users.users.l-nafaryus.uid}/podman/podman.sock"; }; systemd.user.extraConfig = "DefaultLimitNOFILE=524288"; programs.virt-manager.enable = true; programs.wireshark = { enable = true; package = pkgs.wireshark; }; # Services services.spoofdpi.enable = true; #services.zapret = { # enable = true; # mode = "nfqws"; # firewallType = "iptables"; # disableIpv6 = true; # settings = '' # MODE_HTTP=1 # MODE_HTTP_KEEPALIVE=0 # MODE_HTTPS=1 # MODE_QUIC=1 # MODE_FILTER=ipset # TPWS_OPT="--split-http-req=method --split-pos=1 --oob" # NFQWS_OPT_DESYNC="--dpi-desync=fake --dpi-desync-ttl=5" # NFQWS_OPT_DESYNC_HTTP="--dpi-desync=fake --dpi-desync-ttl=5" # NFQWS_OPT_DESYNC_HTTPS="--dpi-desync=fake --dpi-desync-ttl=5" # NFQWS_OPT_DESYNC_QUIC="--dpi-desync=fake --dpi-desync-ttl=5" # INIT_APPLY_FW=1 # ''; # filterAddressesSource = "https://antifilter.network/download/ipsmart.lst"; #}; # TODO: remember who use gvfs services.gvfs.enable = true; services.mpd = { enable = true; musicDirectory = "/media/vault/audio/music"; network.listenAddress = "any"; network.startWhenNeeded = true; user = "l-nafaryus"; extraConfig = '' audio_output { type "pipewire" name "PipeWire" } ''; }; systemd.services.mpd.environment = { # https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/609 # User-id must match above user. MPD will look inside this directory for the PipeWire socket. XDG_RUNTIME_DIR = "/run/user/${toString config.users.users.l-nafaryus.uid}"; }; programs.kdeconnect = { enable = true; package = lib.mkForce pkgs.kdePackages.kdeconnect-kde; }; programs.direnv.enable = true; fonts.packages = with pkgs; [nerd-fonts.jetbrains-mono liberation_ttf]; programs.steam.enable = true; systemd.extraConfig = "DefaultLimitNOFILE=1048576"; programs.ssh = { enableAskPassword = true; askPassword = "${lib.getExe' pkgs.ksshaskpass "ksshaskpass"}"; hostKeyAlgorithms = ["ssh-ed25519" "ssh-rsa"]; startAgent = true; }; programs.adb.enable = true; services.udev.packages = [pkgs.android-udev-rules]; }