{ config, pkgs, lib, ... }: let gameSaveBackupRoot = "${config.home.homeDirectory}/Backups/game-saves"; gameSaveLudusaviPath = "${gameSaveBackupRoot}/ludusavi"; gameSaveLutrisWinePrefix = "${config.home.homeDirectory}/Games/none"; gameSaveLutrisUserPath = "${gameSaveLutrisWinePrefix}/drive_c/users/steamuser"; gameSaveLutrisBackupPath = "${gameSaveBackupRoot}/lutris-wine-userdata"; gameSaveLudusaviBackup = pkgs.writeShellScript "game-save-ludusavi-backup" '' set -eu ${pkgs.coreutils}/bin/mkdir -p ${lib.escapeShellArg gameSaveLudusaviPath} ${pkgs.ludusavi}/bin/ludusavi \ --try-manifest-update \ backup \ --path ${lib.escapeShellArg gameSaveLudusaviPath} \ --format simple \ --full-limit 14 \ --differential-limit 14 \ --force if [ ! -d ${lib.escapeShellArg gameSaveLutrisUserPath} ]; then echo "Skipping Lutris Wine user-data snapshot: missing ${gameSaveLutrisUserPath}" >&2 exit 0 fi snapshot_root=${lib.escapeShellArg "${gameSaveLutrisBackupPath}/snapshots"} snapshot="$snapshot_root/backup-$(${pkgs.coreutils}/bin/date -u +%Y%m%dT%H%M%SZ)" latest_link=${lib.escapeShellArg "${gameSaveLutrisBackupPath}/latest"} link_dest_args=() ${pkgs.coreutils}/bin/mkdir -p "$snapshot_root" if [ -L "$latest_link" ]; then latest_target="$(${pkgs.coreutils}/bin/readlink -f "$latest_link" || true)" if [ -n "$latest_target" ] && [ -d "$latest_target" ]; then link_dest_args=(--link-dest "$latest_target") fi fi ${pkgs.rsync}/bin/rsync -a --delete \ "''${link_dest_args[@]}" \ ${lib.escapeShellArg "${gameSaveLutrisUserPath}/"} \ "$snapshot/" ${pkgs.coreutils}/bin/ln -sfn "$snapshot" "$latest_link" ${pkgs.findutils}/bin/find "$snapshot_root" -mindepth 1 -maxdepth 1 -type d \ -printf '%T@ %p\n' \ | ${pkgs.coreutils}/bin/sort -rn \ | ${pkgs.coreutils}/bin/tail -n +15 \ | ${pkgs.gnused}/bin/sed 's/^[^ ]* //' \ | ${pkgs.findutils}/bin/xargs -r ${pkgs.coreutils}/bin/rm -rf ''; opencodeWithLibstdcxx = pkgs.symlinkJoin { name = "opencode"; paths = [ pkgs.unstable.opencode ]; nativeBuildInputs = [ pkgs.makeWrapper ]; postBuild = '' wrapProgram $out/bin/opencode \ --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ pkgs.stdenv.cc.cc.lib ]} ''; }; in { home.username = "ltadeu6"; home.homeDirectory = "/home/ltadeu6"; home.stateVersion = "25.11"; programs.kitty = { enable = true; settings = { font_family = "FiraCode Nerd Font Mono"; bold_font = "auto"; italic_font = "auto"; bold_italic_font = "auto"; font_size = 16.0; disable_ligatures = "cursor"; copy_on_select = "yes"; strip_trailing_spaces = "smart"; enable_audio_bell = "no"; remember_window_size = "no"; initial_window_width = 900; initial_window_height = 500; window_padding_width = 15.0; confirm_os_window_close = 0; background_opacity = 1; dynamic_background_opacity = "yes"; foreground = "#f8f8f2"; background = "#282a36"; selection_foreground = "#ffffff"; selection_background = "#44475a"; url_color = "#8be9fd"; color0 = "#21222c"; color8 = "#6272a4"; color1 = "#ff5555"; color9 = "#ff6e6e"; color2 = "#50fa7b"; color10 = "#69ff94"; color3 = "#f1fa8c"; color11 = "#ffffa5"; color4 = "#bd93f9"; color12 = "#d6acff"; color5 = "#ff79c6"; color13 = "#ff92df"; color6 = "#8be9fd"; color14 = "#a4ffff"; color7 = "#f8f8f2"; color15 = "#ffffff"; cursor = "#f8f8f2"; cursor_text_color = "background"; active_tab_foreground = "#282a36"; active_tab_background = "#f8f8f2"; inactive_tab_foreground = "#282a36"; inactive_tab_background = "#6272a4"; mark1_foreground = "#282a36"; mark1_background = "#ff5555"; shell = "fish"; editor = "nvim"; close_on_child_death = "yes"; term = "xterm-kitty"; }; }; services.dunst = { enable = true; settings = { global = { monitor = 0; follow = "none"; width = "(400, 700)"; height = 300; origin = "bottom-right"; offset = "20x20"; scale = 0; notification_limit = 20; progress_bar = false; icon_corner_radius = 12; icon_corners = "all"; indicate_hidden = true; transparency = 20; separator_height = 2; padding = 15; horizontal_padding = 15; text_icon_padding = 15; frame_width = 3; frame_color = "#ff2e97"; background = "#0c0a20"; foreground = "#f2f3f7"; gap_size = 0; separator_color = "frame"; sort = true; font = "GohuFont 14 Nerd Font Mono"; line_height = 0; markup = "full"; format = "%s\n%b"; alignment = "left"; vertical_alignment = "center"; show_age_threshold = 60; ellipsize = "middle"; ignore_newline = false; stack_duplicates = true; hide_duplicate_count = false; show_indicators = true; enable_recursive_icon_lookup = true; icon_theme = "Papirus"; icon_position = "left"; min_icon_size = 48; max_icon_size = 64; }; }; }; gtk = { enable = true; theme = { name = "Adwaita-dark"; package = pkgs.gnome-themes-extra; }; iconTheme = { name = "Adwaita"; package = pkgs.adwaita-icon-theme; }; font = { name = "Sans"; size = 10; }; gtk3.extraConfig = { gtk-application-prefer-dark-theme = 1; gtk-toolbar-style = "GTK_TOOLBAR_ICONS"; gtk-toolbar-icon-size = "GTK_ICON_SIZE_LARGE_TOOLBAR"; gtk-button-images = 0; gtk-menu-images = 0; gtk-enable-event-sounds = 1; gtk-enable-input-feedback-sounds = 0; gtk-xft-antialias = 1; gtk-xft-hinting = 1; gtk-xft-hintstyle = "hintmedium"; gtk-xft-rgba = "rgb"; }; }; home.pointerCursor = { gtk.enable = true; x11.enable = true; name = "Breeze"; package = pkgs.kdePackages.breeze; size = 30; }; xdg.mimeApps = { enable = true; defaultApplications = { "x-scheme-handler/discord-402572971681644545" = [ "discord-402572971681644545.desktop" ]; "application/pdf" = [ "org.gnome.Evince.desktop" ]; "x-scheme-handler/http" = [ "zen.desktop" ]; "x-scheme-handler/https" = [ "zen.desktop" ]; "x-scheme-handler/chrome" = [ "zen.desktop" ]; "text/html" = [ "zen.desktop" ]; "application/x-extension-htm" = [ "zen.desktop" ]; "application/x-extension-html" = [ "zen.desktop" ]; "application/x-extension-shtml" = [ "zen.desktop" ]; "application/xhtml+xml" = [ "zen.desktop" ]; "application/x-extension-xhtml" = [ "zen.desktop" ]; "application/x-extension-xht" = [ "zen.desktop" ]; "image/png" = [ "org.gnome.eog.desktop" ]; "image/svg+xml" = [ "org.inkscape.Inkscape.desktop" ]; "image/jpeg" = [ "org.gnome.eog.desktop" ]; "video/x-matroska" = [ "mpv.desktop" ]; }; associations.added = { "application/pdf" = [ "org.gnome.Evince.desktop" ]; "x-scheme-handler/http" = [ "zen.desktop" ]; "x-scheme-handler/https" = [ "zen.desktop" ]; "x-scheme-handler/chrome" = [ "zen.desktop" ]; "text/html" = [ "zen.desktop" ]; "application/x-extension-htm" = [ "zen.desktop" ]; "application/x-extension-html" = [ "zen.desktop" ]; "application/x-extension-shtml" = [ "zen.desktop" ]; "application/xhtml+xml" = [ "zen.desktop" ]; "application/x-extension-xhtml" = [ "zen.desktop" ]; "application/x-extension-xht" = [ "zen.desktop" ]; "image/png" = [ "org.gnome.eog.desktop" ]; "application/x-partial-download" = [ "mpv.desktop" ]; "image/svg+xml" = [ "org.inkscape.Inkscape.desktop" ]; "text/plain" = [ "emacs.desktop" ]; "image/jpeg" = [ "org.gnome.eog.desktop" ]; "video/x-matroska" = [ "mpv.desktop" ]; }; }; xdg.userDirs = { enable = true; createDirectories = true; desktop = "$HOME/Área de trabalho"; download = "$HOME/Downloads"; templates = "$HOME/Modelos"; publicShare = "$HOME/Público"; documents = "$HOME/Documentos"; music = "$HOME/Músicas"; pictures = "$HOME/Imagens"; videos = "$HOME/Vídeos"; }; home.sessionVariables = { MANPAGER = "most"; HYPRCURSOR_THEME = "Breeze"; HYPRCURSOR_SIZE = "30"; QT_QPA_PLATFORMTHEME = "qt6ct"; }; home.packages = with pkgs; [ tor-browser texlive.combined.scheme-full foliate aria2 varia waybar hyprpaper sshfs pass papirus-icon-theme trash-cli libreoffice eza wofi killall python3 python3Packages.requests cmake gnumake ripgrep fd ffmpeg nixfmt-classic editorconfig-core-c man hyprpicker networkmanager ludusavi prismlauncher gimp inkscape blender discord-ptb vscode direnv unzip unstable.codex opencodeWithLibstdcxx claude-code zip file-roller clang-tools libxml2 gdtoolkit_4 bat alpaca ispell cartridges libvterm libgccjit pavucontrol playerctl mpv tenacity gnome-connections jsbeautifier tmux stylelint html-tidy shfmt shellcheck black isort pipenv jq grim slurp wl-clipboard nodejs texlab gnome-boxes android-studio sageWithDoc evince poppler-utils ]; home.file = { ".config/hypr/hyprland.conf".source = ../configs/hypr/hyprland.conf; ".config/hypr/hyprpaper.conf".text = '' preload = ${config.home.homeDirectory}/.config/hypr/nixos.png #if more than one preload is desired then continue to preload other backgrounds #set the default wallpaper(s) seen on initial workspace(s) --depending on the number of monitors used wallpaper = , ${config.home.homeDirectory}/.config/hypr/nixos.png splash = false ''; ".config/hypr/nixos.png".source = ../configs/hypr/nixos.png; ".config/hypr/scripts/screenshot-active-window.sh" = { executable = true; text = '' #!/usr/bin/env sh set -eu GEOMETRY="$( hyprctl activewindow -j \ | jq -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"' )" grim -g "$GEOMETRY" - | wl-copy --type image/png ''; }; ".config/hyfetch.json".text = builtins.toJSON { preset = "voidgirl"; mode = "rgb"; light_dark = "dark"; lightness = 0.65; color_align = { mode = "custom"; custom_colors = { "1" = 2; "2" = 0; }; fore_back = [ ]; }; backend = "neofetch"; args = null; distro = null; pride_month_shown = [ ]; pride_month_disable = false; }; ".config/waybar/config".source = ../configs/waybar/config; ".config/waybar/style.css".source = ../configs/waybar/style.css; ".config/waybar/dracula.css".source = ../configs/waybar/dracula.css; ".config/waybar/air_control.py" = { source = ../configs/waybar/air_control.py; executable = true; }; ".config/waybar/spotify_status.sh" = { source = ../configs/waybar/spotify_status.sh; executable = true; }; ".config/waybar/launch.sh" = { source = ../configs/waybar/launch.sh; executable = true; }; ".config/waybar/switch_sink.sh" = { source = ../configs/waybar/switch_sink.sh; executable = true; }; ".config/doom/config.el".source = ../configs/doom/config.el; ".config/doom/init.el".source = ../configs/doom/init.el; ".config/doom/packages.el".source = ../configs/doom/packages.el; ".config/wofi/config".source = ../configs/wofi/config; ".config/wofi/style.css".source = ../configs/wofi/style.css; ".config/wofi/menu".source = ../configs/wofi/menu; ".config/wofi/menu.css".source = ../configs/wofi/menu.css; }; systemd.user.services.game-save-ludusavi-backup = { Unit.Description = "Back up game saves with Ludusavi"; Service = { Type = "oneshot"; ExecStart = "${gameSaveLudusaviBackup}"; }; }; systemd.user.timers.game-save-ludusavi-backup = { Unit.Description = "Run Ludusavi game-save backup"; Timer = { OnCalendar = "hourly"; Persistent = true; RandomizedDelaySec = "10min"; }; Install.WantedBy = [ "timers.target" ]; }; home.activation.ociCredentials = lib.hm.dag.entryAfter [ "writeBoundary" ] '' set -euo pipefail key_file="/run/agenix/oci_key" config_file="/run/agenix/oci_config" if [ -r "$key_file" ] && [ -r "$config_file" ]; then mkdir -p "$HOME/.oci" chmod 700 "$HOME/.oci" ln -sf "$key_file" "$HOME/.oci/key.pem" ln -sf "$config_file" "$HOME/.oci/config" fi ''; home.activation.openclawGatewayEnv = lib.hm.dag.entryAfter [ "writeBoundary" ] '' set -euo pipefail token_file="/run/agenix/openclaw_gateway_token" env_file="$HOME/.config/openclaw/gateway.env" if [ -r "$token_file" ]; then mkdir -p "$(dirname "$env_file")" umask 177 printf 'OPENCLAW_GATEWAY_TOKEN=%s\n' "$(cat "$token_file")" > "$env_file" fi ''; home.activation.importZenFlatpakProfile = lib.hm.dag.entryAfter [ "writeBoundary" ] '' set -euo pipefail src_dir="$HOME/.var/app/app.zen_browser.zen/.zen" dst_dir="$HOME/.zen" tmp_dir="$HOME/.zen.hm-import" preferred_profile="ajei92g8.Default (release)" if [ -e "$dst_dir/profiles.ini" ] || [ ! -d "$src_dir" ]; then : else rm -rf "$tmp_dir" cp -a "$src_dir" "$tmp_dir" find "$tmp_dir" \( -name lock -o -name .parentlock \) -delete mv "$tmp_dir" "$dst_dir" fi if [ -d "$dst_dir/$preferred_profile" ]; then ${pkgs.python3}/bin/python3 - "$dst_dir" "$preferred_profile" <<'PY' import configparser import sys from pathlib import Path base = Path(sys.argv[1]) preferred = sys.argv[2] profiles_ini = base / "profiles.ini" if profiles_ini.exists(): parser = configparser.RawConfigParser() parser.optionxform = str parser.read(profiles_ini) for section in parser.sections(): if not section.startswith("Profile"): continue if parser.has_option(section, "Path"): path = parser.get(section, "Path") if path == preferred: parser.set(section, "Default", "1") elif parser.has_option(section, "Default"): parser.remove_option(section, "Default") with profiles_ini.open("w") as f: parser.write(f, space_around_delimiters=False) install_id = None for section in parser.sections(): if section.startswith("Install"): install_id = section.removeprefix("Install") break installs_ini = base / "installs.ini" installs = configparser.RawConfigParser() installs.optionxform = str if installs_ini.exists(): installs.read(installs_ini) if install_id is None: install_id = "2953CB39A2589173" if not installs.has_section(install_id): installs.add_section(install_id) installs.set(install_id, "Default", preferred) installs.set(install_id, "Locked", "1") with installs_ini.open("w") as f: installs.write(f, space_around_delimiters=False) PY fi ''; services.spotifyd = { enable = true; settings.global = { backend = "pulseaudio"; device_name = "Nixos Desktop"; use_mpris = true; }; }; programs.mangohud = { enable = true; enableSessionWide = true; }; programs.home-manager.enable = true; programs.ssh = { enable = true; enableDefaultConfig = false; matchBlocks = { termux = { hostname = "pixel-7a"; user = "u0_a254"; port = 8022; }; win11 = { hostname = "win11"; user = "user"; extraOptions = { RemoteCommand = "powershell -NoLogo"; RequestTTY = "yes"; }; }; }; }; }