{ config, pkgs, ... }: let open_firewall_ports = [ 80 # http 443 # https 6969 # HentaiAtHome 25152 # ssh 49494 # gerbera ]; open_firewall_port_ranges = [ { from = 1714; to = 1764; } # kdeconnect ]; VERSION = "23.05"; # "https://github.com/nix-community/home-manager/archive/master.tar.gz"; unstable_tarball = builtins.fetchTarball https://github.com/nixos/nixpkgs/tarball/master; unstable = import unstable_tarball { config = config.nixpkgs.config; }; nix-gaming = import (builtins.fetchTarball "https://github.com/fufexan/nix-gaming/archive/master.tar.gz"); nextcloud_scrapsync = pkgs.writeScriptBin "nextcloud_scrapsync" (builtins.readFile ./scripts/nextcloud_scrapsync.sh); manage_library = pkgs.writeScriptBin "manage_library" (builtins.readFile ./scripts/manage_library.sh); ffmpeg4discord = pkgs.writeScriptBin "ffmpeg4discord" (builtins.readFile ./scripts/ffmpeg4discord.py); chat-dl = pkgs.writeScriptBin "chat-dl" (builtins.readFile ./scripts/chat-dl.sh); in { # Remember to close this bracket at the end of the document imports = [ ./hardware-configuration.nix "${nix-gaming}/modules/pipewireLowLatency.nix" ]; networking.hostName = "workstation"; # networking.wireless.enable = true; networking.networkmanager.enable = true; time.timeZone = "America/Mexico_City"; 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. }; services = { xserver = { enable = true; videoDrivers = [ "nvidia" ]; displayManager.gdm.enable = true; desktopManager.gnome.enable = true; layout = "us"; libinput.enable = true; # Wacom required? }; }; 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; platformTheme = "gnome"; style = "adwaita"; }; hardware.pulseaudio.enable = false; sound.enable = false; security.rtkit.enable = true; services.pipewire = { enable = true; alsa.enable = true; alsa.support32Bit = true; pulse.enable = true; lowLatency = { enable = true; quantum = 64; rate = 48000; }; }; security.sudo = { enable = true; wheelNeedsPassword = false; }; # security.sudo.enable = false; # security.doas.enable = true; # security.doas.extraRules = [{ # users = [ "jawz" ]; # keepEnv = true; # #persist = true; # noPass = true; # }]; nixpkgs.config = { allowUnfree = true; }; users.users.jawz = { isNormalUser = true; extraGroups = [ "wheel" "networkmanager" "docker" "scanner" "lp" ]; initialPassword = "password"; # shell = pkgs.fish; openssh = { authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB5GaQM4N+yGAByibOFQOBVMV/6TjOfaGIP+NunMiK76 gpodeacero\cdreyes@100CDREYES" ]; }; packages = (with pkgs; [ blender # cgi animation and sculpting godot # game development gdtoolkit # gdscript language server krita # art to your heart desire! # drawpile # arty party with friends!! mypaint # not the best art program mypaint-brushes # but it's got some mypaint-brushes1 # nice damn brushes pureref # create inspiration/reference boards gimp # the coolest bestest art program to never exist lutris heroic wine64Packages.full wineWowPackages.full vulkan-tools # nix-gaming.packages.${pkgs.hostPlatform.system}.wine-tkg winetricks # nix-gaming.packages.${pkgs.hostPlatform.system}.wine-discord-ipc-bridge # grapejuice # roblox manager # minecraft # minecraft official launcher parsec-bin # remote gaming with friends protonup-qt # update proton-ge renpy libreoffice-fresh # office, but based calibre # ugly af eBook library manager foliate # gtk eBook reader gnome-feeds # feed reader, maybe will replace with nextcloud wike # gtk wikipedia wow! unstable.furtherance # I made this one tehee track time utility gnome.simple-scan # scanner # sequeler # friendly SQL client blanket # background noise czkawka # duplicate finder pika-backup # backups # tilix # used to be my favourite terminal, but it's so outdated, that each time I use it less and less… gnome-obfuscate # censor private information metadata-cleaner # remove any metadata and geolocation from files gnome-recipes # migrate these to mealie and delete denaro # manage your finances # celeste # sync tool for any cloud provider libgda # for pano shell extension celluloid # video player cozy # audiobooks player gnome-podcasts # podcast player handbrake # video converter, may be unnecessary curtail # image compressor pitivi # video editor identity # compare images or videos mousai # poor man shazam tagger # tag music files # bottles # wine prefix manager obs-studio # screen recorder & streamer shortwave # listen to world radio nextcloud-client # self-hosted google-drive alternative discord # chat whatsapp-for-linux # I'll regret this telegram-desktop # furry chat google-chrome # web browser with spyware included firefox # web browser that allows to disable spyware # librewolf # no spyware web browser tor-browser-bundle-bin # dark web, so dark! # hugo # website engine nicotine-plus # remember Ares? warp # never used, but supposedly cool for sharing files HentaiAtHome # uh-oh yt-dlp # downloads videos from most video websites unstable.gallery-dl # similar to yt-dlp but for most image gallery websites gdu # disk-space utility, somewhat useful du-dust # rusty du gocryptfs # encrypted filesystem! shhh!!! exa # like ls but with colors trash-cli # oop! didn't meant to delete that ffmpeg_6 # coolest video converter! neofetch # use once for brag, never again rmlint # probably my favourite app, amazing dupe finder that integrates well with BTRFS tldr # man for retards # ffmpegthumbnailer # create video thumbnails for nautilus, in absence of totem vcsi # video thumbnails for torrents, can I replace it with ^? mediainfo # technical info about videos, needed by some of my scripts tree-sitter # code parsing, required by Doom emacs torrenttools # create torrent files from the terminal! lm_sensors # for extension, displays cpu temp # My own scripts nextcloud_scrapsync ffmpeg4discord manage_library chat-dl # required by doom emacs, but still are rather useful. fd # modern find, faster searches fzf # fuzzy finder! super cool and useful ripgrep # modern grep languagetool # proofreader for English. check if works without the service graphviz # graphs # these two are for doom everywhere xorg.xwininfo xdotool tetex # development environment nix-direnv # creates ephimeral environments direnv # manages development environment exercism # learn to code # SH bats # testing system, required by Exercism bashdb # autocomplete shellcheck # linting shfmt # a shell parser and formatter file # required by my tasks script? gnome.zenity # dependency of my scripts xclip # manipulate clipboard from scripts # NIX nixfmt # linting cachix # why spend time compiling? # PYTHON. python3 # base language pipenv # python development workflow for humans poetry # dependency management made easy # C# & Rust # omnisharp-roslyn # c# linter and code formatter # HASKELL # cabal-install # haskell interface # JS # jq # linting nodejs # not as bad as I thought hunspell hunspellDicts.it_IT hunspellDicts.es_MX hunspellDicts.en_CA # Themes adw-gtk3 # gradience # theme customizer, allows you to modify adw-gtk3 themes gnome.gnome-tweaks # tweaks for the gnome desktop environment # Fonts (nerdfonts.override { fonts = [ "Agave" "CascadiaCode" "SourceCodePro" "Ubuntu" "FiraCode" "Iosevka" ]; }) symbola (papirus-icon-theme.override { color = "adwaita"; }) ]) ++ (with pkgs.python3Packages; [ 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 (buildPythonApplication rec { pname = "download"; version = "1.5"; src = ./scripts/download/.; doCheck = false; buildInputs = [ setuptools ]; propagatedBuildInputs = [ pyyaml types-pyyaml ]; }) (buildPythonApplication rec { pname = "classifier"; version = "2.0"; src = fetchPypi { inherit pname version; sha256 = "sha256-yHtc0qNZbKIkhhxrh0Zh5KWWsC/aU51WX1oEPVN9nOg="; }; doCheck = false; buildInputs = [ setuptools ]; propagatedBuildInputs = [ arrow ]; }) (buildPythonApplication rec { pname = "ffpb"; version = "0.4.1"; src = fetchPypi { inherit pname version; sha256 = "sha256-7eVqbLpMHS1sBw2vYS4cTtyVdnnknGtEI8190VlXflk="; }; doCheck = false; buildInputs = [ setuptools ]; propagatedBuildInputs = [ tqdm ]; }) ]) ++ (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! ]) ++ (with pkgs.fishPlugins; [ sponge # keep history clean from typos fzf-fish # fish command line with fzf keybindings colored-man-pages # self explanatory autopair-fish # who has time for a closing bracket? bass # integrate bash utilities on fish ]) ++ (with pkgs.gnomeExtensions; [ appindicator # applets for open applications gsconnect # sync data and notifications from your phone freon # hardware temperature monitor panel-scroll # scroll well to change workspaces reading-strip # like putting a finger on every line I read tactile # window manager pano # clipboard manager blur-my-shell # make the overview more visually appealing # burn-my-windows # forge # window manager # ]) ++ (with unstable.pkgs.gnomeExtensions; [ ]) ++ (with pkgs.nodePackages; [ dockerfile-language-server-nodejs # LSP bash-language-server # LSP pyright # LSP markdownlint-cli # Linter prettier # Linter pnpm # Package manager ]); }; # <--- end of package list fonts.fontconfig.enable = true; home-manager.useUserPackages = true; home-manager.useGlobalPkgs = true; home-manager.users.jawz = { config, pkgs, ... }:{ home.stateVersion = VERSION; home.packages = with pkgs; [ ]; programs.starship.enable = true; programs.bash = { enable = true; shellAliases = { ls = "exa --icons --group-directories-first --no-permissions --no-user --no-time"; 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)"; open_gallery = "open $(cd /mnt/disk2/scrapping/JawZ/gallery-dl && fd . ./ Husbands kemonoparty -tdirectory -d 1 | fzf)"; unique_extensions = "fd -tf | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn"; 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"; f = "fzf --multi --exact -i"; sc = "systemctl --user"; jc = "journalctl --user -xefu"; }; enableVteIntegration = true; initExtra = '' /home/jawz/.local/bin/pokemon-colorscripts -r --no-title # Lists list_root=${config.home.homeDirectory}/.config/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 # GPG_TTY=$(tty) # export GPG_TTY nixos-magic () { local nix_file="$HOME/Development/NixOS/configuration.nix" local hardware_file="$HOME/Development/NixOS/hardware-configuration.nix" nixfmt "$nix_file" && nixfmt "$hardware_file" sudo nixos-rebuild switch -I nixos-config="$nix_file" } ''; }; # programs.starship.enable = true; programs.fish = { enable = true; # useBabelfish = true; This setting doens't work from inside home-manager shellAliases = { ls = "exa --icons --group-directories-first --no-permissions --no-user --no-time"; 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)"; open_gallery = "open (cd /mnt/disk2/scrapping/JawZ/gallery-dl && fd . ./ Husbands kemonoparty -tdirectory -d 1 | fzf)"; unique_extensions = "find . -type f | string match -r '([^.\/]+)\$' | sort -u"; cp = "cp -i"; mv = "mv -i"; mkdir = "mkdir -p"; rm = "trash"; ".." = "cd .."; "..." = "cd ../.."; ".3" = "cd ../../.."; ".4" = "cd ../../../.."; ".5" = "cd ../../../../.."; }; shellAbbrs = { dl = "download -u jawz -i"; ex = "ls"; e = "edit"; c = "cat"; f = "fzf --multi --exact -i"; sc = "systemctl --user"; jc = "journalctl --user -xeu"; }; interactiveShellInit = '' function fish_greeting ~/.local/bin/pokemon-colorscripts -r --no-title end # Lists set -l list_root ${config.home.homeDirectory}/.config/jawz/lists/jawz set lw $list_root/watch.txt set li $list_root/instant.txt set lc $list_root/comic.txt set command_timeout = 30 set GPG_TTY (tty) # Set EMACS/VI mode function fish_user_key_bindings # fish_default_key_bindings fish_vi_key_bindings end ''; functions = { nixos-magic = '' set -l nix_file "$HOME/Development/NixOS/configuration.nix" set -l hardware_file "$HOME/Development/NixOS/hardware-configuration.nix" nixfmt $nix_file nixfmt $hardware_file sudo nixos-rebuild switch -I nixos-config=$nix_file ''; mkcd = '' mkdir -pv $argv cd $argv ''; }; }; programs = { bat = { enable = true; config = { pager = "less -FR"; theme = "base16"; }; }; git = { enable = true; userName = "Danilo Reyes"; userEmail = "CaptainJawZ@outlook.com"; }; htop = { enable = true; package = pkgs.htop-vim; }; }; xdg = { enable = true; userDirs = { enable = true; # createDirectories = true; desktop = "${config.home.homeDirectory}"; documents = "${config.home.homeDirectory}/Documents"; download = "${config.home.homeDirectory}/Downloads"; music = "${config.home.homeDirectory}/Music"; pictures = "${config.home.homeDirectory}/Pictures"; # publicShare = "${config.home.homeDirectory}/.local/hd/Public"; templates = "${config.home.homeDirectory}/.local/share/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; }; }; services = { lorri.enable = true; emacs = { enable = true; defaultEditor = true; package = pkgs.emacs; }; }; }; environment.systemPackages = with pkgs; [ wget docker-compose # easy way to migrate my docker anywhere! ]; environment.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_CONFIG = "\${XDG_CONFIG_HOME}/cabal/config"; 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"; # 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"; # NVIDIA # CUDA_CACHE_PATH = "\${XDG_CACHE_HOME}/nv"; # WEBKIT_DISABLE_COMPOSITING_MODE = "1"; # GBM_BACKEND = "nvidia-drm"; # "__GLX_VENDOR_LIBRARY_NAME" = "nvidia"; # Themes # GTK_THEME = "Adwaita:light"; # QT_QPA_PLATFORMTHEME = "adwaita"; # QT_STYLE_OVERRIDE = "adwaita"; CALIBRE_USE_SYSTEM_THEME = "1"; PATH = [ "\${HOME}/.local/bin" "\${XDG_CONFIG_HOME}/emacs/bin" "\${XDG_DATA_HOME}/npm/bin" "\${XDG_DATA_HOME}/pnpm" ]; }; virtualisation.docker = { enable = true; storageDriver = "btrfs"; enableNvidia = true; }; snapraid = { enable = true; touchBeforeSync = true; sync.interval = "02:00"; scrub = { plan = 10; olderThan = 10; interval = "4:00"; }; parityFiles = [ "/mnt/parity/snapraid.parity" ]; extraConfig = '' autosave 50 ''; exclude = [ "/tmp/" "/lost+found/" "/multimedia/downloads/" "/scrapping/nextcloud/" "/backups/" "/glue/Spankbank/____UNORGANIZED/Chaturbate/" ]; dataDisks = { d1 = "/mnt/disk1/"; d2 = "/mnt/disk2/"; }; contentFiles = [ "/var/snapraid.content" "/mnt/disk1/snapraid.content" "/mnt/disk2/snapraid.content" ]; }; programs = { fish.enable = true; # bash.blesh.enable = true; # fzf.fuzzyCompletion = true; mtr.enable = true; neovim = { enable = true; vimAlias = true; }; gnupg.agent = { enable = true; enableSSHSupport = true; }; geary = { enable = true; }; steam = { enable = true; remotePlay.openFirewall = true; dedicatedServer.openFirewall = true; }; }; services = { printing = { enable = true; drivers = [ pkgs.hplip pkgs.hplipWithPlugin ]; }; avahi.enable = true; avahi.nssmdns = true; fstrim.enable = true; btrfs.autoScrub = { enable = true; fileSystems = [ "/" "/mnt/disk1" "/mnt/disk2" ]; }; openssh = { enable = true; ports = [ 25152 ]; settings = { PasswordAuthentication = false; KbdInteractiveAuthentication = false; }; startWhenNeeded = true; listenAddresses = [ { addr = "0.0.0.0"; port = 25152; } ]; }; emacs = { enable = true; defaultEditor = true; package = pkgs.emacs; }; # udev = { # packages = with pkgs; [ gnome.gnome-settings-daemon ]; # extraRules = '' # SUBSYSTEM=="hidraw", ATTRS{idVendor}=="256c", ATTRS{idProduct}=="006d", MODE="0666" # SUBSYSTEM=="usb", ATTRS{idVendor}=="256c", ATTRS{idProduct}=="006d", MODE="0666" # SUBSYSTEM=="input", ATTRS{idVendor}=="256c", ATTRS{idProduct}=="006d", ENV{LIBINPUT_IGNORE_DEVICE}="1" # ''; # }; }; systemd.services = { "docker-compose" = { enable = true; restartIfChanged = true; description = "Start docker-compose servers"; after = [ "docker.service" "docker.socket" ]; requires = [ "docker.service" "docker.socket" ]; wantedBy = [ "default.target" ]; environment = { FILE = "/home/jawz/Development/Docker/docker-compose.yml"; }; path = [ pkgs.docker-compose ]; serviceConfig = { Restart = "on-failure"; RestartSec = 30; ExecStart = "${pkgs.docker-compose}/bin/docker-compose -f \${FILE} up --remove-orphans"; ExecStop = "${pkgs.docker-compose}/bin/docker-compose -f \${FILE} down"; }; }; "nextcloud_scrapsync" = { description = "Sync scrapped files with nextcloud"; wantedBy = [ "default.target" ]; path = [ pkgs.bash nextcloud_scrapsync ]; serviceConfig = { RestartSec = 30; ExecStart = "${nextcloud_scrapsync}/bin/nextcloud_scrapsync"; }; }; }; systemd.timers = { "nextcloud_scrapsync" = { enable = true; description = "Sync scrapped files with nextcloud"; wantedBy = [ "timers.target" ]; timerConfig = { OnCalendar= [ "*-*-* 01:32:00" "*-*-* 08:32:00" "*-*-* 14:32:00" "*-*-* 20:32:00" ]; RandomizedDelaySec = 30; Persistent = true; }; }; }; systemd.user.services = { "HentaiAtHome" = { enable = true; restartIfChanged = true; description = "Run hentai@home server"; wantedBy = [ "default.target" ]; path = [ pkgs.HentaiAtHome ]; serviceConfig = { Restart = "on-failure"; RestartSec = 30; WorkingDirectory="/mnt/hnbox"; ExecStart = "${pkgs.HentaiAtHome}/bin/HentaiAtHome"; }; }; "manage_library" = { enable = true; restartIfChanged = true; description = "Run the manage library fish script"; wantedBy = [ "default.target" ]; path = [ pkgs.fish manage_library ]; serviceConfig = { Restart = "on-failure"; RestartSec = 30; ExecStart = "${manage_library}/bin/manage_library"; }; }; }; networking.firewall.allowedTCPPorts = open_firewall_ports; networking.firewall.allowedUDPPorts = open_firewall_ports; networking.firewall.allowedTCPPortRanges = open_firewall_port_ranges; networking.firewall.allowedUDPPortRanges = open_firewall_port_ranges; # networking.firewall.enable = false; system = { copySystemConfiguration = true; stateVersion = VERSION; }; nix = { settings = { substituters = [ "https://nix-gaming.cachix.org" "https://nixpkgs-python.cachix.org" "https://devenv.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=" ]; }; gc = { automatic = true; dates = "weekly"; }; }; }