diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 145ae83..0000000
--- a/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-nixos/common/secrets.nix
diff --git a/Extras/Screenshots/SecondUnix.png b/Extras/Screenshots/SecondUnix.png
deleted file mode 100644
index 08da742..0000000
Binary files a/Extras/Screenshots/SecondUnix.png and /dev/null differ
diff --git a/Extras/Wallpapers/lockpaper.png b/Extras/Wallpapers/lockpaper.png
deleted file mode 100644
index 0d97584..0000000
Binary files a/Extras/Wallpapers/lockpaper.png and /dev/null differ
diff --git a/Extras/Wallpapers/wallpaper1.png b/Extras/Wallpapers/wallpaper1.png
deleted file mode 100644
index dfa5537..0000000
Binary files a/Extras/Wallpapers/wallpaper1.png and /dev/null differ
diff --git a/Extras/Wallpapers/wallpaper2.png b/Extras/Wallpapers/wallpaper2.png
deleted file mode 100644
index 70a632a..0000000
Binary files a/Extras/Wallpapers/wallpaper2.png and /dev/null differ
diff --git a/Extras/Wallpapers/wallpaper3.png b/Extras/Wallpapers/wallpaper3.png
deleted file mode 100644
index 0d3e6c7..0000000
Binary files a/Extras/Wallpapers/wallpaper3.png and /dev/null differ
diff --git a/PC/configuration.nix b/PC/configuration.nix
deleted file mode 100644
index 1e31e36..0000000
--- a/PC/configuration.nix
+++ /dev/null
@@ -1,470 +0,0 @@
-{
- config,
- pkgs,
- options,
- lib,
- ...
-}: let
- # Set common boot paramaters
- commonKernelParams = [
- # Nvidia settings
- "nvidia_drm.fbdev=1"
-
- # VM/GPU passthrough
- "amd_iommu=on"
- "iommu=pt"
- "nested=1"
-
- # Virtualization nonsense
- "transparent_hugepage=never"
-
- # Isolate devices into IOMMU groups
- "pcie_acs_override=downstream,multifunction"
- "pci=routeirq"
- ];
-in {
- # Import other nix files and firmware
- imports = let
- homeManager =
- fetchTarball
- "https://github.com/nix-community/home-manager/archive/release-24.05.tar.gz";
- in [
- ./hardware-configuration.nix
- ./jimbo.nix
- "${homeManager}/nixos"
- ];
-
- # Allow unfree packages and accept packages from the Nix User Repos
- nixpkgs = {
- config = {
- allowUnfree = true;
- packageOverrides = pkgs: {
- unstable =
- import (
- fetchTarball
- "https://github.com/NixOS/nixpkgs/archive/nixos-unstable.tar.gz"
- ) {
- inherit pkgs;
- config.allowUnfree = true;
- };
- nur = import (
- fetchTarball
- "https://github.com/nix-community/NUR/archive/master.tar.gz"
- ) {inherit pkgs;};
- };
- };
-
- # Package overlays/patches
- overlays = [
- # MPV scripts
- (self: super: {
- mpv = super.mpv.override {
- scripts = with self.mpvScripts; [mpris sponsorblock thumbnail];
- };
- })
- ];
- };
-
- # Allow flakes and enable garbage collection
- nix = {
- settings.experimental-features = ["nix-command" "flakes"];
- gc = {
- automatic = true;
- dates = "weekly";
- options = "--delete-older-than 14d";
- };
- };
-
- # Set all boot options
- boot = {
- # Set a kernel version and load/blacklist drivers
- kernelPackages = pkgs.unstable.linuxPackages_zen;
- blacklistedKernelModules = ["pcspkr"];
- kernelParams = commonKernelParams ++ ["vfio-pci.ids=10de:1f82,10de:10fa"];
- initrd.kernelModules = ["vfio" "vfio_pci" "vfio_iommu_type1"];
- kernel.sysctl."vm.max_map_count" = 2147483642;
-
- # Manage supported filesystems
- supportedFilesystems = {
- ntfs = true;
- zfs = lib.mkForce false;
- };
-
- # Modprobe settings
- extraModprobeConfig = ''
- options hid_apple fnmode=2
- '';
-
- # Use the Systemd-Boot bootloader
- loader.systemd-boot = {
- enable = true;
- netbootxyz.enable = true;
- };
- };
-
- # Additional entry to boot from the second GPU
- specialisation = {
- gputwo.configuration = {
- boot.kernelParams = commonKernelParams ++ ["vfio-pci.ids=10de:2504,10de:228e"];
- };
- };
-
- # Allow binary firmware
- hardware.enableRedistributableFirmware = true;
-
- # Enable video drivers
- services.xserver.videoDrivers = ["nvidia"];
- hardware.nvidia = {
- modesetting.enable = true;
- nvidiaSettings = false;
- package = config.boot.kernelPackages.nvidiaPackages.beta;
- open = true;
- };
-
- # Enable a permissioning system
- security = {
- sudo.enable = false;
- doas = {
- enable = true;
- extraRules = [
- # Give wheel root access, allow persistant session
- {
- groups = ["wheel"];
- keepEnv = true;
- persist = true;
- }
- ];
- };
- };
-
- # Enable the ZSH shell
- programs.zsh.enable = true;
-
- # Disable Nano
- programs.nano.enable = false;
-
- # Timezone
- time.timeZone = "America/New_York";
-
- # Define user accounts
- users.users.jimbo = {
- description = "Jimbo Awesome";
- isNormalUser = true;
- hashedPassword = "$6$gYpE.pG/zPXgin06$2kydjDfd0K62Dhf9P0PFvJhRNz6xIC/bHYaf/XYqyKcLyZNzPQpy8uy9tCRcSYlj1wwBhzVtTRyItwajOHCEj0";
- openssh.authorizedKeys.keys = [
- "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIKC8Uqxb09V3msBgDv6lD/nETMYr/X0OgtpDo8ldcMK jimbo@JimDebianServer"
- "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDLe/HioxCOkszFQdm1vb3ZwuzLzsOThqHNvEI4IXeXZ JimPhone"
- "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPeqiMCRXtpoP+BvKBmzvkL7oLKKCmbfdaQIF3yk/S8I jimbo@DV-JHAMPTON-NIXOS"
- ];
- extraGroups = [
- "wheel"
- "audio"
- "video"
- "input"
- "disk"
- "dialout"
- "networkmanager"
- "rtkit"
- "kvm"
- "libvirtd"
- "qemu-libvirtd"
- ];
- uid = 1000;
- shell = pkgs.zsh;
- };
-
- # Install programs system-wide
- environment.systemPackages = with pkgs; [
- # Essential system tools
- cifs-utils
- parted
- git
-
- # Printer control
- system-config-printer
-
- # Virtual machines
- virt-manager
- virtiofsd
- dnsmasq
- spice-vdagent
- looking-glass-client
- ];
-
- # Disable the HTML documentation link
- documentation = {
- nixos.enable = false;
- info.enable = false;
- };
-
- # Enable graphics
- hardware.opengl = {
- enable = true;
- driSupport32Bit = true;
- extraPackages = with pkgs; [
- vulkan-loader
- vulkan-validation-layers
- vulkan-extension-layer
- ];
- };
-
- # Enable Steam hardware and gamemode
- hardware.steam-hardware.enable = true;
- programs.gamemode.enable = true;
-
- # Networking settings
- networking = {
- # Set hostname
- hostName = "JimNixPC";
-
- # Choose networking method
- dhcpcd.enable = true;
- wireless.enable = false;
- #networkmanager.enable = true;
- #enableB43Firmware = true;
-
- # Enable firewall
- firewall = {
- allowPing = false;
- extraInputRules = ''
- ip saddr 10.0.0.2 accept comment "Accept Server Connections"
- '';
- };
-
- # Enable nftables over iptables
- nftables.enable = true;
-
- # Set hostnames
- hosts = {
- "10.0.0.2" = ["server"];
- "10.0.0.3" = ["pc"];
- };
- };
-
- # Enable Bluetooth
- hardware.bluetooth = {
- enable = true;
- settings = {
- General.Experimental = "true";
- Policy.AutoEnable = "true";
- };
- };
-
- # Enable lingering for Bluetooth and allow Looking-Glass permissions
- systemd.tmpfiles.rules = [
- "f /var/lib/systemd/linger/jimbo"
- "f /dev/shm/looking-glass 0660 jimbo libvirtd -"
- ];
-
- # Make udev rules to make PDP controller and Oculus Rift CV1 work
- services.udev = let
- oculusRules = pkgs.writeTextFile {
- name = "10-oculus.rules";
- text = ''
- KERNEL=="hidraw*", ATTRS{idVendor}=="0e6f", ATTRS{idProduct}=="0184", MODE="0660", TAG+="uaccess"
- '';
- destination = "/etc/udev/rules.d/10-oculus.rules";
- };
- pdpRules = pkgs.writeTextFile {
- name = "10-pdp.rules";
- text = ''
- SUBSYSTEM=="usb", ATTR{idVendor}=="2833", MODE="0666"
- '';
- destination = "/etc/udev/rules.d/10-pdp.rules";
- };
- in {
- packages = [oculusRules pdpRules];
- };
-
- # Enable audio
- security.rtkit.enable = true;
- hardware.pulseaudio.enable = false;
- services.pipewire = {
- enable = true;
- alsa.enable = true;
- alsa.support32Bit = true;
- pulse.enable = true;
- #jack.enable = true;
- wireplumber.configPackages = [
- (pkgs.writeTextDir "share/wireplumber/wireplumber.conf.d/11-bluetooth-policy.conf" ''
- wireplumber.settings = { bluetooth.autoswitch-to-headset-profile = false }
- '')
- ];
- };
-
- # Fonts
- fonts = {
- packages = with pkgs; [
- liberation_ttf
- twitter-color-emoji
- ubuntu_font_family
- noto-fonts
- sarasa-gothic
- orbitron
- (nerdfonts.override {fonts = ["UbuntuMono"];})
- ];
- fontconfig.defaultFonts.emoji = ["Twitter Color Emoji"];
- };
-
- # Enable Dconf and some portals
- services.dbus.enable = true;
- programs.dconf.enable = true;
- programs.light.enable = true;
- security.pam.services.swaylock = {};
- xdg.portal = {
- enable = true;
- config.common.default = "*";
- wlr = {
- enable = true;
- settings = {
- screencast = {
- max_fps = 60;
- chooser_type = "simple";
- chooser_cmd = "${pkgs.slurp}/bin/slurp -f %o -or -B 00000066 -b 00000099";
- };
- };
- };
- extraPortals = with pkgs; [xdg-desktop-portal-gtk];
- };
-
- # Configure greetd for remote login
- services.greetd = let
- startSway = pkgs.writeScript "startsway" ''
- # Use NVIDIA variables if drivers are in use
- if lspci -k | grep "Kernel driver in use: nvidia" &> /dev/null; then
- # NVIDIA/AMD variables
- export LIBVA_DRIVER_NAME=nvidia
- export GBM_BACKEND=nvidia-drm
- export __GLX_VENDOR_LIBRARY_NAME=nvidia
- export WLR_NO_HARDWARE_CURSORS=1
- else
- :
- fi
-
- # Sway/Wayland
- export XDG_CURRENT_DESKTOP=sway
- export QT_QPA_PLATFORM="wayland;xcb"
-
- # Start Sway
- sway --unsupported-gpu
- '';
- in {
- enable = true;
- restart = true;
- settings = {
- terminal = {
- vt = 2;
- switch = true;
- };
- default_session = {
- command = "${startSway}";
- user = "jimbo";
- };
- };
- };
-
- # Enable printing
- services = {
- printing = {
- enable = true;
- drivers = with pkgs; [hplip];
- webInterface = false;
- };
- avahi = {
- enable = true;
- nssmdns4 = true;
- openFirewall = true;
- };
- };
-
- # Enable virtualization
- virtualisation = {
- libvirtd = {
- enable = true;
- onBoot = "ignore";
- onShutdown = "shutdown";
- qemu = {
- ovmf = {
- enable = true;
- packages = [pkgs.OVMFFull.fd];
- };
- swtpm.enable = true;
- };
- };
- spiceUSBRedirection.enable = true;
- };
-
- # Enable SSH
- services.openssh = {
- enable = true;
- settings = {
- LogLevel = "VERBOSE";
- PermitRootLogin = "no";
- PrintLastLog = "no";
- PasswordAuthentication = false;
- };
- };
-
- # Block SSH connections after numerous attempts
- services.fail2ban = {
- enable = true;
- maxretry = 5;
- bantime = "5m";
- };
-
- # Enable AppImages
- programs.appimage = {
- enable = true;
- binfmt = true;
- };
-
- # Enable Sunshine as a service
- services.sunshine = {
- enable = true;
- settings.port = 57989;
- autoStart = false;
- };
-
- # Enable MPD
- services.mpd = {
- enable = true;
- user = "jimbo";
- group = "users";
- musicDirectory = "/home/jimbo/JimboNFS/Music";
- playlistDirectory = "/home/jimbo/JimboNFS/Music/Playlists";
- extraConfig = ''
- audio_output {
- type "pipewire"
- name "Local Pipewire"
- }
- '';
- };
- systemd.services.mpd.environment = {
- XDG_RUNTIME_DIR = "/run/user/${toString config.users.users.jimbo.uid}";
- };
-
- # Enable AppArmor
- security.apparmor.enable = true;
-
- # Enable a keying agent
- services.gnome.gnome-keyring.enable = true;
-
- # Enable Polkit for authentication
- security.polkit.enable = true;
-
- # Battery saver for laptops
- services.tlp.enable = true;
-
- # Enable extra functionality in file managers
- services.gvfs.enable = true;
-
- # Attempt to automount USB drives
- services.udisks2.enable = true;
-
- # Enable school VPN
- services.globalprotect.enable = true;
-
- # Define the initial install version and allow auto-upgrades
- system.stateVersion = "23.11";
- system.autoUpgrade.enable = true;
-}
diff --git a/PC/hardware-configuration.nix b/PC/hardware-configuration.nix
deleted file mode 100644
index 6c484a9..0000000
--- a/PC/hardware-configuration.nix
+++ /dev/null
@@ -1,76 +0,0 @@
-# This file was generated by 'nixos-generate-config', try not to modify too much
-{
- config,
- lib,
- pkgs,
- modulesPath,
- ...
-}: {
- imports = [
- (modulesPath + "/installer/scan/not-detected.nix")
- ];
-
- # Load kernel modules on boot
- boot = {
- initrd = {
- availableKernelModules = ["nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod"];
- kernelModules = [];
- };
- kernelModules = ["kvm-amd"];
- extraModulePackages = [];
- };
-
- # Mount everything as necessary
- fileSystems = {
- "/" = {
- device = "/dev/disk/by-uuid/f0786b07-8303-416f-87ff-276bfd696387";
- fsType = "bcachefs";
- };
- "/boot" = {
- device = "/dev/disk/by-uuid/EF6D-9009";
- fsType = "vfat";
- };
- "/etc/libvirt" = {
- device = "/dev/disk/by-label/Qemu";
- options = ["nosuid" "nodev" "nofail"];
- };
- "/var/lib/libvirt" = {
- depends = ["/etc/libvirt"];
- device = "/etc/libvirt/varlibvirt";
- options = ["bind" "rw"];
- };
- "/mnt/Linux1" = {
- device = "/dev/disk/by-label/Linux1";
- options = ["nosuid" "nodev" "nofail" "x-gvfs-show"];
- };
- "/mnt/Linux2" = {
- device = "/dev/disk/by-label/Linux2";
- options = ["nosuid" "nodev" "nofail" "x-gvfs-show"];
- };
- "/mnt/Windows1" = {
- device = "/dev/disk/by-label/Windows1";
- options = ["nosuid" "nodev" "noauto"];
- };
- "/mnt/Windows2" = {
- device = "/dev/disk/by-label/Windows2";
- options = ["nosuid" "nodev" "noauto"];
- };
- "/home/jimbo/JimboNFS" = {
- device = "server:/export/JimboNFS";
- fsType = "nfs4";
- options = ["x-systemd.automount" "_netdev" "nofail" "noauto"];
- };
- };
-
- # Set the swap partition
- swapDevices = [
- {device = "/dev/disk/by-uuid/2e4c5120-716d-4cdc-84a0-c9e6391760db";}
- ];
-
- # Enables DHCP on each ethernet and wireless interface.
- networking.useDHCP = lib.mkDefault true;
- # networking.interfaces.enp42s0.useDHCP = lib.mkDefault true;
-
- nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
- hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
-}
diff --git a/PC/jimbo.nix b/PC/jimbo.nix
deleted file mode 100644
index b294180..0000000
--- a/PC/jimbo.nix
+++ /dev/null
@@ -1,2980 +0,0 @@
-{
- config,
- pkgs,
- options,
- ...
-}: let
- # Global color palette
- primeCol = ''3823C4''; #3823C4
- accentCol = ''1B1F59''; #1B1F59
- splitCol = ''555B9E''; #555B9E
- actSplitCol = ''5980B7''; #5980B7
- darkCol = ''101419''; #101419
- midCol = ''171C23''; #171C23
- lightCol = ''272b33''; #272B33
- urgentCol = ''C43823''; #C43823
- textCol = ''C7D3E3''; #C7D3E3
-
- # Papirus icon theme color
- folderCol = ''indigo'';
-
- # Gtk theme
- themeSettings = {
- name = "Colloid-Dark";
- package = pkgs.colloid-gtk-theme.override {
- themeVariants = ["default"];
- colorVariants = ["dark"];
- sizeVariants = ["standard"];
- tweaks = ["black" "rimless" "normal"];
- };
- };
-
- # Git repo alias
- gitRepo = ''https://git.JimbosFiles.com/Jimbo/NixOS-Config'';
-
- # Wallpapers
- wallpaper1 = pkgs.fetchurl {
- url = "${gitRepo}/raw/branch/main/Extras/Wallpapers/wallpaper1.png";
- sha256 = "1zxb0p0fjsmccy4xv8yk3c4kc313k3lc3xhqmiv452f7sjqqbp25";
- };
- wallpaper2 = pkgs.fetchurl {
- url = "${gitRepo}/raw/branch/main/Extras/Wallpapers/wallpaper2.png";
- sha256 = "13jcllrs05d26iz2isvh1f8fqf20m23sps32kw7qz5iav8nhvsx7";
- };
- wallpaper3 = pkgs.fetchurl {
- url = "${gitRepo}/raw/branch/main/Extras/Wallpapers/wallpaper3.png";
- sha256 = "16r65qnr7f0md4bbjnzq6av4dgmqr3avkilw72qdmyrmh3xj03yw";
- };
- lockpaper = pkgs.fetchurl {
- url = "${gitRepo}/raw/branch/main/Extras/Wallpapers/lockpaper.png";
- sha256 = "1mqvp4bic46gc994fawkraqj76hxd11wdd43qakligchzd20xjd5";
- };
-
- # Define the workspace names
- w0 = ''0:0'';
- w1 = ''1:1'';
- w2 = ''2:2'';
- w3 = ''3:3'';
- w4 = ''4:4'';
- w5 = ''5:5'';
- w6 = ''6:6'';
- w7 = ''7:7'';
- w8 = ''8:8'';
- w9 = ''9:9'';
- w1a = ''11:I'';
- w2a = ''22:II'';
- w3a = ''33:III'';
- w4a = ''44:IV'';
- w5a = ''55:V'';
- w6a = ''66:VI'';
- w7a = ''77:VII'';
- w8a = ''88:VIII'';
- w9a = ''99:IX'';
-
- # Define the primary monitor
- display1 = ''DP-3'';
- display2 = ''DP-1'';
- display3 = ''DP-2'';
- displayTouch = ''eDP-1'';
-
- # Define miscellaneous window manager properties
- borderWeightInt = 3;
- borderWeight = toString borderWeightInt;
-
- # Set the font across all applications I can
- mainFont = ''Ubuntu'';
- nerdFont = ''UbuntuMono Nerd Font'';
-
- # Terminal authentication
- auth = ''doas'';
-
- # Swappy config, for screenshot editing
- swappyConfig = ''
- [Default]
- early_exit=true
- save_dir=$HOME/Pictures/Screenshots
- '';
-
- # All my rofi scripts in one file
- rofiScripts = pkgs.writeScriptBin "rofiscripts" ''
- # Scratchpad function
- handle_scratchpads() {
- SCRATCHPADS=$(echo -e "Gotop\nMusic\nSound\nEasyEffects" | rofi -dmenu -i -p "Scratchpads")
- case $SCRATCHPADS in
- Gotop) foot -a gotop -T Gotop gotop;;
- Music) foot -a music -T Music ncmpcpp;;
- Sound) foot -a sound -T Sound pulsemixer;;
- EasyEffects) easyeffects;;
- esac
- }
-
- # Lock menu
- handle_power() {
- POWER=$(echo -e "Shutdown\nReboot\nSleep\nLock\nKill" | rofi -dmenu -i -p "Power")
- case $POWER in
- Shutdown) poweroff;;
- Reboot) reboot;;
- Sleep) swaylock --sleep &;;
- Lock) swaylock &;;
- Kill) pkill -9 sway;;
- esac
- }
-
- # Resolutions
- handle_resolutions() {
- RET=$(echo -e "Default\nWide\nGPU2" | rofi -dmenu -i -p "Resolutions")
- case $RET in
- Default) swaymsg reload ;;
- Wide) swaymsg "
- output ${display1} enable pos 1680 0 mode 1680x1050@59.954Hz
- output ${display2} enable pos 0 0 mode 1680x1050@59.954Hz
- output ${display3} enable pos 3360 0 transform 0
- ";;
- GPU2) swaymsg "
- output ${display2} enable pos 1680 0 mode 1920x1080@60Hz
- output ${display3} enable pos 0 0 transform 0
- ";;
- esac
- }
-
- # Check for command-line arguments
- if [ "$1" == "--scratchpads" ]; then
- handle_scratchpads
- elif [ "$1" == "--power" ]; then
- handle_power
- elif [ "$1" == "--resolutions" ]; then
- handle_resolutions
- else
- echo "Please use a valid argument."
- fi
- '';
-
- # Swaylock's colors and background image
- swayLock = pkgs.writeScriptBin "swaylock" ''
- # Set the lock script
- lockscript() {
- BLANK='#00000000'
- CLEAR='#FFFFFF22'
- DEFAULT='#${primeCol}FF'
- TEXT='#FFFFFFFF'
- WRONG='#${splitCol}FF'
- VERIFYING='#${accentCol}FF'
-
- ${pkgs.swaylock-effects}/bin/swaylock -f -e \
- --key-hl-color=$VERIFYING \
- --bs-hl-color=$WRONG \
- \
- --ring-clear-color=$CLEAR \
- --ring-ver-color=$VERIFYING \
- --ring-wrong-color=$WRONG \
- --ring-color=$DEFAULT \
- --ring-clear-color=$VERIFYING \
- \
- --inside-color=$CLEAR \
- --inside-ver-color=$CLEAR \
- --inside-wrong-color=$CLEAR \
- --inside-clear-color=$CLEAR \
- \
- --text-color=$TEXT \
- --text-clear-color=$TEXT \
- --text-ver-color=$TEXT \
- --text-caps-lock-color=$TEXT \
- --text-wrong-color=$TEXT \
- \
- --indicator \
- --indicator-radius=80 \
- --image=${lockpaper} \
- --clock \
- --font=${mainFont} \
- --font-size=30 \
- --timestr="%I:%M%p" \
- --datestr="%a %b %d %Y"
- }
-
- # Handle whether to lock or sleep
- if [ "$1" == "--sleep" ]; then
- lockscript &
- exec ${pkgs.swayidle}/bin/swayidle -w \
- timeout 1 'swaymsg "output * dpms off"' \
- resume 'swaymsg "output * dpms on"; pkill -9 swayidle'
- else
- lockscript
- fi
- '';
-
- # Toggle notifications using mako
- makoToggle = pkgs.writeScriptBin "makotoggle" ''
- # Run makoctl mode and store the output in a variable
- mode_output=$(makoctl mode)
-
- # Extract the second line after "default"
- mode_line=$(echo "$mode_output" | sed -n '/default/{n;p}')
-
- if [[ "$mode_line" == "do-not-disturb" ]]; then
- # Notifications are disabled, so we enable them
- makoctl mode -r do-not-disturb
- notify-send --expire-time=1500 'Notifications Enabled'
- else
- # Notifications are enabled, so we disable them
- notify-send --expire-time=1500 'Notifications Disabled'
- sleep 2
- makoctl mode -a do-not-disturb
- fi
- '';
-
- # Use grim and slurp to take screenshots in multiple ways
- screenShot = pkgs.writeScriptBin "screenshot" ''
- # Swappy
- handle_swappy() {
- # Create an imv window to act as a static screen
- grim -t jpeg - | imv -w "GlobalShot" - & imv_pid=$!
-
- # Capture the screenshot of the selected area and save to a temporary file
- selected_area=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"'\
- | XCURSOR_SIZE=40 slurp -w ${borderWeight} -c ${primeCol} -B 00000066 -b 00000099)
- temp_file=$(mktemp -u).png
- grim -g "$selected_area" "$temp_file"
-
- # Kill the imv window
- kill $imv_pid
-
- # Copy the screenshot to the clipboard
- swappy -f - < "$temp_file"
-
- # Clean up the temporary file
- rm "$temp_file"
- }
-
- # Current
- handle_current() {
- # Take a screenshot and save it to the temporary file
- temp_file=$(mktemp -u).png
- grim -o $(swaymsg -t get_outputs | jq -r '.[] | select(.focused) | .name') "$temp_file"
-
- # Check if the screenshot was successfully taken
- if [ $? -eq 0 ]; then
- # Copy the screenshot to the clipboard
- wl-copy < "$temp_file"
-
- # Show a notification with the screenshot
- notify-send -i "$temp_file" "Current screen copied."
-
- # Remove the temporary file
- rm "$temp_file"
- else
- # If the screenshot capture failed, show an error notification
- notify-send "Error: Unable to capture screenshot."
- fi
- }
-
- # All screens
- handle_all() {
- # Take a screenshot and save it to the temporary file
- temp_file=$(mktemp -u).png
- grim -t jpeg "$temp_file"
-
- # Check if the screenshot was successfully taken
- if [ $? -eq 0 ]; then
- # Copy the screenshot to the clipboard
- wl-copy < "$temp_file"
-
- # Show a notification with the screenshot
- notify-send -i "$temp_file" "All screen copied."
-
- # Remove the temporary file
- rm "$temp_file"
- else
- # If the screenshot capture failed, show an error notification
- notify-send "Error: Unable to capture screenshot."
- fi
- }
-
- # Check for command-line arguments
- if [ "$1" == "--swappy" ]; then
- handle_swappy
- elif [ "$1" == "--current" ]; then
- handle_current
- elif [ "$1" == "--all" ]; then
- handle_all
- else
- echo "Please use the arguments swappy, current, or all."
- fi
- '';
-
- # File manager config
- pcmanConf = ''
- [Behavior]
- BookmarkOpenMethod=current_tab
- ConfirmDelete=true
- RecentFilesNumber=0
-
- [Desktop]
- HideItems=false
- SortColumn=name
- SortFolderFirst=true
- SortHiddenLast=false
- SortOrder=ascending
-
- [FolderView]
- Mode=icon
- ScrollPerPixel=true
- ShadowHidden=true
- ShowFilter=false
- ShowFullNames=true
- ShowHidden=true
- SortCaseSensitive=false
- SortColumn=mtime
- SortFolderFirst=true
- SortHiddenLast=false
- SortOrder=descending
-
- [Places]
- HiddenPlaces=menu://applications/, network:///, computer:///, /home/jimbo/Desktop
-
- [System]
- Archiver=file-roller
- Terminal=foot
-
- [Thumbnail]
- MaxExternalThumbnailFileSize=-1
- MaxThumbnailFileSize=4096
- ShowThumbnails=true
- ThumbnailLocalFilesOnly=true
-
- [Window]
- AlwaysShowTabs=false
- PathBarButtons=true
- ShowMenuBar=true
- ShowTabClose=true
- SwitchToNewTab=true
- TabPaths=@Invalid()
- '';
-
- # An Easyeffects equalizer profile that sounds good to me
- easyEffectsProfile = ''
- {
- "output": {
- "blocklist": [],
- "crystalizer#0": {
- "band0": {
- "bypass": false,
- "intensity": 0.0,
- "mute": false
- },
- "band1": {
- "bypass": false,
- "intensity": -1.0,
- "mute": false
- },
- "band2": {
- "bypass": false,
- "intensity": -2.0,
- "mute": false
- },
- "band3": {
- "bypass": false,
- "intensity": -3.0,
- "mute": false
- },
- "band4": {
- "bypass": false,
- "intensity": -4.0,
- "mute": false
- },
- "band5": {
- "bypass": false,
- "intensity": -5.0,
- "mute": false
- },
- "band6": {
- "bypass": false,
- "intensity": -6.0,
- "mute": false
- },
- "band7": {
- "bypass": false,
- "intensity": -7.0,
- "mute": false
- },
- "band8": {
- "bypass": false,
- "intensity": -8.0,
- "mute": false
- },
- "band9": {
- "bypass": false,
- "intensity": -9.0,
- "mute": false
- },
- "band10": {
- "bypass": false,
- "intensity": -10.0,
- "mute": false
- },
- "band11": {
- "bypass": false,
- "intensity": -11.0,
- "mute": false
- },
- "band12": {
- "bypass": false,
- "intensity": -12.0,
- "mute": false
- },
- "bypass": false,
- "input-gain": 0.0,
- "output-gain": 0.0
- },
- "equalizer#0": {
- "balance": 0.0,
- "bypass": false,
- "input-gain": 0.0,
- "left": {
- "band0": {
- "frequency": 32.0,
- "gain": 1.1,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band1": {
- "frequency": 64.0,
- "gain": 1.16,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band2": {
- "frequency": 125.0,
- "gain": 3.33,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band3": {
- "frequency": 250.0,
- "gain": 1.53,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band4": {
- "frequency": 500.0,
- "gain": -1.83,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band5": {
- "frequency": 1000.0,
- "gain": -0.58,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band6": {
- "frequency": 2000.0,
- "gain": 1.42,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band7": {
- "frequency": 4000.0,
- "gain": 4.73,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band8": {
- "frequency": 16000.0,
- "gain": 7.62,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band9": {
- "frequency": 156.38,
- "gain": 2.84,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- }
- },
- "mode": "IIR",
- "num-bands": 10,
- "output-gain": 0.0,
- "pitch-left": 0.0,
- "pitch-right": 0.0,
- "right": {
- "band0": {
- "frequency": 32.0,
- "gain": 1.1,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band1": {
- "frequency": 64.0,
- "gain": 1.16,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band2": {
- "frequency": 125.0,
- "gain": 3.33,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band3": {
- "frequency": 250.0,
- "gain": 1.53,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band4": {
- "frequency": 500.0,
- "gain": -1.83,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band5": {
- "frequency": 1000.0,
- "gain": -0.58,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band6": {
- "frequency": 2000.0,
- "gain": 1.42,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band7": {
- "frequency": 4000.0,
- "gain": 4.73,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band8": {
- "frequency": 16000.0,
- "gain": 7.62,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- },
- "band9": {
- "frequency": 156.38,
- "gain": 2.84,
- "mode": "RLC (BT)",
- "mute": false,
- "q": 4.36,
- "slope": "x1",
- "solo": false,
- "type": "Bell"
- }
- },
- "split-channels": false
- },
- "plugins_order": [
- "equalizer#0",
- "crystalizer#0"
- ]
- }
- }
- '';
-
- # Neofetch main config
- neoConf = ''
- {
- "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
- "logo": {
- "source": "xenia",
- "color": {
- "1": "1;97",
- "2": "red",
- "3": "yellow"
- }
- },
- "display": {
- "separator": " \u001b[33m ",
- "color": "red"
- },
- "modules": [
- {
- "type": "custom",
- "format": "\u001b[1m—————————————————————————————————————"
- },
- {
- "type": "host",
- "format": "{5} {2}",
- "key": " "
- },
- {
- "type": "cpu",
- "key": " "
- },
- {
- "type": "gpu",
- "key": " "
- },
- {
- "type": "disk",
- "folders": "/",
- "key": " "
- },
- {
- "type": "memory",
- "format": "{/1}{-}{/}{/2}{-}{/}{} / {}",
- "key": " "
- },
- {
- "type": "display",
- "compactType": "original",
- "key": " "
- },
-
- {
- "type": "custom",
- "format": "\u001b[1m—————————————————————————————————————"
- },
- {
- "type": "os",
- "format": "{3} {12}",
- "key": " "
- },
- {
- "type": "kernel",
- "format": "{1} {2}",
- "key": " "
- },
- {
- "type": "wm",
- "key": " "
- },
- {
- "type": "shell",
- "key": " "
- },
- {
- "type": "terminal",
- "key": " "
- },
- {
- "type": "packages",
- "key": " "
- },
- {
- "type": "uptime",
- "key": " "
- },
- {
- "type": "command",
- "text": "date -d @$(stat -c %W /) '+%a %b %d %r %Z %Y'",
- "key": " "
- },
-
- {
- "type": "custom",
- "format": "\u001b[1m—————————————————————————————————————"
- },
- {
- "type": "custom",
- "format": "\u001b[90m \u001b[31m \u001b[32m \u001b[33m \u001b[34m \u001b[35m \u001b[36m \u001b[37m"
- }
- ]
- }
- '';
-
- # Small Neofetch config
- pFetch = let
- smallConf = pkgs.writeText "smallconf.jsonc" ''
- {
- "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
- "logo": {
- "source": "nixos_small"
- },
- "modules": [
- {
- "type": "os",
- "format": "{3} {12}",
- "key": " "
- },
- {
- "type": "host",
- "format": "{5}",
- "key": " "
- },
- {
- "type": "kernel",
- "format": "{1} {2}",
- "key": " "
- },
- {
- "type": "uptime",
- "key": " "
- },
- {
- "type": "packages",
- "key": " "
- },
- {
- "type": "memory",
- "format": "{/1}{-}{/}{/2}{-}{/}{} / {}",
- "key": " "
- }
- ]
- }
- '';
- in
- pkgs.writeScriptBin "pfetch"
- ''fastfetch --config ${smallConf}'';
-
- # Ranger's bookmarks
- rangerBookmarks = ''
- # Local files
- k:/home/jimbo/Downloads
- v:/home/jimbo/Videos
- c:/home/jimbo/.config
- L:/home/jimbo/.local
- D:/mnt
- n:/etc/nixos
-
- # Remote files
- a:/home/jimbo/JimboNFS
- K:/home/jimbo/JimboNFS/Downloads
- p:/home/jimbo/JimboNFS/Photos
- P:/home/jimbo/JimboNFS/Projects
- V:/home/jimbo/JimboNFS/Videos/Random
- m:/home/jimbo/JimboNFS/Music
- s:/home/jimbo/JimboNFS/School
- '';
-
- # Some sound settings use alsoft, which needs to be configured to use pipewire
- alsoftConf = ''
- drivers=pulse
- '';
-
- # FireFox colors
- foxJimCol = ''
- :root {
- --tab-active-bg-color: #${primeCol};
- --tab-hover-bg-color: #${accentCol};
- --tab-inactive-bg-color: #${darkCol};
- --tab-active-fg-fallback-color: #FFFFFF;
- --tab-inactive-fg-fallback-color: #${textCol};
- --urlbar-focused-bg-color: #${darkCol};
- --urlbar-not-focused-bg-color: #${darkCol};
- --toolbar-bgcolor: #${darkCol} !important;
- '';
- foxWorkCol = ''
- :root {
- --tab-active-bg-color: #${darkCol};
- --tab-hover-bg-color: #${accentCol};
- --tab-inactive-bg-color: #${primeCol};
- --tab-active-fg-fallback-color: #${textCol};
- --tab-inactive-fg-fallback-color: #FFFFFF;
- --urlbar-focused-bg-color: #${primeCol};
- --urlbar-not-focused-bg-color: #${primeCol};
- --toolbar-bgcolor: #${primeCol} !important;
- '';
- quteFoxCSS = ''
- --tab-font: '${mainFont}';
- --urlbar-font: '${mainFont}';
-
- /* try increasing if you encounter problems */
- --urlbar-height-setting: 24px;
- --tab-min-height: 20px !important;
-
- /* I don't recommend you touch this */
- --arrowpanel-menuitem-padding: 2px !important;
- --arrowpanel-border-radius: 0px !important;
- --arrowpanel-menuitem-border-radius: 0px !important;
- --toolbarbutton-border-radius: 0px !important;
- --toolbarbutton-inner-padding: 0px 2px !important;
- --toolbar-field-focus-background-color: var(--urlbar-focused-bg-color) !important;
- --toolbar-field-background-color: var(--urlbar-not-focused-bg-color) !important;
- --toolbar-field-focus-border-color: transparent !important;
- }
-
- /* --- General debloat ------------------------------ */
-
- /* bottom left page loading status or url preview */
- #statuspanel { display: none !important; }
-
- /* remove radius from right-click popup */
- menupopup, panel { --panel-border-radius: 0px !important; }
- menu, menuitem, menucaption { border-radius: 0px !important; }
-
- /* no large buttons in right-click menu */
- menupopup > #context-navigation { display: none !important; }
- menupopup > #context-sep-navigation { display: none !important; }
-
- /* --- Debloat navbar ------------------------------- */
-
- #back-button { display: none; }
- #forward-button { display: none; }
- #reload-button { display: none; }
- #stop-button { display: none; }
- #home-button { display: none; }
- #library-button { display: none; }
- #fxa-toolbar-menu-button { display: none; }
- /* empty space before and after the url bar */
- #customizableui-special-spring1, #customizableui-special-spring2 { display: none; }
-
- /* --- Style navbar -------------------------------- */
-
- /* remove padding between toolbar buttons */
- toolbar .toolbarbutton-1 { padding: 0 0 !important; }
-
- #urlbar-container {
- --urlbar-container-height: var(--urlbar-height-setting) !important;
- margin-left: 0 !important;
- margin-right: 0 !important;
- padding-top: 0 !important;
- padding-bottom: 0 !important;
- font-family: var(--urlbar-font, 'monospace');
- font-size: 14px;
- }
-
- #urlbar {
- --urlbar-height: var(--urlbar-height-setting) !important;
- --urlbar-toolbar-height: var(--urlbar-height-setting) !important;
- min-height: var(--urlbar-height-setting) !important;
- border-color: var(--lwt-toolbar-field-border-color, hsla(240,5%,5%,.25)) !important;
- }
-
- #urlbar-input {
- margin-left: 0.8em !important;
- margin-right: 0.4em !important;
- }
-
- #navigator-toolbox {
- border: none !important;
- }
-
- /* keep pop-up menus from overlapping with navbar */
- #widget-overflow { margin: 0 !important; }
- #appmenu-popup { margin: 0 !important; }
- #customizationui-widget-panel { margin: 0 !important; }
- #unified-extensions-panel { margin: 0 !important; }
-
- /* --- Unified extensions button -------------------- */
-
- /* make extension icons smaller */
- #unified-extensions-view {
- --uei-icon-size: 18px;
- }
-
- /* hide bloat */
- .unified-extensions-item-message-deck,
- #unified-extensions-view > .panel-header,
- #unified-extensions-view > toolbarseparator,
- #unified-extensions-manage-extensions {
- display: none !important;
- }
-
- /* add 3px padding on the top and the bottom of the box */
- .panel-subview-body {
- padding: 3px 0px !important;
- }
-
- #unified-extensions-view .unified-extensions-item-menu-button {
- margin-inline-end: 0 !important;
- }
-
- #unified-extensions-view .toolbarbutton-icon {
- padding: 0 !important;
- }
-
- .unified-extensions-item-contents {
- line-height: 1 !important;
- white-space: nowrap !important;
- }
-
- /* --- Debloat URL bar ------------------------------- */
-
- #identity-box { display: none; }
- #pageActionButton { display: none; }
- #pocket-button { display: none; }
- #urlbar-zoom-button { display: none; }
- #tracking-protection-icon-container { display: none !important; }
- #reader-mode-button{ display: none !important; }
- #star-button { display: none; }
- #star-button-box:hover { background: inherit !important; }
-
- /* Go to arrow button at the end of the urlbar when searching */
- #urlbar-go-button { display: none; }
-
- /* remove container indicator from urlbar */
- #userContext-label, #userContext-indicator { display: none !important;}
-
- /* --- Style tab toolbar ---------------------------- */
-
- #titlebar {
- --proton-tab-block-margin: 0px !important;
- --tab-block-margin: 0px !important;
- }
-
- #TabsToolbar, .tabbrowser-tab {
- max-height: var(--tab-min-height) !important;
- font-size: 14px !important;
- outline: none !important;
- }
-
- /* Change color of normal tabs */
- tab:not([selected="true"]) {
- background-color: var(--tab-inactive-bg-color) !important;
- color: var(--identity-icon-color, var(--tab-inactive-fg-fallback-color)) !important;
- }
-
- tab {
- font-family: var(--tab-font, monospace);
- border: none !important;
- }
-
- /* safari style tab width */
- .tabbrowser-tab[fadein] {
- max-width: 100vw !important;
- border: none
- }
-
- /* Hide close button on tabs */
- #tabbrowser-tabs .tabbrowser-tab .tab-close-button { display: none !important; }
-
- .tabbrowser-tab {
- /* remove border between tabs */
- padding-inline: 0px !important;
- /* reduce fade effect of tab text */
- --tab-label-mask-size: 1em !important;
- /* fix pinned tab behaviour on overflow */
- overflow-clip-margin: 0px !important;
- }
-
- /* Tab: selected colors */
- #tabbrowser-tabs .tabbrowser-tab[selected] .tab-content {
- background: var(--tab-active-bg-color) !important;
- color: var(--identity-icon-color, var(--tab-active-fg-fallback-color)) !important;
- }
-
- /* Tab: hovered colors */
- #tabbrowser-tabs .tabbrowser-tab:hover:not([selected]) .tab-content {
- background: var(--tab-hover-bg-color) !important;
- }
-
- /* hide window controls */
- .titlebar-buttonbox-container { display: none; }
-
- /* remove titlebar spacers */
- .titlebar-spacer { display: none !important; }
-
- /* disable tab shadow */
- #tabbrowser-tabs:not([noshadowfortests]) .tab-background:is([selected], [multiselected]) {
- box-shadow: none !important;
- }
-
- /* remove dark space between pinned tab and first non-pinned tab */
- #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs]) >
- #tabbrowser-arrowscrollbox >
- .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) {
- margin-inline-start: 0px !important;
- }
-
- /* remove dropdown menu button which displays all tabs on overflow */
- #alltabs-button { display: none !important }
-
- /* fix displaying of pinned tabs on overflow */
- #tabbrowser-tabs:not([secondarytext-unsupported]) .tab-label-container {
- height: var(--tab-min-height) !important;
- }
-
- /* remove overflow scroll buttons */
- #scrollbutton-up, #scrollbutton-down { display: none !important; }
-
- /* remove new tab button */
- #tabs-newtab-button {
- display: none !important;
- }
-
- /* --- Autohide Navbar ------------------------------ */
-
- /* hide navbar unless focused */
- #nav-bar {
- min-height: 0 !important;
- max-height: 0 !important;
- height: 0 !important;
- --moz-transform: scaleY(0) !important;
- transform: scaleY(0) !important;
- }
-
- /* show on focus */
- #nav-bar:focus-within {
- --moz-transform: scale(1) !important;
- transform: scale(1) !important;
- max-height: var(--urlbar-height-setting) !important;
- height: var(--urlbar-height-setting) !important;
- min-height: var(--urlbar-height-setting) !important;
- }
-
- #navigator-toolbox:focus-within > .browser-toolbar {
- transform: translateY(0);
- opacity: 1;
- }
-
- /* --- Hide tab bar on single tab ------------------- */
-
- #tabbrowser-tabs .tabbrowser-tab:only-of-type,
- #tabbrowser-tabs .tabbrowser-tab:only-of-type + #tabbrowser-arrowscrollbox-periphery{
- display:none !important;
- }
- #tabbrowser-tabs, #tabbrowser-arrowscrollbox {min-height:0!important;}
- #alltabs-button {display:none !important;}
-
- /* --- Prevent tab folding -------------------------- */
-
- .tabbrowser-tab {
- min-width: initial !important;
- }
- .tab-content {
- overflow: hidden !important;
- }
- '';
-in {
- # Define home manager programs and configs
- home-manager = {
- useGlobalPkgs = true;
- useUserPackages = true;
- users.jimbo = {
- config,
- pkgs,
- ...
- }: {
- # Install user programs
- home.packages = with pkgs; [
- # Useful programs
- rofi-bluetooth
- bemoji
- imv
- qbittorrent
- libreoffice-fresh
- easyeffects
- vesktop
- element-desktop
- ffmpegthumbnailer
- thunderbird
-
- # Terminal programs
- dua
- vimv
- p7zip
- fastfetch
- gotop
- pciutils
- usbutils
- pulsemixer
- tcptrack
- mpc-cli
- protonvpn-cli_2
-
- # Scripts as global programs
- rofiScripts
- makoToggle
- swayLock
- screenShot
- pFetch
-
- # Production tools
- krita
- inkscape
- audacity
- blender
- sunvox
-
- # File manager
- pcmanfm-qt
- gnome.file-roller
- imagemagick
- poppler_utils
-
- # School tools
- remmina
- freerdp
- globalprotect-openconnect
- python3
- zoom-us
-
- # Audio/Video tools
- yt-dlp
- spotdl
- ani-cli
- playerctl
- ffmpeg
-
- # Unlimited games
- steam
- steam-run
- heroic
- prismlauncher
-
- # Emulators
- #dolphin-emu cemu ryujinx duckstation pcsx2 unstable.lime3ds
-
- # Remote desktop
- #moonlight-qt
-
- # Window manager apps
- swaybg
- wdisplays
- wl-clipboard
- clipman
- libnotify
- bc
- grim
- slurp
- swappy
- jq
- lm_sensors
- ];
-
- # Enable Sway and write some scripts
- wayland.windowManager.sway = let
- # Define certain variables Sway will use
- primeMod = "Mod4";
- secMod = "Mod1";
-
- # Define scripts specific to Sway
- pinWindow = pkgs.writeScript "pin-window" ''
- # Get the current border style of the focused window
- current_style=$(swaymsg -t get_tree | jq -r '.. | select(.focused?).border')
-
- # Toggle between "normal" (default) and "pixel ${borderWeight}" border styles
- if [ "$current_style" == "none" ]; then
- swaymsg "sticky disable, border pixel ${borderWeight}"
- else
- swaymsg "sticky enable, border none"
- fi
- '';
-
- # Kill a window or probe it for info
- swayTools = pkgs.writeScript "swaytools" ''
- # List the app name and whether or not it uses wayland
- swayprop() {
- selected_window=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | "\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)"' | slurp -r -c ${primeCol} -B 00000066 -b 00000000)
- if [ -n "$selected_window" ]; then
- app_id=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | select("\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)" == "'"$selected_window"'") | .app_id')
- system=$(sed 's/xdg_shell/Wayland/g; s/xwayland/Xorg/g' < <(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | select("\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)" == "'"$selected_window"'") | .shell'))
- notify-send "$(echo -e "Window's app_id: $app_id\nWindow System: $system")"
- fi
- }
-
- # Kill a selected window
- swaykill() {
- selected_window=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | "\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)"' | slurp -r -c ${primeCol} -B 00000066 -b 00000000)
- if [ -n "$selected_window" ]; then
- pid=$(swaymsg -t get_tree | jq -r '.. | select(.pid? and .visible?) | select("\(.rect.x),\(.rect.y) \(.rect.width)x\(.rect.height)" == "'"$selected_window"'") | .pid')
- kill -9 "$pid"
- fi
- }
-
- # Handle which tool we use
- if [ "$1" == "--prop" ]; then
- swayprop
- elif [ "$1" == "--kill" ]; then
- swaykill
- fi
- '';
- in {
- enable = true;
- package = pkgs.unstable.sway;
- wrapperFeatures.gtk = true;
- checkConfig = false;
- config = {
- modifier = "${primeMod}";
- startup = [
- # Lock the screen on start, to allow an autostarted session
- {command = "swaylock";}
-
- # Scratchpads
- {command = "foot -a gotop -T Gotop gotop";}
- {command = "foot -a music -T Music ncmpcpp";}
- {command = "foot -a sound -T Sound pulsemixer";}
- {command = "easyeffects";}
-
- # Daemons and tray apps
- {command = "wl-paste -t text --watch clipman store -P";}
- {command = "wl-copy";}
- {command = "mako";}
- {command = "${pkgs.rot8}/bin/rot8";}
-
- # Polkit agent
- {command = "${pkgs.mate.mate-polkit}/libexec/polkit-mate-authentication-agent-1";}
-
- # Foreground apps
- {command = "librewolf -P Misc --name=MiscBrowser";}
- {command = "vesktop --ozone-platform-hint=auto";}
- {command = "element-desktop";}
- {command = "thunderbird";}
- ];
-
- # Use Waybar rather than Sway's
- bars = [{command = "waybar";}];
-
- # Define hardware
- output = {
- ${display1} = {
- pos = "1920 405";
- mode = "1920x1080@143.980Hz";
- max_render_time = "3";
- bg = "${wallpaper1} fill";
- scale = "1";
- adaptive_sync = "on";
- };
- ${display2} = {
- pos = "0 405";
- mode = "1920x1080@60Hz";
- max_render_time = "3";
- bg = "${wallpaper2} fill";
- };
- ${display3} = {
- pos = "3840 0";
- mode = "1680x1050@59.883Hz";
- transform = "270";
- max_render_time = "3";
- bg = "${wallpaper3} fill";
- };
- ${displayTouch} = {
- #scale = "1.4";
- };
- "*" = {
- bg = "${wallpaper1} fill";
- };
- };
-
- # Mouse sensitivity, disable acceleration, allow touch while typing
- input = {
- "9610:4103:SINOWEALTH_Game_Mouse" = {
- pointer_accel = "-0.9";
- };
- "9639:64097:Compx_2.4G_Receiver_Mouse" = {
- pointer_accel = "-0.82";
- };
- "1452:627:bcm5974" = {
- scroll_factor = "0.3";
- };
- "*" = {
- accel_profile = "flat";
- dwt = "disabled";
- natural_scroll = "disabled";
- };
-
- # Map touchscreen to output
- "1386:806:Wacom_ISDv5_326_Finger" = {
- map_to_output = "${displayTouch}";
- };
- };
-
- # Assign workspaces to outputs
- workspaceOutputAssign = let
- workspaces1 = ["${w0}" "${w1}" "${w2}" "${w3}" "${w1a}" "${w2a}" "${w3a}"];
- workspaces2 = ["${w4}" "${w5}" "${w6}" "${w4a}" "${w5a}" "${w6a}"];
- workspaces3 = ["${w7}" "${w8}" "${w9}" "${w7a}" "${w8a}" "${w9a}"];
- assign = output: workspaces:
- map (workspace: {
- inherit workspace;
- inherit output;
- })
- workspaces;
- in
- (assign "${display1}" workspaces1) ++ (assign "${display2}" workspaces2) ++ (assign "${display3}" workspaces3);
-
- # Theming settings
- fonts = {
- names = ["${mainFont}"];
- size = 10.5;
- };
- gaps = {
- inner = 5;
- smartGaps = true;
- };
- focus = {
- newWindow = "focus";
- };
- colors = {
- focused = {
- border = "#${primeCol}";
- background = "#${primeCol}";
- text = "#FFFFFF";
- indicator = "#${actSplitCol}";
- childBorder = "#${primeCol}";
- };
- focusedInactive = {
- border = "#${accentCol}";
- background = "#${accentCol}";
- text = "#${textCol}";
- indicator = "#${splitCol}";
- childBorder = "#${accentCol}";
- };
- unfocused = {
- border = "#${darkCol}";
- background = "#${darkCol}";
- text = "#${textCol}";
- indicator = "#${splitCol}";
- childBorder = "#${splitCol}";
- };
- urgent = {
- border = "#${urgentCol}";
- background = "#${urgentCol}";
- text = "#${textCol}";
- indicator = "#${urgentCol}";
- childBorder = "#${urgentCol}";
- };
- };
-
- # Hotkeys
- keybindings = let
- resizeAmount = ''55'';
- sendNotif = ''notify-send --expire-time=1500'';
- in {
- ## Launcher keys
-
- # LibreWolf profiles
- "${primeMod}+F1" = ''exec librewolf -P Jimbo --name=JimBrowser | ${sendNotif} "Main Browser"'';
- "${primeMod}+F2" = ''exec librewolf -P School --name=SchoolBrowser | ${sendNotif} "School Browser"'';
- "${primeMod}+F3" = ''exec librewolf -P Misc --name=MiscBrowser | ${sendNotif} "Miscellaneous Browser"'';
-
- # Discord
- "${primeMod}+F4" = ''exec vesktop --ozone-platform-hint=auto | ${sendNotif} "Discord"'';
-
- # Games
- "${primeMod}+F5" = ''exec steam | ${sendNotif} "Steam"'';
- "${primeMod}+F6" = ''exec heroic | ${sendNotif} "Heroic Games"'';
-
- # Looking glass for VMs
- "${primeMod}+F7" = ''exec looking-glass-client input:rawMouse=yes | ${sendNotif} "Looking Glass"'';
-
- # Virtual Machines
- "${primeMod}+F10" = ''exec virt-manager | ${sendNotif} "Virtual Machines"'';
-
- # BeMenu scripts
- "${primeMod}+F11" = ''exec rofiscripts --scratchpads | ${sendNotif} "Scratchpads"'';
- "${primeMod}+${secMod}+Ctrl+r" = ''exec rofiscripts --resolutions'';
-
- # Open NixOS configuration files
- "${primeMod}+F12" = ''exec foot ranger /etc/nixos | ${sendNotif} "Nix Config"'';
-
- # Terminal, rofi, clipmenu, media script, power menu, show/hide waybar
- "${primeMod}+Return" = ''exec foot'';
- "${primeMod}+s" = ''exec rofi -show run -p Command'';
- "${primeMod}+c" = ''exec clipman pick -t rofi'';
- "${primeMod}+x" = ''exec rofiscripts --power'';
- "${primeMod}+b" = ''exec pkill -USR1 waybar'';
- "${primeMod}+Escape" = ''exec ${swayTools} --kill'';
-
- # PCManFM, Emoji Picker, Rofi Launcher, Bluetooth, Ranger
- "${primeMod}+Shift+t" = ''exec pcmanfm-qt'';
- "${primeMod}+Shift+e" = ''exec BEMOJI_PICKER_CMD="rofi -dmenu -i -p Emoji" bemoji -n -P 0'';
- "${primeMod}+Shift+s" = ''exec rofi -show drun -modi drun -drun-display-format {name} -show-icons -disable-history'';
- "${primeMod}+Shift+b" = ''exec rofi-bluetooth'';
- "${primeMod}+Shift+Return" = ''exec foot ranger'';
-
- # Swaytools prop, colorpicker, obs-cmd
- "${primeMod}+Ctrl+x" = ''exec ${swayTools} --prop'';
- "${primeMod}+Ctrl+c" = ''exec ${pkgs.hyprpicker}/bin/hyprpicker -an && ${sendNotif} "Color copied to clipboard"'';
- "${primeMod}+Ctrl+Prior" = ''exec ${pkgs.obs-cmd}/bin/obs-cmd scene switch "Main"'';
- "${primeMod}+Ctrl+Next" = ''exec ${pkgs.obs-cmd}/bin/obs-cmd scene switch "Guest"'';
-
- ## Media keys
-
- # Volume control
- "XF86AudioRaiseVolume" = ''exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+'';
- "XF86AudioLowerVolume" = ''exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-'';
-
- # MPV volume control
- "${secMod}+XF86AudioRaiseVolume" = ''exec mpc volume +3'';
- "${secMod}+XF86AudioLowerVolume" = ''exec mpc volume -3'';
-
- # Mute, Stop
- "XF86AudioMute" = ''exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle'';
- "XF86AudioStop" = ''exec mpc stop'';
-
- # Play MPD, Firefox, or MPV
- "XF86AudioPlay" = ''exec mpc toggle'';
- "${secMod}+XF86AudioPlay" = ''exec playerctl --player=librewolf play-pause'';
- "Ctrl+XF86AudioPlay" = ''exec playerctl --player=mpv play-pause'';
-
- # Next/Previous
- "XF86AudioNext" = ''exec mpc next'';
- "XF86AudioPrev" = ''exec mpc prev'';
-
- # Seek
- "${secMod}+Shift+XF86AudioNext" = ''exec mpc seek +5'';
- "${secMod}+Shift+XF86AudioPrev" = ''exec mpc seek -5'';
-
- ## Notification keys
-
- # Toggle mako
- "${primeMod}+n" = ''exec makotoggle'';
- "${primeMod}+Shift+n" = ''exec makoctl restore'';
- "${primeMod}+Ctrl+n" = ''exec makoctl dismiss -a'';
-
- ## Miscellaneous keys
-
- # Screenshots
- "Print" = ''exec screenshot --swappy'';
- "${primeMod}+Shift+f" = ''exec screenshot --swappy'';
- "Shift+Print" = ''exec screenshot --current'';
- "Ctrl+Print" = ''exec screenshot --all'';
-
- # Server SSH
- "${primeMod}+Ctrl+Return" = ''exec foot ssh server -p 2222'';
-
- # Display Brightness and Keyboard Brightness
- "XF86MonBrightnessUp" = ''exec ${pkgs.light}/bin/light -A 5'';
- "XF86MonBrightnessDown" = ''exec ${pkgs.light}/bin/light -U 5'';
- "Shift+XF86MonBrightnessUp" = ''exec ${pkgs.light}/bin/light -A 1'';
- "Shift+XF86MonBrightnessDown" = ''exec ${pkgs.light}/bin/light -U 1'';
- "XF86KbdBrightnessUp" = ''exec ${pkgs.light}/bin/light -s sysfs/leds/smc::kbd_backlight -A 5'';
- "XF86KbdBrightnessDown" = ''exec ${pkgs.light}/bin/light -s sysfs/leds/smc::kbd_backlight -U 5'';
-
- ## Window manager keys
- "${primeMod}+q" = ''kill'';
- "${primeMod}+Shift+r" = ''reload'';
-
- # Switch to workspaces
- "${primeMod}+grave" = ''workspace ${w0}'';
- "${primeMod}+1" = ''workspace ${w1}'';
- "${primeMod}+2" = ''workspace ${w2}'';
- "${primeMod}+3" = ''workspace ${w3}'';
- "${primeMod}+4" = ''workspace ${w4}'';
- "${primeMod}+5" = ''workspace ${w5}'';
- "${primeMod}+6" = ''workspace ${w6}'';
- "${primeMod}+7" = ''workspace ${w7}'';
- "${primeMod}+8" = ''workspace ${w8}'';
- "${primeMod}+9" = ''workspace ${w9}'';
-
- # Switch to alternate workspaces
- "${secMod}+F1" = ''workspace ${w1a}'';
- "${secMod}+F2" = ''workspace ${w2a}'';
- "${secMod}+F3" = ''workspace ${w3a}'';
- "${secMod}+F4" = ''workspace ${w4a}'';
- "${secMod}+F5" = ''workspace ${w5a}'';
- "${secMod}+F6" = ''workspace ${w6a}'';
- "${secMod}+F7" = ''workspace ${w7a}'';
- "${secMod}+F8" = ''workspace ${w8a}'';
- "${secMod}+F9" = ''workspace ${w9a}'';
-
- # Move window to and focus new workspace
- "${primeMod}+Shift+grave" = ''move container to workspace ${w0}; workspace ${w0}'';
- "${primeMod}+Shift+1" = ''move container to workspace ${w1}; workspace ${w1}'';
- "${primeMod}+Shift+2" = ''move container to workspace ${w2}; workspace ${w2}'';
- "${primeMod}+Shift+3" = ''move container to workspace ${w3}; workspace ${w3}'';
- "${primeMod}+Shift+4" = ''move container to workspace ${w4}; workspace ${w4}'';
- "${primeMod}+Shift+5" = ''move container to workspace ${w5}; workspace ${w5}'';
- "${primeMod}+Shift+6" = ''move container to workspace ${w6}; workspace ${w6}'';
- "${primeMod}+Shift+7" = ''move container to workspace ${w7}; workspace ${w7}'';
- "${primeMod}+Shift+8" = ''move container to workspace ${w8}; workspace ${w8}'';
- "${primeMod}+Shift+9" = ''move container to workspace ${w9}; workspace ${w9}'';
-
- # Move window to and focus new alternate workspace
- "${secMod}+Shift+F1" = ''move container to workspace ${w1a}; workspace ${w1a}'';
- "${secMod}+Shift+F2" = ''move container to workspace ${w2a}; workspace ${w2a}'';
- "${secMod}+Shift+F3" = ''move container to workspace ${w3a}; workspace ${w3a}'';
- "${secMod}+Shift+F4" = ''move container to workspace ${w4a}; workspace ${w4a}'';
- "${secMod}+Shift+F5" = ''move container to workspace ${w5a}; workspace ${w5a}'';
- "${secMod}+Shift+F6" = ''move container to workspace ${w6a}; workspace ${w6a}'';
- "${secMod}+Shift+F7" = ''move container to workspace ${w7a}; workspace ${w7a}'';
- "${secMod}+Shift+F8" = ''move container to workspace ${w8a}; workspace ${w8a}'';
- "${secMod}+Shift+F9" = ''move container to workspace ${w9a}; workspace ${w9a}'';
-
- # Change focus across windows
- "${primeMod}+Up" = ''focus up'';
- "${primeMod}+Down" = ''focus down'';
- "${primeMod}+Left" = ''focus left'';
- "${primeMod}+Right" = ''focus right'';
-
- # Switch focus across outputs
- "${primeMod}+j" = ''focus output ${display2}'';
- "${primeMod}+k" = ''focus output ${display1}'';
- "${primeMod}+l" = ''focus output ${display3}'';
-
- # Move focused window
- "${primeMod}+Shift+Up" = ''move up ${resizeAmount} px'';
- "${primeMod}+Shift+Down" = ''move down ${resizeAmount} px'';
- "${primeMod}+Shift+Left" = ''move left ${resizeAmount} px'';
- "${primeMod}+Shift+Right" = ''move right ${resizeAmount} px'';
-
- # Move window across outputs
- "${primeMod}+Shift+j" = ''move output ${display2}; focus output ${display2}'';
- "${primeMod}+Shift+k" = ''move output ${display1}; focus output ${display1}'';
- "${primeMod}+Shift+l" = ''move output ${display3}; focus output ${display3}'';
-
- # Change focus between floating/tiled, toggle floating
- "${primeMod}+space" = ''focus mode_toggle'';
- "${primeMod}+Shift+space" = ''floating toggle'';
-
- # Allow a window to be visible on all workspaces, toggle border
- "${primeMod}+0" = ''exec ${pinWindow}'';
-
- # Toggle fullscreen
- "${primeMod}+f" = ''fullscreen toggle'';
- "${primeMod}+${secMod}+Ctrl+f" = ''fullscreen toggle global'';
-
- # Change container layout
- "${primeMod}+w" = ''layout toggle split'';
- "${primeMod}+e" = ''layout toggle tabbed stacking'';
-
- # Change split direction
- "${primeMod}+h" = ''split h'';
- "${primeMod}+v" = ''split v'';
-
- # Focus parent / child
- "${primeMod}+a" = ''focus parent'';
- "${primeMod}+d" = ''focus child'';
-
- # Resize windows
- "${primeMod}+${secMod}+Up" = ''resize grow height ${resizeAmount} px or 5 ppt'';
- "${primeMod}+${secMod}+Down" = ''resize shrink height ${resizeAmount} px or 5 ppt'';
- "${primeMod}+${secMod}+Left" = ''resize shrink width ${resizeAmount} px or 5 ppt'';
- "${primeMod}+${secMod}+Right" = ''resize grow width ${resizeAmount} px or 5 ppt'';
-
- # Adjust gap size
- "${primeMod}+Shift+equal" = ''gaps inner current set 5'';
- "${primeMod}+equal" = ''gaps inner current plus 5'';
- "${primeMod}+minus" = ''gaps inner current minus 5'';
-
- # Scratchpads
- "Ctrl+Shift+Escape" = ''[app_id="gotop"] scratchpad show, move position center, resize set 1216 888'';
- "${primeMod}+Shift+m" = ''[app_id="music"] scratchpad show, move position center, resize set 1006 657'';
- "${primeMod}+Shift+v" = ''[app_id="sound"] scratchpad show, move position center, resize set 1000 800'';
- "${primeMod}+Shift+Backslash" = ''[app_id="com.github.wwmm.easyeffects"] scratchpad show, move position center, resize set 1000 800'';
- };
- window = {
- border = borderWeightInt;
- titlebar = false;
- commands = [
- # Scratchpads
- {
- criteria = {con_mark = "scratchpad";};
- command = ''floating enable, sticky enable, move scratchpad, mark borderless'';
- }
- {
- criteria = {app_id = "gotop";};
- command = ''mark scratchpad'';
- }
- {
- criteria = {app_id = "music";};
- command = ''mark scratchpad'';
- }
- {
- criteria = {app_id = "sound";};
- command = ''mark scratchpad'';
- }
- {
- criteria = {app_id = "com.github.wwmm.easyeffects";};
- command = ''mark scratchpad, opacity 0.9'';
- }
-
- # Create a "Scratchpad" for apps I don't want to be seen when launched
- {
- criteria = {con_mark = "hiddenaway";};
- command = ''move scratchpad'';
- }
-
- # Give apps that don't have them borders
- {
- criteria = {con_mark = "borderless";};
- command = ''border pixel ${borderWeight}'';
- }
- {
- criteria = {app_id = "com.github.wwmm.easyeffects";};
- command = ''mark borderless'';
- }
- {
- criteria = {class = "steam";};
- command = ''mark borderless'';
- }
- {
- criteria = {app_id = "swappy";};
- command = ''mark borderless'';
- }
- {
- criteria = {app_id = "virt-manager";};
- command = ''mark borderless'';
- }
- {
- criteria = {window_role = "pop-up";};
- command = ''mark borderless'';
- }
-
- # Floating or fullscreen rules
- {
- criteria = {app_id = "float";};
- command = ''floating enable'';
- }
- {
- criteria = {title = "^GlobalShot";};
- command = ''floating enable, fullscreen enable global'';
- }
- ];
- };
- assigns = {
- # Browsers
- "${w1}" = [{app_id = "JimBrowser";}];
- "${w1a}" = [{app_id = "SchoolBrowser";}];
-
- # Communication
- "${w3a}" = [{class = "zoom";}];
- "${w7}" = [{app_id = "MiscBrowser";} {app_id = "vesktop";}];
- "${w8}" = [{class = "Element";}];
- "${w9}" = [{app_id = "thunderbird";}];
-
- # Else
- "${w2}" = [{class = "SDL Application";} {class = "heroic";}];
- "${w2a}" = [{app_id = "looking-glass-client";}];
- "${w4a}" = [{app_id = "com.obsproject.Studio";}];
- };
- };
- extraConfig = ''
- # Options I can't find in Nix yet
- default_floating_border pixel ${borderWeight}
- hide_edge_borders --i3 smart
- titlebar_padding 10 1
- primary_selection disabled
-
- # SwayFX specific options
- #blur enable
- #blur_passes 3
- #blur_radius 5
- #layer_effects 'rofi' blur enable
- #layer_effects 'notifications' blur enable; blur_ignore_transparent enable
-
- # Include extra window icons
- include ${pkgs.fetchurl {
- url = "https://raw.githubusercontent.com/iguanajuice/sway-font-awesome/6b7a9d08974eea1b9cddb8d444e1c89d6837083a/icons";
- sha256 = "09ki5qw1h91kd33k3fwzq7cb6ck8sq4haswgizrsy387sfr2a75x";
- }}
-
- # Switch to workspace 1
- workspace ${w7}
- workspace ${w1}
- '';
- };
-
- # Define Waybar
- programs.waybar = let
- # Sway workspaces
- swayWorkspacesModule = {
- format = "{name}";
- enable-bar-scroll = true;
- warp-on-scroll = false;
- disable-scroll-wraparound = true;
- };
-
- # Sway windows
- swayWindowsModule = {
- icon = true;
- icon-size = 15;
- all-outputs = true;
- tooltip = false;
- rewrite = {
- "(.*) — LibreWolf" = " $1";
- "LibreWolf" = " Firefox";
- "(.*) - LibreWolf — Firefox" = " $1";
- };
- };
-
- # Pipewire/Pulseaudio
- pulseModule = {
- format = "{icon} {volume}%";
- format-bluetooth = "{icon} {volume}%";
- format-muted = " muted";
- format-icons = {
- headphone = " ";
- headset = " ";
- default = [" " " "];
- };
- on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
- on-click-middle = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 100%";
- on-click-right = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 60%";
- ignored-sinks = ["Easy Effects Sink" "USB FS AUDIO Analog Stereo"];
- };
-
- # CPU, Ram and Vram
- cpuModule = {
- format = " {usage}%";
- interval = 3;
- };
- ramModule = {
- format = " {used}G";
- tooltip = false;
- };
- vramModule = {
- exec = pkgs.writeScript "vramScript" ''
- # Don't run the script if running on integrated graphics
- if lspci -k | grep "Kernel driver in use: nvidia" &> /dev/null || lspci -k | grep "Kernel driver in use: amdgpu" &> /dev/null; then
-
- # Run the nvidia-smi command and capture the VRAM usage and GPU utilization output
- if lspci -k | grep "Kernel driver in use: nvidia" &> /dev/null; then
- vram_usage_mb=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits)
- temperature=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader,nounits)
-
- # Check the drm memory if an AMD GPU is present
- elif lspci -k | grep "Kernel driver in use: amdgpu" &> /dev/null; then
- vram_usage_mb=$(echo "$(cat /sys/class/drm/card0/device/mem_info_vram_used || cat /sys/class/drm/card1/device/mem_info_vram_used) / 1024 / 1024" | bc)
- temperature=$(sensors | grep 'edge' | awk '{print $2}' | sed 's/[^0-9.-]//g')
- fi
-
- # Check if VRAM usage is under 1GB
- if [ $vram_usage_mb -lt 1024 ]; then
- vram_usage_display="$(echo $vram_usage_mb)M"
- else
- # Convert MB to GiB
- vram_usage_gib=$(bc <<< "scale=2; $vram_usage_mb / 1024")
- vram_usage_display="$(echo $vram_usage_gib)G"
- fi
-
- # Print the VRAM usage in MB or GiB, and include GPU utilization and temperature
- echo "{\"text\":\" $(echo $vram_usage_display)\",\"tooltip\":\"$(echo $temperature)°C\"}"
- else
- :
- fi
- '';
- format = "{}";
- return-type = "json";
- interval = 3;
- };
-
- # Clocks
- longClockModule = {
- exec = pkgs.writeScript "longClock" ''
- # Long clock format, with a numeric date and military time tooltip
- time=$(date +'%a %b %d %l:%M:%S%p' | tr -s ' ')
- date=$(date "+%Y-%m-%d")
- echo "{\"text\":\" $time\",\"tooltip\":\"$date\"}"
- '';
- on-click = ''wl-copy $(date "+%Y-%m-%d-%H%M%S"); notify-send "Date copied."'';
- format = "{}";
- return-type = "json";
- interval = 1;
- tooltip = true;
- };
- shortClockModule = {
- exec = "echo ' '$(date +'%l:%M%p' | sed 's/^ //')";
- on-click = ''wl-copy $(date "+%Y-%m-%d-%H%M%S"); notify-send "Date copied."'';
- interval = 60;
- tooltip = false;
- };
-
- # Tray, gamemode, bluetooth, and network tray modules
- trayModule = {
- spacing = 5;
- };
- networkModule = {
- format-ethernet = "";
- format-wifi = "";
- format-disconnected = "";
- format-linked = "";
- tooltip-format-ethernet = "{ipaddr}\n{ifname} ";
- tooltip-format-wifi = "{ipaddr}\n{essid} ({signalStrength}%)";
- tooltip-format-disconnected = "Disconnected";
- };
- bluetoothModule = {
- format = "";
- format-disabled = "";
- format-no-controller = "";
- tooltip-format-on = "No devices connected.";
- tooltip-format-connected = "{num_connections} connected\n{device_enumerate}";
- tooltip-format-enumerate-connected = "{device_alias}";
- tooltip-format-enumerate-connected-battery = "{device_alias} {device_battery_percentage}%";
- on-click = "rofi-bluetooth";
- };
- scratchpadModule = {
- format = " {count}";
- show-empty = false;
- tooltip = true;
- tooltip-format = "{title}";
- };
- gamemodeModule = {
- format = "{glyph}";
- glyph = "";
- hide-not-running = true;
- use-icon = true;
- icon-spacing = 3;
- icon-size = 19;
- tooltip = true;
- tooltip-format = "Gamemode On";
- };
-
- # Special per-bar modules
- mediaModule = {
- exec-if = "mpc status | grep -q '^\\[playing\\] \\|^\\[paused\\]'";
- exec = pkgs.writeScript "mpvMetadata" ''
- get_metadata() {
- mpc --format "%file%" | head -n 1 | sed -E 's/\.(mp3|mp4|m4a|mov|flac|opus|oga)$//; s/&/&/g'
- }
-
- truncate_string() {
- local str="$1"
- local max_length=30
- if [ $(expr length "$str") -gt $max_length ]; then
- str=$(expr substr "$str" 1 $max_length)...
- fi
- echo "$str"
- }
-
- if mpc status 2>/dev/null | grep -q playing; then
- song_name=$(get_metadata | awk -F ' - ' '{print $2}')
- if [ -z "$song_name" ]; then
- song_name=$(get_metadata)
- fi
- echo "{\"text\":\"$(truncate_string " $song_name")\",\"tooltip\":\"$(get_metadata)\"}"
- elif mpc status 2>/dev/null | grep -q paused; then
- artist_name=$(get_metadata | awk -F ' - ' '{print $1}')
- if [ -z "$artist_name" ]; then
- artist_name=$(get_metadata)
- fi
- echo "{\"text\":\"$(truncate_string " $artist_name")\",\"tooltip\":\"$(get_metadata)\",\"class\":\"paused\"}"
- fi
- '';
- format = "{}";
- return-type = "json";
- interval = 2;
- max-length = 30;
- on-click = "mpc toggle";
- };
- notificationModule = {
- exec = pkgs.writeScript "notificationScript" ''
- # Run makoctl mode and store the output in a variable
- mode_output=$(makoctl mode)
-
- # Extract the second line after "default"
- mode_line=$(echo "$mode_output" | sed -n '/default/{n;p}')
-
- # Print the notification status with the tooltip
- if [[ "$mode_line" == "do-not-disturb" ]]; then
- printf '{"text":" Off","class":"disabled","tooltip":"Notifications Disabled."}'
- else
- printf '{"text":" On","tooltip":"Notifications Enabled."}';
- fi
- '';
- format = "{}";
- return-type = "json";
- interval = 2;
- on-click = "makotoggle";
- };
- weatherModule = {
- exec = pkgs.writeScript "weatherScript" ''
- # Define variables
- CITY="Maple"
- API_KEY="18be8db3528f08c33ed9f95698335ea7"
-
- # Fetch weather data
- weather_data=$(curl -s "http://api.openweathermap.org/data/2.5/weather?q=$CITY&appid=$API_KEY")
- weather_condition=$(echo $weather_data | jq -r '.weather[0].main')
-
- # Map weather conditions to emojis
- case "$weather_condition" in
- "Clear") emoji="☀️";;
- "Clouds") emoji="☁️";;
- "Rain") emoji="🌧️";;
- "Drizzle") emoji="🌦️";;
- "Thunderstorm") emoji="⛈️";;
- "Snow") emoji="❄️";;
- "Mist"|"Fog"|"Haze") emoji="🌫️";;
- *) emoji="🌍";; # Default emoji for unknown
- esac
-
- # Extract and format temperature in Celsius
- temperature_kelvin=$(echo $weather_data | jq -r '.main.temp')
- temperature_celsius=$(echo "$temperature_kelvin - 273.15" | bc)
- formatted_temperature=$(printf "%.0f" $temperature_celsius)
-
- # Display weather emoji and temperature
- echo {\"text\":\"$emoji $formatted_temperature°C\",\"tooltip\":\"Weather in $CITY: $weather_condition\"}
- '';
- format = "{}";
- return-type = "json";
- on-click = "xdg-open https://openweathermap.org/city/6173577 | notify-send 'Opening weather'";
- interval = 150;
- };
-
- # Laptop modules
- backlightModule = {
- format = "{icon} {percent}%";
- format-icons = ["" ""];
- tooltip = false;
- };
- batteryModule = {
- interval = 60;
- states = {
- warning = 30;
- critical = 15;
- };
- format = "{icon} {capacity}%";
- format-icons = ["" "" "" "" ""];
- };
- in {
- enable = true;
- settings = {
- display1 = {
- name = "bar1";
- position = "top";
- layer = "bottom";
- output = [display1 "VGA-1"];
- modules-left = ["sway/workspaces" "sway/window"];
- modules-right = [
- "pulseaudio"
- "cpu"
- "memory"
- "custom/vram"
- "custom/clock-long"
- "gamemode"
- "sway/scratchpad"
- "tray"
- "bluetooth"
- "network"
- ];
- "sway/workspaces" = swayWorkspacesModule;
- "sway/window" = swayWindowsModule;
- "pulseaudio" = pulseModule;
- "cpu" = cpuModule;
- "memory" = ramModule;
- "custom/vram" = vramModule;
- "custom/clock-long" = longClockModule;
- "gamemode" = gamemodeModule;
- "sway/scratchpad" = scratchpadModule;
- "tray" = trayModule;
- "bluetooth" = bluetoothModule;
- "network" = networkModule // {interface = "enp*";};
- };
- display2 = {
- name = "bar2";
- position = "top";
- layer = "bottom";
- output = [display2];
- modules-left = ["sway/workspaces" "sway/window"];
- modules-right = [
- "pulseaudio"
- "custom/media"
- "custom/notifs"
- "cpu"
- "memory"
- "custom/vram"
- "custom/clock-long"
- ];
- "sway/workspaces" = swayWorkspacesModule;
- "sway/window" = swayWindowsModule;
- "pulseaudio" = pulseModule;
- "custom/media" = mediaModule;
- "custom/notifs" = notificationModule;
- "cpu" = cpuModule;
- "memory" = ramModule;
- "custom/vram" = vramModule;
- "custom/clock-long" = longClockModule;
- };
- display3 = {
- name = "bar3";
- position = "top";
- layer = "bottom";
- output = [display3];
- modules-left = ["sway/workspaces" "sway/window"];
- modules-right = [
- "pulseaudio"
- "custom/weather"
- "cpu"
- "memory"
- "custom/vram"
- "custom/clock-short"
- ];
- "sway/workspaces" = swayWorkspacesModule;
- "sway/window" = swayWindowsModule;
- "pulseaudio" = pulseModule;
- "custom/weather" = weatherModule;
- "cpu" = cpuModule;
- "memory" = ramModule;
- "custom/vram" = vramModule;
- "custom/clock-short" = shortClockModule;
- };
- displayLap = {
- name = "laptop";
- position = "top";
- layer = "bottom";
- output = ["eDP-1" "LVDS-1" "DSI-1" "HDMI-A-1"];
- modules-left = ["sway/workspaces" "sway/window"];
- modules-right = [
- "pulseaudio"
- "custom/media"
- "custom/notifs"
- "custom/weather2"
- "cpu"
- "memory"
- "custom/vram"
- "backlight"
- "battery"
- "custom/clock-long"
- "gamemode"
- "sway/scratchpad"
- "tray"
- "bluetooth"
- "network"
- ];
- "sway/workspaces" = swayWorkspacesModule;
- "sway/window" = swayWindowsModule;
- "pulseaudio" = pulseModule;
- "custom/media" = mediaModule;
- "custom/notifs" = notificationModule;
- "custom/weather2" = weatherModule;
- "cpu" = cpuModule;
- "memory" = ramModule;
- "custom/vram" = vramModule;
- "backlight" = backlightModule;
- "battery" = batteryModule;
- "custom/clock-long" = longClockModule;
- "sway/scratchpad" = scratchpadModule;
- "tray" = trayModule;
- "bluetooth" = bluetoothModule;
- "network" = networkModule;
- };
- };
- style = ''
- * {
- border: 0;
- border-radius: 0;
- min-height: 0;
- font-family: ${mainFont}, ${nerdFont};
- font-size: 15.5px;
- color: #${textCol};
- }
- #waybar {
- background: #${darkCol};
- }
- #workspaces {
- padding: 0 6px 0 0;
- }
- #tray {
- padding: 0 2px 0 5px;
- }
- #network {
- padding: 0 10px 0 4px;
- }
- #network.disconnected,#bluetooth.off {
- color: #424242;
- }
- #bluetooth {
- margin: 0 6px 0 4px;
- font-size: 13.4px;
- }
- #workspaces button {
- padding: 0 3px;
- color: white;
- border-bottom: 3px solid transparent;
- min-width: 20px;
- }
- #workspaces button.visible {
- border-bottom: 3px solid #${primeCol};
- background: #${midCol};
- }
- #workspaces button.urgent {
- border-bottom: 3px solid #${urgentCol};
- }
- #workspaces button:hover {
- box-shadow: none;
- background: #${lightCol};
- }
- #scratchpad {
- margin-left: 2px;
- }
- #cpu {
- border-bottom: 3px solid #f90000;
- margin: 0 5px 0 2px;
- }
- #memory {
- border-bottom: 3px solid #4bffdc;
- margin: 0 5px 0 2px;
- }
- #custom-vram {
- border-bottom: 3px solid #33FF00;
- margin: 0 5px 0 2px;
- }
- #custom-media {
- border-bottom: 3px solid #ffb066;
- margin: 0 5px 0 2px;
- }
- #custom-clock-long {
- border-bottom: 3px solid #0a6cf5;
- margin: 0 5px 0 2px;
- }
- #custom-clock-short {
- border-bottom: 3px solid #0a6cf5;
- margin: 0 5px 0 2px;
- }
- #backlight {
- border-bottom: 3px solid #5ffca3;
- margin: 0 5px 0 2px;
- }
- #battery {
- border-bottom: 3px solid #fcfc16;
- margin: 0 5px 0 2px;
- }
- #custom-media.paused {
- color: #888;
- }
- #custom-weather {
- border-bottom: 3px solid #${primeCol};
- margin: 0 5px 0 2px;
- }
- #custom-weather2 {
- border-bottom: 3px solid #c75bd3;
- margin: 0 5px 0 2px;
- }
- #custom-notifs {
- border-bottom: 3px solid #${primeCol};
- margin: 0 5px 0 2px;
- }
- #custom-notifs.disabled {
- color: #888;
- }
- #pulseaudio {
- margin-right: 5px;
- }
- #pulseaudio.muted {
- color: #424242;
- }
- '';
- };
-
- # Define GTK theme settings
- gtk = {
- enable = true;
- font = {
- name = "${mainFont}";
- size = 11;
- };
- theme = themeSettings;
- iconTheme = {
- package = pkgs.papirus-icon-theme.override {color = "${folderCol}";};
- name = "Papirus-Dark";
- };
- cursorTheme = {
- package = pkgs.simp1e-cursors;
- name = "Simp1e-Dark";
- };
-
- # GTK app bookmarks
- gtk3 = {
- bookmarks = [
- # Local
- "file:///home/jimbo/Downloads"
- "file:///home/jimbo/Documents"
- "file:///home/jimbo/Videos"
- "file:///home/jimbo/Pictures/Screenshots"
-
- # Remote
- "file:///home/jimbo/JimboNFS/Downloads"
- "file:///home/jimbo/JimboNFS/Documents"
- "file:///home/jimbo/JimboNFS/Music"
- "file:///home/jimbo/JimboNFS/Photos"
- "file:///home/jimbo/JimboNFS/Videos"
- "file:///home/jimbo/JimboNFS/Projects"
-
- # Links and mounts
- "file:///home/jimbo/VMs"
-
- # More important stuff
- "file:///home/jimbo/JimboNFS/School"
- ];
-
- # Disable shadows
- extraCss = ''
- * { outline-width: 0px; }
- decoration { box-shadow: none; }
- '';
- };
-
- # Stop gtk4 from being rounded
- gtk4.extraCss = ''
- window {
- border-top-left-radius:0;
- border-top-right-radius:0;
- border-bottom-left-radius:0;
- border-bottom-right-radius:0;
- }
- '';
- };
-
- # Theme QT apps
- qt = {
- enable = true;
- style.name = "gtk2";
- platformTheme.name = "gtk2";
- };
-
- # Select default apps
- xdg.mimeApps.defaultApplications = {
- "inode/directory" = "pcmanfm-qt.desktop";
- "text/plain" = "nvim.desktop";
- "image/png" = "imv.desktop";
- "image/jpeg" = "imv.desktop";
- };
-
- # Set dconf settings
- dconf.settings = {
- "org/gnome/desktop/interface/color-scheme" = {
- color-scheme = "prefer-dark";
- };
- "org/virt-manager/virt-manager/connections" = {
- autoconnect = ["qemu:///system"];
- uris = ["qemu:///system"];
- };
- };
-
- # Enable Librewolf and extensions
- programs.firefox = let
- commonExtensions = with pkgs.nur.repos.rycee.firefox-addons; [
- ublock-origin
- bitwarden
- darkreader
- sponsorblock
- return-youtube-dislikes
- no-pdf-download
- ];
- commonSearch = {
- force = true;
- default = "Google";
- engines = {
- "Google" = {
- urls = [
- {
- template = "https://www.google.com/search";
- params = [
- {
- name = "q";
- value = "{searchTerms}";
- }
- ];
- }
- ];
- definedAliases = ["@g"];
- };
- "NixPKGs" = {
- urls = [
- {
- template = "https://search.nixos.org/packages";
- params = [
- {
- name = "type";
- value = "packages";
- }
- {
- name = "query";
- value = "{searchTerms}";
- }
- ];
- }
- ];
- icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
- definedAliases = ["@pkgs"];
- };
- };
- };
- commonSettings = {
- "font.name.serif.x-western" = "${mainFont}";
- "font.name.sans-serif.x-western" = "${mainFont}";
- "font.name.monospace.x-western" = "${nerdFont}";
- "general.autoScroll" = true;
- "browser.compactmode.show" = true;
- "browser.uidensity" = 1;
- "browser.startup.page" = 3;
- "extensions.pocket.enabled" = false;
- "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
- "privacy.userContext.newTabContainerOnLeftClick.enabled" = true;
- "privacy.clearOnShutdown.history" = false;
- "privacy.clearOnShutdown.cookies" = false;
- "browser.toolbars.bookmarks.visibility" = "never";
- "media.hardware-video-decoding.force-enabled" = true;
- "svg.context-properties.content.enabled" = true;
- "toolkit.tabbox.switchByScrolling" = true;
- "device.sensors.motion.enabled" = false;
- "extensions.autoDisableScopes" = 0;
- "gnomeTheme.hideSingleTab" = true;
- "browser.contentblocking.category" = "strict";
- "urlclassifier.trackingSkipURLs" = "*.reddit.com, *.twitter.com, *.twimg.com, *.tiktok.com";
- "urlclassifier.features.socialtracking.skipURLs" = "*.instagram.com, *.twitter.com, *.twimg.com";
- "network.cookie.sameSite.noneRequiresSecure" = true;
- "browser.helperApps.deleteTempFileOnExit" = true;
- "privacy.globalprivacycontrol.enabled" = true;
- "privacy.globalprivacycontrol.functionality.enabled" = true;
- #"webgl.disabled" = false;
- };
- in {
- enable = true;
- package = pkgs.librewolf;
- profiles = {
- Jimbo = {
- id = 0;
- extensions = commonExtensions;
- search = commonSearch;
- settings = commonSettings;
- userChrome = ''
- ${foxJimCol}
- ${quteFoxCSS}
- '';
- };
- School = {
- id = 1;
- extensions = commonExtensions;
- search = commonSearch;
- settings = commonSettings;
- userChrome = ''
- ${foxWorkCol}
- ${quteFoxCSS}
- '';
- };
- Misc = {
- id = 2;
- extensions = commonExtensions;
- search = commonSearch;
- settings = commonSettings;
- containersForce = true;
- containers = {
- Google = {
- color = "green";
- icon = "fingerprint";
- id = 200;
- };
- Seneca = {
- color = "red";
- icon = "briefcase";
- id = 201;
- };
- };
- };
- };
- };
-
- # Enable a terminal emulator
- programs.foot = {
- enable = true;
- server.enable = false;
- settings = {
- main = {
- term = "xterm-256color";
- font = "${nerdFont}:size=14.7";
- };
- cursor = {
- style = "beam";
- };
- colors = {
- alpha = "0.65";
- background = "${darkCol}";
- regular0 = "3f3f3f";
- regular1 = "cc0000";
- regular2 = "4e9a06";
- regular3 = "c4a000";
- regular4 = "94bff3";
- regular5 = "85678f";
- regular6 = "06989a";
- regular7 = "dcdccc";
- bright0 = "545454";
- bright1 = "fc5454";
- bright2 = "8ae234";
- bright3 = "fce94f";
- bright4 = "94bff3";
- bright5 = "b294bb";
- bright6 = "93e0e3";
- bright7 = "ffffff";
- };
- key-bindings = {
- search-start = "Control+f";
- };
- };
- };
-
- # Install Neovim and plugins
- programs.neovim = {
- enable = true;
- defaultEditor = true;
- viAlias = true;
- vimAlias = true;
- plugins = with pkgs.vimPlugins; [
- # Vim theme
- vim-airline
- vim-airline-themes
-
- # Internal clipboard
- vim-vsnip
- cmp-vsnip
-
- # Autocomplete manager
- lspkind-nvim
-
- # Autocomplete plugins
- cmp-nvim-lsp
- cmp-buffer
- cmp-path
- cmp-cmdline
- nvim-cmp
-
- # Hex color visualizer and color theme
- nvim-colorizer-lua
- vim-monokai-pro
- ];
- extraConfig = ''
- lua <'] = cmp.mapping.scroll_docs(-4),
- [''] = cmp.mapping.scroll_docs(4),
- [''] = cmp.mapping.complete(),
- [''] = cmp.mapping.abort(),
- [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
- }),
- sources = cmp.config.sources({
- { name = 'nvim_lsp' },
- { name = 'vsnip' }
- }, {
- { name = 'buffer' },
- })
- })
-
- -- Use buffer source for '/' and '?'
- cmp.setup.cmdline({ '/', '?' }, {
- mapping = cmp.mapping.preset.cmdline(),
- sources = {
- { name = 'buffer' }
- }
- })
-
- -- Use cmdline & path source for ':'
- cmp.setup.cmdline(':', {
- mapping = cmp.mapping.preset.cmdline(),
- sources = cmp.config.sources({
- { name = 'path' }
- }, {
- { name = 'cmdline' }
- })
- })
- EOF
-
- colorscheme monokai_pro
- let g:airline_theme='onedark'
- let g:airline#extensions#tabline#enabled = 1
- hi Normal guibg=none ctermbg=235
- hi Visual guibg=#${midCol} ctermbg=238
- hi Pmenu guibg=#${midCol} ctermbg=238
- hi EndOfBuffer guibg=none ctermbg=235
- hi LineNr guibg=none ctermbg=none
- lua require'colorizer'.setup()
-
- set nu rnu
- set termguicolors
- set mouse=a
-
- set undofile
- set undodir=$HOME/.local/share/nvim/undo
- set undolevels=100
- set undoreload=10000
-
- nmap :bnext
- nmap :bprev
- nmap :bd
- '';
- };
-
- # Enable tmux
- programs.tmux = {
- enable = true;
- extraConfig = ''
- set -g mouse on
- set -g base-index 1
- set -g default-terminal "st-256color"
- set -g history-limit 4096
- set -g set-titles on
- set -g set-titles-string "#T"
- set -g status on
- set -g status-left ""
- set -g status-position bottom
- set -g status-right "#[bg=brightblack]#[fg=dark_purple] #T "
- set -g status-style "bg=black"
- setw -g pane-base-index 1
- setw -g window-status-format "#[bg=brightmagenta]#[fg=black] #I #[bg=brightblack]#[fg=white] #W "
- setw -g window-status-current-format "#[bg=brightmagenta]#[fg=black] #I #[bg=white]#[fg=black] #W "
- '';
- };
-
- # Enable Ranger
- programs.ranger = {
- enable = true;
- settings = {
- preview_images = true;
- preview_images_method = "sixel";
- dirname_in_tabs = true;
- cd_tab_fuzzy = true;
- autosave_bookmarks = false;
- show_hidden = true;
- wrap_scroll = true;
- column_ratios = "2,2,4";
- hidden_filter = ''^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$'';
- };
- rifle = [
- # Text editing
- {
- condition = ''ext xml|json|jsonc|m3u|m3u8|csv|tex|py|pl|rb|js|sh|php|md|nix'';
- command = ''vim -- "$@"'';
- }
-
- # Media
- {
- condition = ''mime ^image, has imv, X, flag f'';
- command = ''imv -- "$@"'';
- }
- {
- condition = ''mime ^video, terminal, has mpv'';
- command = ''mpv -- "$@"'';
- }
- {
- condition = ''mime ^video, terminal, has mpv'';
- command = ''mpv --video-rotate=270 -- "$@"'';
- }
- {
- condition = ''mime ^audio|ogg$, terminal, has mpv'';
- command = ''mpv --no-audio-display -- "$@"'';
- }
- {
- condition = ''mime ^audio|ogg$, terminal, has mpv'';
- command = ''mpv --shuffle --no-audio-display -- "$@"'';
- }
- {
- condition = ''ext x?html?|pdf, has librewolf, X, flag f'';
- command = ''librewolf -- "$@"'';
- }
- {
- condition = ''ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has libreoffice, X, flag f'';
- command = ''libreoffice "$@"'';
- }
-
- # Scripts
- {
- condition = ''sh'';
- command = ''sh -- "$1"'';
- }
- {
- condition = ''py'';
- command = ''python -- "$1"'';
- }
- {
- condition = ''pl'';
- command = ''perl -- "$1"'';
- }
- {
- condition = ''js'';
- command = ''node -- "$1"'';
- }
- {
- condition = ''php'';
- command = ''php -- "$1"'';
- }
-
- # Misc
- {
- condition = ''ext exe|msi'';
- command = ''wine "$1"'';
- }
- {
- condition = ''ext 7z|ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz|iso|jar|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has 7z'';
- command = ''7z x -- "$@"'';
- }
- {
- condition = ''label open, has xdg-open'';
- command = ''xdg-open -- "$@"'';
- }
- ];
- plugins = [
- {
- name = "devicons2";
- src = builtins.fetchGit {
- url = "https://github.com/cdump/ranger-devicons2";
- rev = "9606009aa01743768b0f27de0a841f7d8fe196c5";
- };
- }
- ];
- extraConfig = ''
- default_linemode devicons2
- '';
- };
-
- # Enable Rofi
- programs.rofi = {
- enable = true;
- package = pkgs.rofi-wayland;
- terminal = "foot";
- font = "${mainFont} 14";
- theme = let
- inherit (config.lib.formats.rasi) mkLiteral;
- in {
- "*" = {
- lightbg = mkLiteral "#EEE8D5";
- lightfg = mkLiteral "#586875";
- blue = mkLiteral "#268BD2";
- red = mkLiteral "#DC322F";
- background-color = mkLiteral "#00000000";
- separatorcolor = mkLiteral "#00000000";
- normal-foreground = mkLiteral "#${textCol}";
- normal-background = mkLiteral "#${darkCol}1A";
- urgent-foreground = mkLiteral "#${urgentCol}";
- active-foreground = mkLiteral "#${splitCol}";
- selected-active-foreground = mkLiteral "#${primeCol}";
- background = mkLiteral "#${darkCol}B3";
- bordercolor = mkLiteral "#${primeCol}";
- selected-normal-foreground = mkLiteral "#FFFFFF";
- selected-normal-background = mkLiteral "#${primeCol}80";
- border-color = mkLiteral "#${primeCol}";
- urgent-background = mkLiteral "#${accentCol}26";
- active-background = mkLiteral "#${accentCol}26";
- selected-active-background = mkLiteral "#${splitCol}54";
- };
- "#window" = {
- background-color = mkLiteral "@background";
- width = 500;
- border = mkLiteral "${borderWeight}";
- padding = 5;
- };
- "#message" = {
- border = mkLiteral "1px dash 0px 0px";
- border-color = mkLiteral "@separatorcolor";
- padding = 1;
- };
- "#textbox" = {
- text-color = mkLiteral "@normal-foreground";
- };
- "#listview" = {
- fixed-height = 0;
- border-color = mkLiteral "@separatorcolor";
- scrollbar = mkLiteral "false";
- columns = 2;
- };
- "#element" = {
- border = 0;
- padding = 1;
- };
- "#element-text" = {
- background-color = mkLiteral "inherit";
- text-color = mkLiteral "inherit";
- };
- "#element.normal.normal" = {
- text-color = mkLiteral "@normal-foreground";
- };
- "#element.normal.urgent" = {
- text-color = mkLiteral "@urgent-foreground";
- };
- "#element.normal.active" = {
- background-color = mkLiteral "@active-background";
- text-color = mkLiteral "@active-foreground";
- };
- "#element.selected.normal" = {
- background-color = mkLiteral "@selected-normal-background";
- text-color = mkLiteral "@selected-normal-foreground";
- };
- "#element.selected.urgent" = {
- background-color = mkLiteral "@urgent-background";
- text-color = mkLiteral "@urgent-foreground";
- };
- "#element.selected.active" = {
- background-color = mkLiteral "@selected-active-background";
- text-color = mkLiteral "@selected-active-foreground";
- };
- "#element.alternate.normal" = {
- text-color = mkLiteral "@normal-foreground";
- };
- "#element.alternate.urgent" = {
- text-color = mkLiteral "@urgent-foreground";
- };
- "#element.alternate.active" = {
- background-color = mkLiteral "@active-background";
- text-color = mkLiteral "@active-foreground";
- };
- "#mode-switcher" = {
- border = mkLiteral "2px dash 0px 0px";
- border-color = mkLiteral "@separatorcolor";
- };
- "#button.selected" = {
- background-color = mkLiteral "@selected-normal-background";
- text-color = mkLiteral "@selected-normal-foreground";
- };
- "#case-indicator" = {
- spacing = mkLiteral "0";
- text-color = mkLiteral "@normal-foreground";
- };
- "#entry" = {
- spacing = 0;
- text-color = mkLiteral "@normal-foreground";
- };
- "#prompt" = {
- spacing = 0;
- text-color = mkLiteral "@normal-foreground";
- };
- "#inputbar" = {
- spacing = 0;
- text-color = mkLiteral "@normal-foreground";
- padding = 1;
- children = map mkLiteral ["prompt" "textbox-prompt-colon" "entry"];
- };
- "#textbox-prompt-colon" = {
- expand = false;
- str = ":";
- margin = mkLiteral "0px 0.3em 0em 0em";
- text-color = mkLiteral "@normal-foreground";
- };
- };
- };
-
- # MPV settings
- programs.mpv = {
- enable = true;
- config = {
- volume = 55;
- loop-playlist = "inf";
- osc = "no";
- };
- };
-
- # OBS with plugins
- programs.obs-studio = {
- enable = true;
- plugins = with pkgs.obs-studio-plugins; [
- obs-pipewire-audio-capture
- obs-webkitgtk
- obs-multi-rtmp
- obs-vkcapture
- obs-tuna
- looking-glass-obs
- ];
- };
-
- # Notification daemon
- services.mako = {
- enable = true;
- borderColor = "#${accentCol}";
- backgroundColor = "#${darkCol}CC";
- output = "${display1}";
- sort = "+time";
- layer = "overlay";
- padding = "8";
- margin = "0";
- borderSize = borderWeightInt;
- maxIconSize = 40;
- defaultTimeout = 6000;
- font = "${mainFont} 12";
- anchor = "bottom-right";
- extraConfig = "on-button-right=dismiss-all\nouter-margin=10\n[mode=do-not-disturb]\ninvisible=1";
- };
-
- # Mangohud
- programs.mangohud = {
- enable = true;
- settings = {
- table_columns = 2;
- frametime = 0;
- legacy_layout = 0;
- font_scale = 0.80;
- background_alpha = 0.25;
- exec = ''echo $(echo $XDG_CURRENT_DESKTOP | sed 's/./\U&/') on $(cat /etc/os-release | grep PRETTY_NAME | cut -d '"' -f 2)'';
- fps = true;
- fps_color_change = true;
- ram = true;
- vram = true;
- cpu_stats = true;
- cpu_load_change = true;
- gpu_stats = true;
- gpu_load_change = true;
- frame_timing = true;
- };
- };
-
- # Enable Discord Music RPC
- services.mpd-discord-rpc.enable = true;
-
- # Enable NCMPCPP
- programs.ncmpcpp = {
- enable = true;
- settings = {
- browser_sort_mode = "name";
- user_interface = "alternative";
- };
- };
-
- # Automount with udisk2
- services.udiskie.enable = true;
-
- # Start defining arbitrary files
- home.file = {
- # Cursor icon theme
- ".icons/default".source = "${pkgs.simp1e-cursors}/share/icons/Simp1e-Dark";
-
- # Swappy's config
- ".config/swappy/config".text = swappyConfig;
-
- # Easyeffects profile
- ".config/easyeffects/output/JimHeadphones.json".text = easyEffectsProfile;
-
- # Fastfetch config
- ".config/fastfetch/config.jsonc".text = neoConf;
-
- # PCManFM config
- ".config/pcmanfm-qt/default/settings.conf".text = pcmanConf;
-
- # Ranger config
- ".local/share/ranger/bookmarks".text = rangerBookmarks;
-
- # Gnome theme
- ".mozilla/firefox/Misc/chrome".source = "${fetchTarball {
- url = "https://github.com/rafaelmardojai/firefox-gnome-theme/archive/refs/tags/v129.zip";
- sha256 = "14x0vp66i8b14q6c9n75sa88fcwy9jd9lik8sjnab2rnwlskvq9h";
- }}";
-
- # Symlinks
- ".librewolf".source = config.lib.file.mkOutOfStoreSymlink "/home/jimbo/.mozilla/firefox";
- "VMs".source = config.lib.file.mkOutOfStoreSymlink "/etc/libvirt/VMs";
-
- # Alsoft config
- ".alsoftrc".text = alsoftConf;
- };
-
- # Define session variables
- home.sessionVariables = {
- EDITOR = "nvim";
- LIBVIRT_DEFAULT_URI = "qemu:///system";
- HISTCONTROL = "ignoreboth";
- };
-
- # Shell aliases
- programs.zsh = {
- enable = true;
- autosuggestion.enable = true;
- syntaxHighlighting.enable = true;
- initExtra = ''
- ${pkgs.any-nix-shell}/bin/any-nix-shell zsh --info-right | source /dev/stdin; pfetch
- setopt HIST_IGNORE_SPACE
- setopt RM_STAR_WAIT
- '';
- oh-my-zsh = {
- enable = true;
- plugins = ["git"];
- theme = "agnoster"; # Main PC
- #theme = "risto"; # Secondary/VM
- #theme = "half-life"; # Server
- };
- shellAliases = {
- # NixOS aliases
- nixcfg = "nvim /etc/nixos/{configuration,jimbo,hardware-configuration}.nix";
- nixswitch = "${auth} nixos-rebuild switch; notify-send 'NixOS switch finished.'";
- nixdate = "${auth} nixos-rebuild switch --upgrade-all; notify-send 'NixOS update finished.'";
- nixclean = "${auth} nix-store --gc; nix-collect-garbage -d; notify-send 'NixOS store clean finished.'";
- nixpurge = "${auth} nix-collect-garbage --delete-old; notify-send 'NixOS generation removed.'";
- nixoptimize = "${auth} nix store optimise; notify-send 'NixOS store optimization finished.'";
-
- # Shortcut aliases
- neo = "clear && fastfetch";
- ip = "ip -c";
- ls = "${pkgs.eza}/bin/eza -a --color=always --group-directories-first --icons";
- nls = "/usr/bin/env ls";
- cat = "${pkgs.bat}/bin/bat --paging never";
- ncat = "/usr/bin/env cat";
- copycat = "wl-copy <";
- sunshinehost = "WAYLAND_DISPLAY=wayland-1 DISPLAY=:1 sunshine -0";
- seneca = "ssh jhampton1@matrix.senecapolytechnic.ca";
-
- # Curl tools
- myip = "curl ifconfig.co";
-
- # Download from sources
- ytdl = "yt-dlp --embed-thumbnail --embed-metadata --output \"%(title)s.%(ext)s\"";
- ytmp4 = "ytdl --recode-video webm";
- ytm3u = "yt-dlp -gS proto:m3u8";
- opusdl = "ytdl --recode-video opus";
- ytopus = "opusdl --format 251";
- spotdl = "spotdl --m3u --format opus";
-
- # Flakes
- buildiso = "${pkgs.nixos-generators}/bin/nixos-generate -f install-iso -c /home/jimbo/Downloads/NixISO/configuration.nix";
- };
- };
-
- # Define current version
- home.stateVersion = "24.05";
- };
- };
-}
diff --git a/Server/configuration.nix b/Server/configuration.nix
deleted file mode 100644
index 2293835..0000000
--- a/Server/configuration.nix
+++ /dev/null
@@ -1,781 +0,0 @@
-{ config, pkgs, options, lib, ... }:
-let
- # Import home manager
- homeManager = fetchTarball
- "https://github.com/nix-community/home-manager/archive/release-24.05.tar.gz";
-
- # IPs
- netInt = ''eno1'';
- localSpan = ''10.0.0'';
- serverIP = ''${localSpan}.2'';
- pcIP = ''${localSpan}.3'';
- vmIP = ''${localSpan}.4'';
-
- # Secrets and passwords
- secrets = import ./secrets.nix;
-in
-
-{
- # Import other nix files and firmware
- imports = [
- ./hardware-configuration.nix
- ./jimbo.nix
- "${homeManager}/nixos"
-
- # Mail server import
- (fetchTarball
- "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/nixos-24.05/nixos-mailserver-nixos-24.05.tar.gz"
- )
- ];
-
- # Allow unfree packages
- nixpkgs.config.allowUnfree = true;
-
- # Allow flakes (I have no clue how they work yet)
- nix.settings.experimental-features = [ "nix-command" "flakes" ];
-
- # Allow unfree firmware
- hardware.enableRedistributableFirmware = true;
-
- # Choose Grub as the bootloader
- boot = {
- loader.systemd-boot = {
- enable = true;
- netbootxyz.enable = true;
- };
- };
-
- # Enable a permissioning system
- security = {
- sudo.enable = false;
- doas = {
- enable = true;
- extraRules = [
- # Give wheel root access, allow persistant session
- { groups = [ "wheel" ]; keepEnv = true; persist = true; }
- ];
- };
- };
-
- # Enable the ZSH shell
- programs.zsh.enable = true;
-
- # Disable Nano
- programs.nano.enable = false;
-
- # Define user account.
- users.users.jimbo = {
- isNormalUser = true;
- hashedPassword = secrets.jimboAccPass;
- openssh.authorizedKeys.keys = [
- "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDLe/HioxCOkszFQdm1vb3ZwuzLzsOThqHNvEI4IXeXZ JimPhone"
- "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJPjBdQrL23pDbcsNCLMvJhcNF7+u95ZV7o1QemOmegf jimbo@JimNixPC"
- "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPeqiMCRXtpoP+BvKBmzvkL7oLKKCmbfdaQIF3yk/S8I jimbo@DV-JHAMPTON-NIXOS"
- ];
- extraGroups = [ "wheel" "docker" "nfsShare" ];
- uid = 1000;
- shell = pkgs.zsh;
- };
-
- # Add service users to extra groups
- users.users = {
- nginx = {
- extraGroups = [ "turnserver" "virtualMail" ];
- isSystemUser = true;
- };
- nextcloud = {
- extraGroups = [ "nfsShare" ];
- isSystemUser = true;
- };
- };
-
- # Define custom groups
- users.groups = {
- nfsShare = {};
- };
-
- # Installed programs to the system profile.
- environment.systemPackages = with pkgs; [
- # Essential system tools
- git parted mdadm
- ];
-
- # Define timezone and networking settings
- time.timeZone = secrets.timeZone;
- networking = {
- hostName = "JimNixServer";
-
- # Choose networking method
- dhcpcd.enable = true;
- wireless.enable = false;
-
- # Configure firewall
- firewall = {
- allowPing = false;
- allowedTCPPorts = [
- 80 443 # Nginx
- 25565 19132 5657 # Pufferpanel
- 2299 # Gitea SSH
- 3478 5349 # Coturn
- ];
- allowedTCPPortRanges = [
- { from = 8100; to = 8150; } # Azuracast
- ];
- allowedUDPPorts = [
- 25565 19132 # Minecraft Voicechat and Bedrock
- 3478 5349 # Coturn UDP
- ];
- allowedUDPPortRanges = [
- { from = 49000; to = 50000; } # Coturn range
- ];
-
- # Add extra input rules using nftables
- extraInputRules = ''
- ip saddr ${localSpan}.0/24 tcp dport 2049 accept comment "Accept NFS"
- ip saddr ${localSpan}.0/24 udp dport 53 accept comment "Accept DNS"
- ip saddr { ${pcIP}, ${secrets.lunaIP}, ${secrets.cornIP}, ${secrets.vertIP} } tcp dport { 1935, 1945 } accept comment "Accept RTMP"
- '';
- };
-
- # Enable nftables and forwarding
- nftables = {
- enable = true;
- tables = {
- forwarding = {
- family = "ip";
- content = ''
- chain PREROUTING {
- type nat hook prerouting priority dstnat; policy accept;
- tcp dport 2211 dnat to ${pcIP}:22 comment "SSH to PC"
- udp dport { 27005, 27015, 7777 } dnat to ${pcIP} comment "Games to PC"
-
- tcp dport { 58010, 57989, 57984 } dnat to ${pcIP} comment "Sunshine TCP to PC"
- udp dport { 57998, 57999, 58000 } dnat to ${pcIP} comment "Sunshine UDP to PC"
-
- tcp dport { 38010, 37989, 37984 } dnat to ${vmIP} comment "Sunshine TCP to VM"
- udp dport { 37998, 37999, 38000 } dnat to ${vmIP} comment "Sunshine UDP to VM"
-
- ip saddr ${secrets.cornIP} tcp dport { 9943, 9944 } dnat to ${vmIP} comment "ALVR TCP to VM"
- ip saddr ${secrets.cornIP} udp dport { 9943, 9944 } dnat to ${vmIP} comment "ALVR UDP to VM"
- }
- chain POSTROUTING {
- type nat hook postrouting priority 100; policy accept;
- oifname "${netInt}" masquerade
- }
- '';
- };
- };
- };
- };
-
- # Boot with compatibility for IP forwarding
- boot.kernel.sysctl."net.ipv4.ip_forward" = 1;
-
- # Enable AppArmor
- security.apparmor.enable = true;
-
- # Enable all manner of services
- services = {
- # SSH
- openssh = {
- enable = true;
- settings = {
- LogLevel = "VERBOSE";
- PermitRootLogin = "no";
- PrintLastLog = "no";
- PasswordAuthentication = false;
- };
- ports = [ 2222 ];
- };
-
- # Login attempt lockout
- fail2ban = {
- enable = true;
- maxretry = 5;
- bantime = "5m";
- ignoreIP = [ "${pcIP}" "${vmIP}" ];
- };
-
- # NFS server
- nfs.server = {
- enable = true;
- exports = ''
- /export/JimboNFS ${localSpan}.0/24(rw,no_subtree_check)
- '';
- };
-
- # DDClient for Dynamic IPs
- ddclient = {
- enable = true;
- protocol = "cloudflare";
- use = "web, web=https://ipinfo.io/ip";
- zone = "${secrets.jimDomain}";
- username = "token";
- passwordFile = "${pkgs.writeText "cloudflareapikey" secrets.flareApiKey}";
- domains = [
- "${secrets.jimDomain}"
- "*.${secrets.jimDomain}"
- "beta.${secrets.jimDomain}"
- "git.${secrets.jimDomain}"
- "john.${secrets.jimDomain}"
- "mc.${secrets.jimDomain}"
- "mx.${secrets.jimDomain}"
- "panel.${secrets.jimDomain}"
- "rtmp.${secrets.jimDomain}"
- ];
- };
-
- # Nginx reverse proxy
- nginx = {
- enable = true;
- package = (pkgs.nginx.override {
- modules = with pkgs.nginxModules; [ rtmp ];
- });
- recommendedTlsSettings = true;
- recommendedOptimisation = true;
- recommendedGzipSettings = true;
- recommendedProxySettings = true;
- virtualHosts = {
- # Homepage redirect
- "${secrets.jimDomain}" = {
- enableACME = true;
- addSSL = true;
- root = "/var/www/jimweb";
- locations = {
- "/.well-known/matrix/client" = {
- extraConfig = ''
- default_type application/json;
- return 200 '
- {
- "m.homeserver": {
- "base_url": "https://matrix.${secrets.jimDomain}"
- },
- "m.identity_server": {
- "base_url": "https://matrix.org"
- },
- "org.matrix.msc3575.proxy": {
- "url": "https://matrix.${secrets.jimDomain}"
- }
- }';
- '';
- };
- "/.well-known/matrix/server" = {
- extraConfig = ''
- default_type application/json;
- return 200 '{"m.server": "matrix.${secrets.jimDomain}:443"}';
- '';
- };
- };
- };
-
- # Nextcloud Proxy
- "cloud.${secrets.jimDomain}" = {
- enableACME = true;
- addSSL = true;
- locations."/" = {
- proxyWebsockets = true;
- extraConfig = "
- location /.well-known/carddav {
- return 301 $scheme://$host/remote.php/dav;
- }
- location /.well-known/caldav {
- return 301 $scheme://$host/remote.php/dav;
- }
- ";
- };
- };
-
- # Vaultwarden Proxy
- "warden.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- locations."/" = {
- proxyPass = "http://127.0.0.1:8222";
- proxyWebsockets = true;
- };
- };
-
- # Recipes Proxy
- "recipes.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- locations."/" = {
- proxyPass = "http://127.0.0.1:5030";
- proxyWebsockets = true;
- };
- };
-
- # Bluemap Proxy
- "bluemap.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- locations."/" = {
- proxyPass = "http://127.0.0.1:31010";
- proxyWebsockets = true;
- };
- };
-
- # Gitea Proxy
- "git.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- locations."/" = {
- proxyPass = "http://127.0.0.1:3110";
- proxyWebsockets = true;
- };
- };
-
- # Pufferpanel Proxy
- "panel.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- locations."/" = {
- proxyPass = "http://127.0.0.1:5010";
- proxyWebsockets = true;
- };
- };
-
- # Matrix Proxy
- "matrix.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- locations = {
- "/".extraConfig = ''return 403;'';
- "/client".proxyPass = "http://127.0.0.1:8009";
- "/_matrix".proxyPass = "http://127.0.0.1:8008";
- "/_matrix/client/unstable/org.matrix.msc3575/sync".proxyPass = "http://127.0.0.1:8009";
- "/_synapse/client".proxyPass = "http://127.0.0.1:8008";
- };
- };
-
- # Element Proxy
- "chat.${secrets.jimDomain}" = {
- enableACME = true;
- addSSL = true;
- root = "${pkgs.element-web}";
- };
-
- # Coturn Proxy
- "turn.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- listen = [
- { addr = "0.0.0.0"; port = 80; ssl = false; }
- ];
- locations."/".proxyPass = "http://127.0.0.1:1380";
- };
-
- # Radio Proxy
- "radio.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- locations."/" = {
- proxyPass = "http://127.0.0.1:255";
- proxyWebsockets = true;
- };
- };
-
- # Streaming proxy
- "live.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- locations."/" = {
- proxyPass = "http://127.0.0.1:8060";
- proxyWebsockets = true;
- };
- };
-
- # Mail certificate proxy
- "mx.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- locations."/" = {
- proxyPass = "http://127.0.0.1:1390";
- proxyWebsockets = true;
- };
- };
-
- # Add SSL to Lemmy
- "lemmy.${secrets.jimDomain}" = {
- enableACME = true;
- forceSSL = true;
- };
- };
- appendConfig = ''
- rtmp {
- server {
- listen 1935;
- chunk_size 4096;
- allow publish all;
- application stream {
- record off;
- live on;
- allow play all;
- hls on;
- hls_path /var/www/jimweb/streams/hls;
- hls_fragment_naming system;
- hls_fragment 3;
- hls_playlist_length 40;
- }
- }
- }
- '';
- };
-
- # Nextcloud server
- nextcloud = {
- enable = true;
- package = pkgs.nextcloud29;
- hostName = "cloud.${secrets.jimDomain}";
- datadir = "/mnt/nextcloud";
- https = true;
- config = {
- adminuser = "jimbo";
- adminpassFile = "/mnt/nextcloud/password.txt";
- };
- settings = {
- trusted_proxies = [ "127.0.0.1" ];
- trusted_domains = [ "cloud.${secrets.jimDomain}" ];
- overwriteprotocol = "https";
-
- # Mailserver settings
- mail_smtphost = "mx.${secrets.jimDomain}";
- mail_domain = "${secrets.jimDomain}";
- mail_from_address = "noreply";
- mail_smtpauth = "true";
- mail_smtpname = "noreply@${secrets.jimDomain}";
- mail_smtppassword = secrets.noreplyPassword;
- mail_smtpmode = "smtp";
- mail_smtpport = 587;
- };
- };
-
- # Vaultwarden password manager
- vaultwarden = {
- enable = true;
- config = {
- DOMAIN = "https://warden.${secrets.jimDomain}";
- SIGNUPS_ALLOWED = false;
- ROCKET_ADDRESS = "127.0.0.1";
- ROCKET_PORT = 8222;
- ROCKET_LOG = "critical";
-
- # Smtp email
- SMTP_HOST = "mx.${secrets.jimDomain}";
- SMTP_FROM = "Jimbo's Vaultwarden ";
- SMTP_FROM_NAME = "Vaultwarden";
- SMTP_USERNAME = "noreply@${secrets.jimDomain}";
- SMTP_PASSWORD = secrets.noreplyPassword;
- SMTP_SECURITY = "starttls";
- SMTP_PORT = 587;
- SMTP_TIMEOUT = 15;
- };
- };
-
- # Recipes
- tandoor-recipes = {
- enable = true;
- port = 5030;
- };
-
- # Gitea
- gitea = {
- enable = true;
- settings = {
- server = {
- DOMAIN = "git.${secrets.jimDomain}";
- ROOT_URL = "https://git.${secrets.jimDomain}:443";
- HTTP_PORT = 3110;
- SSH_PORT = 2299;
- START_SSH_SERVER = true;
- };
- mailer = {
- ENABLED = true;
- SMTP_ADDR = "mx.${secrets.jimDomain}";
- FROM = "Jimbo's Git ";
- USER = "noreply@${secrets.jimDomain}";
- PASSWD = secrets.noreplyPassword;
- PROTOCOL = "smtps";
- };
- service.REGISTER_EMAIL_CONFIRM = true;
- };
- };
-
- # Pufferpannel for Minecraft
- pufferpanel = {
- enable = true;
- environment = {
- PUFFER_WEB_HOST = ":5010";
- PUFFER_PANEL_SETTINGS_MASTERURL = "https://panel.${secrets.jimDomain}";
- PUFFER_PANEL_EMAIL_PROVIDER = "smtp";
- PUFFER_PANEL_EMAIL_HOST = "mx.${secrets.jimDomain}:587";
- PUFFER_PANEL_EMAIL_FROM = "noreply@${secrets.jimDomain}";
- PUFFER_PANEL_EMAIL_USERNAME = "noreply@${secrets.jimDomain}";
- PUFFER_PANEL_EMAIL_PASSWORD = secrets.noreplyPassword;
- };
- extraPackages = with pkgs; [ bash curl gawk gnutar gzip ];
- package = pkgs.buildFHSEnv {
- name = "pufferpanel-fhs";
- meta.mainProgram = "pufferpanel-fhs";
- runScript = lib.getExe pkgs.pufferpanel;
- targetPkgs = pkgs': with pkgs'; [ icu openssl zlib ];
- };
- };
-
-
- # MariaDB
- mysql = {
- enable = true;
- package = pkgs.mariadb;
- dataDir = "/var/lib/mysql";
- initialDatabases = [
- { name = "minecraft"; }
- ];
- ensureUsers = [
- {
- name = "minecraft";
- ensurePermissions = {
- "minecraft.*" = "ALL PRIVILEGES";
- };
- }
- ];
- };
-
- # Owncast
- owncast = {
- enable = true;
- port = 8060;
- rtmp-port = 1945;
- listen = "0.0.0.0";
- };
-
- # Coturn for VC
- coturn = rec {
- enable = true;
- no-cli = true;
- no-tcp-relay = true;
- min-port = 49000;
- max-port = 50000;
- use-auth-secret = true;
- realm = "turn.${secrets.jimDomain}";
- static-auth-secret = "will be world readable for local users :(";
- cert = "${config.security.acme.certs.${realm}.directory}/full.pem";
- pkey = "${config.security.acme.certs.${realm}.directory}/key.pem";
- };
-
- # Synapse for Matrix clients
- matrix-synapse = with config.services.coturn; {
- enable = true;
- settings = {
- server_name = "${secrets.jimDomain}";
- public_baseurl = "https://matrix.${secrets.jimDomain}";
- suppress_key_server_warning = true;
-
- # Set the network config
- listeners = [{
- # Client config
- port = 8008;
- bind_addresses = [ "::" "0.0.0.0" ];
- resources = [ { compress = false; names = [ "client" "federation" ]; } ];
- type = "http";
- tls = false;
- x_forwarded = true;
- }];
-
- # Enable smtp for password resets
- email = {
- notif_from = "Jimbo's Matrix ";
- smtp_host = "mx.${secrets.jimDomain}";
- smtp_user = "noreply@${secrets.jimDomain}";
- smtp_pass = secrets.noreplyPassword;
- enable_tls = true;
- smtp_port = 587;
- require_transport_security = true;
- };
-
- # Disable registration without email
- registrations_require_3pid = [ "email" ];
-
- # Allow only this range of emails
- allowed_local_3pids = [{
- medium = "email";
- pattern = "^[^@]+@jimbosfiles\\.com$";
- }];
-
- # Set the type of database
- database.name = "sqlite3";
-
- # Allow account registration
- enable_registration = true;
-
- # General settings
- url_preview_enabled = true;
- max_upload_size = "50M";
- report_stats = false;
-
- # Turn settings
- turn_uris = [
- "turn:${realm}:3478?transport=udp"
- "turn:${realm}:3478?transport=tcp"
- ];
- turn_shared_secret = static-auth-secret;
- turn_user_lifetime = "1h";
-
- # Ratelimiting
- burst_count = 15;
- };
- };
-
- # Sliding sync proxy for Matrix
- matrix-sliding-sync = let
- matrixSecretFile = pkgs.writeText "matrixsecret" ''
- SYNCV3_SECRET=${secrets.matrixSecret}
- '';
- in {
- enable = true;
- settings = {
- SYNCV3_SERVER = "https://matrix.${secrets.jimDomain}";
- SYNCV3_BINDADDR = "0.0.0.0:8009";
- };
- environmentFile = "${matrixSecretFile}";
- };
-
- # Mastodon
- mastodon = {
- enable = true;
- localDomain = "social.${secrets.jimDomain}";
- streamingProcesses = 4;
- configureNginx = true;
- smtp = {
- createLocally = false;
- host = "mx.${secrets.jimDomain}";
- port = 587;
- authenticate = true;
- fromAddress = "Jimbo's Mastodon ";
- user = "noreply@${secrets.jimDomain}";
- passwordFile = pkgs.writeText "smtp_pass.txt" secrets.noreplyPassword;
- };
- };
-
- # Lemmy forums
- lemmy = {
- enable = true;
- nginx.enable = true;
- database.createLocally = true;
- settings = {
- hostname = "lemmy.${secrets.jimDomain}";
- email = {
- smtp_server = "mx.${secrets.jimDomain}:587";
- smtp_login = "noreply@${secrets.jimDomain}";
- smtp_from_address = "Jimbo's Lemmy ";
- smtp_password = secrets.noreplyPassword;
- tls_type = "starttls";
- };
- };
- };
-
- # Roundcube mail server
- roundcube = {
- enable = true;
- hostName = "mail.${secrets.jimDomain}";
- extraConfig = ''
- $config['smtp_server'] = "tls://${config.mailserver.fqdn}";
- $config['smtp_user'] = "%u";
- $config['smtp_pass'] = "%p";
- '';
- };
-
- # Snowflake proxy for Tor
- snowflake-proxy.enable = true;
-
- # Fix a nonbuilding issue
- logrotate.checkConfig = false;
-
- # Force the mailserver to use a different redis port
- redis.servers.rspamd.port = 1515;
- };
-
- # Force Nginx to work and be able to read+write the hls path
- security.pam.services.nginx.setEnvironment = false;
- systemd.services.nginx.serviceConfig = {
- SupplementaryGroups = [ "shadow" ];
- ReadWritePaths = [ "/var/www/jimweb/streams/hls/" ];
- };
-
- # Get certificates for Coturn
- security.acme = {
- acceptTerms = true;
- defaults.email = secrets.jimEmail;
- certs = {
- ${config.services.coturn.realm} = {
- group = "turnserver";
- postRun = "systemctl restart coturn.service";
- };
- };
- };
-
- # Configure the Element web server
- nixpkgs.config.element-web.conf = {
- default_server_config = {
- "m.homeserver" = {
- base_url = "https://matrix.${secrets.jimDomain}";
- server_name = "matrix.${secrets.jimDomain}";
- };
- };
- branding = {
- #welcome_background_url = "https://staging.${secrets.jimDomain}/images/backgrounds/bloxelcom-sunset.jpg";
- #auth_header_logo_url = "https://staging.${secrets.jimDomain}/images/logos/bloxelcom.png";
- };
- embedded_pages = {
- home_url = "https://www.${secrets.jimDomain}/";
- };
- disable_custom_urls = true;
- disable_guests = true;
- default_theme = "dark";
- };
-
- # Enable Docker
- virtualisation.docker = {
- enable = true;
- daemon.settings.log-driver = "json-file";
- };
-
- # Mail server
- mailserver = rec {
- enable = true;
- enableManageSieve = true;
- domains = [ "${secrets.jimDomain}" ];
- fqdn = "mx.${secrets.jimDomain}";
- certificateScheme = "acme-nginx";
- localDnsResolver = false;
- redis.port = 1515;
-
- # A list of accounts.
- # Generate passwords with nix-shell -p mkpasswd --run 'mkpasswd -sm bcrypt'
- loginAccounts = {
- "noreply@${secrets.jimDomain}" = {
- hashedPasswordFile = pkgs.writeText "noreply" secrets.noreplyMailHash;
- sendOnly = true;
- };
- "jimbo@${secrets.jimDomain}" = {
- hashedPasswordFile = pkgs.writeText "jimbo" secrets.jimboMailHash;
- aliases = [ "canada@${secrets.jimDomain}" "contact@${secrets.jimDomain}" ];
- };
- "lunamoonlight@${secrets.jimDomain}" = {
- hashedPasswordFile = pkgs.writeText "luna" secrets.lunaMailHash;
- aliases = [ "us@${secrets.jimDomain}" "contact@${secrets.jimDomain}" ];
- };
- "freecorn1854@${secrets.jimDomain}" = {
- hashedPasswordFile = pkgs.writeText "freecorn" secrets.freecornMailHash;
- aliases = [ "canada@${secrets.jimDomain}" "contact@${secrets.jimDomain}" ];
- };
- "tinyattack09@${secrets.jimDomain}" = {
- hashedPasswordFile = pkgs.writeText "tiny" secrets.tinyMailHash;
- };
- };
- };
-
- # Determine the release version and allow auto-upgrades
- system.stateVersion = "23.11";
- system.autoUpgrade.enable = false;
-}
diff --git a/Server/hardware-configuration.nix b/Server/hardware-configuration.nix
deleted file mode 100644
index e3c3b26..0000000
--- a/Server/hardware-configuration.nix
+++ /dev/null
@@ -1,88 +0,0 @@
-{ config, lib, pkgs, modulesPath, ... }:
-
-{
- imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
-
- boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "nvme" "usbhid" "sd_mod" "sr_mod" ];
- boot.kernelModules = [ "kvm-intel" ];
-
- # Mounting options
- fileSystems = {
- "/" = {
- device = "/dev/disk/by-uuid/8f81cab7-9381-4950-b77f-b85c5fdbad16";
- fsType = "ext4";
- };
- "/boot" = {
- device = "/dev/disk/by-uuid/2034-754A";
- fsType = "vfat";
- };
- "/export/JimboNFS" = {
- device = "/dev/disk/by-uuid/713fcd92-534c-4153-8e04-e0c6fe5f6a51";
- fsType = "ext4";
- noCheck = true;
- };
- "/home/jimbo/JimboNFS" = {
- device = "/export/JimboNFS";
- fsType = "none";
- options = [ "bind" ];
- };
-
- # Atrocity of var bindmounts
- "/mnt/nextcloud/data/JimboNFS" = {
- device = "/export/JimboNFS";
- fsType = "none";
- options = [ "bind" ];
- };
- "/var/lib/bitwarden_rs" = {
- device = "/export/JimboNFS/System/var/lib/bitwarden_rs";
- fsType = "none";
- options = [ "bind" ];
- };
- "/var/lib/gitea" = {
- device = "/export/JimboNFS/System/var/lib/gitea";
- fsType = "none";
- options = [ "bind" ];
- };
- "/var/lib/matrix-synapse" = {
- device = "/export/JimboNFS/System/var/lib/matrix-synapse";
- fsType = "none";
- options = [ "bind" ];
- };
- "/var/lib/nextcloud" = {
- device = "/export/JimboNFS/System/var/lib/nextcloud";
- fsType = "none";
- options = [ "bind" ];
- };
- "/var/lib/owncast" = {
- device = "/export/JimboNFS/System/var/lib/owncast";
- fsType = "none";
- options = [ "bind" ];
- };
- "/var/lib/docker/volumes/azuracast_station_data/_data/jimbops/media/Music" = {
- device = "/export/JimboNFS/Music";
- fsType = "none";
- options = [ "bind" ];
- };
- "/var/lib/private/pufferpanel/servers" = {
- device = "/export/JimboNFS/System/var/lib/pufferpanel/servers";
- fsType = "none";
- options = [ "bind" ];
- };
- "/var/lib/mastodon" = {
- device = "/export/JimboNFS/System/var/lib/mastodon";
- fsType = "none";
- options = [ "bind" ];
- };
- };
- swapDevices = [
- { device = "/dev/disk/by-uuid/ec422cad-bf93-4b15-b989-2c807f1073a4"; }
- ];
-
- # Enables DHCP on each ethernet and wireless interface.
- networking.useDHCP = lib.mkDefault true;
-
- # Hardware settings
- nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
- hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
- boot.swraid.enable = true;
-}
diff --git a/Server/jimbo.nix b/Server/jimbo.nix
deleted file mode 100644
index e587728..0000000
--- a/Server/jimbo.nix
+++ /dev/null
@@ -1,544 +0,0 @@
-{ config, pkgs, options, ... }:
-let
- # Terminal authenticator
- auth = ''doas'';
-
- # Neofetch main config
- neoConf = ''
- {
- "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
- "logo": {
- "source": "xenia",
- "color": {
- "1": "1;97",
- "2": "red",
- "3": "yellow"
- }
- },
- "display": {
- "separator": " \u001b[33m ",
- "color": "red"
- },
- "modules": [
- {
- "type": "custom",
- "format": "\u001b[1m—————————————————————————————————————"
- },
- {
- "type": "host",
- "format": "{5} {2}",
- "key": " "
- },
- {
- "type": "cpu",
- "key": " "
- },
- {
- "type": "gpu",
- "key": " "
- },
- {
- "type": "disk",
- "folders": "/",
- "key": " "
- },
- {
- "type": "memory",
- "format": "{/1}{-}{/}{/2}{-}{/}{} / {}",
- "key": " "
- },
- {
- "type": "display",
- "compactType": "original",
- "key": " "
- },
-
- {
- "type": "custom",
- "format": "\u001b[1m—————————————————————————————————————"
- },
- {
- "type": "os",
- "format": "{3} {12}",
- "key": " "
- },
- {
- "type": "kernel",
- "format": "{1} {2}",
- "key": " "
- },
- {
- "type": "wm",
- "key": " "
- },
- {
- "type": "shell",
- "key": " "
- },
- {
- "type": "terminal",
- "key": " "
- },
- {
- "type": "packages",
- "key": " "
- },
- {
- "type": "uptime",
- "key": " "
- },
- {
- "type": "command",
- "text": "date -d @$(stat -c %W /) '+%a %b %d %r %Z %Y'",
- "key": " "
- },
- {
- "type": "custom",
- "format": "\u001b[1m—————————————————————————————————————"
- },
- {
- "type": "custom",
- "format": "\u001b[90m \u001b[31m \u001b[32m \u001b[33m \u001b[34m \u001b[35m \u001b[36m \u001b[37m"
- }
- ]
- }
- '';
-
- # Small Neofetch config
- pFetch = let
- smallConf = pkgs.writeText "smallconf.jsonc" ''
- {
- "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json",
- "logo": {
- "source": "debian_small"
- },
- "modules": [
- {
- "type": "os",
- "format": "{3} {12}",
- "key": " "
- },
- {
- "type": "host",
- "format": "{5}",
- "key": " "
- },
- {
- "type": "kernel",
- "format": "{1} {2}",
- "key": " "
- },
- {
- "type": "uptime",
- "key": " "
- },
- {
- "type": "packages",
- "key": " "
- },
- {
- "type": "memory",
- "format": "{/1}{-}{/}{/2}{-}{/}{} / {}",
- "key": " "
- }
- ]
- }
- '';
- in pkgs.writeScriptBin "pfetch"
- ''fastfetch --config ${smallConf}'';
-
- # Rofi (terminal file browser) config
- rangerConf = ''
- set preview_script ~/.config/ranger/scope.sh
- set preview_images true
- set preview_images_method kitty
- set dirname_in_tabs true
- set cd_tab_fuzzy true
- set autosave_bookmarks false
- set show_hidden true
- set wrap_scroll true
- set column_ratios 2,2,4
- set hidden_filter ^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$
- default_linemode devicons
- '';
-
- # Choose how ranger opens stuff
- rifleConf = ''
- # Define the "editor" for text files as first action
- mime ^text, label editor = nvim -- "$@"
- mime ^text, label pager = "$PAGER" -- "$@"
- !mime ^text, label editor, ext xml|json|csv|tex|py|pl|rb|js|sh|php = nvim -- "$@"
- !mime ^text, label pager, ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$PAGER" -- "$@"
-
- # Websites
- ext x?html?, has librewolf, X, flag f = librewolf -- "$@"
-
- # Define the "editor" for text files as first action
- mime ^text, label editor = "$EDITOR" -- "$@"
- mime ^text, label pager = "$PAGER" -- "$@"
- !mime ^text, label editor, ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$EDITOR" -- "$@"
- !mime ^text, label pager, ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$PAGER" -- "$@"
-
- # Misc files
- ext 1 = man "$1"
- ext exe = wine "$1"
- ext msi = wine "$1"
- name ^[mM]akefile$ = make
-
- # Scripts
- ext py = python -- "$1"
- ext pl = perl -- "$1"
- ext rb = ruby -- "$1"
- ext js = node -- "$1"
- ext sh = sh -- "$1"
- ext php = php -- "$1"
-
- # Audio and video
- mime ^audio|ogg$, terminal, has mpv = mpv --no-audio-display -- "$@"
- mime ^audio|ogg$, terminal, has mpv = mpv --shuffle --no-audio-display -- "$@"
- mime ^video, has mpv, X, flag f = mpv -- "$@"
- mime ^video, terminal, !X, has mpv = mpv -- "$@"
-
- # Documents
- ext pdf, has zathura, X, flag f = zathura -- "$@"
- ext pdf, has xpdf, X, flag f = xpdf -- "$@"
- ext pdf, has okular, X, flag f = okular -- "$@"
- ext pptx?|od[dfgpst]|docx?|sxc|xlsx?|xlt|xlw|gnm|gnumeric, has libreoffice, X, flag f = libreoffice "$@"
-
- # Images
- mime ^image, has imv, X, flag f = imv -- "$@"
-
- # Archives
- ext 7z, has 7z = 7z -p l "$@" | "$PAGER"
- ext 7z|ace|ar|arc|bz2?|cab|cpio|cpt|deb|dgc|dmg|gz, has 7z = 7z x -- "$@"
- ext iso|jar|pkg|rar|shar|tar|tgz|xar|xpi|xz|zip, has 7z = 7z x -- "$@"
-
- # Listing and extracting archives without atool:
- ext tar|gz|bz2|xz, has tar = tar vvtf "$1" | "$PAGER"
- ext tar|gz|bz2|xz, has tar = for file in "$@"; do tar vvxf "$file"; done
-
- # Fonts
- mime ^font, has fontforge, X, flag f = fontforge "$@"
-
- # Generic file openers
- label open, has xdg-open = xdg-open -- "$@"
-
- # Define the editor for non-text files + pager as last action
- !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = ask
- label editor, !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$EDITOR" -- "$@"
- label pager, !mime ^text, !ext xml|json|csv|tex|py|pl|rb|js|sh|php = "$PAGER" -- "$@"
-
- # Execute a file as program/script.
- mime application/x-executable = "$1"
- '';
-
- # Ranger's preview
- rangerScope = ''
- #!/usr/bin/env bash
- set -o noclobber -o noglob -o nounset -o pipefail
- IFS=$'\n'
-
- # Script arguments
- FILE_PATH="$1"
- PV_WIDTH="$2"
- PV_HEIGHT="$3"
- IMAGE_CACHE_PATH="$4"
- PV_IMAGE_ENABLED="$5"
-
- FILE_EXTENSION=$(echo "$FILE_PATH" | rev | cut -d. -f1 | rev)
- FILE_EXTENSION_LOWER=$(echo "$FILE_EXTENSION" | tr '[:upper:]' '[:lower:]')
-
- # Settings
- HIGHLIGHT_TABWIDTH=8
- HIGHLIGHT_STYLE='pablo'
- PYGMENTIZE_STYLE='autumn'
-
- handle_extension() {
- case "$FILE_EXTENSION_LOWER" in
- # Archive
- a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\
- rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip)
- atool --list -- "$FILE_PATH" && exit 5
- bsdtar --list --file "$FILE_PATH" && exit 5
- exit 1;;
- rar)
- unrar lt -p- -- "$FILE_PATH" && exit 5
- exit 1;;
- 7z)
- 7z l -p -- "$FILE_PATH" && exit 5
- exit 1;;
- pdf)
- pdftotext -l 10 -nopgbrk -q -- "$FILE_PATH" - && exit 5
- exiftool "$FILE_PATH" && exit 5
- exit 1;;
- torrent)
- transmission-show -- "$FILE_PATH" && exit 5
- exit 1;;
- # OpenDocument
- odt|ods|odp|sxw)
- odt2txt "$FILE_PATH" && exit 5
- exit 1;;
- esac
- }
-
- handle_image() {
- local mimetype="$1"
- case "$mimetype" in
- # SVG
- image/svg+xml)
- convert "$FILE_PATH" "$IMAGE_CACHE_PATH" && exit 6
- exit 1;;
- # Image
- image/*)
- local orientation
- orientation="$( identify -format '%[EXIF:Orientation]\n' -- "$FILE_PATH" )"
- if [[ -n "$orientation" && "$orientation" != 1 ]]; then
- convert -- "$FILE_PATH" -auto-orient "$IMAGE_CACHE_PATH" && exit 6
- fi
- exit 7;;
- # Video
- video/*)
- # Thumbnail
- ffmpegthumbnailer -i "$FILE_PATH" -o "$IMAGE_CACHE_PATH" -s 0 && exit 6
- exit 1;;
- # PDF
- application/pdf)
- pdftoppm -f 1 -l 1 \
- -scale-to-x 1920 \
- -scale-to-y -1 \
- -singlefile \
- -jpeg -tiffcompression jpeg \
- -- "$FILE_PATH" "$(basename "$IMAGE_CACHE_PATH")" \
- && exit 6 || exit 1;;
- esac
- }
-
- handle_mime() {
- local mimetype="$1"
- case "$mimetype" in
- # Text
- text/* | */xml)
- exit 2;;
- # Image
- image/*)
- exiftool "$FILE_PATH" && exit 5
- exit 1;;
- # Video and audio
- video/* | audio/*)
- mediainfo "$FILE_PATH" && exit 5
- exiftool "$FILE_PATH" && exit 5
- exit 1;;
- esac
- }
-
- MIMETYPE="$( file --dereference --brief --mime-type -- "$FILE_PATH" )"
- if [[ "$PV_IMAGE_ENABLED" == 'True' ]]; then
- handle_image "$MIMETYPE"
- fi
- handle_extension
- handle_mime "$MIMETYPE"
- handle_fallback
- exit 1
- '';
-
- # Ranger's bookmarks
- rangerBookmarks = ''
- # Local files
- k:/home/jimbo/Downloads
- c:/home/jimbo/.config
- L:/home/jimbo/.local
- D:/mnt
- n:/etc/nixos
-
- # Remote files
- a:/home/jimbo/JimboNFS
- K:/home/jimbo/JimboNFS/Downloads
- p:/home/jimbo/JimboNFS/Photos
- P:/home/jimbo/JimboNFS/Projects
- V:/home/jimbo/JimboNFS/Videos/Random
- m:/home/jimbo/JimboNFS/Music
- s:/home/jimbo/JimboNFS/School
- '';
-in
-
-{
- # Define home manager programs and configs
- home-manager = {
- useGlobalPkgs = true;
- useUserPackages = true;
- users.jimbo = { config, pkgs, ... }: {
- # Install user programs
- home.packages = (with pkgs; [
- fastfetch pFetch htop ranger tcptrack
- ]);
-
- # Install Neovim and plugins
- programs.neovim = {
- enable = true;
- defaultEditor = true;
- vimAlias = true;
- plugins = with pkgs.vimPlugins; [
- # Vim theme
- vim-airline vim-airline-themes
-
- # Internal clipboard
- vim-vsnip cmp-vsnip
-
- # Autocomplete manager
- lspkind-nvim
-
- # Autocomplete plugins
- cmp-nvim-lsp cmp-buffer cmp-path cmp-cmdline nvim-cmp
-
- # Hex color visualizer and color theme
- nvim-colorizer-lua vim-monokai-pro
- ];
- extraConfig = ''
- lua <'] = cmp.mapping.scroll_docs(-4),
- [''] = cmp.mapping.scroll_docs(4),
- [''] = cmp.mapping.complete(),
- [''] = cmp.mapping.abort(),
- [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
- }),
- sources = cmp.config.sources({
- { name = 'nvim_lsp' },
- { name = 'vsnip' }
- }, {
- { name = 'buffer' },
- })
- })
-
- -- Use buffer source for `/` and `?`.
- cmp.setup.cmdline({ '/', '?' }, {
- mapping = cmp.mapping.preset.cmdline(),
- sources = {
- { name = 'buffer' }
- }
- })
-
- -- Use cmdline & path source for ':'.
- cmp.setup.cmdline(':', {
- mapping = cmp.mapping.preset.cmdline(),
- sources = cmp.config.sources({
- { name = 'path' }
- }, {
- { name = 'cmdline' }
- })
- })
- EOF
-
- colorscheme monokai_pro
- let g:airline_theme='onedark'
- let g:airline#extensions#tabline#enabled = 1
- highlight Normal guibg=none ctermbg=235
- highlight Visual guibg=#151515 ctermbg=238
- highlight Pmenu guibg=#151515 ctermbg=238
- highlight EndOfBuffer guibg=none ctermbg=235
- highlight LineNr guibg=none ctermbg=none
- lua require'colorizer'.setup()
-
- set nu rnu
- set termguicolors
- set runtimepath+=/usr/share/vim/vimfiles
- set mouse=a
-
- set undofile
- set undodir=$HOME/.local/share/nvim/undo
- set undolevels=100
- set undoreload=10000
-
- nmap :bnext
- nmap :bprev
- '';
- };
-
- # Enable tmux
- programs.tmux = {
- enable = true;
- extraConfig = ''
- set -g mouse on
- set -g base-index 1
- set -g default-terminal "st-256color"
- set -g history-limit 4096
- set -g set-titles on
- set -g set-titles-string "#T"
- set -g status on
- set -g status-left ""
- set -g status-position bottom
- set -g status-right "#[bg=brightblack]#[fg=dark_purple] #T "
- set -g status-style "bg=black"
- setw -g pane-base-index 1
- setw -g window-status-format "#[bg=brightmagenta]#[fg=black] #I #[bg=brightblack]#[fg=white] #W "
- setw -g window-status-current-format "#[bg=brightmagenta]#[fg=black] #I #[bg=white]#[fg=black] #W "
- '';
- };
-
- # Start defining arbitrary files
- home.file = {
- # Fastfetch config
- ".config/fastfetch/config.jsonc".text = neoConf;
-
- # Ranger config
- ".config/ranger/rc.conf".text = rangerConf;
- ".config/ranger/rifle.conf".text = rifleConf;
- ".config/ranger/scope.sh" = { text = rangerScope; executable = true; };
- ".config/ranger/plugins/devicons/devicons.py".source = "${pkgs.fetchurl {
- url = "https://raw.githubusercontent.com/alexanderjeurissen/ranger_devicons/2c3c19dffb4238d01c74515c9eed5088066db243/devicons.py";
- sha256 = "0girsranwhsgc6kcyh1mkwymx0bl14a2k5nzk3kyllb6ic48c33k";
- }}";
- ".config/ranger/plugins/devicons/__init__.py".source = "${pkgs.fetchurl {
- url = "https://raw.githubusercontent.com/alexanderjeurissen/ranger_devicons/2c3c19dffb4238d01c74515c9eed5088066db243/__init__.py";
- sha256 = "1r086apw20ryxylqgnbynx7mzz779v1w0m40wghmmhlzw4x15fmr";
- }}";
- };
-
- # Shell aliases
- programs.zsh = {
- enable = true;
- autosuggestion.enable = true;
- syntaxHighlighting.enable = true;
- initExtra = ''
- ${pkgs.any-nix-shell}/bin/any-nix-shell zsh --info-right | source /dev/stdin; pfetch
- setopt HIST_IGNORE_SPACE
- setopt RM_STAR_WAIT
- '';
- oh-my-zsh = {
- enable = true;
- plugins = [ "git" ];
- theme = "half-life";
- };
- shellAliases = {
- # NixOS aliases
- nixcfg = "nvim /etc/nixos/{configuration,jimbo,secrets,hardware-configuration}.nix";
- nixswitch = "${auth} nixos-rebuild switch";
- nixdate = "${auth} nixos-rebuild switch --upgrade-all";
- nixclean = "${auth} nix-store --gc; nix-collect-garbage -d";
-
- # Shortcut aliases
- neo = "clear && fastfetch";
- ip = "ip -c";
- ls = "${pkgs.eza}/bin/eza -a --color=always --group-directories-first --icons";
- cat = "${pkgs.bat}/bin/bat --paging never";
-
- # Curl tools
- myip = "curl ifconfig.co";
- };
- };
-
- # Define current version
- home.stateVersion = "23.11";
- };
- };
-}