back to plasma

This commit is contained in:
William 2025-06-06 10:36:26 -03:00
parent 0d37685470
commit 4dcd29bacb
25 changed files with 385 additions and 610 deletions

38
flake.lock generated
View file

@ -67,6 +67,27 @@
"type": "github" "type": "github"
} }
}, },
"disko": {
"inputs": {
"nixpkgs": [
"nixpkgs-stable"
]
},
"locked": {
"lastModified": 1736864502,
"narHash": "sha256-ItkIZyebGvNH2dK9jVGzJHGPtb6BSWLN8Gmef16NeY0=",
"owner": "nix-community",
"repo": "disko",
"rev": "0141aabed359f063de7413f80d906e1d98c0c123",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "v1.11.0",
"repo": "disko",
"type": "github"
}
},
"flake-compat": { "flake-compat": {
"flake": false, "flake": false,
"locked": { "locked": {
@ -111,16 +132,16 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1747688870, "lastModified": 1749154018,
"narHash": "sha256-ypL9WAZfmJr5V70jEVzqGjjQzF0uCkz+AFQF7n9NmNc=", "narHash": "sha256-gjN3j7joRvT3a8Zgcylnd4NFsnXeDBumqiu4HmY1RIg=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "d5f1f641b289553927b3801580598d200a501863", "rev": "7aae0ee71a17b19708b93b3ed448a1a0952bf111",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nix-community", "owner": "nix-community",
"ref": "release-24.11", "ref": "release-25.05",
"repo": "home-manager", "repo": "home-manager",
"type": "github" "type": "github"
} }
@ -195,16 +216,16 @@
}, },
"nixpkgs-stable": { "nixpkgs-stable": {
"locked": { "locked": {
"lastModified": 1748995628, "lastModified": 1749086602,
"narHash": "sha256-bFufQGSAEYQgjtc4wMrobS5HWN0hDP+ZX+zthYcml9U=", "narHash": "sha256-DJcgJMekoxVesl9kKjfLPix2Nbr42i7cpEHJiTnBUwU=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "8eb3b6a2366a7095939cd22f0dc0e9991313294b", "rev": "4792576cb003c994bd7cc1edada3129def20b27d",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "nixos", "owner": "nixos",
"ref": "nixos-24.11", "ref": "nixos-25.05",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
@ -213,6 +234,7 @@
"inputs": { "inputs": {
"agenix": "agenix", "agenix": "agenix",
"deploy-rs": "deploy-rs", "deploy-rs": "deploy-rs",
"disko": "disko",
"home-manager": "home-manager_2", "home-manager": "home-manager_2",
"home-manager-stable": "home-manager-stable", "home-manager-stable": "home-manager-stable",
"impermanence": "impermanence", "impermanence": "impermanence",

View file

@ -3,14 +3,14 @@
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.11"; nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.05";
home-manager = { home-manager = {
url = "github:nix-community/home-manager/master"; url = "github:nix-community/home-manager/master";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
home-manager-stable = { home-manager-stable = {
url = "github:nix-community/home-manager/release-24.11"; url = "github:nix-community/home-manager/release-25.05";
inputs.nixpkgs.follows = "nixpkgs-stable"; inputs.nixpkgs.follows = "nixpkgs-stable";
}; };
@ -24,6 +24,11 @@
inputs.nixpkgs.follows = "nixpkgs-stable"; inputs.nixpkgs.follows = "nixpkgs-stable";
}; };
disko = {
url = "github:nix-community/disko?ref=v1.11.0";
inputs.nixpkgs.follows = "nixpkgs-stable";
};
nix-flatpak.url = "github:gmodena/nix-flatpak/latest"; nix-flatpak.url = "github:gmodena/nix-flatpak/latest";
impermanence.url = "github:nix-community/impermanence"; impermanence.url = "github:nix-community/impermanence";
@ -36,10 +41,11 @@
nixpkgs-stable, nixpkgs-stable,
home-manager, home-manager,
home-manager-stable, home-manager-stable,
disko,
agenix, agenix,
deploy-rs, deploy-rs,
impermanence,
nix-flatpak, nix-flatpak,
impermanence,
... ...
}: }:
{ {
@ -62,6 +68,7 @@
defaultModules = [ defaultModules = [
./hosts/${hostname}.nix ./hosts/${hostname}.nix
agenix.nixosModules.default agenix.nixosModules.default
disko.nixosModules.default
hm.nixosModules.default hm.nixosModules.default
impermanence.nixosModules.impermanence impermanence.nixosModules.impermanence
nix-flatpak.nixosModules.nix-flatpak nix-flatpak.nixosModules.nix-flatpak
@ -80,6 +87,11 @@
]; ];
serverModules = [ serverModules = [
self.nixosModules.qbittorrent self.nixosModules.qbittorrent
{
nixpkgs.overlays = [
self.overlays.serverOverlay
];
}
]; ];
typeModules = if type == "server" then serverModules else workstationModules; typeModules = if type == "server" then serverModules else workstationModules;
allModules = defaultModules ++ typeModules ++ extraModules; allModules = defaultModules ++ typeModules ++ extraModules;
@ -105,6 +117,12 @@
alexandria = mkHost { alexandria = mkHost {
hostname = "alexandria"; hostname = "alexandria";
type = "server"; type = "server";
extraModules = [ self.nixosModules.qbittorrent ];
};
trantor = mkHost {
hostname = "trantor";
type = "server";
system = "aarch64-linux";
}; };
}; };
@ -113,6 +131,9 @@
}; };
workstationOverlay = final: prev: { workstationOverlay = final: prev: {
plasticity = nixpkgs.legacyPackages."x86_64-linux".callPackage ./packages/plasticity.nix { }; plasticity = nixpkgs.legacyPackages."x86_64-linux".callPackage ./packages/plasticity.nix { };
toggleaudiosink =
nixpkgs.legacyPackages."x86_64-linux".callPackage ./packages/toggleaudiosink.nix
{ };
}; };
serverOverlay = final: prev: { serverOverlay = final: prev: {
}; };
@ -134,6 +155,18 @@
}; };
}; };
trantor = {
hostname = "trantor";
profiles = {
system = {
user = "root";
sshUser = "root";
remoteBuild = true;
path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.alexandria;
};
};
};
io = { io = {
hostname = "io"; hostname = "io";
profiles = { profiles = {

View file

@ -19,7 +19,6 @@ in
./jellyfin.nix ./jellyfin.nix
./librespeed.nix ./librespeed.nix
./memos.nix ./memos.nix
./nextcloud.nix
./nginx.nix ./nginx.nix
./searx.nix ./searx.nix
./services.nix ./services.nix

View file

@ -4,14 +4,10 @@
networking = { networking = {
firewall = { firewall = {
allowedTCPPorts = [ allowedTCPPorts = [
80 # HTTP 80
443 # HTTPS 443
25565 # Minecraft
];
allowedUDPPorts = [
24454 # Minecraft Simple Voice Chat
25565 # Minecraft
]; ];
allowedUDPPorts = [ ];
}; };
}; };
} }

View file

@ -1,103 +0,0 @@
{
lib,
config,
pkgs,
...
}:
{
services = {
nextcloud = {
enable = true;
package = pkgs.nextcloud30;
datadir = "/data/nextcloud";
hostName = "cloud.baduhai.dev";
configureRedis = true;
https = true;
autoUpdateApps.enable = true;
secretFile = config.age.secrets."nextcloud-secrets.json".path;
database.createLocally = true;
maxUploadSize = "16G";
caching = {
apcu = true;
redis = true;
};
settings = {
trusted_proxies = [ "127.0.0.1" ];
default_phone_region = "BR";
maintenance_window_start = "4";
enabledPreviewProviders = [
"OC\\Preview\\BMP"
"OC\\Preview\\EMF"
"OC\\Preview\\Font"
"OC\\Preview\\GIF"
"OC\\Preview\\HEIC"
"OC\\Preview\\Illustrator"
"OC\\Preview\\JPEG"
"OC\\Preview\\Krita"
"OC\\Preview\\MarkDown"
"OC\\Preview\\Movie"
"OC\\Preview\\MP3"
"OC\\Preview\\MSOffice2003"
"OC\\Preview\\MSOffice2007"
"OC\\Preview\\MSOfficeDoc"
"OC\\Preview\\OpenDocument"
"OC\\Preview\\PDF"
"OC\\Preview\\Photoshop"
"OC\\Preview\\PNG"
"OC\\Preview\\Postscript"
"OC\\Preview\\SVG"
"OC\\Preview\\TIFF"
"OC\\Preview\\TXT"
"OC\\Preview\\XBitmap"
];
};
config = {
dbtype = "pgsql";
adminpassFile = config.age.secrets.nextcloud-adminpass.path;
};
phpOptions = {
"opcache.interned_strings_buffer" = "16";
};
};
collabora-online = {
enable = true;
port = lib.strings.toInt config.ports.collabora;
settings.ssl = {
enable = false;
termination = true;
};
};
nginx.virtualHosts = {
${config.services.nextcloud.hostName} = {
useACMEHost = "baduhai.dev";
forceSSL = true;
kTLS = true;
};
"office.baduhai.dev" = {
useACMEHost = "baduhai.dev";
forceSSL = true;
kTLS = true;
locations."/" = {
proxyPass = "http://127.0.0.1:${config.ports.collabora}";
proxyWebsockets = true;
};
};
};
};
age.secrets = {
"nextcloud-secrets.json" = {
file = ../../../secrets/nextcloud-secrets.json.age;
owner = "nextcloud";
group = "hosted";
};
nextcloud-adminpass = {
file = ../../../secrets/nextcloud-adminpass.age;
owner = "nextcloud";
group = "hosted";
};
};
}

View file

@ -5,7 +5,6 @@
./boot.nix ./boot.nix
./console.nix ./console.nix
./desktop.nix ./desktop.nix
./flatpak.nix
./impermanence.nix ./impermanence.nix
./locale.nix ./locale.nix
./networking.nix ./networking.nix

View file

@ -18,13 +18,19 @@
# Workstation specific configuration # Workstation specific configuration
(lib.mkIf hostType.isWorkstation { (lib.mkIf hostType.isWorkstation {
services = { services = {
displayManager.sddm = { displayManager = {
autoLogin = {
enable = true;
user = "user";
};
sddm = {
enable = true; enable = true;
wayland = { wayland = {
enable = true; enable = true;
compositor = "kwin"; compositor = "kwin";
}; };
}; };
};
desktopManager.plasma6.enable = true; desktopManager.plasma6.enable = true;
pipewire = { pipewire = {
enable = true; enable = true;
@ -36,8 +42,6 @@
}; };
}; };
# programs.hyprland.enable = true;
hardware = { hardware = {
xpadneo.enable = true; xpadneo.enable = true;
bluetooth.enable = true; bluetooth.enable = true;

View file

@ -1,35 +0,0 @@
{
hostType,
lib,
...
}:
{
config = lib.mkMerge [
# Common configuration
{
}
# Server specific configuration
(lib.mkIf hostType.isServer {
})
# Workstation specific configuration
(lib.mkIf hostType.isWorkstation {
services.flatpak = {
enable = true;
packages = [
"com.github.k4zmu2a.spacecadetpinball"
"com.github.tchx84.Flatseal"
"com.steamgriddb.SGDBoop"
"app.zen_browser.zen"
"io.github.Foldex.AdwSteamGtk"
"io.itch.itch"
"org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/24.08"
];
uninstallUnmanaged = true;
update.auto.enable = true;
};
})
];
}

View file

@ -27,14 +27,12 @@
]; ];
directories = [ directories = [
"/etc/NetworkManager/system-connections" "/etc/NetworkManager/system-connections"
"/etc/waydroid-extra/images/"
"/var/lib/bluetooth" "/var/lib/bluetooth"
"/var/lib/flatpak" "/var/lib/flatpak"
"/var/lib/nixos" "/var/lib/nixos"
"/var/lib/systemd/coredump" "/var/lib/systemd/coredump"
"/var/lib/systemd/timers" "/var/lib/systemd/timers"
"/var/lib/tailscale" "/var/lib/tailscale"
"/var/lib/waydroid"
"/var/log" "/var/log"
]; ];
}; };

View file

@ -18,7 +18,10 @@
enable = true; enable = true;
extraUpFlags = [ "--operator=user" ]; extraUpFlags = [ "--operator=user" ];
}; };
openssh.enable = true; openssh = {
enable = true;
settings.PermitRootLogin = "no";
};
}; };
} }

View file

@ -9,7 +9,8 @@
config = lib.mkMerge [ config = lib.mkMerge [
# Common configuration # Common configuration
{ {
environment.systemPackages = with pkgs; [ environment = {
systemPackages = with pkgs; [
### Dev Tools ### ### Dev Tools ###
agenix agenix
git git
@ -22,19 +23,18 @@
wget wget
tmux tmux
]; ];
shellAliases = {
ls = "${pkgs.eza}/bin/eza --icons --group-directories-first";
neofetch = "fastfetch";
tree = "ls --tree";
syscleanup = "sudo nix-collect-garbage -d; sudo /run/current-system/bin/switch-to-configuration boot";
};
};
programs = { programs = {
fish.enable = true; fish.enable = true;
command-not-found.enable = false; command-not-found.enable = false;
}; };
environment.shellAliases = {
ls = "${pkgs.eza}/bin/eza --icons --group-directories-first";
neofetch = "fastfetch";
tree = "ls --tree";
tsh = "ssh -o RequestTTY=yes $argv tmux -u -CC new -A -s tmux-main";
syscleanup = "sudo nix-collect-garbage -d; sudo /run/current-system/bin/switch-to-configuration boot";
};
} }
# Server specific configuration # Server specific configuration
@ -64,7 +64,8 @@
}; };
in in
{ {
environment.systemPackages = environment = {
systemPackages =
with pkgs; with pkgs;
[ [
### Dev Tools ### ### Dev Tools ###
@ -79,8 +80,6 @@
### Internet Browsers & Communication ### ### Internet Browsers & Communication ###
beeper beeper
brave brave
microsoft-edge
nextcloud-client
tor-browser tor-browser
vesktop vesktop
### Office & Productivity ### ### Office & Productivity ###
@ -92,7 +91,6 @@
kwrite kwrite
libreoffice-qt libreoffice-qt
obsidian obsidian
(octaveFull.withPackages (octavePackages: with octavePackages; [ signal ]))
onlyoffice-desktopeditors onlyoffice-desktopeditors
rnote rnote
### Graphics & Design ### ### Graphics & Design ###
@ -127,10 +125,25 @@
qview qview
] ]
++ kdepkgs; ++ kdepkgs;
plasma6.excludePackages = (
with pkgs.kdePackages;
[
discover
elisa
gwenview
kate
khelpcenter
oxygen
]
);
};
programs = { programs = {
adb.enable = true; adb.enable = true;
steam.enable = true; steam = {
enable = true;
extraCompatPackages = [ pkgs.proton-ge-bin ];
};
dconf.enable = true; dconf.enable = true;
nix-ld.enable = true; nix-ld.enable = true;
kdeconnect.enable = true; kdeconnect.enable = true;
@ -157,17 +170,29 @@
]; ];
}; };
environment.plasma6.excludePackages = ( services.flatpak = {
with pkgs.kdePackages; enable = true;
[ packages = [
discover ### Dev Tools ###
elisa ### Internet Browsers & Communication ###
gwenview "app.zen_browser.zen"
kate ### Office & Productivity ###
khelpcenter ### Graphics & Design ###
oxygen "com.boxy_svg.BoxySVG"
] ### Gaming & Entertainment ###
); "com.github.k4zmu2a.spacecadetpinball"
"io.itch.itch"
"io.mrarm.mcpelauncher"
"org.freedesktop.Platform.VulkanLayer.MangoHud/x86_64/24.08"
### System Utilities ###
"com.github.tchx84.Flatseal"
"io.github.Foldex.AdwSteamGtk"
"com.steamgriddb.SGDBoop"
### Media ###
];
uninstallUnmanaged = true;
update.auto.enable = true;
};
} }
)) ))
]; ];

View file

@ -0,0 +1,9 @@
{ ... }:
{
boot = {
loader.efi.efiSysMountPoint = "/boot";
initrd.systemd.enable = true;
kernel.sysctl."net.ipv4.ip_forward" = 1;
};
}

View file

@ -0,0 +1,10 @@
{ ... }:
{
imports = [
./boot.nix
./disko.nix
./hardware-configuration.nix
./networking.nix
];
}

View file

@ -0,0 +1,32 @@
{
disko.devices = {
disk = {
main = {
type = "disk";
device = "/dev/sda";
content = {
type = "gpt";
partitions = {
boot = {
size = "512M";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
};
};
root = {
size = "100%";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
};
};
};
};
};
}

View file

@ -0,0 +1,27 @@
{
lib,
modulesPath,
...
}:
{
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
boot = {
kernelModules = [ ];
extraModulePackages = [ ];
initrd = {
availableKernelModules = [
"xhci_pci"
"virtio_pci"
"virtio_scsi"
"usbhid"
];
kernelModules = [ ];
};
};
networking.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux";
}

View file

@ -0,0 +1,10 @@
{ ... }:
{
networking = {
firewall = {
allowedTCPPorts = [ 25566 ];
allowedUDPPorts = [ 25566 ];
};
};
}

View file

@ -20,17 +20,13 @@
"wheel" "wheel"
]; ];
openssh.authorizedKeys.keys = [ openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKcwF1yuWEfYGScNocEbs0AmGxyTIzGc4/IhpU587SJE" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA1v3+q3EaruiiStWjubEJWvtejam/r41uoOpCdwJtLL user@rotterdam"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA1v3+q3EaruiiStWjubEJWvtejam/r41uoOpCdwJtLL" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3Y0PVpGfJHonqDS7qoCFhqzUvqGq9I9sax+F9e/5cs user@io"
]; ];
hashedPassword = "$6$Pj7v/CpstyuWQQV0$cNujVDhfMBdwlGVEnnd8t71.kZPixbo0u25cd.874iaqLTH4V5fa1f98V5zGapjQCz5JyZmsR94xi00sUrntT0"; hashedPassword = "$6$Pj7v/CpstyuWQQV0$cNujVDhfMBdwlGVEnnd8t71.kZPixbo0u25cd.874iaqLTH4V5fa1f98V5zGapjQCz5JyZmsR94xi00sUrntT0";
}; };
root = { root = {
shell = pkgs.fish; shell = pkgs.fish;
openssh.authorizedKeys.keys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKcwF1yuWEfYGScNocEbs0AmGxyTIzGc4/IhpU587SJE"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA1v3+q3EaruiiStWjubEJWvtejam/r41uoOpCdwJtLL"
];
hashedPassword = "!"; hashedPassword = "!";
}; };
}; };

View file

@ -32,7 +32,6 @@
virtualisation = { virtualisation = {
libvirtd.enable = true; libvirtd.enable = true;
lxd.enable = true; lxd.enable = true;
waydroid.enable = true;
}; };
}) })
]; ];

13
hosts/trantor.nix Normal file
View file

@ -0,0 +1,13 @@
{ ... }:
{
networking.hostName = "trantor";
imports = [
./modules/trantor
./modules
];
nix.nixPath = [ "nixos-config=${./trantor.nix}" ];
}

View file

@ -0,0 +1,48 @@
{
pkgs ? import <nixpkgs> { },
}:
pkgs.writeShellScriptBin "toggleaudiosink" ''
#!/usr/bin/env bash
sound_server="pipewire"
# Grab a count of how many audio sinks we have
sink_count=$(${pkgs.pulseaudio}/bin/pactl list sinks | grep -c "Sink #[[:digit:]]")
# Create an array of the actual sink IDs
sinks=()
mapfile -t sinks < <(${pkgs.pulseaudio}/bin/pactl list sinks | grep 'Sink #[[:digit:]]' | sed -n -e 's/.*Sink #\([[:digit:]]\)/\1/p')
# Get the ID of the active sink
active_sink_name=$(${pkgs.pulseaudio}/bin/pactl info | grep 'Default Sink:' | sed -n -e 's/.*Default Sink:[[:space:]]\+\(.*\)/\1/p')
active_sink=$(${pkgs.pulseaudio}/bin/pactl list sinks | grep -B 2 "$active_sink_name" | sed -n -e 's/Sink #\([[:digit:]]\)/\1/p' | head -n 1)
# Get the ID of the last sink in the array
final_sink=''${sinks[$((sink_count - 1))]}
# Find the index of the active sink
for index in "''${!sinks[@]}"; do
if [[ "''${sinks[$index]}" == "$active_sink" ]]; then
active_sink_index=$index
fi
done
# Default to the first sink in the list
next_sink=''${sinks[0]}
next_sink_index=0
# If we're not at the end of the list, move up the list
if [[ $active_sink -ne $final_sink ]]; then
next_sink_index=$((active_sink_index + 1))
next_sink=''${sinks[$next_sink_index]}
fi
# Change the default sink
# Get the name of the next sink
next_sink_name=$(${pkgs.pulseaudio}/bin/pactl list sinks | grep -C 2 "Sink #$next_sink" | sed -n -e 's/.*Name:[[:space:]]\+\(.*\)/\1/p' | head -n 1)
${pkgs.pulseaudio}/bin/pactl set-default-sink "$next_sink_name"
# Move all inputs to the new sink
for app in $(${pkgs.pulseaudio}/bin/pactl list sink-inputs | sed -n -e 's/.*Sink Input #\([[:digit:]]\)/\1/p'); do
${pkgs.pulseaudio}/bin/pactl "move-sink-input $app $next_sink"
done
''

View file

@ -1,7 +1,8 @@
All my personal Nix and NixOS hosts, in a flake. All my personal Nix and NixOS hosts, in a flake.
|Host|Description|Nixpkgs version| |Host|Description|System Version|
|:---|:---:|---:| |:---|:---:|---:|
|alexandria|Personal server/NAS|24.05| |alexandria|Personal server/NAS|NixOS 25.05|
|io|Mobile workstation|unstable| |io|Mobile workstation|NixOS Unstable|
|rotterdam|Workstation|unstable| |rotterdam|Workstation|NixOS Unstable|
|trantor|Oracle Cloud VPS|NixOS 25.05|

View file

@ -2,7 +2,7 @@
{ {
imports = [ imports = [
# ./hyprland.nix
./programs.nix ./programs.nix
./home.nix
]; ];
} }

View file

@ -0,0 +1,20 @@
{ pkgs, ... }:
{
home.pointerCursor = {
package = pkgs.kdePackages.breeze;
name = "Breeze_Light";
gtk.enable = true;
x11.enable = true;
};
gtk = {
enable = true;
gtk3.extraConfig = {
gtk-decoration-layout = "appmenu:";
};
gtk4.extraConfig = {
gtk-decoration-layout = "appmenu:";
};
};
}

View file

@ -1,299 +0,0 @@
{
lib,
pkgs,
...
}:
let
heightfittr = pkgs.writeShellApplication {
name = "heightfittr";
runtimeInputs = with pkgs; [
socat
hyprland
];
text = ''
function handle {
case "$1" in
*openwindow*)
hyprctl dispatch scroller:fitheight all > /dev/null
;;
*closewindow*)
hyprctl dispatch scroller:fitheight all > /dev/null
;;
esac
}
socat - "UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock" | while read -r line; do
handle "$line"
done
'';
};
scrollermodetoggle = pkgs.writeShellApplication {
name = "scrollermodetoggle";
runtimeInputs = with pkgs; [ hyprland ];
text = ''
if [ -f "$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/colmode" ]; then
rm "$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/colmode"
hyprctl --batch 'dispatch scroller:setmode row; notify 2 1000 0 "Row Mode"'
else
touch "$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/colmode"
hyprctl --batch 'dispatch scroller:setmode col; notify 2 1000 0 "Column Mode"'
fi
'';
};
in
{
wayland.windowManager.hyprland = {
enable = true;
plugins = with pkgs.hyprlandPlugins; [ hyprscroller ];
extraConfig = ''
################
### MONITORS ###
################
monitor=,preferred,auto,1
#################
### AUTOSTART ###
#################
# exec-once = ${pkgs.gnome-settings-daemon}/libexec/gsd-rfkill
# exec-once = waybar
# exec-once = syshud
exec-once = ${lib.getExe heightfittr}
env = XCURSOR_SIZE,24
env = HYPRCURSOR_SIZE,24
#####################
### LOOK AND FEEL ###
#####################
general {
gaps_in = 5
gaps_out = 20
border_size = 2
resize_on_border = true
allow_tearing = false
layout = scroller
}
misc {
font_family = Inter
}
plugin {
scroller {
column_default_width = onethird
focuswrap = false
column_widths = onethird onehalf twothirds
center_row_if_space_available = true
}
}
decoration {
rounding = 10
rounding_power = 2
dim_inactive = true
dim_strength = 0.3
shadow {
enabled = true
range = 4
render_power = 3
}
blur {
enabled = true
size = 8
passes = 1
vibrancy = 0.1696
}
layerrule = blur, waybar
layerrule = ignorealpha 0.5, waybar
layerrule = ignorezero, waybar
}
animations {
enabled = yes, please :)
bezier = easeOutQuint,0.23,1,0.32,1
bezier = easeInOutCubic,0.65,0.05,0.36,1
bezier = linear,0,0,1,1
bezier = almostLinear,0.5,0.5,0.75,1.0
bezier = quick,0.15,0,0.1,1
animation = global, 1, 1, default
animation = border, 1, 1, easeOutQuint
animation = windows, 1, 1, easeOutQuint
animation = windowsIn, 1, 1, easeOutQuint, popin 87%
animation = windowsOut, 1, 1, linear, popin 87%
animation = fadeIn, 1, 1, almostLinear
animation = fadeOut, 1, 1, almostLinear
animation = fade, 1, 1, quick
animation = layers, 1, 1, easeOutQuint
animation = layersIn, 1, 1, easeOutQuint, fade
animation = layersOut, 1, 1, linear, fade
animation = fadeLayersIn, 1, 1, almostLinear
animation = fadeLayersOut, 1, 1, almostLinear
animation = workspaces, 1, 1, almostLinear, slidevert
}
misc {
force_default_wallpaper = 0
disable_hyprland_logo = true
}
#############
### INPUT ###
#############
input {
kb_layout = us
kb_variant = altgr-intl
follow_mouse = 1
sensitivity = 0
accel_profile = flat
natural_scroll = true
touchpad {
natural_scroll = true
clickfinger_behavior = true
}
}
###################
### KEYBINDINGS ###
###################
$mainMod = SUPER
$terminal = ghostty
$menu = ulauncher-toggle
# APP SHORTCUTS
bind = ALT, SPACE, exec, $menu
bind = $mainMod, RETURN, exec, $terminal
# SESSION MANAGEMENT
bind = CTRL ALT, DELETE, exit,
bind = $mainMod, mouse_up, exec, hyprnome
bind = $mainMod, mouse_down, exec, hyprnome --previous
bind = CTRL ALT, j, exec, hyprnome
bind = CTRL ALT, k, exec, hyprnome --previous
bind = $mainMod CTRL ALT, j, exec, hyprnome --move
bind = $mainMod CTRL ALT, k, exec, hyprnome --move --previous
bindel = ,XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
bindel = ,XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
bindel = ,XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
bindel = ,XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
bindel = ,XF86MonBrightnessUp, exec, brightnessctl s 10%+
bindel = ,XF86MonBrightnessDown, exec, brightnessctl s 10%-
bindl = , XF86AudioNext, exec, playerctl next
bindl = , XF86AudioPause, exec, playerctl play-pause
bindl = , XF86AudioPlay, exec, playerctl play-pause
bindl = , XF86AudioPrev, exec, playerctl previous
bind = CTRL ALT SHIFT, a, exec, bash /home/user/.local/bin/toggle-audio-output.sh
# WINDOW MANAGEMENT
bind = ALT, F4, killactive,
bind = $mainMod, space, togglefloating,
bind = $mainMod, f, fullscreen
bindm = $mainMod, mouse:272, movewindow
bindm = $mainMod, mouse:273, resizewindow
bind = SUPER, h, movefocus, l
bind = SUPER, l, movefocus, r
bind = SUPER, k, movefocus, u
bind = SUPER, j, movefocus, d
bind = $mainMod CTRL, h, movewindow, l
bind = $mainMod CTRL, l, movewindow, r
bind = $mainMod CTRL, k, movewindow, u
bind = $mainMod CTRL, j, movewindow, d
bind = $mainMod, v, exec, ${lib.getExe scrollermodetoggle}
bind = $mainMod, r, scroller:cyclewidth, next
bind = $mainMod CTRL, r, scroller:cyclewidth, prev
bind = $mainMod, p, scroller:pin,
bind = $mainMod, c, scroller:alignwindow, center
bind = $mainMod CTRL, f, scroller:fitsize, all
####################
### WINDOW RULES ###
####################
windowrulev2 = suppressevent maximize, class:.*
windowrulev2 = nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0
# ulauncher
windowrule = float, ulauncher
windowrule = pin, ulauncher
windowrule = noborder, ulauncher
windowrule = noshadow, ulauncher
windowrule = nomaxsize, ulauncher
windowrule = noblur, ulauncher
windowrulev2 = animation slide top, class:^(ulauncher)$
# browsers
windowrulev2 = plugin:scroller:columnwidth onehalf, class:(firefox)
windowrulev2 = plugin:scroller:columnwidth onehalf, class:(zen)
windowrulev2 = plugin:scroller:columnwidth onehalf, class:(brave)
'';
};
services = {
# swaync = {
# enable = true;
# settings = {
# positionX = "left";
# positionY = "top";
# layer = "overlay";
# control-center-layer = "top";
# layer-shell = true;
# cssPriority = "application";
# control-center-margin-top = 20;
# control-center-margin-bottom = 20;
# control-center-margin-right = 20;
# control-center-margin-left = 20;
# notification-2fa-action = true;
# notification-inline-replies = false;
# notification-icon-size = 64;
# notification-body-image-height = 100;
# notification-body-image-width = 200;
# timeout = 10;
# timeout-low = 5;
# timeout-critical = 0;
# fit-to-screen = true;
# relative-timestamps = true;
# control-center-width = 500;
# control-center-height = 600;
# notification-window-width = 500;
# keyboard-shortcuts = true;
# image-visibility = "when-available";
# transition-time = 200;
# hide-on-clear = false;
# hide-on-action = true;
# script-fail-notify = true;
# widgets = [
# "inhibitors"
# "title"
# "dnd"
# "notifications"
# "mpris"
# ];
# widget-config = {
# inhibitors = {
# text = "Inhibitors";
# button-text = "Clear All";
# clear-all-button = true;
# };
# title = {
# text = "Notifications";
# clear-all-button = true;
# button-text = "Clear All";
# };
# dnd = {
# text = "Do Not Disturb";
# };
# mpris = {
# image-size = 96;
# image-radius = 12;
# };
# };
# };
# };
# clipman.enable = true;
};
# programs = {
# hyprlock.enable = true;
# };
home.packages = with pkgs; [
brightnessctl
ghostty
hyprnome
playerctl
swaynotificationcenter
syshud
ulauncher
waybar
# inputs.mithril.packages.${pkgs.system}.mithril-control-center
];
}

View file

@ -57,10 +57,13 @@
settings = { settings = {
add_newline = false; add_newline = false;
format = '' format = ''
$directory$git_branch$git_status$nix_shell $hostname$directory$git_branch$git_status$nix_shell
[ ](bold green) [ ](bold green)
''; '';
right_format = "$cmd_duration$character"; right_format = "$cmd_duration$character";
hostname = {
ssh_symbol = "<U+EB3A> ";
};
character = { character = {
error_symbol = "[](red)"; error_symbol = "[](red)";
success_symbol = "[󱐋](green)"; success_symbol = "[󱐋](green)";
@ -111,10 +114,6 @@
(lib.mkIf hostType.isWorkstation { (lib.mkIf hostType.isWorkstation {
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
# home.packages = with pkgs; [
# ulauncher
# ];
programs = { programs = {
password-store.package = pkgs.pass-wayland; password-store.package = pkgs.pass-wayland;
@ -146,37 +145,6 @@
gtk-decoration-layout = "appmenu:"; gtk-decoration-layout = "appmenu:";
}; };
}; };
# systemd.user.services.ulauncher = {
# Unit = {
# Description = "Ulauncher Application Launcher";
# After = [ "graphical-session.target" ];
# };
# Service = {
# Type = "simple";
# Environment =
# let
# pydeps = pkgs.python3.withPackages (
# pp: with pp; [
# # dependencies for ulauncher-albert-calculate-anything
# parsedatetime
# pint
# pytz
# requests
# simpleeval
# ]
# );
# in
# [
# "PYTHONPATH=${pydeps}/${pydeps.sitePackages}"
# ];
# ExecStart = pkgs.writeShellScript "ulauncher-env-wrapper.sh" ''
# export PATH="''${XDG_BIN_HOME}:$HOME/.nix-profile/bin:/etc/profiles/per-user/$USER/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin"
# export GDK_BACKEND=wayland
# exec ${pkgs.ulauncher}/bin/ulauncher --hide-window
# '';
# };
# };
}) })
]; ];
} }