Compare commits

...

22 Commits

Author SHA1 Message Date
2d1d85ddc6 laying ground work for hyprland and yveltal 2025-10-24 21:40:13 -05:00
7a371f3b1e fuck it nah its only 30 min 2025-10-23 22:40:30 -05:00
bf8c4d050d make smart tests less frequent 2025-10-23 22:36:47 -05:00
1832c5ac83 clean up and finish syncthing to holocron 2025-10-23 22:33:11 -05:00
6f1c74d243 add syncthing to proxy and glance 2025-10-23 22:16:25 -05:00
d1dde74c4f add holocron folder ID 2025-10-23 22:02:02 -05:00
05607c2b48 add syncthing to holocron 2025-10-23 21:57:50 -05:00
eea735134d add syncthing to holocron 2025-10-23 21:55:44 -05:00
d9f06234fd add syncthing to holocron 2025-10-23 21:55:18 -05:00
f4b505d1d1 update 2025-10-23 19:30:03 -05:00
24ac2aca51 disable ensure perms 2025-10-22 22:20:20 -05:00
4881ac5808 fix zfs 2025-10-22 22:12:54 -05:00
b7fb67f939 add ffmpeg to sonarr and radarr 2025-10-22 21:50:35 -05:00
32f37c7c2e add automatic smart testing 2025-10-19 15:06:10 -05:00
0a31b25d83 test email 2025-10-19 14:49:15 -05:00
acc28d9278 add email notifs to zfs and smart 2025-10-19 14:44:35 -05:00
ae04500e63 postfix with gmail 2025-10-19 14:33:36 -05:00
f463b76253 try with apple 2025-10-19 14:13:23 -05:00
5298430415 try with apple email 2025-10-19 14:11:47 -05:00
14f790e67a update options to support new syntax 2025-10-19 14:06:42 -05:00
6ca265e97b add postfix 2025-10-19 13:59:06 -05:00
7b11dbdcfa give copyparty access to archives 2025-10-19 13:32:31 -05:00
23 changed files with 845 additions and 69 deletions

36
flake.lock generated
View File

@@ -111,11 +111,11 @@
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1760309387,
"narHash": "sha256-yCjkJuQbt6DjdS1XJL2uwyLu1AcmDvlyMGojBq8Ua38=",
"lastModified": 1761256472,
"narHash": "sha256-iDM8s8cSkncybNs5IGo7qqeErCh+lk0mF6aiVYEtDHA=",
"owner": "9001",
"repo": "copyparty",
"rev": "d099e5e84e191d67a7bffa574ab39b6d0d4f6adf",
"rev": "cdd5e78adf3d28a20a94628164188253bdfff2c1",
"type": "github"
},
"original": {
@@ -337,11 +337,11 @@
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1760284886,
"narHash": "sha256-TK9Kr0BYBQ/1P5kAsnNQhmWWKgmZXwUQr4ZMjCzWf2c=",
"lastModified": 1761114652,
"narHash": "sha256-f/QCJM/YhrV/lavyCVz8iU3rlZun6d+dAiC3H+CDle4=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "cf3f5c4def3c7b5f1fc012b3d839575dbe552d43",
"rev": "01f116e4df6a15f4ccdffb1bcd41096869fb385c",
"type": "github"
},
"original": {
@@ -352,11 +352,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1760139962,
"narHash": "sha256-4xggC56Rub3WInz5eD7EZWXuLXpNvJiUPahGtMkwtuc=",
"lastModified": 1761016216,
"narHash": "sha256-G/iC4t/9j/52i/nm+0/4ybBmAF4hzR8CNHC75qEhjHo=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "7e297ddff44a3cc93673bb38d0374df8d0ad73e4",
"rev": "481cf557888e05d3128a76f14c76397b7d7cc869",
"type": "github"
},
"original": {
@@ -401,11 +401,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1760374571,
"narHash": "sha256-M2lAawtTe+ASWhcHTiTxtI3ROic8bsNLNN3RvJ2ghew=",
"lastModified": 1761238604,
"narHash": "sha256-xZ8SGSSndcvjZLUrMLrz4DjnPFtjZfSGZzEHPGnS2Eg=",
"owner": "notashelf",
"repo": "nvf",
"rev": "3e48f13c3ce8372d00be2e27f313f2ed8da5bc82",
"rev": "dad8ece966760d5de956ffa69670ffce1a90f3e3",
"type": "github"
},
"original": {
@@ -437,11 +437,11 @@
]
},
"locked": {
"lastModified": 1760393368,
"narHash": "sha256-8mN3kqyqa2PKY0wwZ2UmMEYMcxvNTwLaOrrDsw6Qi4E=",
"lastModified": 1760998189,
"narHash": "sha256-ee2e1/AeGL5X8oy/HXsZQvZnae6XfEVdstGopKucYLY=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "ab8d56e85b8be14cff9d93735951e30c3e86a437",
"rev": "5a7d18b5c55642df5c432aadb757140edfeb70b3",
"type": "github"
},
"original": {
@@ -471,11 +471,11 @@
"tinted-zed": "tinted-zed"
},
"locked": {
"lastModified": 1760472212,
"narHash": "sha256-4C3I/ssFsq8EgaUmZP0xv5V7RV0oCHgL/Rx+MUkuE+E=",
"lastModified": 1761028816,
"narHash": "sha256-s1XiIeJHpODVWfzsPaK9e21iz1dQSCU3H4/1OxOsyps=",
"owner": "nix-community",
"repo": "stylix",
"rev": "8d008296a1b3be9b57ad570f7acea00dd2fc92db",
"rev": "b81dc0a385443099e7d231fe6275189e32c3b760",
"type": "github"
},
"original": {

View File

@@ -51,16 +51,25 @@
};
stable_pkgs = builtins.mapAttrs (k: v: import nixpkgs {system = v;}) systems;
unstable_pkgs = builtins.mapAttrs (k: v: import nixpkgs-unstable {system = v;}) systems;
current_system = builtins.currentSystem;
in {
nixosConfigurations = {
snowbelle = nixpkgs.lib.nixosSystem {
system = systems.x86_64;
specialArgs = {inherit inputs stable_pkgs unstable_pkgs;};
specialArgs = {inherit inputs stable_pkgs unstable_pkgs current_system;};
modules = [
./hosts/nixos/snowbelle/configuration.nix
inputs.home-manager.nixosModules.default
];
};
yveltal = nixpkgs.lib.nixosSystem {
system = systems.x86_64;
specialArgs = {inherit inputs stable_pkgs unstable_pkgs current_system;};
modules = [
./hosts/nixos/yveltal/configuration.nix
inputs.home-manager.nixosModules.default
];
};
vaniville = nixpkgs.lib.nixosSystem {
system = systems.x86_64;
specialArgs = {inherit inputs stable_pkgs unstable_pkgs;};
@@ -73,7 +82,7 @@
darwinConfigurations = {
CEN-IT-07 = nix-darwin.lib.darwinSystem {
system = systems.darwin;
specialArgs = {inherit inputs stable_pkgs unstable_pkgs nix-homebrew;};
specialArgs = {inherit inputs stable_pkgs unstable_pkgs nix-homebrew current_system;};
modules = [
./hosts/darwin/cen-it-07/configuration.nix
inputs.home-manager.darwinModules.default

View File

@@ -21,13 +21,13 @@ in
sops.enable = true;
podman.enable = true;
yubikey.enable = true;
syncthing.enable = true;
tailscale.enable = true;
nvidia.enable = true;
};
holocron = {
syncthing.enable = true;
copyparty.enable = true;
ensure_perms.enable = true;
ensure_perms.enable = false;
zfs.enable = true;
smb.enable = true;
nfs.enable = true;
@@ -36,6 +36,7 @@ in
enable = true;
backups.enable = true;
motd.enable = true;
postfix.enable = true;
gitea.enable = true;
glance.enable = true;
immich.enable = true;

View File

@@ -0,0 +1,15 @@
{
pkgs,
lib,
config,
...
}: {
# enable hyprland
programs.hyprland.enable = true;
# hint to election apps wayland is in use
environment.sessionVariables.NIXOS_OZONE_WL = "1";
}

View File

@@ -58,7 +58,7 @@ in {
home = cfg.data_dir;
createHome = true;
group = service;
extraGroups = [ "media" "blake" ];
extraGroups = [ "media" "blake" "archives" ];
};
# enable the ${service} service

View File

@@ -10,6 +10,7 @@
./nfs
./smb
./zfs
./syncthing
./copyparty
./perms
];

View File

@@ -0,0 +1,85 @@
{
pkgs,
config,
lib,
...
}: let
service = "syncthing";
cfg = config.holocron.${service};
sec = config.sops.secrets;
url = "syncthing.snowbelle.lan";
homelab = config.homelab;
in {
options.holocron.${service} = {
enable = lib.mkEnableOption "enables syncthing";
};
config = lib.mkIf cfg.enable {
services.syncthing = {
enable = true;
user = "blake";
group = "blake";
dataDir = "/var/lib/syncthing";
guiAddress = "0.0.0.0:2222";
openDefaultPorts = true;
extraFlags = ["--no-default-folder"];
key = sec."${service}/snowbelle/key".path;
cert = sec."${service}/snowbelle/cert".path;
settings = {
devices = {
"lugia" = {id = "BKKSFPH-YEOVVAB-DTT7KK3-UDKAEJ2-PC6ECG7-Y76ZIVP-JRYMMXS-RTZYVQ3";};
"zygarde" = {id = "UYLTF52-VVKUR7F-JN33HQZ-RFNWGL3-JER52LA-GZD2LPJ-QIFEE7K-MNMZRQ5";};
"CEN-IT-07" = {id = "DPYKA4Z-3PX7JB2-FBEOXXX-SC7TLT2-QC5P2IR-SXOPJGX-QO3DMII-5B7UCA4";};
};
folders = {
"holocron" = {
path = "/holocron/users/blake/holocron";
devices = ["lugia" "zygarde" "CEN-IT-07"];
id = "5voxg-c3he2";
versioning = {
type = "staggered";
fsPath = "/holocron/users/blake/holocron/.stversions";
params = {
cleanInterval = "3600";
maxAge = "0";
};
};
};
};
options = {
urAccepted = -1;
};
};
};
sops.secrets = {
"${service}/snowbelle/key" = {
owner = "blake";
group = "blake";
};
"${service}/snowbelle/cert" = {
owner = "blake";
group = "blake";
};
};
homelab.backups.baks = {
${service} = { paths = [ config.services.syncthing.dataDir ]; };
};
services.caddy.virtualHosts."${url}" = {
extraConfig = ''
tls /etc/ssl/blakedheld.xyz.crt /etc/ssl/blakedheld.xyz.key
reverse_proxy 127.0.0.1:2222
'';
};
# add to glance (local service)
homelab.glance.links.system = [{
title = service;
url = "https://${url}";
error-url = "http://${homelab.host_ip}:2222";
check-url = "http://${homelab.host_ip}:2222";
icon = "di:${service}"; }];
};
}

View File

@@ -18,17 +18,41 @@ in {
boot.kernelModules = ["zfs"];
boot.supportedFilesystems = ["zfs"];
# arc cache size
boot.kernelParams = [ "zfs.zfs_arc_max=12884901888" ];
# pools to import
#boot.zfs.extraPools = [ "holocron" "holocron/archives" "/holocron/media" "/holocron/users" ];
#boot.zfs.extraPools = [ "holocron" ];
# enable smart monitoring
services.smartd.enable = true;
services.smartd = {
enable = true;
autodetect = true;
defaults.monitored = "-a -o on -s (S/../.././05|L/../01/./05)";
notifications.mail = {
enable = true;
sender = "zfs@snowbelle.lan";
};
};
# enable zfs
services.zfs = {
autoScrub.enable = true;
autoScrub.interval = "weekly";
# email notifs
zed = {
enableMail = true;
settings = {
ZED_EMAIL_ADDR = ["root"];
# send notification if scrub succeeds
ZED_NOTIFY_VERBOSE = true;
};
};
};
# install userspace tools for acl's
environment.systemPackages = with pkgs; [ nfs-utils ];
environment.systemPackages = with pkgs; [smartmontools];
fileSystems."/holocron" = {
device = "holocron";

View File

@@ -3,16 +3,13 @@
config,
lib,
...
}:
let
}: let
service = "";
cfg = config.modules.services.${service};
cfg = config.homelab.${service};
sec = config.sops.secrets;
homelab = config.homelab;
in
{
options.modules.services.${service} = {
in {
options.homelab.${service} = {
enable = lib.mkEnableOption "enables ${service}";
# set port options
@@ -44,7 +41,6 @@ in
};
config = lib.mkIf cfg.enable {
# declare ${service} group
users.groups.${service} = {
gid = lib.mkForce cfg.ids;
@@ -118,7 +114,7 @@ in
# };
# add to backups
system.backups.baks = {
homelab.backups.baks = {
${service} = {
paths = [cfg.data_dir];
};

View File

@@ -44,6 +44,9 @@ in
config = lib.mkIf cfg.enable {
# required
environment.systemPackages = with pkgs; [ffmpeg_6-headless];
# declare ${service} group
users.groups.${service} = { gid = lib.mkForce cfg.ids; };

View File

@@ -44,6 +44,9 @@ in
config = lib.mkIf cfg.enable {
# required
environment.systemPackages = with pkgs; [ffmpeg_6-headless];
# declare ${service} group
users.groups.${service} = { gid = lib.mkForce cfg.ids; };

View File

@@ -44,6 +44,7 @@ in
./motd
./backups
./glance
./postfix
./caddy
./home/zigbee2mqtt
./vaultwarden

View File

@@ -0,0 +1,101 @@
{
pkgs,
config,
lib,
...
}: let
service = "postfix";
cfg = config.homelab.${service};
sec = config.sops.secrets;
homelab = config.homelab;
in {
options.homelab.${service} = {
enable = lib.mkEnableOption "enables ${service}";
# set port options
port = lib.mkOption {
type = lib.types.int;
default = 587;
description = "set port for ${service} (default: ${toString cfg.port}";
};
url = lib.mkOption {
type = lib.types.str;
default = "${service}.${homelab.base_domain}";
description = "set domain for ${service}";
};
data_dir = lib.mkOption {
type = lib.types.str;
default = "/var/lib/${service}";
description = "set data directory for ${service}";
};
ids = lib.mkOption {
type = lib.types.int;
default = cfg.port;
description = "set uid and pid of ${service} user (matches port by default)";
};
backup = lib.mkOption {
type = lib.types.bool;
default = true;
description = "enable backups for ${service}";
};
};
config = lib.mkIf cfg.enable {
# declare ${service} group
# users.groups.${service} = {
# gid = lib.mkForce cfg.ids;
# };
#
# # declare ${service} user
# users.users.${service} = {
# description = "${service} server user";
# uid = lib.mkForce cfg.ids;
# isSystemUser = true;
# home = cfg.data_dir;
# createHome = true;
# group = service;
# extraGroups = [];
# };
# enable the ${service} service
services.postfix = {
enable = true;
relayHost = "smtp.gmail.com";
relayPort = cfg.port;
config = {
#smtp_use_tls = "yes";
smtp_tls_security_level = "may";
smtp_sasl_auth_enable = "yes";
smtp_sasl_security_options = "";
smtp_sasl_password_maps = "texthash:${config.sops.secrets."postfix_passwd".path}";
# optional: Forward mails to root (e.g. from cron jobs, smartd)
# to me privately and to my work email:
virtual_alias_maps = "inline:{ {root=me@blakedheld.xyz, throwedspam@gmail.com} }";
};
};
# override umask to make permissions work out
# systemd.services.${service}.serviceConfig = {
# UMask = lib.mkForce "0007";
# User = service;
# Group = service;
#};
# open firewall
networking.firewall.allowedTCPPorts = [ cfg.port ];
sops.secrets = {
"${service}_passwd" = {
owner = config.services.postfix.user;
group = config.services.postfix.group;
};
};
# add to backups
homelab.backups.baks = {
${service} = {
paths = [cfg.data_dir];
};
};
};
}

View File

@@ -0,0 +1,100 @@
{
pkgs,
config,
lib,
...
}: let
service = "postfix";
cfg = config.homelab.${service};
sec = config.sops.secrets;
homelab = config.homelab;
in {
options.homelab.${service} = {
enable = lib.mkEnableOption "enables ${service}";
# set port options
port = lib.mkOption {
type = lib.types.int;
default = 587;
description = "set port for ${service} (default: ${toString cfg.port}";
};
url = lib.mkOption {
type = lib.types.str;
default = "${service}.${homelab.base_domain}";
description = "set domain for ${service}";
};
data_dir = lib.mkOption {
type = lib.types.str;
default = "/var/lib/${service}";
description = "set data directory for ${service}";
};
ids = lib.mkOption {
type = lib.types.int;
default = cfg.port;
description = "set uid and pid of ${service} user (matches port by default)";
};
backup = lib.mkOption {
type = lib.types.bool;
default = true;
description = "enable backups for ${service}";
};
};
config = lib.mkIf cfg.enable {
# declare ${service} group
# users.groups.${service} = {
# gid = lib.mkForce cfg.ids;
# };
#
# # declare ${service} user
# users.users.${service} = {
# description = "${service} server user";
# uid = lib.mkForce cfg.ids;
# isSystemUser = true;
# home = cfg.data_dir;
# createHome = true;
# group = service;
# extraGroups = [];
# };
# enable the ${service} service
services.postfix = {
enable = true;
relayHost = "smtp.mail.me.com";
relayPort = cfg.port;
config = {
smtp_tls_security_level = "may";
smtp_sasl_auth_enable = "yes";
smtp_sasl_security_options = "";
smtp_sasl_password_maps = "texthash:${config.sops.secrets."postfix_passwd".path}";
# optional: Forward mails to root (e.g. from cron jobs, smartd)
# to me privately and to my work email:
virtual_alias_maps = "inline:{ {root=me@blakedheld.xyz} }";
};
};
# override umask to make permissions work out
# systemd.services.${service}.serviceConfig = {
# UMask = lib.mkForce "0007";
# User = service;
# Group = service;
#};
# open firewall
networking.firewall.allowedTCPPorts = [ cfg.port ];
sops.secrets = {
"${service}_passwd" = {
owner = config.services.postfix.user;
group = config.services.postfix.group;
};
};
# add to backups
homelab.backups.baks = {
${service} = {
paths = [cfg.data_dir];
};
};
};
}

View File

@@ -6,10 +6,14 @@ klefki_auth_map: ENC[AES256_GCM,data:u8OBLtT/,iv:THW21BDyhyFIjcwixsAnaAODofxbuQZ
tailscale_authkey: ENC[AES256_GCM,data:SU0k3asrJd+WZ86VbC4w8TDJp+MqsbyagrzCfDcgTzO5yvBjpWAKbJ7A+VxgQvdu4+S2jMYbdrONPp3YbQ==,iv:VMYmGVk5GpUQApKKQYhdOw/cYCXrXxEZJJwHfQL4MjQ=,tag:7ruaoCDxuFQ7tE/JLJ37Xw==,type:str]
#ENC[AES256_GCM,data:bEbCic+ZDAA5ieNedCbiVbJrse17,iv:UwRYlis6NPB/RUcv+YnPxrGdbIcF4hrNiZt19YvWZNQ=,tag:m6PVlzPNnahX7X7KzMUj7A==,type:comment]
borg_passwd: ENC[AES256_GCM,data:XOMJtr+DRs7xn5Iclc49iTzK9cFJyc/fSXJjhdKa9jdN,iv:YB8z7zNYjh6NpSxQb1TfPxAYUdzThdVfNZIe6tO5grA=,tag:bO6kZ3cLJDL4IQoWmGvRdg==,type:str]
#ENC[AES256_GCM,data:VdbMrwGKUKNJHw==,iv:OLwBh6KQXR/H8eRgp/hH8k3QfIkK/ydL735kx/dpc8E=,tag:N+v+ym6RMbvW4IckbiLK8Q==,type:comment]
syncthing:
gui_passwd: ENC[AES256_GCM,data:CicGIe5dT8lJVchCcE4wg3E8va3RYR8d53MISkE=,iv:8ziDDyQvU8ABaKKwYlcHmvm8Qybk4G+q5F0Ghqluu9w=,tag:YlyNPE04KD3detL1QUTrgQ==,type:str]
snowbelle:
key: ENC[AES256_GCM,data:MrAc4RXi6h4WOboZgBRjggPNGUrQwM1Vu5N5aPYBxeBZPi2ut8OApWcA9apWzYZNQTFF5QCtCpG9W+1CLJRG701PRK1Wf01r5SDI8aIXkgc2MjXuzS/y/WIqWoPK1nmtjxTYqaDR68II2tc/P7hgtf2EwYPV2JP6v6cCihADOKvXW1pBxi9kMjZGcbY54IyUrOdNauDvaZRgCSP7xtg8aWf1FlmJbiQgMW2lK/f+8rc/3OGS+ieFt35h29Khl4rhuYGB6rgTwvDaWa9g60rPzVcg6tKw+Unef99pA+CQnhVJJIejKlC07pCdqdjCUc+w0oQ69cVoucWeHqlq3xA7IvYIGi9K+OFCLmsoqjMe/wUSC/r2s/nnqbXsgVx9j8j0,iv:2FoZwwzKUky02Z34KRVP/jPhOMXnLZh841+4lybsbCY=,tag:ZL5qh3OcFjiWgqtmTCUFkw==,type:str]
cert: ENC[AES256_GCM,data:tvJX88ounzIzKmKcvEe0UtHrq51DMAIHGVZE2StqfNkn2QP+Er/geEh0wwmP9Q8+XBBjDT6oSAlWLjq6Tc1yYWSKju6Ig8GEJNDHL2UMVniBFzroSlO9hqZzbbNe1896WiwhhypvBoves7STTE7tJ2+Hzyss1BCYjcI+evGliJslq2nqxroMxIwBXfuDtxcTAeJ+SiKonY7W29NA05P1zYm6o6Td09VUS0cYWx2VUoP/8PMpeWLNciaHz8TjUeZ2Qob3pcNielu/VDqbunLvbFapqdV0hkl8gxgho+MmkC3+DXp/JDnG+vRm603wxqDECh6CNYc0CEXvM0/8gSXt6AkjATv6tBV98VeLknZkqVjBahtxrZuwquMuQbh1jD53RgsvnwB39FyFHZw29DGcUD0A7hIGnqSYVc2TXW+sgRxzXVFYsVrt1sWrYa2DpZT5zaFbps0dd194/j0SHOdf3p/4HF0GncWfTWLT89F/oAyJLio4X7yjES/DljgvmsrX0LdHnAYYAKDCWhZml3wSHBJ7Uvj1KiH2asxXkdiTPf8wulmwT+01hhBoX3QCkVYkdJpDbVddjLkwpLNyJATHctyuqzOdEMR4w5usTv9vKcgkMtbmxfWajb4lhjCpuaavkDUoI5h6eB8veXbZqAuX24bCvsLBWOVkg4qt1GGRqHx7+lfFanzMGyYYC/ufAXWD6eOOVsCjHJbHJoI16zq0HkfNpr30w+gO8hOyKgBP64anElzT3NB1sDi2GWxhSUKTDZ3rLsagPhZb3l3/u5SMf6lLWsY6IyFgPcVgY1snSOtd+PO9z9ipfyQZn4kKCtkNPPof8T58Qi7CP4KmVvbJsF67BH26SFclQLaJv5RO7e936vNwLrVhbyaclM0Vz6Y8wJvG4vW1Z4qPt6kP80NEATdrfwAr9nvZkb5rHqRWdxqIWSD5as+HPFzM/Mv0sBZ+B+CnsSv1btdB/iLacd032PGKXfZLxqGGOL1HIjM+QjSjaBTqrYcMke3GvnVfIujfdtcn9tOqGK+QYPS1CTYxWznmHloL2/WYwBY=,iv:qlIfrPxz7NvjkIXSkumfKvN0O1qq1S0T5j+37L8aReU=,tag:Qg8CYcDY/MaLWwNY566wBQ==,type:str]
#ENC[AES256_GCM,data:A0ITyGOGMIoyVOcn5JOi1RAtqUM=,iv:+wWpmFbeLiX/Ae53pj0QmnYY3MEzOMib4cqbePUKtGI=,tag:JHXvrN4bOH+oD3Q70pUuew==,type:comment]
pia_auth: ENC[AES256_GCM,data:rwAu4f5XVS4v4FCLj2zXAegIZeRPLIzUVv6TCrdfg9RGSDJYHgVAX0aFXCBQsDQju9RDycXmc9Id8IuyYN8=,iv:kEA4ADQyUI+zlQoZOKi81dw5BLE1oesqhVf6bfiLgB4=,tag:VHT2uPNW27F3KRM7ZhWdCw==,type:str]
#ENC[AES256_GCM,data:7y1mtYNfbsagqtr66kOx2rinneEW3EZaCJIXzK0qjLX36g==,iv:8ozXuBYirLbKd8sCln2xv/WjhTojY85xU0cL5NVeMlQ=,tag:mclz0GfQ9j2EGWMiQ62QmA==,type:comment]
openvpn_pia_mexico_config: ENC[AES256_GCM,data:59HQ3OZ0QKq92jI=,iv:DZTNvfi6kLXG7dsNkPcXUmXhAG2UdPZBy/L9eWNmRdE=,tag:ndxDDQNL2z1fjxFfU2VRwQ==,type:str]
#ENC[AES256_GCM,data:mbIgMJBhL8nWJzl8q2dFL8XtO1Xa1Q==,iv:caYHYp1boK9wRgCcQe40HTWT/HxAIvYe+HyaruI53Vc=,tag:S6wowhAHObEcs7z8FimZ1g==,type:comment]
wg_mex_key: ENC[AES256_GCM,data:vxDXixo6X6D33+p21L4hB0/yCH+TvMHZl991BkRsE/jdz7rzZuJF+zI7h+Q=,iv:8WR+feHXNUcat8DB2wY7wpos+P7TzgRF7rFD0fYosjY=,tag:p9b9ck0/VZjyLxtHut3n5Q==,type:str]
#ENC[AES256_GCM,data:CO5nrcDbgymnEmCvuTexOBEMncuNM5lQ,iv:6HrxqSN6e7ODuz09MIFgPbIqDCKQySRDaKk5Wdu4HoQ=,tag:JBRjZeEdOg+trohfanO6Mg==,type:comment]
@@ -22,6 +26,9 @@ minecraft_recpro_db_passwd: ENC[AES256_GCM,data:dPAkdEX0hBigo/lND2r3ShxnS4Jc5wTI
#ENC[AES256_GCM,data:nbB5Cd7i/KTMCjCzcX8o1sxREZQ/gLAG,iv:iyuO2erxdJM08WHJBjKuNIXYxVhH7rfyOLTcGCcGqNQ=,tag:UeDszimXv8kQUmDetLeFqg==,type:comment]
mosquitto_hashed_passwd: ENC[AES256_GCM,data:k1Lnr8ZTDpzXMoRmRH61X41boX/D8Rm1KPh7x3/IHFo+XKIOUQns53iA+7e7Ohp8uWSthDlOk4SlRvTXdUNiEz7Zmw9LYwy7BHbwpNo2pFApAye1ORPrMrhMUkUfgBgc8oqPPyRXmmrOAFp6GBbRhg==,iv:D8wQL9iF0rqOte5X24kDTVjYUJXbZSLz0Ykbp0HqmYo=,tag:RUCgO1uKPIdumSo563cg1Q==,type:str]
mosquitto_passwd.yaml: ENC[AES256_GCM,data:9xwHiUaQ6zG/4rkRemXtbRJ/KEV4yajqyYlcXRR1eAQ2XijYOzitPjt53h3FPqp5rxl6dJerXNH5CiZZK3t1l339NxNseJFGVmIHitWJxNmGJMlG3M8r8Q==,iv:C6WWZuVkYaasB2pol3uf4Mc3d/lDEgt2pKX+dHl/Cr4=,tag:jYTC6RKF2TzDSwSUh6D8zQ==,type:str]
#ENC[AES256_GCM,data:zmSByl0De3a39qLbS99oce7ORe2BBoPa+3I05/YYxL7iBeWCP3ZK,iv:6nUTBUFpNK7Mttckqu6Wk/QJ5cP4+iL+EH4ldaIuu9s=,tag:pc5UtjbNPsVOEMCdLKgGMA==,type:comment]
postfix_passwd: ENC[AES256_GCM,data:3ndIsTGPyAQELM8lptBK241a3p77fNijXma4souFKnyrkLBpZ4OP6KWuldFlWySpSG7Yme0by5gOzg==,iv:nYuJKeY4H3OfQleLo7gvheT5JHgXW3hGQvjHeEEN260=,tag:q952E/0QLC49O5Rwua0RWQ==,type:str]
#ENC[AES256_GCM,data:UcpnHZj5xr8P64PzhWVKbFy8pvFM9GCz2mDoW/6iRVqgLTL0FSn6KXep/kfLEnYiqv5ZpsVZjjXsbI5VRJfBo7w4kzX661oDU8323DfQHDkbo2g=,iv:nEApgutl5kjfZkwi9WTOwatraM3+TQqFgk5gEMw0rwA=,tag:Q4gndL+6q7jHN02QCpJDjw==,type:comment]
#ENC[AES256_GCM,data:3oMbbBSrbjrqsdiON1ENB8JeKW0=,iv:+/eL/51OA+VHbkWWSNzQId5BlxnMm+5NBA0uKw010Tk=,tag:vBJpCYmvFivBYIKatDWgHw==,type:comment]
copyparty_passwd: ENC[AES256_GCM,data:I3UYy4nJ0B6RnIp661O0VVqEmxloxxcroBKmNFcgoQ==,iv:sWkPfKqomrNaYFZbn+BeQEugRMlaqi1qJhELqfsGCik=,tag:Sgz56ZW9EY49zfwFDN7whg==,type:str]
#ENC[AES256_GCM,data:3ATkokBKeOp97uORzaePROrKKfG94ic=,iv:MNJRh6Vrso1heqNUJc0M4xGNcMLGwcF9IzoiQ5+SS+g=,tag:xj8Actwkirvq4GE+Ly1M9w==,type:comment]
@@ -47,7 +54,7 @@ sops:
U0tmdFBuZnJES3piOTZNV0VKQmQ0eVUKCWRQ/flLzmpC64WyLoipklZBmrkpYiUg
PRu+itNolpPTHm96pe+P93g2iP0wgekG0cX21wkiU2xaLF3dY2FEIA==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-10-17T08:24:51Z"
mac: ENC[AES256_GCM,data:kIlrr+U7+O1Ocdi8CffmQNOQYh46crnaaQHBOkeOwG4AuAErNb1UjhZiOUELYD6bTG4GnIw0QGAS6xu+C22aA/jKsg/Z0q/LjX3FPDLLmLyEXhjIDVB+DOsxUsUWupZqGOq+HoBWuVYt11kc2ylPqqC5JlxNwQpIXGa1YgsKaNQ=,iv:L813P4Zvse38E2+K1wv0kTrPYgaKQc0rAleGGfhJRyA=,tag:k0v2ApQincLnu1Pd3WOkGw==,type:str]
lastmodified: "2025-10-24T02:40:54Z"
mac: ENC[AES256_GCM,data:1x21LVoE1T/0+cKPiTpfsExWFzCpTQN3BTL2I5LmCX1qlH6s/2zW7LxVrqnVFYcoM+MNjJ/2e0Srp13HDCwxpnjuOYYsEL6fpaZJVOta9IFQYZc5UyZ8fgblt8+F3e6o4fu4ZrweqtFanAknQ0yqFXg7yEwAm+yoRRJOnSc7LI4=,iv:/vZ6DZ7qWqifuZaIFF454oNb4KO7s5AZ4O2hez3aJcA=,tag:WVtfBO6wpKEcCe5VhY2CRw==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0

View File

@@ -31,7 +31,7 @@
useUserPackages = true;
useGlobalPkgs = true;
users = {
"blake" = import ./dots/bundles/snowbelle.nix;
"blake" = import ./home.nix;
};
};

View File

@@ -3,14 +3,24 @@
config,
...
}: {
home.packages = with pkgs; [];
home.packages = with pkgs; [nwg-displays];
wayland.windowManager.hyprland = if pkgs.system == "x86_64-darwin" then {} else {
wayland.windowManager.hyprland = {
enable = true;
systemd.variables = ["--all"];
};
#
home.sessionVariables = if pkgs.system == "x86_64-darwin" then {} else {
home.pointerCursor = {
gtk.enable = true;
# x11.enable = true;
package = pkgs.posy-cursors;
name = "posy";
size = 48;
};
xdg.configFile."hypr/hyprland.conf" = {
source = config.lib.file.mkOutOfStoreSymlink "/home/blake/.nix/users/blake/dots/hypr/hyprland.conf";
};
}

View File

@@ -0,0 +1,40 @@
# --- general settings ---
general {
lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances.
before_sleep_cmd = loginctl lock-session # lock before suspend.
after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
}
# --- dim screen ---
listener {
timeout = 150 # 2.5min.
on-timeout = brightnessctl -s set 1 # set monitor backlight to minimum, avoid 0 on OLED monitor.
on-resume = brightnessctl -r # monitor backlight restore.
}
# --- blank screen ---
listener {
timeout = 330 # 5.5min
on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired.
}
# --- lock screen ---
listener {
timeout = 900 # 15min
on-timeout = loginctl lock-session # lock screen when timeout has passed
}
# --- suspend timeout ---
listener {
timeout = 1800 # 30min
on-timeout = systemctl suspend # suspend pc
}
# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight.
#listener {
# timeout = 150 # 2.5min.
# on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight.
# on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight.
#}

View File

@@ -0,0 +1,279 @@
# blake's hyprland config
# Please note not all available settings / options are set here.
# For a full list, see the wiki ; )
# --- displays ---
# See https://wiki.hyprland.org/Configuring/Monitors/
# currently being managed by nwg-displays
source = ~/.config/hypr/monitors.conf
#monitor = eDP-1,preferred,0x0,1
#monitor = HDMI-A-1,3840x2160@60,auto-left,1.5
#monitor = HDMI-A-1,3840x2160@60,-2560x0,1.5
#monitor = DP-6,1920x1080@120,auto,1
#monitor = HDMI-A-1,referred,0x-1080,1
# workspaces
# currently being managed by nwg-displays
source = ~/.config/hypr/workspaces.conf
#workspace = 1, monitor:eDP-1
#workspace = 2, monitor:desc:Philips Consumer Electronics Company PHL 278E1 0x0000032B
# --- auto-launch ---
exec-once = hyprpaper
exec-once = waybar
exec-once = dunst
exec-once = hypridle
exec-once = wl-paste --type text --watch cliphist store #clipboard history text data
exec-once = wl-paste --type image --watch cliphist store #clipboard history image data
exec-once = /usr/lib/polkit-kde-authentication-agent-1
# --- settings ---
# Source a file (multi-file configs)
# source = ~/.config/hypr/myColors.conf
# Set programs that you use
$terminal = kitty
$fileManager = lf
$menu = tofi-drun --drun-launch=true --prompt-text="launch:"
$browser = firefox
# --- enviroment variables ---
# sharp text in firefox
env = MOZ_ENABLE_WAYLAND,1
# xdg info
env = XDG_CURRENT_DESKTOP,Hyprland
env = XDG_SESSION_TYPE,wayland
env = XDG_SESSION_DESKTOP,Hyprland
# cursors
env = HYPRCURSOR_THEME,posy-hypr
env = HYPRCURSOR_SIZE,48
env = XCURSOR_THEME,posy
env = XCURSOR_SIZE,48
# themes
env = GTK_THEME,gradient-dark-gtk
env = QT_QPA_PLATFORMTHEME,qt6ct # change to qt6ct if you have that
env = QT_STYLE_OVERRIDE,gtk2
# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
input {
kb_layout = us
kb_variant =
kb_model =
kb_options =
kb_rules =
numlock_by_default = true
follow_mouse = 2
sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
touchpad {
disable_while_typing = yes
natural_scroll = yes
clickfinger_behavior = yes
tap-to-click = yes
}
}
general {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
gaps_in = 2
gaps_out = 5
border_size = 3
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
col.inactive_border = rgba(595959aa)
layout = dwindle
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
allow_tearing = false
# disables cursor warping to focused window
}
decoration {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
rounding = 3
blur {
enabled = true
size = 3
passes = 1
}
# drop_shadow = yes
# shadow_range = 4
# shadow_render_power = 3
# col.shadow = rgba(1a1a1aee)
}
animations {
enabled = yes
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 7, myBezier
animation = windowsOut, 1, 7, default, popin 80%
animation = border, 1, 10, default
animation = borderangle, 1, 8, default
animation = fade, 1, 7, default
animation = workspaces, 1, 6, default
}
dwindle {
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
preserve_split = yes # you probably want this
}
master {
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
# new_is_master = true
}
gestures {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
workspace_swipe = on
}
misc {
# See https://wiki.hyprland.org/Configuring/Variables/ for more
force_default_wallpaper = -1 # Set to 0 to disable the anime mascot wallpapers
disable_hyprland_logo = true
disable_splash_rendering = true
focus_on_activate = true
}
# --- window rules ---
windowrulev2 = float,class:(kitty),title:(pulsemixer)
#windowrulev2 = float,center,size 30%,class:(kitty),title:(bluetuith)
# floating audio controls
#windowrulev2 = float,class:(kitty),title:(pulsemixer)
#windowrulev2 = center,class:(kitty),title:(pulsemixer)
#windowrulev2 = size 80%,class:(kitty),title:(pulsemixer)
# floating network controls
#windowrulev2 = float,class:floating
#windowrulev2 = float,class:(kitty),title:(nmtui)
#windowrulev2 = size 100 100,class:(kitty),title:(nmtui)
#windowrulev2 = center,class:(kitty),title:(nmtui)
# floating bluetooth controls
#windowrulev2 = float,class:(kitty),title:(bluetuith)
#windowrulev2 = size 70%,class:(kitty),title:(bluetuith)
#windowrulev2 = center,class:(kitty),title:(bluetuith)
# --- bindings ---
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
$mainMod = SUPER
# system
bind = $mainMod, Q, exec, loginctl lock-session
# programs
bind = $mainMod, Return, exec, $terminal
bind = $mainMod, E, exec, kitty $fileManager
bind = $mainMod, R, exec, $menu
bind = $mainMod, B, exec, $browser
bind = $mainMod, K, exec, hyprpicker --autocopy --format=hex
bind = $mainMod, T, exec, cliphist list | tofi | cliphist decode | wl-copy # clipboard history
# screenshots
bind = , print, exec, hyprshot --mode region --output-folder ~/pictures/screenshots # region capture
bind = $mainMod, print, exec, hyprshot --mode window --output-folder ~/pictures/screenshots # window capture
bind = shift, print, exec, hyprshot --mode output --output-folder ~/pictures/screenshots # monitor capture
# multimedia
bind = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bind = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bind = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+
bind = , XF86AudioPlay, exec, playerctl play-pause
# brightness
bind = , XF86MonBrightnessUp, exec, brightnessctl set +10%
bind = , XF86MonBrightnessDown, exec, brightnessctl set 10%- --min-value
# scratch pad
bind = $mainMod, S, togglespecialworkspace, magic
bind = $mainMod SHIFT, S, movetoworkspace, special:magic
# general window management (https://wiki.hyprland.org/Configuring/Binds/ for more)
bind = $mainMod, C, killactive
bind = $mainMod SHIFT, M, exit
bind = $mainMod, V, togglefloating
bind = $mainMod, F, fullscreen, 1 # maximize
bind = $mainMod SHIFT, F, fullscreen, 0 # full screen proper
bind = $mainMod, P, pseudo # dwindle
bind = $mainMod, J, togglesplit # dwindle
# window switching
bind = $mainMod, tab, cyclenext
bind = $mainMod, left, movefocus, l
bind = $mainMod, right, movefocus, r
bind = $mainMod, up, movefocus, u
bind = $mainMod, down, movefocus, d
# window moving
bind = $mainMod SHIFT, left, swapwindow, l
bind = $mainMod SHIFT, right, swapwindow, r
bind = $mainMod SHIFT, up, swapwindow, u
bind = $mainMod SHIFT, down, swapwindow, d
# window resizing X Y
bind = $mainMod CTRL, left, resizeactive, -60 0
bind = $mainMod CTRL, right, resizeactive, 60 0
bind = $mainMod CTRL, up, resizeactive, 0 -60
bind = $mainMod CTRL, down, resizeactive, 0 60
# workspace switching
bind = $mainMod, mouse_down, workspace, e+1
bind = $mainMod, mouse_up, workspace, e-1
bind = $mainMod, 1, workspace, 1
bind = $mainMod, 2, workspace, 2
bind = $mainMod, 3, workspace, 3
bind = $mainMod, 4, workspace, 4
bind = $mainMod, 5, workspace, 5
bind = $mainMod, 6, workspace, 6
bind = $mainMod, 7, workspace, 7
bind = $mainMod, 8, workspace, 8
bind = $mainMod, 9, workspace, 9
bind = $mainMod, 0, workspace, 10
# window workspace moving
bind = $mainMod SHIFT, 1, movetoworkspace, 1
bind = $mainMod SHIFT, 2, movetoworkspace, 2
bind = $mainMod SHIFT, 3, movetoworkspace, 3
bind = $mainMod SHIFT, 4, movetoworkspace, 4
bind = $mainMod SHIFT, 5, movetoworkspace, 5
bind = $mainMod SHIFT, 6, movetoworkspace, 6
bind = $mainMod SHIFT, 7, movetoworkspace, 7
bind = $mainMod SHIFT, 8, movetoworkspace, 8
bind = $mainMod SHIFT, 9, movetoworkspace, 9
bind = $mainMod SHIFT, 0, movetoworkspace, 10
# window managment with mouse
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
# waybar
bind = $mainMod, N, exec, pkill -SIGUSR1 waybar # hide waybar
bind = $mainMod SHIFT, N, exec, pkill -SIGUSR2 waybar # reload waybar

View File

@@ -0,0 +1,94 @@
$font = Ubuntu Mono Regular
# GENERAL
general {
disable_loading_bar = true
hide_cursor = true
}
# BACKGROUND
background {
monitor =
path = ~/pictures/wallpapers/antartica.png
blur_passes = 1
color = rgb(0047ab)
}
# TIME
label {
monitor =
text = cmd[update:30000] echo "$(date +"%R")"
color = rgb(ffffff)
font_size = 90
font_family = $font
position = -130, -100
halign = right
valign = top
shadow_passes = 1
}
# DATE
label {
monitor =
text = cmd[update:43200000] echo "$(date +"%Y/%m/%d")"
color = $text
font_size = 25
font_family = $font
position = -130, -250
halign = right
valign = top
shadow_passes = 2
}
# KEYBOARD LAYOUT
label {
monitor =
text = $LAYOUT
color = rbg(ffffff)
font_size = 20
font_family = $font
rotate = 0 # degrees, counter-clockwise
position = -130, -310
halign = right
valign = top
shadow_passes = 2
}
# USER AVATAR
image {
monitor =
path = ~/pictures/pfps/pikacig.png
size = 350
border_color = rgb(0047ab)
rounding = -1
position = 0, 85
halign = center
valign = center
shadow_passes = 2
}
# INPUT FIELD
input-field {
monitor =
size = 400, 70
outline_thickness = 4
dots_size = 0.2
dots_spacing = 0.2
dots_center = true
outer_color = $accent
inner_color = $surface0
font_color = $text
fade_on_empty = false
placeholder_text = # <span foreground="##$textAlpha"><i>󰌾 Logged in as </i><span foreground="##$accentAlpha">$USER</span></span>
hide_input = false
check_color = rgb(0047ab)
fail_color = rgb(ff0000)
fail_text = <i>$FAIL <b>($ATTEMPTS)</b></i>
capslock_color = rgb(ff0000)
position = 0, -185
halign = center
valign = center
shadow_passes = 2
}

View File

@@ -0,0 +1,5 @@
preload = ~/pictures/wallpapers/antartica.png
# wallpaper = eDP-1,~/pictures/wallpapers/antartica.png
wallpaper = ,~/pictures/wallpapers/antartica.png
ipc = off
splash = false

View File

@@ -4,10 +4,12 @@
pkgs,
inputs,
system,
current_system,
...
}: let
platform = if pkgs.system == "x86_64-darwin" then "darwin" else "nixos";
platform = if builtins.pathExists "/System/Library/CoreServices" then "darwin" else "nixos";
#platform = if current_system "x86_64-darwin" then "darwin" else "nixos";
# general config
home_linux = {
@@ -22,7 +24,7 @@ in
{
imports = [
inputs.sops-nix.homeManagerModules.sops
./os/${platform}
./os/${platform}.nix
./dots/neovim
./dots/lf
./dots/zsh

View File

@@ -8,10 +8,10 @@
{
imports = [
../../home.nix
];
home.packages = with pkgs; [
htop
sl
];
}