Compare commits

..

10 commits

24 changed files with 525 additions and 334 deletions

View file

@ -1,9 +1,15 @@
{pkgs, ...}: { {
pkgs,
lib,
config,
...
}:
{
services.kanidm = { services.kanidm = {
enableServer = true; enableServer = true;
enableClient = true; enableClient = true;
package = pkgs.kanidm_1_7; package = pkgs.kanidm_1_8;
serverSettings = { serverSettings = {
version = "2"; # Configuration file version. version = "2"; # Configuration file version.
@ -11,7 +17,7 @@
domain = "idm.peprolinbot.com"; domain = "idm.peprolinbot.com";
bindaddress = "[::1]:8443"; bindaddress = "[::1]:8443";
ldapbindaddress = "[::]:636"; ldapbindaddress = "[::]:636";
http_client_address_info.x-forward-for = ["::1"]; http_client_address_info.x-forward-for = [ "::1" ];
tls_chain = "/var/lib/kanidm/cert.pem"; tls_chain = "/var/lib/kanidm/cert.pem";
tls_key = "/var/lib/kanidm/key.pem"; tls_key = "/var/lib/kanidm/key.pem";
}; };
@ -27,6 +33,43 @@
chown kanidm:kanidm /var/lib/kanidm/{cert,key,chain}.pem chown kanidm:kanidm /var/lib/kanidm/{cert,key,chain}.pem
chmod 400 /var/lib/kanidm/{cert,key,chain}.pem chmod 400 /var/lib/kanidm/{cert,key,chain}.pem
''; '';
reloadServices = ["kanidm.service"]; reloadServices = [ "kanidm.service" ];
};
clan.core.state.kanidm = {
folders = [ "/var/backup/kanidm" ];
preBackupScript = ''
export PATH=${
lib.makeBinPath [
pkgs.coreutils
config.services.kanidm.package
]
}
mkdir -p /var/backup/kanidm
kanidmd database backup /var/backup/kanidm/backup.json
'';
postRestoreScript = ''
export PATH=${
lib.makeBinPath [
config.systemd.package
pkgs.coreutils
config.services.kanidm.package
]
}
service_status="$(systemctl is-active kanidm)"
systemctl stop kanidm
kanidmd database restore /var/backup/kanidm/backup.json
if [ "$service_status" = "active" ]; then
systemctl start kanidm
fi
'';
}; };
} }

View file

@ -1,40 +1,79 @@
{ {
config, config,
pkgs, pkgs,
lib,
... ...
}: }:
{ {
services.postgresql = clan.core.postgresql = {
let enable = true;
databases = [
"matrix-synapse"
"mautrix-signal"
"mautrix-whatsapp"
"mautrix-telegram"
];
in
{
enable = true;
ensureDatabases = databases;
# Create a user for each database
ensureUsers = map (id: {
name = id;
ensureDBOwnership = true;
}) databases;
initialScript = pkgs.writeText "backend-initScript" ''
CREATE ROLE "matrix-synapse" WITH LOGIN;
CREATE DATABASE "matrix-synapse"
WITH ENCODING = 'UTF8'
TEMPLATE = template0
OWNER = "matrix-synapse"
LC_COLLATE = 'C'
LC_CTYPE = 'C';
'';
users = {
matrix-synapse = { };
mautrix-signal = { };
mautrix-whatsapp = { };
mautrix-telegram = { };
}; };
databases = {
matrix-synapse = {
create.options = {
ENCODING = "UTF8";
TEMPLATE = "template0";
OWNER = "matrix-synapse";
LC_COLLATE = "C";
LC_CTYPE = "C";
};
restore.stopOnRestore = [ "matrix-synapse" ];
};
mautrix-signal = {
restore.stopOnRestore = [ "mautrix-signal" ];
};
mautrix-whatsapp = {
restore.stopOnRestore = [ "mautrix-whatsapp" ];
};
mautrix-telegram = {
restore.stopOnRestore = [ "mautrix-telegram" ];
};
};
};
clan.core.state.matrix = {
folders = [ "/var/backup/matrix-synapse" ];
preBackupScript = ''
export PATH=${
lib.makeBinPath [
pkgs.coreutils
pkgs.rsync
]
}
mkdir -p /var/backup/matrix-synapse
rsync -avH --delete --numeric-ids --include='homeserver.signing.key' --include='media_store' --exclude='media_store/remote_*' --exclude='media_store/url_cache*' /var/lib/matrix-synapse /var/backup/matrix-synapse/
'';
postRestoreScript = ''
export PATH=${
lib.makeBinPath [
config.systemd.package
pkgs.coreutils
pkgs.rsync
]
}
service_status="$(systemctl is-active matrix-synapse)"
systemctl stop matrix-synapse
rsync -avH --delete --numeric-ids /var/backup/matrix-synapse/ /var/lib/matrix-synapse/
if [ "$service_status" = "active" ]; then
systemctl start matrix-synapse
fi
'';
};
services.matrix-synapse = { services.matrix-synapse = {
enable = true; enable = true;
settings = { settings = {

View file

@ -20,6 +20,15 @@
recommendedTlsSettings = true; recommendedTlsSettings = true;
virtualHosts = { virtualHosts = {
"_" = {
default = true;
rejectSSL = true; # Avoid serving a certificate
locations."/" = {
return = "404";
};
};
"idm.peprolinbot.com" = { "idm.peprolinbot.com" = {
forceSSL = true; forceSSL = true;
enableACME = true; enableACME = true;

View file

@ -22,6 +22,17 @@
services.sunshine.autoStart = true; services.sunshine.autoStart = true;
programs.steam.gamescopeSession = {
enable = true;
args = [
"--prefer-output"
"DP-1,*"
"--rt"
"--adaptive-sync"
"--steam"
];
};
home-manager.users.pedro.wayland.windowManager.hyprland.settings = { home-manager.users.pedro.wayland.windowManager.hyprland.settings = {
monitor = [ monitor = [
"DP-2, 1920x1080@60, 0x0, 1" "DP-2, 1920x1080@60, 0x0, 1"

View file

@ -11,4 +11,7 @@
dates = "weekly"; dates = "weekly";
options = "--delete-older-than 30d"; options = "--delete-older-than 30d";
}; };
security.polkit.enable = true;
security.sudo.enable = true;
} }

View file

@ -1,12 +1,16 @@
{ pkgs, lib, ... }: { lib, ... }:
{ {
programs.steam = { programs.steam = {
enable = true; enable = true;
remotePlay.openFirewall = true; remotePlay.openFirewall = true;
dedicatedServer.openFirewall = false; dedicatedServer.openFirewall = false;
gamescopeSession.enable = true;
}; };
environment.systemPackages = [ pkgs.gamescope ]; programs.gamescope = {
enable = true;
capSysNice = true;
};
programs.gamemode.enable = true; programs.gamemode.enable = true;

View file

@ -1,10 +1,10 @@
{ {
pkgs,
lib, lib,
config, config,
... ...
}: { }:
imports = [./regreet.nix]; {
imports = [ ./regreet.nix ];
options = { options = {
programs.hyprland.autoLogin.username = lib.mkOption { programs.hyprland.autoLogin.username = lib.mkOption {
@ -21,19 +21,10 @@
withUWSM = true; withUWSM = true;
}; };
xdg.portal = { services.greetd.settings.initial_session =
enable = true; let
wlr.enable = true; username = config.programs.hyprland.autoLogin.username;
xdgOpenUsePortal = true; in
extraPortals = [
pkgs.xdg-desktop-portal-hyprland
pkgs.xdg-desktop-portal-gtk
];
};
services.greetd.settings.initial_session = let
username = config.programs.hyprland.autoLogin.username;
in
lib.mkIf (!isNull username) { lib.mkIf (!isNull username) {
command = "uwsm start hyprland-uwsm.desktop"; command = "uwsm start hyprland-uwsm.desktop";
user = username; user = username;

View file

@ -1,4 +1,5 @@
{pkgs, ...}: { { pkgs, ... }:
{
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
enable = true; enable = true;
xwayland = { xwayland = {
@ -10,119 +11,120 @@
pkgs.hyprlandPlugins.hyprgrass pkgs.hyprlandPlugins.hyprgrass
]; ];
settings = let settings =
app_menu = "${pkgs.fuzzel}/bin/fuzzel"; let
in { app_menu = "${pkgs.fuzzel}/bin/fuzzel";
# Autostart in
exec-once = [ {
"uwsm app -- nm-applet" # Autostart
"uwsm app -- ${pkgs.wl-clip-persist}/bin/persist --clipboard regular" exec-once = [
"uwsm app -- bash -c 'if [ ! -f ~/.config/hypr/wallpaper.png ]; then wall-change ~/.config/hypr/default_wallpaper.png; fi'" "uwsm app -- nm-applet"
"uwsm app -- ${pkgs.swaybg}/bin/swaybg -m fill -i ~/.config/hypr/wallpaper.png &" "uwsm app -- ${pkgs.wl-clip-persist}/bin/persist --clipboard regular"
"uwsm app -- ${pkgs.poweralertd}/bin/poweralertd" "uwsm app -- bash -c 'if [ ! -f ~/.config/hypr/wallpaper.png ]; then wall-change ~/.config/hypr/default_wallpaper.png; fi'"
"uwsm app -- waybar" "uwsm app -- ${pkgs.swaybg}/bin/swaybg -m fill -i ~/.config/hypr/wallpaper.png &"
"uwsm app -- element-desktop --hidden" "uwsm app -- ${pkgs.poweralertd}/bin/poweralertd"
]; "uwsm app -- waybar"
"uwsm app -- element-desktop --hidden"
input = {
kb_layout = "es,us";
kb_options = "grp:alt_caps_toggle";
numlock_by_default = true;
follow_mouse = 1;
sensitivity = 0;
touchpad = {
natural_scroll = true;
};
};
general = {
"$mainMod" = "SUPER";
layout = "dwindle";
gaps_in = 0;
gaps_out = 0;
border_size = 2;
no_border_on_floating = false;
};
misc = {
disable_autoreload = true;
disable_hyprland_logo = true;
always_follow_on_dnd = true;
layers_hog_keyboard_focus = true;
animate_manual_resizes = false;
enable_swallow = true;
focus_on_activate = true;
};
dwindle = {
force_split = 0;
special_scale_factor = 1.0;
split_width_multiplier = 1.0;
use_active_for_splits = true;
pseudotile = true;
preserve_split = true;
};
master = {
new_status = "master";
special_scale_factor = 1;
};
decoration = {
rounding = 0;
blur = {
enabled = true;
size = 1;
passes = 1;
brightness = 1;
contrast = 1.400;
ignore_opacity = true;
noise = 0;
new_optimizations = true;
xray = false;
};
shadow = {
enabled = true;
ignore_window = true;
offset = "0 2";
range = 20;
render_power = 3;
};
};
animations = {
enabled = true;
bezier = [
"fluent_decel, 0, 0.2, 0.4, 1"
"easeOutCirc, 0, 0.55, 0.45, 1"
"easeOutCubic, 0.33, 1, 0.68, 1"
"easeinoutsine, 0.37, 0, 0.63, 1"
]; ];
animation = [ input = {
# Windows kb_layout = "es,us";
"windowsIn, 1, 3, easeOutCubic, popin 30%" # window open kb_options = "grp:alt_caps_toggle";
"windowsOut, 1, 3, fluent_decel, popin 70%" # window close. numlock_by_default = true;
"windowsMove, 1, 2, easeinoutsine, slide" # everything in between, moving, dragging, resizing. follow_mouse = 1;
sensitivity = 0;
touchpad = {
natural_scroll = true;
};
};
# Fade general = {
"fadeIn, 1, 3, easeOutCubic" # fade in (open) -> layers and windows "$mainMod" = "SUPER";
"fadeOut, 1, 2, easeOutCubic" # fade out (close) -> layers and windows layout = "dwindle";
"fadeSwitch, 0, 1, easeOutCirc" # fade on changing activewindow and its opacity gaps_in = 0;
"fadeShadow, 1, 10, easeOutCirc" # fade on changing activewindow for shadows gaps_out = 0;
"fadeDim, 1, 4, fluent_decel" # the easing of the dimming of inactive windows border_size = 2;
"border, 1, 2.7, easeOutCirc" # for animating the border's color switch speed no_border_on_floating = false;
"borderangle, 1, 30, fluent_decel, once" # for animating the border's gradient angle - styles: once (default), loop };
"workspaces, 1, 4, easeOutCubic, fade" # styles: slide, slidevert, fade, slidefade, slidefadevert
];
};
bind = misc = {
[ disable_autoreload = true;
disable_hyprland_logo = true;
always_follow_on_dnd = true;
layers_hog_keyboard_focus = true;
animate_manual_resizes = false;
enable_swallow = true;
focus_on_activate = true;
};
dwindle = {
force_split = 0;
special_scale_factor = 1.0;
split_width_multiplier = 1.0;
use_active_for_splits = true;
pseudotile = true;
preserve_split = true;
};
master = {
new_status = "master";
special_scale_factor = 1;
};
decoration = {
rounding = 0;
blur = {
enabled = true;
size = 1;
passes = 1;
brightness = 1;
contrast = 1.400;
ignore_opacity = true;
noise = 0;
new_optimizations = true;
xray = false;
};
shadow = {
enabled = true;
ignore_window = true;
offset = "0 2";
range = 20;
render_power = 3;
};
};
animations = {
enabled = true;
bezier = [
"fluent_decel, 0, 0.2, 0.4, 1"
"easeOutCirc, 0, 0.55, 0.45, 1"
"easeOutCubic, 0.33, 1, 0.68, 1"
"easeinoutsine, 0.37, 0, 0.63, 1"
];
animation = [
# Windows
"windowsIn, 1, 3, easeOutCubic, popin 30%" # window open
"windowsOut, 1, 3, fluent_decel, popin 70%" # window close.
"windowsMove, 1, 2, easeinoutsine, slide" # everything in between, moving, dragging, resizing.
# Fade
"fadeIn, 1, 3, easeOutCubic" # fade in (open) -> layers and windows
"fadeOut, 1, 2, easeOutCubic" # fade out (close) -> layers and windows
"fadeSwitch, 0, 1, easeOutCirc" # fade on changing activewindow and its opacity
"fadeShadow, 1, 10, easeOutCirc" # fade on changing activewindow for shadows
"fadeDim, 1, 4, fluent_decel" # the easing of the dimming of inactive windows
"border, 1, 2.7, easeOutCirc" # for animating the border's color switch speed
"borderangle, 1, 30, fluent_decel, once" # for animating the border's gradient angle - styles: once (default), loop
"workspaces, 1, 4, easeOutCubic, fade" # styles: slide, slidevert, fade, slidefade, slidefadevert
];
};
bind = [
# show keybinds list # show keybinds list
"$mainMod, F1, exec, show-keybinds" "$mainMod, F1, exec, show-keybinds"
@ -160,17 +162,19 @@
# binds $mod + [shift +] {1..10} to [move to] workspace {1..10} # binds $mod + [shift +] {1..10} to [move to] workspace {1..10}
builtins.concatLists ( builtins.concatLists (
builtins.genList ( builtins.genList (
x: let x:
ws = let let
c = (x + 1) / 10; ws =
in let
c = (x + 1) / 10;
in
builtins.toString (x + 1 - (c * 10)); builtins.toString (x + 1 - (c * 10));
in [ in
[
"$mainMod, ${ws}, workspace, ${toString (x + 1)}" "$mainMod, ${ws}, workspace, ${toString (x + 1)}"
"$mainMod SHIFT, ${ws}, movetoworkspacesilent, ${toString (x + 1)}" "$mainMod SHIFT, ${ws}, movetoworkspacesilent, ${toString (x + 1)}"
] ]
) ) 10
10
) )
) )
++ [ ++ [
@ -184,24 +188,40 @@
# Window focus, movement and control # Window focus, movement and control
builtins.concatLists ( builtins.concatLists (
let let
keys = ["H" "L" "K" "J"]; keys = [
directions = ["l" "r" "u" "d"]; "H"
"L"
"K"
"J"
];
directions = [
"l"
"r"
"u"
"d"
];
resize = toString 80; # Change this to change how much a window resizes each keypress resize = toString 80; # Change this to change how much a window resizes each keypress
resize_list = ["-${resize} 0" "${resize} 0" "0 -${resize}" "0 ${resize}"]; resize_list = [
"-${resize} 0"
"${resize} 0"
"0 -${resize}"
"0 ${resize}"
];
in in
builtins.genList ( builtins.genList (
x: let x:
k = builtins.elemAt keys x; let
d = builtins.elemAt directions x; k = builtins.elemAt keys x;
r = builtins.elemAt resize_list x; d = builtins.elemAt directions x;
in [ r = builtins.elemAt resize_list x;
"$mainMod, ${k}, movefocus, ${d}" in
"$mainMod SHIFT, ${k}, movewindow, ${d}" [
"$mainMod CTRL, ${k}, resizeactive, ${r}" "$mainMod, ${k}, movefocus, ${d}"
"$mainMod ALT, ${k}, moveactive, ${r}" "$mainMod SHIFT, ${k}, movewindow, ${d}"
] "$mainMod CTRL, ${k}, resizeactive, ${r}"
) "$mainMod ALT, ${k}, moveactive, ${r}"
4 ]
) 4
) )
) )
++ [ ++ [
@ -218,172 +238,167 @@
"$mainMod, V, exec, cliphist list | fuzzel --dmenu --prompt '📋 ' | cliphist decode | wl-copy" "$mainMod, V, exec, cliphist list | fuzzel --dmenu --prompt '📋 ' | cliphist decode | wl-copy"
]; ];
# Bindings that work when locked # Bindings that work when locked
bindl = [ bindl = [
# media and volume controls # media and volume controls
",XF86AudioRaiseVolume,exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ && wp-vol" ",XF86AudioRaiseVolume,exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+ && wp-vol"
",XF86AudioLowerVolume,exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && wp-vol" ",XF86AudioLowerVolume,exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && wp-vol"
",XF86AudioMute,exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" ",XF86AudioMute,exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
",XF86AudioPlay,exec, playerctl play-pause" ",XF86AudioPlay,exec, playerctl play-pause"
",XF86AudioNext,exec, playerctl next" ",XF86AudioNext,exec, playerctl next"
",XF86AudioPrev,exec, playerctl previous" ",XF86AudioPrev,exec, playerctl previous"
",XF86AudioStop, exec, playerctl stop" ",XF86AudioStop, exec, playerctl stop"
]; ];
# mouse binding # mouse binding
bindm = [ bindm = [
"$mainMod, mouse:272, movewindow" "$mainMod, mouse:272, movewindow"
"$mainMod, mouse:273, resizewindow" "$mainMod, mouse:273, resizewindow"
]; ];
# windowrule gesture = [
windowrule = [ "3, horizontal, workspace"
"float,class:vimiv" ];
"center,class:vimiv"
"float,class:mpv"
"center,class:mpv"
"size 1200 725,class:mpv"
"float,title:^(float_kitty)$"
"center,title:^(float_kitty)$"
"size 950 600,title:^(float_kitty)$"
"tile, class:neovide"
"idleinhibit focus,class:mpv"
"float,class:udiskie"
"float,title:^(Volume Control)$"
"float,title:^(Firefox Sharing Indicator)$"
"move 0 0,title:^(Firefox Sharing Indicator)$"
"size 700 450,title:^(Volume Control)$"
"move 40 55%,title:^(Volume Control)$"
"float, title:^(Picture-in-Picture)$"
"opacity 1.0 override 1.0 override, title:^(Picture-in-Picture)$"
"pin, title:^(Picture-in-Picture)$"
"opacity 1.0 override 1.0 override, class:(Aseprite)"
"opacity 1.0 override 1.0 override, class:(Unity)"
"idleinhibit focus, class:^(mpv)$"
"idleinhibit fullscreen, class:^(firefox)$"
"float,class:^(zenity)$"
"center,class:^(zenity)$"
"size 850 500,class:^(zenity)$"
"float,class:^(pavucontrol)$"
"float,class:^(.sameboy-wrapped)$"
"float,class:^(file_progress)$"
"float,class:^(confirm)$"
"float,class:^(dialog)$"
"float,class:^(download)$"
"float,class:^(notification)$"
"float,class:^(error)$"
"float,class:^(confirmreset)$"
"float,title:^(Open File)$"
"float,title:^(branchdialog)$"
"float,title:^(Confirm to replace files)$"
"float,title:^(File Operation Progress)$"
"opacity 0.0 override,class:^(xwaylandvideobridge)$" # windowrule
"noanim,class:^(xwaylandvideobridge)$" windowrule = [
"noinitialfocus,class:^(xwaylandvideobridge)$" "float,class:vimiv"
"maxsize 1 1,class:^(xwaylandvideobridge)$" "center,class:vimiv"
"noblur,class:^(xwaylandvideobridge)$" "float,class:mpv"
]; "center,class:mpv"
"size 1200 725,class:mpv"
"float,title:^(float_kitty)$"
"center,title:^(float_kitty)$"
"size 950 600,title:^(float_kitty)$"
"tile, class:neovide"
"idleinhibit focus,class:mpv"
"float,class:udiskie"
"float,title:^(Volume Control)$"
"float,title:^(Firefox Sharing Indicator)$"
"move 0 0,title:^(Firefox Sharing Indicator)$"
"size 700 450,title:^(Volume Control)$"
"move 40 55%,title:^(Volume Control)$"
"float, title:^(Picture-in-Picture)$"
"opacity 1.0 override 1.0 override, title:^(Picture-in-Picture)$"
"pin, title:^(Picture-in-Picture)$"
"opacity 1.0 override 1.0 override, class:(Aseprite)"
"opacity 1.0 override 1.0 override, class:(Unity)"
"idleinhibit focus, class:^(mpv)$"
"idleinhibit fullscreen, class:^(firefox)$"
"float,class:^(zenity)$"
"center,class:^(zenity)$"
"size 850 500,class:^(zenity)$"
"float,class:^(pavucontrol)$"
"float,class:^(.sameboy-wrapped)$"
"float,class:^(file_progress)$"
"float,class:^(confirm)$"
"float,class:^(dialog)$"
"float,class:^(download)$"
"float,class:^(notification)$"
"float,class:^(error)$"
"float,class:^(confirmreset)$"
"float,title:^(Open File)$"
"float,title:^(branchdialog)$"
"float,title:^(Confirm to replace files)$"
"float,title:^(File Operation Progress)$"
monitor = [ "opacity 0.0 override,class:^(xwaylandvideobridge)$"
",preferred,auto,1" "noanim,class:^(xwaylandvideobridge)$"
]; "noinitialfocus,class:^(xwaylandvideobridge)$"
"maxsize 1 1,class:^(xwaylandvideobridge)$"
"noblur,class:^(xwaylandvideobridge)$"
];
xwayland = { monitor = [
force_zero_scaling = true; ",preferred,auto,1"
}; ];
gestures = { xwayland = {
workspace_swipe = true; force_zero_scaling = true;
workspace_swipe_direction_lock = false; };
};
ecosystem = {
no_update_news = true;
no_donation_nag = true;
};
plugin = {
touch_gestures = {
# The default sensitivity is probably too low on tablet screens,
# I recommend turning it up to 4.0
sensitivity = 5.0;
# must be >= 3 ecosystem = {
workspace_swipe_fingers = 3; no_update_news = true;
no_donation_nag = true;
};
# switching workspaces by swiping from an edge, this is separate from workspace_swipe_fingers plugin = {
# and can be used at the same time touch_gestures = {
# possible values: l, r, u, or d # The default sensitivity is probably too low on tablet screens,
# to disable it set it to anything else # I recommend turning it up to 4.0
workspace_swipe_edge = "no"; sensitivity = 5.0;
# in milliseconds # must be >= 3
long_press_delay = 400; workspace_swipe_fingers = 3;
# resize windows by long-pressing on window borders and gaps. # switching workspaces by swiping from an edge, this is separate from workspace_swipe_fingers
# If general:resize_on_border is enabled, general:extend_border_grab_area is used for floating # and can be used at the same time
# windows # possible values: l, r, u, or d
resize_on_border_long_press = true; # to disable it set it to anything else
workspace_swipe_edge = "no";
# in pixels, the distance from the edge that is considered an edge # in milliseconds
edge_margin = 20; long_press_delay = 400;
# emulates touchpad swipes when swiping in a direction that does not trigger workspace swipe. # resize windows by long-pressing on window borders and gaps.
# ONLY triggers when finger count is equal to workspace_swipe_fingers # If general:resize_on_border is enabled, general:extend_border_grab_area is used for floating
# # windows
# might be removed in the future in favor of event hooks resize_on_border_long_press = true;
emulate_touchpad_swipe = false;
hyprgrass-bind = [ # in pixels, the distance from the edge that is considered an edge
# swipe left from right edge edge_margin = 20;
", edge:r:l, exec, playerctl next"
# swipe right from left edge # emulates touchpad swipes when swiping in a direction that does not trigger workspace swipe.
", edge:l:r, exec, playerctl previous" # ONLY triggers when finger count is equal to workspace_swipe_fingers
#
# might be removed in the future in favor of event hooks
emulate_touchpad_swipe = false;
# swipe up from bottom edge hyprgrass-bind = [
", edge:d:u, exec, pkill -SIGUSR2 wvkbd" # Show wvkbd # swipe left from right edge
", edge:r:l, exec, playerctl next"
# swipe down to bottom edge # swipe right from left edge
", edge:u:d, exec, pkill -SIGUSR1 wvkbd" # Hide wvkbd ", edge:l:r, exec, playerctl previous"
# tap with 3 fingers # swipe up from bottom edge
", tap:4, exec, pkill -SIGRTMIN wvkbd" # Toggles wvkbd ", edge:d:u, exec, pkill -SIGUSR2 wvkbd" # Show wvkbd
# swipe up from left edge # swipe down to bottom edge
", edge:l:u, exec, pamixer -i 4" ", edge:u:d, exec, pkill -SIGUSR1 wvkbd" # Hide wvkbd
# swipe down from left edge # tap with 3 fingers
", edge:l:d, exec, pamixer -d 4" ", tap:4, exec, pkill -SIGRTMIN wvkbd" # Toggles wvkbd
# swipe up with 3 fingers # swipe up from left edge
", swipe:3:u, exec, ${pkgs.nwg-drawer}/bin/nwg-drawer" ", edge:l:u, exec, pamixer -i 4"
# swipe down with 3 fingers # swipe down from left edge
", swipe:3:d, killactive" ", edge:l:d, exec, pamixer -d 4"
# swipe diagonally left and down with 3 fingers # swipe up with 3 fingers
", swipe:3:ld, exec, uwsm app -- librewolf" ", swipe:3:u, exec, ${pkgs.nwg-drawer}/bin/nwg-drawer"
# swipe diagonally right and down with 3 fingers # swipe down with 3 fingers
", swipe:3:rd, exec, uwsm app -- xournalpp" ", swipe:3:d, killactive"
# tap with 3 fingers # swipe diagonally left and down with 3 fingers
", tap:3, exec, playerctl play-pause" ", swipe:3:ld, exec, uwsm app -- librewolf"
];
# longpress can trigger mouse binds: # swipe diagonally right and down with 3 fingers
hyprgrass-bindm = [ ", swipe:3:rd, exec, uwsm app -- xournalpp"
", longpress:2, movewindow"
", longpress:3, resizewindow"
];
experimental = { # tap with 3 fingers
# send proper cancel events to windows instead of hacky touch_up events, ", tap:3, exec, playerctl play-pause"
# NOT recommended as it crashed a few times, once it's stabilized I'll make it the default ];
send_cancel = 0;
# longpress can trigger mouse binds:
hyprgrass-bindm = [
", longpress:2, movewindow"
", longpress:3, resizewindow"
];
}; };
}; };
}; };
};
}; };
} }

View file

@ -1,15 +1,9 @@
{lib, ...}: let { lib, ... }:
let
variables = { variables = {
NIXOS_OZONE_WL = 1; NIXOS_OZONE_WL = 1;
ELECTRON_OZONE_PLATFORM_HINT = "auto"; ELECTRON_OZONE_PLATFORM_HINT = "auto";
__GL_GSYNC_ALLOWED = 0;
__GL_VRR_ALLOWED = 0;
_JAVA_AWT_WM_NONEREPARENTING = 1;
DISABLE_QT5_COMPAT = 0;
GDK_BACKEND = "wayland,x11,*"; GDK_BACKEND = "wayland,x11,*";
ANKI_WAYLAND = 1;
DIRENV_LOG_FORMAT = "";
WLR_DRM_NO_ATOMIC = 1;
QT_AUTO_SCREEN_SCALE_FACTOR = 1; QT_AUTO_SCREEN_SCALE_FACTOR = 1;
QT_WAYLAND_DISABLE_WINDOWDECORATION = 1; QT_WAYLAND_DISABLE_WINDOWDECORATION = 1;
QT_QPA_PLATFORM = "wayland;xcb"; QT_QPA_PLATFORM = "wayland;xcb";
@ -19,13 +13,11 @@
SDL_VIDEODRIVER = "wayland"; SDL_VIDEODRIVER = "wayland";
CLUTTER_BACKEND = "wayland"; CLUTTER_BACKEND = "wayland";
}; };
in { in
{
home.sessionVariables = variables; home.sessionVariables = variables;
xdg.configFile."uwsm/env".text = builtins.concatStringsSep "\n" ( xdg.configFile."uwsm/env".text = builtins.concatStringsSep "\n" (
lib.attrsets.mapAttrsToList ( lib.attrsets.mapAttrsToList (name: value: "export ${name}=\"${builtins.toString value}\"") variables
name: value: "export ${name}=\"${builtins.toString value}\""
)
variables
); );
} }

View file

@ -0,0 +1 @@
200:b7b4:1291:e536:e66d:3a7e:6df1:cecd

View file

@ -0,0 +1 @@
../../../../../../sops/machines/frues-pc

View file

@ -0,0 +1,22 @@
{
"data": "ENC[AES256_GCM,data:cb6DFoAjunhjqGJ6mptyF8Gq0sRxwk/5DX7yXaS+FOzSN+PdCbXlNhRp4dNfu3bl4OxRF/RxMvkzdadkwkpjct8LsZnTjUwWVdLezqCelNt+LzSBRdrz2+J9n5UrTUR2XK/fdz89gWHK6rYVHt1rXGKnM4pDPXA=,iv:1doVMX6zSp58tTwxPeo1ySXX5u1Rv7uuEpnZTXUOWKU=,tag:d/zk+ISsok2r+M2x1rZL9g==,type:str]",
"sops": {
"age": [
{
"recipient": "age17pu3mvhwlvlffhvu2p4ut4wx60j6srdmjtk3889t9cs7jp60ws5qsc8myu",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4MFNtZmlaQm5VSGdVRWVS\nT1prRHZvLzNRMDBnNm02VEtPRi82blF5SXpJCjNhV2lheEpkRmVaZGF6Rm9NU0px\nTVU1VTE2TGE0V0tPdmhtY0ZrbXc3VFkKLS0tIDlYWittOWUyQkt1ZFRtNFhMSmti\nMlE4L2VINGJsYXhyeHRnUUJpQS9TbVEKvGTkpH6jFHrLIPXr1xIUfeWD7o8WrpVg\n81a3PKHw5PgXuOFldkOk5LW7iUI+zSYWW27n+19yM+Ko7JnVgRkt6Q==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1lrg2j5a90yy4ccj4c8yrmkk4rx029t5hfh6n5a2nte77pwlspp8qvgmtmg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqN3RveSthSS91UjQwSzVs\nRm9lS3lJelNmQWQyU1NyN1FVeTNPckloRUNFCmluR1VmOUJCbi9zaE93Y2EzQVdj\nVGFZRWgySjNqak5nM0M1VTY1UzlsWFkKLS0tIEhmQjZkOFp1bTNNUHVYNG9nd1VT\nK0JQd0k1Y0toZHN0ZkN1T2JkekdEcVUK5Cmb18yJDG5IXN2u5SDvdf6h7CepVzo1\nbBc5SrF9p9ZtwCqY2xrgz92MumHf955qS1ZYc5Qz/ZmqDdh+K06ZHQ==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1r2sw9uncvkqtklypw4rttufhw86lhhqrghed8l2kda6hdrd9ypyqm7y863",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0UnIwNVZrK1hDN1RVeDcw\naW1FSWtaNC84ZlZGRFJqbFNYbndrd1pBMTBvCmVVaUlCaGJyYWNGeGRPUEtVRHll\nVVcwbW5sVXI3bGVOZ1d5L0tIU2tQdzgKLS0tICtzRkgwL0lIZ2VoRlhaZVRuVCtr\ndVdZWmROL0Fkc3UzRHI4N0M3VVRvVU0KCavSqo9UgDRrOMpL/aVevsXyNZmlRmm1\nnpikKEEB4aJuYLFxg/7tUukb28kOKhJIQfG5nS2lxH5YIfwzxEvF6w==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-12-02T14:01:20Z",
"mac": "ENC[AES256_GCM,data:qWJswiFDqT1ma7EmdokcelESKiW8lvf6E49XnVDEdoKEa2EgEiyBy9HuKsbc8RCnHxrVHAoksa0bRFOeaJFhy30ETmUYlFT5oVU94p3bzCXJ+4gCA7jTx+Uw6qaHU6LDNVDQrEULHJ5jsX3fHNhCd+iuNo+ukCj7DYMLQftZ7W4=,iv:ioY0NyoTokhUa91tbZ71CktCEKZBZdHjsGHe7/HbQMk=,tag:LuwZZMyOVA8xSpThqL51Xg==,type:str]",
"version": "3.11.0"
}
}

View file

@ -0,0 +1 @@
../../../../../../sops/users/pedro

View file

@ -0,0 +1,3 @@
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEApCX2tw1kjMliwMkHGJkF9ESroWlA2sZWbm+TuZ9z9t8=
-----END PUBLIC KEY-----

View file

@ -0,0 +1 @@
208:59de:77d4:a7f8:8b17:362a:1e2a:4f4a

View file

@ -0,0 +1 @@
../../../../../../sops/machines/frues-port

View file

@ -0,0 +1,22 @@
{
"data": "ENC[AES256_GCM,data:s66xsaza39EBU1zKPmlt2+iYz6mRaNQ8mNRiii3IRnM9cwy6fcVY6f2tzng9GchmP81yXf476uWUehTozd/WOFX9RiZ+8kc9zYBn9OEAxkIYBdjGAi5H7wWuIAQbhULlwwv07G8lbV0MKKLx9RV1ZkvaR/QHaIs=,iv:QGhBBGmbfEaLKXw097Xj2afEF8x43g32z4ikQc8tDHo=,tag:VtCDc141e1TqjcILlFvVBw==,type:str]",
"sops": {
"age": [
{
"recipient": "age19grcgxeu95xnjtpaakcek36rjd9kzr5aqlak5m5gzmstwayglpmqyvhl87",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLdFBCMHcwOWhVeFJGM0h0\nTEM1alNkK0o5ZkV1eEM2Ukl6Z2dsZ0VFRDNJCldlWksvbFJ4YXYwMy9SUzBrOWlh\nZzhNR3R3VEFIMzlkQW56eWQ5ZEUrY0UKLS0tIHR4eTV0ZnlaRFJ3Q2cwZ28vaGhS\na0lUYVA3NG56d2JyUHY5SG0rOW1XQTgKthAyDUrc2VVqo1eQErxQgPV6FGcZsIPe\nbFtKVytyAeYdvTo3uv4jLT+qaVux9wS4OdKC2ePmGDJVm9LaKnqtxQ==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1lrg2j5a90yy4ccj4c8yrmkk4rx029t5hfh6n5a2nte77pwlspp8qvgmtmg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGWWZ5OGhHODN2UDVJWmRU\nMTNpeW1XdlZXUjViWGJpdWxGNW80eUg2NG40Cmt3SEVyd1NJMHRMQ0JPRm0rTWM5\neTB0K0tqVXE5RkNrNk1rN1B2VU5yaWcKLS0tIGtUZG9LTzZPOER5dC85M1ZPRnlv\na3J0dThRb01xWE1HWVRsM2lTN0Jjd2sK2IABW8vQ2AtqAueEWdkkH5qFEUGEg+s+\n24tBn0FtSMGZtWFxSqYkXPYZ87e8dUMoxjLgsVwWFW+dZ1fXP0EYvg==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1r2sw9uncvkqtklypw4rttufhw86lhhqrghed8l2kda6hdrd9ypyqm7y863",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBla2FFdTFhcUFWWDlOaFJR\nUkc2NEl1eDdCb0lNU3BtOUIzQlUxM0Z4TEZZCjAzNlFWNkRJSlp3cnFDTmVubU91\ncmlQKzkvZU5xNE1CVzFoOHJqMExWUEkKLS0tIEZ1ZTBGUnhKMFBtZ3NYUlJYc0lF\nWTlNam5BMFlia0Y3UkJ0L0UvaXZpR28KHmXjRJMZ860xeBOTS9IcOa/8ipaqRxv3\nxWKoD65vUY3koKCfzbHqPxVqcrFogcYcKhF79+ywL9SNWjvll12vJQ==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-12-02T14:01:29Z",
"mac": "ENC[AES256_GCM,data:LxG/reqmP9j980rYOWEpMrbOr8qb+9Qmz411wtr+xwg7JqAXjVa0EzbBIb+ObBlt5t4i7wH2dfw/R5eEcmXGMYW/O/IcfNmMPs2pmIL4EgGsdP+Owr4u+qRs3jWdaOlJ730Wo7ru9z1ZI3ISw+RxhK1LtoGbNFiWXMkm8JrrrWM=,iv:DZ0Iij8IyR1PbUfz8o6yDi0kAGfcTiLxbQtl7VTCTVo=,tag:DuqwiWfz2PuhWi0tv6AC1g==,type:str]",
"version": "3.11.0"
}
}

View file

@ -0,0 +1 @@
../../../../../../sops/users/pedro

View file

@ -0,0 +1,3 @@
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAANMQxBWsA7p0ZOrw6tha/pWl79vFqUzfXdeHM0iNYhc=
-----END PUBLIC KEY-----

View file

@ -0,0 +1 @@
200:cb0a:334b:b6bb:be70:d6c4:f5dd:64d8

View file

@ -0,0 +1 @@
../../../../../../sops/machines/frues-surface3

View file

@ -0,0 +1,22 @@
{
"data": "ENC[AES256_GCM,data:Yp132atsXuIh29lWZpGQOnAxJ6XxqrZ886l/BDwDz7NIAHBv86ItMf9+XA5MWQwJI9MWkXzCod40c1wmpjmfCYIdUrmeOi8GhX+l2nFGVF/6+qxQBy5Kl5uIaokVdMdN8R5ZppNbUhV607tSRy4vokHvi3uTGEk=,iv:BJ6CGOcoEJngKmtBup0WnIVDbptVjCYAEye0svac9Fs=,tag:xHIiXoCFsg2BEIJV9KvQ7Q==,type:str]",
"sops": {
"age": [
{
"recipient": "age1c2r28vncfxtz34kx9vzx4a7hqnmz3mtq7rfm2ldyja437dh9yfrqm0vgde",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiTm9aYm5WT2tWdW1HaG9D\nZmdVQWVSUTZDR2lSMU5ram1hbkZzNVBuaVIwCmpYYnpGNW5nRHhualN5RWhGZ2t0\nb2ZReTQ1OWdsdjRKQ3Y5YnVRVXdQRTQKLS0tIHZqcXNJZ1ovbnJTU09hVGJTejF1\nTU91NXhKZDBEcFJhbzc1VXVPUWlnc3cKgd6cL67ZLsdxUzScqyXNIr9OAbEStM4Y\nwi3hBWjxGw7DFjBZ2n5CZD+Vs7/JmzJrCHXvzXLBkxJWQCFGRwmguw==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1lrg2j5a90yy4ccj4c8yrmkk4rx029t5hfh6n5a2nte77pwlspp8qvgmtmg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3R3RZeEs2ZkFlK2dPWmln\nZjZzL1ZvQ2NZdXIrZTZndzViekJUV1daSVRVCmdvZUl6N2kvV3lGSWQyMm83b3Fo\neTZLT1BsZ0lhOHUrMWlZOHNnR0J4YkEKLS0tIFZuQ2VzQ1JkRWQ1NTJwMzVPb1N3\nMTN1dXZhKzl2cUVkTGI2OUVVWGg5ckkKR5UpBCyWGfcKMHgshYF6c+AZjw9aDvDj\n3CcKgZLNo1GNsJAiFuRL9XD+DAfryqngPFRR29d5U/G3k7l85+W8Jw==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1r2sw9uncvkqtklypw4rttufhw86lhhqrghed8l2kda6hdrd9ypyqm7y863",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBoS3FIczR1aldvUnIxTEdh\nTUMyZkFwK242UmlveDdIUlBCUzR1bGQ0RFFFClRXZ0VWblhhOUFtY0NCcmhsbEJ3\nbkU2ZVFTeHZCeWhRc0hKSkVIQUovVTQKLS0tIEFndUpWNVFMWklzaXBKeEc3WDlG\nRlorQ0FjT0IvTldzYXkzYVR6dkk3bDgKk0sBenaw4wUmvzSNATQN/W59gGg5zHm9\ngUzTN5EVrVj9zDdvLxm4Aa54pQ2Sa81tLG5NdohMQ271UxuAOZ+/+w==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-12-02T14:01:35Z",
"mac": "ENC[AES256_GCM,data:sPnb+g8jk2C/4pyHiPOogbv9D+m3S9MD1+WT4bBR//c/V2xGfVsapGithz1TnxvCLr38OLIKqjHi35st1AOxEBJwFK/LUspcqeTcX7v7Yk7DukYaQaOLNWHSqpEQ4kzjtIeZb3gEYIcUBOM4uON5kMzG8wpij7aWCXbwDq3CQI4=,iv:y0Vv7VCACZRNvn69q2jOzcAwYOiolBo7/1SlQQPFBC8=,tag:IM2Bnonxx0p3kWufmSg/9Q==,type:str]",
"version": "3.11.0"
}
}

View file

@ -0,0 +1 @@
../../../../../../sops/users/pedro

View file

@ -0,0 +1,3 @@
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAmnrmWiSiIMeUnYURTZOmd5zfaN/rN7a9putmpjJAbdw=
-----END PUBLIC KEY-----