greenhouse

kore

my public infrastructure monorepo

git clone [email protected]:kore.git

kore / nixos / roles / workstation.nix128 lines · 3253B · raw

1{ inputs, outputs, config, pkgs, lib, ... }:
2
3let
4  roleName = "workstation";
5  roleEnabled = lib.elem roleName config.kore.currentHost.roles;
6in {
7  imports = [ inputs.home-manager.nixosModules.home-manager  ];
8
9  config = lib.mkMerge [{} (lib.mkIf roleEnabled {
10    home-manager = {
11      useGlobalPkgs = true;
12      useUserPackages = true;
13      extraSpecialArgs = { inherit inputs outputs; };
14
15      users.lostduk = outputs.homeConfigurations.${config.networking.hostName};
16    };
17
18    programs.fuse.userAllowOther = true;
19
20    xdg.portal = {
21      enable = true;
22      extraPortals = [ pkgs.xdg-desktop-portal-wlr ];
23      configPackages = [ pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-wlr ];
24
25      wlr.enable = true;
26
27      config.common = {
28        default = [ "wlr" ];
29      };
30    };
31
32    system.activationScripts.persistent-dirs.text =
33      let
34        mkHomePersist = user: lib.optionalString user.createHome ''
35          mkdir -p /persist/${user.home}
36          chown ${user.name}:${user.group} /persist/${user.home}
37          chmod ${user.homeMode} /persist/${user.home}
38        '';
39        users = lib.attrValues config.users.users;
40      in
41        lib.concatLines (map mkHomePersist users);
42
43    fonts = {
44      enableDefaultPackages = false;
45
46      packages = with pkgs; [
47        noto-fonts
48        noto-fonts-cjk-sans
49        noto-fonts-cjk-serif
50        noto-fonts-color-emoji
51
52        #(nerdfonts.override { fonts = [ "ComicShannsMono" ]; })
53        nerd-fonts.comic-shanns-mono
54      ];
55
56      fontconfig = {
57        hinting.autohint = true;
58
59        defaultFonts = {
60          serif = [ "Noto Serif" "Noto Color Emoji" ];
61          sansSerif = [ "Noto Sans" "Noto Color Emoji" ];
62          monospace = [ "ComicShannsMono Nerd Font" "Noto Color Emoji" ];
63          emoji = [ "Noto Color Emoji" ];
64        };
65      };
66    };
67
68    services = {
69      udisks2.enable = true;
70
71      pipewire = {
72        enable = true;
73
74        alsa.enable = true;
75        alsa.support32Bit = true;
76
77        pulse.enable = true;
78        jack.enable = true;
79
80        wireplumber = {
81          enable = true;
82
83          # https://github.com/NixOS/nixpkgs/pull/292115
84          extraConfig."alsa-lowlatency" = {
85            "monitor.alsa.rules" = [{
86              matches = [{ "node.name" = "~alsa_output.*"; }];
87
88              actions.update-props = {
89                "audio.format" = "S32LE";
90                "audio.rate" = "96000";
91                "api.alsa.period-size" = 2;
92              };
93            }];
94          };
95        };
96
97        extraConfig.pipewire."92-low-latency" = {
98          context = {
99            properties.default.clock = {
100              rate = 48000;
101              quantum = 64;
102            };
103
104            modules = [{
105              name = "libpipewire-module-protocol-pulse";
106
107              args.pulse = {
108                min = {
109                  req = "64/48000";
110                  quantum = "64/48000";
111                  frag = "64/48000";
112                };
113
114                default.req = "64/48000";
115              };
116            }];
117          };
118          
119          stream.properties = {
120            node.latency = "64/48000";
121            resample.quality = 1;
122          };
123        };
124      };
125    };
126  })];
127}
128