dendrify: comfy-station
264
flake-old.nix
Normal file
@@ -0,0 +1,264 @@
|
||||
{
|
||||
description = "Nixos config flake";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/release-25.11";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
sops-nix = {
|
||||
url = "github:Mic92/sops-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
disko.url = "github:nix-community/disko";
|
||||
disko.inputs.nixpkgs.follows = "nixpkgs";
|
||||
plasma-manager = {
|
||||
url = "github:pjones/plasma-manager";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.home-manager.follows = "home-manager";
|
||||
};
|
||||
firefox-addons = {
|
||||
url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
hyprland = {
|
||||
url = "github:hyprwm/Hyprland";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
hyprland-plugins = {
|
||||
url = "github:hyprwm/hyprland-plugins";
|
||||
inputs.hyprland.follows = "hyprland";
|
||||
};
|
||||
nixos-cosmic = {
|
||||
url = "github:lilyinstarlight/nixos-cosmic";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
dzgui-nix = {
|
||||
url = "github:lelgenio/dzgui-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
audio = {
|
||||
url = "github:polygon/audio.nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
nix-minecraft.url = "github:Infinidoge/nix-minecraft";
|
||||
nix-minecraft.inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
nixpkgs-unstable,
|
||||
nixos-hardware,
|
||||
home-manager,
|
||||
nixos-cosmic,
|
||||
audio,
|
||||
...
|
||||
} @ inputs: let
|
||||
system = "x86_64-linux";
|
||||
overlay-unstable = final: prev: {
|
||||
unstable = import nixpkgs-unstable {
|
||||
system = prev.system;
|
||||
config.allowUnfree = true;
|
||||
};
|
||||
};
|
||||
in {
|
||||
nixosConfigurations = {
|
||||
comfy-station = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = {
|
||||
inherit inputs;
|
||||
isHM = false;
|
||||
};
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
nixos-hardware.nixosModules.msi-b550-a-pro
|
||||
inputs.sops-nix.nixosModules.sops
|
||||
inputs.nix-minecraft.overlay
|
||||
inputs.nix-minecraft.nixosModules.minecraft-servers
|
||||
./modules
|
||||
./hosts/comfy-station/configuration.nix
|
||||
];
|
||||
};
|
||||
monolith = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = {
|
||||
inherit inputs;
|
||||
isHM = false;
|
||||
};
|
||||
modules = [
|
||||
({...}: {
|
||||
nixpkgs.overlays = [
|
||||
overlay-unstable
|
||||
self.overlays.default
|
||||
audio.overlays.default
|
||||
inputs.nix-minecraft.overlay
|
||||
];
|
||||
})
|
||||
({...}: {
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
nixpkgs.config.nvidia.acceptLicense = true;
|
||||
})
|
||||
{
|
||||
nix.settings = {
|
||||
substituters = ["https://cosmic.cachix.org/"];
|
||||
trusted-public-keys = ["cosmic.cachix.org-1:Dya9IyXD4xdBehWjrkPv6rtxpmMdRel02smYzA85dPE="];
|
||||
};
|
||||
}
|
||||
nixos-hardware.nixosModules.lenovo-thinkpad-t14-amd-gen1
|
||||
inputs.sops-nix.nixosModules.sops
|
||||
nixos-cosmic.nixosModules.default
|
||||
inputs.nix-minecraft.nixosModules.minecraft-servers
|
||||
./fixes/plasma-fix.nix
|
||||
./modules
|
||||
./hosts/monolith/configuration.nix
|
||||
];
|
||||
};
|
||||
harbor = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = {
|
||||
inherit inputs;
|
||||
isHM = false;
|
||||
};
|
||||
modules = [
|
||||
({...}: {
|
||||
nixpkgs.overlays = [
|
||||
overlay-unstable
|
||||
self.overlays.default
|
||||
audio.overlays.default
|
||||
inputs.nix-minecraft.overlay
|
||||
];
|
||||
})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.sops-nix.nixosModules.sops
|
||||
inputs.disko.nixosModules.disko
|
||||
inputs.nix-minecraft.nixosModules.minecraft-servers
|
||||
./modules
|
||||
./hosts/harbor/configuration.nix
|
||||
];
|
||||
};
|
||||
vm = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = {
|
||||
inherit inputs;
|
||||
};
|
||||
modules = [
|
||||
./hosts/vm/configuration.nix
|
||||
];
|
||||
};
|
||||
};
|
||||
homeConfigurations."jonas@comfy-station" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
# Specify your home configuration modules here, for example,
|
||||
# the path to your home.nix.
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||
inputs.sops-nix.homeManagerModules.sops
|
||||
./modules
|
||||
(./home + "/jonas@comfy-station.nix")
|
||||
];
|
||||
|
||||
# Optionally use extraSpecialArgs
|
||||
# to pass through arguments to home.nix
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
isHM = true;
|
||||
};
|
||||
};
|
||||
homeConfigurations."jonas@harbor" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
# Specify your home configuration modules here, for example,
|
||||
# the path to your home.nix.
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||
inputs.sops-nix.homeManagerModules.sops
|
||||
./modules
|
||||
(./home + "/jonas@harbor.nix")
|
||||
];
|
||||
|
||||
# Optionally use extraSpecialArgs
|
||||
# to pass through arguments to home.nix
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
isHM = true;
|
||||
};
|
||||
};
|
||||
homeConfigurations."jonas@monolith" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
# Specify your home configuration modules here, for example,
|
||||
# the path to your home.nix.
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||
inputs.sops-nix.homeManagerModules.sops
|
||||
./modules
|
||||
(./home + "/jonas@monolith.nix")
|
||||
];
|
||||
|
||||
# Optionally use extraSpecialArgs
|
||||
# to pass through arguments to home.nix
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
isHM = true;
|
||||
};
|
||||
};
|
||||
homeConfigurations."admin-jroeger" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
# Specify your home configuration modules here, for example,
|
||||
# the path to your home.nix.
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||
inputs.sops-nix.homeManagerModules.sops
|
||||
./modules
|
||||
./home/admin-jroeger.nix
|
||||
];
|
||||
|
||||
# Optionally use extraSpecialArgs
|
||||
# to pass through arguments to home.nix
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
isHM = true;
|
||||
};
|
||||
};
|
||||
|
||||
devShells.${system} = {
|
||||
bulk-transcode = (import ./pkgs/bulk-transcode/shell.nix) {pkgs = nixpkgs.legacyPackages.${system};};
|
||||
spotify-shortcuts = (import ./pkgs/spotify-shortcuts/shell.nix) {pkgs = nixpkgs.legacyPackages.${system};};
|
||||
};
|
||||
|
||||
overlays.default = import ./pkgs;
|
||||
|
||||
templates = {
|
||||
rust = {
|
||||
path = ./templates/rust;
|
||||
description = "A simple rust binary template";
|
||||
welcomeText = ''
|
||||
# Rust template
|
||||
This is a simple rust binary template.
|
||||
To build the project run `cargo build`.
|
||||
To run the project run `cargo run`.
|
||||
Before running nix build, make sure to run `cargo generate-lockfile` first.
|
||||
'';
|
||||
};
|
||||
cmake-c = {
|
||||
path = ./templates/cmake-c;
|
||||
description = "A simple cmake c project.";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
608
flake.lock
generated
@@ -1,38 +1,5 @@
|
||||
{
|
||||
"nodes": {
|
||||
"aquamarine": {
|
||||
"inputs": {
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprutils"
|
||||
],
|
||||
"hyprwayland-scanner": [
|
||||
"hyprland",
|
||||
"hyprwayland-scanner"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773436376,
|
||||
"narHash": "sha256-OUPRrprbgN27BXHuWkMAPSCfLLQ/uwpWghEfKYN2iAg=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "aquamarine",
|
||||
"rev": "43f10d24391692bba3d762931ee35e7f17f8e8b8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "aquamarine",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"audio": {
|
||||
"inputs": {
|
||||
"mucap": "mucap",
|
||||
@@ -142,22 +109,6 @@
|
||||
}
|
||||
},
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1767039857,
|
||||
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
|
||||
"owner": "NixOS",
|
||||
"repo": "flake-compat",
|
||||
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat_2": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1747046372,
|
||||
@@ -173,41 +124,21 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat_3": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1746162366,
|
||||
"narHash": "sha256-5SSSZ/oQkwfcAz/o/6TlejlVGqeK08wyREBQ5qFFPhM=",
|
||||
"owner": "nix-community",
|
||||
"repo": "flake-compat",
|
||||
"rev": "0f158086a2ecdbb138cd0429410e44994f1b7e4b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"gitignore": {
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"pre-commit-hooks",
|
||||
"nixpkgs"
|
||||
]
|
||||
"nixpkgs-lib": "nixpkgs-lib"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1709087332,
|
||||
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
||||
"lastModified": 1772408722,
|
||||
"narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
||||
"repo": "flake-parts",
|
||||
"rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
@@ -232,354 +163,18 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprcursor": {
|
||||
"inputs": {
|
||||
"hyprlang": [
|
||||
"hyprland",
|
||||
"hyprlang"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"import-tree": {
|
||||
"locked": {
|
||||
"lastModified": 1772461003,
|
||||
"narHash": "sha256-pVICsV7FtcEeVwg5y/LFh3XFUkVJninm/P1j/JHzEbM=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprcursor",
|
||||
"rev": "b62396457b9cfe2ebf24fe05404b09d2a40f8ed7",
|
||||
"lastModified": 1773693634,
|
||||
"narHash": "sha256-BtZ2dtkBdSUnFPPFc+n0kcMbgaTxzFNPv2iaO326Ffg=",
|
||||
"owner": "vic",
|
||||
"repo": "import-tree",
|
||||
"rev": "c41e7d58045f9057880b0d85e1152d6a4430dbf1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprcursor",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprgraphics": {
|
||||
"inputs": {
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprutils"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772461523,
|
||||
"narHash": "sha256-mI6A51do+hEUzeJKk9YSWfVHdI/SEEIBi2tp5Whq5mI=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprgraphics",
|
||||
"rev": "7d63c04b4a2dd5e59ef943b4b143f46e713df804",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprgraphics",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprland": {
|
||||
"inputs": {
|
||||
"aquamarine": "aquamarine",
|
||||
"hyprcursor": "hyprcursor",
|
||||
"hyprgraphics": "hyprgraphics",
|
||||
"hyprland-guiutils": "hyprland-guiutils",
|
||||
"hyprland-protocols": "hyprland-protocols",
|
||||
"hyprlang": "hyprlang",
|
||||
"hyprutils": "hyprutils",
|
||||
"hyprwayland-scanner": "hyprwayland-scanner",
|
||||
"hyprwire": "hyprwire",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"pre-commit-hooks": "pre-commit-hooks",
|
||||
"systems": "systems",
|
||||
"xdph": "xdph"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773926276,
|
||||
"narHash": "sha256-dasCo1RATJvJWjPaVkbXPvjbWE+4f69bnRNGwtsh7Ao=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "Hyprland",
|
||||
"rev": "ad46ff635bcf7b4877b03e97d8e85468f025f4a1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "Hyprland",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprland-guiutils": {
|
||||
"inputs": {
|
||||
"aquamarine": [
|
||||
"hyprland",
|
||||
"aquamarine"
|
||||
],
|
||||
"hyprgraphics": [
|
||||
"hyprland",
|
||||
"hyprgraphics"
|
||||
],
|
||||
"hyprlang": [
|
||||
"hyprland",
|
||||
"hyprlang"
|
||||
],
|
||||
"hyprtoolkit": "hyprtoolkit",
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprutils"
|
||||
],
|
||||
"hyprwayland-scanner": [
|
||||
"hyprland",
|
||||
"hyprwayland-scanner"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772467975,
|
||||
"narHash": "sha256-kipyuDBxrZq+beYpZqWzGvFWm4QbayW9agAvi94vDXY=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland-guiutils",
|
||||
"rev": "5e1c6b9025aaf4d578f3eff7c0eb1f0c197a9507",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland-guiutils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprland-plugins": {
|
||||
"inputs": {
|
||||
"hyprland": [
|
||||
"hyprland"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland-plugins",
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland-plugins",
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1771865848,
|
||||
"narHash": "sha256-xwNa+1D8WPsDnJtUofDrtyDCZKZotbUymzV/R5s+M0I=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland-plugins",
|
||||
"rev": "b85a56b9531013c79f2f3846fd6ee2ff014b8960",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland-plugins",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprland-protocols": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772460177,
|
||||
"narHash": "sha256-/6G/MsPvtn7bc4Y32pserBT/Z4SUUdBd4XYJpOEKVR4=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland-protocols",
|
||||
"rev": "1cb6db5fd6bb8aee419f4457402fa18293ace917",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland-protocols",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprlang": {
|
||||
"inputs": {
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprutils"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772459629,
|
||||
"narHash": "sha256-/iwvNUYShmmnwmz/czEUh6+0eF5vCMv0xtDW0STPIuM=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprlang",
|
||||
"rev": "7615ee388de18239a4ab1400946f3d0e498a8186",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprlang",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprtoolkit": {
|
||||
"inputs": {
|
||||
"aquamarine": [
|
||||
"hyprland",
|
||||
"hyprland-guiutils",
|
||||
"aquamarine"
|
||||
],
|
||||
"hyprgraphics": [
|
||||
"hyprland",
|
||||
"hyprland-guiutils",
|
||||
"hyprgraphics"
|
||||
],
|
||||
"hyprlang": [
|
||||
"hyprland",
|
||||
"hyprland-guiutils",
|
||||
"hyprlang"
|
||||
],
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprland-guiutils",
|
||||
"hyprutils"
|
||||
],
|
||||
"hyprwayland-scanner": [
|
||||
"hyprland",
|
||||
"hyprland-guiutils",
|
||||
"hyprwayland-scanner"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"hyprland-guiutils",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"hyprland-guiutils",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772462885,
|
||||
"narHash": "sha256-5pHXrQK9zasMnIo6yME6EOXmWGFMSnCITcfKshhKJ9I=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprtoolkit",
|
||||
"rev": "9af245a69fa6b286b88ddfc340afd288e00a6998",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprtoolkit",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprutils": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773436263,
|
||||
"narHash": "sha256-n+2xFJngUkBqUJD5FsbVnYEHBTyDFSqtBIwQIGPXWWo=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprutils",
|
||||
"rev": "5e228db6821380a5875d5643176c5c46a47b8134",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprutils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprwayland-scanner": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772459835,
|
||||
"narHash": "sha256-978jRz/y/9TKmZb/qD4lEYHCQGHpEXGqy+8X2lFZsak=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprwayland-scanner",
|
||||
"rev": "0a692d4a645165eebd65f109146b8861e3a925e7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprwayland-scanner",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"hyprwire": {
|
||||
"inputs": {
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprutils"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1773074819,
|
||||
"narHash": "sha256-qRqYnXiKoJLRTcfaRukn7EifmST2IVBUMZOeZMAc5UA=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprwire",
|
||||
"rev": "f68afd0e73687598cc2774804fedad76693046f0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprwire",
|
||||
"owner": "vic",
|
||||
"repo": "import-tree",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
@@ -653,11 +248,11 @@
|
||||
},
|
||||
"nix-minecraft": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat_2",
|
||||
"flake-compat": "flake-compat",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": "systems_2"
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1774407052,
|
||||
@@ -673,29 +268,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixos-cosmic": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat_3",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs-stable": "nixpkgs-stable",
|
||||
"rust-overlay": "rust-overlay_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1751591814,
|
||||
"narHash": "sha256-A4lgvuj4v+Pr8MniXz1FBG0DXOygi8tTECR+j53FMhM=",
|
||||
"owner": "lilyinstarlight",
|
||||
"repo": "nixos-cosmic",
|
||||
"rev": "fef2d0c78c4e4d6c600a88795af193131ff51bdc",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "lilyinstarlight",
|
||||
"repo": "nixos-cosmic",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixos-hardware": {
|
||||
"locked": {
|
||||
"lastModified": 1773533765,
|
||||
@@ -728,19 +300,18 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable": {
|
||||
"nixpkgs-lib": {
|
||||
"locked": {
|
||||
"lastModified": 1751048012,
|
||||
"narHash": "sha256-MYbotu4UjWpTsq01wglhN5xDRfZYLFtNk7SBY0BcjkU=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "a684c58d46ebbede49f280b653b9e56100aa3877",
|
||||
"lastModified": 1772328832,
|
||||
"narHash": "sha256-e+/T/pmEkLP6BHhYjx6GmwP5ivonQQn0bJdH9YrRB+Q=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"rev": "c185c7a5e5dd8f9add5b2f8ebeff00888b070742",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-24.11",
|
||||
"repo": "nixpkgs",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixpkgs.lib",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
@@ -760,67 +331,19 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"plasma-manager": {
|
||||
"inputs": {
|
||||
"home-manager": [
|
||||
"home-manager"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772361940,
|
||||
"narHash": "sha256-B1Cz+ydL1iaOnGlwOFld/C8lBECPtzhiy/pP93/CuyY=",
|
||||
"owner": "pjones",
|
||||
"repo": "plasma-manager",
|
||||
"rev": "a4b33606111c9c5dcd10009042bb710307174f51",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "pjones",
|
||||
"repo": "plasma-manager",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"pre-commit-hooks": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat",
|
||||
"gitignore": "gitignore",
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772893680,
|
||||
"narHash": "sha256-JDqZMgxUTCq85ObSaFw0HhE+lvdOre1lx9iI6vYyOEs=",
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"rev": "8baab586afc9c9b57645a734c820e4ac0a604af9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"audio": "audio",
|
||||
"disko": "disko",
|
||||
"dzgui-nix": "dzgui-nix",
|
||||
"firefox-addons": "firefox-addons",
|
||||
"flake-parts": "flake-parts",
|
||||
"home-manager": "home-manager",
|
||||
"hyprland": "hyprland",
|
||||
"hyprland-plugins": "hyprland-plugins",
|
||||
"import-tree": "import-tree",
|
||||
"nix-minecraft": "nix-minecraft",
|
||||
"nixos-cosmic": "nixos-cosmic",
|
||||
"nixos-hardware": "nixos-hardware",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||
"plasma-manager": "plasma-manager",
|
||||
"sops-nix": "sops-nix"
|
||||
}
|
||||
},
|
||||
@@ -863,27 +386,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"rust-overlay_2": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixos-cosmic",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1751251399,
|
||||
"narHash": "sha256-y+viCuy/eKKpkX1K2gDvXIJI/yzvy6zA3HObapz9XZ0=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "b22d5ee8c60ed1291521f2dde48784edd6bf695b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"sops-nix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
@@ -905,21 +407,6 @@
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1689347949,
|
||||
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-linux",
|
||||
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-linux",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_2": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
@@ -933,47 +420,6 @@
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"xdph": {
|
||||
"inputs": {
|
||||
"hyprland-protocols": [
|
||||
"hyprland",
|
||||
"hyprland-protocols"
|
||||
],
|
||||
"hyprlang": [
|
||||
"hyprland",
|
||||
"hyprlang"
|
||||
],
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprutils"
|
||||
],
|
||||
"hyprwayland-scanner": [
|
||||
"hyprland",
|
||||
"hyprwayland-scanner"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1772669058,
|
||||
"narHash": "sha256-XhnY0aRuDo5LT8pmJVPofPOgO2hAR7T+XRoaQxtNPzQ=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "xdg-desktop-portal-hyprland",
|
||||
"rev": "906d0ac159803a7df2dc1f948df9327670380f69",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hyprwm",
|
||||
"repo": "xdg-desktop-portal-hyprland",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
|
||||
238
flake.nix
@@ -4,6 +4,8 @@
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
import-tree.url = "github:vic/import-tree";
|
||||
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
|
||||
home-manager = {
|
||||
url = "github:nix-community/home-manager/release-25.11";
|
||||
@@ -15,27 +17,10 @@
|
||||
};
|
||||
disko.url = "github:nix-community/disko";
|
||||
disko.inputs.nixpkgs.follows = "nixpkgs";
|
||||
plasma-manager = {
|
||||
url = "github:pjones/plasma-manager";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
inputs.home-manager.follows = "home-manager";
|
||||
};
|
||||
firefox-addons = {
|
||||
url = "gitlab:rycee/nur-expressions?dir=pkgs/firefox-addons";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
hyprland = {
|
||||
url = "github:hyprwm/Hyprland";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
hyprland-plugins = {
|
||||
url = "github:hyprwm/hyprland-plugins";
|
||||
inputs.hyprland.follows = "hyprland";
|
||||
};
|
||||
nixos-cosmic = {
|
||||
url = "github:lilyinstarlight/nixos-cosmic";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
dzgui-nix = {
|
||||
url = "github:lelgenio/dzgui-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
@@ -48,217 +33,16 @@
|
||||
nix-minecraft.inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
nixpkgs-unstable,
|
||||
nixos-hardware,
|
||||
home-manager,
|
||||
nixos-cosmic,
|
||||
audio,
|
||||
outputs = inputs @ {
|
||||
flake-parts,
|
||||
import-tree,
|
||||
...
|
||||
} @ inputs: let
|
||||
system = "x86_64-linux";
|
||||
overlay-unstable = final: prev: {
|
||||
unstable = import nixpkgs-unstable {
|
||||
system = prev.system;
|
||||
config.allowUnfree = true;
|
||||
};
|
||||
};
|
||||
in {
|
||||
nixosConfigurations = {
|
||||
comfy-station = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = {
|
||||
inherit inputs;
|
||||
isHM = false;
|
||||
};
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
nixos-hardware.nixosModules.msi-b550-a-pro
|
||||
inputs.sops-nix.nixosModules.sops
|
||||
inputs.nix-minecraft.overlay
|
||||
inputs.nix-minecraft.nixosModules.minecraft-servers
|
||||
./modules
|
||||
./hosts/comfy-station/configuration.nix
|
||||
];
|
||||
};
|
||||
monolith = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = {
|
||||
inherit inputs;
|
||||
isHM = false;
|
||||
};
|
||||
modules = [
|
||||
({...}: {
|
||||
nixpkgs.overlays = [
|
||||
overlay-unstable
|
||||
self.overlays.default
|
||||
audio.overlays.default
|
||||
inputs.nix-minecraft.overlay
|
||||
];
|
||||
})
|
||||
({...}: {
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
nixpkgs.config.nvidia.acceptLicense = true;
|
||||
})
|
||||
{
|
||||
nix.settings = {
|
||||
substituters = ["https://cosmic.cachix.org/"];
|
||||
trusted-public-keys = ["cosmic.cachix.org-1:Dya9IyXD4xdBehWjrkPv6rtxpmMdRel02smYzA85dPE="];
|
||||
};
|
||||
}
|
||||
nixos-hardware.nixosModules.lenovo-thinkpad-t14-amd-gen1
|
||||
inputs.sops-nix.nixosModules.sops
|
||||
nixos-cosmic.nixosModules.default
|
||||
inputs.nix-minecraft.nixosModules.minecraft-servers
|
||||
./fixes/plasma-fix.nix
|
||||
./modules
|
||||
./hosts/monolith/configuration.nix
|
||||
];
|
||||
};
|
||||
harbor = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = {
|
||||
inherit inputs;
|
||||
isHM = false;
|
||||
};
|
||||
modules = [
|
||||
({...}: {
|
||||
nixpkgs.overlays = [
|
||||
overlay-unstable
|
||||
self.overlays.default
|
||||
audio.overlays.default
|
||||
inputs.nix-minecraft.overlay
|
||||
];
|
||||
})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.sops-nix.nixosModules.sops
|
||||
inputs.disko.nixosModules.disko
|
||||
inputs.nix-minecraft.nixosModules.minecraft-servers
|
||||
./modules
|
||||
./hosts/harbor/configuration.nix
|
||||
];
|
||||
};
|
||||
vm = nixpkgs.lib.nixosSystem {
|
||||
inherit system;
|
||||
specialArgs = {
|
||||
inherit inputs;
|
||||
};
|
||||
modules = [
|
||||
./hosts/vm/configuration.nix
|
||||
];
|
||||
};
|
||||
};
|
||||
homeConfigurations."jonas@comfy-station" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
# Specify your home configuration modules here, for example,
|
||||
# the path to your home.nix.
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||
inputs.sops-nix.homeManagerModules.sops
|
||||
./modules
|
||||
(./home + "/jonas@comfy-station.nix")
|
||||
}:
|
||||
flake-parts.lib.mkFlake {inherit inputs;} {
|
||||
systems = ["x86_64-linux"];
|
||||
imports = [
|
||||
./hosts/comfy-station
|
||||
(import-tree ./modules)
|
||||
];
|
||||
|
||||
# Optionally use extraSpecialArgs
|
||||
# to pass through arguments to home.nix
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
isHM = true;
|
||||
};
|
||||
};
|
||||
homeConfigurations."jonas@harbor" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
# Specify your home configuration modules here, for example,
|
||||
# the path to your home.nix.
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||
inputs.sops-nix.homeManagerModules.sops
|
||||
./modules
|
||||
(./home + "/jonas@harbor.nix")
|
||||
];
|
||||
|
||||
# Optionally use extraSpecialArgs
|
||||
# to pass through arguments to home.nix
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
isHM = true;
|
||||
};
|
||||
};
|
||||
homeConfigurations."jonas@monolith" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
# Specify your home configuration modules here, for example,
|
||||
# the path to your home.nix.
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||
inputs.sops-nix.homeManagerModules.sops
|
||||
./modules
|
||||
(./home + "/jonas@monolith.nix")
|
||||
];
|
||||
|
||||
# Optionally use extraSpecialArgs
|
||||
# to pass through arguments to home.nix
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
isHM = true;
|
||||
};
|
||||
};
|
||||
homeConfigurations."admin-jroeger" = home-manager.lib.homeManagerConfiguration {
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
|
||||
# Specify your home configuration modules here, for example,
|
||||
# the path to your home.nix.
|
||||
modules = [
|
||||
({...}: {nixpkgs.overlays = [overlay-unstable self.overlays.default audio.overlays.default];})
|
||||
({...}: {nixpkgs.config.allowUnfree = true;})
|
||||
inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||
inputs.sops-nix.homeManagerModules.sops
|
||||
./modules
|
||||
./home/admin-jroeger.nix
|
||||
];
|
||||
|
||||
# Optionally use extraSpecialArgs
|
||||
# to pass through arguments to home.nix
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
isHM = true;
|
||||
};
|
||||
};
|
||||
|
||||
devShells.${system} = {
|
||||
bulk-transcode = (import ./pkgs/bulk-transcode/shell.nix) {pkgs = nixpkgs.legacyPackages.${system};};
|
||||
spotify-shortcuts = (import ./pkgs/spotify-shortcuts/shell.nix) {pkgs = nixpkgs.legacyPackages.${system};};
|
||||
};
|
||||
|
||||
overlays.default = import ./pkgs;
|
||||
|
||||
templates = {
|
||||
rust = {
|
||||
path = ./templates/rust;
|
||||
description = "A simple rust binary template";
|
||||
welcomeText = ''
|
||||
# Rust template
|
||||
This is a simple rust binary template.
|
||||
To build the project run `cargo build`.
|
||||
To run the project run `cargo run`.
|
||||
Before running nix build, make sure to run `cargo generate-lockfile` first.
|
||||
'';
|
||||
};
|
||||
cmake-c = {
|
||||
path = ./templates/cmake-c;
|
||||
description = "A simple cmake c project.";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -28,23 +28,13 @@
|
||||
programs.zsh.enable = true;
|
||||
|
||||
# hive modules
|
||||
hive.nix-scripts.enable = true;
|
||||
hive.displayManager.name = "sddm";
|
||||
hive.hyprland.enable = true;
|
||||
hive.kwallet.enable = true;
|
||||
hive.kwallet.forUsers = ["jonas"];
|
||||
hive.virt-manager.enable = true;
|
||||
hive.virt-manager.forUsers = ["jonas"];
|
||||
hive.bluetooth.enable = true;
|
||||
hive.sound.enable = true;
|
||||
hive.yubikey.enable = true;
|
||||
hive.wg.client.enable = true;
|
||||
hive.wg.client.privateKeyFile = config.sops.secrets.wg-priv.path;
|
||||
hive.wg.client.peer = "comfy-station";
|
||||
hive.programs.games.enable = true;
|
||||
hive.programs.games.steam = true;
|
||||
hive.programs.creative = {
|
||||
enable = true;
|
||||
image-management = true;
|
||||
image-raw-processing = true;
|
||||
video-editing-light = true;
|
||||
|
||||
29
hosts/comfy-station/default.nix
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
inputs,
|
||||
self,
|
||||
...
|
||||
}: {
|
||||
flake.nixosConfigurations.comfy-station = inputs.nixpkgs.lib.nixosSystem {
|
||||
modules = [
|
||||
({...}: {
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
nixpkgs.overlays = [self.overlays.unstable self.overlays.bulk-transcode];
|
||||
})
|
||||
|
||||
./configuration.nix
|
||||
|
||||
inputs.nixos-hardware.nixosModules.lenovo-thinkpad-t14-amd-gen1
|
||||
inputs.sops-nix.nixosModules.sops
|
||||
self.nixosModules.nix-scripts
|
||||
self.nixosModules.hyprland
|
||||
self.nixosModules.kwallet
|
||||
self.nixosModules.virt-manager
|
||||
self.nixosModules.bluetooth
|
||||
self.nixosModules.sound
|
||||
self.nixosModules.yubikey
|
||||
self.nixosModules.wireguard-client
|
||||
self.nixosModules.games
|
||||
self.nixosModules.creative
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,12 +1,5 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
isHM,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.nix-scripts;
|
||||
home-rebuild =
|
||||
{...}: let
|
||||
home-rebuild = pkgs:
|
||||
pkgs.writeShellScriptBin ".home-rebuild"
|
||||
''
|
||||
set -e
|
||||
@@ -20,7 +13,7 @@
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -am "Home $gen by $by"
|
||||
popd
|
||||
'';
|
||||
rebuild =
|
||||
rebuild = pkgs:
|
||||
pkgs.writeShellScriptBin ".nixos-rebuild"
|
||||
''
|
||||
set -e
|
||||
@@ -34,7 +27,7 @@
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -am "System $gen by $by"
|
||||
popd
|
||||
'';
|
||||
upgrade =
|
||||
upgrade = pkgs:
|
||||
pkgs.writeShellScriptBin ".nixos-upgrade"
|
||||
''
|
||||
set -e
|
||||
@@ -63,7 +56,7 @@
|
||||
${pkgs.git}/bin/git branch -D "$branch_staging"
|
||||
popd
|
||||
'';
|
||||
update =
|
||||
update = pkgs:
|
||||
pkgs.writeShellScriptBin ".nixos-update"
|
||||
''
|
||||
set -e
|
||||
@@ -94,25 +87,16 @@
|
||||
popd
|
||||
'';
|
||||
in {
|
||||
options = {
|
||||
hive.nix-scripts.enable = lib.mkEnableOption "Enable the nix build/update scripts";
|
||||
flake.nixosModules.nix-scripts = {pkgs, ...}: {
|
||||
environment.systemPackages = [
|
||||
(rebuild pkgs)
|
||||
(upgrade pkgs)
|
||||
(update pkgs)
|
||||
];
|
||||
};
|
||||
flake.homeModules.nix-scripts = {pkgs, ...}: {
|
||||
home.packages = [
|
||||
(home-rebuild pkgs)
|
||||
];
|
||||
};
|
||||
|
||||
config =
|
||||
lib.mkIf cfg.enable
|
||||
(
|
||||
if isHM
|
||||
then {
|
||||
home.packages = [
|
||||
home-rebuild
|
||||
];
|
||||
}
|
||||
else {
|
||||
environment.systemPackages = [
|
||||
rebuild
|
||||
upgrade
|
||||
update
|
||||
];
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.kwallet;
|
||||
in {
|
||||
options.hive.kwallet = {
|
||||
enable = lib.mkEnableOption "Enable kwallet";
|
||||
forUsers = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.str;
|
||||
default = [];
|
||||
description = ''
|
||||
List of users that should unlock kwallet via pam.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = with pkgs.kdePackages; [
|
||||
kwallet
|
||||
kwalletmanager
|
||||
];
|
||||
security.pam.services = builtins.listToAttrs (map (user: {
|
||||
name = user;
|
||||
value = {
|
||||
kwallet.enable = true;
|
||||
kwallet.forceRun = true;
|
||||
kwallet.package = pkgs.kdePackages.kwallet-pam;
|
||||
};
|
||||
})
|
||||
cfg.forUsers);
|
||||
};
|
||||
}
|
||||
56
modules/desktop/hyprland.nix
Normal file
@@ -0,0 +1,56 @@
|
||||
{
|
||||
flake.nixosModules.hyprland = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.displayManager;
|
||||
in {
|
||||
options.hive.displayManager = with lib; {
|
||||
autologin = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = "The autologin username or null for no autologin.";
|
||||
};
|
||||
};
|
||||
config = {
|
||||
services.xserver.enable = true;
|
||||
services.xserver = {
|
||||
xkb.layout = "de";
|
||||
xkb.variant = "";
|
||||
xkb.options = "caps:ctrl_modifier";
|
||||
};
|
||||
services.displayManager.autoLogin.enable = cfg.autologin != null;
|
||||
services.displayManager.autoLogin.user = cfg.autologin;
|
||||
|
||||
services.libinput.enable = true;
|
||||
services.dbus.enable = true;
|
||||
services.displayManager.sddm = {
|
||||
enable = true;
|
||||
wayland.enable = true;
|
||||
};
|
||||
|
||||
xdg.portal = {
|
||||
enable = true;
|
||||
extraPortals = with pkgs; [
|
||||
xdg-desktop-portal-wlr
|
||||
xdg-desktop-portal-hyprland
|
||||
kdePackages.xdg-desktop-portal-kde
|
||||
];
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [spaceFM];
|
||||
|
||||
services.udisks2.enable = true;
|
||||
|
||||
programs.hyprland = {
|
||||
enable = true;
|
||||
withUWSM = true;
|
||||
xwayland.enable = true;
|
||||
};
|
||||
programs.hyprlock.enable = true;
|
||||
security.pam.services.hyprlock = {};
|
||||
};
|
||||
};
|
||||
}
|
||||
36
modules/desktop/kwallet.nix
Normal file
@@ -0,0 +1,36 @@
|
||||
{
|
||||
flake.nixosModules.kwallet = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.kwallet;
|
||||
in {
|
||||
options.hive.kwallet = {
|
||||
forUsers = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.str;
|
||||
default = [];
|
||||
description = ''
|
||||
List of users that should unlock kwallet via pam.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
environment.systemPackages = with pkgs.kdePackages; [
|
||||
kwallet
|
||||
kwalletmanager
|
||||
];
|
||||
security.pam.services = builtins.listToAttrs (map (user: {
|
||||
name = user;
|
||||
value = {
|
||||
kwallet.enable = true;
|
||||
kwallet.forceRun = true;
|
||||
kwallet.package = pkgs.kdePackages.kwallet-pam;
|
||||
};
|
||||
})
|
||||
cfg.forUsers);
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,20 +1,5 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.bluetooth;
|
||||
in {
|
||||
options = {
|
||||
hive.bluetooth.enable = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Enable Bluetooth";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
# Enable Bluetooth
|
||||
flake.nixosModules.bluetooth = {
|
||||
hardware.bluetooth.enable = true;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,75 +1,72 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.sound;
|
||||
in {
|
||||
options = {
|
||||
hive.sound = {
|
||||
enable = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Enable sound with pipewire.";
|
||||
};
|
||||
noisetorch = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Enable Noisetorch for noise cancellation.";
|
||||
};
|
||||
noisetorch-threshold = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = -1;
|
||||
description = "Set the noise cancellation threshold for Noisetorch.";
|
||||
flake.nixosModules.sound = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.sound;
|
||||
in {
|
||||
options = {
|
||||
hive.sound = {
|
||||
noisetorch = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Enable Noisetorch for noise cancellation.";
|
||||
};
|
||||
noisetorch-threshold = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = -1;
|
||||
description = "Set the noise cancellation threshold for Noisetorch.";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
# Enable sound with pipewire.
|
||||
services.pulseaudio.enable = false;
|
||||
security.rtkit.enable = true;
|
||||
services.pipewire = {
|
||||
enable = true;
|
||||
alsa.enable = true;
|
||||
alsa.support32Bit = true;
|
||||
pulse.enable = true;
|
||||
# If you want to use JACK applications, uncomment this
|
||||
#jack.enable = true;
|
||||
config = {
|
||||
# Enable sound with pipewire.
|
||||
services.pulseaudio.enable = false;
|
||||
security.rtkit.enable = true;
|
||||
services.pipewire = {
|
||||
enable = true;
|
||||
alsa.enable = true;
|
||||
alsa.support32Bit = true;
|
||||
pulse.enable = true;
|
||||
# If you want to use JACK applications, uncomment this
|
||||
#jack.enable = true;
|
||||
|
||||
# use the example session manager (no others are packaged yet so this is enabled by default,
|
||||
# no need to redefine it in your config for now)
|
||||
#media-session.enable = true;
|
||||
};
|
||||
programs.noisetorch.enable = cfg.noisetorch;
|
||||
systemd.user.services.noisetorch-autoload = lib.mkIf cfg.noisetorch {
|
||||
description = "Automatically load Noisetorch on user login";
|
||||
after = ["pipewire.service"];
|
||||
requires = ["pipewire.service"];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${pkgs.writeShellScript "load-noisetorch" ''
|
||||
set -euo pipefail
|
||||
NOISETORCH="${pkgs.noisetorch}/bin/noisetorch"
|
||||
WPCTL="${pkgs.wireplumber}/bin/wpctl"
|
||||
GREP="${pkgs.gnugrep}/bin/grep"
|
||||
AWK="${pkgs.gawk}/bin/awk"
|
||||
HEAD="${pkgs.coreutils}/bin/head"
|
||||
|
||||
sleep 2
|
||||
$NOISETORCH -i -t ${toString cfg.noisetorch-threshold};
|
||||
sleep 2
|
||||
FILTER_ID=$($WPCTL status | $GREP NoiseTorch | $AWK 'match($0, /[0-9]+(\.[0-9]+)?/) { print substr($0, RSTART, RLENGTH) }' | head -n1)
|
||||
if [ -n "$FILTER_ID" ]; then
|
||||
$WPCTL set-default $FILTER_ID
|
||||
else
|
||||
echo "Noisetorch filter not found, skipping setting default source."
|
||||
fi
|
||||
''}";
|
||||
ExecStop = "${pkgs.noisetorch}/bin/noisetorch -u";
|
||||
RemainAfterExit = true;
|
||||
# use the example session manager (no others are packaged yet so this is enabled by default,
|
||||
# no need to redefine it in your config for now)
|
||||
#media-session.enable = true;
|
||||
};
|
||||
programs.noisetorch.enable = cfg.noisetorch;
|
||||
systemd.user.services.noisetorch-autoload = lib.mkIf cfg.noisetorch {
|
||||
description = "Automatically load Noisetorch on user login";
|
||||
after = ["pipewire.service"];
|
||||
requires = ["pipewire.service"];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${pkgs.writeShellScript "load-noisetorch" ''
|
||||
set -euo pipefail
|
||||
NOISETORCH="${pkgs.noisetorch}/bin/noisetorch"
|
||||
WPCTL="${pkgs.wireplumber}/bin/wpctl"
|
||||
GREP="${pkgs.gnugrep}/bin/grep"
|
||||
AWK="${pkgs.gawk}/bin/awk"
|
||||
HEAD="${pkgs.coreutils}/bin/head"
|
||||
|
||||
sleep 2
|
||||
$NOISETORCH -i -t ${toString cfg.noisetorch-threshold};
|
||||
sleep 2
|
||||
FILTER_ID=$($WPCTL status | $GREP NoiseTorch | $AWK 'match($0, /[0-9]+(\.[0-9]+)?/) { print substr($0, RSTART, RLENGTH) }' | head -n1)
|
||||
if [ -n "$FILTER_ID" ]; then
|
||||
$WPCTL set-default $FILTER_ID
|
||||
else
|
||||
echo "Noisetorch filter not found, skipping setting default source."
|
||||
fi
|
||||
''}";
|
||||
ExecStop = "${pkgs.noisetorch}/bin/noisetorch -u";
|
||||
RemainAfterExit = true;
|
||||
};
|
||||
wantedBy = ["default.target"];
|
||||
};
|
||||
wantedBy = ["default.target"];
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,20 +1,5 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.yubikey;
|
||||
in {
|
||||
options = {
|
||||
hive.yubikey.enable = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Enable Yubikey support.";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
flake.nixosModules.yubikey = {pkgs, ...}: {
|
||||
services.udev.packages = with pkgs; [
|
||||
yubikey-personalization
|
||||
];
|
||||
|
||||
@@ -1,35 +1,36 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.wg.client;
|
||||
peers = import ./peers.nix {inherit lib;};
|
||||
in {
|
||||
options.hive.wg.client = {
|
||||
enable = lib.mkEnableOption "Enable WireGuard client";
|
||||
autoConnect = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Automatically connect to the WireGuard server with systemd";
|
||||
flake.nixosModules.wireguard-client = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.wg.client;
|
||||
peers = import ./_peers.nix {inherit lib;};
|
||||
in {
|
||||
options.hive.wg.client = {
|
||||
autoConnect = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Automatically connect to the WireGuard server with systemd";
|
||||
};
|
||||
peer = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
example = "comfy-station";
|
||||
description = "The name of the peer defined in peers.nix to incarnate";
|
||||
};
|
||||
privateKeyFile = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
description = "Path to the private key file for the WireGuard client";
|
||||
};
|
||||
};
|
||||
peer = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
example = "comfy-station";
|
||||
description = "The name of the peer defined in peers.nix to incarnate";
|
||||
};
|
||||
privateKeyFile = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
description = "Path to the private key file for the WireGuard client";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
networking.wg-quick.interfaces.wg0 = {
|
||||
address = peers.clientAddress cfg.peer;
|
||||
inherit (cfg) privateKeyFile;
|
||||
autostart = cfg.autoConnect;
|
||||
peers = peers.forClient cfg.peer;
|
||||
config = {
|
||||
networking.wg-quick.interfaces.wg0 = {
|
||||
address = peers.clientAddress cfg.peer;
|
||||
inherit (cfg) privateKeyFile;
|
||||
autostart = cfg.autoConnect;
|
||||
peers = peers.forClient cfg.peer;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
{...}: {
|
||||
imports = [./client.nix ./server.nix];
|
||||
}
|
||||
@@ -1,46 +1,47 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.wg.server;
|
||||
peers = import ./peers.nix {inherit lib;};
|
||||
in {
|
||||
options.hive.wg.server = {
|
||||
enable = lib.mkEnableOption "Enable WireGuard server";
|
||||
port = lib.mkOption {
|
||||
type = lib.types.port;
|
||||
default = 51820;
|
||||
description = "Port for WireGuard server";
|
||||
flake.nixosModules.wireguard-server = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.wg.server;
|
||||
peers = import ./peers.nix {inherit lib;};
|
||||
in {
|
||||
options.hive.wg.server = {
|
||||
port = lib.mkOption {
|
||||
type = lib.types.port;
|
||||
default = 51820;
|
||||
description = "Port for WireGuard server";
|
||||
};
|
||||
privateKeyFile = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
description = "Path to the private key file for the WireGuard server";
|
||||
};
|
||||
};
|
||||
privateKeyFile = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
description = "Path to the private key file for the WireGuard server";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
# Firewall rule
|
||||
networking.firewall.allowedUDPPorts = [cfg.port];
|
||||
config = {
|
||||
# Firewall rule
|
||||
networking.firewall.allowedUDPPorts = [cfg.port];
|
||||
|
||||
# Interface without internet routing
|
||||
networking.wireguard.interfaces."wg0" = {
|
||||
ips = ["10.10.10.1/24"];
|
||||
listenPort = cfg.port;
|
||||
inherit (cfg) privateKeyFile;
|
||||
# Interface without internet routing
|
||||
networking.wireguard.interfaces."wg0" = {
|
||||
ips = ["10.10.10.1/24"];
|
||||
listenPort = cfg.port;
|
||||
inherit (cfg) privateKeyFile;
|
||||
|
||||
peers = peers.forServer;
|
||||
peers = peers.forServer;
|
||||
|
||||
# Allow p2p traffic
|
||||
postSetup = ''
|
||||
${pkgs.iptables}/bin/iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT
|
||||
'';
|
||||
# Allow p2p traffic
|
||||
postSetup = ''
|
||||
${pkgs.iptables}/bin/iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT
|
||||
'';
|
||||
|
||||
# Undo the above
|
||||
postShutdown = ''
|
||||
${pkgs.iptables}/bin/iptables -D FORWARD -i wg0 -o wg0 -j ACCEPT
|
||||
'';
|
||||
# Undo the above
|
||||
postShutdown = ''
|
||||
${pkgs.iptables}/bin/iptables -D FORWARD -i wg0 -o wg0 -j ACCEPT
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
8
modules/overlays/unstable.nix
Normal file
@@ -0,0 +1,8 @@
|
||||
{inputs, ...}: {
|
||||
flake.overlays.unstable = final: prev: {
|
||||
unstable = import inputs.nixpkgs-unstable {
|
||||
system = prev.system;
|
||||
config.allowUnfree = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
1
modules/packages/bulk-transcode/.envrc
Normal file
@@ -0,0 +1 @@
|
||||
use flake ../../#bulk-transcode --show-trace
|
||||
35
modules/packages/bulk-transcode/_derivation.nix
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
bash,
|
||||
coreutils,
|
||||
ffmpeg,
|
||||
findutils,
|
||||
fzf,
|
||||
gum,
|
||||
lib,
|
||||
makeWrapper,
|
||||
stdenv,
|
||||
tree,
|
||||
...
|
||||
}:
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
name = "bulk-transcode";
|
||||
src = ./.;
|
||||
|
||||
buildInputs = [
|
||||
bash
|
||||
coreutils
|
||||
ffmpeg
|
||||
findutils
|
||||
fzf
|
||||
gum
|
||||
makeWrapper
|
||||
tree
|
||||
];
|
||||
|
||||
installPhase = ''
|
||||
install -Dm755 bulk-transcode.sh $out/bin/bulk-transcode
|
||||
|
||||
wrapProgram $out/bin/bulk-transcode \
|
||||
--set PATH "${lib.makeBinPath finalAttrs.buildInputs}"
|
||||
'';
|
||||
})
|
||||
7
modules/packages/bulk-transcode/_shell.nix
Normal file
@@ -0,0 +1,7 @@
|
||||
{pkgs ? import <nixpkgs> {}}: let
|
||||
bin = pkgs.callPackage ./derivation.nix {};
|
||||
in
|
||||
pkgs.mkShell {
|
||||
name = "bulk-transcode";
|
||||
inputsFrom = [bin];
|
||||
}
|
||||
96
modules/packages/bulk-transcode/bulk-transcode.sh
Normal file
@@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
declare -rA presets=(
|
||||
[davinci-resolve]="-c:v dnxhd -profile:v dnxhr_hq -pix_fmt yuv422p -c:a pcm_s16le"
|
||||
[instagram]="-vf scale='if(gte(iw/ih,1),1920,-1)':'if(gte(iw/ih,1),-1,1920)':flags=lanczos -r 30 -c:v libx264 -profile:v high -level 4.1 -pix_fmt yuv420p -preset slow -crf 18 -bf 2 -g 15 -keyint_min 15 -x264-params \"open-gop=0:cabac=1:b-pyramid=none\" -movflags +faststart -c:a aac -b:a 96k"
|
||||
[insta-4k]="-r 30 -c:v libx264 -profile:v high -level 4.1 -pix_fmt yuv420p -preset slow -crf 18 -bf 2 -g 15 -keyint_min 15 -x264-params \"open-gop=0:cabac=1:b-pyramid=none\" -movflags +faststart -c:a aac -b:a 96k"
|
||||
[storage-hevc]="-c:v libx265 -preset slower -crf 18 -pix_fmt yuv420p10le -x265-params aq-mode=3:aq-strength=1.0:psy-rd=1.8:psy-rdoq=1.0 -c:a copy"
|
||||
[storage-av1]="-c:v libsvtav1 -preset 6 -crf 28 -pix_fmt yuv420p -g 240 -svtav1-params tune=0:aq-mode=2 -c:a copy"
|
||||
[storage-av1-1080p]="-vf scale='if(gte(iw/ih,1),1920,-1)':'if(gte(iw/ih,1),-1,1920)' -c:v libsvtav1 -preset 6 -crf 28 -pix_fmt yuv420p -g 240 -svtav1-params tune=0:aq-mode=2 -c:a copy"
|
||||
[storage-av1-nvenc]="-c:v av1_nvenc -cq 28 -preset slow -pix_fmt yuv420p10le -c:a copy"
|
||||
[network]="-c:v libx264 -preset slow -crf 22 -pix_fmt yuv420p -c:a aac -b:a 128k"
|
||||
[network-1080p]="-vf scale='if(gte(iw/ih,1),1920,-1)':'if(gte(iw/ih,1),-1,1920)' -c:v libx264 -preset slow -crf 22 -pix_fmt yuv420p -c:a aac -b:a 128k"
|
||||
[whatsapp]="-vf scale='if(gte(iw/ih,1),1920,-1)':'if(gte(iw/ih,1),-1,1920)' -c:v libx264 -preset slow -crf 30 -profile:v baseline -level 3.0 -pix_fmt yuv420p -r 25 -g 50 -c:a aac -b:a 160k -r:a 44100"
|
||||
)
|
||||
|
||||
declare -rA containers=(
|
||||
[davinci-resolve]="mov"
|
||||
[instagram]="mp4"
|
||||
[insta-4k]="mp4"
|
||||
[storage-hevc]="mkv"
|
||||
[storage-av1]="mkv"
|
||||
[storage-av1-1080p]="mkv"
|
||||
[storage-av1-nvenc]="mkv"
|
||||
[network]="mp4"
|
||||
[network-1080p]="mp4"
|
||||
[whatsapp]="mp4"
|
||||
)
|
||||
|
||||
where="${1:-.}"
|
||||
dest="${2:-$where}"
|
||||
|
||||
selection=$(find "$where" -type f | fzf --multi --preview 'ffprobe -v error -show_format -show_streams {}' --preview-window=up:wrap)
|
||||
|
||||
preset=$(
|
||||
printf '%s\n' "${!presets[@]}" | \
|
||||
fzf --multi --prompt "Select a preset"
|
||||
)
|
||||
flags="${presets[$preset]}"
|
||||
container="${containers[$preset]}"
|
||||
|
||||
output_dir=$(find "$dest" -type d ! -name '.*' ! -path '*/.*/*' | fzf --preview 'tree -C {}' --preview-window=up:wrap --prompt "Select output directory: ")
|
||||
|
||||
if gum confirm "Flatten the directory structure?";
|
||||
then
|
||||
flatten=true
|
||||
else
|
||||
flatten=false
|
||||
fi
|
||||
|
||||
|
||||
function transcode_job {
|
||||
local ifile="$1"
|
||||
local output_dir="$2"
|
||||
local flatten="$3"
|
||||
local where="$4"
|
||||
local flags="$5"
|
||||
local container="$6"
|
||||
local fname=$(basename "$ifile")
|
||||
local segment=$(realpath --relative-to="$where" "$ifile")
|
||||
|
||||
|
||||
if [ "$flatten" = true ]; then
|
||||
output_file="$output_dir/$fname.$container"
|
||||
else
|
||||
output_file="$output_dir/$segment.$container"
|
||||
fi
|
||||
|
||||
tmp_file=$(mktemp)
|
||||
|
||||
echo "Running Command: ffmpeg -y -i $ifile $flags $output_file" >> "$tmp_file"
|
||||
|
||||
mkdir -p "$(dirname "$output_file")"
|
||||
|
||||
if ffmpeg -y -i "$ifile" $(echo -n "$flags") "$output_file" 2>> "$tmp_file";
|
||||
then
|
||||
rm -f "$tmp_file"
|
||||
else
|
||||
# gum log "Failed to transcode $ifile. Check ./error.log for details."
|
||||
cat "$tmp_file" >> error.log
|
||||
rm -f "$tmp_file"
|
||||
|
||||
fi
|
||||
}
|
||||
export -f transcode_job
|
||||
|
||||
mapfile -t files <<< "$selection"
|
||||
len=${#files[@]}
|
||||
i=1
|
||||
for file in "${files[@]}"; do
|
||||
if [[ -f "$file" ]]; then
|
||||
gum spin --spinner dot --title "[$i/$len] Transcoding $file" -- bash -c "source <(declare -f transcode_job); transcode_job \"$file\" \"$output_dir\" \"$flatten\" \"$where\" \"$flags\" \"$container\""
|
||||
else
|
||||
echo "Skipping invalid file: $file" >&2
|
||||
fi
|
||||
((i++))
|
||||
done
|
||||
9
modules/packages/bulk-transcode/default.nix
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
flake.overlays.bulk-transcode = final: prev: {
|
||||
bulk-transcode = final.callPackage ./_derivation.nix {};
|
||||
};
|
||||
perSystem = {pkgs, ...}: {
|
||||
packages.bulk-transcode = pkgs.callPackage ./_derivation.nix {};
|
||||
devShells.bulk-transcode = import ./_shell.nix {inherit pkgs;};
|
||||
};
|
||||
}
|
||||
40
modules/packages/crossover/_derivation.nix
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
appimageTools,
|
||||
fetchurl,
|
||||
makeWrapper,
|
||||
...
|
||||
}: let
|
||||
pname = "crossover";
|
||||
version = "3.1.5";
|
||||
src = fetchurl {
|
||||
url = "https://github.com/lacymorrow/crossover/releases/download/v${version}/CrossOver-${version}-x86_64.AppImage";
|
||||
sha256 = "sha256-64RPal8n1PJh1LB+CTyNFt04Pw1lVgcsyc63S8yQ/DA=";
|
||||
};
|
||||
appimageContents = appimageTools.extract {
|
||||
inherit pname version src;
|
||||
};
|
||||
in
|
||||
appimageTools.wrapType2 {
|
||||
inherit pname version src;
|
||||
|
||||
nativeBuildInputs = [makeWrapper];
|
||||
extraInstallCommands = ''
|
||||
wrapProgram $out/bin/${pname} --add-flags "--no-sandbox"
|
||||
|
||||
# Create a minimal .desktop file manually
|
||||
mkdir -p $out/share/applications
|
||||
cat > $out/share/applications/${pname}.desktop <<EOF
|
||||
[Desktop Entry]
|
||||
Name=${pname}
|
||||
Exec=${pname} %U
|
||||
Icon=${pname}
|
||||
Type=Application
|
||||
Categories=Utility;
|
||||
EOF
|
||||
|
||||
# Optionally extract icon from AppImage (if available)
|
||||
# You can also manually install an icon here:
|
||||
mkdir -p $out/share/icons/hicolor/0x0/apps
|
||||
cp ${appimageContents}/usr/share/icons/hicolor/0x0/apps/${pname}.png $out/share/icons/hicolor/0x0/apps/${pname}.png || true
|
||||
'';
|
||||
}
|
||||
8
modules/packages/crossover/default.nix
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
flake.overlays.crossover = final: prev: {
|
||||
crossover = final.callPackage ./_derivation.nix {};
|
||||
};
|
||||
perSystem = {pkgs, ...}: {
|
||||
packages.crossover = pkgs.callPackage ./_derivation.nix {};
|
||||
};
|
||||
}
|
||||
52
modules/packages/layan-qt6/_derivation.nix
Normal file
@@ -0,0 +1,52 @@
|
||||
{
|
||||
stdenv,
|
||||
lib,
|
||||
fetchFromGitHub,
|
||||
gitUpdater,
|
||||
kdeclarative,
|
||||
libplasma,
|
||||
plasma-workspace,
|
||||
}:
|
||||
stdenv.mkDerivation {
|
||||
pname = "layan-kde-qt6";
|
||||
version = "2025-02-13";
|
||||
src = fetchFromGitHub {
|
||||
owner = "vinceliuice";
|
||||
repo = "Layan-kde";
|
||||
rev = "ace0b1d93e5f08c650630c146b2d637e1e2e6cd1";
|
||||
hash = "sha256-T69bGjfZeOsJLmOZKps9N2wMv5VKYeo1ipGEsLAS+Sg=";
|
||||
};
|
||||
|
||||
# Propagate sddm theme dependencies to user env otherwise sddm does
|
||||
# not find them. Putting them in buildInputs is not enough.
|
||||
propagatedUserEnvPkgs = [
|
||||
kdeclarative
|
||||
libplasma
|
||||
plasma-workspace
|
||||
];
|
||||
|
||||
postPatch = ''
|
||||
patchShebangs install.sh
|
||||
|
||||
substituteInPlace install.sh \
|
||||
--replace '$HOME/.local' $out \
|
||||
--replace '$HOME/.config' $out/share
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
runHook preInstall
|
||||
|
||||
name= ./install.sh --dest $out/share/themes
|
||||
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
passthru.updateScript = gitUpdater {};
|
||||
|
||||
meta = with lib; {
|
||||
description = "Flat Design theme for KDE Plasma desktop";
|
||||
homepage = "https://github.com/vinceliuice/Layan-kde";
|
||||
license = licenses.gpl3Only;
|
||||
platforms = platforms.all;
|
||||
};
|
||||
}
|
||||
8
modules/packages/layan-qt6/default.nix
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
flake.overlays.layan-qt6 = final: prev: {
|
||||
crossover = final.callPackage ./_derivation.nix {};
|
||||
};
|
||||
perSystem = {pkgs, ...}: {
|
||||
packages.layan-qt6 = pkgs.callPackage ./_derivation.nix {};
|
||||
};
|
||||
}
|
||||
1
modules/packages/spotify-shortcuts/.envrc
Normal file
@@ -0,0 +1 @@
|
||||
use flake ../../#spotify-shortcuts --show-trace
|
||||
9
modules/packages/spotify-shortcuts/_derivation.nix
Normal file
@@ -0,0 +1,9 @@
|
||||
{python3Packages}:
|
||||
with python3Packages;
|
||||
buildPythonApplication {
|
||||
name = "spotify-shortcuts";
|
||||
propagatedBuildInputs = [spotipy pyxdg desktop-notifier];
|
||||
pyproject = true;
|
||||
build-system = [setuptools];
|
||||
src = ./.;
|
||||
}
|
||||
15
modules/packages/spotify-shortcuts/_shell.nix
Normal file
@@ -0,0 +1,15 @@
|
||||
{pkgs ? import <nixpkgs> {}}: let
|
||||
drv = pkgs.callPackage ./derivation.nix {};
|
||||
in
|
||||
pkgs.mkShell {
|
||||
packages = [
|
||||
pkgs.pyright
|
||||
pkgs.black
|
||||
];
|
||||
|
||||
inputsFrom = [drv];
|
||||
|
||||
shellHook = ''
|
||||
export PYTHONPATH="$PYTHONPATH:$(pwd)"
|
||||
'';
|
||||
}
|
||||
9
modules/packages/spotify-shortcuts/default.nix
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
flake.overlays.spotify-shortcuts = final: prev: {
|
||||
bulk-transcode = final.callPackage ./_derivation.nix {};
|
||||
};
|
||||
perSystem = {pkgs, ...}: {
|
||||
packages.spotify-shortcuts = pkgs.callPackage ./_derivation.nix {};
|
||||
devShells.spotify-shortcuts = import ./_shell.nix {inherit pkgs;};
|
||||
};
|
||||
}
|
||||
16
modules/packages/spotify-shortcuts/setup.py
Normal file
@@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
from setuptools import setup, find_packages
|
||||
|
||||
setup(
|
||||
name="spotify_shortcuts",
|
||||
version="1.0",
|
||||
packages=find_packages(),
|
||||
entry_points={
|
||||
"console_scripts": [
|
||||
"spotisc=spotify_shortcuts.run:main",
|
||||
"spotify-like=spotify_shortcuts.spotify_like:main",
|
||||
"spotify-pl-add=spotify_shortcuts.spotify_pl_add:main",
|
||||
],
|
||||
},
|
||||
)
|
||||
@@ -0,0 +1,4 @@
|
||||
from spotify_shortcuts.run import main
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,74 @@
|
||||
from pathlib import Path
|
||||
from dataclasses import dataclass
|
||||
from argparse import ArgumentParser
|
||||
from typing import List
|
||||
from os import getenv
|
||||
from sys import argv
|
||||
from xdg.BaseDirectory import xdg_cache_home
|
||||
from json import loads
|
||||
|
||||
|
||||
@dataclass
|
||||
class Config:
|
||||
cache_file: Path = Path(xdg_cache_home) / Path("spotify-shortcuts.json")
|
||||
client_id: str | None = None
|
||||
client_secret: str | None = None
|
||||
notifications: bool = True
|
||||
|
||||
@staticmethod
|
||||
def from_file(path: Path):
|
||||
if not path.exists():
|
||||
raise FileNotFoundError(f"Configuration file {path} does not exist.")
|
||||
with open(path, "r") as f:
|
||||
data = loads(f.read())
|
||||
|
||||
return Config(
|
||||
cache_file=Path(data.get("cacheFile", Config.cache_file)),
|
||||
client_id=data.get("clientId", Config.client_id),
|
||||
client_secret=data.get("clientSecret", Config.client_secret),
|
||||
)
|
||||
|
||||
|
||||
def load_config(args: List[str] = argv[1:]) -> Config:
|
||||
parser = ArgumentParser(description="Spotify CLI Tool")
|
||||
parser.add_argument(
|
||||
"--cache-file",
|
||||
type=Path,
|
||||
default=Config.cache_file,
|
||||
help="Path to the cache file for Spotify authentication",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--client-id",
|
||||
type=str,
|
||||
default=Config.client_id,
|
||||
help="Spotify API Client ID",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--client-secret",
|
||||
type=str,
|
||||
default=Config.client_secret,
|
||||
help="Spotify API Client Secret",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--config-file",
|
||||
type=str,
|
||||
help="Path to a json configuration file with keys clientId and clientSecret",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--no-notifications",
|
||||
action="store_true",
|
||||
help="Disable desktop notifications",
|
||||
)
|
||||
|
||||
ns = parser.parse_args(args)
|
||||
|
||||
cfg = Config()
|
||||
if (cfg_file := ns.config_file or getenv("SPOTIFY_SHORTCUTS_CONFIG", None)) != None:
|
||||
cfg = Config.from_file(Path(cfg_file))
|
||||
|
||||
return Config(
|
||||
cache_file=ns.cache_file or cfg.cache_file,
|
||||
client_id=ns.client_id or cfg.client_id,
|
||||
client_secret=ns.client_secret or cfg.client_secret,
|
||||
notifications=not ns.no_notifications or cfg.notifications,
|
||||
)
|
||||
@@ -0,0 +1,7 @@
|
||||
from spotify_shortcuts.spotify_like import SpotifyLike
|
||||
from spotify_shortcuts.spotify_pl_add import SpotifyPlAdd
|
||||
|
||||
SHORTCUT_REGISTRY = {
|
||||
"like": SpotifyLike(),
|
||||
"pl_add": SpotifyPlAdd(),
|
||||
}
|
||||
47
modules/packages/spotify-shortcuts/spotify_shortcuts/run.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from spotify_shortcuts.config import Config, load_config
|
||||
from spotify_shortcuts.shortcut import Shortcut
|
||||
from spotify_shortcuts.spotify_auth import authenticated_session
|
||||
from itertools import chain
|
||||
|
||||
|
||||
def all_scopes() -> list[str]:
|
||||
from spotify_shortcuts.registry import SHORTCUT_REGISTRY
|
||||
|
||||
return list(
|
||||
set(
|
||||
chain.from_iterable(
|
||||
shortcut.get_scopes() for shortcut in SHORTCUT_REGISTRY.values()
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def run_shortcut(shortcut: Shortcut, config: Config):
|
||||
client = authenticated_session(
|
||||
config, scopes=all_scopes() # use all scopes to avoid re-authentication
|
||||
)
|
||||
|
||||
shortcut.execute(client, config)
|
||||
|
||||
|
||||
def main():
|
||||
from spotify_shortcuts.registry import SHORTCUT_REGISTRY
|
||||
import sys
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print(f"Usage: {sys.argv[0]} <shortcut_name>")
|
||||
sys.exit(1)
|
||||
|
||||
shortcut_name = sys.argv[1]
|
||||
if shortcut_name not in SHORTCUT_REGISTRY:
|
||||
print(f"Shortcut '{shortcut_name}' not found.")
|
||||
sys.exit(1)
|
||||
|
||||
shortcut = SHORTCUT_REGISTRY[shortcut_name]
|
||||
config = load_config(args=sys.argv[2:])
|
||||
|
||||
run_shortcut(shortcut, config)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,21 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from spotify_shortcuts.config import Config
|
||||
from spotipy import Spotify
|
||||
|
||||
|
||||
class Shortcut(ABC):
|
||||
@abstractmethod
|
||||
def execute(self, client: Spotify, config: Config):
|
||||
"""Execute the shortcut action."""
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_help(self) -> str:
|
||||
"""Return a description of the shortcut."""
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_scopes(self) -> list[str]:
|
||||
"""Return the spotify API scopes required for the shortcut."""
|
||||
pass
|
||||
@@ -0,0 +1,20 @@
|
||||
from spotipy.oauth2 import SpotifyOAuth
|
||||
from spotipy import Spotify
|
||||
from spotify_shortcuts.config import Config
|
||||
|
||||
CALLBACK_URI = "http://127.0.0.1:45632/callback"
|
||||
|
||||
|
||||
def authenticated_session(cfg: Config, scopes: list[str]) -> Spotify:
|
||||
assert cfg.client_id, "Spotify client ID is required"
|
||||
assert cfg.client_secret, "Spotify client secret is required"
|
||||
|
||||
return Spotify(
|
||||
auth_manager=SpotifyOAuth(
|
||||
client_id=cfg.client_id,
|
||||
client_secret=cfg.client_secret,
|
||||
redirect_uri=CALLBACK_URI,
|
||||
scope=" ".join(scopes),
|
||||
cache_path=cfg.cache_file,
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,46 @@
|
||||
from spotify_shortcuts.run import run_shortcut
|
||||
from spotify_shortcuts.shortcut import Shortcut
|
||||
from spotify_shortcuts.config import load_config
|
||||
from desktop_notifier import DesktopNotifierSync
|
||||
|
||||
SCOPES = [
|
||||
"user-library-read",
|
||||
"user-library-modify",
|
||||
"user-read-playback-state",
|
||||
]
|
||||
|
||||
|
||||
class SpotifyLike(Shortcut):
|
||||
def execute(self, client, config):
|
||||
if (playback := client.current_playback()) is None:
|
||||
print("No current playback found.")
|
||||
return
|
||||
|
||||
if (uri := playback.get("item", {}).get("uri", None)) is None:
|
||||
print("No track URI found in current playback.")
|
||||
return
|
||||
|
||||
client.current_user_saved_tracks_add(tracks=[uri])
|
||||
|
||||
if config.notifications:
|
||||
dn = DesktopNotifierSync()
|
||||
dn.send(
|
||||
title="Track Liked",
|
||||
message=f"Track \"{playback.get('item', {}).get('name', '<no-name>')}\" by \"{
|
||||
", ".join(a.get('name', '<no-name>') for a in playback.get('item', {}).get('artists', []))
|
||||
}\" has been liked.",
|
||||
)
|
||||
|
||||
def get_help(self) -> str:
|
||||
return "Like the currently playing track."
|
||||
|
||||
def get_scopes(self) -> list[str]:
|
||||
return SCOPES
|
||||
|
||||
|
||||
def main():
|
||||
run_shortcut(SpotifyLike(), load_config())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,57 @@
|
||||
from spotify_shortcuts.shortcut import Shortcut
|
||||
from spotify_shortcuts.config import load_config
|
||||
from desktop_notifier import DesktopNotifierSync
|
||||
from spotify_shortcuts.run import run_shortcut
|
||||
|
||||
SCOPES = [
|
||||
"playlist-modify-public",
|
||||
"playlist-modify-private",
|
||||
"user-read-playback-state",
|
||||
]
|
||||
|
||||
|
||||
class SpotifyPlAdd(Shortcut):
|
||||
def execute(self, client, config):
|
||||
if (playback := client.current_playback()) is None:
|
||||
print("No current playback found.")
|
||||
return
|
||||
|
||||
if (track_uri := playback.get("item", {}).get("uri", None)) is None:
|
||||
print("No track URI found in current playback.")
|
||||
return
|
||||
|
||||
if (context_uri := playback.get("context", {}).get("uri", None)) is None:
|
||||
print("No context URI found in current playback.")
|
||||
return
|
||||
|
||||
client.playlist_add_items(context_uri, items=[track_uri])
|
||||
|
||||
if config.notifications:
|
||||
track_name = playback.get("item", {}).get("name", "<no-name>")
|
||||
artists = ", ".join(
|
||||
a.get("name", "<no-name>")
|
||||
for a in playback.get("item", {}).get("artists", [])
|
||||
)
|
||||
playlist_name = (client.playlist(context_uri) or {}).get(
|
||||
"name", "<no-name>"
|
||||
)
|
||||
|
||||
dn = DesktopNotifierSync()
|
||||
dn.send(
|
||||
title="Track Added to Playlist",
|
||||
message=f'Track "{track_name}" by "{artists}" has been added to {playlist_name}.',
|
||||
)
|
||||
|
||||
def get_help(self) -> str:
|
||||
return "Add the currently playing track to the current playlist."
|
||||
|
||||
def get_scopes(self) -> list[str]:
|
||||
return SCOPES
|
||||
|
||||
|
||||
def main():
|
||||
run_shortcut(SpotifyPlAdd(), load_config())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,89 +1,90 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.programs.creative;
|
||||
avidemux-wayland-fix = pkgs.avidemux.overrideAttrs (prev: {
|
||||
installPhase =
|
||||
(prev.installPhase or "")
|
||||
+ ''
|
||||
wrapProgram $out/bin/avidemux3_qt5 \
|
||||
--add-flags "--platform" \
|
||||
--add-flags "xcb"
|
||||
'';
|
||||
});
|
||||
in {
|
||||
options.hive.programs.creative = {
|
||||
enable = lib.mkEnableOption "Enable creative programs (video/image editing, etc.)";
|
||||
image-management = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Enable image management tools.
|
||||
'';
|
||||
flake.nixosModules.creative = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.programs.creative;
|
||||
avidemux-wayland-fix = pkgs.avidemux.overrideAttrs (prev: {
|
||||
installPhase =
|
||||
(prev.installPhase or "")
|
||||
+ ''
|
||||
wrapProgram $out/bin/avidemux3_qt5 \
|
||||
--add-flags "--platform" \
|
||||
--add-flags "xcb"
|
||||
'';
|
||||
});
|
||||
in {
|
||||
options.hive.programs.creative = {
|
||||
image-management = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Enable image management tools.
|
||||
'';
|
||||
};
|
||||
image-editing = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable image editing tools.
|
||||
'';
|
||||
};
|
||||
image-raw-processing = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable raw processing programs.
|
||||
'';
|
||||
};
|
||||
video-editing-light = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable light video editing tools.
|
||||
'';
|
||||
};
|
||||
video-editing-heavy = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable heavy video editing tools.
|
||||
'';
|
||||
};
|
||||
daws = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable DAWs (currently bitwig beta)
|
||||
'';
|
||||
};
|
||||
};
|
||||
image-editing = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable image editing tools.
|
||||
'';
|
||||
};
|
||||
image-raw-processing = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable raw processing programs.
|
||||
'';
|
||||
};
|
||||
video-editing-light = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable light video editing tools.
|
||||
'';
|
||||
};
|
||||
video-editing-heavy = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable heavy video editing tools.
|
||||
'';
|
||||
};
|
||||
daws = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable DAWs (currently bitwig beta)
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = with pkgs;
|
||||
lib.optionals cfg.image-editing [gimp krita drawio]
|
||||
++ lib.optional cfg.image-management digikam
|
||||
++ lib.optionals cfg.image-raw-processing [
|
||||
enblend-enfuse
|
||||
hdrmerge
|
||||
hugin
|
||||
rawtherapee
|
||||
unstable.darktable
|
||||
unstable.rapidraw
|
||||
]
|
||||
++ lib.optionals cfg.video-editing-light [
|
||||
avidemux-wayland-fix
|
||||
ffmpeg
|
||||
hive.bulk-transcode
|
||||
losslesscut-bin
|
||||
]
|
||||
++ lib.optionals cfg.video-editing-heavy [
|
||||
davinci-resolve
|
||||
kdePackages.kdenlive
|
||||
obs-studio
|
||||
]
|
||||
++ lib.optional cfg.daws bitwig-studio-latest;
|
||||
config = {
|
||||
environment.systemPackages = with pkgs;
|
||||
lib.optionals cfg.image-editing [gimp krita drawio]
|
||||
++ lib.optional cfg.image-management digikam
|
||||
++ lib.optionals cfg.image-raw-processing [
|
||||
enblend-enfuse
|
||||
hdrmerge
|
||||
hugin
|
||||
rawtherapee
|
||||
unstable.darktable
|
||||
unstable.rapidraw
|
||||
]
|
||||
++ lib.optionals cfg.video-editing-light [
|
||||
avidemux-wayland-fix
|
||||
ffmpeg
|
||||
bulk-transcode
|
||||
losslesscut-bin
|
||||
]
|
||||
++ lib.optionals cfg.video-editing-heavy [
|
||||
davinci-resolve
|
||||
kdePackages.kdenlive
|
||||
obs-studio
|
||||
]
|
||||
++ lib.optional cfg.daws bitwig-studio-latest;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,73 +1,74 @@
|
||||
{
|
||||
config,
|
||||
inputs,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.programs.games;
|
||||
in {
|
||||
options.hive.programs.games = {
|
||||
enable = lib.mkEnableOption "Enable the games module";
|
||||
steam = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable Steam support.
|
||||
'';
|
||||
flake.nixosModules.games = {
|
||||
config,
|
||||
inputs,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.programs.games;
|
||||
in {
|
||||
options.hive.programs.games = {
|
||||
steam = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable Steam support.
|
||||
'';
|
||||
};
|
||||
dayz = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable DayZ tools.
|
||||
'';
|
||||
};
|
||||
lutris = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable Lutris support.
|
||||
'';
|
||||
};
|
||||
r2modman = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable R2ModMan support.
|
||||
'';
|
||||
};
|
||||
wine = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable Wine support.
|
||||
'';
|
||||
};
|
||||
};
|
||||
dayz = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable DayZ tools.
|
||||
'';
|
||||
};
|
||||
lutris = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable Lutris support.
|
||||
'';
|
||||
};
|
||||
r2modman = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable R2ModMan support.
|
||||
'';
|
||||
};
|
||||
wine = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable Wine support.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages =
|
||||
lib.optional cfg.lutris
|
||||
(pkgs.lutris.override {
|
||||
extraPkgs = pkgs: [
|
||||
pkgs.libnghttp2
|
||||
config = {
|
||||
environment.systemPackages =
|
||||
lib.optional cfg.lutris
|
||||
(pkgs.lutris.override {
|
||||
extraPkgs = pkgs: [
|
||||
pkgs.libnghttp2
|
||||
pkgs.winetricks
|
||||
];
|
||||
})
|
||||
++ lib.optional cfg.r2modman pkgs.r2modman
|
||||
++ lib.optionals cfg.dayz [
|
||||
pkgs.hive.crossover
|
||||
inputs.dzgui-nix.packages.${pkgs.stdenv.system}.default
|
||||
]
|
||||
++ lib.optionals cfg.wine [
|
||||
pkgs.wine
|
||||
pkgs.winetricks
|
||||
];
|
||||
})
|
||||
++ lib.optional cfg.r2modman pkgs.r2modman
|
||||
++ lib.optionals cfg.dayz [
|
||||
pkgs.hive.crossover
|
||||
inputs.dzgui-nix.packages.${pkgs.stdenv.system}.default
|
||||
]
|
||||
++ lib.optionals cfg.wine [
|
||||
pkgs.wine
|
||||
pkgs.winetricks
|
||||
];
|
||||
|
||||
programs.steam = lib.mkIf cfg.steam {
|
||||
enable = true;
|
||||
gamescopeSession.enable = true;
|
||||
programs.steam = lib.mkIf cfg.steam {
|
||||
enable = true;
|
||||
gamescopeSession.enable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,31 +1,33 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.virt-manager;
|
||||
in {
|
||||
options.hive.virt-manager = {
|
||||
enable = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable the qemu-kvm + libvirt stack.
|
||||
'';
|
||||
{...}: {
|
||||
flake.nixosModules.virt-manager = {
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.virt-manager;
|
||||
in {
|
||||
options.hive.virt-manager = {
|
||||
enable = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable the qemu-kvm + libvirt stack.
|
||||
'';
|
||||
};
|
||||
forUsers = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.singleLineStr;
|
||||
default = [];
|
||||
description = ''
|
||||
List of users that should be added to the libvirt group.
|
||||
'';
|
||||
};
|
||||
};
|
||||
forUsers = lib.mkOption {
|
||||
type = lib.types.listOf lib.types.singleLineStr;
|
||||
default = [];
|
||||
description = ''
|
||||
List of users that should be added to the libvirt group.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.virt-manager.enable = true;
|
||||
users.groups.libvirtd.members = cfg.forUsers;
|
||||
virtualisation.libvirtd.enable = true;
|
||||
virtualisation.spiceUSBRedirection.enable = true;
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.virt-manager.enable = true;
|
||||
users.groups.libvirtd.members = cfg.forUsers;
|
||||
virtualisation.libvirtd.enable = true;
|
||||
virtualisation.spiceUSBRedirection.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
57
old/fixes/plasma-fix.nix
Normal file
@@ -0,0 +1,57 @@
|
||||
# https://github.com/NixOS/nixpkgs/issues/126590#issuecomment-3194531220
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
nixpkgs.overlays = lib.singleton (final: prev: {
|
||||
kdePackages =
|
||||
prev.kdePackages
|
||||
// {
|
||||
plasma-workspace = let
|
||||
# the package we want to override
|
||||
basePkg = prev.kdePackages.plasma-workspace;
|
||||
|
||||
# a helper package that merges all the XDG_DATA_DIRS into a single directory
|
||||
xdgdataPkg = pkgs.stdenv.mkDerivation {
|
||||
name = "${basePkg.name}-xdgdata";
|
||||
buildInputs = [basePkg];
|
||||
dontUnpack = true;
|
||||
dontFixup = true;
|
||||
dontWrapQtApps = true;
|
||||
installPhase = ''
|
||||
mkdir -p $out/share
|
||||
( IFS=:
|
||||
for DIR in $XDG_DATA_DIRS; do
|
||||
if [[ -d "$DIR" ]]; then
|
||||
cp -r $DIR/. $out/share/
|
||||
chmod -R u+w $out/share
|
||||
fi
|
||||
done
|
||||
)
|
||||
'';
|
||||
};
|
||||
|
||||
# undo the XDG_DATA_DIRS injection that is usually done in the qt wrapper
|
||||
# script and instead inject the path of the above helper package
|
||||
derivedPkg = basePkg.overrideAttrs {
|
||||
preFixup = ''
|
||||
for index in "''${!qtWrapperArgs[@]}"; do
|
||||
if [[ ''${qtWrapperArgs[$((index+0))]} == "--prefix" ]] && [[ ''${qtWrapperArgs[$((index+1))]} == "XDG_DATA_DIRS" ]]; then
|
||||
unset -v "qtWrapperArgs[$((index+0))]"
|
||||
unset -v "qtWrapperArgs[$((index+1))]"
|
||||
unset -v "qtWrapperArgs[$((index+2))]"
|
||||
unset -v "qtWrapperArgs[$((index+3))]"
|
||||
fi
|
||||
done
|
||||
qtWrapperArgs=("''${qtWrapperArgs[@]}")
|
||||
qtWrapperArgs+=(--prefix XDG_DATA_DIRS : "${xdgdataPkg}/share")
|
||||
qtWrapperArgs+=(--prefix XDG_DATA_DIRS : "$out/share")
|
||||
'';
|
||||
};
|
||||
in
|
||||
derivedPkg;
|
||||
};
|
||||
});
|
||||
}
|
||||
51
old/home/admin-jroeger.nix
Normal file
@@ -0,0 +1,51 @@
|
||||
{lib, ...}: {
|
||||
# Home Manager needs a bit of information about you and the paths it should
|
||||
# manage.
|
||||
home.username = "admin-jroeger";
|
||||
home.homeDirectory = "/home/admin-jroeger";
|
||||
|
||||
# hive modules
|
||||
hive.kitty.enable = true;
|
||||
hive.ranger.enable = true;
|
||||
hive.yubikey.enable = true;
|
||||
hive.yubikey.pinentry = "gnome3";
|
||||
hive.nix-scripts.enable = true;
|
||||
hive.zsh.enable = true;
|
||||
hive.doom.enable = true;
|
||||
hive.doom.asDefaultEditor = true;
|
||||
hive.doom.enableCopilot = true;
|
||||
hive.doom.withNixPkgs = true;
|
||||
hive.doom.withShellPkgs = true;
|
||||
hive.doom.withCXXPkgs = true;
|
||||
hive.doom.withPythonPkgs = true;
|
||||
hive.jj.enable = true;
|
||||
|
||||
# This value determines the Home Manager release that your configuration is
|
||||
# compatible with. This helps avoid breakage when a new Home Manager release
|
||||
# introduces backwards incompatible changes.
|
||||
#
|
||||
# You should not change this value, even if you update Home Manager. If you do
|
||||
# want to update the value, then make sure to first check the Home Manager
|
||||
# release notes.
|
||||
home.stateVersion = "24.11"; # Please read the comment before changing.
|
||||
|
||||
home.sessionVariables = {
|
||||
EDITOR = lib.mkDefault "vim";
|
||||
};
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
# Git
|
||||
programs.difftastic.enable = true;
|
||||
programs.difftastic.git.enable = true;
|
||||
programs.git = {
|
||||
enable = true;
|
||||
settings.user.name = "Jonas Röger";
|
||||
settings.user.email = "jonas.kieran.roeger@iml.fraunhofer.de";
|
||||
signing = {
|
||||
signByDefault = true;
|
||||
key = "4000EB35E1AE0F07";
|
||||
};
|
||||
};
|
||||
}
|
||||
105
old/home/jonas@comfy-station.nix
Normal file
@@ -0,0 +1,105 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
(./. + "/jonas@comfy-station/" + /borg.nix)
|
||||
];
|
||||
|
||||
# Home Manager needs a bit of information about you and the paths it should
|
||||
# manage.
|
||||
home.username = "jonas";
|
||||
home.homeDirectory = "/home/jonas";
|
||||
|
||||
sops = {
|
||||
age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
||||
};
|
||||
|
||||
# hive modules
|
||||
hive.themes.layan.enable = true;
|
||||
hive.themes.layan.pkgsInHome = true;
|
||||
hive.hyprland.enable = true;
|
||||
hive.swaync.enable = true;
|
||||
hive.waybar.enable = true;
|
||||
hive.wlogout.enable = true;
|
||||
hive.wofi.enable = true;
|
||||
hive.kitty.enable = true;
|
||||
hive.nextcloud.enable = true;
|
||||
hive.firefox = {
|
||||
enable = true;
|
||||
plasmaIntegration = true;
|
||||
passFF = true;
|
||||
};
|
||||
hive.kdeconnect.enable = true;
|
||||
hive.ranger.enable = true;
|
||||
hive.ssh = {
|
||||
enable = true;
|
||||
sopsFile = ../secrets/jonas/ssh.yaml;
|
||||
keys = ["borg" "passgit"];
|
||||
};
|
||||
hive.yubikey.enable = true;
|
||||
hive.yubikey.withCCID = false;
|
||||
hive.zsh.enable = true;
|
||||
hive.nix-scripts.enable = true;
|
||||
hive.doom.enable = true;
|
||||
hive.doom.asDefaultEditor = true;
|
||||
hive.doom.enableCopilot = true;
|
||||
hive.doom.withNixPkgs = true;
|
||||
hive.doom.withShellPkgs = true;
|
||||
hive.doom.withPythonPkgs = true;
|
||||
hive.jj.enable = true;
|
||||
|
||||
# Make session variables available in systemd units
|
||||
# SEE: https://github.com/nix-community/home-manager/pull/5543
|
||||
# systemd.user.settings.Manager.DefaultEnvironment =
|
||||
# lib.mapAttrs (_: lib.mkDefault) config.home.sessionVariables;
|
||||
|
||||
xdg.mimeApps = {
|
||||
enable = true;
|
||||
|
||||
defaultApplications = {
|
||||
"text/html" = "firefox.desktop";
|
||||
"x-scheme-handler/http" = "firefox.desktop";
|
||||
"x-scheme-handler/https" = "firefox.desktop";
|
||||
"x-scheme-handler/about" = "firefox.desktop";
|
||||
"x-scheme-handler/unknown" = "firefox.desktop";
|
||||
};
|
||||
};
|
||||
xdg.userDirs.enable = true;
|
||||
xdg.userDirs.createDirectories = true;
|
||||
xdg.userDirs.extraConfig = {
|
||||
XDG_WORKSPACES_DIR = "${config.home.homeDirectory}/Workspaces";
|
||||
XDG_NEXTCLOUD_DIR = "${config.home.homeDirectory}/Nextcloud";
|
||||
XDG_NOTES_DIR = "${config.home.homeDirectory}/Notes";
|
||||
};
|
||||
|
||||
# This value determines the Home Manager release that your configuration is
|
||||
# compatible with. This helps avoid breakage when a new Home Manager release
|
||||
# introduces backwards incompatible changes.
|
||||
#
|
||||
# You should not change this value, even if you update Home Manager. If you do
|
||||
# want to update the value, then make sure to first check the Home Manager
|
||||
# release notes.
|
||||
home.stateVersion = "24.11"; # Please read the comment before changing.
|
||||
|
||||
home.sessionVariables = {
|
||||
EDITOR = lib.mkDefault "vim";
|
||||
};
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
# Git
|
||||
programs.difftastic.enable = true;
|
||||
programs.difftastic.git.enable = true;
|
||||
programs.git = {
|
||||
enable = true;
|
||||
settings.user.name = "Jonas Röger";
|
||||
settings.user.email = "jonas.roeger@tu-dortmund.de";
|
||||
signing = {
|
||||
signByDefault = true;
|
||||
key = "4000EB35E1AE0F07";
|
||||
};
|
||||
};
|
||||
}
|
||||
131
old/home/jonas@comfy-station/borg.nix
Normal file
@@ -0,0 +1,131 @@
|
||||
{config, ...}: let
|
||||
defaultChecks = [
|
||||
{
|
||||
name = "repository";
|
||||
frequency = "2 weeks";
|
||||
}
|
||||
{
|
||||
name = "archives";
|
||||
frequency = "4 weeks";
|
||||
}
|
||||
{
|
||||
name = "data";
|
||||
frequency = "6 weeks";
|
||||
}
|
||||
{
|
||||
name = "extract";
|
||||
frequency = "6 weeks";
|
||||
}
|
||||
];
|
||||
passwordFile = "${config.home.homeDirectory}/.config/borg/password";
|
||||
encCmd = ''cat ${passwordFile}'';
|
||||
repo = "ssh://borg.jroeger.de/./comfy-station";
|
||||
in {
|
||||
sops.secrets = {
|
||||
"borg/password" = {
|
||||
sopsFile = ../../secrets/jonas/borg.yaml;
|
||||
key = "password";
|
||||
path = passwordFile;
|
||||
};
|
||||
};
|
||||
|
||||
services.borgmatic.enable = true;
|
||||
services.borgmatic.frequency = "hourly";
|
||||
|
||||
programs.borgmatic.enable = true;
|
||||
programs.borgmatic.backups = {
|
||||
workspaces = {
|
||||
location = {
|
||||
sourceDirectories = ["${config.xdg.userDirs.extraConfig.XDG_WORKSPACES_DIR}"];
|
||||
repositories = [repo];
|
||||
excludeHomeManagerSymlinks = true;
|
||||
extraConfig = {
|
||||
archive_name_format = "{hostname}-workspaces-{now}";
|
||||
exclude_patterns = [
|
||||
"*/.venv"
|
||||
"__pycache__"
|
||||
];
|
||||
};
|
||||
};
|
||||
retention = {
|
||||
keepDaily = 7;
|
||||
keepHourly = 12;
|
||||
keepWeekly = 4;
|
||||
keepMonthly = 6;
|
||||
};
|
||||
storage = {
|
||||
encryptionPasscommand = encCmd;
|
||||
};
|
||||
consistency.checks = defaultChecks;
|
||||
};
|
||||
media = {
|
||||
location = {
|
||||
sourceDirectories = [
|
||||
"${config.xdg.userDirs.documents}"
|
||||
"${config.xdg.userDirs.music}"
|
||||
"${config.home.homeDirectory}/org"
|
||||
"${config.home.homeDirectory}/Obsidian"
|
||||
"${config.home.homeDirectory}/Zotero"
|
||||
];
|
||||
repositories = [repo];
|
||||
excludeHomeManagerSymlinks = true;
|
||||
extraConfig = {
|
||||
archive_name_format = "{hostname}-media-{now}";
|
||||
};
|
||||
};
|
||||
retention = {
|
||||
keepDaily = 7;
|
||||
keepWeekly = 2;
|
||||
keepMonthly = 6;
|
||||
};
|
||||
storage = {
|
||||
encryptionPasscommand = encCmd;
|
||||
};
|
||||
consistency.checks = defaultChecks;
|
||||
};
|
||||
sec = {
|
||||
location = {
|
||||
sourceDirectories = [
|
||||
"${config.xdg.configHome}/sops"
|
||||
"${config.home.homeDirectory}/Stuff/sec"
|
||||
"${config.home.homeDirectory}/.password-store"
|
||||
];
|
||||
repositories = [repo];
|
||||
excludeHomeManagerSymlinks = true;
|
||||
extraConfig = {
|
||||
archive_name_format = "{hostname}-sec-{now}";
|
||||
};
|
||||
};
|
||||
retention = {
|
||||
keepDaily = 7;
|
||||
keepWeekly = 2;
|
||||
keepMonthly = 6;
|
||||
};
|
||||
storage = {
|
||||
encryptionPasscommand = encCmd;
|
||||
};
|
||||
consistency.checks = defaultChecks;
|
||||
};
|
||||
var = {
|
||||
location = {
|
||||
sourceDirectories = [
|
||||
"${config.xdg.userDirs.desktop}"
|
||||
];
|
||||
repositories = [repo];
|
||||
excludeHomeManagerSymlinks = true;
|
||||
extraConfig = {
|
||||
archive_name_format = "{hostname}-var-{now}";
|
||||
};
|
||||
};
|
||||
retention = {
|
||||
keepDaily = 7;
|
||||
keepWeekly = 2;
|
||||
keepMonthly = 6;
|
||||
};
|
||||
storage = {
|
||||
encryptionPasscommand = encCmd;
|
||||
};
|
||||
consistency.checks = defaultChecks;
|
||||
};
|
||||
};
|
||||
}
|
||||
44
old/home/jonas@harbor.nix
Normal file
@@ -0,0 +1,44 @@
|
||||
{lib, ...}: {
|
||||
# Home Manager needs a bit of information about you and the paths it should
|
||||
# manage.
|
||||
home.username = "jonas";
|
||||
home.homeDirectory = "/home/jonas";
|
||||
|
||||
# hive modules
|
||||
hive.zsh.enable = true;
|
||||
hive.nix-scripts.enable = true;
|
||||
hive.ranger.enable = true;
|
||||
hive.doom.enable = true;
|
||||
hive.doom.asDefaultEditor = true;
|
||||
hive.doom.withNixPkgs = true;
|
||||
hive.doom.withShellPkgs = true;
|
||||
|
||||
# This value determines the Home Manager release that your configuration is
|
||||
# compatible with. This helps avoid breakage when a new Home Manager release
|
||||
# introduces backwards incompatible changes.
|
||||
#
|
||||
# You should not change this value, even if you update Home Manager. If you do
|
||||
# want to update the value, then make sure to first check the Home Manager
|
||||
# release notes.
|
||||
home.stateVersion = "24.11"; # Please read the comment before changing.
|
||||
|
||||
home.sessionVariables = {
|
||||
EDITOR = lib.mkDefault "vim";
|
||||
};
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
# Git
|
||||
programs.difftastic.enable = true;
|
||||
programs.difftastic.git.enable = true;
|
||||
programs.git = {
|
||||
enable = true;
|
||||
settings.user.name = "Jonas Röger";
|
||||
settings.user.email = "jonas.roeger@tu-dortmund.de";
|
||||
signing = {
|
||||
signByDefault = true;
|
||||
key = "4000EB35E1AE0F07";
|
||||
};
|
||||
};
|
||||
}
|
||||
105
old/home/jonas@monolith.nix
Normal file
@@ -0,0 +1,105 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: rec {
|
||||
# Home Manager needs a bit of information about you and the paths it should
|
||||
# manage.
|
||||
home.username = "jonas";
|
||||
home.homeDirectory = "/home/jonas";
|
||||
|
||||
sops = {
|
||||
age.keyFile = "${home.homeDirectory}/.config/sops/age/keys.txt";
|
||||
};
|
||||
sops.secrets.gotifyDaemonToken = {
|
||||
sopsFile = ../secrets/jonas/gotify.yaml;
|
||||
key = "monolithDesktopToken";
|
||||
};
|
||||
sops.secrets.gotifyCLIToken = {
|
||||
sopsFile = ../secrets/jonas/gotify.yaml;
|
||||
key = "cliToken";
|
||||
};
|
||||
|
||||
# hive moduless
|
||||
hive.doom.enable = true;
|
||||
hive.doom.asDefaultEditor = true;
|
||||
hive.doom.enableCopilot = false;
|
||||
hive.doom.enableTidal = false;
|
||||
hive.doom.withNixPkgs = true;
|
||||
hive.doom.withShellPkgs = true;
|
||||
hive.doom.withPythonPkgs = true;
|
||||
hive.firefox = {
|
||||
enable = true;
|
||||
plasmaIntegration = false;
|
||||
passFF = true;
|
||||
};
|
||||
hive.kdeconnect.enable = false;
|
||||
hive.kdeconnect.indicatorOnly = false;
|
||||
hive.nextcloud.enable = false; # kwallet bug
|
||||
hive.nix-scripts.enable = true;
|
||||
hive.ranger.enable = true;
|
||||
hive.themes.layan.enable = true;
|
||||
hive.yubikey.enable = true;
|
||||
hive.zsh.enable = true;
|
||||
hive.jj.enable = true;
|
||||
hive.gotify = {
|
||||
cli.enable = true;
|
||||
daemon.enable = true;
|
||||
cli.tokenSopsKey = config.sops.secrets.gotifyCLIToken.name;
|
||||
daemon.tokenSopsKey = config.sops.secrets.gotifyDaemonToken.name;
|
||||
host = "gotify.jroeger.de";
|
||||
};
|
||||
|
||||
# Make session variables available in systemd units
|
||||
# SEE: https://github.com/nix-community/home-manager/pull/5543
|
||||
# systemd.user.settings.Manager.DefaultEnvironment =
|
||||
# lib.mapAttrs (_: lib.mkDefault) config.home.sessionVariables;
|
||||
|
||||
xdg.mimeApps = {
|
||||
enable = true;
|
||||
|
||||
defaultApplications = {
|
||||
"text/html" = "firefox.desktop";
|
||||
"x-scheme-handler/http" = "firefox.desktop";
|
||||
"x-scheme-handler/https" = "firefox.desktop";
|
||||
"x-scheme-handler/about" = "firefox.desktop";
|
||||
"x-scheme-handler/unknown" = "firefox.desktop";
|
||||
};
|
||||
};
|
||||
xdg.userDirs.enable = true;
|
||||
xdg.userDirs.createDirectories = true;
|
||||
xdg.userDirs.extraConfig = {
|
||||
XDG_WORKSPACES_DIR = "${config.home.homeDirectory}/Workspaces";
|
||||
XDG_NEXTCLOUD_DIR = "${config.home.homeDirectory}/Nextcloud";
|
||||
XDG_NOTES_DIR = "${config.home.homeDirectory}/Notes";
|
||||
};
|
||||
|
||||
# This value determines the Home Manager release that your configuration is
|
||||
# compatible with. This helps avoid breakage when a new Home Manager release
|
||||
# introduces backwards incompatible changes.
|
||||
#
|
||||
# You should not change this value, even if you update Home Manager. If you do
|
||||
# want to update the value, then make sure to first check the Home Manager
|
||||
# release notes.
|
||||
home.stateVersion = "24.11"; # Please read the comment before changing.
|
||||
|
||||
home.sessionVariables = {
|
||||
EDITOR = lib.mkDefault "vim";
|
||||
};
|
||||
|
||||
# Let Home Manager install and manage itself.
|
||||
programs.home-manager.enable = true;
|
||||
|
||||
# Git
|
||||
programs.difftastic.enable = true;
|
||||
programs.difftastic.git.enable = true;
|
||||
programs.git = {
|
||||
enable = true;
|
||||
settings.user.name = "Jonas Röger";
|
||||
settings.user.email = "jonas.roeger@tu-dortmund.de";
|
||||
signing = {
|
||||
signByDefault = true;
|
||||
key = "4000EB35E1AE0F07";
|
||||
};
|
||||
};
|
||||
}
|
||||
177
old/hosts/comfy-station/configuration.nix
Normal file
@@ -0,0 +1,177 @@
|
||||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
# Include the results of the hardware scan.
|
||||
./hardware-configuration.nix
|
||||
];
|
||||
|
||||
# Secret management
|
||||
sops.age.keyFile = "/var/lib/sops-nix/key.txt";
|
||||
sops.secrets.wg-priv = {
|
||||
sopsFile = ../../secrets/comfy-station/wg.yaml;
|
||||
key = "privateKey";
|
||||
};
|
||||
|
||||
# Users
|
||||
users.users.jonas = {
|
||||
isNormalUser = true;
|
||||
description = "Jonas";
|
||||
extraGroups = ["networkmanager" "wheel" "docker" "dialout"];
|
||||
};
|
||||
users.defaultUserShell = pkgs.zsh;
|
||||
programs.zsh.enable = true;
|
||||
|
||||
# hive modules
|
||||
hive.nix-scripts.enable = true;
|
||||
hive.displayManager.name = "sddm";
|
||||
hive.hyprland.enable = true;
|
||||
hive.kwallet.enable = true;
|
||||
hive.kwallet.forUsers = ["jonas"];
|
||||
hive.virt-manager.enable = true;
|
||||
hive.virt-manager.forUsers = ["jonas"];
|
||||
hive.bluetooth.enable = true;
|
||||
hive.sound.enable = true;
|
||||
hive.yubikey.enable = true;
|
||||
hive.wg.client.enable = true;
|
||||
hive.wg.client.privateKeyFile = config.sops.secrets.wg-priv.path;
|
||||
hive.wg.client.peer = "comfy-station";
|
||||
hive.programs.games.enable = true;
|
||||
hive.programs.games.steam = true;
|
||||
hive.programs.creative = {
|
||||
enable = true;
|
||||
image-management = true;
|
||||
image-raw-processing = true;
|
||||
video-editing-light = true;
|
||||
};
|
||||
|
||||
# system packages
|
||||
environment.systemPackages = with pkgs; [
|
||||
age
|
||||
alejandra
|
||||
arduino
|
||||
borgbackup
|
||||
borgmatic
|
||||
chromium
|
||||
digikam
|
||||
discord
|
||||
docker
|
||||
docker-compose
|
||||
drawio
|
||||
feh
|
||||
ffmpeg
|
||||
firefox
|
||||
gimp
|
||||
git
|
||||
(gnome-network-displays.overrideAttrs (final: prev: {buildInputs = prev.buildInputs ++ [glib-networking];}))
|
||||
insomnia
|
||||
krita
|
||||
libreoffice
|
||||
mosquitto
|
||||
mpv
|
||||
mupdf
|
||||
nh
|
||||
nix-index
|
||||
nix-output-monitor
|
||||
obsidian
|
||||
openhantek6022
|
||||
qalculate-qt
|
||||
qtpass
|
||||
ranger
|
||||
sops
|
||||
spotify
|
||||
vim
|
||||
vlc
|
||||
vscode
|
||||
wget
|
||||
zoom
|
||||
zotero
|
||||
];
|
||||
nixpkgs.config.permittedInsecurePackages = [
|
||||
"electron-25.9.0" # required by obsidian
|
||||
];
|
||||
services.avahi.enable = true;
|
||||
services.udev.packages = [pkgs.openhantek6022];
|
||||
virtualisation.docker.enable = true;
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "24.11"; # Did you read the comment?
|
||||
|
||||
# gc settings and binary caches
|
||||
nix = {
|
||||
settings = {
|
||||
substituters = [
|
||||
"https://aseipp-nix-cache.freetls.fastly.net"
|
||||
"https://nix-community.cachix.org"
|
||||
"https://cache.nixos.org/"
|
||||
];
|
||||
experimental-features = ["nix-command" "flakes"];
|
||||
auto-optimise-store = true;
|
||||
trusted-users = [
|
||||
"@wheel"
|
||||
];
|
||||
max-jobs = 2;
|
||||
cores = 8;
|
||||
};
|
||||
gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
options = "--delete-older-than 30d";
|
||||
};
|
||||
};
|
||||
|
||||
# boot
|
||||
boot.loader.systemd-boot.enable = true;
|
||||
boot.loader.efi.canTouchEfiVariables = true;
|
||||
boot.plymouth.enable = true;
|
||||
boot.initrd.systemd.enable = true;
|
||||
boot.supportedFilesystems = ["ntfs"];
|
||||
|
||||
# Configure console keymap
|
||||
console.keyMap = "de";
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = "Europe/Berlin";
|
||||
|
||||
# Select internationalisation properties.
|
||||
i18n.defaultLocale = "en_US.UTF-8";
|
||||
i18n.extraLocaleSettings = {
|
||||
LC_ADDRESS = "de_DE.UTF-8";
|
||||
LC_IDENTIFICATION = "de_DE.UTF-8";
|
||||
LC_MEASUREMENT = "de_DE.UTF-8";
|
||||
LC_MONETARY = "de_DE.UTF-8";
|
||||
LC_NAME = "de_DE.UTF-8";
|
||||
LC_NUMERIC = "de_DE.UTF-8";
|
||||
LC_PAPER = "de_DE.UTF-8";
|
||||
LC_TELEPHONE = "de_DE.UTF-8";
|
||||
LC_TIME = "de_DE.UTF-8";
|
||||
};
|
||||
|
||||
networking.hostName = "comfy-station"; # Define your hostname.
|
||||
|
||||
# Enable networking
|
||||
networking.networkmanager.enable = true;
|
||||
|
||||
# printing
|
||||
services.printing.enable = true;
|
||||
|
||||
# touchpad
|
||||
services.libinput.touchpad.naturalScrolling = true;
|
||||
|
||||
# ld-fix
|
||||
programs.nix-ld.enable = true;
|
||||
programs.nix-ld.libraries = [
|
||||
# Add any missing dynamic libraries for unpackaged programs
|
||||
# here, NOT in environment.systemPackages
|
||||
];
|
||||
}
|
||||
47
old/hosts/comfy-station/hardware-configuration.nix
Normal file
@@ -0,0 +1,47 @@
|
||||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
modulesPath,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = ["nvme" "ehci_pci" "xhci_pci" "usb_storage" "sd_mod" "rtsx_pci_sdmmc"];
|
||||
boot.initrd.kernelModules = ["dm-snapshot"];
|
||||
boot.kernelModules = ["kvm-amd"];
|
||||
boot.extraModulePackages = [];
|
||||
|
||||
boot.initrd.luks.devices."lvm-root".device = "/dev/disk/by-uuid/0b55681d-5c7b-4045-b895-d1eb7e306ffb";
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/88f53721-1c3f-43fd-8875-59e597aacb10";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/583D-114B";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices = [
|
||||
{device = "/dev/disk/by-uuid/f81521e7-4c09-4e91-8914-3dcd9febdfff";}
|
||||
];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp2s0f0.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp5s0.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.wlp3s0.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
||||
118
old/modules/bin/nix-scripts.nix
Normal file
@@ -0,0 +1,118 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
isHM,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.nix-scripts;
|
||||
home-rebuild =
|
||||
pkgs.writeShellScriptBin ".home-rebuild"
|
||||
''
|
||||
set -e
|
||||
pushd ~/.hive/
|
||||
${pkgs.alejandra}/bin/alejandra . &>/dev/null
|
||||
${pkgs.git}/bin/git diff -U0
|
||||
echo "NixOS Rebuilding..."
|
||||
home-manager switch --flake ~/.hive -b backup --log-format internal-json |& ${pkgs.nix-output-monitor}/bin/nom --json
|
||||
gen=$(home-manager generations | head -n1 | ${pkgs.gawk}/bin/awk '{print "Gen" $5 " @ " $1 "-" $2}')
|
||||
by="$(${pkgs.coreutils-full}/bin/whoami)@$(${pkgs.nettools}/bin/hostname)"
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -am "Home $gen by $by"
|
||||
popd
|
||||
'';
|
||||
rebuild =
|
||||
pkgs.writeShellScriptBin ".nixos-rebuild"
|
||||
''
|
||||
set -e
|
||||
pushd ~/.hive/
|
||||
${pkgs.alejandra}/bin/alejandra . &>/dev/null
|
||||
${pkgs.git}/bin/git diff -U0
|
||||
echo "NixOS Rebuilding..."
|
||||
${pkgs.nh}/bin/nh os switch ~/.hive
|
||||
gen=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | ${pkgs.gnugrep}/bin/grep current | ${pkgs.gawk}/bin/awk '{print "Gen" $1 " @ " $2 "-" $3}')
|
||||
by="$(${pkgs.coreutils-full}/bin/whoami)@$(${pkgs.nettools}/bin/hostname)"
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -am "System $gen by $by"
|
||||
popd
|
||||
'';
|
||||
upgrade =
|
||||
pkgs.writeShellScriptBin ".nixos-upgrade"
|
||||
''
|
||||
set -e
|
||||
pushd ~/.hive/
|
||||
if [ -n "$(${pkgs.git}/bin/git status --porcelain)" ]; then
|
||||
echo ".hive is unclean!"
|
||||
exit 1
|
||||
fi
|
||||
branch_staging="staging-update"
|
||||
|
||||
if ${pkgs.git}/bin/git rev-parse --verify "$branch_staging" >/dev/null 2>&1; then
|
||||
echo "Using staging update branch."
|
||||
else
|
||||
echo "No staging update branch found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
${pkgs.git}/bin/git checkout "$branch_staging" flake.lock
|
||||
echo "Updating nix-flake..."
|
||||
nix flake update --flake .
|
||||
echo "NixOS Rebuilding..."
|
||||
${pkgs.nh}/bin/nh os switch ~/.hive
|
||||
gen=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | ${pkgs.gnugrep}/bin/grep current | ${pkgs.gawk}/bin/awk '{print "Gen" $1 " @ " $2 "-" $3}')
|
||||
by="$(${pkgs.coreutils-full}/bin/whoami)@$(${pkgs.nettools}/bin/hostname)"
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -am "Upgrade $gen by $by"
|
||||
${pkgs.git}/bin/git branch -D "$branch_staging"
|
||||
popd
|
||||
'';
|
||||
update =
|
||||
pkgs.writeShellScriptBin ".nixos-update"
|
||||
''
|
||||
set -e
|
||||
pushd ~/.hive/
|
||||
if [ -n "$(${pkgs.git}/bin/git status --porcelain)" ]; then
|
||||
echo ".hive is unclean!"
|
||||
exit 1
|
||||
fi
|
||||
branch_staging="staging-update"
|
||||
branch_current="$(${pkgs.git}/bin/git branch --show-current)"
|
||||
|
||||
if ${pkgs.git}/bin/git rev-parse --verify "$branch_staging" >/dev/null 2>&1; then
|
||||
echo "There is already a staging update branch."
|
||||
else
|
||||
echo "Creating a new staging update branch."
|
||||
${pkgs.git}/bin/git switch -c "$branch_staging"
|
||||
nix flake update --verbose --flake .
|
||||
${pkgs.git}/bin/git add flake.lock
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -m "staging update"
|
||||
${pkgs.git}/bin/git switch "$branch_current"
|
||||
fi
|
||||
|
||||
nix store --log-format internal-json -v diff-closures \
|
||||
'.?ref='"$branch_current"'#nixosConfigurations.'"$(${pkgs.hostname}/bin/hostname)"'.config.system.build.toplevel' \
|
||||
'.?ref='"$branch_staging"'#nixosConfigurations.'"$(${pkgs.hostname}/bin/hostname)"'.config.system.build.toplevel' \
|
||||
|& ${pkgs.nix-output-monitor}/bin/nom --json
|
||||
|
||||
popd
|
||||
'';
|
||||
in {
|
||||
options = {
|
||||
hive.nix-scripts.enable = lib.mkEnableOption "Enable the nix build/update scripts";
|
||||
};
|
||||
|
||||
config =
|
||||
lib.mkIf cfg.enable
|
||||
(
|
||||
if isHM
|
||||
then {
|
||||
home.packages = [
|
||||
home-rebuild
|
||||
];
|
||||
}
|
||||
else {
|
||||
environment.systemPackages = [
|
||||
rebuild
|
||||
upgrade
|
||||
update
|
||||
];
|
||||
}
|
||||
);
|
||||
}
|
||||
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |