Compare commits

...

22 Commits

Author SHA1 Message Date
b4ca7cc870 Removed pip and cmake from python packages, and generalized python to always get newest version
(Packages not needed anymore because of ncli dev and nix-direnv)
2026-06-12 11:15:47 +02:00
2376a12f54 Disabled niri imports 2026-06-12 11:13:45 +02:00
ea0f3eb82c Fixed fprintPam indent misalignment 2026-06-12 11:12:17 +02:00
020bec1aa0 Removed ncli versioning number 2026-06-12 11:10:54 +02:00
64073f18c0 Update PipeWire Bluetooth configuration to better prevent headset mode 2026-06-12 11:10:19 +02:00
9584a00673 fprintd better PAM configuration, better timeout length and hyprlock support 2026-06-12 11:07:49 +02:00
c9f2d4eccf Add MangoWM configuration and scripts for window management on scrolling layout 2026-06-12 10:56:57 +02:00
434f14707c Enabled stylix to configure gtk 2026-06-02 12:48:09 +02:00
f94f6e63b1 Enable qt support in stylix, cleaned up comments and made stylix manage niri colors 2026-06-02 12:24:39 +02:00
ca285c92f7 Add noctalia module and removed waybar and other configurations no longer needed with noctalia 2026-06-02 12:22:05 +02:00
bcf0c17c51 Changed yakuake autostart to only start in KDE Plasma 2026-06-02 12:07:02 +02:00
5b9b48fede Configured git to be able to use lfs 2026-06-02 12:02:35 +02:00
fe2730b673 Added a symlink for cookiez assets flake input to /var/lib/assets 2026-06-02 12:01:54 +02:00
31b70d4221 Disabled specialisations as they arent needed for now 2026-06-02 11:59:45 +02:00
b9c0ab5f85 Fix: Added pinned kernel to flake outputs 2026-06-02 11:58:41 +02:00
09f39d1537 Removed awww as wallpapers will be handeled by noctalia 2026-06-02 11:57:56 +02:00
b696672f11 Pinned linux kernel version so I can rollback to specific versions in the past for things like bluetooth issues 2026-06-02 11:51:58 +02:00
1ed32e29b0 Added automatic nix store optimisation and garbage collection of versions older than 14 days 2026-05-31 20:11:19 +02:00
f04a72f19d Deleted hyprpaper and replaced it with awww. Also deleted self declared niri systemd services, as they arent needed with running commands at startup 2026-05-29 21:51:48 +02:00
3cf1f4f11f Merge pull request 'ncli-refactor' (#3) from ncli-refactor into main
Reviewed-on: #3
2026-05-29 20:49:44 +02:00
dbf7c1cd2e Refactored ncli to rebuild boot first, and then switch to new configuration after. 2026-05-29 11:13:35 +02:00
134fc441a5 - Simplified command cases by removing unnecessary semicolons.
- Improved error handling in rebuild.nix for clarity and consistency.
2026-05-29 09:29:31 +02:00
30 changed files with 1049 additions and 947 deletions

60
flake.lock generated
View File

@ -45,6 +45,28 @@
"type": "github" "type": "github"
} }
}, },
"awww": {
"inputs": {
"flake-compat": "flake-compat_2",
"nixpkgs": [
"nixpkgs"
],
"rust-overlay": "rust-overlay_2"
},
"locked": {
"lastModified": 1779666993,
"narHash": "sha256-W0yA7Y37oj5BBzl4ojO8dtv9MuOvdrIZDxtRjs7kpdg=",
"ref": "refs/heads/main",
"rev": "9b7f47f7f394dce0a17a7b161e0d2fe391ce72b3",
"revCount": 1366,
"type": "git",
"url": "https://codeberg.org/LGFae/awww"
},
"original": {
"type": "git",
"url": "https://codeberg.org/LGFae/awww"
}
},
"base16": { "base16": {
"inputs": { "inputs": {
"fromYaml": "fromYaml" "fromYaml": "fromYaml"
@ -187,6 +209,22 @@
"type": "github" "type": "github"
} }
}, },
"flake-compat_2": {
"flake": false,
"locked": {
"lastModified": 1761588595,
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": { "flake-parts": {
"inputs": { "inputs": {
"nixpkgs-lib": [ "nixpkgs-lib": [
@ -618,6 +656,7 @@
"inputs": { "inputs": {
"aagl": "aagl", "aagl": "aagl",
"alejandra": "alejandra", "alejandra": "alejandra",
"awww": "awww",
"cookiez-assets": "cookiez-assets", "cookiez-assets": "cookiez-assets",
"grub2-themes": "grub2-themes", "grub2-themes": "grub2-themes",
"home-manager": "home-manager", "home-manager": "home-manager",
@ -671,6 +710,27 @@
"type": "github" "type": "github"
} }
}, },
"rust-overlay_2": {
"inputs": {
"nixpkgs": [
"awww",
"nixpkgs"
]
},
"locked": {
"lastModified": 1764038373,
"narHash": "sha256-M6w2wNBRelcavoDAyFL2iO4NeWknD40ASkH1S3C0YGM=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "ab3536fe850211a96673c6ffb2cb88aab8071cc9",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"stylix": { "stylix": {
"inputs": { "inputs": {
"base16": "base16", "base16": "base16",

View File

@ -4,6 +4,9 @@
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
pinned-kernel.url = "github:NixOS/nixpkgs/3b5ec87c520b3f3f890c439da30b9fc3f7e173d3";
#To pin Kernel versin 7.0.10 because others have bluetooth issues
nix-index-database = { nix-index-database = {
url = "github:nix-community/nix-index-database"; url = "github:nix-community/nix-index-database";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
@ -27,13 +30,18 @@
inputs.home-manager.follows = "home-manager"; inputs.home-manager.follows = "home-manager";
}; };
mangowm = {
url = "github:mangowm/mango";
inputs.nixpkgs.follows = "nixpkgs";
};
stylix = { stylix = {
url = "github:nix-community/stylix/master"; #Had to use branch or it would not build corrently url = "github:nix-community/stylix/master"; #Had to use branch or it would not build corrently
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
quickshell = { noctalia = {
url = "github:outfoxxed/quickshell"; url = "github:noctalia-dev/noctalia-shell/v5";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@ -71,9 +79,12 @@
nixpkgs, nixpkgs,
alejandra, alejandra,
pam-fprint-grosshack, pam-fprint-grosshack,
pinned-kernel,
cookiez-assets, cookiez-assets,
home-manager, home-manager,
plasma-manager, plasma-manager,
noctalia,
mangowm,
nixos-hardware, nixos-hardware,
aagl, aagl,
stylix, stylix,

20
mango/default.nix Normal file
View File

@ -0,0 +1,20 @@
{
inputs,
pkgs,
...
}: {
imports = [
inputs.mangowm.nixosModules.mango
../modules/hyprlock
];
environment.systemPackages = with pkgs; [
libnotify #Needed to send notifications myself (Like when reloading the config)
];
home-manager.sharedModules = [
./home.nix
];
programs.mango.enable = true;
}

208
mango/home.nix Normal file
View File

@ -0,0 +1,208 @@
{
pkgs,
inputs,
lib,
...
}: let
# ── External scripts ──
resizeScript = pkgs.writeShellScriptBin "resize.sh" (builtins.readFile ./scripts/resize.sh);
layoutCmdScript = pkgs.writeShellScriptBin "layout-cmd.sh" (builtins.readFile ./scripts/layout-cmd.sh);
# Helper to get the bin path
resizePath = "${resizeScript}/bin/resize.sh";
layoutCmdPath = "${layoutCmdScript}/bin/layout-cmd.sh";
tagBinds = lib.concatLists (
builtins.genList (i: let
n = toString (i + 1);
in [
"SUPER,${n},view,${n}"
"SUPER+CTRL,${n},tag,${n}"
])
9
);
# All key bindings
defaultBinds =
# --- Common/Session ---
[
"SUPER+SHIFT,E,quit"
#"SUPER+CTRL,R,reload_config"
"SUPER+CTRL,R,spawn_shell,mmsg dispatch reload_config && notify-send -u low -t 500 \"MangoWM\" \"Reloaded \""
]
# --- Screenshot ---
++ [
"SUPER+SHIFT,S,spawn,noctalia msg screenshot-region"
]
# --- Launchers ---
++ [
"SUPER,T,spawn,kitty" # Mod+T → terminal
"SUPER,D,spawn,noctalia msg panel-toggle launcher" # Mod+D → launcher
#"SUPER+SHIFT,L,spawn,noctalia msg session lock" # Super+L → lock
"SUPER+SHIFT,L,spawn,hyprlock"
]
# --- Media keys ---
++ [
"NONE,XF86AudioRaiseVolume,spawn,noctalia msg volume-up"
"NONE,XF86AudioLowerVolume,spawn,noctalia msg volume-down"
"NONE,XF86AudioMute,spawn,noctalia msg volume-mute"
"NONE,XF86AudioMicMute,spawn,noctalia msg mic-mute"
"NONE,XF86AudioPlay,spawn,playerctl play-pause"
"NONE,XF86AudioStop,spawn,playerctl stop"
"NONE,XF86AudioPrev,spawn,playerctl previous"
"NONE,XF86AudioNext,spawn,playerctl next"
]
# --- Brightness ---
++ [
"NONE,XF86MonBrightnessUp,spawn,noctalia msg brightness-up"
"NONE,XF86MonBrightnessDown,spawn,noctalia msg brightness-down"
]
# --- Focus (directional) ---
++ [
"SUPER,Left,focusdir,left"
"SUPER,Down,focusdir,down"
"SUPER,Up,focusdir,up"
"SUPER,Right,focusdir,right"
# vim bindings
"SUPER,H,focusdir,left"
"SUPER,J,focusdir,down"
"SUPER,K,focusdir,up"
"SUPER,L,focusdir,right"
]
# --- Move windows (swap with neighbor) ---
++ [
"SUPER+CTRL,Left,exchange_client,left"
"SUPER+CTRL,Down,exchange_client,down"
"SUPER+CTRL,Up,exchange_client,up"
"SUPER+CTRL,Right,exchange_client,right"
# vim bindings
"SUPER+CTRL,H,exchange_client,left"
"SUPER+CTRL,J,exchange_client,down"
"SUPER+CTRL,K,exchange_client,up"
"SUPER+CTRL,L,exchange_client,right"
]
# --- Tags (workspaces) 1-9 ---
++ tagBinds # Generated list of binds for tags 1-9
++ [
"SUPER,U,viewtoleft_have_client"
"SUPER,I,viewtoright_have_client"
"SUPER+SHIFT,U,tagtoleft"
"SUPER+SHIFT,I,tagtoright"
]
# --- Close window ---
++ [
"SUPER,Q,killclient"
]
# --- Layout / sizing ---
++ [
"SUPER+SHIFT,R,switch_layout" # Cycle layouts
"SUPER,F,spawn_shell,${layoutCmdPath} 'S:${resizePath} fullscreen' 'mmsg dispatch togglemaximizescreen'"
"SUPER+SHIFT,F,togglefullscreen"
"SUPER,C,centerwin" # Center floating window
# For Scroller
"SUPER,ssharp,spawn_shell,${layoutCmdPath} 'S:${resizePath} down' 'notify-send \"Title\" \"Down\"'"
#"SUPER,ssharp,spawn_shell,${resizePath} down"
"SUPER,dead_acute,spawn_shell,${layoutCmdPath} 'S:${resizePath} up' 'notify-send \"Title\" \"Up\"'"
#"SUPER,dead_acute,spawn_shell,${resizePath} up"
]
# --- Floating ---
++ [
"SUPER,V,togglefloating"
]
# --- Power off monitors ---
++ [
"SUPER+SHIFT,P,spawn,mmsg dispatch toggle_monitor,eDP-1"
];
# Extra config for settings that don't have structured Nix attrs
extraConf = ''
# Input
xkb_rules_layout=de
numlockon=1
mouse_accel_profile=1
mouse_accel_speed=-0.4
# Appearance / Theming
focuscolor=0xffc87faa
bordercolor=0x505050ff
urgentcolor=0x9b0000ff
borderpx=2
# Blur
blur=1
blur_params_num_passes=2
blur_params_radius=5
blur_params_noise=0.02
blur_params_brightness=1
blur_params_contrast=1
blur_params_saturation=1
# window-rule geometry-corner-radius 12
border_radius=12
# Opacity
focused_opacity=1.0
unfocused_opacity=0.95
# Layout
gappih=10
gappiv=10
gappoh=10
gappov=10
# Master-stack settings (tile layout)
default_mfact=0.5
default_nmaster=1
new_is_master=1
# Scroller
scroller_default_proportion=0.5
scroller_focus_center=0
scroller_default_proportion_single=1.0
# Layout cycling order (Mod+R)
circle_layout=scroller,tile,center_tile,grid
# Monitor
monitorrule=name:^eDP-1$,width:2880,height:1920,refresh:120,x:0,y:0,scale:2
# Autostart
exec-once=noctalia
exec-once=lxpolkit
exec-once = ${pkgs.kdePackages.kwallet-pam}/libexec/pam_kwallet_init
exec-once="rm -rf ''${XDG_RUNTIME_DIR:-/tmp}/mango-resize"
tagrule=id:1,layout_name:scroller
tagrule=id:2,layout_name:scroller
tagrule=id:3,layout_name:scroller
tagrule=id:4,layout_name:scroller
tagrule=id:5,layout_name:scroller
tagrule=id:6,layout_name:scroller
tagrule=id:7,layout_name:scroller
tagrule=id:8,layout_name:scroller
tagrule=id:9,layout_name:scroller
'';
in {
imports = [
inputs.mangowm.hmModules.mango
../modules/noctalia/home.nix
];
wayland.windowManager.mango = {
enable = true;
# Additional autostart (most handled in extraConfig exec-once)
autostart_sh = "";
settings = {
# Key bindings (flat list; keymode for submaps below if needed)
bind = defaultBinds;
};
# Raw config lines for options without structured Nix attrs
extraConfig = extraConf;
};
}

View File

@ -0,0 +1,21 @@
#!/bin/sh
set -eu
tag_json=$(mmsg get all-tags)
symbol=$(printf '%s' "$tag_json" | jq -r '
.all_tags[0].tags[] | select(.is_active == true) | .layout
' | head -1)
arg1="$1"
target_layout="${arg1%%:*}"
for arg in "${@:1:$#-1}"; do
layout="${arg%%:*}"
cmd="${arg#*:}"
if [ "$symbol" = "$layout" ]; then
eval "$cmd"
exit 0
fi
done
eval "${@: -1}"

130
mango/scripts/resize.sh Normal file
View File

@ -0,0 +1,130 @@
#!/bin/sh
set -eu
# 1⃣ Presets
PRESETS=" 0.15 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00"
# Per-window saved-proportion directory
PROPORTION_DIR="${XDG_RUNTIME_DIR:-/tmp}/mango-resize"
# 2⃣ Helper: abort with a clear message if a required binary is missing
need_cmd() {
command -v "$1" >/dev/null 2>&1 || {
printf "❌ Required command '%s' not found in PATH. Install it first.\n" "$1" >&2
exit 127
}
}
need_cmd mmsg
need_cmd jq
need_cmd awk
need_cmd wc
need_cmd sed
# 3⃣ Get the *currently focused* client.
client_json=$(mmsg get focusing-client || true)
# 3a⃣ Extract the window's unique id (used as the per-window state key)
win_id=$(printf '%s' "$client_json" | jq -r '.id // empty' || true)
if [ -z "$win_id" ]; then
printf "⚠️ Could not determine window id aborting.\n" >&2
exit 1
fi
# Per-window state file
PROPORTION_FILE="$PROPORTION_DIR/$win_id"
# 3b⃣ Extract current client width
current=$(printf '%s' "$client_json" | jq -r '.width // empty' || true)
if [ -z "$current" ]; then
printf "⚠️ No focusing client reported using monitor width as current size.\n"
current=$(mmsg get all-monitors | jq -r '
if type == "array" then
(map(select(.active == true))[0].width)
else
(.monitors | map(select(.active == true))[0].width)
end
' || true)
fi
# 4⃣ Get the *usable* workarea width
usable_width=$(mmsg get workarea 2>/dev/null || true)
if [ -n "$usable_width" ]; then
usable_width=$(printf '%s' "$usable_width" | jq -r '.width // empty')
fi
if [ -z "$usable_width" ]; then
usable_width=$(mmsg get all-monitors | jq -r '
if type == "array" then
(map(select(.active == true))[0].width)
else
(.monitors | map(select(.active == true))[0].width)
end
')
fi
# 5⃣ Compute the proportion
approx=$(awk -v cw="$current" -v uw="$usable_width" '
BEGIN {
if (uw <= 0) { print "0.50"; exit }
printf "%.4f\n", cw / uw
}')
# 6⃣ Find the nearest preset index
nearest_index=$(awk -v target="$approx" '
BEGIN {
split("'"$PRESETS"'", a, " ");
best_i = 1;
best_d = 999;
for (i = 1; i <= length(a); i++) {
d = a[i] - target;
if (d < 0) d = -d;
if (d < best_d) {
best_d = d;
best_i = i;
}
}
print best_i;
}')
# 7⃣ Apply the direction argument
case "${1:-}" in
up) new_index=$((nearest_index + 1)) ;;
down) new_index=$((nearest_index - 1)) ;;
fullscreen)
# Check if currently fullscreen (approx >= 0.95 → treat as fullscreen)
is_fullscreen=$(awk -v a="$approx" 'BEGIN { print (a >= 0.95) ? "1" : "0" }')
if [ "$is_fullscreen" = "1" ]; then
# Currently fullscreen → restore this window's saved proportion
if [ -f "$PROPORTION_FILE" ]; then
saved=$(cat "$PROPORTION_FILE")
mmsg dispatch "set_proportion,$saved"
printf "✅ [win %s] Restored proportion to %s (fullscreen toggle off)\n" "$win_id" "$saved"
rm -f "$PROPORTION_FILE"
else
printf "⚠️ [win %s] No saved proportion defaulting to 0.50\n" "$win_id" >&2
mmsg dispatch "set_proportion,0.50"
fi
else
# Not fullscreen → save this window's proportion & go fullscreen
saved=$(printf '%s\n' $PRESETS | sed -n "${nearest_index}p")
mkdir -p "$PROPORTION_DIR"
printf '%s' "$saved" > "$PROPORTION_FILE"
mmsg dispatch "set_proportion,1.00"
printf "✅ [win %s] Saved proportion %s, set to 1.00 (fullscreen toggle on)\n" "$win_id" "$saved"
fi
exit 0
;;
*) printf "❌ Usage: %s [up|down|fullscreen]\n" "$0" >&2; exit 1 ;;
esac
# 8⃣ Clamp
count=$(printf '%s\n' $PRESETS | wc -l)
if [ "$new_index" -lt 1 ]; then new_index=1; fi
if [ "$new_index" -gt "$count" ]; then new_index=$count; fi
# 9⃣ Resolve the new preset value
new_value=$(printf '%s\n' $PRESETS | sed -n "${new_index}p")
# 🔟 Dispatch
mmsg dispatch "set_proportion,$new_value"
printf "✅ Set proportion to %s (preset %s of %s)\n" "$new_value" "$new_index" "$count"

View File

@ -15,7 +15,9 @@
system, system,
pam-fprint-grosshack-pkg, pam-fprint-grosshack-pkg,
... ...
}: { }: let
kernel-pinned = import inputs.pinned-kernel {inherit system;};
in {
#Assign Swap to the PC #Assign Swap to the PC
swapDevices = [ swapDevices = [
{ {
@ -25,7 +27,15 @@
} }
]; ];
nix = { nix = {
settings.nix-path = config.nix.nixPath; gc = {
automatic = true;
dates = "weekly";
options = "--delete-older-than 14d";
};
settings = {
auto-optimise-store = true;
nix-path = config.nix.nixPath;
};
nixPath = ["nixpkgs=${inputs.nixpkgs}"]; nixPath = ["nixpkgs=${inputs.nixpkgs}"];
}; };
@ -46,7 +56,7 @@
# Bootloader. # Bootloader.
boot = { boot = {
kernelPackages = pkgs.linuxPackages_latest; kernelPackages = kernel-pinned.linuxPackages_latest;
kernelParams = ["quiet" "splash"]; kernelParams = ["quiet" "splash"];
initrd = { initrd = {
systemd.enable = true; #For swap to automatically work systemd.enable = true; #For swap to automatically work
@ -134,9 +144,11 @@
# List services that you want to enable: # List services that you want to enable:
services = { services = {
fprintd.enable = true; fprintd = {
fprintd.tod.enable = true; enable = true;
fprintd.tod.driver = pkgs.libfprint-2-tod1-goodix; tod.enable = true;
tod.driver = pkgs.libfprint-2-tod1-goodix;
};
fwupd.enable = true; #Allows BIOS updates fwupd.enable = true; #Allows BIOS updates
@ -165,13 +177,15 @@
pipewire.wireplumber = { pipewire.wireplumber = {
enable = true; enable = true;
extraConfig = { extraConfig = {
"10-bluez-monitor.properties" = { "10-disable-hfp" = {
"bluez5.msbc-support" = false; "monitor.bluez.properties" = {
"bluez5.hfphsp-support" = false; "bluez5.enable-msbc" = false;
"bluez5.hfphsp-backend" = "none"; # Key addition: no backend "bluez5.roles" = ["a2dp_sink" "a2dp_source"];
"bluez5.roles" = ["a2dp_sink"]; "bluez5.enable-hw-volume" = true;
"bluez5.enable-sbc-xq" = true;
}; };
"11-bluetooth-policy" = { };
"11-no-autoswitch" = {
"wireplumber.settings" = { "wireplumber.settings" = {
"bluetooth.autoswitch-to-headset-profile" = false; "bluetooth.autoswitch-to-headset-profile" = false;
}; };
@ -186,10 +200,15 @@
openssh.enable = true; openssh.enable = true;
}; };
systemd.services.fprintd = { systemd = {
tmpfiles.rules = [
"L+ /var/lib/assets - - - - ${inputs.cookiez-assets}"
];
services.fprintd = {
wantedBy = ["multi-user.target"]; wantedBy = ["multi-user.target"];
serviceConfig.Type = "simple"; serviceConfig.Type = "simple";
}; };
};
fonts = { fonts = {
fontDir.enable = true; fontDir.enable = true;
@ -304,7 +323,7 @@
users.users.${username} = { users.users.${username} = {
isNormalUser = true; isNormalUser = true;
description = "Cookiez"; description = "Cookiez";
extraGroups = ["networkmanager" "wheel" "docker" "gamemode"]; extraGroups = ["networkmanager" "wheel" "docker" "gamemode" "dialout" "tty"];
packages = with pkgs; [ packages = with pkgs; [
#User Packages Here #User Packages Here
]; ];
@ -342,28 +361,31 @@
security = { security = {
sudo.wheelNeedsPassword = false; sudo.wheelNeedsPassword = false;
pam.services = { pam.services = let
login.fprintAuth = false; fprintPam = ''
sudo.fprintAuth = false; #Disabled because of security risk: https://nvd.nist.gov/vuln/detail/cve-2024-37408
kscreenlocker.fprintAuth = true;
polkit-1.fprintAuth = false; #Disabled because of security risk: https://nvd.nist.gov/vuln/detail/cve-2024-37408
kde.fprintAuth = false;
hyprlock = {};
sddm = {
fprintAuth = false; # prevent NixOS from adding its own pam_fprintd block
text = lib.mkForce ''
auth sufficient ${pam-fprint-grosshack-pkg}/lib/security/pam_fprintd_grosshack.so auth sufficient ${pam-fprint-grosshack-pkg}/lib/security/pam_fprintd_grosshack.so
auth sufficient pam_unix.so try_first_pass nullok auth sufficient pam_unix.so try_first_pass nullok
auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so timeout=0
account required pam_unix.so account required pam_unix.so
password required pam_deny.so password required pam_deny.so
session required pam_unix.so session required pam_unix.so
session optional ${pkgs.systemd}/lib/security/pam_systemd.so session optional ${pkgs.systemd}/lib/security/pam_systemd.so
''; '';
in {
login.fprintAuth = false;
sudo.fprintAuth = false; #Disabled because of security risk: https://nvd.nist.gov/vuln/detail/cve-2024-37408
kscreenlocker.fprintAuth = true;
polkit-1.fprintAuth = false; #Disabled because of security risk: https://nvd.nist.gov/vuln/detail/cve-2024-37408
kde.fprintAuth = false;
hyprlock = {
text = lib.mkForce fprintPam;
};
sddm = {
fprintAuth = false; # prevent NixOS from adding its own pam_fprintd block
text = lib.mkForce fprintPam;
}; };
}; };
}; };
@ -375,9 +397,8 @@
max-substitution-jobs = 32; max-substitution-jobs = 32;
http-connections = 50; http-connections = 50;
#Both needed for sleepy-launcher to work extra-substituters = ["https://ezkea.cachix.org" "https://noctalia.cachix.org" "https://nix-community.cachix.org"];
extra-substituters = ["https://ezkea.cachix.org" "https://nix-community.cachix.org"]; extra-trusted-public-keys = ["ezkea.cachix.org-1:ioBmUbJTZIKsHmWWXPe1FSFbeVe+afhfgqgTSNd34eI=" "noctalia.cachix.org-1:pCOR47nnMEo5thcxNDtzWpOxNFQsBRglJzxWPp3dkU4=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="];
extra-trusted-public-keys = ["ezkea.cachix.org-1:ioBmUbJTZIKsHmWWXPe1FSFbeVe+afhfgqgTSNd34eI=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="];
}; };
# Allow unfree packages # Allow unfree packages

View File

@ -3,22 +3,23 @@
./configuration.nix ./configuration.nix
#./hardware-configuration.nix #./hardware-configuration.nix
../mango
../plasma ../plasma
../niri #../niri
]; ];
specialisation = { #specialisation = {
"plasma" = { # "plasma" = {
inheritParentConfig = false; # inheritParentConfig = false;
configuration = { # configuration = {
imports = [ # imports = [
../plasma # ../plasma
./configuration.nix # ./configuration.nix
]; # ];
#
environment.etc."nixos-tags".text = "plasma"; # environment.etc."nixos-tags".text = "plasma";
}; # };
}; # };
# "minimal" = { # "minimal" = {
# inheritParentConfig = false; # inheritParentConfig = false;
@ -31,16 +32,16 @@
# }; # };
# }; # };
"niri" = { # "niri" = {
inheritParentConfig = false; # inheritParentConfig = false;
configuration = { # configuration = {
imports = [ # imports = [
../niri # ../niri
./configuration.nix # ./configuration.nix
]; # ];
#
environment.etc."nixos-tags".text = "niri"; # environment.etc."nixos-tags".text = "niri";
}; # };
}; # };
}; #};
} }

View File

@ -74,6 +74,7 @@
git = { git = {
enable = true; enable = true;
lfs.enable = true;
settings = { settings = {
user = { user = {
name = "Cookiez"; name = "Cookiez";

View File

@ -1,26 +0,0 @@
{
pkgs,
inputs,
username,
project,
...
}: {
imports = [
];
services = {
hyprpaper = {
enable = false;
settings = {
wallpaper = [
{
monitor = "eDP-1";
path = "${inputs.cookiez-assets}/wallpapers/pixel-desert.png";
fit_mode = "cover"; # optional, defaults to cover
}
];
};
};
};
}

View File

@ -18,7 +18,8 @@
# --- Help text --- # --- Help text ---
print_help = '' print_help = ''
echo "NixOS CLI Utility -- version 2.1.3" print_help() {
echo "NixOS CLI Utility"
echo "" echo ""
echo "Usage: ncli [command]" echo "Usage: ncli [command]"
echo "" echo ""
@ -45,6 +46,7 @@
echo "" echo ""
echo " help - Show this help message." echo " help - Show this help message."
echo "" echo ""
}
''; '';
in in
pkgs.writeShellScriptBin "ncli" '' pkgs.writeShellScriptBin "ncli" ''
@ -70,6 +72,7 @@ in
${lib.print_success} ${lib.print_success}
${lib.print_error} ${lib.print_error}
${lib.print_info} ${lib.print_info}
${print_help}
# --- Main Logic --- # --- Main Logic ---
if [ "$#" -eq 0 ]; then if [ "$#" -eq 0 ]; then
@ -122,7 +125,7 @@ in
${dev.dev_case} ${dev.dev_case}
;; ;;
help) help)
${print_help} print_help
;; ;;
*) *)
echo "Error: Invalid command '$1'" >&2 echo "Error: Invalid command '$1'" >&2

View File

@ -1,7 +1,5 @@
# ncli/commands/dev.nix — dev init / track / untrack # ncli/commands/dev.nix — dev init / track / untrack
lib: lib: {
{
dev_case = '' dev_case = ''
# Only flake files need assume-unchanged (Nix requires them in the index). # Only flake files need assume-unchanged (Nix requires them in the index).
# .envrc and .direnv are handled via .git/info/exclude instead. # .envrc and .direnv are handled via .git/info/exclude instead.
@ -323,14 +321,14 @@ lib:
if [[ "$GIT_CHOICE" =~ ^[Yy]$ ]]; then if [[ "$GIT_CHOICE" =~ ^[Yy]$ ]]; then
cat > "$TARGET_ABS/flake.lock" << 'FLAKE_LOCK_EOF' cat > "$TARGET_ABS/flake.lock" << 'FLAKE_LOCK_EOF'
{ {
"nodes": { "nodes": {
"root": {} "root": {}
}, },
"root": "root", "root": "root",
"version": 7 "version": 7
} }
FLAKE_LOCK_EOF FLAKE_LOCK_EOF
print_success "flake.lock ready (Nix will populate it on first run if empty)" print_success "flake.lock ready (Nix will populate it on first run if empty)"
git -C "$TARGET_ABS" add --intent-to-add flake.nix flake.lock git -C "$TARGET_ABS" add --intent-to-add flake.nix flake.lock
@ -362,6 +360,5 @@ FLAKE_LOCK_EOF
;; ;;
esac esac
;;
''; '';
} }

View File

@ -1,10 +1,7 @@
# ncli/commands/git.nix — commit, push, pull, status, format # ncli/commands/git.nix — commit, push, pull, status, format
lib: lib: let
let
inherit (lib) project; inherit (lib) project;
in in {
{
commit_case = '' commit_case = ''
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; } cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
if [ "$#" -lt 2 ]; then if [ "$#" -lt 2 ]; then
@ -20,29 +17,24 @@ in
fi fi
git add -A && git commit -m "$commit_msg" git add -A && git commit -m "$commit_msg"
;;
''; '';
push_case = '' push_case = ''
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; } cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
git push origin $(git branch --show-current) git push origin $(git branch --show-current)
;;
''; '';
pull_case = '' pull_case = ''
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; } cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
git pull origin $(git branch --show-current) git pull origin $(git branch --show-current)
;;
''; '';
status_case = '' status_case = ''
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; } cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
git status git status
;;
''; '';
format_case = '' format_case = ''
nix fmt . nix fmt .
;;
''; '';
} }

View File

@ -1,10 +1,7 @@
# ncli/commands/maintenance.nix — cleanup, diag, list-gens, trim, home-backups # ncli/commands/maintenance.nix — cleanup, diag, list-gens, trim, home-backups
lib: lib: let
let
inherit (lib) project; inherit (lib) project;
in in {
{
cleanup_case = '' cleanup_case = ''
echo "Warning! This will remove old generations of your system." echo "Warning! This will remove old generations of your system."
read -p "How many generations to keep (default: all)? " keep_count read -p "How many generations to keep (default: all)? " keep_count
@ -33,7 +30,6 @@ in
echo "Cleaning up old log files..." >> "$LOG_FILE" echo "Cleaning up old log files..." >> "$LOG_FILE"
find "$LOG_DIR" -type f -mtime +3 -name "*.log" -delete >> "$LOG_FILE" 2>&1 find "$LOG_DIR" -type f -mtime +3 -name "*.log" -delete >> "$LOG_FILE" 2>&1
echo "Cleanup process logged to $LOG_FILE" echo "Cleanup process logged to $LOG_FILE"
;;
''; '';
diag_case = '' diag_case = ''
@ -50,7 +46,6 @@ in
echo "" echo ""
} > "$HOME/diag.txt" } > "$HOME/diag.txt"
echo "Diagnostic report saved to $HOME/diag.txt" echo "Diagnostic report saved to $HOME/diag.txt"
;;
''; '';
list_gens_case = '' list_gens_case = ''
@ -59,7 +54,6 @@ in
echo "" echo ""
echo "--- System Generations ---" echo "--- System Generations ---"
nix profile history --profile /nix/var/nix/profiles/system | cat || echo "Could not list system generations." nix profile history --profile /nix/var/nix/profiles/system | cat || echo "Could not list system generations."
;;
''; '';
trim_case = '' trim_case = ''
@ -73,11 +67,9 @@ in
else else
echo "Trim operation cancelled." echo "Trim operation cancelled."
fi fi
;;
''; '';
home_backups_case = '' home_backups_case = ''
ls -a ~ | grep backup ls -a ~ | grep backup
;;
''; '';
} }

View File

@ -1,10 +1,7 @@
# ncli/commands/rebuild.nix — Rebuild + Update logic # ncli/commands/rebuild.nix — Rebuild + Update logic
lib: lib: let
let
inherit (lib) host project handle_backups handle_build_error; inherit (lib) host project handle_backups handle_build_error;
in in rec {
{
# Shared rebuild snippet used by both `rebuild` and `update` # Shared rebuild snippet used by both `rebuild` and `update`
rebuild_logic = '' rebuild_logic = ''
handle_backups handle_backups
@ -21,12 +18,21 @@ in
${rebuild_logic} ${rebuild_logic}
echo -e "Starting NixOS rebuild for current host: ${host} on generation: $YELLOW$geno$NOCOLOR" echo -e "Starting NixOS rebuild for current host: ${host} on generation: $YELLOW$geno$NOCOLOR"
sudo nixos-rebuild switch --flake . ; _rebuild_exit=$? # Step 1: Build the configuration and safely update the bootloader first
set +e
sudo nixos-rebuild boot --flake .
_rebuild_exit=$?
set -e
if [ "$_rebuild_exit" -eq 0 ]; then if [ "$_rebuild_exit" -eq 0 ]; then
echo " Rebuild finished successfully for ${host}" echo " Rebuild and bootloader update finished successfully for ${host}"
# Step 2: Now that boot entries are safe, activate the system live
echo "Activating new configuration..."
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration switch
if [ -n "$current" ]; then if [ -n "$current" ]; then
sudo /run/current-system/specialisation/"$current"/bin/switch-to-configuration test sudo /nix/var/nix/profiles/system/specialisation/"$current"/bin/switch-to-configuration test
else else
echo "No specialization tag found, staying on default system." echo "No specialization tag found, staying on default system."
fi fi
@ -38,7 +44,6 @@ in
echo " Rebuild failed for ${host}" >&2 echo " Rebuild failed for ${host}" >&2
exit 1 exit 1
fi fi
;;
''; '';
update_case = '' update_case = ''
@ -110,12 +115,21 @@ in
echo "Rebuilding system... Staying on current specialization" echo "Rebuilding system... Staying on current specialization"
fi fi
sudo nixos-rebuild switch --flake . ; _rebuild_exit=$? # Step 1: Build the configuration and safely update the bootloader first
set +e
sudo nixos-rebuild boot --flake .
_rebuild_exit=$?
set -e
if [ "$_rebuild_exit" -eq 0 ]; then if [ "$_rebuild_exit" -eq 0 ]; then
echo " Update and rebuild finished successfully for ${host}" echo " Update, rebuild and bootloader update finished successfully for ${host}"
# Step 2: Now that boot entries are safe, activate the system live
echo "Activating new configuration..."
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration switch
if [ -n "$current" ]; then if [ -n "$current" ]; then
sudo /run/current-system/specialisation/"$current"/bin/switch-to-configuration test sudo /nix/var/nix/profiles/system/specialisation/"$current"/bin/switch-to-configuration test
else else
echo "No specialization tag found, staying on default system." echo "No specialization tag found, staying on default system."
fi fi
@ -127,6 +141,5 @@ in
echo " Update and rebuild failed for ${host}" >&2 echo " Update and rebuild failed for ${host}" >&2
exit 1 exit 1
fi fi
;;
''; '';
} }

View File

@ -1,9 +1,5 @@
# ncli/commands/switch.nix — Specialization switching # ncli/commands/switch.nix — Specialization switching
lib: lib: {
{}:
{
switch_case = '' switch_case = ''
current="" current=""
if [ -f /etc/nixos-tags ]; then if [ -f /etc/nixos-tags ]; then
@ -35,6 +31,5 @@ lib:
echo "To switch to a specialization, run: 'ncli switch <tag>'" echo "To switch to a specialization, run: 'ncli switch <tag>'"
fi fi
fi fi
;;
''; '';
} }

View File

@ -1,7 +1,3 @@
# ncli/default.nix — Entry point
# Usage in your flake:
# ncli = import ./ncli { inherit pkgs host project; };
# environment.systemPackages = [ ncli ];
{ {
pkgs, pkgs,
host, host,

View File

@ -13,23 +13,26 @@ in
# --- Backup helper --- # --- Backup helper ---
handle_backups = '' handle_backups = ''
if [ ''${#BACKUP_FILES[@]} -eq 0 ]; then handle_backups() {
echo "No backup files configured to check."
return
fi
echo "Checking for backup files to remove..." echo "Checking for backup files to remove..."
found=0
for file_path in "''${BACKUP_FILES[@]}"; do for file_path in "''${BACKUP_FILES[@]}"; do
full_path="$HOME/$file_path" full_path="$HOME/$file_path"
if [ -f "$full_path" ]; then if [ -f "$full_path" ]; then
echo "Removing stale backup file: $full_path" echo "Removing stale backup file: $full_path"
rm "$full_path" rm "$full_path"
found=1
fi fi
done done
if [ "$found" -eq 0 ]; then
echo "No stale backup files found."
fi
}
''; '';
# --- OOM / build error handler --- # --- OOM / build error handler ---
handle_build_error = '' handle_build_error = ''
handle_build_error() {
local exit_code=$? local exit_code=$?
if [ "$exit_code" -eq 137 ]; then if [ "$exit_code" -eq 137 ]; then
echo "" echo ""
@ -51,26 +54,35 @@ in
echo " journalctl -k --since '5 minutes ago' | grep -i oom" echo " journalctl -k --since '5 minutes ago' | grep -i oom"
echo "" echo ""
fi fi
}
''; '';
# --- Print helpers (used by dev init) --- # --- Print helpers (used by dev init) ---
print_header = '' print_header = ''
print_header() {
echo "" echo ""
echo -e "''${BLUE}==============================================''${NOCOLOR}" echo -e "''${BLUE}==============================================''${NOCOLOR}"
echo -e "''${BLUE} Nix Flake Development Environment Initializer''${NOCOLOR}" echo -e "''${BLUE} Nix Flake Development Environment Initializer''${NOCOLOR}"
echo -e "''${BLUE}==============================================''${NOCOLOR}" echo -e "''${BLUE}==============================================''${NOCOLOR}"
echo "" echo ""
}
''; '';
print_success = '' print_success = ''
print_success() {
echo -e "''${GREEN}[OK]''${NOCOLOR} $1" echo -e "''${GREEN}[OK]''${NOCOLOR} $1"
}
''; '';
print_error = '' print_error = ''
print_error() {
echo -e "''${RED}[ERR]''${NOCOLOR} $1" echo -e "''${RED}[ERR]''${NOCOLOR} $1"
}
''; '';
print_info = '' print_info = ''
print_info() {
echo -e "''${YELLOW}[->]''${NOCOLOR} $1" echo -e "''${YELLOW}[->]''${NOCOLOR} $1"
}
''; '';
} }

View File

@ -1,5 +1,4 @@
{ {
config,
inputs, inputs,
pkgs, pkgs,
... ...
@ -7,11 +6,7 @@
imports = [ imports = [
]; ];
home-manager.sharedModules = [
./home.nix
];
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
hyprpaper inputs.noctalia.packages.${pkgs.stdenv.hostPlatform.system}.default
]; ];
} }

View File

@ -0,0 +1,9 @@
{inputs, ...}: {
imports = [
inputs.noctalia.homeModules.default
];
programs.noctalia = {
enable = true;
};
}

View File

@ -11,9 +11,7 @@
#Essentials (CLI Only) #Essentials (CLI Only)
wget #A tool for quickly downloading things from the Web wget #A tool for quickly downloading things from the Web
#javaPackages.compiler.openjdk25 #Java Development Kit 25 #javaPackages.compiler.openjdk25 #Java Development Kit 25
#python314 #Python python3 #Python
#python314Packages.pip #Pip for Python 3.12
#python314Packages.cmake #The CMake tool to manage project build configurations
fastfetch #A utility to see information about your machine fastfetch #A utility to see information about your machine
btop #A replacement for htop to see your machines resources btop #A replacement for htop to see your machines resources
git #Git ... no need to explain git #Git ... no need to explain

View File

@ -15,9 +15,15 @@
stylix = { stylix = {
enable = true; enable = true;
autoEnable = false; #So I can choose my programs it targets myself! autoEnable = false; #So I can choose my programs it targets myself!
#image = ../../other/wallpaper2.png; #image = "${inputs.cookiez-assets}/wallpapers/beach-forest.png";
#autoEnable = true; #Auto generate theme based on wallpaper #polarity = "dark"; # "dark" or "light"
base16Scheme = "${pkgs.base16-schemes}/share/themes/dracula.yaml"; base16Scheme = "${pkgs.base16-schemes}/share/themes/dracula.yaml";
#override = {
# base05 = "e0e0e0"; # default text — light grey (no # prefix!)
# base04 = "b0b0b0"; # secondary/muted text
# base06 = "f5f5f5"; # lighter text variant
#};
opacity = { opacity = {
desktop = 0.5; desktop = 0.5;
terminal = 0.9; terminal = 0.9;
@ -43,7 +49,8 @@
plymouth.logoAnimated = true; plymouth.logoAnimated = true;
console.enable = true; #Default console without desktop environment! (NOT KITTY!) console.enable = true; #Default console without desktop environment! (NOT KITTY!)
grub.enable = false; grub.enable = false;
#qt.enable = false; qt.enable = true;
gtk.enable = true;
}; };
}; };
} }

View File

@ -5,6 +5,7 @@
... ...
}: { }: {
imports = [ imports = [
#inputs.niri.homeModules.stylix
]; ];
services = { services = {
@ -16,10 +17,9 @@
#firefox = { #firefox = {
# enable = true; # enable = true;
# colorTheme.enable = true; # colorTheme.enable = true;
# profileNames = [ "${username}" ]; # profileNames = ["${username}"];
#}; #};
qt.enable = false; #niri.enable = true;
qt.platform = "kde";
#kde.enable = false; #kde.enable = false;
}; };
}; };

View File

@ -1,153 +0,0 @@
{
"layer": "top",
"position": "top",
"modules-left": [
"custom/launcher",
"hyprland/workspaces",
"cpu",
"memory"
],
"modules-center": [
"hyprland/window"
],
"spacing": 4,
"modules-right": [
"tray",
"wireplumber",
"network",
"backlight",
"clock",
"battery",
"custom/power"
],
"backlight": {
"device": "intel_backlight",
"format": "{percent}% {icon}",
"format-icons": ["", ""]
},
"hyprland/workspaces": {
"format": "{name}",
"persistent-workspaces": {
"1": [],
"2": [],
"3": []
}
},
"hyprland/window": {
"icon": false,
"separate-outputs": true,
"format": "{}"
},
"tray": {
"icon-size": 15,
"spacing": 7
},
"clock": {
"format": "{:%H:%M} ",
"format-alt": "{:%A, %B %d, %Y (%R)}",
"tooltip-format": "<tt><small>{calendar}</small></tt>",
"calendar": {
"mode": "year",
"mode-mon-col": 3,
"weeks-pos": "right",
"on-scroll": 1,
"on-click-right": "mode",
"format": {
"months": "<span color='#f5e0dc'><b>{}</b></span>",
"days": "<span color='#cdd6f4'><b>{}</b></span>",
"weeks": "<span color='#fab387'><b>W{}</b></span>",
"weekdays": "<span color='#f5c2e7'><b>{}</b></span>",
"today": "<span color='#cba6f7'><b><u>{}</u></b></span>"
}
},
"actions": {
"on-click-right": "mode",
"on-click-forward": "tz_up",
"on-click-backward": "tz_down",
"on-scroll-up": "shift_up",
"on-scroll-down": "shift_down"
}
},
"cpu": {
"interval": 1,
"format": "CPU {usage:>2}% {icon0}{icon1}{icon2}{icon3}",
"format-icons": [
"▁",
"▂",
"▃",
"▄",
"▅",
"▆",
"▇",
"█"
],
"on-click": "kitty -e btop"
},
"memory": {
"interval": 30,
"format": "MEM {used:0.1f}G/{total:0.1f}G"
},
"network": {
"format": "󰤭 Disabled",
"format-wifi": " ",
"format-ethernet": " 󰈀 ",
"format-disconnected": "⚠",
"tooltip": true,
"tooltip-format": "{ifname}\n{ipaddr}",
"tooltip-format-wifi": "{essid} {ifname}\n{ipaddr}\nstrength: {signalStrength}%",
"on-click": "networkmanager_dmenu"
},
"custom/launcher": {
"format": " 󰣇 ",
"tooltip": false,
"on-click": "wofi -c ~/.config/wofi/config -I"
},
"custom/power": {
"format": "  ",
"on-click": "~/.config/wofi/scripts/power.sh",
"tooltip": false
},
"wireplumber": {
"scroll-step": 10,
"format": "{volume}% {icon} ",
"format-bluetooth": "{icon} {volume}%",
"format-muted": "muted ",
"on-click": "pavucontrol",
"format-icons": {
"headphones": "",
"handsfree": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": [
"",
"󰓃"
]
}
},
"battery": {
"states": {
"warning": 30,
"critical": 15
},
"format": "{capacity}% {icon}",
"format-charging": "󰂄 {capacity}%",
"format-pluged": "󱟦 {capacity}%",
"format-full": "󰁹 {capacity}%",
"format-icons": [
"󰂎",
"󰁺",
"󰁻",
"󰁼",
"󰁽",
"󰁾",
"󰁿",
"󰂀",
"󰂁",
"󰂂",
"󰁹"
]
}
}

View File

@ -1,4 +0,0 @@
{...}: {
# xdg.configFile."waybar/config.jsonc".source = ./config.jsonc;
# xdg.configFile."waybar/style.css".source = ./style.css;
}

View File

@ -1,167 +0,0 @@
* {
font-family: "JetBrainsMono Nerd Font", sans-serif;
font-size: 13px;
}
window#waybar {
background-color: transparent;
}
window > box {
margin-top: 0px;
margin-left: 10px;
margin-right: 10px;
padding-left: 4px;
padding-right: 4px;
}
#window {
background-color: #202020;
border-radius: 20px;
padding: 8px 12px 8px 8px;
margin: 0px 0;
}
window#waybar.empty #window {
background: rgba(12, 12, 12, 0);
}
.modules-left {
padding: 3px;
}
.modules-right {
padding: 3px;
}
.modules-center {
padding: 3px;
}
#workspaces {
background-color: #202020;
border-radius: 20px;
padding: 4px 4px 4px 6px;
margin: 4px 0;
}
#workspaces button {
min-height: 0;
padding: 0 7px;
margin-right: 2px;
color: #f5e0dc;
}
#workspaces button.urgent {
color: #f5e0dc;
animation-name: blink;
animation-duration: 0.5s;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
}
#workspaces button.empty {
color: #cdd6f4;
}
#workspaces button.visible {
color: #89dceb;
}
#workspaces button.active {
color: #fab387;
}
@keyframes blink {
to {
color: #202020;
background-color: #dcf5f3;
}
}
#custom-launcher {
background-color: #202020;
border-radius: 20px;
padding: 8px 8px 8px 4px;
margin: 4px 0;
color: #89dceb;
}
#custom-power {
background-color: #202020;
border-radius: 20px;
padding: 8px 12px 8px 8px;
margin: 4px 0;
}
#cpu {
background-color: #202020;
border-radius: 20px;
padding: 8px 8px 8px 20px;
margin: 4px 0;
color: #f2cdcd;
}
#memory {
background-color: #202020;
border-radius: 20px;
padding: 8px 8px 8px 20px;
margin: 4px 0;
color: #fab387;
}
#wireplumber {
background-color: #202020;
border-radius: 20px;
padding: 8px 8px 8px 20px;
margin: 4px 0;
color: #f9e2af;
}
#wireplumber.muted {
color: #f38ba8;
}
#clock {
background-color: #202020;
border-radius: 20px;
padding: 8px 10px 10px 10px;
margin: 4px 0;
color: #94e2d5;
}
#network {
background-color: #202020;
color: #cdd6f4;
border-radius: 20px;
padding: 8px;
margin: 4px 0;
}
#network.disabled {
color: #f38ba8;
}
#tray {
background-color: #202020;
border-radius: 20px;
padding: 8px 12px 8px 12px;
margin: 4px 0;
}
#battery {
background-color: #202020;
color: #cdd6f4;
border-radius: 20px;
padding: 8px;
margin: 4px 0;
}
#backlight {
background-color: #202020;
color: #cdd6f4;
border-radius: 20px;
padding: 8px;
margin: 4px 0;
}

View File

@ -1,5 +1,6 @@
{ {
config, config,
inputs,
pkgs, pkgs,
username, username,
project, project,
@ -7,31 +8,8 @@
}: { }: {
#To show logs of services run: #To show logs of services run:
#journalctl --user-unit={service-name} --user #journalctl --user-unit={service-name} --user
systemd.user.services.niri-waybar = {
description = "Waybar status bar for Niri";
# "wantedBy" replaces the [Install] section # The Niri Session Cleanup Service
wantedBy = ["graphical-session.target"];
# "partOf" and "after" replace the [Unit] section dependencies
partOf = ["graphical-session.target"];
after = ["graphical-session.target"];
# [Unit] configuration goes here
unitConfig = {
# This checks the environment variable to ensure we are in Niri
ConditionEnvironment = "XDG_CURRENT_DESKTOP=niri";
};
# [Service] configuration goes here
serviceConfig = {
ExecStart = "${pkgs.waybar}/bin/waybar";
Restart = "on-failure";
RestartSec = "1s";
};
};
# 2. The Niri Session Cleanup Service
# This service starts when the graphical session starts, and when it stops, # This service starts when the graphical session starts, and when it stops,
# it forcibly stops the graphical-session.target to ensure a clean state for the next login. # it forcibly stops the graphical-session.target to ensure a clean state for the next login.
systemd.user.services.niri-session-manager = { systemd.user.services.niri-session-manager = {

View File

@ -2,12 +2,12 @@
config, config,
inputs, inputs,
pkgs, pkgs,
system,
... ...
}: { }: {
imports = [ imports = [
./autostart.nix ./autostart.nix
../modules/hyprlock ../modules/hyprlock
../modules/hyprpaper
../modules/stylix ../modules/stylix
]; ];
@ -16,10 +16,8 @@
]; ];
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
#mako
fuzzel
waybar
xwayland-satellite xwayland-satellite
lxsession #Needed for things like gparted
]; ];
programs = { programs = {
@ -33,7 +31,6 @@
#services.xserver.displayManager.sddm.enable = true; #services.xserver.displayManager.sddm.enable = true;
xdg.portal = { xdg.portal = {
#Needed for waybar
enable = true; enable = true;
extraPortals = [pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-wlr]; extraPortals = [pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-wlr];
config.common.default = "*"; config.common.default = "*";

View File

@ -5,31 +5,13 @@
}: { }: {
imports = [ imports = [
inputs.niri.homeModules.niri inputs.niri.homeModules.niri
../modules/waybar/home.nix ../modules/noctalia/home.nix
]; ];
xdg.configFile."mako/config".text = ''
default-timeout=5000
ignore-timeout=1
'';
programs.niri = { programs.niri = {
package = pkgs.niri; package = pkgs.niri;
enable = true; enable = true;
#xwayland.enable = true;
# config = ''
# binds {
# Super+Return { spawn "kitty"; }
# Super+Space { spawn "fuzzel"; }
# Super+Q { close-window; }
# Super+Left { focus-column-left; }
# Super+Right { focus-column-right; }
# Super+Up { focus-workspace-up; }
# Super+Down { focus-workspace-down; }
# Super+L { spawn "hyprlock"; }
# Super+Shift+E { "quit"; }
# }
# '';
config = '' config = ''
input { input {
keyboard { keyboard {
@ -38,6 +20,10 @@
} }
numlock numlock
} }
mouse {
accel-profile "flat"
accel-speed -0.4
}
} }
prefer-no-csd prefer-no-csd
@ -83,11 +69,8 @@
} }
} }
// spawn-at-startup "waybar" spawn-at-startup "noctalia"
spawn-at-startup "hyprpaper" spawn-at-startup "lxpolkit"
spawn-at-startup "${pkgs.mako}/bin/mako"
// spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell"
hotkey-overlay { hotkey-overlay {
// Uncomment this line to disable the "Important Hotkeys" pop-up at startup. // Uncomment this line to disable the "Important Hotkeys" pop-up at startup.
@ -102,6 +85,11 @@
draw-border-with-background false draw-border-with-background false
} }
// layer-rule {
// match namespace="^awww-daemonbackdrop$"
// place-within-backdrop true
// }
output "eDP-1" { output "eDP-1" {
mode "2880x1920@120.000" mode "2880x1920@120.000"
scale 2 scale 2
@ -111,24 +99,26 @@
binds { binds {
Mod+Shift+Minus { show-hotkey-overlay; } Mod+Shift+Minus { show-hotkey-overlay; }
Mod+Shift+S hotkey-overlay-title="Make a screenshot selection" { spawn-sh "noctalia msg screenshot-region";}
Mod+T hotkey-overlay-title="Open a Terminal: kitty" { spawn "kitty"; } Mod+T hotkey-overlay-title="Open a Terminal: kitty" { spawn "kitty"; }
Mod+D hotkey-overlay-title="Run an Application: fuzzel" { spawn "fuzzel"; } Mod+D hotkey-overlay-title="Run an Application" { spawn-sh "noctalia msg panel-toggle launcher"; }
Super+L hotkey-overlay-title="Lock the Screen: hyprlock" { spawn "hyprlock"; } Super+L hotkey-overlay-title="Lock the Screen" { spawn-sh "noctalia msg session lock"; }
Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; } Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; }
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0"; } XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "noctalia msg volume-up"; }
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; } XF86AudioLowerVolume allow-when-locked=true { spawn-sh "noctalia msg volume-down"; }
XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; } XF86AudioMute allow-when-locked=true { spawn-sh "noctalia msg volume-mute"; }
XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; } XF86AudioMicMute allow-when-locked=true { spawn-sh "noctalia msg mic-mute"; }
XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; } XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; }
XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; } XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; } XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; } XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; } XF86MonBrightnessUp allow-when-locked=true { spawn-sh "noctalia msg brightness-up"; }
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; } XF86MonBrightnessDown allow-when-locked=true { spawn-sh "noctalia msg brightness-down"; }
Mod+O repeat=false { toggle-overview; } Mod+O repeat=false { toggle-overview; }

View File

@ -12,6 +12,11 @@
description = "Automatically start Yakuake"; description = "Automatically start Yakuake";
after = ["graphical-session.target"]; after = ["graphical-session.target"];
wantedBy = ["graphical-session.target"]; wantedBy = ["graphical-session.target"];
unitConfig = {
ConditionEnvironment = "XDG_CURRENT_DESKTOP=KDE";
};
serviceConfig = { serviceConfig = {
ExecStart = ["${pkgs.kdePackages.yakuake}/bin/yakuake"]; ExecStart = ["${pkgs.kdePackages.yakuake}/bin/yakuake"];