diff --git a/base.nix b/base.nix index 55708c3..b20c3a8 100644 --- a/base.nix +++ b/base.nix @@ -31,8 +31,7 @@ }]; }; nix = { - nixPath = options.nix.nixPath.default - ++ [ "nixpkgs-overlays=./overlays.nix" ]; + nixPath = [ "nixpkgs-overlays=./overlays.nix" ]; optimise.automatic = true; gc = { automatic = true; diff --git a/bundles/art.nix b/bundles/art.nix deleted file mode 100644 index 3ed2220..0000000 --- a/bundles/art.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ config, pkgs, ... }: - -{ - users.users.jawz.packages = with pkgs; ([ - gimp # the coolest bestest art program to never exist - krita # art to your heart desire! - mypaint # not the best art program - mypaint-brushes # but it's got some - mypaint-brushes1 # nice damn brushes - # drawpile # arty party with friends!! - pureref # create inspiration/reference boards - blender # cgi animation and sculpting - ]); -} diff --git a/bundles/dev/haskell.nix b/bundles/dev/haskell.nix deleted file mode 100644 index 55c164c..0000000 --- a/bundles/dev/haskell.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ config, pkgs, ... }: - -{ - users.users.jawz.packages = with pkgs; ([ - ghc # compiler - haskell-language-server # lsp - ]); -} diff --git a/bundles/dev/nix.nix b/bundles/dev/nix.nix deleted file mode 100644 index 4bd5eee..0000000 --- a/bundles/dev/nix.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ config, pkgs, ... }: - -{ - users.users.jawz.packages = with pkgs; ([ - expect # keep color when nom'ing - nix-output-monitor # autistic nix builds - nixfmt # linting - cachix # why spend time compiling? - ]); -} diff --git a/bundles/dev/python.nix b/bundles/dev/python.nix deleted file mode 100644 index 419acd8..0000000 --- a/bundles/dev/python.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ config, pkgs, ... }: - -{ - users.users.jawz.packages = with pkgs; ([ - pipenv # python development workflow for humans - (python3.withPackages (ps: - with ps; [ - # nose # testing and running python scripts - # poetry # dependency management made easy - # pytest # framework for writing tests - black # Python code formatter - editorconfig # follow rules of contributin - flake8 # wraper for pyflakes, pycodestyle and mccabe - isort # sort Python imports - pyflakes # checks source code for errors - pylint # bug and style checker for python - speedtest-cli # check internet speed from the comand line - ])) - ]); -} diff --git a/configuration.nix b/configuration.nix new file mode 100644 index 0000000..c877cb8 --- /dev/null +++ b/configuration.nix @@ -0,0 +1,822 @@ +{ config, lib, pkgs, ... }: +let + version = "23.11"; + cpuArch = "x86_64-linux"; + myEmail = "CaptainJawZ@outlook.com"; + myName = "Danilo Reyes"; + cpuArchitecture = "znver3"; + home-manager = builtins.fetchTarball + "https://github.com/nix-community/home-manager/archive/release-${version}.tar.gz"; + unstable = import + (builtins.fetchTarball "https://github.com/nixos/nixpkgs/tarball/master") { + config = config.nixpkgs.config; + }; + nixGaming = import (builtins.fetchTarball + "https://github.com/fufexan/nix-gaming/archive/master.tar.gz"); + jawzTasks = + pkgs.writeScriptBin "tasks" (builtins.readFile ../scripts/tasks.sh); +in { # Remember to close this bracket at the end of the document + + imports = [ + # + ./fstab.nix + (import "${home-manager}/nixos") + # nixGaming.nixosModules.pipewireLowLatency + ]; + + networking = { + useDHCP = lib.mkDefault true; + enableIPv6 = false; + hostName = "workstation"; + networkmanager.enable = true; + extraHosts = '' + 192.168.1.69 server + 192.168.1.100 miniserver + ''; + firewall = let + openFirewallPorts = [ + 7860 # gpt + 6674 # ns-usbloader + ]; + openFirewallPortRanges = [{ + from = 1714; + to = 1764; + } # kdeconnect + ]; + in { + enable = true; + allowedTCPPorts = openFirewallPorts; + allowedUDPPorts = openFirewallPorts; + allowedTCPPortRanges = openFirewallPortRanges; + allowedUDPPortRanges = openFirewallPortRanges; + }; + }; + + time = { + timeZone = "America/Mexico_City"; + hardwareClockInLocalTime = true; + }; + i18n = { + defaultLocale = "en_CA.UTF-8"; + extraLocaleSettings = { LC_MONETARY = "es_MX.UTF-8"; }; + }; + console = { + font = "Lat2-Terminus16"; + keyMap = "us"; + # useXkbConfig = true; # use xkbOptions in tty. + }; + + system = { + copySystemConfiguration = true; + stateVersion = "${version}"; + }; + nix = let + featuresList = [ + "nixos-test" + "benchmark" + "big-parallel" + "kvm" + "gccarch-${cpuArchitecture}" + "gccarch-skylake" + ]; + in { + gc = { + automatic = true; + dates = "weekly"; + }; + distributedBuilds = true; + settings = { + cores = 16; + auto-optimise-store = true; + trusted-users = [ "nixremote" ]; + system-features = featuresList; + experimental-features = [ "nix-command" "flakes" ]; + substituters = [ + "https://nix-gaming.cachix.org" + "https://nixpkgs-python.cachix.org" + "https://devenv.cachix.org" + "https://cuda-maintainers.cachix.org" + "https://ai.cachix.org" + ]; + trusted-public-keys = [ + "nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4=" + "nixpkgs-python.cachix.org-1:hxjI7pFxTyuTHn2NkvWCrAUcNZLNS3ZAvfYNuYifcEU=" + "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=" + "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" + "ai.cachix.org-1:N9dzRK+alWwoKXQlnn0H6aUx0lU/mspIoz8hMvGvbbc=" + ]; + }; + }; + + services = { + xserver = { + videoDrivers = [ "nvidia" ]; + enable = true; + displayManager.gdm.enable = true; + desktopManager = { gnome.enable = true; }; + layout = "us"; + libinput.enable = true; + }; + }; + + environment.gnome.excludePackages = (with pkgs; [ + gnome-photos + gnome-tour + gnome-text-editor + gnome-connections + # gnome-shell-extensions + baobab + ]) ++ (with pkgs.gnome; [ + # totem + gedit + gnome-music + epiphany + gnome-characters + yelp + gnome-font-viewer + cheese + ]); + + # Sets up QT to use adwaita themes. + qt = { + enable = true; + style = "adwaita"; + }; + + sound.enable = false; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # lowLatency = { + # enable = true; + # quantum = 64; + # rate = 48000; + # }; + }; + hardware.pulseaudio.enable = false; + + security = { + polkit.enable = true; + rtkit.enable = true; + sudo = { + enable = true; + wheelNeedsPassword = false; + }; + pam.loginLimits = [{ + domain = "*"; + type = "soft"; + item = "nofile"; + value = "8192"; + }]; + }; + + nixpkgs = { + hostPlatform = lib.mkDefault cpuArch; + config = { + allowUnfree = true; + permittedInsecurePackages = [ ]; + }; + # localSystem = { + # gcc.arch = cpuArchitecture; + # gcc.tune = cpuArchitecture; + # system = "x86_64-linux"; + # }; + }; + + users = { + groups = { + piracy.gid = 985; + nixremote.gid = 555; + }; + users = { + nixremote = { + isNormalUser = true; + createHome = true; + group = "nixremote"; + home = "/var/nixremote/"; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN6HsajaTL+nTJtSIu00M5WJwgt/7fyU59gBr2R7tbnv root@server" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGrC7sVvDT0is2oq/H1Do99LPaQKvyGMAsrF6/fuf1aP root@miniserver" + ]; + }; + jawz = { + isNormalUser = true; + extraGroups = [ + "wheel" + "networkmanager" + "scanner" + "lp" + "piracy" + "kavita" + "video" + "docker" + "libvirt" + "rslsync" + ]; + initialPassword = "password"; + openssh = { + authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5GaQM4N+yGAByibOFQOBVMV/6TjOfaGIP+NunMiK76 gpodeacerocdreyes@100CDREYES" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMkpeIV9G26W2/e9PsjBx3sNwPGoicJ807ExRGh4KjhW jawz@server" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGjnNIggZweJ+GJKKvFEPhpLcs+t64xXjBmeuERsLFLL jawz@miniserver" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBEblxSDhWPEo33crSjooeUg4W02ruENxHLmmBqCuIo jawz@galaxy" + ]; + }; + + packages = (with pkgs; [ + + hunspell + hunspellDicts.it_IT + hunspellDicts.es_MX + hunspellDicts.es_ES + hunspellDicts.en_CA-large + + # Themes + adw-gtk3 + gnome.gnome-tweaks # tweaks for the gnome desktop environment + # gradience # theme customizer, allows you to modify adw-gtk3 themes + + # Fonts + (nerdfonts.override { + fonts = [ + "Agave" + "CascadiaCode" + "SourceCodePro" + "ComicShannsMono" + "OpenDyslexic" + "Ubuntu" + "FiraCode" + "Iosevka" + ]; + }) + symbola + (papirus-icon-theme.override { color = "adwaita"; }) + + godot_4 # game development + unstable.gdtoolkit # gdscript language server + blender # cgi animation and sculpting + + gimp # the coolest bestest art program to never exist + krita # art to your heart desire! + mypaint # not the best art program + mypaint-brushes # but it's got some + mypaint-brushes1 # nice damn brushes + # drawpile # arty party with friends!! + + pureref # create inspiration/reference boards + + wineWowPackages.stable + (lutris.override { + extraPkgs = pkgs: [ + winetricks + wine64Packages.stable + wineWowPackages.stable + ]; + }) + cartridges # games launcher + heroic # install epic games + gamemode # optimizes linux to have better gaming performance + # grapejuice # roblox manager + # minecraft # minecraft official launcher + protonup-qt # update proton-ge + ns-usbloader # load games into my switch + + # emulators + rpcs3 # ps3 emulator + pcsx2 # ps2 emulator + cemu # wii u emulator + dolphin-emu # wii emulator + citra-nightly # 3Ds emulator + snes9x-gtk # snes emulator + + libreoffice # office, but based + calibre # ugly af eBook library manager + # foliate # gtk eBook reader + # newsflash # feed reader, syncs with nextcloud + # wike # gtk wikipedia wow! + # denaro # manage your finances + furtherance # I packaged this one tehee track time utility + gnome.simple-scan # scanner + + blanket # background noise + pika-backup # backups + metadata-cleaner # remove any metadata and geolocation from files + # sequeler # friendly SQL client + # czkawka # duplicate finder + # celeste # sync tool for any cloud provider + + easyeffects # equalizer + celluloid # video player + # cozy # audiobooks player + # hakuneko # manga & comic GUI downloader + # gnome-podcasts # podcast player + handbrake # video converter, may be unnecessary + curtail # image compressor + pitivi # video editor + identity # compare images or videos + gnome-obfuscate # censor private information + mousai # poor man shazam + tagger # tag music files + obs-studio # screen recorder & streamer + shortwave # listen to world radio + nextcloud-client # self-hosted google-drive alternative + fragments # beautiful torrent client + + protonmail-bridge # bridge for protonmail + tor-browser-bundle-bin # dark web, so dark! + chromium # web browser with spyware included + telegram-desktop # furry chat + nicotine-plus # remember Ares? + vesktop + (pkgs.discord.override { + withOpenASAR = true; + # withVencord = true; + }) + # hugo # website engine + + unstable.yt-dlp # downloads videos from most video websites + gallery-dl # similar to yt-dlp but for most image gallery websites + + fd # modern find, faster searches + fzf # fuzzy finder! super cool and useful + gdu # disk-space utility checker, somewhat useful + du-dust # rusty du similar to gdu + (ripgrep.override { withPCRE2 = true; }) # modern grep + trash-cli # oop! did not meant to delete that + eza # like ls but with colors + gocryptfs # encrypted filesystem! shhh!!! + rmlint # probably my favourite app, amazing dupe finder that integrates well with BTRFS + imagemagick # photoshop what?? + + ffmpeg_5-full # not ffmpreg, the coolest video conversion tool! + torrenttools # create torrent files from the terminal! + vcsi # video thumbnails for torrents, can I replace it with ^? + + jawzTasks + (writeScriptBin "ffmpeg4discord" + (builtins.readFile ../scripts/ffmpeg4discord.py)) + (writeScriptBin "ffmpreg" (builtins.readFile ../scripts/ffmpreg.sh)) + (writeScriptBin "split-dir" + (builtins.readFile ../scripts/split-dir.sh)) + (writeScriptBin "run" (builtins.readFile ../scripts/run.sh)) + (writeScriptBin "pika-list" + (builtins.readFile ../scripts/pika-list.sh)) + + # required (optionally) by doom emacs, but still are rather useful + tree-sitter # code parsing based on symbols and shit, I do not get it + graphviz # graphs + tetex + languagetool # proofreader for English + # these two are for doom everywhere + xorg.xwininfo + xdotool + xclip + + tldr # man for retards + exercism # learn to code + + # SH + bats # testing system, required by Exercism + bashdb # autocomplete + shellcheck # linting + shfmt # a shell parser and formatter + + # NIX + expect # keep color when nom'ing + nix-output-monitor # autistic nix builds + nixfmt # linting + cachix # why spend time compiling? + + # PYTHON. + pipenv # python development workflow for humans + (python3.withPackages (ps: + with ps; [ + # poetry # dependency management made easy + flake8 # wraper for pyflakes, pycodestyle and mccabe + isort # sort Python imports + nose # testing and running python scripts + pyflakes # checks source code for errors + pytest # framework for writing tests + speedtest-cli # check internet speed from the comand line + editorconfig # follow rules of contributin + black # Python code formatter + pylint # bug and style checker for python + ])) + + # C# & Rust + # omnisharp-roslyn # c# linter and code formatter + + # HASKELL + ghc # compiler + haskell-language-server # lsp + + # DOCKER + dockfmt + + # JS + nodejs # not as bad as I thought + # jq # linting + + ]) ++ (with pkgs.python3Packages; [ + (buildPythonApplication rec { + pname = "download"; + version = "1.5"; + src = ../scripts/download/.; + doCheck = false; + buildInputs = [ setuptools ]; + propagatedBuildInputs = [ pyyaml types-pyyaml ]; + }) + (buildPythonApplication rec { + pname = "ffpb"; + version = "0.4.1"; + src = fetchPypi { + inherit pname version; + sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk="; + }; + doCheck = false; + buildInputs = [ setuptools ]; + propagatedBuildInputs = [ tqdm ]; + }) + + ]) ++ (with pkgs.nodePackages; [ + # Language servers + dockerfile-language-server-nodejs + yaml-language-server + bash-language-server + vscode-json-languageserver + pyright + + markdownlint-cli # Linter + prettier # Linter + pnpm # Package manager + + ]) ++ (with pkgs; + [ + # lm_sensors # for extension, displays cpu temp + libgda # for pano shell extension + ]) ++ (with pkgs.gnomeExtensions; [ + appindicator # applets for open applications + reading-strip # like putting a finger on every line I read + tactile # window manager + pano # clipboard manager + freon # hardware temperature monitor + # blur-my-shell # make the overview more visually appealing + # gamemode # I guess I'm a gamer now? + # burn-my-windows + # forge # window manager + # ]) ++ (with unstable.pkgs.gnomeExtensions; [ + + ]); + }; + }; + }; # <--- end of package list + + home-manager = { + useUserPackages = true; + useGlobalPkgs = true; + users.jawz = { config, pkgs, ... }: { + home.stateVersion = "${version}"; + + programs.bash = { + enable = true; + historyFile = "\${XDG_STATE_HOME}/bash/history"; + historyControl = [ "erasedups" "ignorespace" ]; + shellAliases = { + hh = "hstr"; + ls = "eza --icons --group-directories-first"; + edit = "emacsclient -t"; + comic = ''download -u jawz -i "$(cat $LC | fzf --multi --exact -i)"''; + gallery = + ''download -u jawz -i "$(cat $LW | fzf --multi --exact -i)"''; + cp = "cp -i"; + mv = "mv -i"; + mkcd = ''mkdir -pv "$1" && cd "$1" || exit''; + mkdir = "mkdir -p"; + rm = "trash"; + ".." = "cd .."; + "..." = "cd ../.."; + ".3" = "cd ../../.."; + ".4" = "cd ../../../.."; + ".5" = "cd ../../../../.."; + dl = "download -u jawz -i"; + e = "edit"; + c = "cat"; + b = "bat"; + f = "fzf --multi --exact -i"; + sc = "systemctl --user"; + jc = "journalctl --user -xefu"; + open-gallery = '' + cd /mnt/pool/scrapping/JawZ/gallery-dl && + xdg-open "$(fd . ./ Husbands -tdirectory -d 1 | fzf -i)"''; + unique-extensions = '' + fd -tf | rev | cut -d. -f1 | rev | + tr '[:upper:]' '[:lower:]' | sort | + uniq --count | sort -rn''; + }; + enableVteIntegration = true; + initExtra = '' + $HOME/.local/bin/pokemon-colorscripts -r --no-title + # Lists + list_root="${config.xdg.configHome}"/jawz/lists/jawz + export LW=$list_root/watch.txt + export LI=$list_root/instant.txt + export LC=$list_root/comic.txt + export command_timeout=30 + + if command -v fzf-share >/dev/null; then + source "$(fzf-share)/key-bindings.bash" + source "$(fzf-share)/completion.bash" + fi + + nixos-reload () { + NIXOSDIR=/home/jawz/Development/NixOS + nix-store --add-fixed sha256 $NIXOSDIR/scripts/PureRef-1.11.1_x64.Appimage + nixfmt $NIXOSDIR/workstation/*.nix + sudo unbuffer nixos-rebuild switch -I \ + nixos-config=$NIXOSDIR/workstation/configuration.nix \ + |& nom + } + ''; + }; + + xdg = { + enable = true; + userDirs = { + enable = true; + createDirectories = false; + desktop = "${config.home.homeDirectory}"; + documents = "${config.home.homeDirectory}/Documents"; + download = "${config.home.homeDirectory}/Downloads"; + music = "${config.home.homeDirectory}/Music"; + pictures = "${config.home.homeDirectory}/Pictures"; + templates = "${config.xdg.dataHome}/Templates"; + videos = "${config.home.homeDirectory}/Videos"; + }; + configFile = { + "wgetrc".source = ../dotfiles/wget/wgetrc; + "configstore/update-notifier-npm-check.json".source = + ../dotfiles/npm/update-notifier-npm-check.json; + "npm/npmrc".source = ../dotfiles/npm/npmrc; + "gallery-dl/config.json".source = ../dotfiles/gallery-dl/config.json; + "htop/htoprc".source = ../dotfiles/htop/htoprc; + "python/pythonrc".source = ../dotfiles/pythonrc; + }; + }; + + programs = { + emacs.enable = true; + helix = { enable = true; }; + hstr.enable = true; + direnv = { + enable = true; + enableBashIntegration = true; + nix-direnv.enable = true; + }; + bat = { + enable = true; + config = { + pager = "less -FR"; + theme = "base16"; + }; + extraPackages = with pkgs.bat-extras; [ + batman # man pages + batpipe # piping + batgrep # ripgrep + batdiff # this is getting crazy! + batwatch # probably my next best friend + prettybat # trans your sourcecode! + ]; + }; + git = { + enable = true; + userName = "${myName}"; + userEmail = "${myEmail}"; + }; + htop = { + enable = true; + package = pkgs.htop-vim; + }; + }; + + services = { + lorri.enable = true; + emacs = { + enable = true; + defaultEditor = true; + package = with pkgs; + ((emacsPackagesFor emacs-gtk).emacsWithPackages + (epkgs: [ epkgs.vterm ])); + startWithUserSession = "graphical"; + }; + }; + + }; + }; + + environment = { + etc = { + "wireplumber/bluetooth.lua.d/51-bluez-config.lua".text = '' + bluez_monitor.properties = { + ["bluez5.enable-sbc-xq"] = true, + ["bluez5.enable-msbc"] = true, + ["bluez5.enable-hw-volume"] = true, + ["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]" + } + ''; + }; + systemPackages = with pkgs; [ wget gwe ]; + variables = rec { + # PATH + XDG_CACHE_HOME = "\${HOME}/.cache"; + XDG_CONFIG_HOME = "\${HOME}/.config"; + XDG_BIN_HOME = "\${HOME}/.local/bin"; + XDG_DATA_HOME = "\${HOME}/.local/share"; + XDG_STATE_HOME = "\${HOME}/.local/state"; + + # DEV PATH + CABAL_DIR = "${XDG_CACHE_HOME}/cabal"; + CARGO_HOME = "${XDG_DATA_HOME}/cargo"; + GEM_HOME = "${XDG_DATA_HOME}/ruby/gems"; + GEM_PATH = "${XDG_DATA_HOME}/ruby/gems"; + GEM_SPEC_CACHE = "${XDG_DATA_HOME}/ruby/specs"; + GOPATH = "${XDG_DATA_HOME}/go"; + NPM_CONFIG_USERCONFIG = "${XDG_CONFIG_HOME}/npm/npmrc"; + PNPM_HOME = "${XDG_DATA_HOME}/pnpm"; + PSQL_HISTORY = "${XDG_DATA_HOME}/psql_history"; + REDISCLI_HISTFILE = "${XDG_DATA_HOME}/redis/rediscli_history"; + WINEPREFIX = "${XDG_DATA_HOME}/wine"; + PYTHONSTARTUP = "${XDG_CONFIG_HOME}/python/pythonrc"; + STACK_ROOT = "${XDG_DATA_HOME}/stack"; + + # OPTIONS + HISTFILE = "${XDG_STATE_HOME}/bash/history"; + LESSHISTFILE = "-"; + GHCUP_USE_XDG_DIRS = "true"; + RIPGREP_CONFIG_PATH = "${XDG_CONFIG_HOME}/ripgrep/ripgreprc"; + ELECTRUMDIR = "${XDG_DATA_HOME}/electrum"; + VISUAL = "emacsclient -ca emacs"; + WGETRC = "${XDG_CONFIG_HOME}/wgetrc"; + XCOMPOSECACHE = "${XDG_CACHE_HOME}/X11/xcompose"; + "_JAVA_OPTIONS" = "-Djava.util.prefs.userRoot=${XDG_CONFIG_HOME}/java"; + DOCKER_CONFIG = "${XDG_CONFIG_HOME}/docker"; + + # NVIDIA + CUDA_CACHE_PATH = "${XDG_CACHE_HOME}/nv"; + + # Themes + # WEBKIT_DISABLE_COMPOSITING_MODE = "1"; + CALIBRE_USE_SYSTEM_THEME = "1"; + + PATH = [ + "\${HOME}/.local/bin" + "\${XDG_CONFIG_HOME}/emacs/bin" + "\${XDG_DATA_HOME}/npm/bin" + "\${XDG_DATA_HOME}/pnpm" + ]; + }; + }; + + programs = { + firefox = { + enable = true; + languagePacks = [ "en-CA" "es-MX" "it" ]; + }; + starship.enable = true; + tmux.enable = true; + fzf.fuzzyCompletion = true; + neovim = { + enable = true; + vimAlias = true; + }; + gnupg.agent = { + enable = true; + enableSSHSupport = true; + }; + geary = { enable = true; }; + steam = { + enable = true; + remotePlay.openFirewall = true; + dedicatedServer.openFirewall = true; + }; + kdeconnect = { + enable = true; + package = pkgs.gnomeExtensions.gsconnect; + }; + }; + + services = { + printing = { + enable = true; + drivers = [ pkgs.hplip pkgs.hplipWithPlugin ]; + }; + avahi = { + enable = true; + nssmdns = true; + }; + psd.enable = true; + smartd.enable = true; + fstrim.enable = true; + btrfs.autoScrub = { + enable = true; + fileSystems = [ "/" ]; + }; + openssh = { + enable = true; + openFirewall = true; + startWhenNeeded = true; + settings = { + PasswordAuthentication = false; + PermitRootLogin = "prohibit-password"; + KbdInteractiveAuthentication = false; + }; + }; + resilio = { + deviceName = "chichis"; + enable = true; + useUpnp = true; + enableWebUI = true; + httpPass = "528491"; + httpLogin = "chichis"; + httpListenPort = 9876; + httpListenAddr = "0.0.0.0"; + directoryRoot = "/resilio"; + }; + }; + + systemd = { + services = { }; + timers = { }; + user = { + services = { + tasks = { + restartIfChanged = true; + description = + "Run a tasks script which keeps a lot of things organized"; + wantedBy = [ "default.target" ]; + path = [ pkgs.bash pkgs.nix jawzTasks ]; + serviceConfig = { + Restart = "on-failure"; + RestartSec = 30; + ExecStart = "${jawzTasks}/bin/tasks"; + }; + }; + }; + timers = { + tasks = { + enable = true; + description = + "Run a tasks script which keeps a lot of things organized"; + wantedBy = [ "timers.target" ]; + timerConfig = { OnCalendar = "*:0/10"; }; + }; + }; + }; + }; + + fonts.fontconfig.enable = true; + + powerManagement.cpuFreqGovernor = lib.mkDefault "performance"; + hardware = { + cpu.amd.updateMicrocode = + lib.mkDefault config.hardware.enableRedistributableFirmware; + bluetooth = { + enable = true; + settings = { + General = { + Enable = "Source,Sink,Media,Socket"; + Experimental = true; + }; + }; + }; + nvidia = { + modesetting.enable = true; + powerManagement.enable = true; + }; + sane = { + enable = true; + extraBackends = [ pkgs.hplip pkgs.hplipWithPlugin ]; + }; + opentabletdriver = { + enable = true; + daemon.enable = false; + }; + opengl = { + enable = true; + driSupport = true; + driSupport32Bit = true; + extraPackages = with pkgs; [ + nvidia-vaapi-driver + vaapiVdpau + libvdpau-va-gl + ]; + }; + }; + + # programs.virt-manager.enable = true; + # virtualisation = { + # libvirtd.enable = true; + # }; + +} diff --git a/hosts/workstation/configuration.nix b/hosts/workstation/configuration.nix index 9005dea..29a7416 100644 --- a/hosts/workstation/configuration.nix +++ b/hosts/workstation/configuration.nix @@ -17,17 +17,10 @@ in { ../../services/printing.nix ../../services/sound.nix ../../services/systemd-user/tasks.nix - ../../bundles/art.nix - ../../bundles/dictionaries.nix - ../../bundles/fonts.nix - ../../bundles/gaming.nix - ../../bundles/internet.nix - ../../bundles/office.nix - ../../bundles/dev/haskell.nix - ../../bundles/dev/nix.nix - ../../bundles/dev/python.nix + ../../modules/apps.nix + ../../modules/dev.nix ]; - gaming.enable = true; + myGaming.enable = true; networking = { hostName = "workstation"; @@ -88,10 +81,6 @@ in { }; jawz = { packages = (with pkgs; [ - - godot_4 # game development - unstable.gdtoolkit # gdscript language server - blanket # background noise pika-backup # backups metadata-cleaner # remove any metadata and geolocation from files @@ -115,7 +104,7 @@ in { shortwave # listen to world radio unstable.yt-dlp # downloads videos from most video websites - unstable.gallery-dl # similar to yt-dlp but for most image gallery websites + gallery-dl # similar to yt-dlp but for most image gallery websites fd # modern find, faster searches fzf # fuzzy finder! super cool and useful @@ -162,9 +151,6 @@ in { shellcheck # linting shfmt # a shell parser and formatter - # C# & Rust - # omnisharp-roslyn # c# linter and code formatter - # DOCKER dockfmt @@ -205,7 +191,7 @@ in { prettier # Linter pnpm # Package manager ]); - }; + }; # <--- end of package list }; }; diff --git a/lib/default.nix b/lib/default.nix new file mode 100644 index 0000000..9358660 --- /dev/null +++ b/lib/default.nix @@ -0,0 +1,83 @@ +{ inputs }: +let + myLib = (import ./default.nix) { inherit inputs; }; + outputs = inputs.self.outputs; +in rec { + pkgsFor = sys: inputs.nixpkgs.legacyPackages.${sys}; + + # ========================== Buildables ========================== # + + mkSystem = config: + inputs.nixpkgs.lib.nixosSystem { + specialArgs = { inherit inputs outputs myLib; }; + modules = [ config outputs.nixosModules.default ]; + }; + + mkHome = sys: config: + inputs.home-manager.lib.homeManagerConfiguration { + pkgs = pkgsFor sys; + extraSpecialArgs = { inherit inputs myLib outputs; }; + modules = [ config outputs.homeManagerModules.default ]; + }; + + # =========================== Functions ============================ # + + filesIn = dir: + (map (fileName: dir + "/${fileName}") + (builtins.attrNames (builtins.readDir dir))); + + dirsIn = dir: + inputs.nixpkgs.lib.filterAttrs (name: value: value == "directory") + (builtins.readDir dir); + + fileNameOf = path: (builtins.head (builtins.split "\\." (baseNameOf path))); + + # ========================== Extenders =========================== # + + # Evaluates nixos/home-manager module and extends it's options / config + extendModule = { path, ... }@args: + { pkgs, ... }@margs: + let + eval = if (builtins.isString path) || (builtins.isPath path) then + import path margs + else + path margs; + evalNoImports = builtins.removeAttrs eval [ "imports" "options" ]; + + extra = if (builtins.hasAttr "extraOptions" args) + || (builtins.hasAttr "extraConfig" args) then + [ + ({ ... }: { + options = args.extraOptions or { }; + config = args.extraConfig or { }; + }) + ] + else + [ ]; + in { + imports = (eval.imports or [ ]) ++ extra; + + options = if builtins.hasAttr "optionsExtension" args then + (args.optionsExtension (eval.options or { })) + else + (eval.options or { }); + + config = if builtins.hasAttr "configExtension" args then + (args.configExtension (eval.config or evalNoImports)) + else + (eval.config or evalNoImports); + }; + + # Applies extendModules to all modules + # modules can be defined in the same way + # as regular imports, or taken from "filesIn" + extendModules = extension: modules: + map (f: + let name = fileNameOf f; + in (extendModule ((extension name) // { path = f; }))) modules; + + # ============================ Shell ============================= # + forAllSystems = pkgs: + inputs.nixpkgs.lib.genAttrs [ "x86_64-linux" ] + (system: pkgs inputs.nixpkgs.legacyPackages.${system}); +} diff --git a/modules/apps.nix b/modules/apps.nix new file mode 100644 index 0000000..1ccca13 --- /dev/null +++ b/modules/apps.nix @@ -0,0 +1,19 @@ +{ config, lib, pkgs, ... }: + +{ + imports = [ + ./apps/art.nix + ./apps/dictionaries.nix + ./apps/fonts.nix + ./apps/gaming.nix + ./apps/internet.nix + ./apps/office.nix + ]; + myArt.enable = lib.mkDefault false; + myGameDev.enable = lib.mkDefault false; + # myDictionaries.enable = lib.mkDefault false; + # myFonts.enable = lib.mkDefault false; + myGaming.enable = lib.mkDefault false; + # myInternet.enable = lib.mkDefault false; + # myOffice.enable = lib.mkDefault false; +} diff --git a/modules/apps/art.nix b/modules/apps/art.nix new file mode 100644 index 0000000..8bf3565 --- /dev/null +++ b/modules/apps/art.nix @@ -0,0 +1,25 @@ +{ config, pkgs, lib, unstable, ... }: + +{ + options = { + myArt.enable = lib.mkEnableOption "enable"; + myGameDev.enable = lib.mkEnableOption "enable"; + }; + config = lib.mkIf config.myArt.enable { + users.users.jawz.packages = with pkgs; + ([ + gimp # the coolest bestest art program to never exist + krita # art to your heart desire! + mypaint # not the best art program + mypaint-brushes # but it's got some + mypaint-brushes1 # nice damn brushes + # drawpile # arty party with friends!! + pureref # create inspiration/reference boards + blender # cgi animation and sculpting + ]) ++ (if config.myGameDev.enable then [ + godot_4 # game development + unstable.gdtoolkit # gdscript language server + ] else + [ ]); + }; +} diff --git a/bundles/dictionaries.nix b/modules/apps/dictionaries.nix similarity index 100% rename from bundles/dictionaries.nix rename to modules/apps/dictionaries.nix diff --git a/bundles/fonts.nix b/modules/apps/fonts.nix similarity index 100% rename from bundles/fonts.nix rename to modules/apps/fonts.nix diff --git a/bundles/gaming.nix b/modules/apps/gaming.nix similarity index 89% rename from bundles/gaming.nix rename to modules/apps/gaming.nix index 845fadb..9a89718 100644 --- a/bundles/gaming.nix +++ b/modules/apps/gaming.nix @@ -1,8 +1,8 @@ { config, pkgs, lib, ... }: { - options = { gaming.enable = lib.mkEnableOption "enables gaming"; }; - config = lib.mkIf config.gaming.enable { + options = { myGaming.enable = lib.mkEnableOption "enable"; }; + config = lib.mkIf config.myGaming.enable { programs = { steam = { enable = true; diff --git a/bundles/internet.nix b/modules/apps/internet.nix similarity index 100% rename from bundles/internet.nix rename to modules/apps/internet.nix diff --git a/bundles/office.nix b/modules/apps/office.nix similarity index 100% rename from bundles/office.nix rename to modules/apps/office.nix diff --git a/modules/bundles/users.nix b/modules/bundles/users.nix new file mode 100644 index 0000000..2c3b463 --- /dev/null +++ b/modules/bundles/users.nix @@ -0,0 +1,55 @@ +{ lib, config, inputs, outputs, myLib, pkgs, ... }: +let cfg = config.myNixOS; +in { + options.myNixOS.home-users = lib.mkOption { + type = lib.types.attrsOf (lib.types.submodule { + options = { + userConfig = lib.mkOption { + default = ./../../home-manager/work.nix; + example = "DP-1"; + }; + userSettings = lib.mkOption { + default = { }; + example = "{}"; + }; + }; + }); + default = { }; + }; + + config = { + programs.zsh.enable = true; + + programs.hyprland.enable = cfg.sharedSettings.hyprland.enable; + + services.xserver = lib.mkIf cfg.sharedSettings.hyprland.enable { + displayManager = { defaultSession = "hyprland"; }; + }; + + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + + extraSpecialArgs = { + inherit inputs; + inherit myLib; + outputs = inputs.self.outputs; + }; + + users = builtins.mapAttrs (name: user: + { ... }: { + imports = + [ (import user.userConfig) outputs.homeManagerModules.default ]; + }) (config.myNixOS.home-users); + }; + + users.users = builtins.mapAttrs (name: user: + { + isNormalUser = true; + initialPassword = "12345"; + description = ""; + shell = pkgs.zsh; + extraGroups = [ "libvirtd" "networkmanager" "wheel" ]; + } // user.userSettings) (config.myNixOS.home-users); + }; +} diff --git a/modules/default.nix b/modules/default.nix new file mode 100644 index 0000000..5612018 --- /dev/null +++ b/modules/default.nix @@ -0,0 +1,40 @@ +{ pkgs, config, lib, inputs, outputs, myLib, ... }: +let + cfg = config.myNixOS; + + features = myLib.extendModules (name: { + extraOptions = { + myNixOS.${name}.enable = + lib.mkEnableOption "enable my ${name} configuration"; + }; + configExtension = config: (lib.mkIf cfg.${name}.enable config); + }) (myLib.filesIn ./features); + + bundles = myLib.extendModules (name: { + extraOptions = { + myNixOS.bundles.${name}.enable = + lib.mkEnableOption "enable ${name} module bundle"; + }; + configExtension = config: (lib.mkIf cfg.bundles.${name}.enable config); + }) (myLib.filesIn ./bundles); + + services = myLib.extendModules (name: { + extraOptions = { + myNixOS.services.${name}.enable = + lib.mkEnableOption "enable ${name} service"; + }; + configExtension = config: (lib.mkIf cfg.services.${name}.enable config); + }) (myLib.filesIn ./services); + +in { + imports = [ inputs.home-manager.nixosModules.home-manager ] ++ features + ++ bundles ++ services; + options.myNixOS = { sharedSettings = { }; }; + config = { + nix.settings.experimental-features = [ "nix-command" "flakes" ]; + nixpkgs = { + hostPlatform = lib.mkDefault "x86_64-linux"; + config.allowUnfree = true; + }; + }; +} diff --git a/modules/dev.nix b/modules/dev.nix new file mode 100644 index 0000000..9c7c0f0 --- /dev/null +++ b/modules/dev.nix @@ -0,0 +1,8 @@ +{ config, lib, pkgs, ... }: + +{ + imports = [ ./dev/haskell.nix ./dev/nix.nix ./dev/python.nix ]; + myHaskell.enable = lib.mkDefault false; + myNix.enable = lib.mkDefault true; + myPython.enable = lib.mkDefault false; +} diff --git a/modules/dev/haskell.nix b/modules/dev/haskell.nix new file mode 100644 index 0000000..dc24533 --- /dev/null +++ b/modules/dev/haskell.nix @@ -0,0 +1,11 @@ +{ config, pkgs, lib, ... }: + +{ + options = { myHaskell.enable = lib.mkEnableOption "enable"; }; + config = lib.mkIf config.myHaskell.enable { + users.users.jawz.packages = with pkgs; ([ + ghc # compiler + haskell-language-server # lsp + ]); + }; +} diff --git a/modules/dev/nix.nix b/modules/dev/nix.nix new file mode 100644 index 0000000..cfd3fa3 --- /dev/null +++ b/modules/dev/nix.nix @@ -0,0 +1,13 @@ +{ config, pkgs, lib, ... }: + +{ + options = { myNix.enable = lib.mkEnableOption "enable"; }; + config = lib.mkIf config.myNix.enable { + users.users.jawz.packages = with pkgs; ([ + expect # keep color when nom'ing + nix-output-monitor # autistic nix builds + nixfmt # linting + cachix # why spend time compiling? + ]); + }; +} diff --git a/modules/dev/python.nix b/modules/dev/python.nix new file mode 100644 index 0000000..6cf8ed9 --- /dev/null +++ b/modules/dev/python.nix @@ -0,0 +1,23 @@ +{ config, pkgs, lib, ... }: + +{ + options = { myPython.enable = lib.mkEnableOption "enable"; }; + config = lib.mkIf config.myPython.enable { + users.users.jawz.packages = with pkgs; ([ + pipenv # python development workflow for humans + (python3.withPackages (ps: + with ps; [ + # nose # testing and running python scripts + # poetry # dependency management made easy + # pytest # framework for writing tests + black # Python code formatter + editorconfig # follow rules of contributin + flake8 # wraper for pyflakes, pycodestyle and mccabe + isort # sort Python imports + pyflakes # checks source code for errors + pylint # bug and style checker for python + speedtest-cli # check internet speed from the comand line + ])) + ]); + }; +} diff --git a/modules/features/cachix.nix b/modules/features/cachix.nix new file mode 100644 index 0000000..ea8b817 --- /dev/null +++ b/modules/features/cachix.nix @@ -0,0 +1,18 @@ +{ + nix.settings = { + substituters = [ + "https://nix-gaming.cachix.org" + "https://nixpkgs-python.cachix.org" + "https://devenv.cachix.org" + "https://cuda-maintainers.cachix.org" + "https://ai.cachix.org" + ]; + trusted-public-keys = [ + "nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4=" + "nixpkgs-python.cachix.org-1:hxjI7pFxTyuTHn2NkvWCrAUcNZLNS3ZAvfYNuYifcEU=" + "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw=" + "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" + "ai.cachix.org-1:N9dzRK+alWwoKXQlnn0H6aUx0lU/mspIoz8hMvGvbbc=" + ]; + }; +} diff --git a/modules/services/example.nix b/modules/services/example.nix new file mode 100644 index 0000000..273b10f --- /dev/null +++ b/modules/services/example.nix @@ -0,0 +1,47 @@ +{ config, pkgs, lib, ... }: +with lib; { + users.users.satisfactory = { + home = "/var/lib/satisfactory"; + createHome = true; + isSystemUser = true; + group = "satisfactory"; + }; + users.groups.satisfactory = { }; + + # boot.kernel.sysctl."net.ipv6.conf.eth0.disable_ipv6" = true; + networking.enableIPv6 = false; + + # nixpkgs.config.allowUnfree = true; + # + networking = { + firewall = { + allowedUDPPorts = [ 15777 15000 7777 27015 ]; + allowedUDPPortRanges = [{ + from = 27031; + to = 27036; + }]; + allowedTCPPorts = [ 27015 27036 ]; + }; + }; + + # -beta experimental \ + systemd.services.satisfactory = { + preStart = '' + ${pkgs.steamcmd}/bin/steamcmd \ + +force_install_dir /var/lib/satisfactory/SatisfactoryServer \ + +login anonymous \ + +app_update 1690800 \ + validate \ + +quit + ''; + script = '' + ${pkgs.steam-run}/bin/steam-run /var/lib/satisfactory/SatisfactoryServer/FactoryServer.sh -DisablePacketRouting + ''; + serviceConfig = { + Nice = "-5"; + Restart = "always"; + User = "satisfactory"; + WorkingDirectory = "/var/lib/satisfactory"; + }; + }; +} diff --git a/bundles/template.nix b/modules/template.nix similarity index 65% rename from bundles/template.nix rename to modules/template.nix index 1d7e9bc..11afecc 100644 --- a/bundles/template.nix +++ b/modules/template.nix @@ -1,4 +1,4 @@ -{ config, pkgs, ... }: +{ config, lib, pkgs, ... }: { users.users.jawz.packages = with pkgs; ([ ]);