DEVELOPMENT ENVIRONMENT

~liljamo/nix-arta

4992e9f3bb62bcc564d5a4b7c201f9358535447a — Jonni Liljamo 8 days ago 2bedbcd
feat: arwen as first ws
D systems/hosts/arwen/default.nix => systems/hosts/arwen/default.nix +0 -55
@@ 1,55 0,0 @@
{
  inputs,
  lib,
  pkgs,
  ...
}: {
  imports = [
    ./hardware-configuration.nix

    inputs.nixos-hardware.nixosModules.lenovo-thinkpad-e495
  ];

  boot.initrd.postDeviceCommands = lib.mkAfter ''
    zfs rollback -r zpool/root@blank
  '';

  sops.defaultSopsFile = ../../../secrets/arwen/secrets.yaml;
  sops.gnupg.sshKeyPaths = ["/persist/etc/ssh/ssh_host_rsa_key"];
  sops.age.sshKeyPaths = ["/persist/etc/ssh/ssh_host_ed25519_key"];

  networking.hostId = "d2a2e2cb";
  networking.networkmanager.enable = true;

  time.timeZone = "Europe/Helsinki";

  services.xserver.xkb.layout = "us";

  services.libinput.enable = true;

  environment.systemPackages = with pkgs; [
    inputs.nvim-flake.packages.x86_64-linux.nvim
    wget

    keepassxc
    jellyfin-mpv-shim
    libreoffice-qt6-fresh
  ];

  environment.persistence."/persist" = {
    hideMounts = true;
    directories = [
      "/etc/nixos"
      "/etc/ssh"
      "/var/lib/nixos"
      "/var/lib/tailscale"
    ];
  };

  services.pcscd.enable = true;
  programs.gnupg.agent.enable = true;

  services.openssh.enable = true;

  system.stateVersion = "24.05";
}

M systems/hosts/default.nix => systems/hosts/default.nix +0 -5
@@ 10,9 10,4 @@
    profile = desktop;
    modules = [];
  };
  arwen = {
    system = "x86_64-linux";
    profile = laptop;
    modules = [];
  };
}

A ws/.gitignore => ws/.gitignore +1 -0
@@ 0,0 1,1 @@
/result

A ws/flake.lock => ws/flake.lock +866 -0
@@ 0,0 1,866 @@
{
  "nodes": {
    "crane": {
      "locked": {
        "lastModified": 1730652660,
        "narHash": "sha256-+XVYfmVXAiYA0FZT7ijHf555dxCe+AoAT5A6RU+6vSo=",
        "owner": "ipetkov",
        "repo": "crane",
        "rev": "a4ca93905455c07cb7e3aca95d4faf7601cba458",
        "type": "github"
      },
      "original": {
        "owner": "ipetkov",
        "repo": "crane",
        "type": "github"
      }
    },
    "devshell": {
      "inputs": {
        "nixpkgs": [
          "nvim-flake",
          "nixvim",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1728330715,
        "narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=",
        "owner": "numtide",
        "repo": "devshell",
        "rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef",
        "type": "github"
      },
      "original": {
        "owner": "numtide",
        "repo": "devshell",
        "type": "github"
      }
    },
    "flake-compat": {
      "locked": {
        "lastModified": 1696426674,
        "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
        "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
        "revCount": 57,
        "type": "tarball",
        "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz"
      },
      "original": {
        "type": "tarball",
        "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
      }
    },
    "flake-parts": {
      "inputs": {
        "nixpkgs-lib": "nixpkgs-lib"
      },
      "locked": {
        "lastModified": 1727826117,
        "narHash": "sha256-K5ZLCyfO/Zj9mPFldf3iwS6oZStJcU4tSpiXTMYaaL0=",
        "owner": "hercules-ci",
        "repo": "flake-parts",
        "rev": "3d04084d54bedc3d6b8b736c70ef449225c361b1",
        "type": "github"
      },
      "original": {
        "owner": "hercules-ci",
        "repo": "flake-parts",
        "type": "github"
      }
    },
    "flake-parts_2": {
      "inputs": {
        "nixpkgs-lib": [
          "nvim-flake",
          "nixvim",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1727826117,
        "narHash": "sha256-K5ZLCyfO/Zj9mPFldf3iwS6oZStJcU4tSpiXTMYaaL0=",
        "owner": "hercules-ci",
        "repo": "flake-parts",
        "rev": "3d04084d54bedc3d6b8b736c70ef449225c361b1",
        "type": "github"
      },
      "original": {
        "owner": "hercules-ci",
        "repo": "flake-parts",
        "type": "github"
      }
    },
    "flake-utils": {
      "inputs": {
        "systems": "systems_2"
      },
      "locked": {
        "lastModified": 1726560853,
        "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
        "owner": "numtide",
        "repo": "flake-utils",
        "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
        "type": "github"
      },
      "original": {
        "owner": "numtide",
        "repo": "flake-utils",
        "type": "github"
      }
    },
    "flake-utils_2": {
      "inputs": {
        "systems": "systems_3"
      },
      "locked": {
        "lastModified": 1726560853,
        "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
        "owner": "numtide",
        "repo": "flake-utils",
        "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
        "type": "github"
      },
      "original": {
        "owner": "numtide",
        "repo": "flake-utils",
        "type": "github"
      }
    },
    "git-hooks": {
      "inputs": {
        "flake-compat": [
          "nvim-flake",
          "nixvim",
          "flake-compat"
        ],
        "gitignore": "gitignore",
        "nixpkgs": [
          "nvim-flake",
          "nixvim",
          "nixpkgs"
        ],
        "nixpkgs-stable": [
          "nvim-flake",
          "nixvim",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1730302582,
        "narHash": "sha256-W1MIJpADXQCgosJZT8qBYLRuZls2KSiKdpnTVdKBuvU=",
        "owner": "cachix",
        "repo": "git-hooks.nix",
        "rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf",
        "type": "github"
      },
      "original": {
        "owner": "cachix",
        "repo": "git-hooks.nix",
        "type": "github"
      }
    },
    "gitignore": {
      "inputs": {
        "nixpkgs": [
          "nvim-flake",
          "nixvim",
          "git-hooks",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1709087332,
        "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
        "owner": "hercules-ci",
        "repo": "gitignore.nix",
        "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
        "type": "github"
      },
      "original": {
        "owner": "hercules-ci",
        "repo": "gitignore.nix",
        "type": "github"
      }
    },
    "home-manager": {
      "inputs": {
        "nixpkgs": [
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1726989464,
        "narHash": "sha256-Vl+WVTJwutXkimwGprnEtXc/s/s8sMuXzqXaspIGlwM=",
        "owner": "nix-community",
        "repo": "home-manager",
        "rev": "2f23fa308a7c067e52dfcc30a0758f47043ec176",
        "type": "github"
      },
      "original": {
        "owner": "nix-community",
        "ref": "release-24.05",
        "repo": "home-manager",
        "type": "github"
      }
    },
    "home-manager_2": {
      "inputs": {
        "nixpkgs": [
          "nvim-flake",
          "nixvim",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1730016908,
        "narHash": "sha256-bFCxJco7d8IgmjfNExNz9knP8wvwbXU4s/d53KOK6U0=",
        "owner": "nix-community",
        "repo": "home-manager",
        "rev": "e83414058edd339148dc142a8437edb9450574c8",
        "type": "github"
      },
      "original": {
        "owner": "nix-community",
        "repo": "home-manager",
        "type": "github"
      }
    },
    "hy3": {
      "inputs": {
        "hyprland": "hyprland"
      },
      "locked": {
        "lastModified": 1719341859,
        "narHash": "sha256-aZuNKBwTwj8EXkDBMWNdRKbHPx647wJLWm55h6jOKbo=",
        "owner": "outfoxxed",
        "repo": "hy3",
        "rev": "d200873687ea1f10958adb6c08cfcfa44b13267f",
        "type": "github"
      },
      "original": {
        "owner": "outfoxxed",
        "ref": "hl0.41.2",
        "repo": "hy3",
        "type": "github"
      }
    },
    "hyprcursor": {
      "inputs": {
        "hyprlang": [
          "hy3",
          "hyprland",
          "hyprlang"
        ],
        "nixpkgs": [
          "hy3",
          "hyprland",
          "nixpkgs"
        ],
        "systems": [
          "hy3",
          "hyprland",
          "systems"
        ]
      },
      "locked": {
        "lastModified": 1718450675,
        "narHash": "sha256-jpsns6buS4bK+1sF8sL8AaixAiCRjA+nldTKvcwmvUs=",
        "owner": "hyprwm",
        "repo": "hyprcursor",
        "rev": "66d5b46ff94efbfa6fa3d1d1b66735f1779c34a6",
        "type": "github"
      },
      "original": {
        "owner": "hyprwm",
        "repo": "hyprcursor",
        "type": "github"
      }
    },
    "hyprland": {
      "inputs": {
        "hyprcursor": "hyprcursor",
        "hyprlang": "hyprlang",
        "hyprutils": "hyprutils",
        "hyprwayland-scanner": "hyprwayland-scanner",
        "nixpkgs": "nixpkgs",
        "systems": "systems",
        "xdph": "xdph"
      },
      "locked": {
        "lastModified": 1719317162,
        "narHash": "sha256-JmfnYz+9a4TjNl3mAus1VpoWtTI9d1xkW9MHbkcV0Po=",
        "rev": "918d8340afd652b011b937d29d5eea0be08467f5",
        "revCount": 4886,
        "submodules": true,
        "type": "git",
        "url": "https://github.com/hyprwm/Hyprland"
      },
      "original": {
        "rev": "918d8340afd652b011b937d29d5eea0be08467f5",
        "submodules": true,
        "type": "git",
        "url": "https://github.com/hyprwm/Hyprland"
      }
    },
    "hyprland-protocols": {
      "inputs": {
        "nixpkgs": [
          "hy3",
          "hyprland",
          "xdph",
          "nixpkgs"
        ],
        "systems": [
          "hy3",
          "hyprland",
          "xdph",
          "systems"
        ]
      },
      "locked": {
        "lastModified": 1714869498,
        "narHash": "sha256-vbLVOWvQqo4n1yvkg/Q70VTlPbMmTiCQfNTgcWDCfJM=",
        "owner": "hyprwm",
        "repo": "hyprland-protocols",
        "rev": "e06482e0e611130cd1929f75e8c1cf679e57d161",
        "type": "github"
      },
      "original": {
        "owner": "hyprwm",
        "repo": "hyprland-protocols",
        "type": "github"
      }
    },
    "hyprlang": {
      "inputs": {
        "hyprutils": [
          "hy3",
          "hyprland",
          "hyprutils"
        ],
        "nixpkgs": [
          "hy3",
          "hyprland",
          "nixpkgs"
        ],
        "systems": [
          "hy3",
          "hyprland",
          "systems"
        ]
      },
      "locked": {
        "lastModified": 1717881852,
        "narHash": "sha256-XeeVoKHQgfKuXoP6q90sUqKyl7EYy3ol2dVZGM+Jj94=",
        "owner": "hyprwm",
        "repo": "hyprlang",
        "rev": "ec6938c66253429192274d612912649a0cfe4d28",
        "type": "github"
      },
      "original": {
        "owner": "hyprwm",
        "repo": "hyprlang",
        "type": "github"
      }
    },
    "hyprutils": {
      "inputs": {
        "nixpkgs": [
          "hy3",
          "hyprland",
          "nixpkgs"
        ],
        "systems": [
          "hy3",
          "hyprland",
          "systems"
        ]
      },
      "locked": {
        "lastModified": 1719316102,
        "narHash": "sha256-dmRz128j/lJmMuTYeCYPfSBRHHQO3VeH4PbmoyAhHzw=",
        "owner": "hyprwm",
        "repo": "hyprutils",
        "rev": "1f6bbec5954f623ff8d68e567bddcce97cd2f085",
        "type": "github"
      },
      "original": {
        "owner": "hyprwm",
        "repo": "hyprutils",
        "type": "github"
      }
    },
    "hyprwayland-scanner": {
      "inputs": {
        "nixpkgs": [
          "hy3",
          "hyprland",
          "nixpkgs"
        ],
        "systems": [
          "hy3",
          "hyprland",
          "systems"
        ]
      },
      "locked": {
        "lastModified": 1719067853,
        "narHash": "sha256-mAnZG/eQy72Fp1ImGtqCgUrDumnR1rMZv2E/zgP4U74=",
        "owner": "hyprwm",
        "repo": "hyprwayland-scanner",
        "rev": "914f083741e694092ee60a39d31f693d0a6dc734",
        "type": "github"
      },
      "original": {
        "owner": "hyprwm",
        "repo": "hyprwayland-scanner",
        "type": "github"
      }
    },
    "impermanence": {
      "locked": {
        "lastModified": 1731242966,
        "narHash": "sha256-B3C3JLbGw0FtLSWCjBxU961gLNv+BOOBC6WvstKLYMw=",
        "owner": "nix-community",
        "repo": "impermanence",
        "rev": "3ed3f0eaae9fcc0a8331e77e9319c8a4abd8a71a",
        "type": "github"
      },
      "original": {
        "owner": "nix-community",
        "repo": "impermanence",
        "type": "github"
      }
    },
    "ixx": {
      "inputs": {
        "flake-utils": [
          "nvim-flake",
          "nixvim",
          "nuschtosSearch",
          "flake-utils"
        ],
        "nixpkgs": [
          "nvim-flake",
          "nixvim",
          "nuschtosSearch",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1729544999,
        "narHash": "sha256-YcyJLvTmN6uLEBGCvYoMLwsinblXMkoYkNLEO4WnKus=",
        "owner": "NuschtOS",
        "repo": "ixx",
        "rev": "65c207c92befec93e22086da9456d3906a4e999c",
        "type": "github"
      },
      "original": {
        "owner": "NuschtOS",
        "ref": "v0.0.5",
        "repo": "ixx",
        "type": "github"
      }
    },
    "nix-darwin": {
      "inputs": {
        "nixpkgs": [
          "nvim-flake",
          "nixvim",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1730184279,
        "narHash": "sha256-6OB+WWR6gnaWiqSS28aMJypKeK7Pjc2Wm6L0MtOrTuA=",
        "owner": "lnl7",
        "repo": "nix-darwin",
        "rev": "b379bd4d872d159e5189053ce9a4adf86d56db4b",
        "type": "github"
      },
      "original": {
        "owner": "lnl7",
        "repo": "nix-darwin",
        "type": "github"
      }
    },
    "nixos-hardware": {
      "locked": {
        "lastModified": 1731403644,
        "narHash": "sha256-T9V7CTucjRZ4Qc6pUEV/kpgNGzQbHWfGcfK6JJLfUeI=",
        "owner": "nixos",
        "repo": "nixos-hardware",
        "rev": "f6581f1c3b137086e42a08a906bdada63045f991",
        "type": "github"
      },
      "original": {
        "owner": "nixos",
        "repo": "nixos-hardware",
        "type": "github"
      }
    },
    "nixpkgs": {
      "locked": {
        "lastModified": 1719075281,
        "narHash": "sha256-CyyxvOwFf12I91PBWz43iGT1kjsf5oi6ax7CrvaMyAo=",
        "owner": "NixOS",
        "repo": "nixpkgs",
        "rev": "a71e967ef3694799d0c418c98332f7ff4cc5f6af",
        "type": "github"
      },
      "original": {
        "owner": "NixOS",
        "ref": "nixos-unstable",
        "repo": "nixpkgs",
        "type": "github"
      }
    },
    "nixpkgs-lib": {
      "locked": {
        "lastModified": 1731497087,
        "narHash": "sha256-0xHYkMkeLVQAMa7gvkddbPqpxph+hDzdu1XdGPJR+Os=",
        "type": "tarball",
        "url": "https://github.com/NixOS/nixpkgs/archive/fb192fec7cc7a4c26d51779e9bab07ce6fa5597a.tar.gz"
      },
      "original": {
        "type": "tarball",
        "url": "https://github.com/NixOS/nixpkgs/archive/fb192fec7cc7a4c26d51779e9bab07ce6fa5597a.tar.gz"
      }
    },
    "nixpkgs-stable": {
      "locked": {
        "lastModified": 1731489818,
        "narHash": "sha256-VpMvK9x/CWykzWEENEpukNNIE3oW6M5NGNv3tdKB9OY=",
        "owner": "NixOS",
        "repo": "nixpkgs",
        "rev": "1252394ddb5900089300b8e602302c0fa85da4d2",
        "type": "github"
      },
      "original": {
        "owner": "NixOS",
        "ref": "release-24.05",
        "repo": "nixpkgs",
        "type": "github"
      }
    },
    "nixpkgs-unstable": {
      "locked": {
        "lastModified": 1731139594,
        "narHash": "sha256-IigrKK3vYRpUu+HEjPL/phrfh7Ox881er1UEsZvw9Q4=",
        "owner": "nixos",
        "repo": "nixpkgs",
        "rev": "76612b17c0ce71689921ca12d9ffdc9c23ce40b2",
        "type": "github"
      },
      "original": {
        "owner": "nixos",
        "ref": "nixos-unstable",
        "repo": "nixpkgs",
        "type": "github"
      }
    },
    "nixpkgs_2": {
      "locked": {
        "lastModified": 1730327045,
        "narHash": "sha256-xKel5kd1AbExymxoIfQ7pgcX6hjw9jCgbiBjiUfSVJ8=",
        "owner": "nixos",
        "repo": "nixpkgs",
        "rev": "080166c15633801df010977d9d7474b4a6c549d7",
        "type": "github"
      },
      "original": {
        "owner": "nixos",
        "ref": "nixos-24.05",
        "repo": "nixpkgs",
        "type": "github"
      }
    },
    "nixpkgs_3": {
      "locked": {
        "lastModified": 1730200266,
        "narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=",
        "owner": "nixos",
        "repo": "nixpkgs",
        "rev": "807e9154dcb16384b1b765ebe9cd2bba2ac287fd",
        "type": "github"
      },
      "original": {
        "owner": "nixos",
        "ref": "nixos-unstable",
        "repo": "nixpkgs",
        "type": "github"
      }
    },
    "nixpkgs_4": {
      "locked": {
        "lastModified": 1731245184,
        "narHash": "sha256-vmLS8+x+gHRv1yzj3n+GTAEObwmhxmkkukB2DwtJRdU=",
        "owner": "NixOS",
        "repo": "nixpkgs",
        "rev": "aebe249544837ce42588aa4b2e7972222ba12e8f",
        "type": "github"
      },
      "original": {
        "owner": "NixOS",
        "ref": "nixpkgs-unstable",
        "repo": "nixpkgs",
        "type": "github"
      }
    },
    "nixvim": {
      "inputs": {
        "devshell": "devshell",
        "flake-compat": "flake-compat",
        "flake-parts": "flake-parts_2",
        "git-hooks": "git-hooks",
        "home-manager": "home-manager_2",
        "nix-darwin": "nix-darwin",
        "nixpkgs": [
          "nvim-flake",
          "nixpkgs"
        ],
        "nuschtosSearch": "nuschtosSearch",
        "treefmt-nix": "treefmt-nix"
      },
      "locked": {
        "lastModified": 1730499477,
        "narHash": "sha256-olt0Sx4alDxv3ko9BgbV3SsE2KQ/Tf0/Az1Fr9s2Y6U=",
        "owner": "nix-community",
        "repo": "nixvim",
        "rev": "356896f58dde22ee16481b7c954e340dceec340d",
        "type": "github"
      },
      "original": {
        "owner": "nix-community",
        "repo": "nixvim",
        "type": "github"
      }
    },
    "nuschtosSearch": {
      "inputs": {
        "flake-utils": "flake-utils",
        "ixx": "ixx",
        "nixpkgs": [
          "nvim-flake",
          "nixvim",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1730337772,
        "narHash": "sha256-uTxvqDohfG85+zldO5Tf1B+fuAF8ZhMouNwG5S6OAnA=",
        "owner": "NuschtOS",
        "repo": "search",
        "rev": "4e0a7a95a3df3333771abc4df6a656e7baf67106",
        "type": "github"
      },
      "original": {
        "owner": "NuschtOS",
        "repo": "search",
        "type": "github"
      }
    },
    "nvim-flake": {
      "inputs": {
        "flake-parts": [
          "flake-parts"
        ],
        "nixpkgs": "nixpkgs_3",
        "nixvim": "nixvim"
      },
      "locked": {
        "lastModified": 1731245970,
        "narHash": "sha256-im4BKDAYg417Q5Enb9i8ZXQXAxLEJyA8egK1s/mUw80=",
        "ref": "refs/heads/master",
        "rev": "f68996e4ee50e58f580e564f60465c975a482334",
        "revCount": 41,
        "type": "git",
        "url": "https://git.src.quest/~liljamo/nvim-flake"
      },
      "original": {
        "type": "git",
        "url": "https://git.src.quest/~liljamo/nvim-flake"
      }
    },
    "root": {
      "inputs": {
        "flake-parts": "flake-parts",
        "home-manager": "home-manager",
        "hy3": "hy3",
        "impermanence": "impermanence",
        "nixos-hardware": "nixos-hardware",
        "nixpkgs": "nixpkgs_2",
        "nixpkgs-unstable": "nixpkgs-unstable",
        "nvim-flake": "nvim-flake",
        "sops-nix": "sops-nix",
        "zjstatus": "zjstatus"
      }
    },
    "rust-overlay": {
      "inputs": {
        "nixpkgs": [
          "zjstatus",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1730687492,
        "narHash": "sha256-xQVadjquBA/tFxDt5A55LJ1D1AvkVWsnrKC2o+pr8F4=",
        "owner": "oxalica",
        "repo": "rust-overlay",
        "rev": "41814763a2c597755b0755dbe3e721367a5e420f",
        "type": "github"
      },
      "original": {
        "owner": "oxalica",
        "repo": "rust-overlay",
        "type": "github"
      }
    },
    "sops-nix": {
      "inputs": {
        "nixpkgs": "nixpkgs_4",
        "nixpkgs-stable": "nixpkgs-stable"
      },
      "locked": {
        "lastModified": 1729999681,
        "narHash": "sha256-qm0uCtM9bg97LeJTKQ8dqV/FvqRN+ompyW4GIJruLuw=",
        "owner": "Mic92",
        "repo": "sops-nix",
        "rev": "1666d16426abe79af5c47b7c0efa82fd31bf4c56",
        "type": "github"
      },
      "original": {
        "owner": "Mic92",
        "repo": "sops-nix",
        "type": "github"
      }
    },
    "systems": {
      "locked": {
        "lastModified": 1689347949,
        "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
        "owner": "nix-systems",
        "repo": "default-linux",
        "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
        "type": "github"
      },
      "original": {
        "owner": "nix-systems",
        "repo": "default-linux",
        "type": "github"
      }
    },
    "systems_2": {
      "locked": {
        "lastModified": 1681028828,
        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
        "owner": "nix-systems",
        "repo": "default",
        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
        "type": "github"
      },
      "original": {
        "owner": "nix-systems",
        "repo": "default",
        "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"
      }
    },
    "treefmt-nix": {
      "inputs": {
        "nixpkgs": [
          "nvim-flake",
          "nixvim",
          "nixpkgs"
        ]
      },
      "locked": {
        "lastModified": 1730321837,
        "narHash": "sha256-vK+a09qq19QNu2MlLcvN4qcRctJbqWkX7ahgPZ/+maI=",
        "owner": "numtide",
        "repo": "treefmt-nix",
        "rev": "746901bb8dba96d154b66492a29f5db0693dbfcc",
        "type": "github"
      },
      "original": {
        "owner": "numtide",
        "repo": "treefmt-nix",
        "type": "github"
      }
    },
    "xdph": {
      "inputs": {
        "hyprland-protocols": "hyprland-protocols",
        "hyprlang": [
          "hy3",
          "hyprland",
          "hyprlang"
        ],
        "nixpkgs": [
          "hy3",
          "hyprland",
          "nixpkgs"
        ],
        "systems": [
          "hy3",
          "hyprland",
          "systems"
        ]
      },
      "locked": {
        "lastModified": 1718619174,
        "narHash": "sha256-FWW68AVYmB91ZDQnhLMBNCUUTCjb1ZpO2k2KIytHtkA=",
        "owner": "hyprwm",
        "repo": "xdg-desktop-portal-hyprland",
        "rev": "c7894aa54f9a7dbd16df5cd24d420c8af22d5623",
        "type": "github"
      },
      "original": {
        "owner": "hyprwm",
        "repo": "xdg-desktop-portal-hyprland",
        "type": "github"
      }
    },
    "zjstatus": {
      "inputs": {
        "crane": "crane",
        "flake-utils": "flake-utils_2",
        "nixpkgs": [
          "nixpkgs-unstable"
        ],
        "rust-overlay": "rust-overlay"
      },
      "locked": {
        "lastModified": 1730748983,
        "narHash": "sha256-72uoWm/34SU5aHgvUJgKqYMhvt4Y9X39bFhcDwVS+P0=",
        "owner": "dj95",
        "repo": "zjstatus",
        "rev": "d5794fbec93860ead015b0beee70489f50cd87b1",
        "type": "github"
      },
      "original": {
        "owner": "dj95",
        "repo": "zjstatus",
        "type": "github"
      }
    }
  },
  "root": "root",
  "version": 7
}

A ws/flake.nix => ws/flake.nix +41 -0
@@ 0,0 1,41 @@
{
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
    nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";

    nixos-hardware.url = "github:nixos/nixos-hardware";

    home-manager = {
      url = "github:nix-community/home-manager/release-24.05";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    flake-parts.url = "github:hercules-ci/flake-parts";
    sops-nix.url = "github:Mic92/sops-nix";
    impermanence.url = "github:nix-community/impermanence";

    # Packages
    zjstatus = {
      url = "github:dj95/zjstatus";
      inputs.nixpkgs.follows = "nixpkgs-unstable";
    };

    # This has to match what is currently in NixOS stable.
    hy3.url = "github:outfoxxed/hy3?ref=hl0.41.2";

    # Own flakes
    nvim-flake = {
      url = "git+https://git.src.quest/~liljamo/nvim-flake";
      inputs.flake-parts.follows = "flake-parts";
    };
  };

  outputs = inputs @ {self, ...}:
    inputs.flake-parts.lib.mkFlake {inherit inputs;} {
      imports = [
        ./systems.nix
      ];

      systems = [];
    };
}

A ws/hosts/arwen/core/default.nix => ws/hosts/arwen/core/default.nix +21 -0
@@ 0,0 1,21 @@
{lib, ...}: {
  imports = [
    ./hardware-configuration.nix
    ./impermanence.nix
  ];

  boot.initrd.postDeviceCommands = lib.mkAfter ''
    zfs rollback -r zpool/root@blank
  '';

  sops.defaultSopsFile = ../../../../secrets/arwen/secrets.yaml;
  sops.gnupg.sshKeyPaths = ["/persist/etc/ssh/ssh_host_rsa_key"];
  sops.age.sshKeyPaths = ["/persist/etc/ssh/ssh_host_ed25519_key"];

  networking.hostId = "d2a2e2cb";
  networking.networkmanager.enable = true;

  time.timeZone = "Europe/Helsinki";

  system.stateVersion = "24.05";
}

R systems/hosts/arwen/hardware-configuration.nix => ws/hosts/arwen/core/hardware-configuration.nix +0 -2
@@ 1,7 1,6 @@
{
  config,
  lib,
  pkgs,
  modulesPath,
  ...
}: {


@@ 16,7 15,6 @@
  boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "usb_storage" "sd_mod" "sdhci_pci"];
  boot.initrd.kernelModules = ["zfs"];
  boot.kernelModules = ["kvm-amd"];
  boot.extraModulePackages = [];
  boot.supportedFilesystems = ["zfs"];

  fileSystems."/" = {

A ws/hosts/arwen/core/impermanence.nix => ws/hosts/arwen/core/impermanence.nix +11 -0
@@ 0,0 1,11 @@
{
  environment.persistence."/persist" = {
    hideMounts = true;
    directories = [
      "/etc/nixos"
      "/etc/ssh"
      "/var/lib/nixos"
      "/var/lib/tailscale"
    ];
  };
}

R hosts/arwen/default.nix => ws/hosts/arwen/default.nix +26 -1
@@ 1,8 1,33 @@
{config, ...}: {
{
  config,
  inputs,
  pkgs,
  ...
}: {
  imports = [
    ./core

    ./hyprland.nix
  ];

  services.xserver.xkb.layout = "us";

  services.libinput.enable = true;

  environment.systemPackages = with pkgs; [
    inputs.nvim-flake.packages.x86_64-linux.nvim
    wget

    keepassxc
    jellyfin-mpv-shim
    libreoffice-qt6-fresh
  ];

  services.pcscd.enable = true;
  programs.gnupg.agent.enable = true;

  services.openssh.enable = true;

  sops.secrets.rootPwd.neededForUsers = true;
  sops.secrets.skyePwd.neededForUsers = true;


R hosts/arwen/hyprland.nix => ws/hosts/arwen/hyprland.nix +0 -0
A ws/hosts/default.nix => ws/hosts/default.nix +17 -0
@@ 0,0 1,17 @@
inputs: profiles: {
  alice = {
    system = "x86_64-linux";
    profile = profiles.desktop;
    modules = [
      inputs.impermanence.nixosModules.impermanence
    ];
  };
  arwen = {
    system = "x86_64-linux";
    profile = profiles.laptop;
    modules = [
      inputs.impermanence.nixosModules.impermanence
      inputs.nixos-hardware.nixosModules.lenovo-thinkpad-e495
    ];
  };
}

A ws/profiles/common/editor.nix => ws/profiles/common/editor.nix +3 -0
@@ 0,0 1,3 @@
{
  environment.variables.EDITOR = "nvim";
}

A ws/profiles/common/fonts.nix => ws/profiles/common/fonts.nix +14 -0
@@ 0,0 1,14 @@
{pkgs, ...}: let
  fonts = with pkgs; [
    font-awesome

    liberation_ttf

    (nerdfonts.override {
      fonts = ["FiraCode" "VictorMono"];
    })
  ];
in {
  environment.systemPackages = fonts;
  fonts.packages = fonts;
}

A ws/profiles/common/nix.nix => ws/profiles/common/nix.nix +14 -0
@@ 0,0 1,14 @@
{
  nix = {
    gc = {
      automatic = true;
      dates = "weekly";
      options = "--delete-older-than 7d";
    };
    settings = {
      auto-optimise-store = true;
      experimental-features = ["nix-command" "flakes"];
      trusted-users = ["@wheel"];
    };
  };
}

A ws/profiles/default.nix => ws/profiles/default.nix +4 -0
@@ 0,0 1,4 @@
inputs: {
  desktop = import ./desktop.nix inputs;
  laptop = import ./laptop.nix inputs;
}

A ws/profiles/desktop.nix => ws/profiles/desktop.nix +15 -0
@@ 0,0 1,15 @@
inputs: {
  modules = [
    inputs.sops-nix.nixosModules.sops
    inputs.home-manager.nixosModules.home-manager

    ../roles

    ./common/fonts.nix
    ./common/nix.nix
    ./common/editor.nix
  ];
  specialArgs = {
    inherit inputs;
  };
}

A ws/profiles/laptop.nix => ws/profiles/laptop.nix +19 -0
@@ 0,0 1,19 @@
inputs: {
  modules = [
    inputs.sops-nix.nixosModules.sops
    inputs.home-manager.nixosModules.home-manager

    ../roles

    ./common/fonts.nix
    ./common/nix.nix
    ./common/editor.nix

    {
      programs.light.enable = true;
    }
  ];
  specialArgs = {
    inherit inputs;
  };
}

A ws/roles/audio.nix => ws/roles/audio.nix +28 -0
@@ 0,0 1,28 @@
{
  config,
  lib,
  pkgs,
  ...
}: let
  cfg = config.roles.audio;
in {
  options.roles.audio = {
    enable = lib.mkEnableOption "enable audio";
  };

  config = lib.mkIf cfg.enable {
    environment.systemPackages = with pkgs; [
      pavucontrol
    ];

    services.pipewire = {
      enable = true;
      alsa = {
        enable = true;
        support32Bit = true;
      };
      jack.enable = true;
      pulse.enable = true;
    };
  };
}

A ws/roles/base.nix => ws/roles/base.nix +65 -0
@@ 0,0 1,65 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.base;
in {
  options.roles.base = {
    root = lib.mkOption {
      type = lib.types.submodule {
        options = {
          hashedPasswordFile = lib.mkOption {
            type = lib.types.path;
          };
        };
      };
    };
    primaryUser = lib.mkOption {
      type = lib.types.submodule {
        options = {
          username = lib.mkOption {
            type = lib.types.str;
          };
          isWheel = lib.mkEnableOption "admin permissions";
          extraGroups = lib.mkOption {
            type = lib.types.listOf lib.types.str;
            default = [];
          };
          hashedPasswordFile = lib.mkOption {
            type = lib.types.path;
          };
        };
      };
    };
  };

  imports = [
    (lib.mkAliasOptionModule ["hm"] [
      "home-manager"
      "users"
      cfg.primaryUser.username
    ])
  ];

  config = let
    homeDirectory = "/home/${cfg.primaryUser.username}";
  in {
    users.users.root.hashedPasswordFile = cfg.root.hashedPasswordFile;
    users.users.${cfg.primaryUser.username} = {
      isNormalUser = true;
      extraGroups = cfg.primaryUser.extraGroups ++ lib.optional cfg.primaryUser.isWheel "wheel";
      home = homeDirectory;
      hashedPasswordFile = cfg.primaryUser.hashedPasswordFile;
    };
    home-manager = {
      useUserPackages = true;
      useGlobalPkgs = true;
    };
    hm.home = {
      inherit (cfg.primaryUser) username;
      inherit homeDirectory;
      stateVersion = config.system.stateVersion;
    };
  };
}

A ws/roles/bluetooth.nix => ws/roles/bluetooth.nix +28 -0
@@ 0,0 1,28 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.bluetooth;
in {
  options.roles.bluetooth = {
    enable = lib.mkEnableOption "enable bluetooth";
    enableHDAudio = lib.mkEnableOption "enable HD audio for bluetooth";
  };

  config = lib.mkIf cfg.enable {
    hardware.bluetooth.enable = true;
    services.blueman.enable = true;

    services.pipewire.wireplumber.extraConfig = lib.mkIf cfg.enableHDAudio {
      bluetoothEnhancements = {
        "monitor.bluez.properties" = {
          "bluez5.enable-sbc-xq" = true;
          "bluez5.enable-msbc" = true;
          "bluez5.enable-hw-volume" = true;
          "bluez5.roles" = ["hsp_hs" "hsp_ag" "hfp_hf" "hfp_ag"];
        };
      };
    };
  };
}

A ws/roles/default.nix => ws/roles/default.nix +9 -0
@@ 0,0 1,9 @@
{lib, ...}: {
  imports =
    [
      ./gaming
      ./graphics
      ./shell
    ]
    ++ lib.pipe ./. [builtins.readDir (lib.filterAttrs (n: ty: ty != "directory" && n != "default.nix" && lib.hasSuffix ".nix" n)) (lib.mapAttrsToList (n: _: ./${n}))];
}

A ws/roles/docker.nix => ws/roles/docker.nix +22 -0
@@ 0,0 1,22 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.docker;
in {
  options.roles.docker = {
    enable = lib.mkEnableOption "Docker";
    enableNvidia = lib.mkEnableOption "Docker NVIDIA GPU support";
  };

  config = lib.mkIf cfg.enable {
    virtualisation.docker = {
      enable = true;
      enableNvidia = cfg.enableNvidia;
    };

    # FIXME: Make configurable.
    roles.base.primaryUser.extraGroups = ["docker"];
  };
}

A ws/roles/gaming/default.nix => ws/roles/gaming/default.nix +59 -0
@@ 0,0 1,59 @@
{
  config,
  lib,
  pkgs,
  ...
}: let
  cfg = config.roles.gaming;
in {
  imports = [
    ./lutris.nix
    ./steam.nix
  ];

  options.roles.gaming = {
    enable = lib.mkEnableOption "gaming utilities";
    lutris.enable = lib.mkEnableOption "Lutris";
    steam.enable = lib.mkEnableOption "Steam";
  };

  config = lib.mkIf cfg.enable {
    programs.gamemode = {
      enable = true;
    };

    environment.systemPackages = with pkgs; [
      gamescope
      protontricks
      gnome.zenity
      r2modman
    ];

    hm = {
      programs.mangohud = {
        enable = true;
        enableSessionWide = false;
        settings = {
          fps_limit = "60,90,120,200";
          time = true;

          gpu_stats = true;
          gpu_temp = true;
          gpu_text = "GPU";

          cpu_stats = true;
          cpu_temp = true;
          cpu_text = "CPU";

          vram = true;
          ram = true;

          fps = true;
          frametime = true;
          frame_timing = true;
          show_fps_limit = true;
        };
      };
    };
  };
}

A ws/roles/gaming/lutris.nix => ws/roles/gaming/lutris.nix +16 -0
@@ 0,0 1,16 @@
{
  config,
  lib,
  pkgs,
  ...
}: let
  cfg = config.roles.gaming;
in {
  config = lib.mkIf cfg.lutris.enable {
    environment.systemPackages = with pkgs; [
      lutris

      wineWowPackages.stable
    ];
  };
}

A ws/roles/gaming/steam.nix => ws/roles/gaming/steam.nix +45 -0
@@ 0,0 1,45 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.gaming;
in {
  config = lib.mkIf cfg.steam.enable {
    roles.unfree.allow = [
      "steam-run"
      "steam-original"
      "steam"
    ];

    nixpkgs.config.packageOverrides = pkgs: {
      steam = pkgs.steam.override {
        extraPkgs = pkgs:
          with pkgs; [
            # For gamescope to work properly:
            # https://github.com/NixOS/nixpkgs/issues/162562#issuecomment-1523177264
            xorg.libXcursor
            xorg.libXi
            xorg.libXinerama
            xorg.libXScrnSaver
            libpng
            libpulseaudio
            libvorbis
            stdenv.cc.cc.lib
            libkrb5
            keyutils

            # Fallback fonts (e.g. for Don't Get Lost).
            liberation_ttf
          ];
      };
    };

    programs.steam = {
      enable = true;
      remotePlay.openFirewall = false;
      dedicatedServer.openFirewall = false;
    };
    hardware.steam-hardware.enable = true;
  };
}

A ws/roles/git.nix => ws/roles/git.nix +42 -0
@@ 0,0 1,42 @@
{
  config,
  lib,
  pkgs,
  ...
}: let
  cfg = config.roles.git;
in {
  options.roles.git = {
    enable = lib.mkEnableOption "enable git";
    email = lib.mkOption {
      type = lib.types.str;
    };
    name = lib.mkOption {
      type = lib.types.str;
    };
    gitExtraConfig = lib.mkOption {
      type = lib.types.lines;
      default = {};
    };
    enableLazygit = lib.mkEnableOption "enable lazygit";
  };

  config = {
    programs.lazygit = lib.mkIf cfg.enableLazygit {
      enable = true;
      settings = {
        disableStartupPopups = true;
      };
    };

    hm = {
      programs.git = lib.mkIf cfg.enable {
        enable = true;
        package = pkgs.gitAndTools.gitFull;
        userEmail = cfg.email;
        userName = cfg.name;
        extraConfig = cfg.gitExtraConfig;
      };
    };
  };
}

A ws/roles/graphics/amd.nix => ws/roles/graphics/amd.nix +13 -0
@@ 0,0 1,13 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.graphics;
in {
  config = lib.mkIf cfg.amd.enable {
    boot.initrd.kernelModules = ["amdgpu"];

    services.xserver.videoDrivers = ["amdgpu"];
  };
}

A ws/roles/graphics/default.nix => ws/roles/graphics/default.nix +26 -0
@@ 0,0 1,26 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.graphics;
in {
  imports = [
    ./amd.nix
    ./nvidia.nix
  ];

  options.roles.graphics = {
    enable = lib.mkEnableOption "graphics drivers";
    amd.enable = lib.mkEnableOption "AMDGPU drivers";
    nvidia.enable = lib.mkEnableOption "NVIDIA drivers";
  };

  config = lib.mkIf cfg.enable {
    hardware.opengl = {
      enable = true;
      driSupport = true;
      driSupport32Bit = true;
    };
  };
}

A ws/roles/graphics/nvidia.nix => ws/roles/graphics/nvidia.nix +21 -0
@@ 0,0 1,21 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.graphics;
in {
  config = lib.mkIf cfg.nvidia.enable {
    roles.unfree.allow = ["nvidia-x11"];

    services.xserver.videoDrivers = ["nvidia"];

    hardware.nvidia = {
      modesetting.enable = true;
      powerManagement.enable = true;
      open = true;
      nvidiaSettings = false;
    };
    boot.kernelParams = ["nvidia-drm.fbdev=1"];
  };
}

A ws/roles/hyprland.nix => ws/roles/hyprland.nix +163 -0
@@ 0,0 1,163 @@
{
  config,
  inputs,
  lib,
  pkgs,
  ...
}: let
  cfg = config.roles.hyprland;
in {
  options.roles.hyprland = {
    enable = lib.mkEnableOption "enable hyprland";
  };

  config = lib.mkIf cfg.enable {
    environment.systemPackages = [
      pkgs.bemenu

      pkgs.playerctl
    ];

    programs.hyprland.enable = true;

    security.pam.services.hyprlock = {};

    hm = {
      wayland.windowManager.hyprland = {
        enable = true;
        plugins = [inputs.hy3.packages.${pkgs.stdenv.hostPlatform.system}.hy3];
        # NOTE: These are just the default settings.
        settings = {
          exec-once = [
            "wpaperd -d"
          ];

          input = {
            kb_layout = "us,fi,no";
            kb_options = "grp:win_space_toggle,ctrl:nocaps";
            touchpad = {
              disable_while_typing = false;
            };
          };

          misc = {
            disable_hyprland_logo = true;
            disable_splash_rendering = true;
          };

          "$mod" = "SUPER";
          bind = [
            "$mod, Return, exec, kitty"
            "$mod SHIFT, return, exec, bemenu-run"
            "$mod SHIFT, x, exec, hyprlock"

            "$mod, w, exec, wpaperctl next"

            "$mod SHIFT, c, killactive"
            "$mod SHIFT, q, exit"

            "$mod, f, fullscreen, 0"
            "$mod SHIFT, space, togglefloating"

            "$mod, Tab, cyclenext,"
            "$mod, Tab, bringactivetotop,"

            "$mod, v, hy3:makegroup, v, ephemeral"
            "$mod, b, hy3:makegroup, h, ephemeral"

            "$mod, h, hy3:movefocus, l"
            "$mod, j, hy3:movefocus, d"
            "$mod, k, hy3:movefocus, u"
            "$mod, l, hy3:movefocus, r"
            "$mod SHIFT, h, hy3:movewindow, l"
            "$mod SHIFT, j, hy3:movewindow, d"
            "$mod SHIFT, k, hy3:movewindow, u"
            "$mod SHIFT, l, hy3:movewindow, r"

            "$mod, 1, workspace, 1"
            "$mod, 2, workspace, 2"
            "$mod, 3, workspace, 3"
            "$mod, 4, workspace, 4"
            "$mod, 5, workspace, 5"
            "$mod, 6, workspace, 6"
            "$mod, 7, workspace, 7"
            "$mod, 8, workspace, 8"
            "$mod, 9, workspace, 9"
            "$mod SHIFT, 1, hy3:movetoworkspace, 1"
            "$mod SHIFT, 2, hy3:movetoworkspace, 2"
            "$mod SHIFT, 3, hy3:movetoworkspace, 3"
            "$mod SHIFT, 4, hy3:movetoworkspace, 4"
            "$mod SHIFT, 5, hy3:movetoworkspace, 5"
            "$mod SHIFT, 6, hy3:movetoworkspace, 6"
            "$mod SHIFT, 7, hy3:movetoworkspace, 7"
            "$mod SHIFT, 8, hy3:movetoworkspace, 8"
            "$mod SHIFT, 9, hy3:movetoworkspace, 9"
          ];
          binde = [
            "$mod CTRL, h, resizeactive, -10 0"
            "$mod CTRL, j, resizeactive, 0 -10"
            "$mod CTRL, k, resizeactive, 0 10"
            "$mod CTRL, l, resizeactive, 10 0"
          ];

          bindm = [
            "$mod, mouse:272, movewindow"
            "$mod, mouse:273, resizewindow"
          ];
        };
      };

      services.hypridle = {
        enable = true;
        settings = {
          listener = [
            {
              timeout = 500;
            }
          ];
          general.lock_cmd = "hyprlock";
        };
      };

      programs.hyprlock = {
        enable = true;
        settings = {
          general = {
            no_fade_in = true;
            no_fade_out = true;
          };
          background = [
            {
              #path = "/home/skye/dev/femboys.png";
              color = "rgba(0, 0, 0, 1.0)";
            }
          ];
          input-field = [
            {
              monitor = "";
              size = "200, 50";
              position = "0, 0";
            }
          ];
        };
      };

      programs.wpaperd.enable = true;

      services.mako = {
        enable = true;
        maxVisible = 5;
        defaultTimeout = 5000;
        backgroundColor = "#7298bf";
        textColor = "#e0c296";
        borderColor = "#ffffff";
        borderSize = 2;
      };

      programs.waybar = {
        enable = true;
        systemd.enable = false;
      };
    };
  };
}

A ws/roles/imv.nix => ws/roles/imv.nix +15 -0
@@ 0,0 1,15 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.imv;
in {
  options.roles.imv = {
    enable = lib.mkEnableOption "imv, a command line image viewer";
  };

  config = lib.mkIf cfg.enable {
    hm.programs.imv.enable = true;
  };
}

A ws/roles/kitty.nix => ws/roles/kitty.nix +80 -0
@@ 0,0 1,80 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.kitty;
in {
  options.roles.kitty = {
    enable = lib.mkEnableOption "enable kitty";
  };

  config.hm = lib.mkIf cfg.enable {
    programs.kitty = {
      enable = true;
      settings = {
        shell = "elvish";

        font_family = "FiraCode Nerd Font Mono";
        bold_font = "auto";
        italic_font = "auto";
        bold_italic_font = "auto";

        font_size = "12.0";

        enable_audio_bell = false;

        window_padding_width = 10;

        background_opacity = "0.9";

        foreground = "#5c6a72";
        background = "#fffbef";

        selection_foreground = "#829181";
        selection_background = "#f0f2d4";

        cursor = "#5c6a72";
        cursor_text_color = "#f8f5e4";

        url_color = "#3a94c5";

        active_border_color = "#8da101";
        inactive_border_color = "#bec5b2";
        bell_border_color = "#f57d26";
        visual_bell_color = "none";

        active_tab_background = "#fffbef";
        active_tab_foreground = "#5c6a72";
        inactive_tab_background = "#f2efdf";
        inactive_tab_foreground = "#939f91";
        tab_bar_background = "#f8f5e4";
        tab_bar_margin_color = "none";

        mark1_foreground = "#fffbef";
        mark1_background = "#3a94c5";
        mark2_foreground = "#fffbef";
        mark2_background = "#d3c6aa";
        mark3_foreground = "#fffbef";
        mark3_background = "#df69ba";

        color0 = "#708089";
        color8 = "#829181";
        color1 = "#f85552";
        color9 = "#e66868";
        color2 = "#8da101";
        color10 = "#93b259";
        color3 = "#dfa000";
        color11 = "#dfa000";
        color4 = "#3a94c5";
        color12 = "#3a94c5";
        color5 = "#df69ba";
        color13 = "#df69ba";
        color6 = "#35a77c";
        color14 = "#35a77c";
        color7 = "#939f91";
        color15 = "#a6b0a0";
      };
    };
  };
}

A ws/roles/obs.nix => ws/roles/obs.nix +25 -0
@@ 0,0 1,25 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.obs;
in {
  options.roles.obs = {
    enable = lib.mkEnableOption "OBS Studio";
    enableVirtualCamera = lib.mkEnableOption "OBS virtual camera"; # TODO: implement lol
  };

  config = lib.mkIf cfg.enable {
    hm.programs.obs-studio = {
      enable = true;
    };

    boot.extraModulePackages = [
      config.boot.kernelPackages.v4l2loopback
    ];
    boot.extraModprobeConfig = ''
      options v4l2loopback devices=1 video_nr=1 card_label="OBS virtual camera" exclusive_caps=1
    '';
  };
}

A ws/roles/podman.nix => ws/roles/podman.nix +17 -0
@@ 0,0 1,17 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.podman;
in {
  options.roles.podman = {
    enable = lib.mkEnableOption "Podman";
  };

  config = lib.mkIf cfg.enable {
    virtualisation.podman = {
      enable = true;
    };
  };
}

A ws/roles/qutebrowser.nix => ws/roles/qutebrowser.nix +50 -0
@@ 0,0 1,50 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.qutebrowser;
in {
  options.roles.qutebrowser = {
    enable = lib.mkEnableOption "";
  };

  config = lib.mkIf cfg.enable {
    hm.programs.qutebrowser = {
      enable = true;
      quickmarks = {
        nixpkgs = "https://github.com/nixos/nixpkgs";
        home-manager-options = "https://nix-community.github.io/home-manager/options.xhtml";
      };
      searchEngines = {
        DEFAULT = "https://www.startpage.com/sp/search?query={}";
      };
      # https://qutebrowser.org/doc/help/settings.html
      settings = {
        auto_save.session = true;
        colors.webpage.preferred_color_scheme = "light";
        content = {
          blocking = {
            enabled = true;
            method = "auto";
          };
          cookies = {
            accept = "no-3rdparty";
            store = false;
          };
          dns_prefetch = false;
          geolocation = false;
          headers = {
            do_not_track = true;
            referer = "never";
          };
        };
        downloads.remove_finished = 60000;
        url = {
          default_page = "about:blank";
          start_pages = "about:blank";
        };
      };
    };
  };
}

A ws/roles/shell/default.nix => ws/roles/shell/default.nix +88 -0
@@ 0,0 1,88 @@
{
  config,
  lib,
  pkgs,
  ...
}: let
  cfg = config.roles.shell;
in {
  options.roles.shell = {
    enable = lib.mkEnableOption "an opnionated shell environment";
  };

  config = lib.mkIf cfg.enable {
    environment.systemPackages = with pkgs; [
      elvish

      ripgrep
      fd

      btop

      sl

      silicon
    ];
    programs.direnv = {
      enable = true;
      nix-direnv.enable = true;
      silent = true;
    };
    hm = {
      home.file = {
        ".config/elvish/lib/direnv.elv" = {
          executable = true;
          source = ./direnv.elv;
        };
        ".config/elvish/rc.elv" = {
          executable = true;
          text = ''
            #!/usr/bin/env elvish
            use direnv
            eval (starship init elvish)
          '';
        };
      };
      programs.bash = {
        enable = true;
        bashrcExtra = ''
          eval "$(direnv hook bash)"
          eval "$(starship init bash)"
        '';
      };
      programs.starship = {
        enable = true;
        settings = {
          add_newline = false;
          scan_timeout = 10;
          /*
          format = lib.concatStrings [
            "$line_break"
            "$shell"
            "$nix_shell"
            "$directory"
            "$character"
          ];
          #format_right = lib.concatStrings [
          #
          #];
          character = {
            success_symbol = " >";
            error_symbol = " >";
          };
          directory = {
            truncation_length = 3;
            truncate_to_repo = true;
            format = "[$path](bold cyan)";
          };
          */
          shell = {
            disabled = false;
            bash_indicator = "bsh";
            elvish_indicator = "elv";
          };
        };
      };
    };
  };
}

A ws/roles/shell/direnv.elv => ws/roles/shell/direnv.elv +18 -0
@@ 0,0 1,18 @@
## Hook for direnv as of direnv 2.34.0
set @edit:before-readline = $@edit:before-readline {
	try {
		var m = [("direnv" export elvish | from-json)]
		if (> (count $m) 0) {
			set m = (all $m)
			keys $m | each { |k|
				if $m[$k] {
					set-env $k $m[$k]
				} else {
					unset-env $k
				}
			}
		}
	} catch e {
		echo $e
	}
}

A ws/roles/tailscale.nix => ws/roles/tailscale.nix +34 -0
@@ 0,0 1,34 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.tailscale;
in {
  options.roles.tailscale = {
    enable = lib.mkEnableOption "Tailscale";
    authKeyFile = lib.mkOption {
      type = lib.types.nullOr lib.types.path;
      default = null;
    };
    interfaceName = lib.mkOption {
      type = lib.types.str;
      default = "tailscale0";
    };
    enableSSH = lib.mkOption {
      type = lib.types.bool;
      default = false;
    };
  };

  config = lib.mkIf cfg.enable {
    services.tailscale = {
      enable = true;
      authKeyFile = lib.mkIf (cfg.authKeyFile != null) cfg.authKeyFile;
      extraUpFlags = lib.mkIf (cfg.enableSSH) ["--ssh"]; # TODO: Make modular for multiple possible flags.
      interfaceName = cfg.interfaceName;
      openFirewall = false;
      useRoutingFeatures = "none";
    };
  };
}

A ws/roles/unfree.nix => ws/roles/unfree.nix +19 -0
@@ 0,0 1,19 @@
{
  config,
  lib,
  ...
}: let
  cfg = config.roles.unfree;
in {
  options.roles.unfree = {
    allow = lib.mkOption {
      type = lib.types.listOf lib.types.str;
      default = [];
    };
  };

  config = {
    nixpkgs.config.allowUnfreePredicate = pkg:
      builtins.elem (lib.getName pkg) cfg.allow;
  };
}

A ws/roles/zellij.nix => ws/roles/zellij.nix +113 -0
@@ 0,0 1,113 @@
{
  config,
  inputs,
  lib,
  pkgs,
  ...
}: let
  cfg = config.roles.zellij;

  # Hard light:
  # https://github.com/sainnhe/everforest/blob/master/palette.md#light
  # https://github.com/sainnhe/everforest/blob/e5b9e2fb676a9ded3e86ae51924f7962fa4fb0ac/autoload/everforest.vim#L51
  everforest = {
    bg0 = "#FFF9E8";
    bg1 = "#F8F5E4";
    bg2 = "#F2EFDF";
    bg3 = "#EDEADA";
    bg4 = "#E8E5D5";
    bg5 = "#BEC5B2";
    fg = {
      default = "#5C6A72";
      accent = {
        cyan = "#35A77C";
        green = "#8DA101";
      };
      grey0 = "#7A8478";
      grey1 = "#859289";
      grey2 = "#9DA9A0";
      statusline = {
        green = "#93B259";
        grey = "#708089";
        red = "#E66868";
      };
    };
  };

  zjstatus = ''
    plugin location="file:${inputs.zjstatus.packages.${pkgs.system}.default}/bin/zjstatus.wasm" {
      format_left "{mode}"
      format_center "{tabs}"

      mode_locked "#[fg=${everforest.bg0},bg=${everforest.fg.statusline.red},bold] {name} "
      mode_normal "#[fg=${everforest.bg0},bg=${everforest.fg.statusline.green},bold] {name} "
      mode_tab "#[fg=${everforest.bg0},bg=${everforest.fg.accent.cyan},bold] {name} "

      tab_active "#[fg=${everforest.bg0},bg=${everforest.fg.statusline.green}] {name} "
      tab_normal "#[fg=${everforest.fg.default},bg=${everforest.bg3}] {name} "
    }
  '';
in {
  options.roles.zellij = {
    enable = lib.mkEnableOption "enable zellij";
  };

  config = lib.mkIf cfg.enable {
    hm = {
      programs.zellij = {
        enable = true;
        settings = {
          default_shell = "elvish";
          simplified_ui = true;
          pane_frames = false;
          default_layout = "default";
          ui.pane_frames.hide_session_name = true;
        };
      };

      home.file.".config/zellij/layouts/default.kdl".text = ''
        layout {
          default_tab_template {
            children
            pane size=1 {
              ${zjstatus}
            }
          }

          tab {
            pane
          }
        }
      '';

      home.file.".config/zellij/layouts/dev.kdl".text = ''
        layout {
          default_tab_template {
            children
            pane size=1 {
              ${zjstatus}
            }
          }

          tab name="nvim" focus=true  {
            pane
          }

          tab name="shell" {
            pane
          }
        }

        keybinds {
          locked {
            bind "Insert" { GoToTab 2; SwitchToMode "Normal"; }
          }

          shared_except "locked" {
            bind "Insert" { GoToTab 1; SwitchToMode "Locked"; }
          }
        }
      '';
    };
  };
}

A ws/systems.nix => ws/systems.nix +27 -0
@@ 0,0 1,27 @@
{
  lib,
  inputs,
  ...
}: {
  flake = let
    mkHost = name: cfg:
      inputs.nixpkgs.lib.nixosSystem {
        system = cfg.system;
        specialArgs = cfg.profile.specialArgs;
        modules =
          cfg.profile.modules
          ++ cfg.modules
          ++ [
            ./hosts/${name}
            {
              networking.hostName = name;
            }
          ];
      };

    profiles = import ./profiles inputs;
    hosts = import ./hosts inputs profiles;
  in {
    nixosConfigurations = lib.mapAttrs mkHost hosts;
  };
}