Compare commits

..

No commits in common. "479a6306423f38e7a62b46eb550ff247cf726e98" and "859ffa55e87121454b5fe901af70ec7374d6bbb6" have entirely different histories.

54 changed files with 18373 additions and 119 deletions

1114
flake.lock generated

File diff suppressed because it is too large Load diff

View file

@ -21,6 +21,8 @@
url = "github:nixos/nixpkgs?ref=master";
};
nixos-wsl.url = "github:nix-community/NixOS-WSL/main";
stylix.url = "github:danth/stylix?ref=release-25.11";
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
sops-nix.url = "github:Mic92/sops-nix";
@ -41,6 +43,18 @@
url = "git+https://git.kylekrein.com/kylekrein/emacs-config";
inputs.nixpkgs.follows = "nixpkgs";
};
beeengine = {
url = "git+https://github.com/KyleKrein/BeeEngine?submodules=1"; #"git+https://git.kylekrein.com/BeeEngine/BeeEngine?shallow=1";
inputs.nixpkgs.follows = "nixpkgs";
};
conduwuit = {
url = "git+https://forgejo.ellis.link/continuwuation/continuwuity.git";
inputs.nixpkgs.follows = "nixpkgs";
};
niri-flake = {
url = "github:sodiboo/niri-flake";
inputs.nixpkgs.follows = "nixpkgs";
};
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
chaotic.url = "github:chaotic-cx/nyx/nyxpkgs-unstable";
lanzaboote.url = "github:nix-community/lanzaboote";
@ -51,6 +65,10 @@
url = "git+https://git.kylekrein.com/kylekrein/snowfall-lib"; #"git+file:///home/kylekrein/Git/snowfall-lib";
inputs.nixpkgs.follows = "nixpkgs";
};
snowfall-flake = {
url = "github:snowfallorg/flake";
inputs.nixpkgs.follows = "nixpkgs";
};
deploy-rs = {
url = "github:serokell/deploy-rs";
inputs.nixpkgs.follows = "nixpkgs";
@ -59,6 +77,23 @@
url = "github:cachix/git-hooks.nix";
inputs.nixpkgs.follows = "nixpkgs";
};
quickshell = {
url = "git+https://git.outfoxxed.me/outfoxxed/quickshell";
inputs.nixpkgs.follows = "nixpkgs";
};
dgop = {
url = "github:AvengeMedia/dgop";
inputs.nixpkgs.follows = "nixpkgs";
};
desktopShell = {
url = "github:KyleKrein/DesktopShell";
inputs.nixpkgs.follows = "nixpkgs";
inputs.dgop.follows = "dgop";
};
rose-pine-hyprcursor = {
url = "github:ndom91/rose-pine-hyprcursor";
inputs.nixpkgs.follows = "nixpkgs";
};
declarative-jellyfin = {
url = "github:Sveske-Juice/declarative-jellyfin";
inputs.nixpkgs.follows = "nixpkgs";
@ -95,9 +130,10 @@
};
# Per-channel config
channels = {
nixpkgs-libre = {
nixpkgs-cuda = {
config = {
allowUnfree = false;
allowUnfree = true;
cudaSupport = true;
};
input = inputs.nixpkgs;
};
@ -107,10 +143,14 @@
overlays = with inputs; [
emacs-kylekrein.overlays.default
niri-flake.overlays.niri
snowfall-flake.overlays.default
];
systems.modules.nixos = with inputs; [
home-manager.nixosModules.home-manager
nix-flatpak.nixosModules.nix-flatpak
niri-flake.nixosModules.niri
sops-nix.nixosModules.sops
nixos-facter-modules.nixosModules.facter
home-manager.nixosModules.default
@ -121,6 +161,15 @@
lanzaboote.nixosModules.lanzaboote
impermanence.nixosModules.impermanence
declarative-jellyfin.nixosModules.default
desktopShell.nixosModules.greeter
];
systems.hosts.kylekrein-framework12.modules = with inputs; [
nixos-hardware.nixosModules.framework-12-13th-gen-intel
];
homes.modules = with inputs; [
nix-flatpak.homeManagerModules.nix-flatpak
];
templates = import ./templates {};
@ -134,7 +183,7 @@
};
kylekrein-homepc.remoteBuild = true;
};
exclude = ["kylekrein-wsl-wm" ];
exclude = ["kylekrein-wsl-wm" "kylekrein-server"];
};
outputs-builder = channels: {

View file

@ -0,0 +1,29 @@
{
lib,
pkgs,
config,
...
}:
# User information gathered by Snowfall Lib is available.
let
name = config.snowfallorg.user.name;
home = config.snowfallorg.user.home.directory;
in {
imports = lib.snowfall.fs.get-non-default-nix-files ./.;
custom = {
programs.librewolf.enable = true;
};
services.flatpak.packages = [
"org.vinegarhq.Sober"
];
home = {
packages = with pkgs; [
zapzap
];
sessionVariables = {
};
stateVersion = "24.11";
};
}

View file

@ -0,0 +1,36 @@
{
pkgs,
lib,
inputs,
...
}: {
home.packages = with pkgs; [
inputs.quickshell.packages.${pkgs.system}.quickshell
material-symbols
inter
fira-code
cava
wl-clipboard
cliphist
ddcutil
matugen
dgop
glib
khal # calendar
gammastep # night mode
colloid-gtk-theme
kitty
playerctl
brightnessctl
libnotify
emacs-pgtk
hyprshot
jq
kdePackages.gwenview
kdePackages.ark
inputs.rose-pine-hyprcursor.packages.${pkgs.system}.default
];
xdg.configFile."quickshell".source = "${
inputs.desktopShell.packages.${pkgs.system}.dankMaterialShell
}/etc/xdg/quickshell";
}

View file

@ -17,16 +17,35 @@ in
enable = true;
firstNixOSInstall = 1729112485;
};
#nheko.enable = osConfig.custom.presets.wayland.enable;
#xournalpp.enable = osConfig.custom.presets.wayland.enable;
librewolf.enable = osConfig.custom.presets.wayland.enable;
prismlauncher.enable = osConfig.custom.presets.gaming.enable;
minecraft-bedrock.enable = osConfig.custom.presets.gaming.enable;
bottles.enable = osConfig.custom.presets.wayland.enable;
nextcloud-client.enable = osConfig.custom.presets.wayland.enable;
thunderbird.enable = osConfig.custom.presets.wayland.enable;
};
};
home = {
packages = with pkgs;
[
neovim
]
++ lib.optionals osConfig.custom.presets.wayland.enable [
gdb
element-desktop
vesktop
obs-studio
localsend
kdePackages.kdenlive
];
sessionVariables = {
EDITOR ="nvim";
EDITOR =
if osConfig.custom.presets.wayland.enable
then "emacsclient -c"
else "nvim";
NH_OS_FLAKE = "${home}/nixos-config";
NH_HOME_FLAKE = "${home}/nixos-config";
NH_DARWIN_FLAKE = "${home}/nixos-config";

View file

@ -0,0 +1,31 @@
{
pkgs,
system,
inputs,
osConfig,
lib,
config,
...
}: let
emacs = pkgs.kylekrein.nixmacs.override {withLsps = true;};
in {
programs.emacs = {
enable = osConfig.custom.presets.wayland.enable;
package = emacs;
};
systemd.user.services.emacs = lib.mkIf config.programs.emacs.enable {
Unit = {
Description = "Launches (and relaunches) emacs";
};
Install = {
WantedBy = ["graphical-session.target"];
};
Service = {
ExecStart = "${pkgs.writeShellScript "run-emacs" ''
${emacs}/bin/emacs --fg-daemon
''}";
Restart = "always";
RestartSec = 5;
};
};
}

View file

@ -0,0 +1,31 @@
{
osConfig,
config,
pkgs,
...
}: {
home.packages = with pkgs; lib.optionals (config.programs.kitty.enable) [kitty-themes];
programs.fzf = {
enable = true;
enableBashIntegration = true;
};
programs.eza = {
enable = true;
icons = "always";
};
programs.kitty = {
enable = osConfig.custom.presets.workstation.enable;
font = {
name = "JetBrainsMono Nerd Font";
size = 20;
};
settings = {
confirm_os_window_close = 0;
};
#shellIntegration.enableFishIntegration = true;
themeFile = "Catppuccin-Macchiato";
#Also available: Catppuccin-Frappe Catppuccin-Latte Catppuccin-Macchiato Catppuccin-Mocha
# See all available kitty themes at: https://github.com/kovidgoyal/kitty-themes/blob/46d9dfe230f315a6a0c62f4687f6b3da20fd05e4/themes.json
};
}

View file

@ -0,0 +1,23 @@
{
pkgs,
lib,
osConfig,
config,
...
}: let
impermanence = config.custom.impermanence;
in {
config = lib.mkIf osConfig.custom.presets.wayland.enable {
home.packages = with pkgs; [
lrcget
picard
beets
];
home.persistence = lib.mkIf impermanence.enable {
"${impermanence.persistentStorage}".directories = [
".config/MusicBrainz"
".config/beets"
];
};
};
}

View file

@ -0,0 +1,81 @@
{
osConfig,
config,
pkgs,
lib,
inputs,
namespace,
...
}:
with lib.custom; let
username = config.snowfallorg.user.name;
home = config.snowfallorg.user.home.directory;
impermanence = config.${namespace}.impermanence;
in
lib.mkIf osConfig.custom.windowManagers.niri.enable {
home.packages = with pkgs; [
inputs.quickshell.packages.${pkgs.system}.quickshell
material-symbols
inter
fira-code
cava
wl-clipboard
cliphist
ddcutil
matugen
dgop
glib
khal # calendar
gammastep # night mode
grim
slurp
satty
];
programs.kitty = {
themeFile = lib.mkForce null;
extraConfig = ''
include ${home}/.config/kitty/dank-theme.conf
'';
};
xdg.configFile."quickshell".source = "${
inputs.desktopShell.packages.${pkgs.system}.dankMaterialShell
}/etc/xdg/quickshell";
home.file.".config/DankMaterialShell/settings.json".source = ./settings.json;
home.persistence = lib.mkIf impermanence.enable {
"${impermanence.persistentStorage}" = {
files = [
".local/state/DankMaterialShell/session.json"
".local/share/color-schemes/DankMatugen.colors"
];
directories = [
".cache/quickshell/dankshell"
#".config/qt5ct"
#".config/qt6ct"
#".config/gtk-3.0"
#".config/gtk-4.0"
];
};
};
systemd.user.services.desktop-shell = {
Unit = {
Description = "Launches (and relaunches) Desktop Shell";
};
Install = {
WantedBy = ["graphical-session.target"];
};
Service = {
ExecStart = ''${lib.getExe pkgs.bash} -c "qs -c dms"'';
Restart = "always";
RestartSec = 5;
};
};
programs.niri = {
settings = {
spawn-at-startup = [
{command = ["wl-paste" "--watch" "cliphist" "store"];}
];
};
};
}

View file

@ -0,0 +1,47 @@
* {
border: none;
font-family: Font Awesome, Roboto, Arial, sans-serif;
font-size: 16px;
color: #eeeeee;
border-radius: 10px;
}
window {
background-color: rgba(50, 63, 99, 0.718);
color: #eeeeee;
}
/* search entry */
entry {
background-color: rgba(0, 0, 0, 0.2)
}
button, image {
background: none;
border: none
}
button:hover {
background-color: rgba(255, 255, 255, 0.1)
}
/* in case you wanted to give category buttons a different look */
#category-button {
margin: 0 10px 0 10px
}
#pinned-box {
padding-bottom: 5px;
border-bottom: 1px dotted gray
}
#files-box {
padding: 5px;
border: 1px dotted gray;
border-radius: 15px
}
/* math operation result label */
#math-label {
font-weight: bold;
font-size: 16px
}

View file

@ -0,0 +1,529 @@
#https://github.com/sodiboo/niri-flake/blob/main/default-config.kdl.nix
#https://github.com/sodiboo/niri-flake/blob/main/docs.md
#https://github.com/sodiboo/system/blob/main/niri.mod.nix
{
osConfig,
config,
pkgs,
lib,
inputs,
...
}:
with lib.custom; let
username = config.snowfallorg.user.name;
home = config.snowfallorg.user.home.directory;
in
lib.mkIf osConfig.custom.windowManagers.niri.enable {
custom = {
programs.nautilus = enabled;
};
home.packages = with pkgs; [
playerctl
papers
brightnessctl
libnotify
custom.wvkbd-kylekrein
custom.lisgd-kylekrein
];
programs.niri = {
settings = {
spawn-at-startup = [
{
command = [
"${lib.getExe pkgs.custom.wvkbd-kylekrein}"
"--hidden"
];
}
{
command = [
"dbus-update-activation-environment"
"--systemd"
"--all"
];
}
{
command = [
"${pkgs.solaar}/bin/solaar"
"-w"
"hide"
];
}
];
layout = {
preset-column-widths = [
{proportion = 1.0 / 2.0;}
{proportion = 1.0;}
{proportion = 2.0 / 3.0;}
{proportion = 1.0 / 3.0;}
];
default-column-width = {proportion = 1.0;};
};
binds = with config.lib.niri.actions; let
sh = spawn "sh" "-c";
emacs = action: sh "emacsclient -c --eval \"${action}\"";
screenshot-annotate = sh ''${lib.getExe pkgs.grim} -g "$(${lib.getExe pkgs.slurp} -w 0)" -t ppm - | ${lib.getExe pkgs.satty} --early-exit --copy-command 'wl-copy' --filename='-' -o '~/Pictures/Screenshots/Screenshot-%Y-%m-%d_%H:%M:%S.png' --initial-tool brush'';
in {
"Mod+E".action = sh "emacsclient -c";
"Mod+Shift+C".action = sh "nautilus";
"Mod+C".action = emacs ''(dirvish \"${home}\")'';
"Mod+T".action = spawn "kitty";
"Mod+B".action = spawn "librewolf";
"Mod+H".action = show-hotkey-overlay;
"Mod+F".action = fullscreen-window;
"Mod+R".action = switch-preset-column-width;
"Mod+Q".action = close-window;
"Mod+P".action = sh ''emacsclient -cF "((visibility . nil))" -e "(emacs-run-password-copy-field)"'';
"Mod+Shift+S".action = screenshot-annotate;
"Mod+1".action = focus-workspace 1;
"Mod+2".action = focus-workspace 2;
"Mod+3".action = focus-workspace 3;
"Mod+4".action = focus-workspace 4;
"Mod+5".action = focus-workspace 5;
"Mod+6".action = focus-workspace 6;
"Mod+7".action = focus-workspace 7;
"Mod+8".action = focus-workspace 8;
"Mod+9".action = focus-workspace 9;
"Mod+0".action = focus-workspace 10;
"Mod+Shift+1".action.move-column-to-workspace = 1;
"Mod+Shift+2".action.move-column-to-workspace = 2;
"Mod+Shift+3".action.move-column-to-workspace = 3;
"Mod+Shift+4".action.move-column-to-workspace = 4;
"Mod+Shift+5".action.move-column-to-workspace = 5;
"Mod+Shift+6".action.move-column-to-workspace = 6;
"Mod+Shift+7".action.move-column-to-workspace = 7;
"Mod+Shift+8".action.move-column-to-workspace = 8;
"Mod+Shift+9".action.move-column-to-workspace = 9;
"Mod+Shift+0".action.move-column-to-workspace = 10;
"Mod+Left".action = focus-column-left;
"Mod+Right".action = focus-column-right;
"Mod+Up".action = focus-workspace-up;
"Mod+Down".action = focus-workspace-down;
"Mod+Shift+Left".action = move-column-left;
"Mod+Shift+Right".action = move-column-right;
"Mod+Shift+Up".action = move-column-to-workspace-up;
"Mod+Shift+Down".action = move-column-to-workspace-down;
"Mod+Ctrl+Left".action = focus-monitor-left;
"Mod+Ctrl+Right".action = focus-monitor-right;
"Mod+Shift+Ctrl+Left".action = move-column-to-monitor-left;
"Mod+Shift+Ctrl+Right".action = move-column-to-monitor-right;
"Ctrl+Alt+Delete" = {
hotkey-overlay.title = "Restart Desktop Shell";
action.spawn = [
"systemctl"
"--user"
"restart"
"desktop-shell.service"
];
};
"Mod+Space" = {
hotkey-overlay.title = "App Launcher";
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"spotlight"
"toggle"
];
};
"Mod+V" = {
hotkey-overlay.title = "Clipboard Manager";
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"clipboard"
"toggle"
];
};
"Mod+M" = {
hotkey-overlay.title = "System Monitor";
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"processlist"
"toggle"
];
};
"Mod+Comma" = {
hotkey-overlay.title = "Open Settings";
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"settings"
"toggle"
];
};
"Super+L" = {
hotkey-overlay.title = "Lock";
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"lock"
"lock"
];
};
"XF86AudioRaiseVolume" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"audio"
"increment"
"3"
];
};
"XF86AudioLowerVolume" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"audio"
"decrement"
"3"
];
};
"XF86AudioMute" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"audio"
"mute"
];
};
"XF86AudioMicMute" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"audio"
"micmute"
];
};
"XF86MonBrightnessUp" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"brightness"
"increment"
"5"
""
];
};
"XF86MonBrightnessDown" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action.spawn = [
"qs"
"-c"
"dms"
"ipc"
"call"
"brightness"
"decrement"
"5"
""
];
};
"XF86AudioNext" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action = sh "playerctl next";
};
"XF86AudioPause" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action = sh "playerctl play-pause";
};
"XF86AudioPlay" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action = sh "playerctl play-pause";
};
"XF86AudioPrev" = {
allow-when-locked = true;
hotkey-overlay.hidden = true;
action = sh "playerctl previous";
};
#"Mod+Tab".action = focus-window-down-or-column-right;
#"Mod+Shift+Tab".action = focus-window-up-or-column-left;
"Mod+Tab".action = toggle-overview;
};
input = {
power-key-handling.enable = false;
focus-follows-mouse = {
#enable = true;
};
warp-mouse-to-focus.enable = false;
keyboard = {
xkb.layout = "eu, ru";
xkb.options = "grp:lctrl_toggle, ctrl:nocaps";
track-layout = "window";
numlock = true;
};
touchpad = {
tap = true;
#accel-profile = "adaptive";
click-method = "clickfinger";
};
};
cursor = {
hide-after-inactive-ms = 10000;
};
gestures.hot-corners.enable = true;
prefer-no-csd = true;
environment = {
XDG_SESSION_TYPE = "wayland";
__GL_GSYNC_ALLOWED = "1";
QT_QPA_PLATFORM = "wayland";
DISPLAY = ":0";
};
layer-rules = [
{
#this is for later to place keyboard on top of hyprlock
matches = [{namespace = "wvkbd";}];
}
];
window-rules = [
{
#active
matches = [
{
is-active = true;
}
];
opacity = 1.0;
}
{
#inactive
matches = [
{
is-active = false;
}
];
opacity = 1.0;
}
{
#opaque
matches = [
{
app-id = "emacs";
}
{
app-id = "blender";
}
];
opacity = 1.0;
}
{
#Popups
matches = [
{
title = "emacs-run-launcher";
}
{
title = "Paradox Crash Reporter";
}
];
open-floating = true;
open-focused = true;
}
{
#Screenshots
matches = [
{
title = "satty";
}
{
app-id = "com.gabm.satty";
}
];
open-floating = true;
open-focused = true;
min-width = 700;
min-height = 350;
}
{
#PiP
matches = [
{
title = "Picture-in-Picture";
}
];
open-floating = true;
open-focused = false;
opacity = 1.0;
default-floating-position = {
x = 0;
y = 0;
relative-to = "top-right";
};
}
];
xwayland-satellite = {
enable = true;
path = "${lib.getExe pkgs.xwayland-satellite-unstable}";
};
};
};
xdg.portal.extraPortals = with pkgs; [
xdg-desktop-portal-gtk
];
services.hypridle = let
niri = lib.getExe config.programs.niri.package;
loginctl = "${pkgs.systemd}/bin/loginctl";
qs = "${inputs.quickshell.packages.${pkgs.system}.quickshell}/bin/qs";
locking-script = "${qs} -c dms ipc call lock lock";
systemctl = "${pkgs.systemd}/bin/systemctl";
suspendScript = cmd:
pkgs.writeShellScript "suspend-script" ''
# check if any player has status "Playing"
${lib.getExe pkgs.playerctl} -a status | ${lib.getExe pkgs.ripgrep} Playing -q
# only suspend if nothing is playing
if [ $? == 1 ]; then
${cmd}
fi
'';
in {
enable = true;
settings.general = {
before_sleep_cmd = "${loginctl} lock-session";
#after_sleep_cmd = "#${niri} msg action power-on-monitors";
lock_cmd = "${locking-script}";
ignore_dbus_inhibit = false; # whether to ignore dbus-sent idle-inhibit requests (used by e.g. firefox or steam)
ignore_systemd_inhibit = false; # whether to ignore systemd-inhibit --what=idle inhibitors
};
settings.listener = let
secondary = "${systemctl} suspend";
in [
#{
# timeout = 30;
# command = "pidof hyprlock && ${secondary}";
#}
{
timeout = 870;
on-timeout = "${suspendScript ''${pkgs.libnotify}/bin/notify-send "You are idle. Going to sleep in 30 seconds"''}";
}
{
timeout = 900;
on-timeout = "${suspendScript "${systemctl} suspend"}";
}
];
};
systemd.user.services.lisgd-niri = lib.mkIf (config.custom.hardware.tablet.enable) {
Unit = {
Description = "Makes sure that you have touchscreen gestures.";
};
Install = {
WantedBy = ["graphical-session.target"];
};
Service = {
ExecStart = "${pkgs.writeShellScript "run-lisgd" ''
${pkgs.custom.lisgd-kylekrein}/bin/lisgd
''}";
Restart = "always";
RestartSec = 5;
};
};
systemd.user.services.autorotate-niri = lib.mkIf (config.custom.hardware.tablet.enable) {
Unit = {
Description = "Adds auto rotation to Niri.";
};
Install = {
WantedBy = ["graphical-session.target"];
};
Service = {
ExecStart = "${pkgs.writeShellScript "autorotate" ''
transform="normal"
monitor-sensor | while read -r line; do
case "$line" in
*normal*)
new_transform="normal"
;;
*right-up*)
new_transform="270"
;;
*bottom-up*)
new_transform="180"
;;
*left-up*)
new_transform="90"
;;
*)
continue
;;
esac
if [[ "$new_transform" != "$transform" ]]; then
transform="$new_transform"
echo "Transform: $transform"
niri msg output eDP-1 transform "$transform"
systemctl --user restart lisgd-niri.service
fi
done
''}";
Restart = "always";
RestartSec = 5;
};
};
custom.hardware.tablet = {
onTabletModeEnable = [
{
name = "autorotate";
command = "systemctl --user start autorotate-niri.service";
}
];
onTabletModeDisable = [
{
name = "autorotate";
command = ''
systemctl --user stop autorotate-niri.service
niri msg output eDP-1 transform normal
'';
}
];
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

View file

@ -0,0 +1,223 @@
{
"currentThemeName": "dynamic",
"customThemeFile": "",
"matugenScheme": "scheme-tonal-spot",
"dankBarTransparency": 0.75,
"dankBarWidgetTransparency": 0.85,
"popupTransparency": 0.92,
"dockTransparency": 1,
"use24HourClock": true,
"useFahrenheit": false,
"nightModeEnabled": false,
"weatherLocation": "51.7177044, 8.7526530",
"weatherCoordinates": "51.7177044,8.7526530",
"useAutoLocation": false,
"weatherEnabled": true,
"showLauncherButton": true,
"showWorkspaceSwitcher": true,
"showFocusedWindow": true,
"showWeather": true,
"showMusic": true,
"showClipboard": true,
"showCpuUsage": true,
"showMemUsage": true,
"showCpuTemp": true,
"showGpuTemp": true,
"selectedGpuIndex": 0,
"enabledGpuPciIds": [],
"showSystemTray": true,
"showClock": true,
"showNotificationButton": true,
"showBattery": true,
"showControlCenterButton": true,
"controlCenterShowNetworkIcon": true,
"controlCenterShowBluetoothIcon": true,
"controlCenterShowAudioIcon": true,
"controlCenterWidgets": [
{
"id": "volumeSlider",
"enabled": true,
"width": 50
},
{
"id": "brightnessSlider",
"enabled": true,
"width": 50
},
{
"id": "wifi",
"enabled": true,
"width": 50
},
{
"id": "bluetooth",
"enabled": true,
"width": 50
},
{
"id": "audioOutput",
"enabled": true,
"width": 50
},
{
"id": "audioInput",
"enabled": true,
"width": 50
},
{
"id": "nightMode",
"enabled": true,
"width": 25
},
{
"id": "idleInhibitor",
"enabled": true,
"width": 25
},
{
"id": "doNotDisturb",
"enabled": true,
"width": 25
},
{
"id": "battery",
"enabled": true,
"width": 25
},
{
"id": "diskUsage",
"enabled": true,
"width": 100,
"instanceId": "mfz4b7s6aer4zpglo9g",
"mountPath": "/"
}
],
"showWorkspaceIndex": false,
"showWorkspacePadding": false,
"showWorkspaceApps": true,
"maxWorkspaceIcons": 30,
"workspacesPerMonitor": true,
"workspaceNameIcons": {},
"waveProgressEnabled": true,
"clockCompactMode": false,
"focusedWindowCompactMode": false,
"runningAppsCompactMode": true,
"runningAppsCurrentWorkspace": false,
"clockDateFormat": "ddd d",
"lockDateFormat": "dddd, MMMM d",
"mediaSize": 0,
"dankBarLeftWidgets": [
"launcherButton",
"advancedWorkspaceSwitcher",
{
"id": "workspaceSwitcher",
"enabled": true
}
],
"dankBarCenterWidgets": [
{
"id": "music",
"enabled": true
},
{
"id": "clock",
"enabled": true
},
{
"id": "weather",
"enabled": true
}
],
"dankBarRightWidgets": [
{
"id": "systemTray",
"enabled": true
},
{
"id": "clipboard",
"enabled": true
},
{
"id": "notificationButton",
"enabled": true
},
{
"id": "privacyIndicator",
"enabled": true
},
{
"id": "keyboard_layout_name",
"enabled": true
},
{
"id": "battery",
"enabled": true
},
{
"id": "controlCenterButton",
"enabled": true
}
],
"appLauncherViewMode": "grid",
"spotlightModalViewMode": "list",
"networkPreference": "auto",
"iconTheme": "System Default",
"launcherLogoMode": "os",
"launcherLogoCustomPath": "",
"launcherLogoColorOverride": "primary",
"launcherLogoColorInvertOnMode": false,
"launcherLogoBrightness": 0.5,
"launcherLogoContrast": 1,
"launcherLogoSizeOffset": 0,
"fontFamily": "Inter Variable",
"monoFontFamily": "Fira Code",
"fontWeight": 400,
"fontScale": 1,
"dankBarFontScale": 1,
"notepadUseMonospace": true,
"notepadFontFamily": "",
"notepadFontSize": 14,
"notepadShowLineNumbers": false,
"notepadTransparencyOverride": -1,
"notepadLastCustomTransparency": 0.95,
"gtkThemingEnabled": true,
"qtThemingEnabled": true,
"showDock": false,
"dockAutoHide": false,
"dockGroupByApp": false,
"dockOpenOnOverview": false,
"dockPosition": 1,
"dockSpacing": 4,
"dockBottomGap": 0,
"cornerRadius": 12,
"notificationOverlayEnabled": false,
"dankBarAutoHide": false,
"dankBarOpenOnOverview": true,
"dankBarVisible": true,
"dankBarSpacing": 4,
"dankBarBottomGap": 0,
"dankBarInnerPadding": 8,
"dankBarSquareCorners": false,
"dankBarNoBackground": false,
"dankBarGothCornersEnabled": false,
"dankBarBorderEnabled": false,
"dankBarPosition": 0,
"lockScreenShowPowerActions": true,
"hideBrightnessSlider": false,
"widgetBackgroundColor": "sth",
"surfaceBase": "s",
"notificationTimeoutLow": 5000,
"notificationTimeoutNormal": 5000,
"notificationTimeoutCritical": 0,
"notificationPopupPosition": 0,
"osdAlwaysShowValue": false,
"screenPreferences": {
"notifications": [
"all"
],
"toast": [
"all"
]
},
"animationSpeed": 2
}

View file

@ -0,0 +1,25 @@
{
osConfig,
config,
pkgs,
lib,
inputs,
namespace,
...
}:
with lib.custom; let
username = config.snowfallorg.user.name;
home = config.snowfallorg.user.home.directory;
impermanence = config.${namespace}.impermanence;
in
lib.mkIf osConfig.custom.windowManagers.niri.enable {
home.packages = with pkgs; [
nordic
];
programs.niri = {
settings = {
cursor.theme = "Nordic-cursors";
};
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 MiB

View file

@ -0,0 +1,22 @@
{
lib,
pkgs,
config,
...
}:
# User information gathered by Snowfall Lib is available.
let
name = config.snowfallorg.user.name;
home = config.snowfallorg.user.home.directory;
in {
imports = lib.snowfall.fs.get-non-default-nix-files ./.;
home = {
packages = with pkgs; [
];
sessionVariables = {
};
stateVersion = "25.05";
};
}

View file

@ -0,0 +1,57 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
osConfig,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.hardware.tablet;
osCfg = osConfig.${namespace}.hardware.tablet;
in {
options.${namespace}.hardware.tablet = with types; {
enable = mkBoolOpt osCfg.enable "Enable tablet module for hardware that supports it";
path = mkOpt path osCfg.path "Path with a file, where it's stated, whether tablet mode 'on' or 'off'";
onTabletModeEnable = mkOpt (listOf (attrsOf str)) [] "Actions to do when entering tablet mode. Should have name and command string attributes.";
onTabletModeDisable = mkOpt (listOf (attrsOf str)) [] "Actions to do when exiting tablet mode. Should have name and command string attributes.";
};
config = mkIf cfg.enable {
systemd.user.services.tablet-mode-watcher = {
Service = {
Type = "oneshot";
ExecStart = pkgs.writeShellScript "tablet-mode-watcher" ''
state=$(${pkgs.coreutils}/bin/cat "${cfg.path}" 2>/dev/null || echo 0)
if [ "$state" -eq 1 ]; then
echo "Tablet mode ON"
${concatStringsSep "\n" (map (cmd: ''
systemd-run --user --unit=tablet-on-${cmd.name} --collect sh -c '${cmd.command}'
'')
cfg.onTabletModeEnable)}
else
echo "Tablet mode OFF"
${concatStringsSep "\n" (map (cmd: ''
systemd-run --user --unit=tablet-off-${cmd.name} --collect sh -c '${cmd.command}'
'')
cfg.onTabletModeDisable)}
fi
'';
};
};
systemd.user.paths.tablet-mode-watcher = {
Unit.Description = "Watch for tablet mode changes";
Path.PathChanged = cfg.path;
Install.WantedBy = ["default.target"];
};
};
}

View file

@ -0,0 +1,35 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.hardware.asahi;
in {
options.${namespace}.hardware.asahi = with types; {
enable = mkBoolOpt false "Enable hardware support for Apple Silicon (M Chips)";
imports = [
inputs.apple-silicon-support.nixosModules.default
({pkgs, ...}: {
hardware.asahi = {
peripheralFirmwareDirectory = ./firmware;
useExperimentalGPUDriver = true; #deprecated
#experimentalGPUInstallMode = "overlay";
setupAsahiSound = true;
};
environment.systemPackages = with pkgs; [
mesa-asahi-edge
];
})
];
};
}

Binary file not shown.

View file

@ -0,0 +1,88 @@
{
config,
namespace,
pkgs,
...
}: let
cfg = config.${namespace}.hardware.battery;
battery-path = "/sys/class/power_supply/${cfg.batteryName}";
get-battery-level = "${pkgs.writeShellScriptBin "get-battery-level" ''
cat ${battery-path}/capacity 2>/dev/null || echo "N/A"
''}/bin/get-battery-level";
get-status = "${pkgs.writeShellScriptBin "get-status" ''
cat ${battery-path}/status 2>/dev/null || echo "Unknown"
''}/bin/get-status";
get-icon = "${pkgs.writeShellScriptBin "get-icon" ''
BATTERY_LEVEL=$(${get-battery-level})
STATUS=$(${get-status})
if [[ "$BATTERY_LEVEL" == "N/A" ]]; then
ICON="󰂑 "
elif [[ "$STATUS" == "Charging" ]]; then
if [[ $BATTERY_LEVEL -ge 90 ]]; then
ICON="󰂋 "
elif [[ $BATTERY_LEVEL -ge 80 ]]; then
ICON="󰂊 "
elif [[ $BATTERY_LEVEL -ge 70 ]]; then
ICON="󰢞 "
elif [[ $BATTERY_LEVEL -ge 60 ]]; then
ICON="󰂉 "
elif [[ $BATTERY_LEVEL -ge 50 ]]; then
ICON="󰢝 "
elif [[ $BATTERY_LEVEL -ge 40 ]]; then
ICON="󰂈 "
elif [[ $BATTERY_LEVEL -ge 30 ]]; then
ICON="󰂇 "
elif [[ $BATTERY_LEVEL -ge 20 ]]; then
ICON="󰂆 "
elif [[ $BATTERY_LEVEL -ge 10 ]]; then
ICON="󰢜 "
else
ICON="󰢜 "
fi
else
if [[ $BATTERY_LEVEL -ge 90 ]]; then
ICON="󰂂 "
elif [[ $BATTERY_LEVEL -ge 70 ]]; then
ICON="󰂀 "
elif [[ $BATTERY_LEVEL -ge 50 ]]; then
ICON="󰁾 "
elif [[ $BATTERY_LEVEL -ge 30 ]]; then
ICON="󰁼 "
elif [[ $BATTERY_LEVEL -ge 10 ]]; then
ICON="󰁺 "
else
ICON="󰁺 "
fi
fi
echo "$ICON"
''}/bin/get-icon";
get-remaining-time = "${pkgs.writeShellScriptBin "get-remaining-time" ''
REMAINING_ENERGY=$(cat ${battery-path}/${cfg.remainingEnergy})
POWER_USAGE=$(cat ${battery-path}/${cfg.powerUsage})
if [[ -n "$REMAINING_ENERGY" && -n "$POWER_USAGE" && "$POWER_USAGE" -ne 0 ]]; then
TIME_LEFT=$(((REMAINING_ENERGY / POWER_USAGE)))
MINUTES_LEFT=$(((( (REMAINING_ENERGY * 60) / POWER_USAGE )) - (TIME_LEFT * 60)))
echo "$TIME_LEFT h $MINUTES_LEFT min"
else
echo ""
fi
''}/bin/get-remaining-time";
in {
${namespace}.hardware.battery.scripts = {
icon = get-icon;
status = get-status;
time = get-remaining-time;
level = get-battery-level;
labelAdaptive = "${pkgs.writeShellScriptBin "labelAdaptive" ''
if [[ "$(${get-status})" == "Charging" ]]; then
echo "$(${get-battery-level})% $(${get-icon})"
else
echo "$(${get-remaining-time}) $(${get-icon})"
fi
''}/bin/labelAdaptive";
labelPercent = "${pkgs.writeShellScriptBin "labelPercent" ''
echo "$(${get-battery-level})% $(${get-icon})"
''}/bin/labelPercent";
};
}

View file

@ -0,0 +1,43 @@
{
lib,
pkgs,
namespace,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.hardware.battery;
in {
options.${namespace}.hardware.battery = with types; {
enable = mkBoolOpt false "If you have a battery in your hardware, enable this";
batteryName = mkOpt str "BAT1" ''
Put your battery name here. You can find it at "/sys/class/power_supply/"
'';
remainingEnergy = mkOpt str "charge_now" ''
File in your battery, that tells the current amount of energy
'';
powerUsage = mkOpt str "current_now" ''
File in your battery, that tells, how much energy your hardware is using
'';
scripts = {
icon = mkOpt' str "";
status = mkOpt' str "";
time = mkOpt' str "";
level = mkOpt' str "";
labelAdaptive = mkOpt' str "";
labelPercent = mkOpt' str "";
};
};
config = mkIf cfg.enable (mkMerge [
(import ./batteryStatus.nix {
inherit config;
inherit namespace;
inherit pkgs;
})
{
services.upower.enable = true;
}
]);
}

View file

@ -0,0 +1,88 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.hardware.framework12;
in {
options.${namespace}.hardware.framework12 = with types; {
enable = mkBoolOpt false "Enable hardware support for framework 12. P.s. you still need to import inputs.nixos-hardware.nixosModules.framework-12-13th-gen-intel yourself";
};
config = mkIf cfg.enable {
${namespace}.hardware = {
tablet.enable = true;
battery = {
enable = true;
batteryName = "BAT1";
remainingEnergy = "charge_now";
powerUsage = "current_now";
};
};
# Ensure that the `pinctrl_tigerlake` kernel module is loaded before `soc_button_array`.
# This is required for correcly switching to tablet mode when the display is folded back.
boot.extraModprobeConfig = ''
softdep soc_button_array pre: pinctrl_tigerlake
'';
boot.initrd.kernelModules = ["pinctrl_tigerlake"];
# Patch the `udev` rules shipping with `iio-sensor-proxy` according to:
# https://github.com/FrameworkComputer/linux-docs/blob/main/framework12/Ubuntu-25-04-accel-ubuntu25.04.md
nixpkgs.overlays = [
(final: prev: {
iio-sensor-proxy = prev.iio-sensor-proxy.overrideAttrs (old: {
postInstall = ''
${old.postInstall or ""}
sed -i 's/.*iio-buffer-accel/#&/' $out/lib/udev/rules.d/80-iio-sensor-proxy.rules
'';
});
})
];
hardware.intel-gpu-tools.enable = true;
services.thermald.enable = true;
hardware.enableRedistributableFirmware = true;
environment.systemPackages = [
pkgs.framework-tool
(pkgs.writeShellScriptBin "reset-tablet" ''
sudo ${pkgs.framework-tool}/bin/framework_tool --tablet-mode tablet
sudo ${pkgs.framework-tool}/bin/framework_tool --tablet-mode auto
'')
];
security.sudo.extraRules = [
{
users = ["ALL"];
commands = [
{
command = "${pkgs.framework-tool}/bin/framework_tool";
options = ["NOPASSWD"];
}
];
}
];
services.xserver.videoDrivers = ["modesetting"];
hardware.graphics = {
enable = true;
extraPackages = with pkgs; [
# For modern Intel CPU's
intel-media-driver # Enable Hardware Acceleration
vpl-gpu-rt # Enable QSV
];
};
environment.sessionVariables = {LIBVA_DRIVER_NAME = "iHD";};
users.groups.touchscreen = {};
services.udev.extraRules = ''
KERNEL=="event*", ATTRS{name}=="ILIT2901:00 222A:5539", SYMLINK+="touchscreen", MODE="0660", GROUP="touchscreen"
'';
};
}

View file

@ -0,0 +1,44 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.hardware.hibernation;
in {
options.${namespace}.hardware.hibernation = with types; {
enable = mkBoolOpt false "Enable hibernation";
swapFileOffset = mkOpt (nullOr int) null "Offset of swapfile. Calculate offset using https://wiki.archlinux.org/title/Power_management/Suspend_and_hibernate#Acquire_swap_file_offset";
resumeDevice = mkOpt' path "/dev/disk/by-label/nixos";
};
config = mkIf cfg.enable {
boot = {
kernelParams =
[
"mem_sleep_default=deep"
]
#https://github.com/nix-community/disko/issues/651#issuecomment-2383741717
++ optional (cfg.swapFileOffset != null) "resume_offset=${builtins.toString cfg.swapFileOffset}";
resumeDevice = mkDefault cfg.resumeDevice;
};
services.logind.settings.Login = {
HandleLidSwitch = mkDefault "suspend-then-hibernate";
HandlePowerKey = mkDefault "suspend-then-hibernate";
HandlePowerKeyLongPress = mkDefault "poweroff";
};
systemd.sleep.extraConfig = ''
HibernateDelaySec=30m
SuspendState=mem
'';
};
}

View file

@ -0,0 +1,70 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.hardware.tablet;
in {
options.${namespace}.hardware.tablet = with types; {
enable = mkBoolOpt false "Enable tablet module for hardware that supports it";
path = mkOpt path "/run/tablet-mode-state" "Path with a file, where it's stated, whether tablet mode 'on' or 'off'";
inputDevice = mkOpt' str "/dev/input/event4";
onTabletModeEnable = mkOpt (listOf (attrsOf str)) [] "Actions to do when entering tablet mode";
onTabletModeDisable = mkOpt (listOf (attrsOf str)) [] "Actions to do when exiting tablet mode";
};
config = mkIf cfg.enable {
# 1. System service for watching
systemd.services = {
tablet-mode-watcher = {
description = "Watch for tablet mode changes";
serviceConfig = {
ExecStart = "${pkgs.writeShellScript "tablet-mode-eventd" ''
if [ -f "${cfg.path}" ]; then
in_tablet_mode=$(${pkgs.coreutils}/bin/cat "${cfg.path}")
else
echo 0 > "${cfg.path}"
in_tablet_mode=0
fi
stdbuf -oL -eL ${lib.getExe pkgs.libinput} debug-events --device "${cfg.inputDevice}" | while read -r line; do
if [[ "$line" =~ switch\ tablet-mode\ state\ ([01]) ]]; then
d="''${BASH_REMATCH[1]}"
if [ "$d" -ne "$in_tablet_mode" ]; then
in_tablet_mode=$d
if [ "$d" -eq 1 ]; then
${concatStringsSep "\n" (map (cmd: ''
systemd-run --unit=tablet-on-${cmd.name} --collect sh -c '${cmd.command}'
'')
cfg.onTabletModeEnable)}
echo "Tablet mode ON"
echo 1 > "${cfg.path}"
else
${concatStringsSep "\n" (map (cmd: ''
systemd-run --unit=tablet-off-${cmd.name} --collect sh -c '${cmd.command}'
'')
cfg.onTabletModeDisable)}
echo "Tablet mode OFF"
echo 0 > "${cfg.path}"
fi
fi
fi
done
''}";
Restart = "always";
};
wantedBy = ["graphical.target"];
};
};
};
}

View file

@ -0,0 +1,46 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.loginManagers.sddm;
in {
options.${namespace}.loginManagers.sddm = with types; {
enable = mkBoolOpt false "Enable sddm as login manager";
};
config = mkIf cfg.enable {
environment.systemPackages = with pkgs; [
(catppuccin-sddm.override {
flavor = "mocha";
# font = "";
fontSize = "16";
#background;
loginBackground = false;
})
wvkbd
];
services.xserver.enable = true;
services.displayManager.sddm = {
enable = true;
theme = "catppuccin-mocha";
package = mkDefault pkgs.kdePackages.sddm;
wayland.enable = mkDefault config.${namespace}.presets.wayland.enable;
settings = {
General = {
InputMethod = "wvkbd-mobintl"; # Enables optional virtual keyboard at login (SDDM). Useful for touchscreens or accessibility.
};
};
};
};
}

View file

@ -66,6 +66,7 @@ in {
git
btop
comma
snowfallorg.flake
];
programs.bash = {
shellAliases = {

View file

@ -0,0 +1,61 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.presets.gaming;
in {
options.${namespace}.presets.gaming = with types; {
enable = mkBoolOpt false "Enable everything that you need for gaming";
};
config = mkIf cfg.enable {
environment.systemPackages = with pkgs; [
unzip
wget
xdotool
xorg.xprop
xorg.xrandr
unixtools.xxd
xorg.xwininfo
yad
protonup-qt
protontricks
];
programs.steam = {
enable = true;
remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers
package = pkgs.steam.override {
extraPkgs = pkgs:
with pkgs; [
xorg.libXcursor
xorg.libXi
xorg.libXinerama
xorg.libXScrnSaver
libpng
libpulseaudio
libvorbis
sdl3
SDL2
stdenv.cc.cc.lib
libkrb5
keyutils
gamescope
];
};
};
programs.gamemode.enable = true;
};
}

View file

@ -0,0 +1,34 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.presets.wayland;
in {
options.${namespace}.presets.wayland = with types; {
enable = mkBoolOpt false "Enable preset with MUST HAVE wayland things";
};
config = mkIf cfg.enable {
environment.sessionVariables = {
NIXOS_OZONE_WL = "1";
};
environment.systemPackages = with pkgs; [
wl-clipboard
git-credential-manager
egl-wayland
pwvucontrol
];
hardware.graphics.enable = true;
};
}

View file

@ -0,0 +1,134 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.presets.workstation;
in {
options.${namespace}.presets.workstation = with types; {
enable = mkBoolOpt false "Enable workstation preset";
};
config = mkIf cfg.enable {
${namespace} = {
presets.default = enabled;
presets.wayland = enabled;
hardware.printing = enabled;
hardware.bluetooth = enabled;
#programs.fastfetch = {
# enable = true;
# firstNixOSInstall = 1729112485;
#};
gpg = enabled;
services.syncthing = {
enable = true;
user = "kylekrein";
};
};
programs.direnv = {
enable = true;
nix-direnv.enable = true;
};
networking.networkmanager.enable = true;
services.udisks2.enable = true;
environment.systemPackages = with pkgs;
with pkgs.${namespace}; [
rnote
libreoffice
root-files
gparted
qdirstat
exfatprogs
tealdeer
telegram-desktop
vlc
git-credential-manager
qpwgraph
solaar
pdfarranger
densify
gimp3
krita
inkscape
cameractrls-gtk4
#kde
kdePackages.gwenview
kdePackages.ark
shotwell
deploy-rs
custom.deploy-rs-online
];
programs.kdeconnect.enable = true;
programs.kdeconnect.package = lib.mkDefault pkgs.kdePackages.kdeconnect-kde;
fonts.packages = with pkgs; [
nerd-fonts.jetbrains-mono
font-awesome
nerd-fonts.symbols-only
hack-font
noto-fonts-emoji
# microsoft fonts:
#corefonts
#vistafonts
];
environment.sessionVariables = {
MANPAGER = "emacsclient -c";
EDITOR = "emacsclient -c";
};
hardware = {
logitech.wireless.enable = true;
};
security.polkit.enable = true;
services.flatpak = enabled;
#programs.thunar = {
# enable = true;
# plugins = with pkgs.xfce; [
# thunar-archive-plugin
# thunar-volman
# ];
# };
#programs.xfconf.enable = true; # so thunar can save config
#services.gvfs.enable = true; # Mount, trash, and other functionalities
#services.tumbler.enable = true; # Thumbnail support for images
#greeter
programs.dankMaterialShell.greeter = {
enable = config.${namespace}.windowManagers.niri.enable || config.programs.hyprland.enable;
compositor.name =
if config.${namespace}.windowManagers.niri.enable
then "niri"
else "hyprland";
configHome = let
imp = config.${namespace}.impermanence;
in "${
if imp.enable
then imp.persistentStorage
else ""
}${config.users.users.kylekrein.home}";
};
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
};
};
}

View file

@ -0,0 +1,70 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.programs.dolphin;
in {
options.${namespace}.programs.dolphin = with types; {
enable = mkBoolOpt false "Enable dolphin on non Kde environments";
};
config = mkIf cfg.enable {
environment.systemPackages = with pkgs; [
kdePackages.qtwayland
kdePackages.qtsvg
kdePackages.kio-fuse #to mount remote filesystems via FUSE
kdePackages.kio-extras #extra protocols support (sftp, fish and more)
kdePackages.kio-admin
libheif #https://github.com/NixOS/nixpkgs/issues/164021
libheif.out
#kde
kdePackages.breeze-icons
kdePackages.breeze
kdePackages.kdesdk-thumbnailers
kdePackages.kdegraphics-thumbnailers
kdePackages.kservice
kdePackages.kdbusaddons
kdePackages.kfilemetadata
kdePackages.kconfig
kdePackages.kcoreaddons
kdePackages.kcrash
kdePackages.kguiaddons
kdePackages.ki18n
kdePackages.kitemviews
kdePackages.kwidgetsaddons
kdePackages.kwindowsystem
shared-mime-info
#kde support tools
#libsForQt5.qt5ct
#qt6ct
kdePackages.kimageformats
kdePackages.dolphin
kdePackages.dolphin-plugins
];
xdg = {
menus.enable = true;
mime.enable = true;
};
#https://discourse.nixos.org/t/dolphin-does-not-have-mime-associations/48985/3
# This fixes the unpopulated MIME menus
environment.etc."/xdg/menus/plasma-applications.menu".text = builtins.readFile "${pkgs.kdePackages.plasma-workspace}/etc/xdg/menus/plasma-applications.menu";
environment.etc."/xdg/menus/applications.menu".text = builtins.readFile "${pkgs.kdePackages.plasma-workspace}/etc/xdg/menus/plasma-applications.menu";
#environment.pathsToLink = [
# "share/thumbnailers"
#];
};
}

View file

@ -0,0 +1,37 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
username = "andrej";
admin = false;
extraGroups = ["networkmanager"];
trustedSshKeys = [];
cfg = config.${namespace}.users.${username};
in {
options.${namespace}.users.${username} = with types; {
enable = mkBoolOpt false "Enable ${username} user";
config = mkOpt types.attrs {} "Additional home manager config for ${username}";
};
config = mkUser {
inherit config;
inherit (cfg) enable;
homeConfig = cfg.config;
inherit username;
inherit admin;
inherit extraGroups;
inherit trustedSshKeys;
};
}

View file

@ -19,7 +19,6 @@ with lib.${namespace}; let
trustedSshKeys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFDdxZ5OyGcfD1JwEa4RWw86HWZ2dKFR0syrRckl7EvG kylekrein@kylekrein-homepc"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAWDM28XBxm4PFBNOouNWxqVmDj1ulUGEgHsRYoODCDG anaconda"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINYO1JV6qkQM+EW2WY/RxDFihgSKuFHF1hVtzl+F9ye4 kylekrein@anaconda"
];
cfg = config.${namespace}.users.${username};

View file

@ -0,0 +1,37 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
username = "tania";
admin = false;
extraGroups = ["networkmanager" "touchscreen"];
trustedSshKeys = [];
cfg = config.${namespace}.users.${username};
in {
options.${namespace}.users.${username} = with types; {
enable = mkBoolOpt false "Enable ${username} user";
config = mkOpt types.attrs {} "Additional home manager config for ${username}";
};
config = mkUser {
inherit config;
inherit (cfg) enable;
homeConfig = cfg.config;
inherit username;
inherit admin;
inherit extraGroups;
inherit trustedSshKeys;
};
}

View file

@ -0,0 +1,40 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.${namespace}; let
cfg = config.${namespace}.windowManagers.niri;
in {
options.${namespace}.windowManagers.niri = with types; {
enable = mkBoolOpt false "Enable Niri as your window manager";
};
config = mkIf cfg.enable {
${namespace} = {
programs.dolphin.enable = mkDefault true;
};
security.pam.services.quickshell = {};
programs.niri = {
enable = true;
package = pkgs.niri-unstable;
};
niri-flake.cache.enable = true;
environment.systemPackages = with pkgs; [
wl-clipboard
wayland-utils
libsecret
gamescope
xwayland-satellite-unstable
];
};
}

View file

@ -0,0 +1,148 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.custom; {
facter.reportPath = ./facter.json;
custom = {
programs.dolphin = enabled;
presets.default = enabled;
presets.wayland = enabled;
presets.gaming = enabled;
hardware = {
#nvidia = enabled;
bluetooth = enabled;
printing = enabled;
};
users = {
kylekrein = {
enable = true;
};
andrej = {
enable = true;
};
};
presets.disko = {
ext4Swap = {
enable = true;
device = "/dev/sda";
swapSize = 16;
};
ext4 = {
enable = true;
device = "/dev/sdb";
mountpoint = "/home/andrej/SteamGames";
};
};
};
#greeter
programs.dankMaterialShell.greeter = {
enable = config.${namespace}.windowManagers.niri.enable || config.programs.hyprland.enable;
compositor.name =
if config.${namespace}.windowManagers.niri.enable
then "niri"
else "hyprland";
configHome = let
imp = config.${namespace}.impermanence;
in "${
if imp.enable
then imp.persistentStorage
else ""
}${config.users.users.andrej.home}";
};
services.flatpak = enabled;
security.pam.services.quickshell = {};
services.xserver = {
enable = true;
};
programs.hyprland = {
enable = true;
systemd.setPath = enabled;
};
networking.firewall.allowedTCPPorts = [22 25565];
networking.firewall.allowedUDPPorts = [22 25565];
security.polkit.enable = true;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
};
programs.kdeconnect.enable = true;
programs.kdeconnect.package = lib.mkDefault pkgs.kdePackages.kdeconnect-kde;
programs.nh = {
enable = true;
clean.enable = true;
clean.extraArgs = "--keep-since 4d --keep 3";
flake = "/etc/nixos-config";
};
environment.systemPackages = with pkgs; [
libreoffice
fzf
killall
eza
fd
gparted
exfatprogs
lazygit
fastfetch
telegram-desktop
vlc
wl-clipboard
git
git-credential-manager
egl-wayland
btop
obs-studio
blender
vscodium-fhs
discord
solaar
element-desktop
prismlauncher
mcpelauncher-ui-qt
jdk
teams-for-linux
];
systemd.network.wait-online.enable = lib.mkForce false;
networking.wireless.enable = mkForce false;
networking.networkmanager.enable = true;
services.udisks2.enable = true;
services.zerotierone = {
enable = true;
joinNetworks = [
"a09acf0233dccb4a"
"1d71939404962783"
"41d49af6c260338d"
];
};
# ======================== DO NOT CHANGE THIS ========================
system.stateVersion = "24.11";
# ======================== DO NOT CHANGE THIS ========================
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,75 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}: let
niri-config = {
programs.niri = {
settings = {
#input.power-key-handling.enable = true;
spawn-at-startup = [
{
command = [
"${lib.getExe pkgs.brightnessctl}"
"-s 20%"
];
}
];
};
};
};
in
with lib;
with lib.custom; {
facter.reportPath = ./facter.json;
systemd.network.wait-online.enable = lib.mkForce false; #facter
custom.hardware.hibernation = {
enable = false;
swapFileOffset = 533760;
};
custom.presets.disko.impermanenceBtrfsLuks = {
enable = true;
swapSize = 64;
};
custom.hardware.framework12 = enabled;
custom.hardware.secureBoot = enabled;
custom.hardware.tablet.inputDevice = "/dev/input/by-path/platform-gpio-keys.9.auto-event";
custom.impermanence = enabled;
custom.presets.workstation = enabled;
custom.presets.gaming = enabled;
custom.windowManagers.niri = enabled;
custom.services.ai = {
enable = true;
models = ["qwq" "llama3.1" "qwen2.5-coder:7b"];
ui = disabled;
};
custom.users.kylekrein = {
enable = true;
config = niri-config;
};
environment.systemPackages = with pkgs; [
blender
video-downloader
];
#services.fprintd.enable = true;
#services.fprintd.tod.enable = true;
#services.fprintd.tod.driver = pkgs.libfprint-2-tod1-elan;
services.power-profiles-daemon.enable = true;
services.tlp.enable = false;
#Chat host
networking.firewall.allowedTCPPorts = [80 443 22 8448 9993 8081];
# ======================== DO NOT CHANGE THIS ========================
system.stateVersion = "25.05";
# ======================== DO NOT CHANGE THIS ========================
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,81 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}: let
niri-outputs = {
programs.niri.settings.outputs = {
"DP-1" = {
scale = 1.6;
position.x = 1600;
position.y = 0;
};
"DP-3" = {
scale = 1.6;
position.x = 0;
position.y = 0;
};
};
};
in
with lib;
with lib.${namespace}; {
facter.reportPath = ./facter.json;
systemd.network.wait-online.enable = lib.mkForce false; #facter
custom.hardware.nvidia = enabled;
services.scx.enable = true; # by default uses scx_rustland scheduler
boot.kernelPackages = lib.mkForce pkgs.linuxPackages_cachyos;
system.modulesTree = [pkgs.linux_cachyos.modules];
custom.impermanence = enabled;
custom.presets.workstation = enabled;
custom.presets.gaming = enabled;
custom.presets.disko.impermanenceBtrfs = {
enable = true;
device = "/dev/nvme0n1";
swapSize = 32;
};
custom.windowManagers.niri = enabled;
custom.services.ai = {
enable = true;
models = ["qwq" "llama3.1" "qwen2.5-coder:7b" "gpt-oss:20b" "gpt-oss:120b"];
};
custom.users = {
kylekrein = {
enable = true;
config = niri-outputs;
};
tania = {
inherit (config.custom.users.kylekrein) enable config;
};
};
environment.systemPackages = with pkgs; [
blender
];
services.zerotierone = {
enable = true;
port = 9994;
joinNetworks = [
"A84AC5C10AD269CA"
"db64858fed285e0f"
];
};
#Chat host
networking.firewall.allowedTCPPorts = [80 443 22 8448 9993 8081] ++ [config.services.zerotierone.port];
networking.firewall.allowedUDPPorts = [config.services.zerotierone.port];
# ======================== DO NOT CHANGE THIS ========================
system.stateVersion = "25.05";
# ======================== DO NOT CHANGE THIS ========================
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,155 @@
{
lib,
pkgs,
inputs,
namespace,
system,
target,
format,
virtual,
systems,
config,
...
}:
with lib;
with lib.custom; {
imports = lib.snowfall.fs.get-non-default-nix-files ./.;
custom = {
presets.default = enabled;
users.kylekrein = {
enable = true;
config = {};
};
services.conduwuit = {
enable = true;
#user = "turnserver";
settings = {
global = {
server_name = "kylekrein.com";
well_known = {
server = "matrix.kylekrein.com:443";
client = "https://matrix.kylekrein.com";
};
port = [6167];
trusted_servers = ["matrix.org"];
allow_registration = false;
registration_token = null; #nix shell nixpkgs#openssl -c openssl rand -base64 48 | tr -d '/+' | cut -c1-64
allow_federation = true;
allow_encryption = true;
allow_local_presence = true;
require_auth_for_profile_requests = true;
};
};
extraEnvironment = {
};
};
};
services.caddy = {
enable = true;
#virtualHosts."kylekrein.com:8448".extraConfig = ''
# reverse_proxy http://localhost:6167
#'';
virtualHosts."kylekrein.com".extraConfig = ''
handle_path /.well-known/matrix/* {
header Access-Control-Allow-Origin *
## `Content-Type: application/json` isn't required by the matrix spec
## but some browsers (firefox) and some other tooling might preview json
## content prettier when they are made aware via Content-Type
header Content-Type application/json
respond /client `{ "m.homeserver": { "base_url": "https://matrix.kylekrein.com/" }, "org.matrix.msc3575.proxy": { "url": "https://matrix.kylekrein.com/"}, "org.matrix.msc4143.rtc_foci": [ { "type": "livekit", "livekit_service_url": "https://livekit-jwt.call.matrix.org" } ] }`
respond /server `{ "m.server": "matrix.kylekrein.com:443" }`
## return http/404 if nothing matches
respond 404
}
respond /.well-known/element/element.json `{"call":{"widget_url":"https://call.element.io"}}`
reverse_proxy * http://localhost:6167
'';
# reverse_proxy /.well-known/* http://localhost:6167
#'';
virtualHosts."matrix.kylekrein.com".extraConfig = ''
handle_path /.well-known/matrix/* {
header Access-Control-Allow-Origin *
## `Content-Type: application/json` isn't required by the matrix spec
## but some browsers (firefox) and some other tooling might preview json
## content prettier when they are made aware via Content-Type
header Content-Type application/json
respond /client `{ "m.homeserver": { "base_url": "https://matrix.kylekrein.com/" }, "org.matrix.msc3575.proxy": { "url": "https://matrix.kylekrein.com/"}, "org.matrix.msc4143.rtc_foci": [ { "type": "livekit", "livekit_service_url": "https://livekit-jwt.call.matrix.org" } ] }`
respond /server `{ "m.server": "https://matrix.kylekrein.com" }`
## return http/404 if nothing matches
respond 404
}
respond /.well-known/element/element.json `{"call":{"widget_url":"https://call.element.io"}}`
reverse_proxy * http://localhost:6167
'';
virtualHosts."uptime.kylekrein.com".extraConfig = ''
reverse_proxy * http://localhost:4621
'';
#virtualHosts."gitlab.kylekrein.com".extraConfig = ''
# reverse_proxy * unix//run/gitlab/gitlab-workhorse.socket
#'';
};
services.uptime-kuma = {
enable = true;
settings = {
PORT = "4621";
HOST = "127.0.0.1";
};
appriseSupport = true;
};
#Chat host
networking.firewall.allowedTCPPorts = [80 443 22 8448];
networking.firewall.allowedUDPPorts = [3478 5349];
#sops.secrets."services/conduwuit" = {mode = "0755";};
#sops.secrets."services/gitlab/dbPassword" = {owner = "gitlab";};
#sops.secrets."services/gitlab/rootPassword" = {owner = "gitlab";};
#sops.secrets."services/gitlab/secret" = {owner = "gitlab";};
#sops.secrets."services/gitlab/otpsecret" = {owner = "gitlab";};
#sops.secrets."services/gitlab/dbsecret" = {owner = "gitlab";};
#sops.secrets."services/gitlab/oidcKeyBase" = {owner = "gitlab";};
#sops.secrets."services/gitlab/activeRecordSalt" = {owner = "gitlab";};
#sops.secrets."services/gitlab/activeRecordPrimaryKey" = {owner = "gitlab";};
#sops.secrets."services/gitlab/activeRecordDeterministicKey" = {owner = "gitlab";};
services.gitlab = {
enable = false;
host = "gitlab.kylekrein.com";
https = true;
port = 443;
#statePath = "/persist/gitlab/state";
backup.startAt = "3:00";
databasePasswordFile = config.sops.secrets."services/gitlab/dbPassword".path;
initialRootPasswordFile = config.sops.secrets."services/gitlab/rootPassword".path;
secrets = {
secretFile = config.sops.secrets."services/gitlab/secret".path;
otpFile = config.sops.secrets."services/gitlab/otpsecret".path;
dbFile = config.sops.secrets."services/gitlab/dbsecret".path;
jwsFile = config.sops.secrets."services/gitlab/oidcKeyBase".path; #pkgs.runCommand "oidcKeyBase" {} "${pkgs.openssl}/bin/openssl genrsa 2048 > $out";
activeRecordSaltFile = config.sops.secrets."services/gitlab/activeRecordSalt".path;
activeRecordPrimaryKeyFile = config.sops.secrets."services/gitlab/activeRecordPrimaryKey".path;
activeRecordDeterministicKeyFile = config.sops.secrets."services/gitlab/activeRecordDeterministicKey".path;
};
};
systemd.services.gitlab-backup.environment.BACKUP = "dump";
boot.tmp.cleanOnBoot = true;
boot.loader.grub.enable = true;
boot.loader.grub.device = "/dev/sda";
boot.loader.systemd-boot.enable = mkForce false;
# ======================== DO NOT CHANGE THIS ========================
system.stateVersion = "24.11";
# ======================== DO NOT CHANGE THIS ========================
}

View file

@ -0,0 +1,32 @@
{
config,
lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/profiles/qemu-guest.nix")
];
boot.initrd.availableKernelModules = ["ahci" "xhci_pci" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
boot.initrd.kernelModules = [];
boot.kernelModules = [];
boot.extraModulePackages = [];
fileSystems."/" = {
device = "/dev/disk/by-uuid/4f7e141c-0fc7-415a-815d-944b36f93806";
fsType = "ext4";
};
swapDevices = [];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.eth0.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
}

View file

@ -0,0 +1,48 @@
{lib, ...}: {
# This file was populated at runtime with the networking
# details gathered from the active system.
networking = {
nameservers = [
"8.8.8.8"
];
defaultGateway = "172.31.1.1";
defaultGateway6 = {
address = "";
interface = "eth0";
};
dhcpcd.enable = false;
usePredictableInterfaceNames = lib.mkForce false;
interfaces = {
eth0 = {
ipv4.addresses = [
{
address = "91.99.0.169";
prefixLength = 32;
}
];
ipv6.addresses = [
{
address = "fe80::9400:4ff:fe30:830e";
prefixLength = 64;
}
];
ipv4.routes = [
{
address = "172.31.1.1";
prefixLength = 32;
}
];
ipv6.routes = [
{
address = "";
prefixLength = 128;
}
];
};
};
};
services.udev.extraRules = ''
ATTR{address}=="96:00:04:30:83:0e", NAME="eth0"
'';
}

View file

@ -112,7 +112,6 @@ in {
custom.impermanence = enabled;
environment.systemPackages = with pkgs; [
quickemu
ente-cli
tmux
icloudpd
@ -129,13 +128,6 @@ in {
"rtw89_8852ce"
];
programs.virt-manager.enable = false;
users.groups.libvirtd.members = ["kylekrein"];
virtualisation.libvirtd.enable = true;
custom.users.kylekrein = {
enable = true;
config = {};

View file

@ -73,5 +73,4 @@ in {
};
};
};
fileSystems."/var/lib".neededForBoot = true;
}

View file

@ -16,7 +16,7 @@
virtualisation.oci-containers.backend = "podman";
virtualisation.oci-containers.containers.aliasvault = {
image = "ghcr.io/aliasvault/aliasvault:0.26.6";
image = "ghcr.io/aliasvault/aliasvault:0.25.0";
autoStart = true;
ports = [

View file

@ -4,8 +4,15 @@
config,
...
}: {
systemd.services.navidrome.serviceConfig.ExecStart = with lib; let
cfg = config.services.navidrome;
settingsFormat = pkgs.formats.toml {};
in
mkForce ''
${pkgs.bash}/bin/bash -c "${getExe cfg.package} --configfile '${settingsFormat.generate "navidrome.toml" cfg.settings}'"
'';
services.navidrome = {
enable = false; #doesnt build 24.02.2026
enable = true;
settings = {
Scanner.Schedule = "@every 24h";
MusicFolder = "/zstorage/media/music";

View file

@ -34,7 +34,6 @@ in {
sops.secrets."services/nextcloud/whiteboard" = {owner = "nextcloud";};
services.nextcloud = {
enable = true;
maxUploadSize = "80G";
package = pkgs.nextcloud32;
database.createLocally = true;
config = {

View file

@ -35,9 +35,6 @@ in {
enableACME = true;
forceSSL = true;
locations = config.services.nginx.virtualHosts."matrix.kylekrein.com".locations;
extraConfig = ''
client_max_body_size 1G;
'';
};
"turn.kylekrein.com" = {
@ -74,9 +71,6 @@ in {
enableACME = true;
forceSSL = true;
locations = matrixLocations;
extraConfig = ''
client_max_body_size 1G;
'';
};
"immich.kylekrein.com" = {