commit 26754cf3487efabeabcef76dd9e04f71206ef2df Author: Joseph DiGiovanni Date: Wed Jul 24 17:23:32 2024 -0400 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1c27cfc --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.jpg filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/custom-pkgs/adwaita-for-steam.nix b/custom-pkgs/adwaita-for-steam.nix new file mode 100644 index 0000000..3571853 --- /dev/null +++ b/custom-pkgs/adwaita-for-steam.nix @@ -0,0 +1,41 @@ +{ customCss ? null, extraOptions ? [ ], fetchFromGitHub, lib, python3, stdenvNoCC, ... }: + +let + customCssFlag = if customCss != null then "--custom-css" else ""; + extras = builtins.concatStringsSep " " (map (s: "-e ${s}") extraOptions); + importCustomCSS = if customCss != null then "cp -rf ${customCss} ./custom/custom.css" else "rm ./custom/custom.css"; +in +stdenvNoCC.mkDerivation rec { + name = "adwaita-for-steam"; + version = "2.3"; + + src = fetchFromGitHub { + owner = "tkashkin"; + repo = "Adwaita-for-Steam"; + rev = "v${version}"; + sha256 = "os02kpQ5ZkIWu+VZPgQ82wN2LWkbp3+GvGM3gI6/tGw="; + }; + + preferLocalBuild = true; + + nativeBuildInputs = [ python3 ]; + + buildPhase = '' + mkdir build + ${importCustomCSS} + python install.py --target ./build ${customCssFlag} ${extras} + find ./build -type f \( -name "README.md" -o -name ".gitignore" \) -delete # Remove unnecessary files + ''; + + installPhase = '' + mv build $out + ''; + + meta = with lib; { + description = "A skin to make Steam look like a native GTK application"; + homepage = "https://github.com/tkashkin/Adwaita-for-Steam"; + license = licenses.mit; + maintainers = with maintainers; [ jdigi78 ]; + mainProgram = "adwaita-for-steam"; + }; +} diff --git a/custom-pkgs/default.nix b/custom-pkgs/default.nix new file mode 100644 index 0000000..7c99290 --- /dev/null +++ b/custom-pkgs/default.nix @@ -0,0 +1,40 @@ +{ inputs, pkgs, system, ... }: + +let + customPkgs = final: prev: { + adwaita-for-steam = pkgs.callPackage ./adwaita-for-steam.nix { }; + + gnomeExtensions = prev.gnomeExtensions // { + rounded-window-corners-reborn = pkgs.callPackage ./gnomeExtensions/rounded-window-corners-reborn.nix { }; + }; + + gpu-screen-recorder = final.unstable.gpu-screen-recorder; + mkvextract-gtk = pkgs.callPackage ./mkvextract-gtk.nix { }; + }; + + unstableOverlay = final: prev: { + gdtoolkit_4 = final.unstable.gdtoolkit_4; + + gnomeExtensions = prev.gnomeExtensions // { + fullscreen-to-empty-workspace = final.unstable.gnomeExtensions.fullscreen-to-empty-workspace; # TODO: Remove when version 7 is in stable + hide-top-bar = final.unstable.gnomeExtensions.hide-top-bar; # TODO: Remove when version 117 is in stable + }; + + godot_4 = final.unstable.godot_4; + icoextract = final.unstable.icoextract; #TODO: remove in next release + proton-ge-bin = final.unstable.proton-ge-bin; + + unstable = import inputs.nixpkgs-unstable { + inherit (final) config system; + }; + }; +in +import inputs.nixpkgs { + config.allowUnfree = true; + inherit system; + overlays = [ + customPkgs + inputs.nix-vscode-extensions.overlays.default + unstableOverlay + ]; +} diff --git a/custom-pkgs/gnomeExtensions/rounded-window-corners-reborn.nix b/custom-pkgs/gnomeExtensions/rounded-window-corners-reborn.nix new file mode 100644 index 0000000..c1e7b10 --- /dev/null +++ b/custom-pkgs/gnomeExtensions/rounded-window-corners-reborn.nix @@ -0,0 +1,43 @@ +{ fetchgit, lib, nodejs, gettext, just, zip, unzip, libarchive, buildNpmPackage, glib }: + +buildNpmPackage { + pname = "rounded-window-corners-reborn"; + version = "latest"; + + src = fetchgit { + url = "https://github.com/flexagoon/rounded-window-corners"; + rev = "354fa8a97d7679e88df6bbb1aafef9255429abdf"; + hash = "sha256-HiN5xxdlzSLg+0muXeqt2beiHcF9A9P5WI4c6lzo0Ck="; + }; + + npmDepsHash = "sha256-2brE1GlzyHN9G/161aKiuHVVbjrpnN/0FBwuBDg/8W0="; + + nativeBuildInputs = [ + nodejs + gettext + just + zip + unzip + libarchive + glib + ]; + + buildPhase = '' + just pack + ''; + + installPhase = '' + mkdir -p $out/share/gnome-shell/extensions + install -d $out/share/gnome-shell/extensions/rounded-window-corners@fxgn + bsdtar -xvf "rounded-window-corners@fxgn.shell-extension.zip" -C "$out/share/gnome-shell/extensions/rounded-window-corners@fxgn" --no-same-owner + mv $out/share/gnome-shell/extensions/rounded-window-corners@fxgn/locale $out/share/ + install -Dm644 "$out/share/gnome-shell/extensions/rounded-window-corners@fxgn/schemas/org.gnome.shell.extensions.rounded-window-corners-reborn.gschema.xml" -t "$out/share/glib-2.0/schemas/" + ''; + + meta = with lib; { + description = "Rounded window corners reborn"; + license = with licenses; [ gpl3 ]; + maintainers = with maintainers; [ jdigi78 ]; + homepage = "https://github.com/flexagoon/rounded-window-corners"; + }; +} diff --git a/custom-pkgs/mkvextract-gtk.nix b/custom-pkgs/mkvextract-gtk.nix new file mode 100644 index 0000000..b4ab9a2 --- /dev/null +++ b/custom-pkgs/mkvextract-gtk.nix @@ -0,0 +1,43 @@ +{ boost, cmake, fetchgit, gtkmm3, lib, makeWrapper, mkvtoolnix-cli, pkg-config, stdenv }: + +stdenv.mkDerivation rec { + pname = "mkvextract-gtk"; + version = "0.9.6"; + + src = fetchgit { + url = "https://github.com/Joseph-DiGiovanni/mkvextract-gtk"; + rev = "refs/tags/${version}"; + hash = "sha256-rpCua6VQ2zOCvCMj9QUMhuq2nKYWJ81+U8KT1XTdnNA="; + }; + + nativeBuildInputs = [ + boost + cmake + gtkmm3 + makeWrapper + pkg-config + ]; + + configurePhase = '' + cmake . + ''; + + installPhase = '' + install -Dm755 mkvextract-gtk $out/bin/mkvextract-gtk + install -Dm644 desktop/mkvextract-gtk.desktop $out/share/applications/mkvextract-gtk.desktop + install -Dm644 desktop/mkvextract-gtk.png $out/share/icons/hicolor/256x256/apps/mkvextract-gtk.png + ''; + + postFixup = '' + wrapProgram $out/bin/mkvextract-gtk --set PATH ${lib.makeBinPath [ mkvtoolnix-cli ]} + ''; + + meta = with lib; { + description = "Extract tracks from matroska (mkv) files"; + homepage = "https://github.com/Joseph-DiGiovanni/mkvextract-gtk/"; + license = with licenses; [ gpl2 ]; + maintainers = with maintainers; [ jdigi78 ]; + platforms = platforms.unix; + mainProgram = "mkvextract-gtk"; + }; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..98ada3f --- /dev/null +++ b/flake.lock @@ -0,0 +1,425 @@ +{ + "nodes": { + "crane": { + "inputs": { + "nixpkgs": [ + "lanzaboote", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1717535930, + "narHash": "sha256-1hZ/txnbd/RmiBPNUs7i8UQw2N89uAK3UzrGAWdnFfU=", + "owner": "ipetkov", + "repo": "crane", + "rev": "55e7754ec31dac78980c8be45f8a28e80e370946", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", + "type": "github" + } + }, + "firefox-gnome-theme": { + "flake": false, + "locked": { + "lastModified": 1721276923, + "narHash": "sha256-HJKuwVvi+yGv+8n9Ez4EwaJA0B79JRss9J30vpgy/GI=", + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "rev": "cc70ec20e2775df7cd2bccdd20dcdecc3e0a733b", + "type": "github" + }, + "original": { + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_2": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "lanzaboote", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1717285511, + "narHash": "sha256-iKzJcpdXih14qYVcZ9QC9XuZYnPc6T8YImb6dX166kw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "2a55567fcf15b1b1c7ed712a2c6fadaec7412ea8", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1710146030, + "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "lanzaboote", + "pre-commit-hooks-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1720042825, + "narHash": "sha256-A0vrUB6x82/jvf17qPCpxaM+ulJnD8YZwH9Ci0BsAzE=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "e1391fb22e18a36f57e6999c7a9f966dc80ac073", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-24.05", + "repo": "home-manager", + "type": "github" + } + }, + "impermanence": { + "locked": { + "lastModified": 1719091691, + "narHash": "sha256-AxaLX5cBEcGtE02PeGsfscSb/fWMnyS7zMWBXQWDKbE=", + "owner": "nix-community", + "repo": "impermanence", + "rev": "23c1f06316b67cb5dabdfe2973da3785cfe9c34a", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "impermanence", + "type": "github" + } + }, + "lanzaboote": { + "inputs": { + "crane": "crane", + "flake-compat": "flake-compat", + "flake-parts": "flake-parts", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "pre-commit-hooks-nix": "pre-commit-hooks-nix", + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1718178907, + "narHash": "sha256-eSZyrQ9uoPB9iPQ8Y5H7gAmAgAvCw3InStmU3oEjqsE=", + "owner": "nix-community", + "repo": "lanzaboote", + "rev": "b627ccd97d0159214cee5c7db1412b75e4be6086", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "v0.4.1", + "repo": "lanzaboote", + "type": "github" + } + }, + "nix-flatpak": { + "locked": { + "lastModified": 1711997201, + "narHash": "sha256-J71xzQlVYsjagA4AsVwRazhBh2rZrPpKvxTgs6UzL7c=", + "owner": "gmodena", + "repo": "nix-flatpak", + "rev": "b76fa31346db7fc958a9898f3c594696ca71c4fd", + "type": "github" + }, + "original": { + "owner": "gmodena", + "ref": "v0.4.1", + "repo": "nix-flatpak", + "type": "github" + } + }, + "nix-vscode-extensions": { + "inputs": { + "flake-compat": "flake-compat_2", + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1721698116, + "narHash": "sha256-JdgX4TIroHxE4lBzZSyxxSvWGi8zveV34KfHuS9by2w=", + "owner": "nix-community", + "repo": "nix-vscode-extensions", + "rev": "7beca30ffc495e5e3980495e1179939abf0ab8a6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nix-vscode-extensions", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1717794163, + "narHash": "sha256-Ch6ZpFPVvi7Bb6gmmuufpTEFkXqa43pC94XMfU5FEt0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "121f68ed7c6c32de5a8ce91a08ef25713d1c4755", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1710695816, + "narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "614b4613980a522ba49f0d194531beddbb7220d3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1721562059, + "narHash": "sha256-Tybxt65eyOARf285hMHIJ2uul8SULjFZbT9ZaEeUnP8=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "68c9ed8bbed9dfce253cc91560bf9043297ef2fe", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1713805509, + "narHash": "sha256-YgSEan4CcrjivCNO5ZNzhg7/8ViLkZ4CB/GrGBVSudo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "1e1dc66fe68972a76679644a5577828b6a7e8be4", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1721548954, + "narHash": "sha256-7cCC8+Tdq1+3OPyc3+gVo9dzUNkNIQfwSDJ2HSi2u3o=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "63d37ccd2d178d54e7fb691d7ec76000740ea24a", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks-nix": { + "inputs": { + "flake-compat": [ + "lanzaboote", + "flake-compat" + ], + "gitignore": "gitignore", + "nixpkgs": [ + "lanzaboote", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1717664902, + "narHash": "sha256-7XfBuLULizXjXfBYy/VV+SpYMHreNRHk9nKMsm1bgb4=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "cc4d466cb1254af050ff7bdf47f6d404a7c646d1", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "firefox-gnome-theme": "firefox-gnome-theme", + "home-manager": "home-manager", + "impermanence": "impermanence", + "lanzaboote": "lanzaboote", + "nix-flatpak": "nix-flatpak", + "nix-vscode-extensions": "nix-vscode-extensions", + "nixpkgs": "nixpkgs_3", + "nixpkgs-unstable": "nixpkgs-unstable" + } + }, + "rust-overlay": { + "inputs": { + "flake-utils": [ + "lanzaboote", + "flake-utils" + ], + "nixpkgs": [ + "lanzaboote", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1717813066, + "narHash": "sha256-wqbRwq3i7g5EHIui0bIi84mdqZ/It1AXBSLJ5tafD28=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "6dc3e45fe4aee36efeed24d64fc68b1f989d5465", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..908556e --- /dev/null +++ b/flake.nix @@ -0,0 +1,52 @@ +{ + description = "Joey's NixOS configuration"; + + inputs = { + firefox-gnome-theme = { + flake = false; + url = "github:rafaelmardojai/firefox-gnome-theme"; + }; + + home-manager = { + inputs.nixpkgs.follows = "nixpkgs"; + url = "github:nix-community/home-manager/release-24.05"; + }; + + impermanence.url = "github:nix-community/impermanence"; + lanzaboote.url = "github:nix-community/lanzaboote/v0.4.1"; + nix-flatpak.url = "github:gmodena/nix-flatpak/v0.4.1"; + nix-vscode-extensions.url = "github:nix-community/nix-vscode-extensions"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; + nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; + }; + + outputs = inputs @ { self, ... }: + let + directories = rec { + commonHomeModule = homeModules + "/common"; + commonHostModule = hostModules + "/common"; + customModules = self + "/modules"; + customOptions = customModules + "/options"; + homeModules = self + "/home"; + hostModules = self + "/hosts"; + userModules = customModules + "/users"; + }; + + eachSystem = # Replacement for flake-utils.eachDefaultSystem + with inputs.nixpkgs.lib; + f: foldAttrs mergeAttrs { } ( + map (s: mapAttrs (_: v: { ${s} = v; }) (f s)) systems.flakeExposed + ); + in + eachSystem (system: + let + outputs = self.outputs // directories; + pkgs = import ./custom-pkgs { inherit inputs pkgs system; }; + in + { + packages = { + homeConfigurations = import ./home.nix { inherit inputs outputs pkgs; }; + nixosConfigurations = import ./nixos.nix { inherit inputs outputs pkgs system; }; + }; + }); +} diff --git a/home.nix b/home.nix new file mode 100644 index 0000000..c3e07c5 --- /dev/null +++ b/home.nix @@ -0,0 +1,22 @@ +{ inputs, outputs, pkgs, ... }: + +with inputs.home-manager.lib; + +let + mkHome = builtins.mapAttrs (host: extraModules: + homeManagerConfiguration { + inherit pkgs; + + extraSpecialArgs = { inherit inputs outputs; }; + + modules = [ + (outputs.homeModules + "/" + username) + outputs.commonHomeModule + inputs.nix-flatpak.homeManagerModules.nix-flatpak + ] ++ extraModules; + }); +in +mkHome { + "jdigi" = [ ]; + "jdigi@Joe-Desktop" = [ (outputs.hostModules + "Joe-Desktop/home-manager") ]; +} diff --git a/home/common/bash.nix b/home/common/bash.nix new file mode 100644 index 0000000..81f5ca0 --- /dev/null +++ b/home/common/bash.nix @@ -0,0 +1,16 @@ +{ lib, osConfig ? null, ... }: + +let + isNixOS = osConfig != null; +in +{ + programs.bash = { + enable = true; + + shellAliases = { + home-update = lib.mkIf (!isNixOS) "home-manager switch --flake $HOME/Nix/"; + update = lib.mkIf isNixOS "sudo nixos-rebuild switch --flake $HOME/Nix/"; + update-boot = lib.mkIf isNixOS "sudo nixos-rebuild boot --flake $HOME/Nix/"; + }; + }; +} diff --git a/home/common/default.nix b/home/common/default.nix new file mode 100644 index 0000000..0608b94 --- /dev/null +++ b/home/common/default.nix @@ -0,0 +1,22 @@ +{ ... }: + +{ + imports = [ + ./bash.nix + ./firefox.nix + ./git.nix + ./gnome + ./packages.nix + ]; + + home = { + file."Pictures/Wallpapers" = { + recursive = true; + source = ./wallpapers; + }; + stateVersion = "23.11"; # DO NOT CHANGE AFTER INSTALL + }; + + programs.home-manager.enable = true; # Let Home Manager install and manage itself. +} + diff --git a/home/common/firefox.nix b/home/common/firefox.nix new file mode 100644 index 0000000..ad76106 --- /dev/null +++ b/home/common/firefox.nix @@ -0,0 +1,103 @@ +{ config, pkgs, ... }: + +let + generateLatestSourceURL = name: "https://addons.mozilla.org/firefox/downloads/latest/${name}/latest.xpi"; +in +{ + programs.firefox = { + enable = true; + + policies = { + DisableAccounts = true; + DisableFirefoxAccounts = true; + DisableFirefoxScreenshots = true; + DisableFirefoxStudies = true; + DisablePocket = true; + DisableTelemetry = true; + DisplayBookmarksToolbar = "never"; + EnableTrackingProtection = { + Cryptomining = true; + Fingerprinting = true; + Locked = true; + Value = true; + }; + ExtensionSettings = { + "{446900e4-71c2-419f-a6a7-df9c091e268b}" = { + default_area = "navbar"; + install_url = generateLatestSourceURL "bitwarden-password-manager"; + installation_mode = "force_installed"; + }; + "simple-tab-groups@drive4ik" = { + default_area = "navbar"; + install_url = generateLatestSourceURL "simple-tab-groups"; + installation_mode = "force_installed"; + }; + "uBlock0@raymondhill.net" = { + default_area = "menupanel"; + install_url = generateLatestSourceURL "ublock-origin"; + installation_mode = "force_installed"; + }; + }; + Homepage = { + StartPage = "previous-session"; + }; + NoDefaultBookmarks = true; + OfferToSaveLogins = false; + OverrideFirstRunPage = ""; + OverridePostUpdatePage = ""; + Preferences = { + "browser.newtabpage.activity-stream.showSponsored" = false; + "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; + "browser.newtabpage.activity-stream.system.showSponsored" = false; + "browser.newtabpage.pinned" = ""; + "browser.topsites.contile.enabled" = false; + }; + }; + + profiles.${config.home.username} = { + id = 0; + isDefault = true; + search = { + default = "PrivateSearch"; + engines = { + "NixOS Options" = { + urls = [{ + template = "https://search.nixos.org/options?query={searchTerms}"; + }]; + + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = [ "@nixos" ]; + }; + + "Nix Packages" = { + urls = [{ + template = "https://search.nixos.org/packages?query={searchTerms}"; + }]; + + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = [ "@nixpkgs" ]; + }; + + "OpenStreetMap" = { + urls = [{ + template = "https://www.openstreetmap.org/search?query={searchTerms}"; + }]; + + iconUpdateURL = "https://www.openstreetmap.org/favicon.ico"; + definedAliases = [ "@openstreetmap" "@osm" ]; + }; + + "PrivateSearch" = { + urls = [{ + template = "https://privatesearch.app/search?q={searchTerms}"; + }]; + + iconUpdateURL = "https://privatesearch.app/static/themes/simple/img/favicon.svg"; + definedAliases = [ "@privatesearch" ]; + }; + }; + force = true; # Required to prevent search engine symlink being overwritten. See https://github.com/nix-community/home-manager/issues/3698 + }; + }; + }; +} diff --git a/home/common/git.nix b/home/common/git.nix new file mode 100644 index 0000000..086d86b --- /dev/null +++ b/home/common/git.nix @@ -0,0 +1,13 @@ +{ ... }: + +{ + programs.git = { + enable = true; + + extraConfig = { + init.defaultBranch = "main"; + }; + + lfs.enable = true; + }; +} diff --git a/home/common/gnome/default.nix b/home/common/gnome/default.nix new file mode 100644 index 0000000..998df3d --- /dev/null +++ b/home/common/gnome/default.nix @@ -0,0 +1,66 @@ +{ config, lib, ... }: + +{ + imports = [ + ./outline-theme + ./extensions + ./firefox-gnome-theme.nix + ./steam-adwaita-theme.nix + ]; + + dconf.settings = { + "org/gnome/Console".theme = "auto"; + + "org/gnome/desktop/background" = { + picture-uri = "file:///home/${config.home.username}/Pictures/Wallpapers/Light.jpg"; + picture-uri-dark = "file:///home/${config.home.username}/Pictures/Wallpapers/Dark.jpg"; + }; + + "org/gnome/desktop/datetime".automatic-timezone = false; # TODO: Auto timezone not working since mozilla location service shutdown + + "org/gnome/desktop/interface" = { + clock-format = "12h"; + show-battery-percentage = true; + enable-hot-corners = false; + }; + + "org/gnome/desktop/peripherals/mouse".accel-profile = "flat"; + + "org/gnome/mutter" = { + dynamic-workspaces = true; + edge-tiling = true; + experimental-features = [ + "scale-monitor-framebuffer" + "variable-refresh-rate" # TODO: May not be needed in gnome 47 + ]; + }; + + "org/gnome/settings-daemon/plugins/color" = { + night-light-enabled = true; + night-light-schedule-automatic = false; + night-light-schedule-from = 22.0; + night-light-schedule-to = 6.0; + night-light-temperature = lib.hm.gvariant.mkUint32 4500; + }; + + "org/gnome/settings-daemon/plugins/power" = { + sleep-inactive-ac-timeout = 1800; + sleep-inactive-ac-type = "suspend"; + sleep-inactive-battery-timeout = 900; + sleep-inactive-battery-timeout-ac = 1800; + sleep-inactive-battery-type = "suspend"; + }; + + "org/gnome/shell" = { + favorite-apps = [ + "firefox.desktop" + "org.gnome.Nautilus.desktop" + "org.gnome.Console.desktop" + ]; + }; + + "org/gnome/shell/weather".automatic-location = true; + "org/gnome/system/location".enabled = true; + "org/gtk/settings/file-chooser".clock-format = "12h"; + }; +} diff --git a/home/common/gnome/extensions/alphabetical-app-grid.nix b/home/common/gnome/extensions/alphabetical-app-grid.nix new file mode 100644 index 0000000..04480ed --- /dev/null +++ b/home/common/gnome/extensions/alphabetical-app-grid.nix @@ -0,0 +1,9 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "AlphabeticalAppGrid@stuarthayhurst" ]; + }; + + home.packages = with pkgs; [ gnomeExtensions.alphabetical-app-grid ]; +} diff --git a/home/common/gnome/extensions/bluetooth-battery-meter.nix b/home/common/gnome/extensions/bluetooth-battery-meter.nix new file mode 100644 index 0000000..6349d7f --- /dev/null +++ b/home/common/gnome/extensions/bluetooth-battery-meter.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "Bluetooth-Battery-Meter@maniacx.github.com" ]; + "org/gnome/shell/extensions/Bluetooth-Battery-Meter".enable-battery-level-text = true; + }; + + home.packages = with pkgs; [ gnomeExtensions.bluetooth-battery-meter ]; +} diff --git a/home/common/gnome/extensions/bottom-overview.nix b/home/common/gnome/extensions/bottom-overview.nix new file mode 100644 index 0000000..8f6c106 --- /dev/null +++ b/home/common/gnome/extensions/bottom-overview.nix @@ -0,0 +1,9 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "bottom-overview@fthx" ]; + }; + + home.packages = with pkgs; [ gnomeExtensions.bottom-overview ]; +} diff --git a/home/common/gnome/extensions/compiz-windows-effect.nix b/home/common/gnome/extensions/compiz-windows-effect.nix new file mode 100644 index 0000000..8a6bfd1 --- /dev/null +++ b/home/common/gnome/extensions/compiz-windows-effect.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "compiz-windows-effect@hermes83.github.com" ]; + + "org/gnome/shell/extensions/com/github/hermes83/compiz-windows-effect" = { + friction = 3.5; + mass = 80.0; + maximize-effect = false; + resize-effect = false; + speedup-factor-divider = 7.0; + spring-k = 10.0; + }; + }; + + home.packages = with pkgs; [ gnomeExtensions.compiz-windows-effect ]; +} diff --git a/home/common/gnome/extensions/dash-to-dock.nix b/home/common/gnome/extensions/dash-to-dock.nix new file mode 100644 index 0000000..938985d --- /dev/null +++ b/home/common/gnome/extensions/dash-to-dock.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "dash-to-dock@micxgx.gmail.com" ]; + + "org/gnome/shell/extensions/dash-to-dock" = { + dash-max-icon-size = 64; + disable-overview-on-startup = true; + running-indicator-style = "DOTS"; + scroll-action = "cycle-windows"; + show-trash = false; + transparency-mode = "DYNAMIC"; + }; + }; + + home.packages = with pkgs; [ gnomeExtensions.dash-to-dock ]; +} diff --git a/home/common/gnome/extensions/default.nix b/home/common/gnome/extensions/default.nix new file mode 100644 index 0000000..ba8fe75 --- /dev/null +++ b/home/common/gnome/extensions/default.nix @@ -0,0 +1,26 @@ +{ ... }: + +{ + imports = [ + ./alphabetical-app-grid.nix + ./bluetooth-battery-meter.nix + ./bottom-overview.nix + #./compiz-windows-effect.nix # Conflicts with outline theme + #./dash-to-dock.nix # Replaced by bottom-overview + ./fullscreen-to-empty-workspace.nix + ./gnome-rounded-corners.nix + ./grand-theft-focus.nix + ./gsconnect.nix + ./night-theme-switcher.nix + ./quick-settings-audio-devices-hider.nix + ./quick-settings-audio-devices-renamer.nix + ]; + + dconf.settings = { + "org/gnome/shell" = { + disable-user-extensions = false; + disabled-extensions = [ ]; + enabled-extensions = [ "light-style@gnome-shell-extensions.gcampax.github.com" ]; + }; + }; +} diff --git a/home/common/gnome/extensions/fullscreen-to-empty-workspace.nix b/home/common/gnome/extensions/fullscreen-to-empty-workspace.nix new file mode 100644 index 0000000..1946728 --- /dev/null +++ b/home/common/gnome/extensions/fullscreen-to-empty-workspace.nix @@ -0,0 +1,9 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "fullscreen-to-empty-workspace@aiono.dev" ]; + }; + + home.packages = with pkgs; [ gnomeExtensions.fullscreen-to-empty-workspace ]; +} diff --git a/home/common/gnome/extensions/gnome-rounded-corners.nix b/home/common/gnome/extensions/gnome-rounded-corners.nix new file mode 100644 index 0000000..c44bbc1 --- /dev/null +++ b/home/common/gnome/extensions/gnome-rounded-corners.nix @@ -0,0 +1,9 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "Rounded_Corners@lennart-k" ]; + }; + + home.packages = with pkgs; [ gnomeExtensions.rounded-corners ]; +} diff --git a/home/common/gnome/extensions/grand-theft-focus.nix b/home/common/gnome/extensions/grand-theft-focus.nix new file mode 100644 index 0000000..51db3ba --- /dev/null +++ b/home/common/gnome/extensions/grand-theft-focus.nix @@ -0,0 +1,9 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "grand-theft-focus@zalckos.github.com" ]; + }; + + home.packages = with pkgs; [ gnomeExtensions.grand-theft-focus ]; +} diff --git a/home/common/gnome/extensions/gsconnect.nix b/home/common/gnome/extensions/gsconnect.nix new file mode 100644 index 0000000..2bb61d5 --- /dev/null +++ b/home/common/gnome/extensions/gsconnect.nix @@ -0,0 +1,9 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "gsconnect@andyholmes.github.io" ]; + }; + + home.packages = with pkgs; [ gnomeExtensions.gsconnect ]; +} diff --git a/home/common/gnome/extensions/night-theme-switcher.nix b/home/common/gnome/extensions/night-theme-switcher.nix new file mode 100644 index 0000000..0d21966 --- /dev/null +++ b/home/common/gnome/extensions/night-theme-switcher.nix @@ -0,0 +1,24 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "nightthemeswitcher@romainvigier.fr" ]; + + "org/gnome/shell/extensions/nightthemeswitcher/commands" = { + enabled = true; + sunrise = "gsettings set org.gnome.desktop.interface gtk-theme Adwaita"; + sunset = "gsettings set org.gnome.desktop.interface gtk-theme Adwaita-dark"; + }; + + "org/gnome/shell/extensions/nightthemeswitcher/time" = { + sunrise = 7; + sunset = 19; + manual-schedule = true; + }; + }; + + home.packages = with pkgs; [ + gnome.gnome-themes-extra # For Adwaita-dark + gnomeExtensions.night-theme-switcher + ]; +} diff --git a/home/common/gnome/extensions/quick-settings-audio-devices-hider.nix b/home/common/gnome/extensions/quick-settings-audio-devices-hider.nix new file mode 100644 index 0000000..b6df220 --- /dev/null +++ b/home/common/gnome/extensions/quick-settings-audio-devices-hider.nix @@ -0,0 +1,22 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "quicksettings-audio-devices-hider@marcinjahn.com" ]; + + "org/gnome/shell/extensions/quicksettings-audio-devices-hider" = { + excluded-input-names = [ + "Digital Input (S/PDIF) – AC511 Sound Bar" + "Digital Input (S/PDIF) – CMU-BC1 Multifunction Device" + "Line In – AC511 Sound Bar" + ]; + + excluded-output-names = [ + "Digital Output (S/PDIF) – AC511 Sound Bar" + "Digital Output (S/PDIF) – Qudelix-5K USB DAC 96KHz" + ]; + }; + }; + + home.packages = with pkgs; [ gnomeExtensions.quick-settings-audio-devices-hider ]; +} diff --git a/home/common/gnome/extensions/quick-settings-audio-devices-renamer.nix b/home/common/gnome/extensions/quick-settings-audio-devices-renamer.nix new file mode 100644 index 0000000..304dc8a --- /dev/null +++ b/home/common/gnome/extensions/quick-settings-audio-devices-renamer.nix @@ -0,0 +1,44 @@ +{ lib, pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "quicksettings-audio-devices-renamer@marcinjahn.com" ]; + + "org/gnome/shell/extensions/quicksettings-audio-devices-renamer" = with lib.hm.gvariant; { + input-names-map = [ + (mkDictionaryEntry [ + "Handsfree – Joseph's Pixel Buds Pro" + "Joseph's Pixel Buds Pro" + ]) + + (mkDictionaryEntry [ + "Microphone – Antlion Wireless Microphone" + "ModMic Wireless" + ]) + + (mkDictionaryEntry [ + "Analog Input – CMU-BC1 Multifunction Device" + "Sony Webcam" + ]) + ]; + output-names-map = [ + (mkDictionaryEntry [ + "Analog Output – AC511 Sound Bar" + "Sound Bar" + ]) + + (mkDictionaryEntry [ + "Analog Output – Qudelix-5K USB DAC 96KHz" + "Qudelix-5K USB DAC" + ]) + + (mkDictionaryEntry [ + "Headset – Joseph's Pixel Buds Pro" + "Joseph's Pixel Buds Pro" + ]) + ]; + }; + }; + + home.packages = with pkgs; [ gnomeExtensions.quick-settings-audio-devices-renamer ]; +} diff --git a/home/common/gnome/firefox-gnome-theme.nix b/home/common/gnome/firefox-gnome-theme.nix new file mode 100644 index 0000000..e0263a4 --- /dev/null +++ b/home/common/gnome/firefox-gnome-theme.nix @@ -0,0 +1,32 @@ +{ config, inputs, ... }: + +{ + home.file."firefox-gnome-theme" = { + source = inputs.firefox-gnome-theme; + target = ".mozilla/firefox/${config.home.username}/chrome/firefox-gnome-theme"; + }; + + programs.firefox = { + enable = true; + + profiles.${config.home.username} = { + + settings = { + "browser.tabs.drawInTitlebar" = true; + "browser.theme.dark-private-windows" = false; + "browser.uidensity" = 0; + "browser.uiCustomization.state" = '' + {"placements":{"widget-overflow-fixed-list":[],"nav-bar":["back-button","forward-button","stop-reload-button","new-tab-button","customizableui-special-spring1","urlbar-container","customizableui-special-spring2","save-to-pocket-button","downloads-button","fxa-toolbar-menu-button","unified-extensions-button","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","simple-tab-groups_drive4ik-browser-action"],"toolbar-menubar":["menubar-items"],"TabsToolbar":["tabbrowser-tabs","alltabs-button"],"PersonalToolbar":["import-button","personal-bookmarks"]},"seen":["addon_darkreader_org-browser-action","developer-button","_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action","simple-tab-groups_drive4ik-browser-action","ublock0_raymondhill_net-browser-action"],"dirtyAreaCache":["nav-bar","unified-extensions-area","PersonalToolbar","TabsToolbar","toolbar-menubar"],"currentVersion":20,"newElementCount":4} + ''; + "svg.context-properties.content.enabled" = true; + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; + }; + userChrome = '' + @import "firefox-gnome-theme/userChrome.css"; + ''; + userContent = '' + @import "firefox-gnome-theme/userContent.css"; + ''; + }; + }; +} diff --git a/home/common/gnome/outline-theme/default.nix b/home/common/gnome/outline-theme/default.nix new file mode 100644 index 0000000..2317b17 --- /dev/null +++ b/home/common/gnome/outline-theme/default.nix @@ -0,0 +1,18 @@ +{ ... }: + +{ + imports = [ + ./rounded-window-corners-reborn.nix + ]; + + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "user-theme@gnome-shell-extensions.gcampax.github.com" ]; + + "org/gnome/shell/extensions/user-theme".name = "Outline Theme"; + }; + + home.file.".local/share/themes/Outline Theme" = { + recursive = true; + source = ./theme-files; + }; +} diff --git a/home/common/gnome/outline-theme/rounded-window-corners-reborn.nix b/home/common/gnome/outline-theme/rounded-window-corners-reborn.nix new file mode 100644 index 0000000..b3d7d71 --- /dev/null +++ b/home/common/gnome/outline-theme/rounded-window-corners-reborn.nix @@ -0,0 +1,16 @@ +{ lib, pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "rounded-window-corners@fxgn" ]; + + "org/gnome/shell/extensions/rounded-window-corners-reborn" = with lib.hm.gvariant; { + border-color = mkTuple [ 0.0 0.0 0.0 1.0 ]; + border-width = 3; + skip-libadwaita-app = false; + skip-libhandy-app = false; + }; + }; + + home.packages = with pkgs; [ gnomeExtensions.rounded-window-corners-reborn ]; +} diff --git a/home/common/gnome/outline-theme/theme-files/gnome-shell/gnome-shell.css b/home/common/gnome/outline-theme/theme-files/gnome-shell/gnome-shell.css new file mode 100644 index 0000000..37d687c --- /dev/null +++ b/home/common/gnome/outline-theme/theme-files/gnome-shell/gnome-shell.css @@ -0,0 +1,7 @@ +#panel { + outline: 3px solid black; +} + +.quick-settings, .quick-toggle-menu, .quick-toggle-menu, .search-entry, .dash-background, .osd-window, .search-section-content, .tile-preview, #keyboard, .keyboard-key, .window-close, .notification-banner, .app-folder:selected:active , .screenshot-ui-close-button, .screenshot-ui-panel, .prompt-dialog, .modal-dialog, .popup-menu-content { + border: 3px solid black; +} diff --git a/home/common/gnome/steam-adwaita-theme.nix b/home/common/gnome/steam-adwaita-theme.nix new file mode 100644 index 0000000..40ebf45 --- /dev/null +++ b/home/common/gnome/steam-adwaita-theme.nix @@ -0,0 +1,48 @@ +{ pkgs, ... }: + +{ + home.file.".local/share/Steam" = { + source = pkgs.adwaita-for-steam.override { + extraOptions = [ + "library/hide_whats_new" + ]; + }; + recursive = true; + }; + + systemd.user = { + services."adwaita-for-steam-css-patcher" = { + Unit = { + Description = "Adwaita for Steam CSS Patcher"; + }; + Install = { + WantedBy = [ "default.target" ]; + }; + Service = { + ExecStart = pkgs.writeShellScript "adwaita-for-steam-css-patcher" '' + cd ~/.local/share/Steam/steamui/css/ + + if ! test -f "library.css"; then + echo "Steam library.css not found, make sure that you have succesfully executed Steam once!" + exit 1; + fi + + if ! ${pkgs.gnugrep}/bin/grep -Fxq "/*patched*/" library.css; then + echo "Patching steam library..." + ${pkgs.coreutils}/bin/mv library.css library.original.css + ${pkgs.coreutils}/bin/touch library.css + echo "/*patched*/ + @import url("https://steamloopback.host/css/library.original.css"); + @import url("https://steamloopback.host/libraryroot.custom.css");" >> library.css + + # Pad new library file until it has the same size as the original + ${pkgs.coreutils}/bin/truncate -r library.original.css library.css + echo "Done." + else + echo "Steam library is already patched, nothing to do." + fi + ''; + }; + }; + }; +} diff --git a/home/common/packages.nix b/home/common/packages.nix new file mode 100644 index 0000000..38c932a --- /dev/null +++ b/home/common/packages.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ + f3d # 3D model thumbnailer and viewer + localsend + nufraw-thumbnailer # RAW image thumbnailer + icoextract # Windows executable thumbnailer + ]; +} diff --git a/home/common/wallpapers/Dark.jpg b/home/common/wallpapers/Dark.jpg new file mode 100644 index 0000000..d9de0d1 --- /dev/null +++ b/home/common/wallpapers/Dark.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a2f6ac7c8dd1c42bcb80283582c8635e34310ddb9255a436357b4b82dae86e9 +size 1630905 diff --git a/home/common/wallpapers/Light.jpg b/home/common/wallpapers/Light.jpg new file mode 100644 index 0000000..03a9553 --- /dev/null +++ b/home/common/wallpapers/Light.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537966e6804809f277f3cc5580717f2cda9f9d6629959982d85410e637e7a662 +size 821533 diff --git a/home/jdigi/default.nix b/home/jdigi/default.nix new file mode 100644 index 0000000..545bd23 --- /dev/null +++ b/home/jdigi/default.nix @@ -0,0 +1,15 @@ +{ ... }: + +{ + imports = [ + ./firefox.nix + ./gnome + ./packages.nix + ./vscode + ]; + + programs.git = { + userName = "Joseph DiGiovanni"; + userEmail = "jdigiovanni78@gmail.com"; + }; +} diff --git a/home/jdigi/firefox.nix b/home/jdigi/firefox.nix new file mode 100644 index 0000000..117864d --- /dev/null +++ b/home/jdigi/firefox.nix @@ -0,0 +1,14 @@ +{ ... }: + +let + latestSourceURL = name: "https://addons.mozilla.org/firefox/downloads/latest/${name}/latest.xpi"; +in +{ + programs.firefox.policies.ExtensionSettings = { + "addon@darkreader.org" = { + default_area = "menupanel"; + install_url = latestSourceURL "darkreader"; + installation_mode = "force_installed"; + }; + }; +} diff --git a/home/jdigi/gnome/default.nix b/home/jdigi/gnome/default.nix new file mode 100644 index 0000000..be90f8a --- /dev/null +++ b/home/jdigi/gnome/default.nix @@ -0,0 +1,40 @@ +{ lib, ... }: + +{ + imports = [ + ./extensions + ./keyboard-shortcuts.nix + ]; + + dconf.settings = { + "org/gnome/desktop/peripherals/mouse".natural-scroll = true; + + "org/gnome/desktop/privacy" = { + old-files-age = lib.hm.gvariant.mkUint32 30; + remember-recent-files = false; + remove-old-temp-files = true; + remove-old-trash-files = true; + }; + + "org/gnome/nautilus/preferences".click-policy = "single"; + + "org/gnome/shell" = { + favorite-apps = lib.mkForce [ + "firefox.desktop" + "youtube-music.desktop" + "code.desktop" + "org.godotengine.Godot4.desktop" + "steam.desktop" + "element-desktop.desktop" + "discord.desktop" + "org.gnome.Nautilus.desktop" + "org.gnome.Console.desktop" + ]; + }; + + "org/gnome/TextEditor".restore-session = false; + + "org/gtk/gtk4/settings/file-chooser".show-hidden = true; + "org/gtk/settings/file-chooser".show-hidden = false; + }; +} diff --git a/home/jdigi/gnome/extensions/default.nix b/home/jdigi/gnome/extensions/default.nix new file mode 100644 index 0000000..496ac5d --- /dev/null +++ b/home/jdigi/gnome/extensions/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + imports = [ + ./memento-mori.nix + ]; +} diff --git a/home/jdigi/gnome/extensions/memento-mori.nix b/home/jdigi/gnome/extensions/memento-mori.nix new file mode 100644 index 0000000..a77dd64 --- /dev/null +++ b/home/jdigi/gnome/extensions/memento-mori.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "memento-mori@paveloom" ]; + + "org/gnome/shell/extensions/memento-mori" = { + birth-day = 3; + birth-month = 11; + birth-year = 1995; + extension-index = 1; + extension-position = "left"; + life-expectancy = 80; + }; + }; + + home.packages = with pkgs; [ gnomeExtensions.memento-mori ]; +} diff --git a/home/jdigi/gnome/keyboard-shortcuts.nix b/home/jdigi/gnome/keyboard-shortcuts.nix new file mode 100644 index 0000000..2503ae8 --- /dev/null +++ b/home/jdigi/gnome/keyboard-shortcuts.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + dconf.settings = { + "org/gnome/desktop/wm/keybindings".move-to-workspace-left = [ "Left" ]; + "org/gnome/desktop/wm/keybindings".move-to-workspace-right = [ "Right" ]; + "org/gnome/desktop/wm/keybindings".switch-to-workspace-left = [ "Left" ]; + "org/gnome/desktop/wm/keybindings".switch-to-workspace-right = [ "Right" ]; + }; +} diff --git a/home/jdigi/packages.nix b/home/jdigi/packages.nix new file mode 100644 index 0000000..3f3e35d --- /dev/null +++ b/home/jdigi/packages.nix @@ -0,0 +1,23 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ + blender + btrfs-assistant + bottles + darktable + discord + element-desktop + gimp + neovim + obs-studio + onlyoffice-bin + openspades + steam + transmission-gtk + github-desktop + godot_4 + youtube-music + via + ]; +} diff --git a/home/jdigi/vscode/default.nix b/home/jdigi/vscode/default.nix new file mode 100644 index 0000000..1e7df25 --- /dev/null +++ b/home/jdigi/vscode/default.nix @@ -0,0 +1,24 @@ +{ pkgs, ... }: + +{ + imports = [ ./extensions ]; + + programs.vscode = { + enable = true; + enableExtensionUpdateCheck = false; + enableUpdateCheck = false; + mutableExtensionsDir = false; + package = pkgs.vscode.override { + commandLineArgs = [ + #"--ozone-platform=wayland" #TODO: app_id is wrong on wayland https://github.com/microsoft/vscode/issues/154693 + "--touch-events" + "-d" # hack needed to open files with commandLineArgs + ]; + }; + userSettings = { + "editor.formatOnSave" = true; + "window.autoDetectColorScheme" = true; + }; + }; +} + diff --git a/home/jdigi/vscode/extensions/default.nix b/home/jdigi/vscode/extensions/default.nix new file mode 100644 index 0000000..2ff8065 --- /dev/null +++ b/home/jdigi/vscode/extensions/default.nix @@ -0,0 +1,9 @@ +{ ... }: + +{ + imports = [ + ./github-copilot.nix + ./godot + ./nix-ide.nix + ]; +} diff --git a/home/jdigi/vscode/extensions/github-copilot.nix b/home/jdigi/vscode/extensions/github-copilot.nix new file mode 100644 index 0000000..c3804a1 --- /dev/null +++ b/home/jdigi/vscode/extensions/github-copilot.nix @@ -0,0 +1,14 @@ +{ pkgs, ... }: + +{ + programs.vscode = { + extensions = with pkgs.vscode-marketplace-release; [ + github.copilot + github.copilot-chat + ]; + + userSettings = { + "github.copilot.editor.enableAutoCompletions" = true; + }; + }; +} diff --git a/home/jdigi/vscode/extensions/godot/default.nix b/home/jdigi/vscode/extensions/godot/default.nix new file mode 100644 index 0000000..cb99455 --- /dev/null +++ b/home/jdigi/vscode/extensions/godot/default.nix @@ -0,0 +1,8 @@ +{ ... }: + +{ + imports = [ + ./gdscript-formatter-linter.nix + ./godot-tools.nix + ]; +} diff --git a/home/jdigi/vscode/extensions/godot/gdscript-formatter-linter.nix b/home/jdigi/vscode/extensions/godot/gdscript-formatter-linter.nix new file mode 100644 index 0000000..71b8f24 --- /dev/null +++ b/home/jdigi/vscode/extensions/godot/gdscript-formatter-linter.nix @@ -0,0 +1,15 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ gdtoolkit_4 ]; + + programs.vscode = { + extensions = with pkgs.vscode-marketplace; [ + eddiedover.gdscript-formatter-linter + ]; + + userSettings."[gdscript]" = { + "editor.defaultFormatter" = "EddieDover.gdscript-formatter-linter"; + }; + }; +} diff --git a/home/jdigi/vscode/extensions/godot/godot-tools.nix b/home/jdigi/vscode/extensions/godot/godot-tools.nix new file mode 100644 index 0000000..0482088 --- /dev/null +++ b/home/jdigi/vscode/extensions/godot/godot-tools.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: + +{ + programs.vscode.extensions = with pkgs.vscode-marketplace; [ + geequlim.godot-tools + ]; +} diff --git a/home/jdigi/vscode/extensions/nix-ide.nix b/home/jdigi/vscode/extensions/nix-ide.nix new file mode 100644 index 0000000..a974e90 --- /dev/null +++ b/home/jdigi/vscode/extensions/nix-ide.nix @@ -0,0 +1,26 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ + nil + nixpkgs-fmt + ]; + + programs.vscode = { + extensions = with pkgs.vscode-marketplace; [ jnoortheen.nix-ide ]; + + userSettings = { + nix = { + enableLanguageServer = true; + serverPath = "${pkgs.nil}/bin/nil"; + serverSettings = { + nil = { + formatting = { + command = [ "${pkgs.nixpkgs-fmt}/bin/nixpkgs-fmt" ]; + }; + }; + }; + }; + }; + }; +} diff --git a/hosts/GPD-WinMax2/default.nix b/hosts/GPD-WinMax2/default.nix new file mode 100644 index 0000000..f6c2c74 --- /dev/null +++ b/hosts/GPD-WinMax2/default.nix @@ -0,0 +1,16 @@ +{ pkgs, ... }: + +{ + imports = [ + ./hardware + ./home-manager + ]; + + programs = { + adb.enable = true; + gsconnect.enable = true; + steam.enable = true; + }; + + services.udev.packages = [ pkgs.qFlipper ]; +} diff --git a/hosts/GPD-WinMax2/hardware/default.nix b/hosts/GPD-WinMax2/hardware/default.nix new file mode 100644 index 0000000..6f0ab69 --- /dev/null +++ b/hosts/GPD-WinMax2/hardware/default.nix @@ -0,0 +1,25 @@ +{ pkgs, ... }: + +{ + imports = [ + ./file-systems.nix + ./gdm/monitors + ]; + + boot = { + initrd.availableKernelModules = [ + "nvme" + "sd_mod" + "thunderbolt" + "usb_storage" + "usbhid" + "xhci_pci" + ]; + + kernelPackages = pkgs.linuxPackages_latest; # TODO: See if this fixes sleep issues + }; + + hardware.amd-graphics.enable = true; + + services.logind.lidSwitchExternalPower = "ignore"; +} diff --git a/hosts/GPD-WinMax2/hardware/file-systems.nix b/hosts/GPD-WinMax2/hardware/file-systems.nix new file mode 100644 index 0000000..e23ac16 --- /dev/null +++ b/hosts/GPD-WinMax2/hardware/file-systems.nix @@ -0,0 +1,78 @@ +{ ... }: + +{ + boot.initrd.luks.devices = { + "home".device = "/dev/disk/by-uuid/9f2d5272-46ca-403f-ae36-7a60e51fc284"; + "root".device = "/dev/disk/by-uuid/07df5dda-8e3d-4d1c-b652-d3d3b03003fc"; + }; + + fileSystems = + let + btrfsSubvol = subvol: [ "subvol=${subvol}" "compress=zstd" ]; + ssdOptions = [ "discard=async" "noatime" ]; + homeDevice = "/dev/mapper/home"; + rootDevice = "/dev/mapper/root"; + in + { + "/" = { + # TODO: Switch to tmpfs + device = rootDevice; + fsType = "btrfs"; + options = btrfsSubvol "root" ++ ssdOptions; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/14BC-77E5"; + fsType = "vfat"; + options = [ "umask=0077" ]; # Restrict access to random seed + }; + + "/home" = { + device = homeDevice; + fsType = "btrfs"; + options = btrfsSubvol "home" ++ ssdOptions; + }; + + "/nix" = { + device = rootDevice; + fsType = "btrfs"; + options = btrfsSubvol "nix" ++ ssdOptions; + }; + + "/persist" = { + device = rootDevice; + fsType = "btrfs"; + neededForBoot = true; + options = btrfsSubvol "persist" ++ ssdOptions; + }; + + "/swap" = { + device = rootDevice; + fsType = "btrfs"; + options = btrfsSubvol "swap" ++ ssdOptions; + }; + }; + + services.snapper.configs = { + home = { + SUBVOLUME = "/home"; + TIMELINE_CLEANUP = true; + TIMELINE_CREATE = true; + TIMELINE_LIMIT_DAILY = "7"; + TIMELINE_LIMIT_HOURLY = "6"; + TIMELINE_LIMIT_MONTHLY = "3"; + TIMELINE_LIMIT_WEEKLY = "4"; + }; + persist = { + SUBVOLUME = "/persist"; + TIMELINE_CLEANUP = true; + TIMELINE_CREATE = true; + TIMELINE_LIMIT_WEEKLY = "4"; + }; + }; + + swapDevices = [{ + device = "/swap/swapfile"; + size = 8 * 1024; + }]; +} diff --git a/hosts/GPD-WinMax2/hardware/gdm/monitors/default.nix b/hosts/GPD-WinMax2/hardware/gdm/monitors/default.nix new file mode 100644 index 0000000..c7fdc22 --- /dev/null +++ b/hosts/GPD-WinMax2/hardware/gdm/monitors/default.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: + +{ + systemd.tmpfiles.rules = [ + ''L+ /run/gdm/.config/monitors.xml - gdm gdm - ${pkgs.writeText "gdm_monitors.xml" (builtins.readFile ./monitors.xml)}'' + ]; +} + diff --git a/hosts/GPD-WinMax2/hardware/gdm/monitors/monitors.xml b/hosts/GPD-WinMax2/hardware/gdm/monitors/monitors.xml new file mode 100644 index 0000000..38d937b --- /dev/null +++ b/hosts/GPD-WinMax2/hardware/gdm/monitors/monitors.xml @@ -0,0 +1,23 @@ + + + + 0 + 0 + 1.748633861541748 + yes + + + eDP-1 + JDI + GPD1001H + 0x00000001 + + + 2560 + 1600 + 60.009 + + + + + diff --git a/hosts/GPD-WinMax2/home-manager/common/default.nix b/hosts/GPD-WinMax2/home-manager/common/default.nix new file mode 100644 index 0000000..7062862 --- /dev/null +++ b/hosts/GPD-WinMax2/home-manager/common/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + imports = [ + ./gnome + ]; +} diff --git a/hosts/GPD-WinMax2/home-manager/common/gnome/default.nix b/hosts/GPD-WinMax2/home-manager/common/gnome/default.nix new file mode 100644 index 0000000..d0b0d2b --- /dev/null +++ b/hosts/GPD-WinMax2/home-manager/common/gnome/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + imports = [ + ./extensions + ]; +} diff --git a/hosts/GPD-WinMax2/home-manager/common/gnome/extensions/default.nix b/hosts/GPD-WinMax2/home-manager/common/gnome/extensions/default.nix new file mode 100644 index 0000000..7d09430 --- /dev/null +++ b/hosts/GPD-WinMax2/home-manager/common/gnome/extensions/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + imports = [ + ./quick-settings-audio-devices-renamer.nix + ]; +} diff --git a/hosts/GPD-WinMax2/home-manager/common/gnome/extensions/quick-settings-audio-devices-renamer.nix b/hosts/GPD-WinMax2/home-manager/common/gnome/extensions/quick-settings-audio-devices-renamer.nix new file mode 100644 index 0000000..5d8d77b --- /dev/null +++ b/hosts/GPD-WinMax2/home-manager/common/gnome/extensions/quick-settings-audio-devices-renamer.nix @@ -0,0 +1,23 @@ +{ lib, pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "quicksettings-audio-devices-renamer@marcinjahn.com" ]; + + "org/gnome/shell/extensions/quicksettings-audio-devices-renamer" = with lib.hm.gvariant; { + output-names-map = [ + (mkDictionaryEntry [ + "Internal Microphone – Family 17h/19h HD Audio Controller" + "Internal Microphone" + ]) + + (mkDictionaryEntry [ + "Speakers – Family 17h/19h HD Audio Controller" + "Speakers" + ]) + ]; + }; + }; + + home.packages = with pkgs; [ gnomeExtensions.quick-settings-audio-devices-renamer ]; +} diff --git a/hosts/GPD-WinMax2/home-manager/default.nix b/hosts/GPD-WinMax2/home-manager/default.nix new file mode 100644 index 0000000..b1a14c4 --- /dev/null +++ b/hosts/GPD-WinMax2/home-manager/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + home-manager.sharedModules = [ + ./common + ]; +} diff --git a/hosts/Joe-Desktop/default.nix b/hosts/Joe-Desktop/default.nix new file mode 100644 index 0000000..0cbbf68 --- /dev/null +++ b/hosts/Joe-Desktop/default.nix @@ -0,0 +1,33 @@ +{ pkgs, ... }: + +{ + imports = [ + ./hardware + ./home-manager + ]; + + programs = { + adb.enable = true; + + alvr = { + enable = true; + openFirewall = true; + }; + + gsconnect.enable = true; + + sidequest = { + enable = true; + openFirewall = true; + }; + + steam.enable = true; + via.enable = true; + }; + + services = { + fprintd.enable = true; + udev.packages = [ pkgs.qFlipper ]; + virtual-webcam.enable = true; + }; +} diff --git a/hosts/Joe-Desktop/hardware/default.nix b/hosts/Joe-Desktop/hardware/default.nix new file mode 100644 index 0000000..07a405b --- /dev/null +++ b/hosts/Joe-Desktop/hardware/default.nix @@ -0,0 +1,23 @@ +{ ... }: + +{ + imports = [ + ./file-systems.nix + ./gdm/monitors + ]; + + boot.initrd.availableKernelModules = [ + "ahci" + "nvme" + "sd_mod" + "sr_mod" + "usb_storage" + "usbhid" + "xhci_pci" + ]; + + hardware = { + amd-graphics.enable = true; + monitor-control.enable = true; + }; +} diff --git a/hosts/Joe-Desktop/hardware/file-systems.nix b/hosts/Joe-Desktop/hardware/file-systems.nix new file mode 100644 index 0000000..1de1e58 --- /dev/null +++ b/hosts/Joe-Desktop/hardware/file-systems.nix @@ -0,0 +1,79 @@ +{ ... }: + +{ + boot.initrd.luks.devices = { + "home".device = "/dev/disk/by-uuid/a5ee5a56-f4b5-4997-a082-e1efc52aca7b"; + "root".device = "/dev/disk/by-uuid/a3b3787b-6a86-49cc-bad2-cfd31414a9e3"; + }; + + fileSystems = + let + btrfsSubvol = subvol: [ "subvol=${subvol}" "compress=zstd" ]; + ssdOptions = [ "discard=async" "noatime" ]; + homeDevice = "/dev/mapper/home"; + rootDevice = "/dev/mapper/root"; + + in + { + "/" = { + # TODO: Switch to tmpfs + device = rootDevice; + fsType = "btrfs"; + options = btrfsSubvol "root" ++ ssdOptions; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/4304-7632"; + fsType = "vfat"; + options = [ "umask=0077" ]; # Restrict access to random seed + }; + + "/home" = { + device = homeDevice; + fsType = "btrfs"; + options = btrfsSubvol "home" ++ ssdOptions; + }; + + "/nix" = { + device = rootDevice; + fsType = "btrfs"; + options = btrfsSubvol "nix" ++ ssdOptions; + }; + + "/persist" = { + device = rootDevice; + fsType = "btrfs"; + neededForBoot = true; + options = btrfsSubvol "persist" ++ ssdOptions; + }; + + "/swap" = { + device = rootDevice; + fsType = "btrfs"; + options = btrfsSubvol "swap" ++ ssdOptions; + }; + }; + + services.snapper.configs = { + home = { + SUBVOLUME = "/home"; + TIMELINE_CLEANUP = true; + TIMELINE_CREATE = true; + TIMELINE_LIMIT_DAILY = 7; + TIMELINE_LIMIT_HOURLY = 6; + TIMELINE_LIMIT_MONTHLY = 3; + TIMELINE_LIMIT_WEEKLY = 4; + }; + persist = { + SUBVOLUME = "/persist"; + TIMELINE_CLEANUP = true; + TIMELINE_CREATE = true; + TIMELINE_LIMIT_WEEKLY = 4; + }; + }; + + swapDevices = [{ + device = "/swap/swapfile"; + size = 8 * 1024; + }]; +} diff --git a/hosts/Joe-Desktop/hardware/gdm/monitors/default.nix b/hosts/Joe-Desktop/hardware/gdm/monitors/default.nix new file mode 100644 index 0000000..1917145 --- /dev/null +++ b/hosts/Joe-Desktop/hardware/gdm/monitors/default.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: + +{ + systemd.tmpfiles.rules = [ + ''L+ /run/gdm/.config/monitors.xml - gdm gdm - ${pkgs.writeText "gdm_monitors.xml" (builtins.readFile ./monitors.xml)}'' + ]; +} diff --git a/hosts/Joe-Desktop/hardware/gdm/monitors/monitors.xml b/hosts/Joe-Desktop/hardware/gdm/monitors/monitors.xml new file mode 100644 index 0000000..7b22029 --- /dev/null +++ b/hosts/Joe-Desktop/hardware/gdm/monitors/monitors.xml @@ -0,0 +1,46 @@ + + + + 0 + 0 + 1 + yes + + + DP-3 + DEL + AW3423DWF + 20K32S3 + + + 3440 + 1440 + 164.900 + variable + + + + + + + 0 + 0 + 2 + yes + + + HDMI-1 + SNY + SONY TV *30 + 0x01010101 + + + 3840 + 2160 + 120.000 + variable + + + + + diff --git a/hosts/Joe-Desktop/home-manager/common/default.nix b/hosts/Joe-Desktop/home-manager/common/default.nix new file mode 100644 index 0000000..2f580aa --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/common/default.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + imports = [ + ./gnome + ./vr-packages.nix + ]; + + xdg.configFile."monitors.xml".source = ./monitors.xml; +} diff --git a/hosts/Joe-Desktop/home-manager/common/gnome/custom-wallpaper/default.nix b/hosts/Joe-Desktop/home-manager/common/gnome/custom-wallpaper/default.nix new file mode 100644 index 0000000..a0e75d7 --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/common/gnome/custom-wallpaper/default.nix @@ -0,0 +1,8 @@ +{ lib, ... }: + +{ + home.file."Pictures/Wallpapers" = lib.mkForce { + recursive = true; + source = ./wallpapers; + }; +} diff --git a/hosts/Joe-Desktop/home-manager/common/gnome/custom-wallpaper/wallpapers/Dark.jpg b/hosts/Joe-Desktop/home-manager/common/gnome/custom-wallpaper/wallpapers/Dark.jpg new file mode 100644 index 0000000..f1e2aa8 --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/common/gnome/custom-wallpaper/wallpapers/Dark.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22069aceb3d312ae908b1f7a4256daaddedc3220f52367f673736ad86f091777 +size 1225388 diff --git a/hosts/Joe-Desktop/home-manager/common/gnome/custom-wallpaper/wallpapers/Light.jpg b/hosts/Joe-Desktop/home-manager/common/gnome/custom-wallpaper/wallpapers/Light.jpg new file mode 100644 index 0000000..cbe259a --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/common/gnome/custom-wallpaper/wallpapers/Light.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d204f61aa6b049286a7d11feffed0074c011ede2ca671ead0c2047b18a727c4 +size 1362654 diff --git a/hosts/Joe-Desktop/home-manager/common/gnome/default.nix b/hosts/Joe-Desktop/home-manager/common/gnome/default.nix new file mode 100644 index 0000000..87461f2 --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/common/gnome/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + imports = [ + ./custom-wallpaper + ]; +} diff --git a/hosts/Joe-Desktop/home-manager/common/monitors.xml b/hosts/Joe-Desktop/home-manager/common/monitors.xml new file mode 100644 index 0000000..7b22029 --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/common/monitors.xml @@ -0,0 +1,46 @@ + + + + 0 + 0 + 1 + yes + + + DP-3 + DEL + AW3423DWF + 20K32S3 + + + 3440 + 1440 + 164.900 + variable + + + + + + + 0 + 0 + 2 + yes + + + HDMI-1 + SNY + SONY TV *30 + 0x01010101 + + + 3840 + 2160 + 120.000 + variable + + + + + diff --git a/hosts/Joe-Desktop/home-manager/common/vr-packages.nix b/hosts/Joe-Desktop/home-manager/common/vr-packages.nix new file mode 100644 index 0000000..a6f7834 --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/common/vr-packages.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ + unstable.alvr + unstable.sidequest + ]; +} diff --git a/hosts/Joe-Desktop/home-manager/default.nix b/hosts/Joe-Desktop/home-manager/default.nix new file mode 100644 index 0000000..b1a14c4 --- /dev/null +++ b/hosts/Joe-Desktop/home-manager/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + home-manager.sharedModules = [ + ./common + ]; +} diff --git a/hosts/Livingroom-PC/default.nix b/hosts/Livingroom-PC/default.nix new file mode 100644 index 0000000..1e8a9cd --- /dev/null +++ b/hosts/Livingroom-PC/default.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + imports = [ + ./home-manager + ./shared-wallpapers + ]; + + programs.steam.enable = true; +} diff --git a/hosts/Livingroom-PC/hardware/default.nix b/hosts/Livingroom-PC/hardware/default.nix new file mode 100644 index 0000000..2dc1372 --- /dev/null +++ b/hosts/Livingroom-PC/hardware/default.nix @@ -0,0 +1,18 @@ +{ ... }: + +{ + imports = [ + ./file-systems.nix + ./gdm/monitors + ]; + + boot = { + initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ]; + kernelModules = [ "kvm-amd" ]; + }; + + hardware = { + intel-graphics.enable = true; + scsi-generic.enable = true; + }; +} diff --git a/hosts/Livingroom-PC/hardware/file-systems.nix b/hosts/Livingroom-PC/hardware/file-systems.nix new file mode 100644 index 0000000..7976246 --- /dev/null +++ b/hosts/Livingroom-PC/hardware/file-systems.nix @@ -0,0 +1,78 @@ +{ ... }: + +{ + boot.initrd.luks.devices = { + "home".device = "/dev/disk/by-uuid/02645fc2-9eb4-4758-9979-f66de2baf061"; + "root".device = "/dev/disk/by-uuid/b7e8e5d3-bbd0-40d1-aef2-9d3a9fd34f0b"; + }; + + fileSystems = + let + btrfsSubvol = subvol: [ "subvol=${subvol}" "compress=zstd" ]; + ssdOptions = [ "discard=async" "noatime" ]; + homeDevice = "/dev/mapper/home"; + rootDevice = "/dev/mapper/root"; + in + { + "/" = { + # TODO: Switch to tmpfs + device = rootDevice; + fsType = "btrfs"; + options = btrfsSubvol "root" ++ ssdOptions; + }; + + "/boot" = { + device = "/dev/disk/by-uuid/4B37-F0CB"; + fsType = "vfat"; + options = [ "umask=0077" ]; # Restrict access to random seed + }; + + "/home" = { + device = homeDevice; + fsType = "btrfs"; + options = btrfsSubvol "home" ++ ssdOptions; + }; + + "/nix" = { + device = rootDevice; + fsType = "btrfs"; + options = btrfsSubvol "nix" ++ ssdOptions; + }; + + "/persist" = { + device = rootDevice; + fsType = "btrfs"; + neededForBoot = true; + options = btrfsSubvol "persist" ++ ssdOptions; + }; + + "/swap" = { + device = rootDevice; + fsType = "btrfs"; + options = btrfsSubvol "swap" ++ ssdOptions; + }; + }; + + services.snapper.configs = { + home = { + SUBVOLUME = "/home"; + TIMELINE_CLEANUP = true; + TIMELINE_CREATE = true; + TIMELINE_LIMIT_DAILY = 7; + TIMELINE_LIMIT_HOURLY = 6; + TIMELINE_LIMIT_MONTHLY = 3; + TIMELINE_LIMIT_WEEKLY = 4; + }; + persist = { + SUBVOLUME = "/persist"; + TIMELINE_CLEANUP = true; + TIMELINE_CREATE = true; + TIMELINE_LIMIT_WEEKLY = 4; + }; + }; + + swapDevices = [{ + device = "/swap/swapfile"; + size = 8 * 1024; + }]; +} diff --git a/hosts/Livingroom-PC/hardware/gdm/monitors/default.nix b/hosts/Livingroom-PC/hardware/gdm/monitors/default.nix new file mode 100644 index 0000000..1917145 --- /dev/null +++ b/hosts/Livingroom-PC/hardware/gdm/monitors/default.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: + +{ + systemd.tmpfiles.rules = [ + ''L+ /run/gdm/.config/monitors.xml - gdm gdm - ${pkgs.writeText "gdm_monitors.xml" (builtins.readFile ./monitors.xml)}'' + ]; +} diff --git a/hosts/Livingroom-PC/hardware/gdm/monitors/monitors.xml b/hosts/Livingroom-PC/hardware/gdm/monitors/monitors.xml new file mode 100644 index 0000000..86a1e33 --- /dev/null +++ b/hosts/Livingroom-PC/hardware/gdm/monitors/monitors.xml @@ -0,0 +1,23 @@ + + + + 0 + 0 + 1 + yes + + + HDMI-1 + SNY + SONY TV *30 + 0x01010101 + + + 1920 + 1080 + 120.000 + + + + + diff --git a/hosts/Livingroom-PC/home-manager/common/default.nix b/hosts/Livingroom-PC/home-manager/common/default.nix new file mode 100644 index 0000000..20b94a6 --- /dev/null +++ b/hosts/Livingroom-PC/home-manager/common/default.nix @@ -0,0 +1,13 @@ +{ lib, ... }: + +{ + imports = [ + ./gnome + ./makemkv.nix + ./monitors + ./packages.nix + ]; + + home.file."Pictures/Wallpapers".enable = lib.mkForce false; +} + diff --git a/hosts/Livingroom-PC/home-manager/common/gnome/default.nix b/hosts/Livingroom-PC/home-manager/common/gnome/default.nix new file mode 100644 index 0000000..a22903d --- /dev/null +++ b/hosts/Livingroom-PC/home-manager/common/gnome/default.nix @@ -0,0 +1,26 @@ +{ lib, ... }: + +{ + imports = [ + ./extensions + ]; + + dconf.settings = { + "org/gnome/desktop/background" = lib.mkForce { + picture-uri = "file:///etc/wallpapers/Light.jpg"; + picture-uri-dark = "file:///etc/wallpapers/Dark.jpg"; + }; + + "org/gnome/shell" = { + favorite-apps = lib.mkForce [ + "firefox.desktop" + "youtube-music.desktop" + "steam.desktop" + "discord.desktop" + "org.gnome.Nautilus.desktop" + ]; + }; + }; + + +} diff --git a/hosts/Livingroom-PC/home-manager/common/gnome/extensions/default.nix b/hosts/Livingroom-PC/home-manager/common/gnome/extensions/default.nix new file mode 100644 index 0000000..fbda792 --- /dev/null +++ b/hosts/Livingroom-PC/home-manager/common/gnome/extensions/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + imports = [ + ./hide-top-bar.nix + ]; +} diff --git a/hosts/Livingroom-PC/home-manager/common/gnome/extensions/hide-top-bar.nix b/hosts/Livingroom-PC/home-manager/common/gnome/extensions/hide-top-bar.nix new file mode 100644 index 0000000..63bc4a5 --- /dev/null +++ b/hosts/Livingroom-PC/home-manager/common/gnome/extensions/hide-top-bar.nix @@ -0,0 +1,9 @@ +{ pkgs, ... }: + +{ + dconf.settings = { + "org/gnome/shell".enabled-extensions = [ "hidetopbar@mathieu.bidon.ca" ]; + }; + + home.packages = with pkgs; [ gnomeExtensions.hide-top-bar ]; +} diff --git a/hosts/Livingroom-PC/home-manager/common/makemkv.nix b/hosts/Livingroom-PC/home-manager/common/makemkv.nix new file mode 100644 index 0000000..10d1b98 --- /dev/null +++ b/hosts/Livingroom-PC/home-manager/common/makemkv.nix @@ -0,0 +1,12 @@ +{ ... }: + +{ + home.file.".MakeMKV/settings.conf" = { + # TODO: encrypt app_Key + text = '' + app_Java = "pkgs.jre8_headless" + app_Key = "M-eo6vY4Bo0z6tnPGyjl7QKofQ1PAeW3@3jhqra90NVhJDaE9qmILnsmej8Azu1G3R0a" + app_PreferredLanguage = "eng" + ''; + }; +} diff --git a/hosts/Livingroom-PC/home-manager/common/monitors/default.nix b/hosts/Livingroom-PC/home-manager/common/monitors/default.nix new file mode 100644 index 0000000..00fd1e1 --- /dev/null +++ b/hosts/Livingroom-PC/home-manager/common/monitors/default.nix @@ -0,0 +1,8 @@ +{ ... }: + +{ + # TODO: move to hardware module + home.file.configFile."monitors.xml" = { + source = ./monitors.xml; + }; +} diff --git a/hosts/Livingroom-PC/home-manager/common/monitors/monitors.xml b/hosts/Livingroom-PC/home-manager/common/monitors/monitors.xml new file mode 100644 index 0000000..86a1e33 --- /dev/null +++ b/hosts/Livingroom-PC/home-manager/common/monitors/monitors.xml @@ -0,0 +1,23 @@ + + + + 0 + 0 + 1 + yes + + + HDMI-1 + SNY + SONY TV *30 + 0x01010101 + + + 1920 + 1080 + 120.000 + + + + + diff --git a/hosts/Livingroom-PC/home-manager/common/packages.nix b/hosts/Livingroom-PC/home-manager/common/packages.nix new file mode 100644 index 0000000..4b18fbb --- /dev/null +++ b/hosts/Livingroom-PC/home-manager/common/packages.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: + +{ + home.packages = with pkgs; [ + discord + localsend + makemkv + steam + youtube-music + vlc + ]; +} diff --git a/hosts/Livingroom-PC/home-manager/default.nix b/hosts/Livingroom-PC/home-manager/default.nix new file mode 100644 index 0000000..c1aa384 --- /dev/null +++ b/hosts/Livingroom-PC/home-manager/default.nix @@ -0,0 +1,11 @@ +{ inputs, outputs, pkgs, ... }: + +{ + home-manager = { + extraSpecialArgs = { inherit inputs pkgs; }; + sharedModules = [ + ./common + outputs.commonHomeModule + ]; + }; +} diff --git a/hosts/Livingroom-PC/shared-wallpapers/default.nix b/hosts/Livingroom-PC/shared-wallpapers/default.nix new file mode 100644 index 0000000..345b114 --- /dev/null +++ b/hosts/Livingroom-PC/shared-wallpapers/default.nix @@ -0,0 +1,7 @@ +{ ... }: + +{ + environment.etc = { + wallpapers.source = ./wallpapers; + }; +} diff --git a/hosts/Livingroom-PC/shared-wallpapers/wallpapers/Dark.jpg b/hosts/Livingroom-PC/shared-wallpapers/wallpapers/Dark.jpg new file mode 100644 index 0000000..5404495 --- /dev/null +++ b/hosts/Livingroom-PC/shared-wallpapers/wallpapers/Dark.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb38483667c0bd6295320857b6de4a3084d52a51d6588b18078d00d873233f1e +size 4535911 diff --git a/hosts/Livingroom-PC/shared-wallpapers/wallpapers/Light.jpg b/hosts/Livingroom-PC/shared-wallpapers/wallpapers/Light.jpg new file mode 100644 index 0000000..5bfb6b5 --- /dev/null +++ b/hosts/Livingroom-PC/shared-wallpapers/wallpapers/Light.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:606ffba5e9284703266b9ba3377226631756b7b193c48d3ab57bdd4b5b938cfe +size 5652416 diff --git a/hosts/common/default.nix b/hosts/common/default.nix new file mode 100644 index 0000000..19ccb75 --- /dev/null +++ b/hosts/common/default.nix @@ -0,0 +1,121 @@ +{ inputs, outputs, ... }: + +{ + imports = [ + ./gpu-screen-recorder.nix + ./ssh-agent.nix + ]; + + boot = { + loader = { + efi.canTouchEfiVariables = true; + + systemd-boot = { + enable = true; + configurationLimit = 5; + consoleMode = "auto"; + }; + }; + + plymouth.enable = true; + secureboot.enable = true; + }; + + hardware = { + bluetooth.settings.General.Experimental = true; # TODO: Needed to get battery levels from some devices + enableRedistributableFirmware = true; + xbox-one-controller.enable = true; + }; + + networking = { + firewall.enable = true; + networkmanager = { + enable = true; + wifi.macAddress = "random"; + }; + }; + + nix = { + gc.automatic = true; + optimise.automatic = true; + settings = { + auto-optimise-store = true; + experimental-features = [ + "flakes" + "nix-command" + ]; + }; + }; + + home-manager = { + backupFileExtension = "hmbackup"; + extraSpecialArgs = { inherit inputs; }; + sharedModules = [ + outputs.commonHomeModule + ]; + useGlobalPkgs = true; + useUserPackages = true; + }; + + nixpkgs.config.allowUnfree = true; + + programs = { + dconf = { + enable = true; + profiles.gdm.databases = [{ + settings = { + # TODO: Find a better way to set defaults in gnome, maybe extraGSettingsOverrides? + "org/gnome/desktop/interface" = { + clock-format = "12h"; + show-battery-percentage = true; + }; + + "org/gnome/desktop/peripherals/mouse".accel-profile = "flat"; + + "org/gnome/mutter".experimental-features = [ + "scale-monitor-framebuffer" + "variable-refresh-rate" # TODO: May not be needed in gnome 47 + ]; + + "org/gnome/settings-daemon/plugins/color" = { + night-light-enabled = true; + night-light-schedule-automatic = true; + night-light-temperature = inputs.home-manager.lib.hm.gvariant.mkUint32 4500; + }; + }; + }]; + }; + + git = { + enable = true; + lfs.enable = true; + }; + + localsend.openFirewall = true; + }; + + services = { + avahi = { + enable = true; + nssmdns4 = true; + openFirewall = true; + }; + + flatpak = { + enable = true; + remotes = [{ + name = "flathub"; + location = "https://dl.flathub.org/repo/flathub.flatpakrepo"; + }]; + }; + + gnome-desktop.enable = true; + ntp.enable = true; + pipewire.enable = true; + printing.enable = true; + }; + + system.stateVersion = "23.11"; # DO NOT CHANGE AFTER INSTALL. More info: https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion + systemd.services.NetworkManager-wait-online.enable = false; + time.timeZone = "America/New_York"; +} diff --git a/hosts/common/gpu-screen-recorder.nix b/hosts/common/gpu-screen-recorder.nix new file mode 100644 index 0000000..8f6334b --- /dev/null +++ b/hosts/common/gpu-screen-recorder.nix @@ -0,0 +1,88 @@ +{ pkgs, ... }: + +let + gsr-save-replay = pkgs.writeShellScriptBin "gsr-save-replay" '' + ${pkgs.killall}/bin/killall -SIGUSR1 gpu-screen-recorder + OUTPUT_DIR="$HOME/${outputDir}" + VIDEO_FILE=$(ls -t $OUTPUT_DIR | head -n1) + ACTION=$(${pkgs.libnotify}/bin/notify-send -a 'GPU Screen Recorder' --action 'file=Watch Replay' --action 'dir=View All Replays' -i com.dec05eba.gpu_screen_recorder -t 3000 -u low 'Replay Saved' "$VIDEO_FILE") + if [ "$ACTION" == "dir" ]; then + xdg-open $OUTPUT_DIR + elif [ "$ACTION" == "file" ]; then + xdg-open $OUTPUT_DIR/$VIDEO_FILE + fi + ''; + + outputDir = "Videos/Replays"; +in +{ + environment.systemPackages = [ + gsr-save-replay + ]; + + security.wrappers."gsr-kms-server" = { + # Required to start recording without password prompt + capabilities = "cap_sys_admin+ep"; + group = "root"; + owner = "root"; + source = "${pkgs.gpu-screen-recorder}/bin/gsr-kms-server"; + }; + + services.xserver.desktopManager.gnome = { + # TODO: Figure out how to properly add custom keyboard shortcuts to GNOME, this doesn't seem to work for some reason + extraGSettingsOverrides = '' + [org/gnome/settings-daemon/plugins/media-keys] + custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/gsr-save-replay/'] + + [org.gnome.settings-daemon.plugins.media-keys.custom-keybindings.gsr-save-replay] + binding='F12' + command='gsr-save-replay' + name='GPU Screen Recorder - Save Replay' + ''; + + extraGSettingsOverridePackages = with pkgs; [ gnome.gnome-settings-daemon ]; + }; + + systemd.user.services."gsr-replay" = { + after = [ "graphical-session.target" ]; + description = "GPU Screen Recorder replay service"; + serviceConfig = { + Environment = [ + "AUDIO_CODEC=opus" + "CODEC=auto" + "CONTAINER=mkv" + "FRAMERATE=60" + "MAKEFOLDERS=no" + "QUALITY=very_high" + "REPLAYDURATION=300" + "WINDOW=screen" + ]; + ExecStart = pkgs.writeShellScript "start-gpu-screen-recorder-replay" '' + ${pkgs.gpu-screen-recorder}/bin/gpu-screen-recorder -a "$(${pkgs.pulseaudio}/bin/pactl get-default-sink).monitor" -a "$(${pkgs.pulseaudio}/bin/pactl get-default-source)" -ac "$AUDIO_CODEC" -c "$CONTAINER" -f "$FRAMERATE" -k "$CODEC" -mf "$MAKEFOLDERS" -o "${outputDir}" -q "$QUALITY" -r "$REPLAYDURATION" -v no -w "$WINDOW" $ADDITIONAL_ARGS + ''; + Restart = "on-failure"; + RestartSec = "5s"; + Type = "simple"; + }; + wantedBy = [ "graphical-session.target" ]; + }; + + systemd.user.services."gsr-audio-device-changer" = { + after = [ "gsr-replay.service" ]; + description = "Restart GPU Screen Recorder replay service on audio device change"; + requires = [ "gsr-replay.service" ]; + serviceConfig = { + ExecStart = pkgs.writeShellScript "gsr-restart-on-audio-device-change" '' + ${pkgs.pulseaudio}/bin/pactl subscribe | while read -r event; do + if [[ $event == *"Event 'change' on server"* ]]; then + systemctl --user restart gsr-replay.service + fi + done + ''; + Restart = "always"; + RestartSec = "5s"; + Type = "simple"; + }; + wantedBy = [ "gsr-replay.service" ]; + }; +} diff --git a/hosts/common/ssh-agent.nix b/hosts/common/ssh-agent.nix new file mode 100644 index 0000000..83ef1f1 --- /dev/null +++ b/hosts/common/ssh-agent.nix @@ -0,0 +1,17 @@ +{ ... }: + +{ + programs.ssh = { + extraConfig = '' + AddKeysToAgent yes + ''; + + startAgent = true; + }; + + services = { + gnome.gnome-keyring = { + enable = true; + }; + }; +} diff --git a/modules/options/boot/default.nix b/modules/options/boot/default.nix new file mode 100644 index 0000000..7259cbc --- /dev/null +++ b/modules/options/boot/default.nix @@ -0,0 +1,9 @@ +{ ... }: + +{ + imports = [ + ./impermanence-btrfs.nix + ./plymouth.nix + ./secureboot.nix + ]; +} diff --git a/modules/options/boot/impermanence-btrfs.nix b/modules/options/boot/impermanence-btrfs.nix new file mode 100644 index 0000000..1fb4c04 --- /dev/null +++ b/modules/options/boot/impermanence-btrfs.nix @@ -0,0 +1,69 @@ +{ config, lib, ... }: + +# TODO: Switch to tmpfs +let + cleanRootScript = '' + mkdir -p /btrfs_tmp + mount ${rootConfig.device} /btrfs_tmp + if [[ -e /btrfs_tmp/root ]]; then + mkdir -p /btrfs_tmp/old_roots + timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") + mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" + fi + + delete_subvolume_recursively() { + IFS=$'\n' + for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do + delete_subvolume_recursively "/btrfs_tmp/$i" + done + btrfs subvolume delete "$1" + } + + for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do + delete_subvolume_recursively "$i" + done + + btrfs subvolume create /btrfs_tmp/root + umount /btrfs_tmp + rmdir /btrfs_tmp + ''; + + rootConfig = config.fileSystems."/"; +in +{ + boot.initrd = lib.mkIf (rootConfig.fsType == "btrfs") { + postDeviceCommands = lib.mkIf (!config.boot.initrd.systemd.enable) cleanRootScript; + + systemd.services = lib.mkIf config.boot.initrd.systemd.enable { + "clean-root-btrfs" = { + after = [ "initrd-root-device.target" ]; + before = [ "sysroot.mount" ]; + description = "Reset BTRFS root subvolume to a blank state"; + script = cleanRootScript; + serviceConfig.Type = "oneshot"; + unitConfig.DefaultDependencies = "no"; + wantedBy = [ "initrd.target" ]; + }; + }; + }; + + environment.persistence."/persist" = { + directories = [ + { directory = "/var/lib/colord"; user = "colord"; group = "colord"; mode = "u=rwx,g=rx,o="; } + "/etc/NetworkManager/system-connections" + "/etc/secureboot" + "/var/lib/bluetooth" + "/var/lib/flatpak" + "/var/lib/fprint" + "/var/lib/nixos" + "/var/lib/systemd/coredump" + "/var/log/" + ]; + + files = [ + "/etc/machine-id" + ]; + + hideMounts = true; + }; +} diff --git a/modules/options/boot/plymouth.nix b/modules/options/boot/plymouth.nix new file mode 100644 index 0000000..8bd3e83 --- /dev/null +++ b/modules/options/boot/plymouth.nix @@ -0,0 +1,17 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.boot.plymouth.enable { + boot = lib.mkDefault { + consoleLogLevel = 0; + initrd = { + #TODO make this auto detect encrypted drives + systemd.enable = lib.mkForce true; # Systemd is required for graphic LUKS password prompt + verbose = false; + }; + + kernelParams = [ "quiet" "splash" ]; + plymouth.extraConfig = "DeviceScale=2"; + }; + }; +} diff --git a/modules/options/boot/secureboot.nix b/modules/options/boot/secureboot.nix new file mode 100644 index 0000000..2f02213 --- /dev/null +++ b/modules/options/boot/secureboot.nix @@ -0,0 +1,15 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.boot.secureboot.enable { + boot = { + lanzaboote = { + enable = true; + pkiBundle = "/etc/secureboot"; + }; + loader.systemd-boot.enable = lib.mkForce false; # Lanzaboote replaces the systemd-boot module. + }; + }; + + options.boot.secureboot.enable = lib.mkEnableOption "enable secure boot support."; +} diff --git a/modules/options/default.nix b/modules/options/default.nix new file mode 100644 index 0000000..6963abe --- /dev/null +++ b/modules/options/default.nix @@ -0,0 +1,11 @@ +{ ... }: + +{ + imports = [ + ./boot + ./hardware + ./networking + ./programs + ./services + ]; +} diff --git a/modules/options/hardware/amd-graphics.nix b/modules/options/hardware/amd-graphics.nix new file mode 100644 index 0000000..a7bb8ce --- /dev/null +++ b/modules/options/hardware/amd-graphics.nix @@ -0,0 +1,8 @@ +{ config, lib, ... }: +{ + config = lib.mkIf config.hardware.amd-graphics.enable { + boot.initrd.availableKernelModules = [ "amdgpu" ]; + }; + + options.hardware.amd-graphics.enable = lib.mkEnableOption "enable support for AMD graphics."; +} diff --git a/modules/options/hardware/default.nix b/modules/options/hardware/default.nix new file mode 100644 index 0000000..2e2952e --- /dev/null +++ b/modules/options/hardware/default.nix @@ -0,0 +1,12 @@ +{ ... }: + +{ + imports = [ + ./amd-graphics.nix + ./intel-graphics.nix + ./monitor-control.nix + ./nvidia.nix + ./scsi-generic.nix + ./xbox-one-controller.nix + ]; +} diff --git a/modules/options/hardware/intel-graphics.nix b/modules/options/hardware/intel-graphics.nix new file mode 100644 index 0000000..d4603fd --- /dev/null +++ b/modules/options/hardware/intel-graphics.nix @@ -0,0 +1,9 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.hardware.intel-graphics.enable { + boot.initrd.availableKernelModules = [ "i915" ]; + }; + + options.hardware.intel-graphics.enable = lib.mkEnableOption "enable support for Intel graphics."; +} diff --git a/modules/options/hardware/monitor-control.nix b/modules/options/hardware/monitor-control.nix new file mode 100644 index 0000000..603ccc5 --- /dev/null +++ b/modules/options/hardware/monitor-control.nix @@ -0,0 +1,13 @@ +{ config, lib, pkgs, ... }: + +{ + config = lib.mkIf config.hardware.monitor-control.enable { + environment.systemPackages = with pkgs; [ + ddcutil + ]; + + boot.kernelModules = [ "i2c-dev" ]; + }; + + options.hardware.monitor-control.enable = lib.mkEnableOption "enable support for controlling monitor settings."; +} diff --git a/modules/options/hardware/nvidia.nix b/modules/options/hardware/nvidia.nix new file mode 100644 index 0000000..51f00a1 --- /dev/null +++ b/modules/options/hardware/nvidia.nix @@ -0,0 +1,13 @@ +{ config, lib, ... }: +{ + config = lib.mkIf config.hardware.nvidia.enable { + hardware.nvidia = { + modesetting.enable = true; + powerManagement.enable = true; + }; + + services.xserver.videoDrivers = [ "nvidia" ]; + }; + + options.hardware.nvidia.enable = lib.mkEnableOption "enable support for Nvidia graphics."; +} diff --git a/modules/options/hardware/scsi-generic.nix b/modules/options/hardware/scsi-generic.nix new file mode 100644 index 0000000..8dedeea --- /dev/null +++ b/modules/options/hardware/scsi-generic.nix @@ -0,0 +1,9 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.hardware.scsi-generic.enable { + boot.kernelModules = [ "sg" ]; + }; + + options.hardware.scsi-generic.enable = lib.mkEnableOption "enable support for SCSI Generic driver"; +} diff --git a/modules/options/hardware/xbox-one-controller.nix b/modules/options/hardware/xbox-one-controller.nix new file mode 100644 index 0000000..0bdba84 --- /dev/null +++ b/modules/options/hardware/xbox-one-controller.nix @@ -0,0 +1,12 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.hardware.xbox-one-controller.enable { + hardware = { + xone.enable = true; + xpadneo.enable = true; + }; + }; + + options.hardware.xbox-one-controller.enable = lib.mkEnableOption "enable support for Xbox One controllers."; +} diff --git a/modules/options/networking/default.nix b/modules/options/networking/default.nix new file mode 100644 index 0000000..a352baf --- /dev/null +++ b/modules/options/networking/default.nix @@ -0,0 +1,9 @@ +{ ... }: + +{ + imports = [ + ./firewall-rules/localsend.nix + ./networkmanager/auto-wlan.nix + ./networkmanager/systemd-wait-online.nix + ]; +} diff --git a/modules/options/networking/firewall-rules/localsend.nix b/modules/options/networking/firewall-rules/localsend.nix new file mode 100644 index 0000000..19e3960 --- /dev/null +++ b/modules/options/networking/firewall-rules/localsend.nix @@ -0,0 +1,12 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.programs.localsend.openFirewall { + networking.firewall = { + allowedTCPPorts = [ 53317 ]; + allowedUDPPorts = [ 53317 ]; + }; + }; + + options.programs.localsend.openFirewall = lib.mkEnableOption "open the default ports for localsend"; +} diff --git a/modules/options/networking/networkmanager/auto-wlan.nix b/modules/options/networking/networkmanager/auto-wlan.nix new file mode 100644 index 0000000..7003a34 --- /dev/null +++ b/modules/options/networking/networkmanager/auto-wlan.nix @@ -0,0 +1,24 @@ +{ config, lib, pkgs, ... }: + +{ + config = lib.mkIf config.networking.networkmanager.enable { + environment.etc."NetworkManager/dispatcher.d/99-auto-wlan" = { + mode = "0755"; + text = '' + #!${pkgs.bash}/bin/bash + # Auto disable wifi when ethernet is connected + wired_interfaces="en.*|eth.*" + if [[ "$1" =~ $wired_interfaces ]]; then + case "$2" in + up) + ${pkgs.networkmanager}/bin/nmcli radio wifi off + ;; + down) + ${pkgs.networkmanager}/bin/nmcli radio wifi on + ;; + esac + fi + ''; + }; + }; +} diff --git a/modules/options/networking/networkmanager/systemd-wait-online.nix b/modules/options/networking/networkmanager/systemd-wait-online.nix new file mode 100644 index 0000000..de79727 --- /dev/null +++ b/modules/options/networking/networkmanager/systemd-wait-online.nix @@ -0,0 +1,6 @@ +{ config, lib, ... }: + +{ + boot.initrd.systemd.network.wait-online.enable = lib.mkDefault (!config.networking.networkmanager.enable); + systemd.network.wait-online.enable = lib.mkDefault (!config.networking.networkmanager.enable); +} diff --git a/modules/options/programs/default.nix b/modules/options/programs/default.nix new file mode 100644 index 0000000..3664117 --- /dev/null +++ b/modules/options/programs/default.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + imports = [ + ./gsconnect.nix + ./sidequest.nix + ./steam.nix + ./via.nix + ]; +} diff --git a/modules/options/programs/gsconnect.nix b/modules/options/programs/gsconnect.nix new file mode 100644 index 0000000..b7a6d6a --- /dev/null +++ b/modules/options/programs/gsconnect.nix @@ -0,0 +1,12 @@ +{ config, lib, pkgs, ... }: + +{ + config = lib.mkIf config.programs.gsconnect.enable { + programs.kdeconnect = { + enable = true; + package = pkgs.gnomeExtensions.gsconnect; + }; + }; + + options.programs.gsconnect.enable = lib.mkEnableOption "GSConnect"; +} diff --git a/modules/options/programs/sidequest.nix b/modules/options/programs/sidequest.nix new file mode 100644 index 0000000..2486ae4 --- /dev/null +++ b/modules/options/programs/sidequest.nix @@ -0,0 +1,18 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.programs.sidequest; +in +{ + config = lib.mkIf cfg.enable { + environment.systemPackages = [ cfg.package ]; + networking.firewall = lib.mkIf cfg.openFirewall { allowedTCPPorts = [ 5555 ]; }; + programs.adb.enable = true; + }; + + options.programs.sidequest = { + enable = lib.mkEnableOption "SideQuest, an open app store and side-loading tool for Android-based VR devices."; + openFirewall = lib.mkEnableOption "Whether to open the default ports in the firewall for SideQuest ADB access."; + package = lib.mkPackageOption pkgs "sidequest" { }; + }; +} diff --git a/modules/options/programs/steam.nix b/modules/options/programs/steam.nix new file mode 100644 index 0000000..ea2b7de --- /dev/null +++ b/modules/options/programs/steam.nix @@ -0,0 +1,11 @@ +{ config, lib, pkgs, ... }: + +{ + config.programs.steam = lib.mkIf config.programs.steam.enable { + dedicatedServer.openFirewall = lib.mkDefault true; + extraCompatPackages = with pkgs; [ proton-ge-bin ]; + gamescopeSession.enable = lib.mkDefault true; + localNetworkGameTransfers.openFirewall = lib.mkDefault true; + remotePlay.openFirewall = lib.mkDefault true; + }; +} diff --git a/modules/options/programs/via.nix b/modules/options/programs/via.nix new file mode 100644 index 0000000..a4f2ee6 --- /dev/null +++ b/modules/options/programs/via.nix @@ -0,0 +1,16 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.programs.via; +in +{ + config = lib.mkIf cfg.enable { + environment.systemPackages = [ cfg.package ]; + services.udev.packages = [ cfg.package ]; + }; + + options.programs.via = { + enable = lib.mkEnableOption "VIA, a keyboard configurator."; + package = lib.mkPackageOption pkgs "via" { }; + }; +} diff --git a/modules/options/services/default.nix b/modules/options/services/default.nix new file mode 100644 index 0000000..63beaa4 --- /dev/null +++ b/modules/options/services/default.nix @@ -0,0 +1,9 @@ +{ ... }: + +{ + imports = [ + ./gnome-desktop.nix + ./pipewire.nix + ./virtual-webcam.nix + ]; +} diff --git a/modules/options/services/gnome-desktop.nix b/modules/options/services/gnome-desktop.nix new file mode 100644 index 0000000..97a2784 --- /dev/null +++ b/modules/options/services/gnome-desktop.nix @@ -0,0 +1,52 @@ +{ config, lib, pkgs, ... }: + +{ + imports = [ + ./gnome-keyring-autologin-luks.nix + ]; + + config = lib.mkIf config.services.gnome-desktop.enable { + environment = { + gnome.excludePackages = (with pkgs; [ + gnome-tour + gnome-connections + ]) ++ (with pkgs.gnome; [ + epiphany + evince + geary + gnome-contacts + gnome-maps + gnome-music + simple-scan + totem + yelp + ]); + + systemPackages = with pkgs; [ + celluloid + gnome.gnome-software + ]; + }; + + services = { + fwupd.enable = lib.mkDefault true; + gnome.gnome-keyring.enable = lib.mkDefault true; + + xserver = { + enable = lib.mkForce true; + desktopManager.gnome.enable = lib.mkForce true; + displayManager.gdm.enable = lib.mkForce true; + + excludePackages = with pkgs; [ xterm ]; + }; + }; + + # Fix for auto login + systemd.services = lib.mkIf config.services.displayManager.autoLogin.enable { + "autovt@tty1".enable = false; + "getty@tty1".enable = false; + }; + }; + + options.services.gnome-desktop.enable = lib.mkEnableOption "Gnome Desktop Environment"; +} diff --git a/modules/options/services/gnome-keyring-autologin-luks.nix b/modules/options/services/gnome-keyring-autologin-luks.nix new file mode 100644 index 0000000..ccc8934 --- /dev/null +++ b/modules/options/services/gnome-keyring-autologin-luks.nix @@ -0,0 +1,26 @@ +{ config, lib, pkgs, ... }: + +{ + # Auto login will attempt to unlock gnome keyring using LUKS passphrase. + # See https://github.com/NixOS/nixpkgs/pull/282317 + # TODO: Merged. Remove this if backported or in the next release. + + boot.initrd.systemd.enable = lib.mkForce true; + + security.pam.services.gdm-autologin.text = lib.mkForce '' + auth requisite pam_nologin.so + auth required pam_succeed_if.so uid >= 1000 quiet + ${lib.optionalString config.security.pam.services.login.enableGnomeKeyring '' + auth [success=ok default=1] ${pkgs.gnome.gdm}/lib/security/pam_gdm.so + auth optional ${pkgs.gnome.gnome-keyring}/lib/security/pam_gnome_keyring.so + ''} + auth required pam_permit.so + + account sufficient pam_unix.so + + password requisite pam_unix.so nullok yescrypt + + session optional pam_keyinit.so revoke + session include login + ''; +} diff --git a/modules/options/services/pipewire.nix b/modules/options/services/pipewire.nix new file mode 100644 index 0000000..4321e15 --- /dev/null +++ b/modules/options/services/pipewire.nix @@ -0,0 +1,16 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.services.pipewire.enable { + hardware.pulseaudio.enable = lib.mkForce false; + security.rtkit.enable = lib.mkDefault true; + + services.pipewire = lib.mkDefault { + alsa = { + enable = true; + support32Bit = true; + }; + pulse.enable = true; + }; + }; +} diff --git a/modules/options/services/virtual-webcam.nix b/modules/options/services/virtual-webcam.nix new file mode 100644 index 0000000..2fca27d --- /dev/null +++ b/modules/options/services/virtual-webcam.nix @@ -0,0 +1,10 @@ +{ config, lib, ... }: + +{ + config = lib.mkIf config.services.virtual-webcam.enable { + boot.extraModulePackages = with config.boot.kernelPackages; [ v4l2loopback ]; + security.polkit.enable = lib.mkForce true; + }; + + options.services.virtual-webcam.enable = lib.mkEnableOption "virtual webcam support."; +} diff --git a/modules/users/jdigi.nix b/modules/users/jdigi.nix new file mode 100644 index 0000000..9650efc --- /dev/null +++ b/modules/users/jdigi.nix @@ -0,0 +1,22 @@ +{ outputs, ... }: + +{ + home-manager.users.jdigi = import (outputs.homeModules + "/jdigi"); + + services.displayManager.autoLogin.user = "jdigi"; + + users.users.jdigi = { + description = "Joseph DiGiovanni"; + + extraGroups = [ + "adbusers" + "dialout" + "networkmanager" + "wheel" + ]; + + # TODO: encrypt hashedPassword + hashedPassword = "$6$a4mm.wYlyW4SuWSM$a3GFFkwfQ4.CNtkt2l4QX4.n7bK4LCHhY4HqsFx0F1Qu.ZP6H2yXc2y19.DZrpPq/0qK2ZU3cSCdT/9.Mq8X01"; + isNormalUser = true; + }; +} diff --git a/modules/users/livingroom-pc.nix b/modules/users/livingroom-pc.nix new file mode 100644 index 0000000..5a79dd3 --- /dev/null +++ b/modules/users/livingroom-pc.nix @@ -0,0 +1,36 @@ +{ ... }: + +let + newUser = { fullName, hashedPassword, extraGroups ? [ ] }: { + description = fullName; + extraGroups = [ "networkmanager" ] ++ extraGroups; + hashedPassword = hashedPassword; + isNormalUser = true; + }; +in +{ + home-manager.users = { + joey = { }; + kelcie = { }; + mia = { }; + }; + + # TODO: encrypt hashedPassword + users.users = { + joey = newUser { + fullName = "Joey"; + extraGroups = [ "wheel" ]; + hashedPassword = "$6$7OmwDaij6RSHCaLb$Lg6mmXBkGeawae1hD6F4MoNiEI7wIgr1RgcPQwZwheXACw4qTCt5gvvKO2iuCTxzU2K1iaymfK1fXf26hM/tE/"; + }; + kelcie = newUser { + fullName = "Kelcie"; + hashedPassword = "$6$/Lxs4mp.nZsCe.Ef$ZrMQxe0IFOi7RW0xjWcF94AQAeQuS0R5nbyvwlCDfHywvWGNQMYMjteQ0.NVy.NDpU6pTjXfGKOmwjBLgVz.4."; + }; + mia = newUser { + fullName = "Mia"; + hashedPassword = "$6$nvZH5gkrfk.nbfxJ$13W4fOzFD24BO4C3UrXFgSSwyj033e3tAxv9DMhgHFLaGxqvu/l1Qu.0mj9KCw1Gs9pf1HERmAJGxzle.GPWW."; + }; + }; +} + + \ No newline at end of file diff --git a/nixos.nix b/nixos.nix new file mode 100644 index 0000000..a74c0ce --- /dev/null +++ b/nixos.nix @@ -0,0 +1,28 @@ +{ inputs, outputs, pkgs, system, ... }: + +with inputs.nixpkgs.lib; + +let + mkHost = builtins.mapAttrs (host: extraModules: + nixosSystem { + inherit system; + + modules = [ + (outputs.hostModules + "/" + host) + { networking.hostName = mkForce host; } + outputs.commonHostModule + outputs.customOptions + inputs.nix-flatpak.nixosModules.nix-flatpak + inputs.home-manager.nixosModules.home-manager + inputs.impermanence.nixosModules.impermanence + inputs.lanzaboote.nixosModules.lanzaboote + ] ++ extraModules; + + specialArgs = { inherit inputs outputs pkgs; }; + }); +in +mkHost rec { + GPD-WinMax2 = Joe-Desktop; + Joe-Desktop = [ (outputs.userModules + "/jdigi.nix") ]; + Livingroom-PC = [ (outputs.userModules + "/livingroom-pc.nix") ]; +}