From 24381b60f1fe7c54ff0d9c330e3932751464df13 Mon Sep 17 00:00:00 2001 From: Quinn Unger Date: Sat, 4 Jul 2026 15:20:10 +0100 Subject: [PATCH] move config from sidonia flake to dotfiles --- common/default.nix | 17 ++ common/hm/compositor/default.nix | 13 + common/hm/compositor/keybinds.nix | 331 +++++++++++++++++++++ common/hm/compositor/niri.nix | 105 +++++++ common/hm/default.nix | 20 ++ common/hm/gtk.nix | 47 +++ common/hm/keyring.nix | 14 + common/hm/noctalia/compositorOverrides.nix | 37 +++ common/hm/noctalia/default.nix | 14 + common/hm/noctalia/keybinds.nix | 86 ++++++ common/hm/noctalia/noctalia.nix | 94 ++++++ common/hm/packages.nix | 20 ++ common/hm/pointerCursor.nix | 24 ++ common/hm/programs/bemenu.nix | 48 +++ common/hm/programs/default.nix | 22 ++ common/hm/programs/defaultApps.nix | 56 ++++ common/hm/programs/foot.nix | 47 +++ common/hm/programs/gtkwave.nix | 26 ++ common/hm/programs/helix/default.nix | 15 + common/hm/programs/helix/fusesoc.nix | 34 +++ common/hm/programs/helix/haskell.nix | 16 + common/hm/programs/helix/helix.nix | 44 +++ common/hm/programs/helix/verilog.nix | 90 ++++++ common/hm/programs/missioncenter.nix | 24 ++ common/hm/programs/nemo.nix | 45 +++ common/hm/programs/sublime.nix | 55 ++++ common/hm/programs/vscodium.nix | 53 ++++ common/hm/programs/zenBrowser.nix | 17 ++ common/hm/programs/zsh.nix | 94 ++++++ common/hm/qt.nix | 17 ++ common/hm/xdg.nix | 49 +++ common/os/configuration.nix | 173 +++++++++++ common/os/default.nix | 18 ++ common/os/niri.nix | 18 ++ common/os/programs/default.nix | 9 + common/os/programs/steam.nix | 61 ++++ common/os/services/coreServices.nix | 66 ++++ common/os/services/default.nix | 14 + common/os/services/displayManager.nix | 26 ++ common/os/services/distributedBuilds.nix | 144 +++++++++ common/os/services/vr.nix | 51 ++++ common/os/tweaks/audio.nix | 157 ++++++++++ common/os/tweaks/default.nix | 12 + common/os/tweaks/memory.nix | 139 +++++++++ flake.lock | 280 +---------------- flake.nix | 12 +- hosts/tsumugi/gameServers/default.nix | 4 - hosts/tsumugi/gameServers/palworld.nix | 19 -- 48 files changed, 2466 insertions(+), 311 deletions(-) create mode 100644 common/default.nix create mode 100644 common/hm/compositor/default.nix create mode 100644 common/hm/compositor/keybinds.nix create mode 100644 common/hm/compositor/niri.nix create mode 100644 common/hm/default.nix create mode 100644 common/hm/gtk.nix create mode 100644 common/hm/keyring.nix create mode 100644 common/hm/noctalia/compositorOverrides.nix create mode 100644 common/hm/noctalia/default.nix create mode 100644 common/hm/noctalia/keybinds.nix create mode 100644 common/hm/noctalia/noctalia.nix create mode 100644 common/hm/packages.nix create mode 100644 common/hm/pointerCursor.nix create mode 100644 common/hm/programs/bemenu.nix create mode 100644 common/hm/programs/default.nix create mode 100644 common/hm/programs/defaultApps.nix create mode 100644 common/hm/programs/foot.nix create mode 100644 common/hm/programs/gtkwave.nix create mode 100644 common/hm/programs/helix/default.nix create mode 100644 common/hm/programs/helix/fusesoc.nix create mode 100644 common/hm/programs/helix/haskell.nix create mode 100644 common/hm/programs/helix/helix.nix create mode 100644 common/hm/programs/helix/verilog.nix create mode 100644 common/hm/programs/missioncenter.nix create mode 100644 common/hm/programs/nemo.nix create mode 100644 common/hm/programs/sublime.nix create mode 100644 common/hm/programs/vscodium.nix create mode 100644 common/hm/programs/zenBrowser.nix create mode 100644 common/hm/programs/zsh.nix create mode 100644 common/hm/qt.nix create mode 100644 common/hm/xdg.nix create mode 100644 common/os/configuration.nix create mode 100644 common/os/default.nix create mode 100644 common/os/niri.nix create mode 100644 common/os/programs/default.nix create mode 100644 common/os/programs/steam.nix create mode 100644 common/os/services/coreServices.nix create mode 100644 common/os/services/default.nix create mode 100644 common/os/services/displayManager.nix create mode 100644 common/os/services/distributedBuilds.nix create mode 100644 common/os/services/vr.nix create mode 100644 common/os/tweaks/audio.nix create mode 100644 common/os/tweaks/default.nix create mode 100644 common/os/tweaks/memory.nix delete mode 100644 hosts/tsumugi/gameServers/palworld.nix diff --git a/common/default.nix b/common/default.nix new file mode 100644 index 0000000..79d5df2 --- /dev/null +++ b/common/default.nix @@ -0,0 +1,17 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; +in +{ + imports = [ + ./os + ]; + home-manager.users.${cfg.userName}.imports = [ + ./hm + ]; +} diff --git a/common/hm/compositor/default.nix b/common/hm/compositor/default.nix new file mode 100644 index 0000000..17f2e17 --- /dev/null +++ b/common/hm/compositor/default.nix @@ -0,0 +1,13 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + imports = [ + ./niri.nix + ./keybinds.nix + ]; +} diff --git a/common/hm/compositor/keybinds.nix b/common/hm/compositor/keybinds.nix new file mode 100644 index 0000000..e545ffd --- /dev/null +++ b/common/hm/compositor/keybinds.nix @@ -0,0 +1,331 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf cfg.desktop.enable { + wayland.desktopManager.sidonia.keybinds = [ + { + name = "Close Active Window"; + mod = [ + "Super" + "Shift" + ]; + key = "C"; + perCompositor.niri = { + _props.repeat = false; + close-window = [ ]; + }; + } + { + name = "Close Active Window"; + mod = "Super"; + key = "MouseMiddle"; + perCompositor.niri = { + _props.repeat = false; + close-window = [ ]; + }; + } + { + name = "Exit Session"; + mod = [ + "Super" + "Shift" + ]; + key = "Q"; + perCompositor.niri.quit = [ ]; + } + { + name = "Toggle Window Floating"; + mod = "Super"; + key = "V"; + perCompositor.niri.toggle-window-floating = [ ]; + } + { + name = "Switch Focus Between Floating and Tiling"; + mod = [ + "Super" + "Shift" + ]; + key = "V"; + perCompositor.niri.switch-focus-between-floating-and-tiling = [ ]; + } + { + name = "Maximize Column"; + mod = [ + "Super" + "Alt" + ]; + key = "F"; + perCompositor.niri.maximize-column = [ ]; + } + { + name = "Toggle Fullscreen"; + mod = "Super"; + key = "F"; + perCompositor.niri.fullscreen-window = [ ]; + } + { + name = "Move Focus Left"; + mod = "Super"; + key = "H"; + perCompositor.niri.focus-column-left = [ ]; + } + { + name = "Move Focus Right"; + mod = "Super"; + key = "L"; + perCompositor.niri.focus-column-right = [ ]; + } + { + name = "Move Column Left"; + mod = [ + "Super" + "Shift" + ]; + key = "H"; + perCompositor.niri.move-column-left = [ ]; + } + { + name = "Move Column Left"; + mod = "Super"; + key = "MouseForward"; + perCompositor.niri.move-column-left = [ ]; + } + { + name = "Move Column Right"; + mod = [ + "Super" + "Shift" + ]; + key = "L"; + perCompositor.niri.move-column-right = [ ]; + } + { + name = "Move Column Right"; + mod = "Super"; + key = "MouseBack"; + perCompositor.niri.move-column-right = [ ]; + } + { + name = "Decrease Column Width"; + mod = [ + "Super" + "Alt" + ]; + key = "H"; + perCompositor.niri.switch-preset-column-width-back = [ ]; + } + { + name = "Decrease Column Width"; + mod = [ + "Super" + "Alt" + ]; + key = "WheelScrollDown"; + perCompositor.niri.switch-preset-column-width-back = [ ]; + } + { + name = "Increase Column Width"; + mod = [ + "Super" + "Alt" + ]; + key = "L"; + perCompositor.niri.switch-preset-column-width = [ ]; + } + { + name = "Increase Column Width"; + mod = [ + "Super" + "Alt" + ]; + key = "WheelScrollUp"; + perCompositor.niri.switch-preset-column-width = [ ]; + } + { + name = "Move Focus Down"; + mod = "Super"; + key = "J"; + perCompositor.niri.focus-window-or-workspace-down = [ ]; + } + { + name = "Move Focus Up"; + mod = "Super"; + key = "K"; + perCompositor.niri.focus-window-or-workspace-up = [ ]; + } + { + name = "Focus Monitor Right"; + mod = "Super"; + key = "Period"; + perCompositor.niri.focus-monitor-right = [ ]; + } + { + name = "Focus Monitor Left"; + mod = "Super"; + key = "Comma"; + perCompositor.niri.focus-monitor-left = [ ]; + } + { + name = "Center Column"; + mod = "Super"; + key = "B"; + perCompositor.niri.center-column = [ ]; + } + { + name = "Move Window Down"; + mod = [ + "Super" + "Shift" + ]; + key = "J"; + perCompositor.niri.move-window-down-or-to-workspace-down = [ ]; + } + { + name = "Move Window Up"; + mod = [ + "Super" + "Shift" + ]; + key = "K"; + perCompositor.niri.move-window-up-or-to-workspace-up = [ ]; + } + { + name = "Move Column to Right Monitor"; + mod = [ + "Super" + "Shift" + ]; + key = "Period"; + perCompositor.niri.move-column-to-monitor-right = [ ]; + } + { + name = "Move Column to Left Monitor"; + mod = [ + "Super" + "Shift" + ]; + key = "Comma"; + perCompositor.niri.move-column-to-monitor-left = [ ]; + } + { + name = "Screenshot Monitor"; + key = "Print"; + perCompositor.niri.screenshot-screen = [ ]; + } + { + name = "Screenshot Window"; + mod = "Super"; + key = "Print"; + perCompositor.niri.screenshot-window = [ ]; + } + { + name = "Screenshot Region"; + mod = [ + "Super" + "Shift" + ]; + key = "Print"; + perCompositor.niri.screenshot = [ ]; + } + { + name = "Scroll to Next Workspace"; + mod = "Super"; + key = "WheelScrollDown"; + perCompositor.niri = { + _props.cooldown-ms = 150; + focus-workspace-down = [ ]; + }; + } + { + name = "Scroll to Prev Workspace"; + mod = "Super"; + key = "WheelScrollUp"; + perCompositor.niri = { + _props.cooldown-ms = 150; + focus-workspace-up = [ ]; + }; + } + { + name = "Scroll Layout Right"; + mod = [ + "Super" + "Shift" + ]; + key = "WheelScrollDown"; + perCompositor.niri = { + _props.cooldown-ms = 150; + focus-column-right = [ ]; + }; + } + { + name = "Scroll Layout Left"; + mod = [ + "Super" + "Shift" + ]; + key = "WheelScrollUp"; + perCompositor.niri = { + _props.cooldown-ms = 150; + focus-column-left = [ ]; + }; + } + { + name = "Toggle Overview"; + mod = "Super"; + key = "Space"; + perCompositor.niri = { + _props.repeat = false; + toggle-overview = [ ]; + }; + } + ] + ++ (builtins.concatLists ( + let + count = 10; + in + builtins.genList ( + x: + let + index = x + 1; + key = toString (lib.mod index count); + name = toString index; + in + [ + { + name = "Focus Workspace ${name}"; + mod = "Super"; + inherit key; + perCompositor.niri.focus-workspace = index; + } + { + name = "Move Window to Workspace ${name}"; + mod = [ + "Super" + "Shift" + ]; + inherit key; + perCompositor.niri.move-window-to-workspace = index; + } + { + name = "Move Window to Workspace ${name} (No Focus)"; + mod = [ + "Super" + "Ctrl" + ]; + inherit key; + perCompositor.niri.move-window-to-workspace = { + _props.focus = false; + _args = [ index ]; + }; + } + ] + ) count + )); +} diff --git a/common/hm/compositor/niri.nix b/common/hm/compositor/niri.nix new file mode 100644 index 0000000..51db955 --- /dev/null +++ b/common/hm/compositor/niri.nix @@ -0,0 +1,105 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; + inherit (config.wayland.desktopManager.sidonia) window; +in +lib.mkIf (cfg.desktop.enable && (cfg.desktop.compositor == "niri")) { + home.packages = [ + pkgs.xwayland-satellite-unstable + pkgs.wl-clipboard + ]; + wayland.windowManager.niri = { + enable = true; + package = osConfig.programs.niri.package; + settings = lib.mkMerge [ + { + # see: https://codeberg.org/BANanaD3V/niri-nix/src/branch/main/home-options.md + environment = builtins.mapAttrs (n: v: lib.mkDefault v) { + CLUTTER_BACKEND = "wayland"; + ELECTRON_ENABLE_WAYLAND = "1"; + ELECTRON_OZONE_PLATFORM_HINT = "wayland"; + ELM_DISPLAY = "wl"; + MOZ_DBUS_REMOTE = "1"; + MOZ_DISABLE_RDD_SANDBOX = "1"; + MOZ_ENABLE_WAYLAND = "1"; + NIXOS_OZONE_WL = "1"; + QT_AUTO_SCREEN_SCALE_FACTOR = "1"; + QT_ENABLE_HIGHDPI_SCALING = "1"; + QT_QPA_PLATFORM = "wayland;xcb"; + QT_QPA_PLATFORMTHEME = "gtk3"; + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + SDL_VIDEODRIVER = "wayland,x11"; + SDL_VIDEO_DRIVER = "wayland,x11"; + _JAVA_AWT_WM_NONREPARENTING = "1"; + }; + cursor = { + hide-when-typing = [ ]; + hide-after-inactive-ms = lib.mkDefault 5000; + xcursor-size = config.home.pointerCursor.size; + }; + + input = { + warp-mouse-to-focus._props.mode = lib.mkDefault "center-xy"; + }; + + xwayland-satellite.path = lib.mkDefault (lib.getExe pkgs.xwayland-satellite-unstable); + + prefer-no-csd = [ ]; + window-rule = [ + { + open-fullscreen = false; + shadow.off = [ ]; + draw-border-with-background = false; + opacity = 1.; + geometry-corner-radius = window.decoration.rounding; + } + { + match._props.is-focused = false; + opacity = window.decoration.opacity.dec; + } + ]; + layer-rule = [ { shadow.off = [ ]; } ]; + layout = { + always-center-single-column = [ ]; + shadow.off = [ ]; + focus-ring = { + on = [ ]; + width = lib.mkDefault window.decoration.borderWidth; + }; + border = { + off = [ ]; + width = lib.mkDefault window.decoration.borderWidth; + }; + default-column-width.proportion = lib.mkDefault 0.5; + preset-column-widths._children = [ + { proportion = 1. / 3.; } + { proportion = 1. / 2.; } + { proportion = 2. / 3.; } + { proportion = 1.; } + ]; + }; + overview.workspace-shadow.off = [ ]; + hotkey-overlay.skip-at-startup = [ ]; + gestures.hot-corners.off = [ ]; + } + (lib.mkIf (!cfg.graphics.legacyGpu) { + window-rule = [ + { + background-effect.blur = true; + popups.background-effect.xray = false; + } + { + match._props.is-floating = true; + background-effect.xray = false; + } + ]; + }) + ]; + }; +} diff --git a/common/hm/default.nix b/common/hm/default.nix new file mode 100644 index 0000000..fa3b25a --- /dev/null +++ b/common/hm/default.nix @@ -0,0 +1,20 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + imports = [ + ./compositor + ./noctalia + ./programs + ./gtk.nix + ./keyring.nix + ./packages.nix + ./pointerCursor.nix + ./qt.nix + ./xdg.nix + ]; +} diff --git a/common/hm/gtk.nix b/common/hm/gtk.nix new file mode 100644 index 0000000..6f72144 --- /dev/null +++ b/common/hm/gtk.nix @@ -0,0 +1,47 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + + home.packages = [ pkgs.nwg-look ]; + + dconf.settings = with lib.gvariant; { + "org/gnome/desktop/interface" = { + color-scheme = if config.catppuccin.flavor == "latte" then "prefer-light" else "prefer-dark"; + }; + }; + gtk = { + enable = true; + gtk4.theme = config.gtk.theme; + theme = + let + shade = if config.catppuccin.flavor == "latte" then "light" else "dark"; + doTweak = builtins.elem config.catppuccin.flavor [ + "frappe" + "macchiato" + ]; + in + { + package = pkgs.magnetic-catppuccin-gtk.override { + inherit shade; + tweaks = lib.optional doTweak config.catppuccin.flavor; + accent = [ config.catppuccin.accent ]; + }; + name = lib.strings.concatStringsSep "-" ( + [ + "Catppuccin-GTK" + (cfg.lib.capitalize config.catppuccin.accent) + (cfg.lib.capitalize shade) + ] + ++ (lib.optional doTweak (cfg.lib.capitalize config.catppuccin.flavor)) + ); + }; + }; +} diff --git a/common/hm/keyring.nix b/common/hm/keyring.nix new file mode 100644 index 0000000..7222986 --- /dev/null +++ b/common/hm/keyring.nix @@ -0,0 +1,14 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + services.gnome-keyring.enable = true; + xdg.portal.config.common."org.freedesktop.impl.portal.Secret" = [ "gnome-keyring" ]; +} diff --git a/common/hm/noctalia/compositorOverrides.nix b/common/hm/noctalia/compositorOverrides.nix new file mode 100644 index 0000000..8fe9a45 --- /dev/null +++ b/common/hm/noctalia/compositorOverrides.nix @@ -0,0 +1,37 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf + (cfg.desktop.enable && (cfg.desktop.compositor == "niri") && (cfg.desktop.shell == "noctalia")) + { + wayland.desktopManager.sidonia.window.decoration.rounding = 20; + wayland.windowManager.niri.settings = { + window-rule = [ + { clip-to-geometry = true; } + { + match._props.app-id = "dev.noctalia.Noctalia.Settings"; + open-floating = true; + default-column-width.fixed = 1080; + default-window-height.fixed = 920; + } + ]; + layer-rule = [ + { + match._props.namespace._raw = ''r#"^noctalia-backdrop"#''; + place-within-backdrop = true; + } + (lib.mkIf (!cfg.graphics.legacyGpu) { + match._props.namespace._raw = ''r#"^noctalia-(bar-main|notification|dock|panel)$"#''; + background-effect.xray = false; + }) + ]; + debug.honor-xdg-activation-with-invalid-serial = [ ]; + }; + } diff --git a/common/hm/noctalia/default.nix b/common/hm/noctalia/default.nix new file mode 100644 index 0000000..71070d5 --- /dev/null +++ b/common/hm/noctalia/default.nix @@ -0,0 +1,14 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + imports = [ + ./compositorOverrides.nix + ./keybinds.nix + ./noctalia.nix + ]; +} diff --git a/common/hm/noctalia/keybinds.nix b/common/hm/noctalia/keybinds.nix new file mode 100644 index 0000000..c477f4e --- /dev/null +++ b/common/hm/noctalia/keybinds.nix @@ -0,0 +1,86 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable && (cfg.desktop.shell == "noctalia")) { + wayland.desktopManager.sidonia.keybinds = + let + noctalia = args: "noctalia msg ${args}"; + in + [ + { + name = "Toggle Launcher"; + mod = "super"; + key = "p"; + exec = noctalia "panel-toggle launcher"; + } + { + name = "Toggle Session Menu"; + mod = "super"; + key = "q"; + exec = noctalia "panel-toggle session"; + } + { + name = "Lock Screen"; + mod = "super"; + key = "x"; + exec = noctalia "screen-lock"; + } + { + name = "Volume Up"; + key = "XF86AudioRaiseVolume"; + exec = noctalia "volume-up"; + } + { + name = "Volume Down"; + key = "XF86AudioLowerVolume"; + exec = noctalia "volume-down"; + } + { + name = "Mute Output"; + key = "XF86AudioMute"; + exec = noctalia "volume-mute"; + } + { + name = "Mute Input"; + key = "XF86AudioMicMute"; + exec = noctalia "mic-mute"; + } + { + name = "Media Play"; + key = "XF86AudioPlay"; + exec = noctalia "media toggle"; + } + { + name = "Media Pause"; + key = "XF86AudioPause"; + exec = noctalia "media toggle"; + } + { + name = "Media Next"; + key = "XF86AudioNext"; + exec = noctalia "media next"; + } + { + name = "Media Prev"; + key = "XF86AudioPrev"; + exec = noctalia "media previous"; + } + { + name = "Brightness Up"; + key = "XF86MonBrightnessUp"; + exec = noctalia "brightness-up"; + } + { + name = "Brightness Down"; + key = "XF86MonBrightnessDown"; + exec = noctalia "brightness-down"; + } + ]; +} diff --git a/common/hm/noctalia/noctalia.nix b/common/hm/noctalia/noctalia.nix new file mode 100644 index 0000000..0dc165f --- /dev/null +++ b/common/hm/noctalia/noctalia.nix @@ -0,0 +1,94 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; + opacity = config.wayland.desktopManager.sidonia.window.decoration.opacity.dec; +in +lib.mkIf (cfg.desktop.enable && (cfg.desktop.shell == "noctalia")) { + programs.noctalia = { + enable = true; + systemd.enable = lib.mkDefault true; + settings = { + weather = lib.mapAttrs (n: v: lib.mkDefault v) { + enabled = cfg.geolocation.enable; + unit = "celsius"; + }; + location = lib.mapAttrs (n: v: lib.mkDefault v) { + auto_locate = cfg.geolocation.enable; + }; + shell = lib.mapAttrs (n: v: lib.mkDefault v) { + offline_mode = false; + launch_apps_as_systemd_services = true; + telemetry_enabled = false; + polkit_agent = true; + animation.enabled = (!cfg.graphics.legacyGpu); + panel.background_blur = (!cfg.graphics.legacyGpu); + font_family = "monospace"; + shadow.blur = 0; + }; + notification = lib.mapAttrs (n: v: lib.mkDefault v) { + enable_daemon = true; + background_opacity = opacity; + }; + brightness.enable_ddcutil = lib.mkDefault true; + wallpaper = { + enabled = lib.mkDefault true; + fill_mode = lib.mkDefault "crop"; + transition = [ "fade" ]; + directory = lib.mkDefault "${config.home.homeDirectory}/Pictures/Wallpapers"; + automation = lib.mapAttrs (n: v: lib.mkDefault v) { + enabled = true; + order = "random"; + interval_minutes = 15; + }; + }; + backdrop.enabled = lib.mkDefault (!cfg.graphics.legacyGpu); + dock = lib.mapAttrs (n: v: lib.mkDefault v) { + enabled = false; + shadow = false; + }; + widget.control-center = { + custom_image = "${config.programs.noctalia.package}/share/noctalia/assets/images/distros/nixos.svg"; + custom_image_colorize = true; + }; + bar = { + order = [ "main" ]; + main = lib.mapAttrs (n: v: lib.mkDefault v) { + shadow = false; + position = "top"; + enabled = true; + auto_hide = false; + reserve_space = true; + background_opacity = opacity; + margin_ends = 16; + margin_edge = 8; + widget_spacing = 8; + capsule = true; + start = [ + "control-center" + "notifications" + "clock" + "taskbar" + ]; + center = [ + "active_window" + ]; + end = [ + "volume" + "network" + "bluetooth" + "brightness" + "battery" + "tray" + "keyboard_layout" + ]; + }; + }; + }; + }; +} diff --git a/common/hm/packages.nix b/common/hm/packages.nix new file mode 100644 index 0000000..49b341c --- /dev/null +++ b/common/hm/packages.nix @@ -0,0 +1,20 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + home.packages = with pkgs; [ + # Hyprland / core apps + qimgv + mpv # video player + dconf-editor # view gsettings stuff + gsettings-desktop-schemas + ungoogled-chromium + ]; +} diff --git a/common/hm/pointerCursor.nix b/common/hm/pointerCursor.nix new file mode 100644 index 0000000..1870cf3 --- /dev/null +++ b/common/hm/pointerCursor.nix @@ -0,0 +1,24 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in + +lib.mkIf (cfg.desktop.enable) ( + lib.mkMerge [ + { + catppuccin.cursors.enable = lib.mkDefault config.catppuccin.enable; + home.pointerCursor = { + enable = lib.mkDefault config.catppuccin.enable; + size = lib.mkDefault 30; + gtk.enable = true; + x11.enable = true; + }; + } + ] +) diff --git a/common/hm/programs/bemenu.nix b/common/hm/programs/bemenu.nix new file mode 100644 index 0000000..797f787 --- /dev/null +++ b/common/hm/programs/bemenu.nix @@ -0,0 +1,48 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + programs.bemenu = { + enable = true; + settings = with config.wayland.desktopManager.sidonia.window.decoration; { + no-exec = true; + prompt = "open"; + ignorecase = true; + list = "16 down"; + wrap = true; + center = true; + no-overlap = true; + single-instance = true; + width-factor = 0.33; + border = borderWidth; + border-radius = rounding; + }; + }; + wayland.desktopManager.sidonia.keybinds = [ + { + name = "Bemenu"; + mod = [ + "Super" + "Shift" + ]; + key = "P"; + exec = "$(bemenu-run)"; + } + ] + ++ (lib.optional osConfig.hardware.nvidia.prime.offload.enableOffloadCmd { + name = "Bemenu (Discrete GPU)"; + mod = [ + "Super" + "Ctrl" + ]; + key = "P"; + exec = "LIBVA_DRIVER_NAME=nvidia VDPAU_NAME=nvidia nvidia-offload $(bemenu-run)"; + }); +} diff --git a/common/hm/programs/default.nix b/common/hm/programs/default.nix new file mode 100644 index 0000000..e8eef9c --- /dev/null +++ b/common/hm/programs/default.nix @@ -0,0 +1,22 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + imports = [ + ./bemenu.nix + ./defaultApps.nix + ./foot.nix + ./gtkwave.nix + ./helix + ./missioncenter.nix + ./nemo.nix + ./sublime.nix + ./vscodium.nix + ./zenBrowser.nix + ./zsh.nix + ]; +} diff --git a/common/hm/programs/defaultApps.nix b/common/hm/programs/defaultApps.nix new file mode 100644 index 0000000..3b89f27 --- /dev/null +++ b/common/hm/programs/defaultApps.nix @@ -0,0 +1,56 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkMerge [ + (lib.mkIf cfg.desktop.enable { + programs = { + discord.enable = lib.mkDefault true; + vesktop.enable = lib.mkDefault true; + obs-studio = { + enable = lib.mkDefault true; + plugins = with pkgs.obs-studio-plugins; [ + wlrobs + ]; + }; + }; + home.packages = + with pkgs; + [ + # GUI apps + pinta # Paint.NET-like image editor + proton-vpn + slack + prismlauncher + plexamp + tageditor + ] + ++ (lib.optional config.services.shikane.enable config.services.shikane.package); + }) + { + catppuccin.cache.enable = lib.mkDefault true; + programs = { + btop.enable = lib.mkDefault true; + lazygit.enable = lib.mkDefault true; + neovim = { + enable = lib.mkDefault true; + defaultEditor = lib.mkDefault false; + withPython3 = false; + withRuby = false; + }; + bat = { + enable = lib.mkDefault true; + config = { + style = "plain"; + paging = "never"; + }; + }; + }; + } +] diff --git a/common/hm/programs/foot.nix b/common/hm/programs/foot.nix new file mode 100644 index 0000000..bdb19b0 --- /dev/null +++ b/common/hm/programs/foot.nix @@ -0,0 +1,47 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + xdg.terminal-exec = { + enable = true; + settings.default = [ "foot.desktop" ]; + }; + dconf.settings = { + "org/cinnamon/desktop/applications/terminal" = { + exec = lib.gvariant.mkValue (lib.getExe pkgs.foot); + exec-arg = lib.gvariant.mkValue "-e"; + }; + "org/gnome/desktop/applications/terminal" = { + exec = lib.gvariant.mkValue (lib.getExe pkgs.foot); + exec-arg = lib.gvariant.mkValue "-e"; + }; + }; + programs.foot = { + enable = true; + settings = { + # https://codeberg.org/dnkl/foot/src/branch/master/foot.ini + main.dpi-aware = "no"; + main.font = "monospace:size=10"; + main.pad = "6x6 center-when-maximized-and-fullscreen"; + colors-dark.alpha = toString config.wayland.desktopManager.sidonia.window.decoration.opacity.dec; + }; + }; + wayland.desktopManager.sidonia.keybinds = [ + { + name = "Terminal"; + mod = [ + "super" + "shift" + ]; + key = "return"; + exec = "foot"; + } + ]; +} diff --git a/common/hm/programs/gtkwave.nix b/common/hm/programs/gtkwave.nix new file mode 100644 index 0000000..1e120e1 --- /dev/null +++ b/common/hm/programs/gtkwave.nix @@ -0,0 +1,26 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf cfg.desktop.enable { + programs.gtkwave = { + enable = lib.mkDefault false; + settings = { + splash_disable = "1"; + do_initial_zoom_fit = "1"; + highlight_wavewindow = "1"; + fill_waveform = "1"; + clipboard_mouseover = "1"; + disable_mouseover = "0"; + show_base_symbols = "0"; + fontname_signals = "Monospace 12"; + fontname_waves = "Monospace 12"; + }; + }; +} diff --git a/common/hm/programs/helix/default.nix b/common/hm/programs/helix/default.nix new file mode 100644 index 0000000..4fd76ec --- /dev/null +++ b/common/hm/programs/helix/default.nix @@ -0,0 +1,15 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + imports = [ + ./fusesoc.nix + ./haskell.nix + ./helix.nix + ./verilog.nix + ]; +} diff --git a/common/hm/programs/helix/fusesoc.nix b/common/hm/programs/helix/fusesoc.nix new file mode 100644 index 0000000..104f37d --- /dev/null +++ b/common/hm/programs/helix/fusesoc.nix @@ -0,0 +1,34 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + programs.helix = { + languages.language = [ + { + name = "yaml"; + # https://github.com/helix-editor/helix/blob/460d3be574a514d327ea5e55a50dc4fea67d60fc/languages.toml#L1672 + file-types = [ + "core" # fusesoc core + "yml" + "yaml" + { glob = ".prettierrc"; } + { glob = ".clangd"; } + { glob = ".clang-format"; } + { glob = ".clang-tidy"; } + { glob = ".gem/credentials"; } + { glob = ".kube/config"; } + { glob = ".kube/kuberc"; } + { glob = "yarn.lock"; } + "sublime-syntax" + "bu" + { glob = ".stylelintrc"; } # https://stylelint.io/user-guide/configure/ + { glob = ".puppeteerrc"; } # https://pptr.dev/guides/configuration + ]; + } + ]; + }; +} diff --git a/common/hm/programs/helix/haskell.nix b/common/hm/programs/helix/haskell.nix new file mode 100644 index 0000000..8aa4ede --- /dev/null +++ b/common/hm/programs/helix/haskell.nix @@ -0,0 +1,16 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + programs.helix = { + extraPackages = with pkgs; [ + ghc + haskell-language-server + fourmolu + ]; + }; +} diff --git a/common/hm/programs/helix/helix.nix b/common/hm/programs/helix/helix.nix new file mode 100644 index 0000000..288ca91 --- /dev/null +++ b/common/hm/programs/helix/helix.nix @@ -0,0 +1,44 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + programs.helix = { + enable = lib.mkDefault true; + package = lib.mkDefault pkgs.helix-unstable; + defaultEditor = lib.mkDefault true; + extraPackages = with pkgs; [ + vhdl-ls # vhdl + clang-tools # c/cpp/opencl + neocmakelsp # cmake + vscode-json-languageserver # json + nixd # nix + nixfmt # nix + marksman # markdown + zls # zig + lldb # various debuggers + yaml-language-server + yamlfmt + ]; + settings = { + editor = { + bufferline = "multiple"; + }; + keys.normal = lib.mkMerge [ + (lib.mkIf config.programs.lazygit.enable { + "C-g" = [ + ":write-all" + ":new" + ":insert-output ${lib.getExe config.programs.lazygit.package}" + ":buffer-close!" + ":redraw" + ":reload-all" + ]; + }) + ]; + }; + }; +} diff --git a/common/hm/programs/helix/verilog.nix b/common/hm/programs/helix/verilog.nix new file mode 100644 index 0000000..0ceaab1 --- /dev/null +++ b/common/hm/programs/helix/verilog.nix @@ -0,0 +1,90 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + programs.helix = { + extraPackages = with pkgs; [ + slang-server # verilog/systemverilog + verible # verilog formatter + ]; + languages = { + language-server = { + slang-server.command = "slang-server"; + }; + language = + map + ( + x: + rec { + language-servers = [ + { + name = "slang-server"; + except-features = [ "format" ]; + } + ]; + indent = { + tab-width = 4; + unit = " "; + }; + formatter = { + command = "verible-verilog-format"; + args = + (lib.mapAttrsToList + ( + n: v: + let + stringified = if builtins.isBool v then if v == true then "true" else "false" else toString v; + in + "--${n}=${stringified}" + ) + { + column_limit = 120; + indentation_spaces = indent.tab-width; + wrap_end_else_clauses = true; + formal_parameters_indentation = "indent"; + named_port_indentation = "indent"; + named_parameter_indentation = "indent"; + port_declarations_indentation = "indent"; + assignment_statement_alignment = "align"; + case_items_alignment = "align"; + class_member_variable_alignment = "align"; + distribution_items_alignment = "align"; + enum_assignment_statement_alignment = "align"; + formal_parameters_alignment = "align"; + module_net_variable_alignment = "align"; + named_parameter_alignment = "align"; + named_port_alignment = "align"; + port_declarations_alignment = "align"; + struct_union_members_alignment = "align"; + port_declarations_right_align_packed_dimensions = false; + port_declarations_right_align_unpacked_dimensions = false; + } + ) + ++ [ "-" ]; + }; + } + // x + ) + [ + { + name = "verilog"; + file-types = [ + "v" + "vh" + ]; + } + { + name = "systemverilog"; + file-types = [ + "sv" + "svh" + ]; + } + ]; + }; + }; +} diff --git a/common/hm/programs/missioncenter.nix b/common/hm/programs/missioncenter.nix new file mode 100644 index 0000000..de4ec0b --- /dev/null +++ b/common/hm/programs/missioncenter.nix @@ -0,0 +1,24 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + home.packages = [ pkgs.mission-center ]; + wayland.desktopManager.sidonia.keybinds = [ + { + name = "Task Manager"; + mod = [ + "super" + "shift" + ]; + key = "escape"; + exec = "missioncenter"; + } + ]; +} diff --git a/common/hm/programs/nemo.nix b/common/hm/programs/nemo.nix new file mode 100644 index 0000000..b9add17 --- /dev/null +++ b/common/hm/programs/nemo.nix @@ -0,0 +1,45 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; + nemoBasePackage = pkgs.nemo; + nemoPackage = + (pkgs.nemo-with-extensions.overrideAttrs { extraNativeBuildInputs = [ pkgs.gvfs ]; }).override + { + nemo = nemoBasePackage; + extensions = with pkgs; [ + folder-color-switcher + nemo-emblems + nemo-fileroller + nemo-python + nemo-preview + ]; + useDefaultExtensions = false; + }; +in +lib.mkIf (cfg.desktop.enable) { + home.packages = with pkgs; [ + engrampa # archive manager + ffmpegthumbnailer + webp-pixbuf-loader + nemoPackage + ]; + xdg = { + systemDirs.data = [ + "${nemoPackage}/share/gsettings-schemas/nemo-${nemoBasePackage.version}" + ]; + mimeApps.defaultApplications = + let + fileExplorer = "nemo.desktop"; + in + { + "inode/directory" = [ fileExplorer ]; + "application/x-gnome-saved-search" = [ fileExplorer ]; + }; + }; +} diff --git a/common/hm/programs/sublime.nix b/common/hm/programs/sublime.nix new file mode 100644 index 0000000..f9e2c92 --- /dev/null +++ b/common/hm/programs/sublime.nix @@ -0,0 +1,55 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf cfg.desktop.enable { + nixpkgs.config.permittedInsecurePackages = [ "openssl-1.1.1w" ]; + programs.sublime4 = { + enable = lib.mkDefault true; + settings = { + ignored_packages = [ "Vintage" ]; + font_size = 10; + translate_tabs_to_spaces = true; + index_files = true; + hardware_acceleration = if cfg.graphics.legacyGpu then "none" else "opengl"; + update_check = false; + sublime_merge_path = lib.getExe pkgs.sublime-merge; + }; + packageControl = { + enable = true; + packages = [ + "LSP" + "Nix" + "SystemVerilog" + "hooks" + ]; + }; + userFile = { + "SystemVerilog.sublime-settings".text = builtins.toJSON { + "sv.disable_autocomplete" = true; + "sv.tooltip" = true; + }; + }; + }; + programs.sublime-merge = { + enable = lib.mkDefault true; + settings = lib.mkMerge [ + { + translate_tabs_to_spaces = true; + side_bar_layout = "tabs"; + font_size = 10; + hardware_acceleration = if cfg.graphics.legacyGpu then "none" else "opengl"; + update_check = false; + } + (lib.mkIf config.programs.sublime4.enable { + editor_path = "${pkgs.sublime4}/bin/sublime_text"; + }) + ]; + }; +} diff --git a/common/hm/programs/vscodium.nix b/common/hm/programs/vscodium.nix new file mode 100644 index 0000000..684ad1b --- /dev/null +++ b/common/hm/programs/vscodium.nix @@ -0,0 +1,53 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + programs.vscodium = { + enable = lib.mkDefault true; + profiles.default = { + enableExtensionUpdateCheck = false; + enableUpdateCheck = false; + extensions = with pkgs.vsxExtensionsFor config.programs.vscodium.package; [ + haskell.haskell + jnoortheen.nix-ide + mkhl.direnv + ]; + userSettings = + let + nixfmt = [ + "nixfmt" + "--indent=4" + ]; + in + { + "typescript.suggest.paths" = false; + "javascript.suggest.paths" = false; + "nix.enableLanguageServer" = true; + "nix.formatterPath" = nixfmt; + "nix.serverPath" = "nil"; + "nix.serverSettings" = { + nil = { + diagnostics.ignored = [ + "unused_binding" + "unused_with" + ]; + formatting.command = nixfmt; + nix.flake = { + autoArchive = true; + autoEvalInputs = false; + nixpkgsInputName = "nixpkgs"; + }; + }; + }; + "editor.fontFamily" = "monospace, 'ComicShannsMono Nerd Font'"; + }; + }; + }; +} diff --git a/common/hm/programs/zenBrowser.nix b/common/hm/programs/zenBrowser.nix new file mode 100644 index 0000000..c21c6e1 --- /dev/null +++ b/common/hm/programs/zenBrowser.nix @@ -0,0 +1,17 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + programs.zen-browser = { + # https://github.com/0xc000022070/zen-browser-flake/tree/main + enable = lib.mkDefault true; + setAsDefaultBrowser = lib.mkDefault true; + }; +} diff --git a/common/hm/programs/zsh.nix b/common/hm/programs/zsh.nix new file mode 100644 index 0000000..f05f28a --- /dev/null +++ b/common/hm/programs/zsh.nix @@ -0,0 +1,94 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +{ + programs.zsh.enable = lib.mkDefault true; + programs.zoxide.enable = lib.mkDefault true; + programs.oh-my-posh.enable = lib.mkDefault true; + + programs.zsh.syntaxHighlighting = { + enable = lib.mkDefault true; + highlighters = [ + "main" + "brackets" + ]; + }; + + programs.oh-my-posh.settings = + let + palette = lib.mapAttrs (n: v: "#${v}") config.catppuccin.lib.color; + in + with palette; + { + # builtins.toJSON + "$schema" = "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json"; + properties = { + upgrade_notice = false; + auto_upgrade = false; + }; + upgrade = { + notice = false; + auto = false; + }; + inherit palette; + blocks = [ + { + type = "prompt"; + alignment = "left"; + segments = [ + { + foreground = accent; + style = "plain"; + template = "{{ .UserName }}@{{ .HostName }} "; + type = "session"; + } + { + foreground = pink; + properties = { + folder_icon = " "; + home_icon = "~"; + style = "agnoster_short"; + max_depth = 4; + }; + style = "plain"; + template = "{{ .Path }} "; + type = "path"; + } + { + foreground = lavender; + properties = { + branch_icon = " "; + cherry_pick_icon = " "; + commit_icon = " "; + fetch_status = false; + fetch_upstream_icon = false; + merge_icon = " "; + no_commits_icon = " "; + rebase_icon = " "; + revert_icon = " "; + tag_icon = " "; + }; + template = "{{ .HEAD }} "; + style = "plain"; + type = "git"; + } + { + style = "plain"; + foreground = accent; + template = ""; + type = "text"; + } + ]; + } + ]; + final_space = true; + version = 2; + accent_color = accent; + terminal_background = base; + enable_cursor_positioning = true; + }; +} diff --git a/common/hm/qt.nix b/common/hm/qt.nix new file mode 100644 index 0000000..36ee7b4 --- /dev/null +++ b/common/hm/qt.nix @@ -0,0 +1,17 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + qt = { + enable = true; + style.name = "kvantum"; + platformTheme.name = "kvantum"; + }; +} diff --git a/common/hm/xdg.nix b/common/hm/xdg.nix new file mode 100644 index 0000000..dfdb29a --- /dev/null +++ b/common/hm/xdg.nix @@ -0,0 +1,49 @@ +{ + osConfig, + config, + pkgs, + lib, + ... +}: +let + cfg = osConfig.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + xdg = { + autostart.enable = true; + portal = { + enable = lib.mkDefault osConfig.xdg.portal.enable; + xdgOpenUsePortal = lib.mkDefault osConfig.xdg.portal.xdgOpenUsePortal; + extraPortals = osConfig.xdg.portal.extraPortals; + config = { + common = { + default = [ + "gtk" + "gnome" + ]; + "org.freedesktop.impl.portal.ScreenCast" = [ "gnome" ]; + "org.freedesktop.impl.portal.Screenshot" = [ "gnome" ]; + }; + }; + }; + mimeApps = + let + imageViewer = "qimgv.desktop"; + in + { + enable = true; + defaultApplications = { + "image/jpg" = [ imageViewer ]; + "image/jpeg" = [ imageViewer ]; + "image/png" = [ imageViewer ]; + "image/bmp" = [ imageViewer ]; + "image/gif" = [ imageViewer ]; + "image/webp" = [ imageViewer ]; + "image/x-sony-arw" = [ imageViewer ]; + }; + associations.added = { + "image/jpg" = imageViewer; + }; + }; + }; +} diff --git a/common/os/configuration.nix b/common/os/configuration.nix new file mode 100644 index 0000000..6e34155 --- /dev/null +++ b/common/os/configuration.nix @@ -0,0 +1,173 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; +in +{ + boot.initrd.systemd.enable = true; + + catppuccin.cache.enable = lib.mkDefault true; + + nix.settings = { + auto-optimise-store = true; + trusted-users = [ cfg.userName ]; + fallback = lib.mkDefault true; + }; + + # Enable Graphics + hardware.graphics = { + enable = true; + enable32Bit = true; + }; + + # Firmware updater + services.fwupd.enable = true; + + services.fstrim.enable = true; + services.dbus.implementation = "broker"; + services.irqbalance.enable = true; + + # Enable networking + networking.networkmanager = { + enable = true; + wifi = { + backend = "iwd"; + powersave = true; + }; + dns = "systemd-resolved"; + }; + networking.nftables.enable = true; + networking.firewall.enable = true; + + # Enable local service discovery + networking.firewall.allowedUDPPorts = [ 5353 ]; + services.resolved = { + enable = true; + settings.Resolve = { + LLMNR = "true"; # true/false/resolve + DNSOverTLS = "opportunistic"; + }; + }; + services.avahi = { + enable = true; + nssmdns4 = true; + nssmdns6 = true; + openFirewall = true; + }; + + # Enable printing + services.printing.enable = true; + + # Enable bluetooth + hardware.bluetooth.enable = true; + hardware.bluetooth.powerOnBoot = true; + + services.upower.enable = true; + services.tuned.enable = true; + + # Set your time zone. + time.timeZone = lib.mkDefault "Europe/Dublin"; + services.automatic-timezoned.enable = cfg.geolocation.enable; + #services.localtimed.enable = cfg.geolocation.enable; + services.geoclue2 = { + enable = cfg.geolocation.enable; + geoProviderUrl = "https://beacondb.net/v1/geolocate"; + }; + + # Select internationalisation properties. + i18n.defaultLocale = "en_GB.UTF-8"; + + i18n.extraLocaleSettings = { + LC_ADDRESS = "en_IE.UTF-8"; + LC_IDENTIFICATION = "en_IE.UTF-8"; + LC_MEASUREMENT = "en_IE.UTF-8"; + LC_MONETARY = "en_IE.UTF-8"; + LC_NAME = "en_IE.UTF-8"; + LC_NUMERIC = "en_IE.UTF-8"; + LC_PAPER = "en_IE.UTF-8"; + LC_TELEPHONE = "en_IE.UTF-8"; + LC_TIME = "en_IE.UTF-8"; + }; + + console.useXkbConfig = lib.mkDefault true; + services.xserver.xkb.layout = lib.mkDefault "us"; + + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.${cfg.userName} = { + isNormalUser = true; + description = cfg.lib.capitalize cfg.userName; + extraGroups = [ + "networkmanager" + "wheel" + ]; + packages = [ ]; + shell = pkgs.zsh; + }; + programs.zsh.enable = true; + programs.direnv.enable = true; + programs.git = { + enable = true; + lfs.enable = true; + }; + + # Enable experimental features + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + + nixpkgs.config.allowUnfree = true; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + _7zz + sops + vim + bash + lshw + wget + curl + tmux + samba + age + ssh-to-age + fastfetch + nil + gnumake + gcc + foot.terminfo + smartmontools + usbutils + lm_sensors + nixfmt + ]; + + fonts = { + fontDir.enable = true; + packages = + with pkgs; + [ + nerd-fonts.comic-shanns-mono + nerd-fonts.ubuntu + liberation_ttf + meslo-lgs-nf + dejavu_fonts + ] + ++ (lib.optional cfg.text.comicCode.enable cfg.text.comicCode.package); + fontconfig.defaultFonts = { + monospace = (lib.optional cfg.text.comicCode.enable cfg.text.comicCode.name) ++ [ + "ComicShannsMono Nerd Font" + ]; + }; + }; + +} diff --git a/common/os/default.nix b/common/os/default.nix new file mode 100644 index 0000000..4af39fb --- /dev/null +++ b/common/os/default.nix @@ -0,0 +1,18 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; +in +{ + imports = [ + ./programs + ./services + ./tweaks + ./configuration.nix + ./niri.nix + ]; +} diff --git a/common/os/niri.nix b/common/os/niri.nix new file mode 100644 index 0000000..46bdf1c --- /dev/null +++ b/common/os/niri.nix @@ -0,0 +1,18 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; +in +lib.mkIf (cfg.desktop.enable && (cfg.desktop.compositor == "niri")) { + programs.niri = { + enable = true; + package = lib.mkDefault (if cfg.graphics.legacyGpu then pkgs.niri-legacy else pkgs.niri); + useNautilus = lib.mkDefault false; + withUWSM = lib.mkDefault true; + withXDG = lib.mkDefault true; + }; +} diff --git a/common/os/programs/default.nix b/common/os/programs/default.nix new file mode 100644 index 0000000..dbe17a2 --- /dev/null +++ b/common/os/programs/default.nix @@ -0,0 +1,9 @@ +{ + config, + pkgs, + lib, + ... +}: +{ + imports = [ ./steam.nix ]; +} diff --git a/common/os/programs/steam.nix b/common/os/programs/steam.nix new file mode 100644 index 0000000..3cccdc0 --- /dev/null +++ b/common/os/programs/steam.nix @@ -0,0 +1,61 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; +in +{ + options.programs.steam.extraEnv = lib.mkOption { + description = "Extra environment variables for steam."; + type = with lib.types; attrsOf (nullOr (coercedTo int (builtins.toString) str)); + default = { }; + apply = x: lib.filterAttrs (n: v: v != null) x; + }; + config = lib.mkIf (cfg.desktop.enable) { + programs = { + steam = { + enable = lib.mkDefault true; + package = pkgs.steam.override { + #extraProfile = "unset TZ"; + inherit (config.programs.steam) extraEnv; + }; + protontricks.enable = lib.mkDefault true; + localNetworkGameTransfers.openFirewall = lib.mkDefault true; + extest.enable = lib.mkDefault true; + extraCompatPackages = [ + pkgs.dwproton + pkgs.proton-ge-bin + pkgs.steam-play-none + ]; + }; + }; + environment.systemPackages = [ pkgs.gamescope-wsi ]; # for gamescope hdr support + + home-manager.users.${cfg.userName} = { + wayland.windowManager.niri.settings.window-rule = [ + { + _children = [ + { match._props.app-id._raw = ''r#"^steam_app_\d+$"#''; } + { match._props.app-id._raw = ''r#"^gamescope$"#''; } + ]; + open-fullscreen = true; + } + { + match._props = { + app-id = "steam"; + title._raw = ''r#"^notificationtoasts_\d+_desktop$"#''; + }; + open-focused = false; + default-floating-position._props = { + x = 10.0; + y = 10.0; + relative-to = "bottom-right"; + }; + } + ]; + }; + }; +} diff --git a/common/os/services/coreServices.nix b/common/os/services/coreServices.nix new file mode 100644 index 0000000..d5e32b9 --- /dev/null +++ b/common/os/services/coreServices.nix @@ -0,0 +1,66 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; +in +lib.mkIf (cfg.desktop.enable) { + + security = { + pam.services.login.enableGnomeKeyring = lib.mkDefault true; + polkit.enable = lib.mkDefault true; + }; + + catppuccin.cursors.enable = lib.mkDefault config.catppuccin.enable; + + programs.dconf.enable = lib.mkDefault true; + + # https://nix-community.github.io/home-manager/options.xhtml#opt-xdg.portal.enable + environment.pathsToLink = [ + "/share/xdg-desktop-portal" + "/share/applications" + ]; + + services = { + logind.settings.Login = { + HandleLidSwitch = lib.mkDefault "suspend-then-hibernate"; + HandleLidSwitchExternalPower = lib.mkDefault "ignore"; + HandleLidSwitchDocked = lib.mkDefault "ignore"; + }; + gvfs.enable = lib.mkDefault true; # Mount, trash, and other functionalities + tumbler.enable = lib.mkDefault true; # Thumbnail support for images + }; + + programs = { + seahorse.enable = lib.mkDefault true; + xfconf.enable = lib.mkDefault true; + }; + + # For ddcutil + hardware.i2c.enable = lib.mkDefault true; + environment.systemPackages = [ pkgs.ddcutil ]; + + # https://gitlab.com/mission-center-devs/mission-center/-/wikis/Home/CPU + services.udev.extraRules = '' + SUBSYSTEM=="powercap", KERNEL=="intel-rapl*", \ + RUN+="${pkgs.coreutils}/bin/chgrp -R wheel /sys/%p/'", \ + RUN+="${pkgs.coreutils}/bin/chmod -R g+r /sys/%p/" + ''; + + security.wrappers.nethogs = { + enable = lib.mkDefault true; + owner = "root"; + group = "root"; + source = lib.getExe pkgs.nethogs; + capabilities = lib.concatStringsSep "," [ + "cap_net_admin" + "cap_net_raw" + "cap_dac_read_search" + "cap_sys_ptrace+pe" + ]; + }; + +} diff --git a/common/os/services/default.nix b/common/os/services/default.nix new file mode 100644 index 0000000..0d2779e --- /dev/null +++ b/common/os/services/default.nix @@ -0,0 +1,14 @@ +{ + config, + pkgs, + lib, + ... +}: +{ + imports = [ + ./coreServices.nix + ./displayManager.nix + ./distributedBuilds.nix + ./vr.nix + ]; +} diff --git a/common/os/services/displayManager.nix b/common/os/services/displayManager.nix new file mode 100644 index 0000000..47b3801 --- /dev/null +++ b/common/os/services/displayManager.nix @@ -0,0 +1,26 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; +in +{ + config = lib.mkIf cfg.desktop.enable { + services.displayManager = { + autoLogin.enable = lib.mkDefault false; + autoLogin.user = lib.mkDefault cfg.userName; + }; + programs.noctalia-greeter = { + enable = lib.mkDefault true; + settings.cursor = + with config.catppuccin; + lib.mkIf enable { + theme = lib.mkDefault "catppuccin-${flavor}-${accent}-cursors"; + package = lib.mkDefault sources.cursors."${flavor}${lib.toSentenceCase accent}"; + }; + }; + }; +} diff --git a/common/os/services/distributedBuilds.nix b/common/os/services/distributedBuilds.nix new file mode 100644 index 0000000..5d6f851 --- /dev/null +++ b/common/os/services/distributedBuilds.nix @@ -0,0 +1,144 @@ +{ + config, + pkgs, + lib, + otherHosts, + ... +}: +let + cfg = config.sidonia; + forEachOtherHost = f: builtins.map f otherHosts; +in +{ + options.sidonia.services.distributedBuilds = with lib; { + host = { + enable = mkEnableOption "Enable becoming a distributed build host"; + user = mkOption { + type = types.str; + default = "builder"; + }; + signing = { + pubKey = mkOption { + description = "Public key for store binary cache signing"; + type = types.str; + }; + privKeyPath = mkOption { + description = "Path to private cache signing key"; + type = types.path; + }; + }; + ssh.pubKey = mkOption { + description = "known_hosts public key"; + type = types.str; + }; + hostNames = mkOption { + description = "Hostnames or ip addresses of the build host"; + type = types.listOf types.str; + }; + maxJobs = mkOption { + description = "Maximum amount of jobs to accept from a single client"; + type = types.either types.int (types.enum [ "auto" ]); + default = config.nix.settings.max-jobs; + }; + }; + client = { + enable = mkEnableOption "Enable taking advantage of distributed builds"; + ssh = { + pubKey = mkOption { + type = types.str; + default = cfg.ssh.pubKey; + }; + privKeyPath = mkOption { + type = types.path; + default = cfg.ssh.privKeyPath; + }; + }; + }; + }; + + config = + let + host = cfg.services.distributedBuilds.host; + client = cfg.services.distributedBuilds.client; + in + lib.mkMerge [ + (lib.mkIf client.enable ( + lib.mkMerge ( + (forEachOtherHost ( + remote: + let + remoteHost = remote.config.sidonia.services.distributedBuilds.host; + remoteFeatures = remote.config.nix.settings.system-features; + builderName = "${remoteHost.user}_at_${remote.config.networking.hostName}"; + in + lib.mkIf remoteHost.enable { + programs.ssh = { + knownHosts = { + ${builderName} = { + extraHostNames = remoteHost.hostNames; + publicKey = remoteHost.ssh.pubKey; + }; + }; + extraConfig = '' + Host ${builderName} + User ${remoteHost.user} + Hostname ${builtins.head remoteHost.hostNames} + IdentitiesOnly yes + IdentityFile ${client.ssh.privKeyPath} + ConnectTimeout 3 + ''; + }; + nix = { + settings = { + trusted-public-keys = [ remoteHost.signing.pubKey ]; + substituters = [ "ssh-ng://${builderName}" ]; + }; + buildMachines = [ + ( + { + hostName = builtins.head remoteHost.hostNames; + sshUser = remoteHost.user; + sshKey = client.ssh.privKeyPath; + #publicHostKey = remoteHost.ssh.pubKey; # don't use this value as it wants base64, fall back to known_hosts instead + system = "x86_64-linux"; + protocol = "ssh-ng"; + speedFactor = 2; + supportedFeatures = remoteFeatures; + } + // (if remoteHost.maxJobs != "auto" then { inherit (remoteHost) maxJobs; } else { }) + ) + ]; + }; + } + )) + ++ [ + { + nix.distributedBuilds = true; + nix.settings.builders-use-substitutes = true; + } + ] + ) + )) + (lib.mkIf host.enable ( + lib.mkMerge ( + (forEachOtherHost ( + remote: + let + remoteClient = remote.config.sidonia.services.distributedBuilds.client; + in + lib.mkIf remoteClient.enable { + users.users.${host.user}.openssh.authorizedKeys.keys = [ remoteClient.ssh.pubKey ]; + } + )) + ++ [ + { + users.users.${host.user}.isNormalUser = true; + services.openssh.settings.AllowUsers = [ host.user ]; + nix.settings.secret-key-files = host.signing.privKeyPath; + nix.settings.trusted-users = [ host.user ]; + } + ] + ) + )) + ]; +} diff --git a/common/os/services/vr.nix b/common/os/services/vr.nix new file mode 100644 index 0000000..4a80ea5 --- /dev/null +++ b/common/os/services/vr.nix @@ -0,0 +1,51 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; + +in +{ + options.sidonia.services.vr.enable = lib.mkEnableOption "Enable VR services"; + config = lib.mkIf (cfg.services.vr.enable) { + hardware.steam-hardware.enable = true; + programs.steam = { + extraEnv.PRESSURE_VESSEL_IMPORT_OPENXR_1_RUNTIMES = 1; + extraCompatPackages = [ pkgs.proton-ge-rtsp-bin ]; + }; + services.monado = { + enable = true; + defaultRuntime = true; + highPriority = true; + }; + systemd.user.services.monado.environment = { + STEAMVR_LH_ENABLE = "1"; + XRT_COMPOSITOR_COMPUTE = "1"; + IPC_EXIT_ON_DISCONNECT = "1"; + WMR_HANDTRACKING = "0"; + }; + home-manager.users.${cfg.userName} = { + home.packages = [ + pkgs.xrizer + ]; + xdg.configFile = { + "openxr/1/active_runtime.json".source = "${pkgs.monado}/share/openxr/1/openxr_monado.json"; + "openvr/openvrpaths.vrpath".text = + let + steamDir = "${config.home-manager.users.${cfg.userName}.xdg.dataHome}/Steam"; + in + builtins.toJSON { + version = 1; + jsonid = "vrpathreg"; + external_drivers = null; + config = [ "${steamDir}/config" ]; + log = [ "${steamDir}/logs" ]; + runtime = [ "${pkgs.xrizer}/lib/xrizer" ]; + }; + }; + }; + }; +} diff --git a/common/os/tweaks/audio.nix b/common/os/tweaks/audio.nix new file mode 100644 index 0000000..fe8da82 --- /dev/null +++ b/common/os/tweaks/audio.nix @@ -0,0 +1,157 @@ +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; +in +{ + options.sidonia.tweaks.audio = { + enable = + with lib; + mkOption { + type = types.bool; + default = cfg.desktop.enable; + }; + behringerFix.enable = lib.mkEnableOption "Fix stutter for Behringer audio interfaces such as the UV1 and some UMC devices."; + lowLatency = { + enable = lib.mkEnableOption "Enable low latency audio tweaks"; + rate = lib.mkOption { + type = lib.types.int; + default = 48000; + }; + quantum = lib.mkOption { + type = lib.types.int; + default = 64; + }; + }; + }; + config = lib.mkIf cfg.tweaks.audio.enable ( + lib.mkMerge [ + (lib.mkIf cfg.tweaks.audio.behringerFix.enable { + # Fix Behringer UV1 stutter https://github.com/arterro/notes/blob/main/behringer_uv1_linux_stutter.org + boot = { + extraModprobeConfig = '' + options snd_usb_audio implicit_fb=1 + ''; + kernelModules = [ + "snd_usb_audio" + ]; + }; + }) + ( + let + inherit (cfg.tweaks.audio.lowLatency) quantum rate; + quantRate = lib.concatStringsSep "/" ( + builtins.map builtins.toString [ + quantum + rate + ] + ); + in + lib.mkIf cfg.tweaks.audio.lowLatency.enable { + services.pipewire.extraConfig = { + pipewire."92-low-latency" = { + "context.properties" = { + "default.clock.rate" = rate; + "default.clock.quantum" = quantum; + "default.clock.min-quantum" = quantum; + "default.clock.max-quantum" = quantum; + }; + }; + pipewire-pulse."92-low-latency" = { + context.modules = [ + { + name = "libpipewire-module-protocol-pulse"; + args = { + pulse.min.req = quantRate; + pulse.default.req = quantRate; + pulse.max.req = quantRate; + pulse.min.quantum = quantRate; + pulse.max.quantum = quantRate; + }; + } + ]; + stream.properties = { + node.latency = quantRate; + resample.quality = 1; + }; + }; + }; + } + ) + (lib.mkIf (!cfg.tweaks.audio.lowLatency.enable) { + # increase output headroom. this may make latency worse (not sure how + # noticeably) -- so if you game you may want to first try doing + # without it + services.pipewire.wireplumber.extraScripts."99-alsa-config" = '' + -- prepend, otherwise the change-nothing stock config will match first: + table.insert(alsa_monitor.rules, 1, { + matches = { + { + -- Matches all sinks. + { "node.name", "matches", "alsa_output.*" }, + }, + }, + apply_properties = { + ["api.alsa.headroom"] = 1024, + }, + }) + ''; + }) + { + # https://cmm.github.io/soapbox/the-year-of-linux-on-the-desktop.html + services = { + # expose important timers etc. to "audio" + udev.extraRules = '' + DEVPATH=="/devices/virtual/misc/cpu_dma_latency", OWNER="root", GROUP="audio", MODE="0660" + DEVPATH=="/devices/virtual/misc/hpet", OWNER="root", GROUP="audio", MODE="0660" + ''; + pulseaudio.enable = false; # using pipewire instead + pipewire = { + enable = true; + audio.enable = true; + alsa = { + enable = true; + support32Bit = true; + }; + pulse.enable = true; + # explicitly set Pipewire RT params (may not be necessary) + extraConfig.pipewire."99-rtparams" = { + "context.modules" = [ + { + name = "libpipewire-module-rt"; + args = { + "nice.level" = -11; + "rt.prio" = 19; + }; + } + ]; + }; + }; + }; + + # Audio stutter prevention + boot.kernelParams = [ "threadirqs" ]; + security.rtkit.enable = true; + + # allow members of "audio" to set RT priorities up to 90 + security.pam.loginLimits = [ + { + domain = "@audio"; + type = "-"; + item = "rtprio"; + value = "90"; + } + ]; + + users.users.${cfg.userName}.extraGroups = [ + "audio" + "rtkit" + ]; + } + ] + ); +} diff --git a/common/os/tweaks/default.nix b/common/os/tweaks/default.nix new file mode 100644 index 0000000..bdc908e --- /dev/null +++ b/common/os/tweaks/default.nix @@ -0,0 +1,12 @@ +{ + config, + pkgs, + lib, + ... +}: +{ + imports = [ + ./memory.nix + ./audio.nix + ]; +} diff --git a/common/os/tweaks/memory.nix b/common/os/tweaks/memory.nix new file mode 100644 index 0000000..a159c6f --- /dev/null +++ b/common/os/tweaks/memory.nix @@ -0,0 +1,139 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + +{ + config, + pkgs, + lib, + ... +}: +let + cfg = config.sidonia; +in +{ + options.sidonia.tweaks.memory.enable = lib.mkEnableOption "Enable memory tweaks"; + config = lib.mkIf cfg.tweaks.memory.enable { + + # https://cmm.github.io/soapbox/the-year-of-linux-on-the-desktop.html + zramSwap.enable = true; + # use values deemed by folk wisdom to be optimal with zstd zram swap + boot.kernel.sysctl = { + "vm.swappiness" = 180; + "vm.page-cluster" = 0; + "vm.watermark_scale_factor" = 125; + "vm.watermark_boost_factor" = 0; + }; + + # use the handy system76-scheduler service (it is not in fact specific + # to System76 hardware, despite the name) + services.system76-scheduler = { + enable = true; + useStockConfig = false; # our needs are modest + settings = { + # CFS profiles are switched between "default" and "responsive" + # according to power source ("default" on battery, "responsive" on + # wall power). defaults are fine, except maybe this: + cfsProfiles.default.preempt = "voluntary"; + # "voluntary" supposedly conserves battery but may also allow some + # audio skips, so consider changing to "full" + processScheduler = { + # Pipewire client priority boosting is not needed when all else is + # configured properly, not to mention all the implied + # second-guessing-the-kernel and priority inversions, so: + pipewireBoost.enable = false; + # I believe this exists solely for the placebo effect, so disable: + foregroundBoost.enable = false; + }; + }; + assignments = { + # confine builders / compilers / LSP servers etc. to the "batch" + # scheduling class automagically. add matchers to taste! + batch = { + class = "batch"; + matchers = [ + "bazel" + "clangd" + "rust-analyzer" + ]; + }; + }; + # do not disturb adults: + exceptions = [ + "include descends=\"schedtool\"" + "include descends=\"nice\"" + "include descends=\"chrt\"" + "include descends=\"taskset\"" + "include descends=\"ionice\"" + + "schedtool" + "nice" + "chrt" + "ionice" + + "dbus" + "dbus-broker" + "rtkit-daemon" + "taskset" + "systemd" + ]; + }; + + systemd = + let + accounting = '' + DefaultCPUAccounting=yes + DefaultMemoryAccounting=yes + DefaultIOAccounting=yes + ''; + in + { + # tell Systemd to measure things (probably the default these days? + # doesn't hurt, anyway): + extraConfig = accounting; + user.extraConfig = accounting; + services."user@".serviceConfig.Delegate = true; + + # enable MGLRU. change the min_ttl_ms value to taste + services."config-mglru" = { + enable = true; + after = [ "basic.target" ]; + wantedBy = [ "sysinit.target" ]; + script = with pkgs; '' + ${coreutils}/bin/echo Y > /sys/kernel/mm/lru_gen/enabled + ${coreutils}/bin/echo 1000 > /sys/kernel/mm/lru_gen/min_ttl_ms + ''; + }; + + # configure systemd-oomd properly + oomd = { + enable = true; + # disable the provided knobs -- they are too coarse, and also swap + # monitoring seems like a bad idea, with btrfs anyway + enableRootSlice = false; + enableSystemSlice = false; + enableUserSlices = false; + # change if 4s is too fast + extraConfig.DefaultMemoryPressureDurationSec = "4s"; + }; + + # kill off stuff if absolutely needed, limit to things killing which + # is unlikely to gimp system/desktop irreversibly, go only by PSI. + # tweak limits to taste, but be careful not to make them too high or + # you'll get the kernel OOM killer (on my machine 35% is too high, for + # example) + user.slices."app".sliceConfig = { + ManagedOOMMemoryPressure = "kill"; + ManagedOOMMemoryPressureLimit = "16%"; + }; + slices."background".sliceConfig = { + ManagedOOMMemoryPressure = "kill"; + ManagedOOMMemoryPressureLimit = "8%"; + }; + user.slices."background".sliceConfig = { + ManagedOOMMemoryPressure = "kill"; + ManagedOOMMemoryPressureLimit = "8%"; + }; + }; + }; +} diff --git a/flake.lock b/flake.lock index 9799ac5..026d51c 100644 --- a/flake.lock +++ b/flake.lock @@ -40,28 +40,6 @@ "type": "github" } }, - "devshell": { - "inputs": { - "flake-utils": "flake-utils_2", - "nixpkgs": [ - "steam-servers", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1705332421, - "narHash": "sha256-USpGLPme1IuqG78JNqSaRabilwkCyHmVWY0M9vYyqEA=", - "owner": "numtide", - "repo": "devshell", - "rev": "83cb93d6d063ad290beee669f4badf9914cc16ec", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "devshell", - "type": "github" - } - }, "dw-proton": { "inputs": { "nixpkgs": [ @@ -129,58 +107,6 @@ "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" } }, - "flake-compat_4": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": [ - "steam-servers", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1706830856, - "narHash": "sha256-a0NYyp+h9hlb7ddVz4LUn1vT/PLwqfrWYcHMvFB1xYg=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "b253292d9c0a5ead9bc98c4e9a26c6312e27d69f", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-root": { - "locked": { - "lastModified": 1692742795, - "narHash": "sha256-f+Y0YhVCIJ06LemO+3Xx00lIcqQxSKJHXT/yk1RTKxw=", - "owner": "srid", - "repo": "flake-root", - "rev": "d9a70d9c7a5fd7f3258ccf48da9335e9b47c3937", - "type": "github" - }, - "original": { - "owner": "srid", - "repo": "flake-root", - "type": "github" - } - }, "flake-utils": { "inputs": { "systems": [ @@ -203,64 +129,6 @@ "type": "github" } }, - "flake-utils_2": { - "inputs": { - "systems": "systems_3" - }, - "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_3": { - "inputs": { - "systems": "systems_4" - }, - "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "gitignore": { - "inputs": { - "nixpkgs": [ - "steam-servers", - "pre-commit-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1703887061, - "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, "helix": { "inputs": { "nixpkgs": "nixpkgs_5", @@ -435,22 +303,6 @@ "type": "github" } }, - "nixpkgs-stable": { - "locked": { - "lastModified": 1704874635, - "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-23.11", - "repo": "nixpkgs", - "type": "github" - } - }, "nixpkgs-xr": { "inputs": { "flake-compat": "flake-compat_3", @@ -658,31 +510,6 @@ "type": "github" } }, - "pre-commit-hooks": { - "inputs": { - "flake-compat": "flake-compat_4", - "flake-utils": "flake-utils_3", - "gitignore": "gitignore", - "nixpkgs": [ - "steam-servers", - "nixpkgs" - ], - "nixpkgs-stable": "nixpkgs-stable" - }, - "locked": { - "lastModified": 1708018599, - "narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, "root": { "inputs": { "moppkgs": "moppkgs", @@ -690,8 +517,6 @@ "nixpkgs": "nixpkgs_2", "sidonia": "sidonia", "sops-nix": "sops-nix", - "steam-fetcher": "steam-fetcher", - "steam-servers": "steam-servers", "unstable": "unstable" } }, @@ -810,11 +635,11 @@ "zen-browser": "zen-browser" }, "locked": { - "lastModified": 1783127058, - "narHash": "sha256-xeZtfNL7mjUbhUrVH1Vu9hkHuv6acVgZipJxaGk+Yvk=", + "lastModified": 1783174875, + "narHash": "sha256-qAU9wqvAdMaV14xy/P9s3LKfpBLYbqrIWQqHMahTD7s=", "owner": "Mop-u", "repo": "sidonia", - "rev": "64550a6a968059728389050d6607894b0055b9d0", + "rev": "f45a5af17e77c787469533dfeacebb7d757f7690", "type": "github" }, "original": { @@ -843,54 +668,6 @@ "type": "github" } }, - "steam-fetcher": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1758622040, - "narHash": "sha256-BRUZZoQDCD1qByJjHm4YKipQlB2PburWLG9Iaggr8XQ=", - "owner": "aidalgol", - "repo": "nix-steam-fetcher", - "rev": "ab5e3a0828b4b179feb548c57be584ce812956a8", - "type": "github" - }, - "original": { - "owner": "aidalgol", - "repo": "nix-steam-fetcher", - "type": "github" - } - }, - "steam-servers": { - "inputs": { - "devshell": "devshell", - "flake-parts": "flake-parts", - "flake-root": "flake-root", - "nixpkgs": [ - "nixpkgs" - ], - "pre-commit-hooks": "pre-commit-hooks", - "steam-fetcher": [ - "steam-fetcher" - ], - "treefmt-nix": "treefmt-nix_2" - }, - "locked": { - "lastModified": 1766197538, - "narHash": "sha256-qXuuNhN5K/d/qAAoiIKb9Tvd7+513kuYJHR5+L6+esg=", - "owner": "scottbot95", - "repo": "nix-steam-servers", - "rev": "87516cc98533dd9d28fa75d7abf4a7010ab5e7b3", - "type": "github" - }, - "original": { - "owner": "scottbot95", - "repo": "nix-steam-servers", - "type": "github" - } - }, "stextCatppuccin": { "flake": false, "locked": { @@ -953,36 +730,6 @@ "type": "github" } }, - "systems_3": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_4": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, "treefmt-nix": { "inputs": { "nixpkgs": [ @@ -1005,27 +752,6 @@ "type": "github" } }, - "treefmt-nix_2": { - "inputs": { - "nixpkgs": [ - "steam-servers", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1707300477, - "narHash": "sha256-qQF0fEkHlnxHcrKIMRzOETnRBksUK048MXkX0SOmxvA=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "ac599dab59a66304eb511af07b3883114f061b9d", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } - }, "unstable": { "locked": { "lastModified": 1782959384, diff --git a/flake.nix b/flake.nix index a090716..2a6ee87 100644 --- a/flake.nix +++ b/flake.nix @@ -22,17 +22,6 @@ url = "github:Infinidoge/nix-minecraft"; inputs.nixpkgs.follows = "nixpkgs"; }; - - steam-fetcher = { - url = "github:aidalgol/nix-steam-fetcher"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - - steam-servers = { - url = "github:scottbot95/nix-steam-servers"; - inputs.nixpkgs.follows = "nixpkgs"; - inputs.steam-fetcher.follows = "steam-fetcher"; - }; }; outputs = @@ -42,6 +31,7 @@ specialArgs = { inherit inputs; }; modules = [ inputs.sops-nix.nixosModules.sops + ./common ]; }; }; diff --git a/hosts/tsumugi/gameServers/default.nix b/hosts/tsumugi/gameServers/default.nix index 6b98c6f..468ece4 100644 --- a/hosts/tsumugi/gameServers/default.nix +++ b/hosts/tsumugi/gameServers/default.nix @@ -8,15 +8,11 @@ { imports = [ inputs.nix-minecraft.nixosModules.minecraft-servers - inputs.steam-servers.nixosModules.default ./minecraft.nix ./cobblemon.nix - ./palworld.nix ]; nixpkgs.overlays = [ inputs.nix-minecraft.overlay ]; - services.steam-servers.datadir = "/mnt/gameservers/steam"; - services.minecraft-servers = { enable = true; eula = true; diff --git a/hosts/tsumugi/gameServers/palworld.nix b/hosts/tsumugi/gameServers/palworld.nix deleted file mode 100644 index 8b66c99..0000000 --- a/hosts/tsumugi/gameServers/palworld.nix +++ /dev/null @@ -1,19 +0,0 @@ -{ - inputs, - config, - pkgs, - lib, - ... -}: -{ - services.steam-servers.palworld = { - palworldServer = { - enable = false; - openFirewall = false; - port = 8211; - worldSettings = { - # see https://palworld.wiki.gg/wiki/PalWorldSettings.ini - }; - }; - }; -} -- 2.51.2