Compare commits

..

3 commits

Author SHA1 Message Date
f2d0e9239f
templates: fix home template
Signed-off-by: Bloxx12 <charlie@charlieroot.dev>
Change-Id: I6a6a696493a9883095a74467ffd3154851585173
2025-07-20 02:14:33 +02:00
e641dfa114
treewide: format using nixfmt
Signed-off-by: Bloxx12 <charlie@charlieroot.dev>
Change-Id: I6a6a69641c36f9763e104087a559c148d0449f00
2025-07-20 02:14:32 +02:00
f4464732e3
tooling: switch from alejandra to nixfmt
Signed-off-by: Bloxx12 <charlie@charlieroot.dev>
Change-Id: I6a6a696436b90e48895139b7e0b59b75c0e64cae
2025-07-20 02:14:31 +02:00
116 changed files with 1608 additions and 1087 deletions

View file

@ -3,34 +3,34 @@ let
# https://github.com/andir/npins?tab=readme-ov-file#using-the-nixpkgs-fetchers # https://github.com/andir/npins?tab=readme-ov-file#using-the-nixpkgs-fetchers
src = import ./npins; src = import ./npins;
pkgs = import src.nixpkgs {}; pkgs = import src.nixpkgs { };
sources = mapAttrs (k: v: v {inherit pkgs;}) src; sources = mapAttrs (k: v: v { inherit pkgs; }) src;
inherit (pkgs) lib; inherit (pkgs) lib;
inherit (lib.filesystem) listFilesRecursive; inherit (lib.filesystem) listFilesRecursive;
inherit (lib.strings) hasSuffix; inherit (lib.strings) hasSuffix;
mkSystem = system: hostname: mkSystem =
system: hostname:
import (src.nixpkgs + "/nixos/lib/eval-config.nix") { import (src.nixpkgs + "/nixos/lib/eval-config.nix") {
specialArgs = { specialArgs = {
inherit sources; inherit sources;
self = ./.; self = ./.;
}; };
modules = modules = [
[ # This is used to pre-emptively set the hostPlatform for nixpkgs.
# This is used to pre-emptively set the hostPlatform for nixpkgs. # Also, we set the system hostname here.
# Also, we set the system hostname here. {
{ networking.hostName = hostname;
networking.hostName = hostname; nixpkgs.hostPlatform = system;
nixpkgs.hostPlatform = system; }
} ./hosts/common.nix
./hosts/common.nix ./hosts/${hostname}
./hosts/${hostname} ]
] ++ ((listFilesRecursive ./modules) |> filter (hasSuffix ".mod.nix"));
++ ((listFilesRecursive ./modules)
|> filter (hasSuffix ".mod.nix"));
}; };
in { in
{
temperance = mkSystem "x86_64-linux" "temperance"; temperance = mkSystem "x86_64-linux" "temperance";
hermit = mkSystem "x86_64-linux" "hermit"; hermit = mkSystem "x86_64-linux" "hermit";
tower = mkSystem "aarch64-linux" "tower"; tower = mkSystem "aarch64-linux" "tower";

View file

@ -3,65 +3,38 @@
# No inputs, take this flakers # No inputs, take this flakers
outputs = _: let outputs =
sources = import ./npins; _:
nixpkgs = (import sources.flake-compat {src = sources.nixpkgs;}).outputs; let
sources = import ./npins;
nixpkgs = (import sources.flake-compat { src = sources.nixpkgs; }).outputs;
inherit (nixpkgs) lib;
pkgsFor = nixpkgs.legacyPackages;
inputs = sources;
in
{
nixosConfigurations = import ./default.nix;
inherit (nixpkgs) lib; packages = lib.mapAttrs (_: pkgs: {
eachSystem = lib.genAttrs (import sources.systems); inherit
pkgsFor = nixpkgs.legacyPackages; (import ./packages {
inputs = sources; inherit inputs pkgs sources;
in { })
nixosConfigurations = import ./default.nix; fish
helix
kakoune
nushell
;
}) pkgsFor;
devShells = lib.mapAttrs (_: pkgs: {
default = pkgs.mkShellNoCC {
packages = [
(pkgs.callPackage (sources.npins + "/npins.nix") { })
];
env.NPINS_OVERRIDE_nichts = ".";
};
}) pkgsFor;
formatter = eachSystem (system: pkgsFor.${system}.alejandra); templates = import ./templates;
};
packages =
lib.mapAttrs (
_: pkgs: {
inherit
(import ./packages {
inherit inputs pkgs;
})
fish
helix
kakoune
nushell
;
}
)
pkgsFor;
devShells =
lib.mapAttrs (
_: pkgs: {
default = pkgs.mkShellNoCC {
packages = [
(pkgs.callPackage (sources.npins + "/npins.nix") {})
];
env.NPINS_OVERRIDE_nichts = ".";
};
}
)
pkgsFor;
apps = eachSystem (system: let
inherit (inputs.self.packages.${system}) fish helix nushell;
in {
default = inputs.self.apps.${system}.nushell;
helix = {
type = "app";
program = "${helix}/bin/hx";
};
nushell = {
type = "app";
program = "${nushell}/bin/nu";
};
fish = {
type = "app";
program = "${fish}/bin/fish";
};
});
templates = import ./templates;
};
} }

View file

@ -6,16 +6,19 @@
lib, lib,
self, self,
pkgs, pkgs,
sources,
... ...
}: let }:
let
inherit (lib.meta) hiPrioSet; inherit (lib.meta) hiPrioSet;
helix = pkgs.callPackage (self + "/packages/helix") {}; helix = pkgs.callPackage (self + "/packages/helix") { inherit sources; };
fish = pkgs.callPackage (self + "/packages/fish") {};
in { fish = pkgs.callPackage (self + "/packages/fish") { inherit sources; };
in
{
environment.systemPackages = environment.systemPackages =
builtins.attrValues { builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
cachix cachix
calc calc
delta delta

View file

@ -3,7 +3,8 @@
nixpkgs, nixpkgs,
self, self,
... ...
}: let }:
let
inherit (builtins) filter map toString; inherit (builtins) filter map toString;
inherit (nixpkgs) lib; inherit (nixpkgs) lib;
inherit (lib.attrsets) recursiveUpdate; inherit (lib.attrsets) recursiveUpdate;
@ -14,20 +15,18 @@
# NOTE: This was inspired by raf, and I find this # NOTE: This was inspired by raf, and I find this
# to be quite a sane way of managing all modules in my flake. # to be quite a sane way of managing all modules in my flake.
mkSystem = { mkSystem =
system, {
hostname, system,
... hostname,
} @ args: ...
}@args:
nixosSystem { nixosSystem {
specialArgs = specialArgs = recursiveUpdate {
recursiveUpdate inherit lib;
{ inputs = sources;
inherit lib; inherit self;
inputs = sources; } args.specialArgs or { };
inherit self;
}
args.specialArgs or {};
modules = concatLists [ modules = concatLists [
# This is used to pre-emptively set the hostPlatform for nixpkgs. # This is used to pre-emptively set the hostPlatform for nixpkgs.
# Also, we set the system hostname here. # Also, we set the system hostname here.
@ -42,20 +41,15 @@
# common configuration, which all hosts share. # common configuration, which all hosts share.
(singleton ./common.nix) (singleton ./common.nix)
# Import all files called module.nix from my modules directory. # Import all files called module.nix from my modules directory.
( (map toString (listFilesRecursive ../modules) |> filter (hasSuffix "module.nix"))
map toString (listFilesRecursive ../modules) (map toString (listFilesRecursive ../modules) |> filter (hasSuffix ".mod.nix"))
|> filter (hasSuffix "module.nix")
)
(
map toString (listFilesRecursive ../modules)
|> filter (hasSuffix ".mod.nix")
)
] ]
|> flatten |> flatten
) )
]; ];
}; };
in { in
{
temperance = mkSystem { temperance = mkSystem {
system = "x86_64-linux"; system = "x86_64-linux";
hostname = "temperance"; hostname = "temperance";

View file

@ -2,7 +2,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
# Time Zone # Time Zone
time.timeZone = "Europe/Zurich"; time.timeZone = "Europe/Zurich";
# Select internationalisation properties. # Select internationalisation properties.

View file

@ -1,6 +1,7 @@
{ {
config = { config = {
boot.initrd.luks.devices."cryptroot".device = "/dev/disk/by-uuid/10318654-ed20-43f6-885d-35366a427581"; boot.initrd.luks.devices."cryptroot".device =
"/dev/disk/by-uuid/10318654-ed20-43f6-885d-35366a427581";
fileSystems = { fileSystems = {
"/boot" = { "/boot" = {
device = "/dev/disk/by-uuid/5D7D-FC52"; device = "/dev/disk/by-uuid/5D7D-FC52";
@ -10,17 +11,28 @@
"/" = { "/" = {
device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e"; device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e";
fsType = "btrfs"; fsType = "btrfs";
options = ["compress=zstd" "noatime"]; options = [
"compress=zstd"
"noatime"
];
}; };
"/nix" = { "/nix" = {
device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e"; device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e";
fsType = "btrfs"; fsType = "btrfs";
options = ["subvol=nix" "compress=zstd" "noatime"]; options = [
"subvol=nix"
"compress=zstd"
"noatime"
];
}; };
"/home" = { "/home" = {
device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e"; device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e";
fsType = "btrfs"; fsType = "btrfs";
options = ["subvol=home" "compress=zstd" "noatime"]; options = [
"subvol=home"
"compress=zstd"
"noatime"
];
}; };
}; };
# swapDevices = [ # swapDevices = [

View file

@ -6,21 +6,34 @@
lib, lib,
modulesPath, modulesPath,
... ...
}: { }:
{
imports = [ imports = [
(modulesPath + "/installer/scan/not-detected.nix") (modulesPath + "/installer/scan/not-detected.nix")
]; ];
boot = { boot = {
initrd = { initrd = {
availableKernelModules = ["xhci_pci" "ahci" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc"]; availableKernelModules = [
kernelModules = []; "xhci_pci"
"ahci"
"nvme"
"usb_storage"
"sd_mod"
"rtsx_pci_sdmmc"
];
kernelModules = [ ];
}; };
kernelModules = ["kvm-intel"]; kernelModules = [ "kvm-intel" ];
blacklistedKernelModules = ["nouveau" "nvidia" "nvidia_drm" "nvidia_modeset"]; blacklistedKernelModules = [
"nouveau"
"nvidia"
"nvidia_drm"
"nvidia_modeset"
];
kernelParams = ["mem_sleep_default=deep"]; kernelParams = [ "mem_sleep_default=deep" ];
extraModulePackages = []; extraModulePackages = [ ];
extraModprobeConfig = '' extraModprobeConfig = ''
blacklist nouveau blacklist nouveau
options nouveau modeset=0 options nouveau modeset=0

View file

@ -1 +1 @@
_: {imports = [./monitors.nix];} _: { imports = [ ./monitors.nix ]; }

View file

@ -3,8 +3,10 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
xanmod_custom = callPackage ./xanmod.nix; xanmod_custom = callPackage ./xanmod.nix;
in { in
{
boot.kernelPackages = xanmod_custom; boot.kernelPackages = xanmod_custom;
} }

View file

@ -1,4 +1,5 @@
{pkgs, ...}: let { pkgs, ... }:
let
# a newer nil version, for pipes support. # a newer nil version, for pipes support.
new-nil = pkgs.nil.overrideAttrs (_: { new-nil = pkgs.nil.overrideAttrs (_: {
version = "unstable-18-07-2025"; version = "unstable-18-07-2025";
@ -17,13 +18,12 @@
hash = "sha256-Sljr3ff8hl/qm/0wqc1GXsEr1wWn7NAXmdrd5wHzUX8="; hash = "sha256-Sljr3ff8hl/qm/0wqc1GXsEr1wWn7NAXmdrd5wHzUX8=";
}; };
}); });
in { in
{
environment.systemPackages = builtins.attrValues { environment.systemPackages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
abook abook
aerc aerc
alejandra
aichat aichat
alsa-utils alsa-utils
anki anki

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
# Time Zone # Time Zone
time.timeZone = "Europe/Zurich"; time.timeZone = "Europe/Zurich";
# Select internationalisation properties. # Select internationalisation properties.

View file

@ -1,6 +1,7 @@
{ {
config = { config = {
boot.initrd.luks.devices."cryptroot".device = "/dev/disk/by-uuid/96e8f3d6-8d2d-4e2d-abd9-3eb7f48fed02"; boot.initrd.luks.devices."cryptroot".device =
"/dev/disk/by-uuid/96e8f3d6-8d2d-4e2d-abd9-3eb7f48fed02";
fileSystems = { fileSystems = {
"/boot" = { "/boot" = {
device = "/dev/disk/by-uuid/B3AC-9050"; device = "/dev/disk/by-uuid/B3AC-9050";
@ -10,29 +11,49 @@
"/" = { "/" = {
device = "none"; device = "none";
fsType = "tmpfs"; fsType = "tmpfs";
options = ["defaults" "size=40%" "mode=755"]; options = [
"defaults"
"size=40%"
"mode=755"
];
}; };
"/nix" = { "/nix" = {
device = "/dev/disk/by-uuid/f0569993-722e-4721-b0d9-8ac537a7a548"; device = "/dev/disk/by-uuid/f0569993-722e-4721-b0d9-8ac537a7a548";
fsType = "btrfs"; fsType = "btrfs";
options = ["subvol=nix" "compress=zstd" "noatime"]; options = [
"subvol=nix"
"compress=zstd"
"noatime"
];
}; };
"/persist" = { "/persist" = {
device = "/dev/disk/by-uuid/f0569993-722e-4721-b0d9-8ac537a7a548"; device = "/dev/disk/by-uuid/f0569993-722e-4721-b0d9-8ac537a7a548";
neededForBoot = true; neededForBoot = true;
fsType = "btrfs"; fsType = "btrfs";
options = ["subvol=persist" "compress=zstd" "noatime"]; options = [
"subvol=persist"
"compress=zstd"
"noatime"
];
}; };
"/home" = { "/home" = {
device = "/dev/disk/by-uuid/f0569993-722e-4721-b0d9-8ac537a7a548"; device = "/dev/disk/by-uuid/f0569993-722e-4721-b0d9-8ac537a7a548";
fsType = "btrfs"; fsType = "btrfs";
options = ["subvol=home" "compress=zstd" "noatime"]; options = [
"subvol=home"
"compress=zstd"
"noatime"
];
}; };
"/swap" = { "/swap" = {
device = "/dev/disk/by-uuid/f0569993-722e-4721-b0d9-8ac537a7a548"; device = "/dev/disk/by-uuid/f0569993-722e-4721-b0d9-8ac537a7a548";
fsType = "btrfs"; fsType = "btrfs";
options = ["subvol=swap" "compress=lzo" "noatime"]; options = [
"subvol=swap"
"compress=lzo"
"noatime"
];
}; };
}; };
swapDevices = [ swapDevices = [

View file

@ -3,14 +3,21 @@
lib, lib,
modulesPath, modulesPath,
... ...
}: { }:
imports = [(modulesPath + "/installer/scan/not-detected.nix")]; {
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
boot = { boot = {
initrd.availableKernelModules = ["xhci_pci" "ahci" "nvme" "usbhid" "sd_mod"]; initrd.availableKernelModules = [
initrd.kernelModules = []; "xhci_pci"
kernelModules = []; "ahci"
extraModulePackages = []; "nvme"
"usbhid"
"sd_mod"
];
initrd.kernelModules = [ ];
kernelModules = [ ];
extraModulePackages = [ ];
}; };
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
@ -21,6 +28,5 @@
# networking.interfaces.enp4s0.useDHCP = lib.mkDefault true; # networking.interfaces.enp4s0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.intel.updateMicrocode = hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
lib.mkDefault config.hardware.enableRedistributableFirmware;
} }

View file

@ -1 +1 @@
_: {imports = [./monitors.nix];} _: { imports = [ ./monitors.nix ]; }

View file

@ -3,8 +3,10 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
xanmod_custom = callPackage ./xanmod.nix; xanmod_custom = callPackage ./xanmod.nix;
in { in
{
boot.kernelPackages = xanmod_custom; boot.kernelPackages = xanmod_custom;
} }

View file

@ -1,8 +1,10 @@
{lib, ...}: let { lib, ... }:
let
inherit (lib.kernel) no unset; inherit (lib.kernel) no unset;
inherit (lib.attrsets) mapAttrs; inherit (lib.attrsets) mapAttrs;
inherit (lib.modules) mkForce; inherit (lib.modules) mkForce;
in { in
{
boot.kernelPatches = [ boot.kernelPatches = [
{ {
name = "disable-unused-features"; name = "disable-unused-features";

View file

@ -4,7 +4,8 @@
buildLinux, buildLinux,
kernelPatches, kernelPatches,
... ...
}: let }:
let
pname = "linux-xanmod"; pname = "linux-xanmod";
version = "6.11.5"; version = "6.11.5";
vendorSuffix = "xanmod1"; vendorSuffix = "xanmod1";
@ -58,17 +59,17 @@
}; };
}) })
# 1:1 taken from raf's custom kernel, check out his config for this. # 1:1 taken from raf's custom kernel, check out his config for this.
.overrideAttrs (oa: { .overrideAttrs
prePatch = (oa: {
oa.prePatch or "" prePatch = oa.prePatch or "" + ''
+ ''
# bragging rights # bragging rights
echo "Replacing localversion with custom suffix" echo "Replacing localversion with custom suffix"
substituteInPlace localversion \ substituteInPlace localversion \
--replace-fail "xanmod1" "blox" --replace-fail "xanmod1" "blox"
''; '';
}); });
in { in
{
inherit inherit
xanmod_blox xanmod_blox
; ;

View file

@ -1,7 +1,7 @@
{pkgs, ...}: { { pkgs, ... }:
{
environment.systemPackages = builtins.attrValues { environment.systemPackages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
alsa-utils alsa-utils
anki anki
asciinema asciinema

View file

@ -2,7 +2,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
# Time Zone # Time Zone
time.timeZone = "Europe/Vienna"; time.timeZone = "Europe/Vienna";
# Select internationalisation properties. # Select internationalisation properties.

View file

@ -8,7 +8,7 @@
"/" = { "/" = {
device = "/dev/disk/by-uuid/3a781f2e-290a-4609-9035-a93374459def"; device = "/dev/disk/by-uuid/3a781f2e-290a-4609-9035-a93374459def";
fsType = "ext4"; fsType = "ext4";
options = ["noatime"]; options = [ "noatime" ];
}; };
}; };
} }

View file

@ -2,19 +2,24 @@
lib, lib,
modulesPath, modulesPath,
... ...
}: { }:
{
imports = [ imports = [
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot = { boot = {
initrd.availableKernelModules = ["xhci_pci" "virtio_scsi" "sr_mod"]; initrd.availableKernelModules = [
initrd.kernelModules = []; "xhci_pci"
kernelModules = []; "virtio_scsi"
extraModulePackages = []; "sr_mod"
];
initrd.kernelModules = [ ];
kernelModules = [ ];
extraModulePackages = [ ];
}; };
swapDevices = []; swapDevices = [ ];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # 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 # (the default) this is the recommended approach. When using systemd-networkd it's

View file

@ -1,7 +1,7 @@
{pkgs, ...}: { { pkgs, ... }:
{
environment.systemPackages = builtins.attrValues { environment.systemPackages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
; ;
}; };
} }

View file

@ -2,7 +2,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
# Time Zone # Time Zone
time.timeZone = "Europe/Zurich"; time.timeZone = "Europe/Zurich";
# Select internationalisation properties. # Select internationalisation properties.

View file

@ -1,6 +1,7 @@
{ {
config = { config = {
boot.initrd.luks.devices."cryptroot".device = "/dev/disk/by-uuid/10318654-ed20-43f6-885d-35366a427581"; boot.initrd.luks.devices."cryptroot".device =
"/dev/disk/by-uuid/10318654-ed20-43f6-885d-35366a427581";
fileSystems = { fileSystems = {
"/boot" = { "/boot" = {
device = "/dev/disk/by-uuid/5D7D-FC52"; device = "/dev/disk/by-uuid/5D7D-FC52";
@ -10,17 +11,28 @@
"/" = { "/" = {
device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e"; device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e";
fsType = "btrfs"; fsType = "btrfs";
options = ["compress=zstd" "noatime"]; options = [
"compress=zstd"
"noatime"
];
}; };
"/nix" = { "/nix" = {
device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e"; device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e";
fsType = "btrfs"; fsType = "btrfs";
options = ["subvol=nix" "compress=zstd" "noatime"]; options = [
"subvol=nix"
"compress=zstd"
"noatime"
];
}; };
"/home" = { "/home" = {
device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e"; device = "/dev/disk/by-uuid/e353013b-8ac7-40ed-80f2-ddbea21b8d5e";
fsType = "btrfs"; fsType = "btrfs";
options = ["subvol=home" "compress=zstd" "noatime"]; options = [
"subvol=home"
"compress=zstd"
"noatime"
];
}; };
}; };
# swapDevices = [ # swapDevices = [

View file

@ -3,7 +3,8 @@
lib, lib,
modulesPath, modulesPath,
... ...
}: { }:
{
imports = [ imports = [
# (modulesPath + "/installer/cd-dvd/installation-cd-minimal.nix") # (modulesPath + "/installer/cd-dvd/installation-cd-minimal.nix")
(modulesPath + "/installer/scan/not-detected.nix") (modulesPath + "/installer/scan/not-detected.nix")
@ -11,14 +12,26 @@
boot = { boot = {
initrd = { initrd = {
availableKernelModules = ["xhci_pci" "ahci" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc"]; availableKernelModules = [
kernelModules = []; "xhci_pci"
"ahci"
"nvme"
"usb_storage"
"sd_mod"
"rtsx_pci_sdmmc"
];
kernelModules = [ ];
}; };
kernelModules = ["kvm-intel"]; kernelModules = [ "kvm-intel" ];
blacklistedKernelModules = ["nouveau" "nvidia" "nvidia_drm" "nvidia_modeset"]; blacklistedKernelModules = [
"nouveau"
"nvidia"
"nvidia_drm"
"nvidia_modeset"
];
kernelParams = ["mem_sleep_default=deep"]; kernelParams = [ "mem_sleep_default=deep" ];
extraModulePackages = []; extraModulePackages = [ ];
extraModprobeConfig = '' extraModprobeConfig = ''
blacklist nouveau blacklist nouveau
options nouveau modeset=0 options nouveau modeset=0

View file

@ -1 +1 @@
_: {imports = [./monitors.nix];} _: { imports = [ ./monitors.nix ]; }

View file

@ -2,10 +2,10 @@
self, self,
pkgs, pkgs,
... ...
}: { }:
{
environment.systemPackages = builtins.attrValues { environment.systemPackages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
calc calc
comma comma
difftastic difftastic

View file

@ -1,10 +1,18 @@
{lib, ...}: let { lib, ... }:
let
inherit (lib.options) mkOption; inherit (lib.options) mkOption;
inherit (lib.types) submodule int ints number attrsOf; inherit (lib.types)
in { submodule
int
ints
number
attrsOf
;
in
{
options.modules.system.hardware.monitors = mkOption { options.modules.system.hardware.monitors = mkOption {
description = "\n List of monitors to use\n "; description = "\n List of monitors to use\n ";
default = {}; default = { };
type = attrsOf (submodule { type = attrsOf (submodule {
options = { options = {
resolution = mkOption { resolution = mkOption {

View file

@ -2,18 +2,26 @@
config, config,
lib, lib,
... ...
}: let }:
let
inherit (builtins) elemAt; inherit (builtins) elemAt;
inherit (lib.options) mkOption mkEnableOption; inherit (lib.options) mkOption mkEnableOption;
inherit (lib.types) enum listOf str nullOr bool; inherit (lib.types)
enum
listOf
str
nullOr
bool
;
inherit (lib.lists) elem; inherit (lib.lists) elem;
inherit (config.modules.system) systemType; inherit (config.modules.system) systemType;
in { in
{
options.modules.system = { options.modules.system = {
users = mkOption { users = mkOption {
type = listOf str; type = listOf str;
default = ["cr"]; default = [ "cr" ];
description = "A list of users on the system."; description = "A list of users on the system.";
}; };
@ -27,7 +35,11 @@ in {
}; };
systemType = mkOption { systemType = mkOption {
type = nullOr (enum ["desktop" "laptop" "server"]); type = nullOr (enum [
"desktop"
"laptop"
"server"
]);
default = null; default = null;
description = '' description = ''
The type of the current system. This is used to determine whether things like graphical The type of the current system. This is used to determine whether things like graphical
@ -37,7 +49,10 @@ in {
isGraphical = mkOption { isGraphical = mkOption {
type = bool; type = bool;
default = elem systemType ["desktop" "laptop"]; default = elem systemType [
"desktop"
"laptop"
];
description = '' description = ''
Whether the current system is a graphical system. Whether the current system is a graphical system.
''; '';
@ -46,7 +61,10 @@ in {
yubikeySupport = { yubikeySupport = {
enable = mkEnableOption "yubikey support"; enable = mkEnableOption "yubikey support";
deviceType = mkOption { deviceType = mkOption {
type = nullOr (enum ["NFC5" "nano"]); type = nullOr (enum [
"NFC5"
"nano"
]);
default = null; default = null;
description = "A list of device models to enable Yubikey support for"; description = "A list of device models to enable Yubikey support for";
}; };
@ -76,7 +94,7 @@ in {
enable = mkEnableOption "printing"; enable = mkEnableOption "printing";
extraDrivers = mkOption { extraDrivers = mkOption {
type = listOf str; type = listOf str;
default = []; default = [ ];
description = "A list of extra drivers to enable for printing"; description = "A list of extra drivers to enable for printing";
}; };
}; };

View file

@ -1,7 +1,9 @@
{lib, ...}: let { lib, ... }:
let
inherit (lib.types) str enum; inherit (lib.types) str enum;
inherit (lib.options) mkEnableOption mkOption; inherit (lib.options) mkEnableOption mkOption;
in { in
{
options.modules.system.programs = { options.modules.system.programs = {
editors = { editors = {
helix.enable = mkEnableOption "Helix text editor"; helix.enable = mkEnableOption "Helix text editor";
@ -27,23 +29,42 @@ in {
}; };
default = { default = {
terminal = mkOption { terminal = mkOption {
type = enum ["foot" "kitty"]; type = enum [
"foot"
"kitty"
];
default = "foot"; default = "foot";
}; };
fileManager = mkOption { fileManager = mkOption {
type = enum ["thunar" "dolphin" "nemo"]; type = enum [
"thunar"
"dolphin"
"nemo"
];
default = "thunar"; default = "thunar";
}; };
browser = mkOption { browser = mkOption {
type = enum ["firefox" "librewolf" "chromium"]; type = enum [
"firefox"
"librewolf"
"chromium"
];
default = "firefox"; default = "firefox";
}; };
editor = mkOption { editor = mkOption {
type = enum ["neovim" "helix" "emacs"]; type = enum [
"neovim"
"helix"
"emacs"
];
default = "emacs"; default = "emacs";
}; };
launcher = mkOption { launcher = mkOption {
type = enum ["anyrun" "rofi" "wofi"]; type = enum [
"anyrun"
"rofi"
"wofi"
];
default = "anyrun"; default = "anyrun";
}; };
}; };

View file

@ -1,7 +1,8 @@
{pkgs, ...}: let { pkgs, ... }:
key = let
pkgs.writeText "signingkey" "ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAAWEDj/Yib6Mqs016jx7rtecWpytwfVl28eoHtPYCM9TVLq81VIHJSN37lbkc/JjiXCdIJy2Ta3A3CVV5k3Z37NbgAu23oKA2OcHQNaRTLtqWlcBf9fk9suOkP1A3NzAqzivFpBnZm3ytaXwU8LBJqxOtNqZcFVruO6fZxJtg2uE34mAw=="; key = pkgs.writeText "signingkey" "ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAAWEDj/Yib6Mqs016jx7rtecWpytwfVl28eoHtPYCM9TVLq81VIHJSN37lbkc/JjiXCdIJy2Ta3A3CVV5k3Z37NbgAu23oKA2OcHQNaRTLtqWlcBf9fk9suOkP1A3NzAqzivFpBnZm3ytaXwU8LBJqxOtNqZcFVruO6fZxJtg2uE34mAw==";
in { in
{
programs.git = { programs.git = {
enable = true; enable = true;
lfs.enable = true; lfs.enable = true;

View file

@ -1,7 +1,9 @@
{lib, ...}: let { lib, ... }:
let
inherit (lib.options) mkOption; inherit (lib.options) mkOption;
inherit (lib.types) str; inherit (lib.types) str;
in { in
{
options.modules.other.system = { options.modules.other.system = {
username = mkOption { username = mkOption {
description = "username for this system"; description = "username for this system";

View file

@ -4,18 +4,20 @@
pkgs, pkgs,
self, self,
... ...
}: let }:
let
inherit (builtins) elemAt; inherit (builtins) elemAt;
inherit (lib.options) mkOption; inherit (lib.options) mkOption;
inherit (lib.types) listOf str package; inherit (lib.types) listOf str package;
inherit (config.meta.mainUser) username; inherit (config.meta.mainUser) username;
nushell = pkgs.callPackage (self + "/packages/nushell") {}; nushell = pkgs.callPackage (self + "/packages/nushell") { };
in { in
{
options.meta = { options.meta = {
users = mkOption { users = mkOption {
type = listOf str; type = listOf str;
default = ["cr"]; default = [ "cr" ];
description = '' description = ''
A list of users on a system. A list of users on a system.
''; '';

View file

@ -2,7 +2,8 @@
config, config,
pkgs, pkgs,
... ...
}: let }:
let
inherit (config.meta.mainUser) username; inherit (config.meta.mainUser) username;
primary_browser = "Librewolf.desktop"; primary_browser = "Librewolf.desktop";
@ -13,9 +14,10 @@
text_editor = "helix.desktop"; text_editor = "helix.desktop";
terminal = "foot.desktop"; terminal = "foot.desktop";
pdf_viewer = "zathura.desktop"; pdf_viewer = "zathura.desktop";
in { in
{
environment = { environment = {
systemPackages = [pkgs.xdg-utils]; systemPackages = [ pkgs.xdg-utils ];
variables = { variables = {
TERMINAL = "${terminal}"; TERMINAL = "${terminal}";
XDG_CACHE_HOME = "/home/${username}/.config"; XDG_CACHE_HOME = "/home/${username}/.config";
@ -29,43 +31,43 @@ in {
mime = { mime = {
enable = true; enable = true;
defaultApplications = { defaultApplications = {
"text/html" = [primary_browser]; "text/html" = [ primary_browser ];
"x-scheme-handler/http" = [primary_browser]; "x-scheme-handler/http" = [ primary_browser ];
"x-scheme-handler/https" = [primary_browser]; "x-scheme-handler/https" = [ primary_browser ];
"x-scheme-handler/about" = [primary_browser]; "x-scheme-handler/about" = [ primary_browser ];
"x-scheme-handler/unknown" = [primary_browser]; "x-scheme-handler/unknown" = [ primary_browser ];
"x-scheme-handler/mailto" = [mail_client]; "x-scheme-handler/mailto" = [ mail_client ];
"message/rfc822" = [mail_client]; "message/rfc822" = [ mail_client ];
"x-scheme-handler/mid" = [mail_client]; "x-scheme-handler/mid" = [ mail_client ];
"inode/directory" = [file_manager]; "inode/directory" = [ file_manager ];
"audio/mp3" = [media_player]; "audio/mp3" = [ media_player ];
"audio/ogg" = [media_player]; "audio/ogg" = [ media_player ];
"audio/mpeg" = [media_player]; "audio/mpeg" = [ media_player ];
"audio/aac" = [media_player]; "audio/aac" = [ media_player ];
"audio/opus" = [media_player]; "audio/opus" = [ media_player ];
"audio/wav" = [media_player]; "audio/wav" = [ media_player ];
"audio/webm" = [media_player]; "audio/webm" = [ media_player ];
"audio/3gpp" = [media_player]; "audio/3gpp" = [ media_player ];
"audio/3gpp2" = [media_player]; "audio/3gpp2" = [ media_player ];
"video/mp4" = [media_player]; "video/mp4" = [ media_player ];
"video/x-msvideo" = [media_player]; "video/x-msvideo" = [ media_player ];
"video/mpeg" = [media_player]; "video/mpeg" = [ media_player ];
"video/ogg" = [media_player]; "video/ogg" = [ media_player ];
"video/mp2t" = [media_player]; "video/mp2t" = [ media_player ];
"video/webm" = [media_player]; "video/webm" = [ media_player ];
"video/3gpp" = [media_player]; "video/3gpp" = [ media_player ];
"video/3gpp2" = [media_player]; "video/3gpp2" = [ media_player ];
"image/png" = [image_viewer]; "image/png" = [ image_viewer ];
"image/jpeg" = [image_viewer]; "image/jpeg" = [ image_viewer ];
"image/gif" = [image_viewer]; "image/gif" = [ image_viewer ];
"image/avif" = [image_viewer]; "image/avif" = [ image_viewer ];
"image/bmp" = [image_viewer]; "image/bmp" = [ image_viewer ];
"image/vnd.microsoft.icon" = [image_viewer]; "image/vnd.microsoft.icon" = [ image_viewer ];
"image/svg+xml" = [image_viewer]; "image/svg+xml" = [ image_viewer ];
"image/tiff" = [image_viewer]; "image/tiff" = [ image_viewer ];
"image/webp" = [image_viewer]; "image/webp" = [ image_viewer ];
"text/plain" = [text_editor]; "text/plain" = [ text_editor ];
"application/pdf" = [pdf_viewer]; "application/pdf" = [ pdf_viewer ];
}; };
}; };
}; };

View file

@ -0,0 +1,13 @@
{
pkgs,
sources,
...
}:
let
nixfmt = pkgs.callPackage "${sources.nixfmt}/default.nix" { };
in
{
environment.systemPackages = [
nixfmt
];
}

View file

@ -3,10 +3,11 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.meta) getExe; inherit (lib.meta) getExe;
toml = pkgs.formats.toml {}; toml = pkgs.formats.toml { };
jj-config = toml.generate "config.toml" { jj-config = toml.generate "config.toml" {
user = { user = {
name = "Bloxx12"; name = "Bloxx12";
@ -14,11 +15,20 @@
}; };
ui = { ui = {
pager = ["${getExe pkgs.bat}" "--plain"]; pager = [
"${getExe pkgs.bat}"
"--plain"
];
default-command = "log"; default-command = "log";
movement.edit = true; movement.edit = true;
diff.tool = ["${getExe pkgs.difftastic}" "--color" "always" "$left" "$right"]; diff.tool = [
"${getExe pkgs.difftastic}"
"--color"
"always"
"$left"
"$right"
];
}; };
# FIXME: do this with agenix # FIXME: do this with agenix
# "--scope" = [ # "--scope" = [
@ -44,26 +54,52 @@
signing = { signing = {
behaviour = "own"; behaviour = "own";
backend = "ssh"; backend = "ssh";
key = ["ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAAWEDj/Yib6Mqs016jx7rtecWpytwfVl28eoHtPYCM9TVLq81VIHJSN37lbkc/JjiXCdIJy2Ta3A3CVV5k3Z37NbgAu23oKA2OcHQNaRTLtqWlcBf9fk9suOkP1A3NzAqzivFpBnZm3ytaXwU8LBJqxOtNqZcFVruO6fZxJtg2uE34mAw=="]; key = [
"ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAAWEDj/Yib6Mqs016jx7rtecWpytwfVl28eoHtPYCM9TVLq81VIHJSN37lbkc/JjiXCdIJy2Ta3A3CVV5k3Z37NbgAu23oKA2OcHQNaRTLtqWlcBf9fk9suOkP1A3NzAqzivFpBnZm3ytaXwU8LBJqxOtNqZcFVruO6fZxJtg2uE34mAw=="
];
}; };
aliases = { aliases = {
c = ["commit"]; c = [ "commit" ];
ci = ["commit" "--interactive"]; ci = [
"commit"
"--interactive"
];
e = ["edit"]; e = [ "edit" ];
# "new bookmark" # "new bookmark"
nb = ["bookmark" "create" "-r @-"]; nb = [
"bookmark"
"create"
"-r @-"
];
pull = ["git" "fetch"]; pull = [
push = ["git" "push" "--allow-new"]; "git"
"fetch"
];
push = [
"git"
"push"
"--allow-new"
];
r = ["rebase"]; r = [ "rebase" ];
s = ["squash"]; s = [ "squash" ];
si = ["squash" "--interactive"]; si = [
"squash"
"--interactive"
];
tug = ["bookmark" "move" "--from" "closest_bookmark(@-)" "--to" "@-"]; tug = [
"bookmark"
"move"
"--from"
"closest_bookmark(@-)"
"--to"
"@-"
];
}; };
revset-aliases = { revset-aliases = {
"closest_bookmark(to)" = "heads(::to & bookmarks())"; "closest_bookmark(to)" = "heads(::to & bookmarks())";
@ -89,14 +125,15 @@
jj-wrapped = pkgs.symlinkJoin { jj-wrapped = pkgs.symlinkJoin {
name = "jj-wrapped"; name = "jj-wrapped";
paths = [pkgs.jj]; paths = [ pkgs.jj ];
nativeBuildInputs = [pkgs.makeWrapper]; nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = '' postBuild = ''
wrapProgram $out/bin/mako --add-flags "\ wrapProgram $out/bin/mako --add-flags "\
--config ${jj-config} --config ${jj-config}
''; '';
}; };
in { in
{
# environment.systemPackages = [jj-wrapped]; # environment.systemPackages = [jj-wrapped];
} }

View file

@ -4,15 +4,17 @@
pkgs, pkgs,
sources, sources,
... ...
}: let }:
let
cfg = config.modules.programs.nh; cfg = config.modules.programs.nh;
inherit (config.modules.other.system) username; inherit (config.modules.other.system) username;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
nh = (pkgs.callPackage "${sources.nh}/package.nix" {}).overrideAttrs (_: { nh = (pkgs.callPackage "${sources.nh}/package.nix" { }).overrideAttrs (_: {
doInstallCheck = false; doInstallCheck = false;
}); });
in { in
{
options.modules.programs.nh.enable = mkEnableOption "nh"; options.modules.programs.nh.enable = mkEnableOption "nh";
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -3,25 +3,26 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (config.modules.system) isGraphical; inherit (config.modules.system) isGraphical;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
bitwarden-desktop-wrapped = pkgs.symlinkJoin { bitwarden-desktop-wrapped = pkgs.symlinkJoin {
name = "bitwarden-desktop-wrapped"; name = "bitwarden-desktop-wrapped";
paths = [pkgs.bitwarden-desktop]; paths = [ pkgs.bitwarden-desktop ];
nativeBuildInputs = [pkgs.makeWrapper]; nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = '' postBuild = ''
wrapProgram $out/bin/bitwarden --set \ wrapProgram $out/bin/bitwarden --set \
BITWARDEN_SSH_AUTH_SOCK /run/user/1000/ssh-agent.sock BITWARDEN_SSH_AUTH_SOCK /run/user/1000/ssh-agent.sock
''; '';
}; };
in { in
{
config = mkIf isGraphical { config = mkIf isGraphical {
environment = { environment = {
systemPackages = lib.attrValues { systemPackages = lib.attrValues {
inherit inherit (pkgs)
(pkgs)
bitwarden-cli bitwarden-cli
; ;
inherit bitwarden-desktop-wrapped; inherit bitwarden-desktop-wrapped;

View file

@ -2,7 +2,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.lists) map; inherit (lib.lists) map;
inherit (lib.strings) concatStringsSep; inherit (lib.strings) concatStringsSep;
@ -20,16 +21,15 @@
brave-wrapped = pkgs.symlinkJoin { brave-wrapped = pkgs.symlinkJoin {
name = "brave"; name = "brave";
paths = [ paths = [
( (pkgs.brave.override { vulkanSupport = true; })
pkgs.brave.override {vulkanSupport = true;}
)
]; ];
nativeBuildInputs = [pkgs.makeWrapper]; nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = '' postBuild = ''
wrapProgram $out/bin/brave --append-flags "${flags}" wrapProgram $out/bin/brave --append-flags "${flags}"
''; '';
}; };
in { in
{
environment.systemPackages = [ environment.systemPackages = [
brave-wrapped brave-wrapped
]; ];

View file

@ -3,15 +3,17 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (config.modules.system) isGraphical; inherit (config.modules.system) isGraphical;
in { in
{
config = mkIf isGraphical { config = mkIf isGraphical {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
kdePackages.dolphin kdePackages.dolphin
kdePackages.kio-fuse #to mount remote filesystems via FUSE kdePackages.kio-fuse # to mount remote filesystems via FUSE
kdePackages.kio-extras #extra protocols support (sftp, fish and more) kdePackages.kio-extras # extra protocols support (sftp, fish and more)
]; ];
}; };
} }

View file

@ -3,137 +3,141 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (config.meta.mainUser) username; inherit (config.meta.mainUser) username;
cfg = config.modules.system.programs.terminals.foot; cfg = config.modules.system.programs.terminals.foot;
theme-colors = config.modules.style.colorScheme.colors; theme-colors = config.modules.style.colorScheme.colors;
foot-config = pkgs.writeText "foot.ini" (lib.generators.toINI {} { foot-config = pkgs.writeText "foot.ini" (
main = { lib.generators.toINI { } {
term = "xterm-256color"; main = {
app-id = "foot"; term = "xterm-256color";
title = "foot"; app-id = "foot";
locked-title = "no"; title = "foot";
locked-title = "no";
font = "JetBrainsMono Nerd Font Mono:size=14"; font = "JetBrainsMono Nerd Font Mono:size=14";
font-bold = "JetBrainsMono Nerd Font Mono:size=14:style=Bold"; font-bold = "JetBrainsMono Nerd Font Mono:size=14:style=Bold";
line-height = 20; line-height = 20;
letter-spacing = 0; letter-spacing = 0;
horizontal-letter-offset = 0; horizontal-letter-offset = 0;
vertical-letter-offset = 0; vertical-letter-offset = 0;
box-drawings-uses-font-glyphs = "no"; box-drawings-uses-font-glyphs = "no";
dpi-aware = "no"; dpi-aware = "no";
bold-text-in-bright = "no"; bold-text-in-bright = "no";
word-delimiters = ",`|:\"'()[]{}<>"; word-delimiters = ",`|:\"'()[]{}<>";
selection-target = "primary"; selection-target = "primary";
initial-window-size-chars = "104x36"; initial-window-size-chars = "104x36";
initial-window-mode = "windowed"; initial-window-mode = "windowed";
pad = "8x8 center"; pad = "8x8 center";
resize-delay-ms = 100; resize-delay-ms = 100;
}; };
desktop-notifications.command = "${pkgs.libnotify}/bin/notify-send -a \${app-id} -i \${app-id} \${title} \${body}"; desktop-notifications.command = "${pkgs.libnotify}/bin/notify-send -a \${app-id} -i \${app-id} \${title} \${body}";
bell = { bell = {
urgent = "yes"; urgent = "yes";
notify = "yes"; notify = "yes";
command = "${pkgs.libnotify}/bin/notify-send bell"; command = "${pkgs.libnotify}/bin/notify-send bell";
command-focused = "no"; command-focused = "no";
}; };
scrollback = { scrollback = {
lines = 10000; lines = 10000;
multiplier = 10.0; multiplier = 10.0;
indicator-position = "relative"; indicator-position = "relative";
indicator-format = "line"; indicator-format = "line";
}; };
url = { url = {
launch = "${pkgs.xdg-utils}/bin/xdg-open \${url}"; launch = "${pkgs.xdg-utils}/bin/xdg-open \${url}";
label-letters = "sadfjklewcmpgh"; label-letters = "sadfjklewcmpgh";
osc8-underline = "always"; osc8-underline = "always";
}; };
tweak = { tweak = {
font-monospace-warn = "no"; font-monospace-warn = "no";
sixel = "yes"; sixel = "yes";
}; };
cursor = { cursor = {
style = "beam"; style = "beam";
blink = "no"; blink = "no";
}; };
mouse = { mouse = {
hide-when-typing = "yes"; # not really needed since we already enable this in Hyprland. hide-when-typing = "yes"; # not really needed since we already enable this in Hyprland.
alternate-scroll-mode = "yes"; alternate-scroll-mode = "yes";
}; };
csd.preferred = "server"; csd.preferred = "server";
key-bindings = { key-bindings = {
scrollback-up-half-page = "Control+k"; scrollback-up-half-page = "Control+k";
scrollback-up-page = "Control+Shift+k"; scrollback-up-page = "Control+Shift+k";
scrollback-down-half-page = "Control+j"; scrollback-down-half-page = "Control+j";
scrollback-down-page = "Control+Shift+j"; scrollback-down-page = "Control+Shift+j";
}; };
mouse-bindings = { mouse-bindings = {
selection-override-modifiers = "Shift"; selection-override-modifiers = "Shift";
primary-paste = "BTN_MIDDLE"; primary-paste = "BTN_MIDDLE";
select-begin = "BTN_LEFT"; select-begin = "BTN_LEFT";
select-begin-block = "Control+BTN_LEFT"; select-begin-block = "Control+BTN_LEFT";
select-extend = "BTN_RIGHT"; select-extend = "BTN_RIGHT";
select-extend-character-wise = "Control+BTN_RIGHT"; select-extend-character-wise = "Control+BTN_RIGHT";
select-word = "BTN_LEFT-2"; select-word = "BTN_LEFT-2";
select-word-whitespace = "Control+BTN_LEFT-2"; select-word-whitespace = "Control+BTN_LEFT-2";
}; };
colors = { colors = {
foreground = theme-colors.base05; # Text foreground = theme-colors.base05; # Text
background = theme-colors.base00; # Base background = theme-colors.base00; # Base
regular0 = theme-colors.base03; # Surface 1 regular0 = theme-colors.base03; # Surface 1
regular1 = theme-colors.base08; # red regular1 = theme-colors.base08; # red
regular2 = theme-colors.base0B; # green regular2 = theme-colors.base0B; # green
regular3 = theme-colors.base0A; # yellow regular3 = theme-colors.base0A; # yellow
regular4 = theme-colors.base0D; # blue regular4 = theme-colors.base0D; # blue
regular5 = "f5c2e7"; # pink regular5 = "f5c2e7"; # pink
regular6 = "94e2d5"; # teal regular6 = "94e2d5"; # teal
regular7 = "bac2de"; # Subtext 1 regular7 = "bac2de"; # Subtext 1
bright0 = theme-colors.base04; # Surface 2 bright0 = theme-colors.base04; # Surface 2
bright1 = theme-colors.base08; # red bright1 = theme-colors.base08; # red
bright2 = theme-colors.base0B; # green bright2 = theme-colors.base0B; # green
bright3 = theme-colors.base0A; # yellow bright3 = theme-colors.base0A; # yellow
bright4 = "89b4fa"; # blue bright4 = "89b4fa"; # blue
bright5 = "f5c2e7"; # pink bright5 = "f5c2e7"; # pink
bright6 = "94e2d5"; # teal bright6 = "94e2d5"; # teal
bright7 = "a6adc8"; # Subtext 0 bright7 = "a6adc8"; # Subtext 0
selection-foreground = "cdd6f4"; selection-foreground = "cdd6f4";
selection-background = "414356"; selection-background = "414356";
search-box-no-match = "11111b f38ba8"; search-box-no-match = "11111b f38ba8";
search-box-match = "cdd6f4 313244"; search-box-match = "cdd6f4 313244";
jump-labels = "11111b fab387"; jump-labels = "11111b fab387";
urls = "89b4fa"; urls = "89b4fa";
alpha = 0.9; alpha = 0.9;
}; };
}); }
);
foot-wrapped = pkgs.symlinkJoin { foot-wrapped = pkgs.symlinkJoin {
name = "foot-wrapped"; name = "foot-wrapped";
paths = [pkgs.foot]; paths = [ pkgs.foot ];
nativeBuildInputs = [pkgs.makeWrapper]; nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = '' postBuild = ''
wrapProgram $out/bin/foot --add-flags "--config=${foot-config} --working-directory=/home/${username}" wrapProgram $out/bin/foot --add-flags "--config=${foot-config} --working-directory=/home/${username}"
''; '';
}; };
in { in
{
config = mkIf cfg.enable { config = mkIf cfg.enable {
environment.systemPackages = [foot-wrapped]; environment.systemPackages = [ foot-wrapped ];
}; };
} }

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.lists) elem; inherit (lib.lists) elem;
inherit (lib.meta) getExe; inherit (lib.meta) getExe;
inherit (lib.attrsets) mapAttrsToList; inherit (lib.attrsets) mapAttrsToList;
@ -15,9 +16,16 @@
# Shell integration for ghostty only supports # Shell integration for ghostty only supports
# bash, fish and zsh for now. # bash, fish and zsh for now.
shell-integration = shell-integration =
if elem name ["bash" "fish" "zsh"] if
then name elem name [
else "none"; "bash"
"fish"
"zsh"
]
then
name
else
"none";
ghostty-settings = { ghostty-settings = {
font-size = 14; font-size = 14;
@ -53,17 +61,21 @@
command = getExe package; command = getExe package;
}; };
settingsFile = pkgs.writeText "config" <| concatStringsSep "\n" <| mapAttrsToList (name: value: "${name} = ${toString value}") ghostty-settings; settingsFile =
pkgs.writeText "config"
<| concatStringsSep "\n"
<| mapAttrsToList (name: value: "${name} = ${toString value}") ghostty-settings;
ghostty-wrapped = pkgs.symlinkJoin { ghostty-wrapped = pkgs.symlinkJoin {
name = "ghostty-wrapped"; name = "ghostty-wrapped";
paths = [pkgs.ghostty]; paths = [ pkgs.ghostty ];
nativeBuildInputs = [pkgs.makeWrapper]; nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = '' postBuild = ''
wrapProgram $out/bin/ghostty --add-flags "--config-file=${settingsFile}" wrapProgram $out/bin/ghostty --add-flags "--config-file=${settingsFile}"
''; '';
}; };
in { in
{
environment.systemPackages = builtins.attrValues { environment.systemPackages = builtins.attrValues {
inherit ghostty-wrapped; inherit ghostty-wrapped;
}; };

View file

@ -3,18 +3,20 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
cfg = config.modules.programs.minecraft; cfg = config.modules.programs.minecraft;
in { in
{
options.modules.programs.minecraft = { options.modules.programs.minecraft = {
enable = mkEnableOption "minecraft"; enable = mkEnableOption "minecraft";
wayland = mkEnableOption "wayland"; wayland = mkEnableOption "wayland";
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
environment.systemPackages = [pkgs.prismlauncher]; environment.systemPackages = [ pkgs.prismlauncher ];
}; };
} }

View file

@ -1,9 +1,9 @@
{pkgs, ...}: { { pkgs, ... }:
environment.systemPackages = {
[ environment.systemPackages = [
pkgs.spotify pkgs.spotify
] ]
++ (with pkgs; [ ++ (with pkgs; [
sptlrx sptlrx
]); ]);
} }

View file

@ -3,12 +3,14 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.system.programs.steam; cfg = config.modules.system.programs.steam;
in { in
{
options.modules.system.programs.steam.enable = mkEnableOption "Steam games platform"; options.modules.system.programs.steam.enable = mkEnableOption "Steam games platform";
config = mkIf cfg.enable { config = mkIf cfg.enable {
programs.steam = { programs.steam = {
@ -19,14 +21,15 @@ in {
SDL_VIDEODRIVER = "x11"; SDL_VIDEODRIVER = "x11";
}; };
extraLibraries = p: extraLibraries =
p:
builtins.attrValues { builtins.attrValues {
inherit (p) atk; inherit (p) atk;
}; };
}; };
gamescopeSession.enable = true; gamescopeSession.enable = true;
extraCompatPackages = [pkgs.proton-ge-bin.steamcompattool]; extraCompatPackages = [ pkgs.proton-ge-bin.steamcompattool ];
}; };
# See # See
# https://wiki.nixos.org/wiki/GameMode # https://wiki.nixos.org/wiki/GameMode

View file

@ -3,18 +3,19 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.programs.thunar; cfg = config.modules.programs.thunar;
in { in
{
options.modules.programs.thunar.enable = mkEnableOption "Thunar file manager"; options.modules.programs.thunar.enable = mkEnableOption "Thunar file manager";
config = mkIf cfg.enable { config = mkIf cfg.enable {
programs.thunar = { programs.thunar = {
enable = true; enable = true;
plugins = builtins.attrValues { plugins = builtins.attrValues {
inherit inherit (pkgs.xfce)
(pkgs.xfce)
thunar-volman thunar-volman
thunar-vcs-plugin thunar-vcs-plugin
thunar-archive-plugin thunar-archive-plugin

View file

@ -1,4 +1,5 @@
{pkgs, ...}: { { pkgs, ... }:
{
config = { config = {
programs.direnv = { programs.direnv = {
enable = true; enable = true;

View file

@ -1,4 +1,5 @@
{pkgs, ...}: { { pkgs, ... }:
{
programs = { programs = {
# We have to disable this and use nix-index instead. (Rust >>> Pearl) # We have to disable this and use nix-index instead. (Rust >>> Pearl)
command-not-found = { command-not-found = {

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
@ -33,15 +34,16 @@
btop-wrapped = pkgs.symlinkJoin { btop-wrapped = pkgs.symlinkJoin {
name = "btop-wrapped"; name = "btop-wrapped";
paths = [btop-no-desktop-entry]; paths = [ btop-no-desktop-entry ];
nativeBuildInputs = [pkgs.makeWrapper]; nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = '' postBuild = ''
wrapProgram $out/bin/btop --set XDG_CONFIG_HOME "${btop-settings}" wrapProgram $out/bin/btop --set XDG_CONFIG_HOME "${btop-settings}"
''; '';
}; };
in { in
{
options.modules.programs.btop.enable = mkEnableOption "btop"; options.modules.programs.btop.enable = mkEnableOption "btop";
config = mkIf cfg.enable { config = mkIf cfg.enable {
environment.systemPackages = [btop-wrapped]; environment.systemPackages = [ btop-wrapped ];
}; };
} }

View file

@ -1,14 +1,16 @@
{pkgs, ...}: let { pkgs, ... }:
let
zellij-wrapped = pkgs.symlinkJoin { zellij-wrapped = pkgs.symlinkJoin {
name = "zellij-wrapped"; name = "zellij-wrapped";
paths = [pkgs.zellij]; paths = [ pkgs.zellij ];
nativeBuildInputs = [pkgs.makeWrapper]; nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = '' postBuild = ''
wrapProgram $out/bin/zellij --add-flags "\ wrapProgram $out/bin/zellij --add-flags "\
--config ${./config.kdl}" --config ${./config.kdl}"
''; '';
}; };
in { in
{
environment.systemPackages = builtins.attrValues { environment.systemPackages = builtins.attrValues {
inherit zellij-wrapped; inherit zellij-wrapped;
}; };

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
mkAcmeCert = domain: { mkAcmeCert = domain: {
# An acme system user is created. This user belongs to the acme group # An acme system user is created. This user belongs to the acme group
# and the home directory is /var/lib/acme. This user will try to make the directory # and the home directory is /var/lib/acme. This user will try to make the directory
@ -15,7 +16,8 @@
email = "charlie@charlieroot.dev"; email = "charlie@charlieroot.dev";
group = "nginx"; group = "nginx";
}; };
in { in
{
security.acme = { security.acme = {
acceptTerms = true; acceptTerms = true;
defaults = { defaults = {

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (pkgs) fetchurl; inherit (pkgs) fetchurl;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
@ -16,7 +17,8 @@
img = ./img; img = ./img;
dataDir = "/srv/data/forgejo"; dataDir = "/srv/data/forgejo";
dumpDir = "/srv/data/forgejo-dump"; dumpDir = "/srv/data/forgejo-dump";
in { in
{
options.modules.system.services.forgejo.enable = mkEnableOption "forgejo"; options.modules.system.services.forgejo.enable = mkEnableOption "forgejo";
config = mkIf cfg.enable { config = mkIf cfg.enable {
@ -50,7 +52,7 @@ in {
group = "git"; group = "git";
isSystemUser = true; isSystemUser = true;
}; };
users.groups.git = {}; users.groups.git = { };
services.forgejo = { services.forgejo = {
enable = true; enable = true;
@ -113,53 +115,55 @@ in {
}; };
}; };
systemd.tmpfiles.rules = let systemd.tmpfiles.rules =
# no crawlers, thank you. let
robots = pkgs.writeText "robots-txt" '' # no crawlers, thank you.
User-agent: * robots = pkgs.writeText "robots-txt" ''
Disallow: / User-agent: *
''; Disallow: /
base-brand = fetchurl { '';
url = "https://codeberg.org/Codeberg-Infrastructure/forgejo/raw/branch/codeberg-10/web_src/css/themes/codeberg/base-brand.css"; base-brand = fetchurl {
hash = "sha256-QJ775HpINf8klO3d/8h+tEw0vk34p19dWUCWWuVwcho="; url = "https://codeberg.org/Codeberg-Infrastructure/forgejo/raw/branch/codeberg-10/web_src/css/themes/codeberg/base-brand.css";
}; hash = "sha256-QJ775HpINf8klO3d/8h+tEw0vk34p19dWUCWWuVwcho=";
dark-variables = fetchurl { };
url = "https://codeberg.org/Codeberg-Infrastructure/forgejo/raw/branch/codeberg-10/web_src/css/themes/codeberg/dark-variables.css"; dark-variables = fetchurl {
hash = "sha256-nCSJUOU9/R1fldoKXTTZmP7vmRjYUk/OKkbgrJ/NrXQ="; url = "https://codeberg.org/Codeberg-Infrastructure/forgejo/raw/branch/codeberg-10/web_src/css/themes/codeberg/dark-variables.css";
}; hash = "sha256-nCSJUOU9/R1fldoKXTTZmP7vmRjYUk/OKkbgrJ/NrXQ=";
theme-codeberg-dark = fetchurl { };
url = "https://codeberg.org/Codeberg-Infrastructure/forgejo/raw/branch/codeberg-10/web_src/css/themes/theme-codeberg-dark.css"; theme-codeberg-dark = fetchurl {
hash = "sha256-KyXznH49koRGlzIDDqagN4PvFGD/zCX//wrctmtfgBs="; url = "https://codeberg.org/Codeberg-Infrastructure/forgejo/raw/branch/codeberg-10/web_src/css/themes/theme-codeberg-dark.css";
}; hash = "sha256-KyXznH49koRGlzIDDqagN4PvFGD/zCX//wrctmtfgBs=";
in [ };
"d '${customDir}/public' 0750 ${user} ${group} - -" in
"d '${customDir}/public/assets' 0750 ${user} ${group} - -" [
"d '${customDir}/public/assets/img' 0750 ${user} ${group} - -" "d '${customDir}/public' 0750 ${user} ${group} - -"
# Copeberg logo, thanks Raf <3 "d '${customDir}/public/assets' 0750 ${user} ${group} - -"
"L+ '${customDir}/public/assets/img/logo.svg' - - - - ${img}/logo.svg" "d '${customDir}/public/assets/img' 0750 ${user} ${group} - -"
"L+ '${customDir}/public/assets/img/logo.png' - - - - ${img}/logo.png" # Copeberg logo, thanks Raf <3
"L+ '${customDir}/public/assets/img/apple-touch-icon' - - - - ${img}/logo.png" "L+ '${customDir}/public/assets/img/logo.svg' - - - - ${img}/logo.svg"
"L+ '${customDir}/public/assets/img/favicon.svg' - - - - ${img}/logo.svg" "L+ '${customDir}/public/assets/img/logo.png' - - - - ${img}/logo.png"
"L+ '${customDir}/public/assets/img/favicon.png' - - - - ${img}/logo.png" "L+ '${customDir}/public/assets/img/apple-touch-icon' - - - - ${img}/logo.png"
"L+ '${customDir}/public/assets/img/favicon.svg' - - - - ${img}/logo.svg"
"L+ '${customDir}/public/assets/img/favicon.png' - - - - ${img}/logo.png"
# Theming shenanigans # Theming shenanigans
"d '${customDir}/public/assets' 0750 ${user} ${group} - -" "d '${customDir}/public/assets' 0750 ${user} ${group} - -"
"d '${customDir}/public/assets/css' 0750 ${user} ${group} - -" "d '${customDir}/public/assets/css' 0750 ${user} ${group} - -"
"d '${customDir}/public/assets/css/codeberg' 0750 ${user} ${group} - -" "d '${customDir}/public/assets/css/codeberg' 0750 ${user} ${group} - -"
"L+ '${customDir}/public/assets/css/theme-codeberg-dark.css' - - - - ${theme-codeberg-dark}" "L+ '${customDir}/public/assets/css/theme-codeberg-dark.css' - - - - ${theme-codeberg-dark}"
"L+ '${customDir}/public/assets/css/codeberg/base-brand.css' - - - - ${base-brand}" "L+ '${customDir}/public/assets/css/codeberg/base-brand.css' - - - - ${base-brand}"
"L+ '${customDir}/public/assets/css/codeberg/dark-variables.css' - - - - ${dark-variables}" "L+ '${customDir}/public/assets/css/codeberg/dark-variables.css' - - - - ${dark-variables}"
# Templates # Templates
"d '${customDir}/templates' 0750 ${user} ${group} - -" "d '${customDir}/templates' 0750 ${user} ${group} - -"
"d '${customDir}/templates/repo' 0750 ${user} ${group} - -" "d '${customDir}/templates/repo' 0750 ${user} ${group} - -"
# Home page # Home page
"L+ '${customDir}/templates/home.tmpl' - - - - ${./templates}/home.tmpl" "L+ '${customDir}/templates/home.tmpl' - - - - ${./templates}/home.tmpl"
"L+ '${customDir}/templates/repo/header.tmpl' - - - - ${./templates/repo}/header.tmpl" "L+ '${customDir}/templates/repo/header.tmpl' - - - - ${./templates/repo}/header.tmpl"
# Fuck off scrapers # Fuck off scrapers
"L+ ${customDir}/public/robots.txt - - - - ${robots.outPath}" "L+ ${customDir}/public/robots.txt - - - - ${robots.outPath}"
]; ];
}; };
} }

View file

@ -7,49 +7,10 @@
<h1 class="ui icon header title"> <h1 class="ui icon header title">
{{AppDisplayName}} {{AppDisplayName}}
</h1> </h1>
<h2>A very painful Git service</h2> <h2>{{ctx.Locale.Tr "startpage.app_desc"}}</h2>
</div> </div>
</div> </div>
</div> </div>
<div class="ui stackable middle very relaxed page grid"> {{template "home_forgejo" .}}
<div class="eight wide center column">
<h1 class="hero ui icon header stackable">
<img class="logo" width="100" height="100" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{ctx.Locale.Tr "logo"}}">
<p>Made with copious amounts of caffeeine</p>
</h1>
<p class="large">
<b>TODO</b>: Write some funny text here
</p>
</div>
<div class="eight wide center column stackable">
<h1 class="hero ui icon header">
<img class="logo" width="100" height="100" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{ctx.Locale.Tr "logo"}}">
<p><it>I hate it here</it></p>
</h1>
<p class="large">
Bottom text
</p>
</div>
</div>
<div class="ui stackable middle very relaxed page grid">
<div class="eight wide center column">
<h1 class="hero ui icon header stackable">
<img class="logo" width="100" height="100" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{ctx.Locale.Tr "logo"}}">
<p>Is this the real life?</p>
</h1>
<p class="large">
Something something fuck poettering
</p>
</div>
<div class="eight wide center column stackable">
<h1 class="hero ui icon header">
<img class="logo" width="100" height="100" src="{{AssetUrlPrefix}}/img/logo.svg" alt="{{ctx.Locale.Tr "logo"}}">
<p>Open source or something</p>
</h1>
<p class="large">
I forgor
</p>
</div>
</div>
</div> </div>
{{template "base/footer" .}} {{template "base/footer" .}}

View file

@ -0,0 +1,36 @@
<div class="ui stackable middle very relaxed page grid">
<div class="eight wide center column">
<h1 class="hero ui icon header">
{{svg "octicon-flame"}} {{ctx.Locale.Tr "startpage.install"}}
</h1>
<p class="large">
{{ctx.Locale.Tr "startpage.install_desc" "https://forgejo.org/download/#installation-from-binary" "https://forgejo.org/download/#container-image" "https://forgejo.org/download"}}
</p>
</div>
<div class="eight wide center column">
<h1 class="hero ui icon header">
{{svg "octicon-device-desktop"}} {{ctx.Locale.Tr "startpage.platform"}}
</h1>
<p class="large">
{{ctx.Locale.Tr "startpage.platform_desc"}}
</p>
</div>
</div>
<div class="ui stackable middle very relaxed page grid">
<div class="eight wide center column">
<h1 class="hero ui icon header">
{{svg "octicon-rocket"}} {{ctx.Locale.Tr "startpage.lightweight"}}
</h1>
<p class="large">
{{ctx.Locale.Tr "startpage.lightweight_desc"}}
</p>
</div>
<div class="eight wide center column">
<h1 class="hero ui icon header">
{{svg "octicon-code"}} {{ctx.Locale.Tr "startpage.license"}}
</h1>
<p class="large">
{{ctx.Locale.Tr "startpage.license_desc" "https://forgejo.org/download" "https://codeberg.org/forgejo/forgejo"}}
</p>
</div>
</div>

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (builtins) fetchurl; inherit (builtins) fetchurl;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
@ -11,11 +12,12 @@
cfg = config.modules.system.services.grafana; cfg = config.modules.system.services.grafana;
domain = "info.copeberg.org"; domain = "info.copeberg.org";
port = 4021; port = 4021;
in { in
{
options.modules.system.services.grafana.enable = mkEnableOption "Grafana, a graphing service"; options.modules.system.services.grafana.enable = mkEnableOption "Grafana, a graphing service";
config = mkIf cfg.enable { config = mkIf cfg.enable {
networking.firewall.allowedTCPPorts = [config.services.grafana.settings.server.http_port]; networking.firewall.allowedTCPPorts = [ config.services.grafana.settings.server.http_port ];
modules.system.services.database.postgresql.enable = true; modules.system.services.database.postgresql.enable = true;

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.meta) getExe getExe'; inherit (lib.meta) getExe getExe';
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkOption mkEnableOption; inherit (lib.options) mkOption mkEnableOption;
@ -12,7 +13,8 @@
inherit (config.meta.mainUser) username; inherit (config.meta.mainUser) username;
cfg = config.modules.services.greetd; cfg = config.modules.services.greetd;
uwsmEnabled = config.modules.services.uwsm.enable; uwsmEnabled = config.modules.services.uwsm.enable;
in { in
{
options.modules.services.greetd = { options.modules.services.greetd = {
enable = mkEnableOption "greetd"; enable = mkEnableOption "greetd";
greeter = mkOption { greeter = mkOption {
@ -27,33 +29,33 @@ in {
description = "Which login session to start"; description = "Which login session to start";
type = str; type = str;
default = default =
if uwsmEnabled if uwsmEnabled then "${getExe config.programs.uwsm.package} start Hyprland" else "Hyprland";
then "${getExe config.programs.uwsm.package} start Hyprland"
else "Hyprland";
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
services.greetd = let services.greetd =
session = { let
# command = '' session = {
# ${pkgs.greetd.tuigreet}/bin/tuigreet \ # command = ''
# -c \"${cfg.session}\" \ # ${pkgs.greetd.tuigreet}/bin/tuigreet \
# -r # -c \"${cfg.session}\" \
# -t --time-format "DD.MM.YYYY" # -r
# --asteriks''; # -t --time-format "DD.MM.YYYY"
# --asteriks'';
command = "${getExe config.programs.uwsm.package} start hyprland-uwsm.desktop"; command = "${getExe config.programs.uwsm.package} start hyprland-uwsm.desktop";
user = username; user = username;
};
in
{
enable = true;
package = pkgs.greetd;
vt = 7;
settings = {
default_session = session;
initial_session = session;
};
}; };
in {
enable = true;
package = pkgs.greetd;
vt = 7;
settings = {
default_session = session;
initial_session = session;
};
};
}; };
} }

View file

@ -2,12 +2,14 @@
config, config,
lib, lib,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.services.kanata; cfg = config.modules.services.kanata;
in { in
{
options.modules.services.kanata.enable = mkEnableOption "kanata"; options.modules.services.kanata.enable = mkEnableOption "kanata";
config = mkIf cfg.enable { config = mkIf cfg.enable {
services.kanata = { services.kanata = {

View file

@ -3,14 +3,16 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
cfg = config.modules.services.locate; cfg = config.modules.services.locate;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
in { in
{
options.modules.services.locate.enable = mkEnableOption "Locate service"; options.modules.services.locate.enable = mkEnableOption "Locate service";
config = mkIf cfg.enable { config = mkIf cfg.enable {
environment.systemPackages = [pkgs.plocate]; environment.systemPackages = [ pkgs.plocate ];
services.locate = { services.locate = {
enable = true; enable = true;
interval = "hourly"; interval = "hourly";

View file

@ -1,8 +1,9 @@
{pkgs, ...}: let { pkgs, ... }:
let
mako-wrapped = pkgs.symlinkJoin { mako-wrapped = pkgs.symlinkJoin {
name = "mako-wrapped"; name = "mako-wrapped";
paths = [pkgs.mako]; paths = [ pkgs.mako ];
nativeBuildInputs = [pkgs.makeWrapper]; nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = '' postBuild = ''
wrapProgram $out/bin/mako --add-flags "\ wrapProgram $out/bin/mako --add-flags "\
--font 'Lexend 11' \ --font 'Lexend 11' \
@ -12,6 +13,7 @@
--default-timeout 4000" --default-timeout 4000"
''; '';
}; };
in { in
environment.systemPackages = [mako-wrapped]; {
environment.systemPackages = [ mako-wrapped ];
} }

View file

@ -3,14 +3,16 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.system.services.loki; cfg = config.modules.system.services.loki;
port = 4026; port = 4026;
dataDir = "/srv/data/loki"; dataDir = "/srv/data/loki";
in { in
{
options.modules.system.services.loki.enable = mkEnableOption "Grafana, a graphing service"; options.modules.system.services.loki.enable = mkEnableOption "Grafana, a graphing service";
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -3,13 +3,15 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
cfg = config.modules.services.media.mpd; cfg = config.modules.services.media.mpd;
inherit (config.meta.mainUser) username; inherit (config.meta.mainUser) username;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.types) str; inherit (lib.types) str;
inherit (lib.options) mkOption mkEnableOption; inherit (lib.options) mkOption mkEnableOption;
in { in
{
options.modules.services = { options.modules.services = {
media = { media = {
mpd = { mpd = {
@ -24,7 +26,7 @@ in {
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
# command line interface to mpd # command line interface to mpd
environment.systemPackages = [pkgs.mpc]; environment.systemPackages = [ pkgs.mpc ];
systemd.services.mpd.environment = { systemd.services.mpd.environment = {
# https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/609 # https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/609

View file

@ -3,11 +3,13 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf mkDefault; inherit (lib.modules) mkIf mkDefault;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.system.services.nginx; cfg = config.modules.system.services.nginx;
in { in
{
options.modules.system.services.nginx.enable = mkEnableOption "nginx"; options.modules.system.services.nginx.enable = mkEnableOption "nginx";
config = mkIf cfg.enable { config = mkIf cfg.enable {
security = { security = {

View file

@ -3,12 +3,14 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.meta) getExe'; inherit (lib.meta) getExe';
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
cfg = config.modules.system.services.owncloud; cfg = config.modules.system.services.owncloud;
in { in
{
options.modules.system.services.owncloud.enable = lib.mkEnableOption "owncloud"; options.modules.system.services.owncloud.enable = lib.mkEnableOption "owncloud";
config = { config = {
@ -16,11 +18,11 @@ in {
description = "Owncloud client service"; description = "Owncloud client service";
# makes the graphical session start this service when it starts # makes the graphical session start this service when it starts
wantedBy = ["graphical-session.target"]; wantedBy = [ "graphical-session.target" ];
# when graphical session restarts or gets stopped, this also gets restarted/stopped. # when graphical session restarts or gets stopped, this also gets restarted/stopped.
partOf = ["graphical-session.target"]; partOf = [ "graphical-session.target" ];
# gets started only after graphical session # gets started only after graphical session
after = ["graphical-session.target"]; after = [ "graphical-session.target" ];
serviceConfig = { serviceConfig = {
ExecStart = "${getExe' pkgs.owncloud-client "owncloud"}"; ExecStart = "${getExe' pkgs.owncloud-client "owncloud"}";

View file

@ -2,10 +2,12 @@
config, config,
lib, lib,
... ...
}: let }:
let
cfg = config.modules.system.sound; cfg = config.modules.system.sound;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
in { in
{
config = mkIf cfg.enable { config = mkIf cfg.enable {
services.pulseaudio.enable = false; services.pulseaudio.enable = false;
services.pipewire = { services.pipewire = {

View file

@ -3,12 +3,14 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.system.services.database.postgresql; cfg = config.modules.system.services.database.postgresql;
in { in
{
options.modules.system.services.database.postgresql.enable = mkEnableOption "postgresql"; options.modules.system.services.database.postgresql.enable = mkEnableOption "postgresql";
config = mkIf cfg.enable { config = mkIf cfg.enable {

View file

@ -2,9 +2,11 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
in { in
{
options.modules.services.cups.enable = mkEnableOption "CUPS, the Common UNIX printing system"; options.modules.services.cups.enable = mkEnableOption "CUPS, the Common UNIX printing system";
config = { config = {

View file

@ -3,13 +3,15 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.system.services.prometheus; cfg = config.modules.system.services.prometheus;
port = 4022; port = 4022;
in { in
{
options.modules.system.services.prometheus.enable = mkEnableOption "Grafana, a graphing service"; options.modules.system.services.prometheus.enable = mkEnableOption "Grafana, a graphing service";
config = mkIf cfg.enable { config = mkIf cfg.enable {
@ -22,7 +24,10 @@ in {
node = { node = {
enable = true; enable = true;
port = 4023; port = 4023;
enabledCollectors = ["systemd" "processes"]; enabledCollectors = [
"systemd"
"processes"
];
}; };
postgres = { postgres = {
@ -39,22 +44,28 @@ in {
{ {
job_name = "prometheus"; job_name = "prometheus";
scrape_interval = "30s"; scrape_interval = "30s";
static_configs = [{targets = ["localhost:${toString port}"];}]; static_configs = [ { targets = [ "localhost:${toString port}" ]; } ];
} }
{ {
job_name = "node"; job_name = "node";
scrape_interval = "30s"; scrape_interval = "30s";
static_configs = [{targets = ["localhost:${toString config.services.prometheus.exporters.node.port}"];}]; static_configs = [
{ targets = [ "localhost:${toString config.services.prometheus.exporters.node.port}" ]; }
];
} }
{ {
job_name = "postgres"; job_name = "postgres";
scrape_interval = "30s"; scrape_interval = "30s";
static_configs = [{targets = ["localhost:${toString config.services.prometheus.exporters.postgres.port}"];}]; static_configs = [
{ targets = [ "localhost:${toString config.services.prometheus.exporters.postgres.port}" ]; }
];
} }
{ {
job_name = "nginx"; job_name = "nginx";
scrape_interval = "30s"; scrape_interval = "30s";
static_configs = [{targets = ["localhost:${toString config.services.prometheus.exporters.nginx.port}"];}]; static_configs = [
{ targets = [ "localhost:${toString config.services.prometheus.exporters.nginx.port}" ]; }
];
} }
]; ];
}; };

View file

@ -2,15 +2,17 @@
config, config,
lib, lib,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (config.modules.system) isGraphical; inherit (config.modules.system) isGraphical;
in { in
{
# TODO: setup # TODO: setup
services.spotifyd = mkIf isGraphical { services.spotifyd = mkIf isGraphical {
enable = true; enable = true;
settings = { settings = {
backend = "pipe"; # backend = "pipe";
}; };
}; };
} }

View file

@ -1,11 +1,13 @@
{lib, ...}: let { lib, ... }:
let
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
in { in
{
options.modules.programs.ssh.enable = mkEnableOption "ssh"; options.modules.programs.ssh.enable = mkEnableOption "ssh";
config = { config = {
services.openssh = { services.openssh = {
enable = true; enable = true;
ports = [22]; ports = [ 22 ];
settings = { settings = {
PasswordAuthentication = false; PasswordAuthentication = false;
PermitRootLogin = "no"; PermitRootLogin = "no";

View file

@ -3,14 +3,16 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
domain = "charlieroot.dev"; domain = "charlieroot.dev";
cfg = config.modules.system.services.stalwart; cfg = config.modules.system.services.stalwart;
in { in
{
options.modules.system.services.stalwart.enable = mkEnableOption "stalwart"; options.modules.system.services.stalwart.enable = mkEnableOption "stalwart";
config = mkIf cfg.enable { config = mkIf cfg.enable {
# create the stallwart user # create the stallwart user
@ -20,7 +22,7 @@ in {
group = "stalwart"; group = "stalwart";
isSystemUser = true; isSystemUser = true;
}; };
users.groups.stalwart = {}; users.groups.stalwart = { };
services.stalwart-mail = { services.stalwart-mail = {
enable = true; enable = true;
@ -55,7 +57,7 @@ in {
# This is the standard port for SMTP, and is used by mail servers to send email to each other. # This is the standard port for SMTP, and is used by mail servers to send email to each other.
smtp = { smtp = {
protocol = "smtp"; protocol = "smtp";
bind = ["[::]:25"]; bind = [ "[::]:25" ];
tls.implicit = true; tls.implicit = true;
}; };
# SMTP submissions with implicit TLS are received on port 465 by default. # SMTP submissions with implicit TLS are received on port 465 by default.
@ -63,17 +65,17 @@ in {
# and is used by mail clients to send email to mail servers. # and is used by mail clients to send email to mail servers.
submissions = { submissions = {
bind = ["[::]:465"]; bind = [ "[::]:465" ];
protocol = "smtp"; protocol = "smtp";
tls.implicit = true; tls.implicit = true;
}; };
imaps = { imaps = {
bind = ["[::]:993"]; bind = [ "[::]:993" ];
protocol = "imap"; protocol = "imap";
tls.implicit = true; tls.implicit = true;
}; };
management = { management = {
bind = ["127.0.0.1:8080"]; bind = [ "127.0.0.1:8080" ];
protocol = "http"; protocol = "http";
tls.implicit = true; tls.implicit = true;
}; };

View file

@ -3,18 +3,23 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (config.meta.mainUser) username; inherit (config.meta.mainUser) username;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.services.usbguard; cfg = config.modules.services.usbguard;
in { in
{
options.modules.services.usbguard.enable = mkEnableOption "usbguard"; options.modules.services.usbguard.enable = mkEnableOption "usbguard";
config = mkIf cfg.enable { config = mkIf cfg.enable {
environment.systemPackages = [pkgs.usbguard]; environment.systemPackages = [ pkgs.usbguard ];
services.usbguard = { services.usbguard = {
enable = true; enable = true;
IPCAllowedUsers = ["root" "${username}"]; IPCAllowedUsers = [
"root"
"${username}"
];
presentDevicePolicy = "allow"; presentDevicePolicy = "allow";
rules = '' rules = ''
allow with-interface equals { 08:*:* } allow with-interface equals { 08:*:* }

View file

@ -3,11 +3,13 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
cfg = config.modules.services.uwsm; cfg = config.modules.services.uwsm;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
in { in
{
options.modules.services.uwsm.enable = mkEnableOption "uwsm"; options.modules.services.uwsm.enable = mkEnableOption "uwsm";
config = mkIf cfg.enable { config = mkIf cfg.enable {
programs.uwsm = { programs.uwsm = {

View file

@ -2,7 +2,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.meta) getExe; inherit (lib.meta) getExe;
custom-wayneko = pkgs.wayneko.overrideAttrs { custom-wayneko = pkgs.wayneko.overrideAttrs {
@ -16,16 +17,17 @@
hash = ""; hash = "";
}; };
in { in
{
systemd.user.services.wayneko = { systemd.user.services.wayneko = {
description = "Wayneko, as a systemd service"; description = "Wayneko, as a systemd service";
# makes the graphical session start this service when it starts # makes the graphical session start this service when it starts
wantedBy = ["graphical-session.target"]; wantedBy = [ "graphical-session.target" ];
# when graphical session restarts or gets stopped, this also gets restarted/stopped. # when graphical session restarts or gets stopped, this also gets restarted/stopped.
partOf = ["graphical-session.target"]; partOf = [ "graphical-session.target" ];
# gets started only after graphical session # gets started only after graphical session
after = ["graphical-session.target"]; after = [ "graphical-session.target" ];
serviceConfig = { serviceConfig = {
ExecStart = '' ExecStart = ''
@ -39,7 +41,7 @@ in {
RestartSec = 1; RestartSec = 1;
TimeoutStopSec = 10; TimeoutStopSec = 10;
CapabilityBoundingSet = [""]; CapabilityBoundingSet = [ "" ];
DevicePolicy = "closed"; DevicePolicy = "closed";
LockPersonality = true; LockPersonality = true;
MemoryDenyWriteExecute = true; MemoryDenyWriteExecute = true;
@ -65,7 +67,7 @@ in {
RestrictRealTime = true; RestrictRealTime = true;
RestrictSUIDSGID = true; RestrictSUIDSGID = true;
SystemCallArchitectures = ["native"]; SystemCallArchitectures = [ "native" ];
SystemCallFilter = "~@clock @cpu-emulation @debug @obsolete @module @mount @raw-io @reboot @swap @privileged"; SystemCallFilter = "~@clock @cpu-emulation @debug @obsolete @module @mount @raw-io @reboot @swap @privileged";
}; };

View file

@ -9,10 +9,24 @@
config, config,
lib, lib,
... ...
}: let }:
let
inherit (lib.options) mkOption literalExpression; inherit (lib.options) mkOption literalExpression;
inherit (lib.strings) toLower replaceStrings removePrefix hasPrefix isString; inherit (lib.strings)
inherit (lib.types) str nullOr enum mkOptionType attrsOf coercedTo; toLower
replaceStrings
removePrefix
hasPrefix
isString
;
inherit (lib.types)
str
nullOr
enum
mkOptionType
attrsOf
coercedTo
;
cfg = config.modules.style; cfg = config.modules.style;
@ -24,16 +38,24 @@
}; };
colorType = attrsOf (coercedTo str (removePrefix "#") hexColorType); colorType = attrsOf (coercedTo str (removePrefix "#") hexColorType);
nameToSlug = name: toLower (replaceStrings [" "] ["-"] name); nameToSlug = name: toLower (replaceStrings [ " " ] [ "-" ] name);
getPaletteFromScheme = slug: getPaletteFromScheme =
if builtins.pathExists ./palettes/${slug}.nix slug:
then (import ./palettes/${slug}.nix).colorscheme.palette if builtins.pathExists ./palettes/${slug}.nix then
else throw "The following colorscheme was imported but not found: ${slug}"; (import ./palettes/${slug}.nix).colorscheme.palette
in { else
throw "The following colorscheme was imported but not found: ${slug}";
in
{
options.modules.style = { options.modules.style = {
colorScheme = { colorScheme = {
name = mkOption { name = mkOption {
type = nullOr (enum ["Catppuccin Mocha" "Zenburn" "Black Metal Venom" "Gruvbox"]); type = nullOr (enum [
"Catppuccin Mocha"
"Zenburn"
"Black Metal Venom"
"Gruvbox"
]);
description = "The colorscheme that should be used globally to theme your system."; description = "The colorscheme that should be used globally to theme your system.";
default = "Catppuccin Mocha"; default = "Catppuccin Mocha";
}; };
@ -83,11 +105,11 @@ in {
}; };
variant = mkOption { variant = mkOption {
type = enum ["dark" "light"]; type = enum [
default = "dark"
if builtins.substring 0 1 cfg.colorScheme.colors.base00 < "5" "light"
then "dark" ];
else "light"; default = if builtins.substring 0 1 cfg.colorScheme.colors.base00 < "5" then "dark" else "light";
description = '' description = ''
Whether the scheme is dark or light Whether the scheme is dark or light
''; '';

View file

@ -1,4 +1,5 @@
{pkgs, ...}: let { pkgs, ... }:
let
inherit (builtins) mapAttrs; inherit (builtins) mapAttrs;
fancy-iosevka = pkgs.iosevka.override { fancy-iosevka = pkgs.iosevka.override {
@ -40,7 +41,8 @@
}; };
set = "Fancy"; set = "Fancy";
}; };
in { in
{
# A (somewhat) sane list of fonts to be installed. # A (somewhat) sane list of fonts to be installed.
fonts = { fonts = {
fontconfig = { fontconfig = {
@ -58,26 +60,26 @@ in {
# Set the defalt fonts. This was taken from raf, # Set the defalt fonts. This was taken from raf,
# many thanks. # many thanks.
defaultFonts = let defaultFonts =
common = [ let
"Iosevka Nerd Font" common = [
"Roboto Mono Nerd Font" "Iosevka Nerd Font"
"Fira Code Nerd Font" "Roboto Mono Nerd Font"
"Symbols Nerd Font" "Fira Code Nerd Font"
"Noto Color Emoji" "Symbols Nerd Font"
"JetbrainsMono Nerd Font" "Noto Color Emoji"
]; "JetbrainsMono Nerd Font"
in ];
in
mapAttrs (_: fonts: fonts ++ common) { mapAttrs (_: fonts: fonts ++ common) {
serif = ["Noto Serif"]; serif = [ "Noto Serif" ];
sansSerif = ["Lexend"]; sansSerif = [ "Lexend" ];
emoji = ["Noto Color Emoji"]; emoji = [ "Noto Color Emoji" ];
monospace = ["Iosevka Nerd Font"]; monospace = [ "Iosevka Nerd Font" ];
}; };
}; };
packages = builtins.attrValues { packages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
material-icons material-icons
material-design-icons material-design-icons
lexend lexend
@ -88,8 +90,7 @@ in {
corefonts corefonts
font-awesome font-awesome
; ;
inherit inherit (pkgs.nerd-fonts)
(pkgs.nerd-fonts)
iosevka iosevka
jetbrains-mono jetbrains-mono
comic-shanns-mono comic-shanns-mono

View file

@ -1,6 +1,7 @@
# blatantly stolen from sioodmy, thanks :3 # blatantly stolen from sioodmy, thanks :3
{colors}: { colors }:
with colors; '' with colors;
''
@define-color accent_color #${base0D}; @define-color accent_color #${base0D};
@define-color accent_bg_color #${base0D}; @define-color accent_bg_color #${base0D};
@define-color accent_fg_color #${base00}; @define-color accent_fg_color #${base00};

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (builtins) toString isBool; inherit (builtins) toString isBool;
inherit (lib.generators) toINI; inherit (lib.generators) toINI;
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
@ -15,12 +16,12 @@
cfg = config.modules.theming.gtk; cfg = config.modules.theming.gtk;
toGtk3Ini = toINI { toGtk3Ini = toINI {
mkKeyValue = key: value: let mkKeyValue =
value' = key: value:
if isBool value let
then boolToString value value' = if isBool value then boolToString value else toString value;
else toString value; in
in "${escape ["="] key}=${value'}"; "${escape [ "=" ] key}=${value'}";
}; };
gtkIni = { gtkIni = {
@ -34,7 +35,8 @@
gtk-cursor-theme-name = "BreezeX-RosePine-Linux"; gtk-cursor-theme-name = "BreezeX-RosePine-Linux";
gtk-theme-name = "Gruvbox-Dark"; gtk-theme-name = "Gruvbox-Dark";
}; };
in { in
{
options.modules.theming.gtk = { options.modules.theming.gtk = {
enable = mkEnableOption "Wether to enable GTK theming"; enable = mkEnableOption "Wether to enable GTK theming";
theme = { theme = {
@ -63,15 +65,15 @@ in {
}; };
}; };
}; };
config = let config =
cursorSize = 32; let
in cursorSize = 32;
in
mkIf cfg.enable { mkIf cfg.enable {
programs.dconf.enable = true; programs.dconf.enable = true;
environment = { environment = {
systemPackages = builtins.attrValues { systemPackages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
rose-pine-cursor rose-pine-cursor
gruvbox-gtk-theme gruvbox-gtk-theme
papirus-icon-theme papirus-icon-theme
@ -83,31 +85,33 @@ in {
XCURSOR_THEME = "BreezeX-RosePine-Linux"; XCURSOR_THEME = "BreezeX-RosePine-Linux";
XCURSOR_SIZE = cursorSize; XCURSOR_SIZE = cursorSize;
}; };
etc = let etc =
css = import ./gtk-colors.nix {inherit (config.modules.style.colorScheme) colors;}; let
in { css = import ./gtk-colors.nix { inherit (config.modules.style.colorScheme) colors; };
"xdg/gtk-4.0/settings.ini".text = toGtk3Ini { in
Settings = gtkIni; {
}; "xdg/gtk-4.0/settings.ini".text = toGtk3Ini {
"xdg/gtk-3.0/settings.ini".text = toGtk3Ini { Settings = gtkIni;
Settings = gtkIni; };
}; "xdg/gtk-3.0/settings.ini".text = toGtk3Ini {
"xdg/gtk-4.0/gtk.css".text = css; Settings = gtkIni;
"xdg/gtk-3.0/gtk.css".text = css; };
"xdg/gtk-4.0/gtk.css".text = css;
"xdg/gtk-3.0/gtk.css".text = css;
"xdg/gtk-2.0/gtkrc".text = '' "xdg/gtk-2.0/gtkrc".text = ''
gtk-cursor-theme-name = BreezeX-RosePine-Linux gtk-cursor-theme-name = BreezeX-RosePine-Linux
gtk-cursor-theme-size = ${toString cursorSize} gtk-cursor-theme-size = ${toString cursorSize}
gtk-theme-name = ${cfg.theme.name} gtk-theme-name = ${cfg.theme.name}
gtk-icon-theme-name = ${cfg.iconTheme.name} gtk-icon-theme-name = ${cfg.iconTheme.name}
gtk-font-name = Lexend 11 gtk-font-name = Lexend 11
''; '';
"xdg/Xresources".text = '' "xdg/Xresources".text = ''
Xcursor.size: ${toString cursorSize} Xcursor.size: ${toString cursorSize}
Xcursor.theme: BreezeX-RosePine-Linux Xcursor.theme: BreezeX-RosePine-Linux
''; '';
}; };
}; };
}; };
} }

View file

@ -3,13 +3,15 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption mkOption; inherit (lib.options) mkEnableOption mkOption;
inherit (lib.types) str package; inherit (lib.types) str package;
cfg = config.modules.theming.qt; cfg = config.modules.theming.qt;
in { in
{
options.modules.theming.qt = { options.modules.theming.qt = {
enable = mkEnableOption "qt theming"; enable = mkEnableOption "qt theming";
name = mkOption { name = mkOption {

View file

@ -4,17 +4,19 @@
pkgs, pkgs,
sources, sources,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.theming.quickshell; cfg = config.modules.theming.quickshell;
in { in
{
options.modules.theming.quickshell.enable = mkEnableOption "quickshell"; options.modules.theming.quickshell.enable = mkEnableOption "quickshell";
config = mkIf cfg.enable { config = mkIf cfg.enable {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
(pkgs.callPackage (sources.quickshell + "/default.nix") {}) (pkgs.callPackage (sources.quickshell + "/default.nix") { })
qt6.qtimageformats qt6.qtimageformats
qt6.qt5compat qt6.qt5compat
qt6.qtmultimedia qt6.qtmultimedia

View file

@ -1 +1 @@
/run/user/1000/quickshell/vfs/97b86fe3cbb42714790f5e96b44b706b/.qmlls.ini /run/user/1000/quickshell/vfs/4f7a8066a49ba487f5b2754750896151/.qmlls.ini

View file

@ -3,13 +3,15 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkForce mkDefault; inherit (lib.modules) mkForce mkDefault;
inherit (lib.options) mkOption mkEnableOption; inherit (lib.options) mkOption mkEnableOption;
inherit (lib.types) int; inherit (lib.types) int;
cfg = config.modules.system.boot; cfg = config.modules.system.boot;
in { in
{
options.modules.system.boot = { options.modules.system.boot = {
grub.enable = mkEnableOption "Grub, a bloated boot loader"; grub.enable = mkEnableOption "Grub, a bloated boot loader";
systemd-boot.enable = mkEnableOption "Poetteringboot"; systemd-boot.enable = mkEnableOption "Poetteringboot";
@ -29,7 +31,8 @@ in {
message = "No bootloader is enabled."; message = "No bootloader is enabled.";
} }
{ {
assertion = cfg.systemd-boot.enable -> !cfg.grub.enable && cfg.grub.enable -> !cfg.systemd-boot.enable; assertion =
cfg.systemd-boot.enable -> !cfg.grub.enable && cfg.grub.enable -> !cfg.systemd-boot.enable;
message = "Please enable only ONE of systemd-boot or grub."; message = "Please enable only ONE of systemd-boot or grub.";
} }
]; ];
@ -73,12 +76,11 @@ in {
plymouth = { plymouth = {
enable = true; enable = true;
themePackages = [ themePackages = [
(pkgs.adi1090x-plymouth-themes.override (pkgs.adi1090x-plymouth-themes.override {
{ selected_themes = [
selected_themes = [ "hud_3"
"hud_3" ];
]; })
})
]; ];
theme = "hud_3"; theme = "hud_3";
}; };

View file

@ -4,12 +4,14 @@
pkgs, pkgs,
sources, sources,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.system.boot.lanzaboote; cfg = config.modules.system.boot.lanzaboote;
in { in
{
options.modules.system.boot.lanzaboote.enable = mkEnableOption "Lanzaboote"; options.modules.system.boot.lanzaboote.enable = mkEnableOption "Lanzaboote";
imports = [ imports = [
(sources.lanzaboote + "/nix/modules/lanzaboote.nix") (sources.lanzaboote + "/nix/modules/lanzaboote.nix")
@ -29,6 +31,6 @@ in {
loader.systemd-boot.enable = lib.mkForce false; loader.systemd-boot.enable = lib.mkForce false;
}; };
environment.systemPackages = [pkgs.sbctl]; environment.systemPackages = [ pkgs.sbctl ];
}; };
} }

View file

@ -3,19 +3,20 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
cfg = config.modules.system.hardware.bluetooth; cfg = config.modules.system.hardware.bluetooth;
in { in
{
config = mkIf cfg.enable { config = mkIf cfg.enable {
hardware.bluetooth = { hardware.bluetooth = {
enable = true; enable = true;
inherit (cfg) powerOnBoot; inherit (cfg) powerOnBoot;
}; };
environment.systemPackages = builtins.attrValues { environment.systemPackages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
bluetuith bluetuith
bluez bluez
blueman blueman

View file

@ -2,12 +2,14 @@
config, config,
lib, lib,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.system.hardware; cfg = config.modules.system.hardware;
in { in
{
options.modules.system.hardware = { options.modules.system.hardware = {
nvidia = { nvidia = {
enable = mkEnableOption "Nvidia graphics drivers"; enable = mkEnableOption "Nvidia graphics drivers";
@ -32,6 +34,6 @@ in {
package = config.boot.kernelPackages.nvidiaPackages.beta; package = config.boot.kernelPackages.nvidiaPackages.beta;
}; };
}; };
services.xserver.videoDrivers = mkIf cfg.nvidia.enable ["nvidia"]; services.xserver.videoDrivers = mkIf cfg.nvidia.enable [ "nvidia" ];
}; };
} }

View file

@ -3,19 +3,20 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkDefault mkIf; inherit (lib.modules) mkDefault mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
cfg = config.modules.system.hardware.intel; cfg = config.modules.system.hardware.intel;
in { in
{
options.modules.system.hardware.intel.enable = mkEnableOption "Intel Hardware"; options.modules.system.hardware.intel.enable = mkEnableOption "Intel Hardware";
config = mkIf cfg.enable { config = mkIf cfg.enable {
hardware = { hardware = {
cpu.intel.updateMicrocode = mkDefault config.hardware.enableRedistributableFirmware; cpu.intel.updateMicrocode = mkDefault config.hardware.enableRedistributableFirmware;
graphics.extraPackages = builtins.attrValues { graphics.extraPackages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
intel-vaapi-driver intel-vaapi-driver
intel-media-driver intel-media-driver
; ;

View file

@ -2,11 +2,13 @@
config, config,
lib, lib,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
cfg = config.modules.system.sound; cfg = config.modules.system.sound;
in { in
{
config = mkIf cfg.enable { config = mkIf cfg.enable {
services.pipewire = { services.pipewire = {
enable = true; enable = true;

View file

@ -4,23 +4,24 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkDefault; inherit (lib.modules) mkDefault;
in { in
{
imports = [ imports = [
# (sources.watt + "/nix/module.nix") # (sources.watt + "/nix/module.nix")
]; ];
config = { config = {
environment.systemPackages = builtins.attrValues { environment.systemPackages = builtins.attrValues {
inherit inherit (pkgs)
(pkgs)
acpi acpi
powertop powertop
; ;
}; };
boot = { boot = {
kernelModules = ["acpi_call"]; kernelModules = [ "acpi_call" ];
extraModulePackages = with config.boot.kernelPackages; [ extraModulePackages = with config.boot.kernelPackages; [
acpi_call acpi_call
cpupower cpupower

View file

@ -4,9 +4,12 @@
pkgs, pkgs,
sources, sources,
... ...
}: let }:
determinate = (import sources.flake-compat {src = sources.determinate;}).outputs; let
dix = (import sources.flake-compat {src = determinate.inputs.nix;}).outputs.packages.${pkgs.stdenv.system}.nix; determinate = (import sources.flake-compat { src = sources.determinate; }).outputs;
dix =
(import sources.flake-compat { src = determinate.inputs.nix; })
.outputs.packages.${pkgs.stdenv.system}.nix;
# Stronger than mkDefault (1000), weaker than mkForce (50) and the "default override priority" # Stronger than mkDefault (1000), weaker than mkForce (50) and the "default override priority"
# (100). # (100).
@ -14,7 +17,8 @@
# Stronger than the "default override priority", as the upstream module uses that, and weaker than mkForce (50). # Stronger than the "default override priority", as the upstream module uses that, and weaker than mkForce (50).
mkMorePreferable = lib.mkOverride 75; mkMorePreferable = lib.mkOverride 75;
in { in
{
config = { config = {
nix = { nix = {
package = dix; package = dix;
@ -30,7 +34,9 @@ in {
services.nix-daemon.serviceConfig = { services.nix-daemon.serviceConfig = {
ExecStart = [ ExecStart = [
"" ""
"@${determinate.packages.${pkgs.stdenv.system}.default}/bin/determinate-nixd determinate-nixd --nix-bin ${config.nix.package}/bin daemon" "@${
determinate.packages.${pkgs.stdenv.system}.default
}/bin/determinate-nixd determinate-nixd --nix-bin ${config.nix.package}/bin daemon"
]; ];
KillMode = mkPreferable "process"; KillMode = mkPreferable "process";
LimitNOFILE = mkMorePreferable 1048576; LimitNOFILE = mkMorePreferable 1048576;
@ -41,11 +47,14 @@ in {
nix-daemon.socketConfig.FileDescriptorName = "nix-daemon.socket"; nix-daemon.socketConfig.FileDescriptorName = "nix-daemon.socket";
determinate-nixd = { determinate-nixd = {
description = "Determinate Nixd Daemon Socket"; description = "Determinate Nixd Daemon Socket";
wantedBy = ["sockets.target"]; wantedBy = [ "sockets.target" ];
before = ["multi-user.target"]; before = [ "multi-user.target" ];
unitConfig = { unitConfig = {
RequiresMountsFor = ["/nix/store" "/nix/var/determinate"]; RequiresMountsFor = [
"/nix/store"
"/nix/var/determinate"
];
}; };
socketConfig = { socketConfig = {

View file

@ -5,10 +5,12 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.attrsets) mapAttrsToList; inherit (lib.attrsets) mapAttrsToList;
inherit (lib.modules) mkForce; inherit (lib.modules) mkForce;
in { in
{
nix = { nix = {
# Check that Nix can parse the generated nix.conf. # Check that Nix can parse the generated nix.conf.
checkConfig = true; checkConfig = true;
@ -46,7 +48,7 @@ in {
# Automatically optimize nix store by removing hard links # Automatically optimize nix store by removing hard links
optimise = { optimise = {
automatic = true; automatic = true;
dates = ["21:00"]; dates = [ "21:00" ];
}; };
# NOTE: # NOTE:
@ -62,10 +64,18 @@ in {
auto-optimise-store = true; auto-optimise-store = true;
# Users that are allowed to connect to the Nix daemon. # Users that are allowed to connect to the Nix daemon.
allowed-users = ["root" "@wheel" "nix-builder"]; allowed-users = [
"root"
"@wheel"
"nix-builder"
];
# Users that are allowed to connect to the Nix daemon. # Users that are allowed to connect to the Nix daemon.
trusted-users = ["root" "@wheel" "nix-builder"]; trusted-users = [
"root"
"@wheel"
"nix-builder"
];
# Let the system decide the number of max jobs # Let the system decide the number of max jobs
# based on available system specs. Usually this is # based on available system specs. Usually this is

View file

@ -1,5 +1,6 @@
# taken from raf # taken from raf
{sources, ...}: { { sources, ... }:
{
# Global nixpkgs configuration. # Global nixpkgs configuration.
# This is ignored if nixpkgs.pkgs is set, which should be avoided. # This is ignored if nixpkgs.pkgs is set, which should be avoided.
nixpkgs = { nixpkgs = {
@ -40,7 +41,7 @@
# List of derivation warnings to display while rebuilding. # List of derivation warnings to display while rebuilding.
# See: <https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/check-meta.nix> # See: <https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/check-meta.nix>
showDerivationWarnings = []; showDerivationWarnings = [ ];
}; };
}; };
} }

View file

@ -4,12 +4,14 @@
lib, lib,
sources, sources,
... ...
}: let }:
let
inherit (lib.modules) mkIf mkForce; inherit (lib.modules) mkIf mkForce;
inherit (builtins) map; inherit (builtins) map;
cfg = config.modules.system.impermanence; cfg = config.modules.system.impermanence;
in { in
{
imports = [ imports = [
(sources.impermanence + "/nixos.nix") (sources.impermanence + "/nixos.nix")
]; ];
@ -41,20 +43,36 @@ in {
]; ];
users.cr = { users.cr = {
directories = directories = [
[ "cloud"
"cloud" "repos"
"repos" ]
] ++ map (dir: ".config/${dir}") [
++ map ( "nicotine"
dir: ".config/${dir}" "Signal"
) ["nicotine" "Signal" "Nextcloud" "emacs" "doom"] "Nextcloud"
++ map ( "emacs"
dir: ".cache/${dir}" "doom"
) ["tealdeer" "keepassxc" "nix" "starship" "nix-index" "mozilla" "zsh" "nvim"] ]
++ map ( ++ map (dir: ".cache/${dir}") [
dir: ".local/share/${dir}" "tealdeer"
) ["direnv" "Steam" "TelegramDesktop" "PrismLauncher" "nicotine" "zoxide" ".keepass"]; "keepassxc"
"nix"
"starship"
"nix-index"
"mozilla"
"zsh"
"nvim"
]
++ map (dir: ".local/share/${dir}") [
"direnv"
"Steam"
"TelegramDesktop"
"PrismLauncher"
"nicotine"
"zoxide"
".keepass"
];
}; };
}; };

View file

@ -3,10 +3,12 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
StateDirectory = "dnscrypt-proxy"; StateDirectory = "dnscrypt-proxy";
inherit (lib.modules) mkForce; inherit (lib.modules) mkForce;
in { in
{
networking = { networking = {
networkmanager.dns = mkForce "none"; networkmanager.dns = mkForce "none";
nameservers = [ nameservers = [

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: { }:
{
networking = { networking = {
# use nftables over iptables # use nftables over iptables
nftables.enable = true; nftables.enable = true;

View file

@ -1,6 +1,8 @@
{config, ...}: let { config, ... }:
let
inherit (config.modules.other.system) username; inherit (config.modules.other.system) username;
in { in
{
networking = { networking = {
enableIPv6 = true; enableIPv6 = true;
@ -40,7 +42,7 @@ in {
openFirewall = true; openFirewall = true;
}; };
users.users.${username}.extraGroups = ["networkmanager"]; users.users.${username}.extraGroups = [ "networkmanager" ];
# faster boot # faster boot
systemd = { systemd = {

View file

@ -1,11 +1,12 @@
{pkgs, ...}: { { pkgs, ... }:
{
security = { security = {
# Enable Soteria, a GTK-based Polkit authentication agent. # Enable Soteria, a GTK-based Polkit authentication agent.
soteria.enable = true; soteria.enable = true;
apparmor = { apparmor = {
enable = true; enable = true;
killUnconfinedConfinables = true; killUnconfinedConfinables = true;
packages = [pkgs.apparmor-profiles]; packages = [ pkgs.apparmor-profiles ];
}; };
pam.services = { pam.services = {

View file

@ -2,16 +2,18 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkForce mkDefault; inherit (lib.modules) mkForce mkDefault;
in { in
{
security = { security = {
sudo-rs.enable = mkForce false; sudo-rs.enable = mkForce false;
sudo = { sudo = {
enable = true; enable = true;
# We use the default sudo package, but with insults if we # We use the default sudo package, but with insults if we
# fail to provide the correct password # fail to provide the correct password
package = pkgs.sudo.override {withInsults = true;}; package = pkgs.sudo.override { withInsults = true; };
# Wheel user should need the password to execute sudo commands # Wheel user should need the password to execute sudo commands
wheelNeedsPassword = mkDefault true; wheelNeedsPassword = mkDefault true;

View file

@ -1,11 +1,13 @@
{lib, ...}: let { lib, ... }:
let
inherit (lib.modules) mkForce; inherit (lib.modules) mkForce;
in { in
{
config.systemd = { config.systemd = {
# faster startup # faster startup
targets.network-online.wantedBy = mkForce []; # Normally ["multi-user.target"] targets.network-online.wantedBy = mkForce [ ]; # Normally ["multi-user.target"]
services = { services = {
NetworkManager-wait-online.wantedBy = mkForce []; # Normally ["network-online.target"] NetworkManager-wait-online.wantedBy = mkForce [ ]; # Normally ["network-online.target"]
systemd-udev-settle.enable = false; systemd-udev-settle.enable = false;
}; };
}; };

View file

@ -1,6 +1,8 @@
{config, ...}: let { config, ... }:
let
machine-id = builtins.substring 0 32 (builtins.hashString "sha256" config.networking.hostName); machine-id = builtins.substring 0 32 (builtins.hashString "sha256" config.networking.hostName);
in { in
{
system = { system = {
# My state version. # My state version.
stateVersion = "23.11"; stateVersion = "23.11";

View file

@ -3,7 +3,8 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkForce mkIf; inherit (lib.modules) mkForce mkIf;
inherit (lib.options) mkEnableOption; inherit (lib.options) mkEnableOption;
inherit (config.modules.system) isGraphical; inherit (config.modules.system) isGraphical;
@ -27,31 +28,28 @@
}) })
]; ];
}); });
in { in
{
options.modules.desktops.niri.enable = mkEnableOption "Niri, a scolling tiling wayland compositor"; options.modules.desktops.niri.enable = mkEnableOption "Niri, a scolling tiling wayland compositor";
config = config = mkIf (cfg.enable || isGraphical) {
mkIf (cfg.enable programs.niri = {
|| isGraphical) enable = true;
{ package = patched-niri;
programs.niri = {
enable = true;
package = patched-niri;
};
# The niri module auto enables the gnome keyring,
# which is something I direly want to avoid.
services.gnome.gnome-keyring.enable = mkForce false;
environment.etc."niri/config.kdl".source = ./config.kdl;
environment.systemPackages = builtins.attrValues {
inherit
(pkgs)
xwayland-satellite
avizo
playerctl
wl-clipboard
;
};
}; };
# The niri module auto enables the gnome keyring,
# which is something I direly want to avoid.
services.gnome.gnome-keyring.enable = mkForce false;
environment.etc."niri/config.kdl".source = ./config.kdl;
environment.systemPackages = builtins.attrValues {
inherit (pkgs)
xwayland-satellite
avizo
playerctl
wl-clipboard
;
};
};
} }

View file

@ -3,10 +3,12 @@
lib, lib,
pkgs, pkgs,
... ...
}: let }:
let
inherit (lib.modules) mkIf; inherit (lib.modules) mkIf;
inherit (lib.lists) optional; inherit (lib.lists) optional;
in { in
{
xdg.portal = { xdg.portal = {
enable = true; enable = true;
# Sets environment variable NIXOS_XDG_OPEN_USE_PORTAL to 1. # Sets environment variable NIXOS_XDG_OPEN_USE_PORTAL to 1.
@ -26,7 +28,7 @@ in {
"org.freedesktop.impl.portal.Secret" = [ "org.freedesktop.impl.portal.Secret" = [
"kwallet" "kwallet"
]; ];
"org.freedesktop.secrets" = ["kwalletd6"]; "org.freedesktop.secrets" = [ "kwalletd6" ];
}; };
niri = { niri = {
default = [ default = [
@ -38,7 +40,7 @@ in {
# https://docs.flatpak.org/en/latest/portal-api-reference.html # https://docs.flatpak.org/en/latest/portal-api-reference.html
# "org.freedesktop.impl.portal.Access" = ["kde"]; # "org.freedesktop.impl.portal.Access" = ["kde"];
# "org.freedesktop.impl.portal.Notification" = ["kde"]; # "org.freedesktop.impl.portal.Notification" = ["kde"];
"org.freedesktop.impl.portal.FileChooser" = ["kde"]; "org.freedesktop.impl.portal.FileChooser" = [ "kde" ];
}; };
}; };
}; };

Some files were not shown because too many files have changed in this diff Show more