noctalia with fingerprint lock screen

This commit is contained in:
Miguel Palhas
2026-02-17 11:28:12 +00:00
parent 0993a23874
commit b6efd4d27b
23 changed files with 849 additions and 478 deletions
+3 -1
View File
@@ -30,7 +30,9 @@
"Bash(darkman get:*)",
"Bash(dconf read:*)",
"Bash(journalctl:*)",
"Bash(hyprctl:*)"
"Bash(hyprctl:*)",
"WebFetch(domain:docs.noctalia.dev)",
"WebFetch(domain:gerg-l.github.io)"
]
},
"sandbox": {
Generated
+66 -92
View File
@@ -68,31 +68,6 @@
"type": "github"
}
},
"elephant": {
"inputs": {
"nixpkgs": [
"walker",
"nixpkgs"
],
"systems": [
"walker",
"systems"
]
},
"locked": {
"lastModified": 1768551400,
"narHash": "sha256-mlHlHW8qLcHm42J1M34HLXLW+Rw8jsLkLdjSvIYlhjw=",
"owner": "abenz1267",
"repo": "elephant",
"rev": "f230c43ae94231c2db754f84a4f31cf76721a28a",
"type": "github"
},
"original": {
"owner": "abenz1267",
"repo": "elephant",
"type": "github"
}
},
"ethui": {
"inputs": {
"nixpkgs": "nixpkgs_2",
@@ -872,11 +847,11 @@
},
"nixpkgs_9": {
"locked": {
"lastModified": 1768564909,
"narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=",
"lastModified": 1770197578,
"narHash": "sha256-AYqlWrX09+HvGs8zM6ebZ1pwUqjkfpnv8mewYwAo+iM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f",
"rev": "00c21e4c93d963c50d4c0c89bfa84ed6e0694df2",
"type": "github"
},
"original": {
@@ -906,6 +881,26 @@
"type": "github"
}
},
"noctalia": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1771269759,
"narHash": "sha256-OcSMUdOxKeCCNV+gOgZWP+BOGedi3QxxGNIbQQQsEFk=",
"owner": "noctalia-dev",
"repo": "noctalia-shell",
"rev": "c33db6b999a884000e33ec2d018ef9de394bf42a",
"type": "github"
},
"original": {
"owner": "noctalia-dev",
"repo": "noctalia-shell",
"type": "github"
}
},
"nvchad-starter": {
"flake": false,
"locked": {
@@ -969,26 +964,6 @@
"type": "github"
}
},
"quickshell": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1770693276,
"narHash": "sha256-ngXnN5YXu+f45+QGYNN/VEBMQmcBCYGRCqwaK8cxY1s=",
"ref": "refs/heads/master",
"rev": "dacfa9de829ac7cb173825f593236bf2c21f637e",
"revCount": 735,
"type": "git",
"url": "https://git.outfoxxed.me/outfoxxed/quickshell"
},
"original": {
"type": "git",
"url": "https://git.outfoxxed.me/outfoxxed/quickshell"
}
},
"root": {
"inputs": {
"claude-code": "claude-code",
@@ -1002,13 +977,13 @@
"nix-colors": "nix-colors",
"nixpkgs": "nixpkgs_6",
"nixvim": "nixvim",
"noctalia": "noctalia",
"nvchad-starter": "nvchad-starter",
"nvchad4nix": "nvchad4nix",
"quickshell": "quickshell",
"rose-pine-hyprcursor": "rose-pine-hyprcursor",
"systems": "systems_9",
"spicetify-nix": "spicetify-nix",
"systems": "systems_10",
"utils": "utils_3",
"walker": "walker",
"zen-browser": "zen-browser"
}
},
@@ -1050,6 +1025,25 @@
"type": "github"
}
},
"spicetify-nix": {
"inputs": {
"nixpkgs": "nixpkgs_9",
"systems": "systems_9"
},
"locked": {
"lastModified": 1771268051,
"narHash": "sha256-nGqPcngnezoT+/xAvw3UDjwdKP2MC4fO315A/Otb9eE=",
"owner": "Gerg-L",
"repo": "spicetify-nix",
"rev": "b930de84c561f62a0c39a6a57c2ab553a97e8495",
"type": "github"
},
"original": {
"owner": "Gerg-L",
"repo": "spicetify-nix",
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
@@ -1066,21 +1060,6 @@
}
},
"systems_10": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_11": {
"locked": {
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
@@ -1095,6 +1074,21 @@
"type": "github"
}
},
"systems_11": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
@@ -1202,16 +1196,16 @@
},
"systems_9": {
"locked": {
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default-linux",
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default-linux",
"repo": "default",
"type": "github"
}
},
@@ -1253,7 +1247,7 @@
},
"utils_3": {
"inputs": {
"systems": "systems_10"
"systems": "systems_11"
},
"locked": {
"lastModified": 1731533236,
@@ -1269,26 +1263,6 @@
"type": "github"
}
},
"walker": {
"inputs": {
"elephant": "elephant",
"nixpkgs": "nixpkgs_9",
"systems": "systems_11"
},
"locked": {
"lastModified": 1771062828,
"narHash": "sha256-y1jBFFO0u+V21y3YldHZozrDwVJVrdC+o3c4M8/rasU=",
"owner": "abenz1267",
"repo": "walker",
"rev": "19b1104585305e0806b842af341630f72038a4b9",
"type": "github"
},
"original": {
"owner": "abenz1267",
"repo": "walker",
"type": "github"
}
},
"xdph": {
"inputs": {
"hyprland-protocols": [
+3 -3
View File
@@ -47,11 +47,11 @@
url = "github:KZDKM/Hyprspace";
inputs.hyprland.follows = "hyprland";
};
quickshell = {
url = "git+https://git.outfoxxed.me/outfoxxed/quickshell";
noctalia = {
url = "github:noctalia-dev/noctalia-shell";
inputs.nixpkgs.follows = "nixpkgs";
};
walker.url = "github:abenz1267/walker";
spicetify-nix.url = "github:Gerg-L/spicetify-nix";
claude-code.url = "github:sadjow/claude-code-nix";
};
+14 -3
View File
@@ -1,9 +1,18 @@
{ ... }:
{ pkgs, inputs, ... }:
{
home.file.".default-npm-packages".text = ''
@anthropic-ai/claude-code
'';
home.packages = with pkgs; [
inputs.claude-code.packages.${pkgs.stdenv.hostPlatform.system}.default
# sandbox
bubblewrap
socat
libseccomp
];
# Commands
home.file.".claude/commands/merge.md".source = ./commands/merge.md;
home.file.".claude/commands/update.md".source = ./commands/update.md;
@@ -19,9 +28,11 @@
# Skills: knowledge
home.file.".claude/skills/git-master/SKILL.md".source = ./skills/git-master/SKILL.md;
home.file.".claude/skills/planning-with-files/SKILL.md".source = ./skills/planning-with-files/SKILL.md;
home.file.".claude/skills/planning-with-files/SKILL.md".source =
./skills/planning-with-files/SKILL.md;
home.file.".claude/skills/react-patterns/SKILL.md".source = ./skills/react-patterns/SKILL.md;
home.file.".claude/skills/vercel-react-best-practices/SKILL.md".source = ./skills/vercel-react-best-practices/SKILL.md;
home.file.".claude/skills/vercel-react-best-practices/SKILL.md".source =
./skills/vercel-react-best-practices/SKILL.md;
# Skills: workflows
home.file.".claude/skills/smart-debug/SKILL.md".source = ./skills/smart-debug/SKILL.md;
+12 -6
View File
@@ -22,11 +22,11 @@
export XCURSOR_THEME="Nordzy-cursors"
# Update Hyprland cursor theme
${pkgs.hyprland}/bin/hyprctl setcursor Nordzy-cursors 42
${pkgs.hyprland}/bin/hyprctl setcursor Nordzy-cursors 24
'';
kitty-theme = ''
# Switch all Kitty instances to dark theme
${pkgs.kitty}/bin/kitten themes --reload-in=all Catppuccin-Mocha
# Reload kitty config to pick up noctalia theme changes
kill -SIGUSR1 $(pidof kitty) 2>/dev/null || true
'';
claude-theme = ''
# Switch Claude Code to dark theme
@@ -35,6 +35,9 @@
${pkgs.jq}/bin/jq '.theme = "dark"' "$CLAUDE_CONFIG" > "$CLAUDE_CONFIG.tmp" && mv "$CLAUDE_CONFIG.tmp" "$CLAUDE_CONFIG"
fi
'';
noctalia-theme = ''
noctalia-shell ipc call darkMode setDark
'';
};
lightModeScripts = {
gtk-theme = ''
@@ -52,11 +55,11 @@
export XCURSOR_THEME="Nordzy-white"
# Update Hyprland cursor theme
${pkgs.hyprland}/bin/hyprctl setcursor Nordzy-white 42
${pkgs.hyprland}/bin/hyprctl setcursor Nordzy-white 24
'';
kitty-theme = ''
# Switch all Kitty instances to light theme
${pkgs.kitty}/bin/kitten themes --reload-in=all Catppuccin-Latte
# Reload kitty config to pick up noctalia theme changes
kill -SIGUSR1 $(pidof kitty) 2>/dev/null || true
'';
claude-theme = ''
# Switch Claude Code to light theme
@@ -65,6 +68,9 @@
${pkgs.jq}/bin/jq '.theme = "light"' "$CLAUDE_CONFIG" > "$CLAUDE_CONFIG.tmp" && mv "$CLAUDE_CONFIG.tmp" "$CLAUDE_CONFIG"
fi
'';
noctalia-theme = ''
noctalia-shell ipc call darkMode setLight
'';
};
};
+27 -3
View File
@@ -1,14 +1,13 @@
{ pkgs, ... }:
{ config, lib, pkgs, ... }:
{
imports = [
./darkman.nix
./spicetify.nix
];
home.packages = with pkgs; [
# various
google-chrome
spotify
spicetify-cli
thunar
obsidian
mpv
@@ -19,6 +18,8 @@
imv
pavucontrol
zathura
libsForQt5.qt5ct
kdePackages.qt6ct
nwg-look
xournalpp
jq
@@ -66,4 +67,27 @@
package = pkgs.numix-cursor-theme;
name = "Numix-Cursor-Light";
};
# zathura: include noctalia-generated theme
xdg.configFile."zathura/zathurarc".text = ''
include noctaliarc
'';
# gtk: include noctalia-generated css (mkForce to override gtk module)
xdg.configFile."gtk-3.0/gtk.css".text = lib.mkForce ''
@import url("noctalia.css");
'';
xdg.configFile."gtk-4.0/gtk.css".text = lib.mkForce ''
@import url("noctalia.css");
'';
# qt: use noctalia color scheme
xdg.configFile."qt5ct/qt5ct.conf".text = ''
[Appearance]
color_scheme_path=${config.home.homeDirectory}/.config/qt5ct/colors/noctalia.conf
'';
xdg.configFile."qt6ct/qt6ct.conf".text = ''
[Appearance]
color_scheme_path=${config.home.homeDirectory}/.config/qt6ct/colors/noctalia.conf
'';
}
@@ -0,0 +1,17 @@
{ inputs, pkgs, ... }:
let
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.hostPlatform.system};
in
{
imports = [ inputs.spicetify-nix.homeManagerModules.default ];
programs.spicetify = {
enable = true;
enabledExtensions = with spicePkgs.extensions; [
adblock
hidePodcasts
shuffle
];
theme = spicePkgs.themes.bloom;
};
}
-16
View File
@@ -39,29 +39,13 @@
lsof
ktlint
croc
inputs.claude-code.packages.${pkgs.stdenv.hostPlatform.system}.default
opencode
# typst
typst
typstyle
renderdoc
mkcert
nss.tools
# claude sandbox
bubblewrap
socat
libseccomp
];
programs.tmux = {
enable = true;
extraConfig = ''
setw -g mouse on
set -s extended-keys on
'';
};
}
+2 -2
View File
@@ -9,9 +9,9 @@ in
home.sessionVariables = {
HYPRCURSOR_THEME = "Nordzy-cursors"; # Dark variant (default)
HYPRCURSOR_SIZE = 32;
HYPRCURSOR_SIZE = 24;
XCURSOR_THEME = "Nordzy-cursors";
XCURSOR_SIZE = 32;
XCURSOR_SIZE = 24;
};
dconf = {
+15 -17
View File
@@ -10,10 +10,9 @@ in
{
imports = [
./rofi.nix
./walker.nix
./cursor.nix
./waybar.nix
./quickshell.nix
./noctalia
./wallpapers.nix
];
@@ -23,8 +22,8 @@ in
hyprshot
playerctl
hyprsunset
hyprlock
xdg-desktop-portal-termfilechooser
libnotify
];
home.sessionVariables = {
@@ -123,7 +122,7 @@ in
env = [
"GDK_SCALE, 2.0"
"XCURSOR_SIZE, 32"
"XCURSOR_SIZE, 24"
"HYPRCURSOR_THEME, rose-pine-hyprcursor"
"HYPRCURSOR_SIZE, 24"
];
@@ -131,9 +130,14 @@ in
"exec-once" = [
"dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
"nm-applet"
"hyprpaper"
"hyprsunset"
"nerd-dictation begin --simulate-input-tool WTYPE --suspend-on-start && touch ~/.cache/nerd-dictation-suspended"
"noctalia-shell"
];
layerrule = [
"blur 1, match:namespace noctalia-background-.*"
"ignore_alpha 0.5, match:namespace noctalia-background-.*"
];
workspace = [
# no gaps when only window
@@ -184,6 +188,7 @@ in
"$mod" = "SUPER";
bind = [
"$mod, n, exec, noctalia-shell ipc call controlCenter toggle"
"$mod, g, hyprexpo:expo, toggle"
# "$mod, tab, overview:toggle,"
"$mod, b, exec, pkill waybar || waybar"
@@ -193,8 +198,8 @@ in
"$mod, f, fullscreen, 0"
"$mod SHIFT, f, fullscreen, 1"
# walker app launcher
"$mod, space, exec, walker"
# app launcher
"$mod, space, exec, noctalia-shell ipc call launcher toggle"
# rofi (old)
# "$mod, space, exec, launcher_t2"
@@ -267,13 +272,7 @@ in
};
};
services.hyprpaper = {
enable = true;
settings = {
ipc = "on";
splash = false;
};
};
services.hyprpaper.enable = false;
services.hypridle = {
enable = true;
@@ -281,12 +280,12 @@ in
general = {
after_sleep_cmd = "hyprctl dispatch dpms on";
ignore_dbus_inhibit = false;
lock_cmd = "hyprlock";
lock_cmd = "noctalia-shell ipc call lockScreen lock";
};
listener = [
{
timeout = 900;
on-timeout = "hyprlock";
on-timeout = "noctalia-shell ipc call lockScreen lock";
}
{
timeout = 1200;
@@ -294,7 +293,6 @@ in
on-resume = "hyprctl dispatch dpms on";
}
];
};
};
}
@@ -0,0 +1,35 @@
{
config,
lib,
inputs,
pkgs,
...
}:
let
avatar = pkgs.fetchurl {
url = "https://github.com/naps62.png";
sha256 = "1ck11xg4rwcvn8dcc06ax7i9yfzy21v1n6h5mcjrkrici5sznlsv";
};
in
{
imports = [ inputs.noctalia.homeModules.default ];
programs.noctalia-shell = {
enable = true;
};
home.file.".face".source = avatar;
# symlink directly to the repo file so we can edit it through the GUI
xdg.configFile."noctalia/settings.json".source =
config.lib.file.mkOutOfStoreSymlink "/home/naps62/projects/nixos-config/home/common/programs/hyprland/noctalia/settings.json";
# force overwrite files that noctalia may have turned into regular files
xdg.configFile."hypr/hyprland.conf".force = true;
xdg.configFile."gtk-3.0/gtk.css".force = true;
# source noctalia-generated color theme in hyprland
wayland.windowManager.hyprland.settings.source = [
"~/.config/hypr/noctalia/noctalia-colors.conf"
];
}
@@ -0,0 +1,631 @@
{
"appLauncher": {
"autoPasteClipboard": false,
"clipboardWatchImageCommand": "wl-paste --type image --watch cliphist store",
"clipboardWatchTextCommand": "wl-paste --type text --watch cliphist store",
"clipboardWrapText": true,
"customLaunchPrefix": "",
"customLaunchPrefixEnabled": false,
"density": "default",
"enableClipPreview": true,
"enableClipboardHistory": true,
"enableSessionSearch": true,
"enableSettingsSearch": true,
"enableWindowsSearch": true,
"iconMode": "tabler",
"ignoreMouseInput": false,
"overviewLayer": true,
"pinnedApps": [
],
"position": "center",
"screenshotAnnotationTool": "",
"showCategories": true,
"showIconBackground": false,
"sortByMostUsed": true,
"terminalCommand": "kitty -e",
"useApp2Unit": false,
"viewMode": "list"
},
"audio": {
"cavaFrameRate": 30,
"mprisBlacklist": [
],
"preferredPlayer": "spotify",
"visualizerType": "linear",
"volumeFeedback": false,
"volumeOverdrive": false,
"volumeStep": 5
},
"bar": {
"autoHideDelay": 500,
"autoShowDelay": 150,
"backgroundOpacity": 0.93,
"barType": "simple",
"capsuleColorKey": "none",
"capsuleOpacity": 1,
"density": "comfortable",
"displayMode": "auto_hide",
"floating": false,
"frameRadius": 12,
"frameThickness": 8,
"hideOnOverview": false,
"marginHorizontal": 4,
"marginVertical": 4,
"monitors": [
],
"outerCorners": true,
"position": "top",
"screenOverrides": [
],
"showCapsule": true,
"showOutline": false,
"useSeparateOpacity": false,
"widgets": {
"center": [
{
"colorizeIcons": false,
"hideMode": "hidden",
"id": "ActiveWindow",
"maxWidth": 145,
"scrollingMode": "hover",
"showIcon": true,
"textColor": "none",
"useFixedWidth": false
},
{
"colorName": "primary",
"hideWhenIdle": true,
"id": "AudioVisualizer",
"width": 200
}
],
"left": [
{
"characterCount": 2,
"colorizeIcons": false,
"emptyColor": "secondary",
"enableScrollWheel": true,
"focusedColor": "primary",
"followFocusedScreen": false,
"groupedBorderOpacity": 1,
"hideUnoccupied": true,
"iconScale": 0.8,
"id": "Workspace",
"labelMode": "name",
"occupiedColor": "secondary",
"pillSize": 0.75,
"showApplications": false,
"showBadge": true,
"showLabelsOnlyWhenOccupied": true,
"unfocusedIconsOpacity": 1
}
],
"right": [
{
"blacklist": [
],
"chevronColor": "none",
"colorizeIcons": true,
"drawerEnabled": false,
"hidePassive": true,
"id": "Tray",
"pinned": [
]
},
{
"displayMode": "alwaysShow",
"iconColor": "none",
"id": "Network",
"textColor": "none"
},
{
"displayMode": "alwaysShow",
"iconColor": "none",
"id": "Bluetooth",
"textColor": "none"
},
{
"deviceNativePath": "__default__",
"displayMode": "graphic-clean",
"hideIfIdle": false,
"hideIfNotDetected": true,
"id": "Battery",
"showNoctaliaPerformance": false,
"showPowerProfiles": false
},
{
"displayMode": "onhover",
"iconColor": "none",
"id": "Volume",
"middleClickCommand": "pwvucontrol || pavucontrol",
"textColor": "none"
},
{
"displayMode": "onhover",
"iconColor": "none",
"id": "Brightness",
"textColor": "none"
},
{
"deviceNativePath": "__default__",
"displayMode": "graphic-clean",
"hideIfIdle": false,
"hideIfNotDetected": true,
"id": "Battery",
"showNoctaliaPerformance": false,
"showPowerProfiles": false
},
{
"clockColor": "none",
"customFont": "",
"formatHorizontal": "HH:mm ddd, MMM dd",
"formatVertical": "HH mm - dd MM",
"id": "Clock",
"tooltipFormat": "HH:mm ddd, MMM dd",
"useCustomFont": false
},
{
"colorizeDistroLogo": false,
"colorizeSystemIcon": "none",
"customIconPath": "",
"enableColorization": true,
"icon": "noctalia",
"id": "ControlCenter",
"useDistroLogo": true
}
]
}
},
"brightness": {
"brightnessStep": 5,
"enableDdcSupport": false,
"enforceMinimum": true
},
"calendar": {
"cards": [
{
"enabled": true,
"id": "calendar-header-card"
},
{
"enabled": true,
"id": "calendar-month-card"
},
{
"enabled": true,
"id": "weather-card"
}
]
},
"colorSchemes": {
"darkMode": false,
"generationMethod": "tonal-spot",
"manualSunrise": "06:30",
"manualSunset": "18:30",
"monitorForColors": "",
"predefinedScheme": "Nord",
"schedulingMode": "off",
"useWallpaperColors": false
},
"controlCenter": {
"cards": [
{
"enabled": true,
"id": "profile-card"
},
{
"enabled": true,
"id": "shortcuts-card"
},
{
"enabled": true,
"id": "audio-card"
},
{
"enabled": false,
"id": "brightness-card"
},
{
"enabled": true,
"id": "weather-card"
},
{
"enabled": true,
"id": "media-sysmon-card"
}
],
"diskPath": "/",
"position": "close_to_bar_button",
"shortcuts": {
"left": [
{
"id": "Network"
},
{
"id": "Bluetooth"
},
{
"id": "WallpaperSelector"
},
{
"id": "NoctaliaPerformance"
}
],
"right": [
{
"id": "Notifications"
},
{
"id": "PowerProfile"
},
{
"id": "KeepAwake"
},
{
"id": "NightLight"
}
]
}
},
"desktopWidgets": {
"enabled": false,
"gridSnap": false,
"monitorWidgets": [
]
},
"dock": {
"animationSpeed": 1,
"backgroundOpacity": 1,
"colorizeIcons": false,
"deadOpacity": 0.6,
"displayMode": "auto_hide",
"dockType": "floating",
"enabled": false,
"floatingRatio": 0,
"inactiveIndicators": true,
"monitors": [
],
"onlySameOutput": true,
"pinnedApps": [
],
"pinnedStatic": false,
"position": "bottom",
"showFrameIndicator": true,
"sitOnFrame": false,
"size": 1.5
},
"general": {
"allowPanelsOnScreenWithoutBar": true,
"allowPasswordWithFprintd": true,
"animationDisabled": false,
"animationSpeed": 1,
"autoStartAuth": true,
"avatarImage": "/home/naps62/.face",
"boxRadiusRatio": 1,
"clockFormat": "hh\\nmm",
"clockStyle": "custom",
"compactLockScreen": false,
"dimmerOpacity": 0.4,
"enableLockScreenCountdown": true,
"enableShadows": true,
"forceBlackScreenCorners": false,
"iRadiusRatio": 1,
"keybinds": {
"keyDown": [
"Down"
],
"keyEnter": [
"Return"
],
"keyEscape": [
"Esc"
],
"keyLeft": [
"Left"
],
"keyRemove": [
"Del"
],
"keyRight": [
"Right"
],
"keyUp": [
"Up"
]
},
"language": "",
"lockOnSuspend": true,
"lockScreenAnimations": true,
"lockScreenBlur": 0,
"lockScreenCountdownDuration": 10000,
"lockScreenMonitors": [
],
"lockScreenTint": 0,
"radiusRatio": 1,
"reverseScroll": false,
"scaleRatio": 1,
"screenRadiusRatio": 1,
"shadowDirection": "bottom_right",
"shadowOffsetX": 2,
"shadowOffsetY": 3,
"showChangelogOnStartup": false,
"showHibernateOnLockScreen": true,
"showScreenCorners": false,
"showSessionButtonsOnLockScreen": true,
"telemetryEnabled": false
},
"hooks": {
"darkModeChange": "",
"enabled": false,
"performanceModeDisabled": "",
"performanceModeEnabled": "",
"screenLock": "",
"screenUnlock": "",
"session": "",
"startup": "",
"wallpaperChange": ""
},
"location": {
"analogClockInCalendar": true,
"firstDayOfWeek": -1,
"hideWeatherCityName": false,
"hideWeatherTimezone": false,
"name": "Braga, Portugal",
"showCalendarEvents": true,
"showCalendarWeather": true,
"showWeekNumberInCalendar": false,
"use12hourFormat": false,
"useFahrenheit": false,
"weatherEnabled": true,
"weatherShowEffects": true
},
"network": {
"airplaneModeEnabled": false,
"bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false,
"bluetoothRssiPollIntervalMs": 60000,
"bluetoothRssiPollingEnabled": false,
"disableDiscoverability": false,
"wifiDetailsViewMode": "grid",
"wifiEnabled": true
},
"nightLight": {
"autoSchedule": true,
"dayTemp": "6500",
"enabled": true,
"forced": false,
"manualSunrise": "06:30",
"manualSunset": "18:30",
"nightTemp": "4000"
},
"notifications": {
"backgroundOpacity": 1,
"clearDismissed": true,
"criticalUrgencyDuration": 15,
"density": "compact",
"enableBatteryToast": true,
"enableKeyboardLayoutToast": true,
"enableMarkdown": true,
"enableMediaToast": true,
"enabled": true,
"location": "top_right",
"lowUrgencyDuration": 3,
"monitors": [
],
"normalUrgencyDuration": 8,
"overlayLayer": true,
"respectExpireTimeout": false,
"saveToHistory": {
"critical": true,
"low": true,
"normal": true
},
"sounds": {
"criticalSoundFile": "",
"enabled": false,
"excludedApps": "discord,firefox,chrome,chromium,edge",
"lowSoundFile": "",
"normalSoundFile": "",
"separateSounds": false,
"volume": 0.5
}
},
"osd": {
"autoHideMs": 2000,
"backgroundOpacity": 1,
"enabled": true,
"enabledTypes": [
0,
1,
2,
3
],
"location": "top",
"monitors": [
],
"overlayLayer": true
},
"plugins": {
"autoUpdate": false
},
"sessionMenu": {
"countdownDuration": 10000,
"enableCountdown": true,
"largeButtonsLayout": "single-row",
"largeButtonsStyle": true,
"position": "center",
"powerOptions": [
{
"action": "lock",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "1"
},
{
"action": "suspend",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "2"
},
{
"action": "hibernate",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "3"
},
{
"action": "reboot",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "4"
},
{
"action": "logout",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "5"
},
{
"action": "shutdown",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": "6"
},
{
"action": "rebootToUefi",
"command": "",
"countdownEnabled": true,
"enabled": true,
"keybind": ""
}
],
"showHeader": true,
"showKeybinds": true
},
"settingsVersion": 53,
"systemMonitor": {
"batteryCriticalThreshold": 5,
"batteryWarningThreshold": 20,
"cpuCriticalThreshold": 90,
"cpuWarningThreshold": 80,
"criticalColor": "",
"diskAvailCriticalThreshold": 10,
"diskAvailWarningThreshold": 20,
"diskCriticalThreshold": 90,
"diskWarningThreshold": 80,
"enableDgpuMonitoring": false,
"externalMonitor": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor",
"gpuCriticalThreshold": 90,
"gpuWarningThreshold": 80,
"memCriticalThreshold": 90,
"memWarningThreshold": 80,
"swapCriticalThreshold": 90,
"swapWarningThreshold": 80,
"tempCriticalThreshold": 90,
"tempWarningThreshold": 80,
"useCustomColors": false,
"warningColor": ""
},
"templates": {
"activeTemplates": [
{
"enabled": true,
"id": "zenBrowser"
},
{
"enabled": true,
"id": "hyprland"
},
{
"enabled": true,
"id": "kitty"
},
{
"enabled": true,
"id": "yazi"
},
{
"enabled": true,
"id": "zathura"
},
{
"enabled": true,
"id": "gtk"
},
{
"enabled": true,
"id": "qt"
},
{
"enabled": true,
"id": "btop"
},
{
"enabled": true,
"id": "spicetify"
}
],
"enableUserTheming": false
},
"ui": {
"bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false,
"boxBorderEnabled": false,
"fontDefault": "Sans Serif",
"fontDefaultScale": 1,
"fontFixed": "monospace",
"fontFixedScale": 1,
"networkPanelView": "wifi",
"panelBackgroundOpacity": 0.93,
"panelsAttachedToBar": true,
"settingsPanelMode": "attached",
"tooltipsEnabled": true,
"wifiDetailsViewMode": "grid"
},
"wallpaper": {
"automationEnabled": true,
"directory": "/home/naps62/.cache/wallpapers/3840x2160",
"enableMultiMonitorDirectories": false,
"enabled": true,
"favorites": [
],
"fillColor": "#5e81ac",
"fillMode": "crop",
"hideWallpaperFilenames": false,
"monitorDirectories": [
],
"overviewBlur": 0.4,
"overviewEnabled": false,
"overviewTint": 0.6,
"panelPosition": "follow_bar",
"randomIntervalSec": 21600,
"setWallpaperOnAllMonitors": true,
"showHiddenFiles": false,
"skipStartupTransition": false,
"solidColor": "#1a1a2e",
"sortOrder": "name",
"transitionDuration": 1500,
"transitionEdgeSmoothness": 0.05,
"transitionType": "fade",
"useSolidColor": false,
"useWallhaven": false,
"viewMode": "browse",
"wallhavenApiKey": "",
"wallhavenCategories": "111",
"wallhavenOrder": "desc",
"wallhavenPurity": "100",
"wallhavenQuery": "",
"wallhavenRatios": "",
"wallhavenResolutionHeight": "",
"wallhavenResolutionMode": "atleast",
"wallhavenResolutionWidth": "",
"wallhavenSorting": "relevance",
"wallpaperChangeMode": "random"
}
}
@@ -1,11 +0,0 @@
{ inputs, pkgs, ... }:
{
home.packages = [
inputs.quickshell.packages.${pkgs.stdenv.hostPlatform.system}.default
];
xdg.configFile."quickshell" = {
source = ./quickshell;
recursive = true;
};
}
@@ -1,94 +0,0 @@
import Quickshell
import Quickshell.Hyprland
import QtQuick
import QtQuick.Layouts
Scope {
id: root
property bool barVisible: false
Variants {
model: Quickshell.screens
Scope {
id: perScreen
required property var modelData
// invisible trigger zone at the top edge
PanelWindow {
id: trigger
screen: perScreen.modelData
visible: !root.barVisible
anchors {
top: true
left: true
right: true
}
exclusionMode: ExclusionMode.Ignore
implicitHeight: 4
color: "transparent"
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: root.barVisible = true
}
}
// the actual bar
PanelWindow {
id: bar
screen: perScreen.modelData
visible: root.barVisible
anchors {
top: true
left: true
right: true
}
exclusionMode: ExclusionMode.Ignore
implicitHeight: 32
color: "#e611111b"
MouseArea {
anchors.fill: parent
hoverEnabled: true
propagateComposedEvents: true
// keep bar visible while mouse is on it
onExited: hideTimer.restart()
}
RowLayout {
anchors.fill: parent
anchors.leftMargin: 12
anchors.rightMargin: 12
spacing: 0
Workspaces {
Layout.alignment: Qt.AlignLeft
}
Item { Layout.fillWidth: true }
SysTray {
Layout.alignment: Qt.AlignRight
Layout.rightMargin: 16
}
ClockWidget {
Layout.alignment: Qt.AlignRight
}
}
}
Timer {
id: hideTimer
interval: 500
onTriggered: root.barVisible = false
}
}
}
}
@@ -1,20 +0,0 @@
import QtQuick
import QtQuick.Layouts
RowLayout {
spacing: 12
Text {
text: Time.date
font.family: "FiraCode Nerd Font"
font.pixelSize: 13
color: "#6c7086"
}
Text {
text: Time.clock
font.family: "FiraCode Nerd Font"
font.pixelSize: 14
color: "#bac2de"
}
}
@@ -1,47 +0,0 @@
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Quickshell
import Quickshell.Services.SystemTray
RowLayout {
spacing: 6
Repeater {
model: SystemTray.items
Image {
required property SystemTrayItem modelData
Layout.preferredWidth: 18
Layout.preferredHeight: 18
source: modelData.icon
fillMode: Image.PreserveAspectFit
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: (mouse) => {
if (mouse.button === Qt.RightButton || modelData.onlyMenu) {
modelData.display(bar, parent.x, bar.height)
} else {
modelData.activate()
}
}
}
ToolTip {
id: tooltip
visible: hoverArea.containsMouse
text: modelData.tooltipTitle || modelData.title || ""
}
MouseArea {
id: hoverArea
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.NoButton
}
}
}
}
@@ -1,15 +0,0 @@
pragma Singleton
import Quickshell
import QtQuick
Singleton {
id: root
readonly property string clock: Qt.formatDateTime(sysClock.date, "hh:mm")
readonly property string date: Qt.formatDateTime(sysClock.date, "ddd MMM d")
SystemClock {
id: sysClock
precision: SystemClock.Minutes
}
}
@@ -1,41 +0,0 @@
import QtQuick
import QtQuick.Layouts
import Quickshell.Hyprland
RowLayout {
spacing: 4
Repeater {
model: [1, 2, 3, 4, 5, 6]
Rectangle {
required property int modelData
property bool active: Hyprland.focusedMonitor?.activeWorkspace?.id === modelData
property bool occupied: {
for (let i = 0; i < Hyprland.workspaces.values.length; i++) {
let ws = Hyprland.workspaces.values[i];
if (ws.id === modelData && ws.windows > 0) return true;
}
return false;
}
Layout.preferredWidth: 24
Layout.preferredHeight: 24
radius: 4
color: active ? "#b4befe" : "transparent"
Text {
anchors.centerIn: parent
text: modelData
font.family: "FiraCode Nerd Font"
font.pixelSize: 13
color: active ? "#11111b" : occupied ? "#bac2de" : "#6c7086"
}
MouseArea {
anchors.fill: parent
onClicked: Hyprland.dispatch("workspace " + modelData)
}
}
}
}
@@ -1,5 +0,0 @@
import Quickshell
Scope {
Bar {}
}
-13
View File
@@ -1,13 +0,0 @@
{ inputs, pkgs, ... }:
{
imports = [ inputs.walker.homeManagerModules.default ];
programs.walker = {
enable = true;
runAsService = true;
# Using default theme - clean dark theme with good defaults
# You can customize later by copying from:
# https://github.com/abenz1267/walker/tree/master/resources/themes/default
};
}
+21 -86
View File
@@ -64,29 +64,22 @@ let
"https://images.hdqwalls.com/download/starfield-i-mac-ie-2160x3840.jpg"
];
# Create wallpaper rotation script
rotateScript = pkgs.writeShellScript "hyprpaper-rotate" ''
# Wallpaper fetch script - downloads wallpapers to cache
fetchScript = pkgs.writeShellScript "wallpaper-fetch" ''
set -euo pipefail
# Check if hyprpaper is running
if ! pgrep -x hyprpaper > /dev/null; then
echo "Error: hyprpaper is not running"
echo "Start it with: hyprpaper &"
exit 1
fi
HORIZONTAL_DIR="$HOME/.cache/wallpapers/3840x2160"
VERTICAL_DIR="$HOME/.cache/wallpapers/2160x3840"
mkdir -p "$HORIZONTAL_DIR" "$VERTICAL_DIR"
CACHE_DIR="$HOME/.cache/wallpapers"
mkdir -p "$CACHE_DIR"
# Arrays of wallpaper URLs
HORIZONTAL=(${builtins.concatStringsSep " " (map (url: ''"${url}"'') horizontal)})
VERTICAL=(${builtins.concatStringsSep " " (map (url: ''"${url}"'') vertical)})
# Function to download wallpaper if not cached
get_wallpaper() {
download() {
local url="$1"
local dir="$2"
local filename=$(basename "$url")
local filepath="$CACHE_DIR/$filename"
local filepath="$dir/$filename"
if [ ! -f "$filepath" ]; then
echo "Downloading $filename..." >&2
@@ -95,81 +88,23 @@ let
return 1
}
fi
echo "$filepath"
}
# Function to get random element from array
random_choice() {
local arr=("$@")
local size=''${#arr[@]}
local idx=$((RANDOM % size))
echo "''${arr[$idx]}"
}
# Get list of connected monitors and their orientations
readarray -t MONITORS < <(${pkgs.hyprland}/bin/hyprctl monitors -j | \
${pkgs.jq}/bin/jq -r '.[] | "\(.name)|\(.width)|\(.height)|\(.transform)"')
# Apply wallpapers to each monitor
for monitor_info in "''${MONITORS[@]}"; do
IFS='|' read -r name width height transform <<< "$monitor_info"
# Determine if monitor is vertical (considering transform)
# transform 1 or 3 means 90/270 degree rotation
if [[ "$transform" == "1" || "$transform" == "3" ]]; then
# Transform swaps width/height, so check original dimensions
if [ "$width" -lt "$height" ]; then
# After transform, it's horizontal
wallpaper_url=$(random_choice "''${HORIZONTAL[@]}")
else
# After transform, it's vertical
wallpaper_url=$(random_choice "''${VERTICAL[@]}")
fi
else
# No rotation or 180 degree rotation
if [ "$width" -lt "$height" ]; then
wallpaper_url=$(random_choice "''${VERTICAL[@]}")
else
wallpaper_url=$(random_choice "''${HORIZONTAL[@]}")
fi
fi
# Download and apply wallpaper
wallpaper_path=$(get_wallpaper "$wallpaper_url")
if [ -n "$wallpaper_path" ]; then
echo "Setting $name to $wallpaper_path" >&2
${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper "$name,$wallpaper_path,cover"
fi
echo "Fetching horizontal wallpapers..."
for url in "''${HORIZONTAL[@]}"; do
download "$url" "$HORIZONTAL_DIR"
done
echo "Fetching vertical wallpapers..."
for url in "''${VERTICAL[@]}"; do
download "$url" "$VERTICAL_DIR"
done
echo "Done. Wallpapers cached in:"
echo " Horizontal: $HORIZONTAL_DIR"
echo " Vertical: $VERTICAL_DIR"
'';
in
{
# Export for use in monitors.nix
home.file.".local/bin/hyprpaper-rotate".source = rotateScript;
# Systemd service and timer for rotation
systemd.user.services.hyprpaper-rotate = {
Unit = {
Description = "Rotate Hyprland wallpapers";
After = [ "graphical-session.target" ];
};
Service = {
Type = "oneshot";
ExecStart = "${rotateScript}";
};
};
systemd.user.timers.hyprpaper-rotate = {
Unit = {
Description = "Rotate Hyprland wallpapers every 12 hours";
};
Timer = {
OnUnitActiveSec = "12h";
Persistent = true;
};
Install = {
WantedBy = [ "timers.target" ];
};
};
home.file.".local/bin/wallpaper-fetch".source = fetchScript;
}
+1 -3
View File
@@ -63,10 +63,8 @@
"f7>/" = "goto_session";
};
# Default theme - Catppuccin-Mocha (dark)
# This will be overridden by darkman scripts
extraConfig = ''
include current-theme.conf
include themes/noctalia.conf
'';
};
+2
View File
@@ -69,4 +69,6 @@
enable = true;
platform = "ipu6ep";
};
services.fprintd.enable = true;
}