aboutsummaryrefslogtreecommitdiff
path: root/modules/nixos
diff options
context:
space:
mode:
Diffstat (limited to 'modules/nixos')
-rw-r--r--modules/nixos/apps/i3/default.nix50
-rw-r--r--modules/nixos/apps/playerctl/default.nix18
-rw-r--r--modules/nixos/apps/steam/default.nix18
-rw-r--r--modules/nixos/hardware/audio/default.nix25
-rw-r--r--modules/nixos/hardware/keyboard/default.nix43
-rw-r--r--modules/nixos/services/minecraft/default.nix25
-rw-r--r--modules/nixos/services/minecraft/stargazers/default.nix83
-rw-r--r--modules/nixos/services/minecraft/zenith/default.nix21
-rw-r--r--modules/nixos/services/ssh/default.nix28
-rw-r--r--modules/nixos/services/web/default.nix23
-rw-r--r--modules/nixos/services/web/images/default.nix34
-rw-r--r--modules/nixos/services/web/landing/default.nix34
-rw-r--r--modules/nixos/services/web/personal/default.nix63
-rw-r--r--modules/nixos/services/web/stargazers/default.nix34
-rw-r--r--modules/nixos/suites/common/default.nix25
-rw-r--r--modules/nixos/suites/desktop/default.nix27
-rw-r--r--modules/nixos/suites/gaming/default.nix17
-rw-r--r--modules/nixos/system/default.nix30
-rw-r--r--modules/nixos/system/fonts/default.nix38
-rw-r--r--modules/nixos/system/impermanence/default.nix49
-rw-r--r--modules/nixos/tools/bash/default.nix29
-rw-r--r--modules/nixos/tools/bash/prompt.sh84
-rw-r--r--modules/nixos/tools/git/default.nix16
-rw-r--r--modules/nixos/tools/misc/default.nix19
-rw-r--r--modules/nixos/tools/rebuild/default.nix16
-rw-r--r--modules/nixos/tools/vim/default.nix19
26 files changed, 868 insertions, 0 deletions
diff --git a/modules/nixos/apps/i3/default.nix b/modules/nixos/apps/i3/default.nix
new file mode 100644
index 0000000..e01c6c2
--- /dev/null
+++ b/modules/nixos/apps/i3/default.nix
@@ -0,0 +1,50 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.apps.i3;
+in {
+ options.${namespace}.apps.i3 = with types; {
+ enable = mkEnableOption "i3";
+
+ videoDrivers = mkOption {
+ type = types.listOf types.str;
+ default = [ "modesetting" "fbdev" ];
+ };
+
+ setupCommands = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Shell commands executed just after the X server has started.
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ services = {
+ displayManager = {
+ enable = true;
+ defaultSession = "none+i3";
+ };
+
+ xserver = {
+ enable = true;
+ windowManager.i3.enable = true;
+
+ displayManager = {
+ lightdm.enable = true;
+ setupCommands = cfg.setupCommands;
+ };
+
+ videoDrivers = cfg.videoDrivers;
+ xkb.layout = "us";
+ };
+
+ libinput = {
+ enable = true;
+ mouse.accelProfile = "flat";
+ touchpad.naturalScrolling = true;
+ };
+ };
+ };
+}
diff --git a/modules/nixos/apps/playerctl/default.nix b/modules/nixos/apps/playerctl/default.nix
new file mode 100644
index 0000000..9bf95d7
--- /dev/null
+++ b/modules/nixos/apps/playerctl/default.nix
@@ -0,0 +1,18 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.apps.playerctl;
+in {
+ options.${namespace}.apps.playerctl = with types; {
+ enable = mkEnableOption "playerctl";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ playerctl
+ ];
+
+ #TODO: enable, eventually
+ services.playerctld.enable = false;
+ };
+}
diff --git a/modules/nixos/apps/steam/default.nix b/modules/nixos/apps/steam/default.nix
new file mode 100644
index 0000000..b9baebf
--- /dev/null
+++ b/modules/nixos/apps/steam/default.nix
@@ -0,0 +1,18 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.apps.steam;
+in {
+ options.${namespace}.apps.steam = with types; {
+ enable = mkEnableOption "steam";
+ };
+
+ config = mkIf cfg.enable {
+ nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
+ "steam"
+ "steam-unwrapped"
+ ];
+
+ programs.steam.enable = true;
+ };
+}
diff --git a/modules/nixos/hardware/audio/default.nix b/modules/nixos/hardware/audio/default.nix
new file mode 100644
index 0000000..d2bfa96
--- /dev/null
+++ b/modules/nixos/hardware/audio/default.nix
@@ -0,0 +1,25 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.hardware.audio;
+in {
+ options.${namespace}.hardware.audio = with types; {
+ enable = mkEnableOption "audio support";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ pulseaudio
+ ];
+
+ security.rtkit.enable = true;
+ services.pipewire = {
+ enable = true;
+
+ pulse.enable = true;
+ alsa.enable = true;
+ alsa.support32Bit = true;
+ #jack.enable = true;
+ };
+ };
+}
diff --git a/modules/nixos/hardware/keyboard/default.nix b/modules/nixos/hardware/keyboard/default.nix
new file mode 100644
index 0000000..0ea2aa6
--- /dev/null
+++ b/modules/nixos/hardware/keyboard/default.nix
@@ -0,0 +1,43 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.hardware.keyboard;
+in {
+ options.${namespace}.hardware.keyboard = with types; {
+ enable = mkEnableOption "keyboard hardware tweaks";
+ jp.enable = mkEnableOption "japanese ime support";
+ };
+
+ config = mkIf cfg.enable {
+ services.keyd = {
+ enable = true;
+
+ keyboards."*".settings = {
+ main = {
+ # Swap alt and meta keys.
+ # I prefer (physical) alt as my WM modifier key because it
+ # is easier to reach. This can collide with some programs
+ # shortcuts if they inlcude alt. Swapping alt and meta fixes
+ # this by making my WM mod key (software) meta, freeing up alt.
+
+ leftalt = "leftmeta";
+ leftmeta = "leftalt";
+
+ rightalt = "rightmeta";
+ rightmeta = "rightalt";
+ };
+ };
+ };
+
+ i18n.inputMethod = mkIf cfg.jp.enable {
+ enable = true;
+ type = "fcitx5";
+ fcitx5.addons = with pkgs; [ fcitx5-mozc ];
+ };
+
+ environment.variables = mkIf cfg.jp.enable {
+ # Required for fcitx5 support in kitty
+ GLFW_IM_MODULE = "ibus";
+ };
+ };
+}
diff --git a/modules/nixos/services/minecraft/default.nix b/modules/nixos/services/minecraft/default.nix
new file mode 100644
index 0000000..7705c1c
--- /dev/null
+++ b/modules/nixos/services/minecraft/default.nix
@@ -0,0 +1,25 @@
+{ options, config, lib, namespace, inputs, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.services.minecraft;
+ impermanence = config.${namespace}.system.impermanence;
+in {
+ options.${namespace}.services.minecraft = with types; {
+ enable = mkEnableOption "minecraft server support";
+ };
+
+ config = mkIf cfg.enable {
+ nixpkgs = {
+ overlays = [ inputs.nix-minecraft.overlay ];
+ config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
+ "minecraft-server"
+ ];
+ };
+
+ services.minecraft-servers = {
+ enable = true;
+ eula = true;
+ openFirewall = true;
+ };
+ };
+}
diff --git a/modules/nixos/services/minecraft/stargazers/default.nix b/modules/nixos/services/minecraft/stargazers/default.nix
new file mode 100644
index 0000000..cb934f8
--- /dev/null
+++ b/modules/nixos/services/minecraft/stargazers/default.nix
@@ -0,0 +1,83 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.services.minecraft.stargazers;
+ impermanence = config.${namespace}.system.impermanence;
+in {
+ options.${namespace}.services.minecraft.stargazers = with types; {
+ enable = mkEnableOption "stargazers minecraft server";
+
+ port = mkOption {
+ type = types.port;
+ default = 25565;
+ description = "server port";
+ };
+
+ start = mkOption {
+ type = types.bool;
+ default = true;
+ description = "autostart";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ cxl.services.minecraft.enable = true;
+
+ #TODO: enable tmux
+ #cxl.tools.tmux.enable = true;
+
+ environment.persistence.${impermanence.location} = {
+ directories = [
+ "/srv/minecraft/stargazers"
+ ];
+ };
+
+ services.minecraft-servers.servers.stargazers = {
+ enable = true;
+ openFirewall = true;
+ autoStart = cfg.start;
+
+ package = pkgs.fabricServers.fabric-1_21;
+
+ operators = {
+ "grippysockjail" = "9448c89d-34eb-4e2c-a231-8112eb1a9e4a";
+ "antonymph" = "6b1f7a3c-a1c3-491a-8514-12b6b90d9152";
+ };
+
+ serverProperties = {
+ white-list = true;
+ enforce-whitelist = true;
+
+ gamemode = "survival";
+ difficulty = "hard";
+ level-seed = "4167799982467607063";
+ spawn-protection = 0;
+
+ max-players = 69;
+ motd = "\\u00a7r \\u00a75\\u00a7lstrge gazrer\\u00a7r\\n join or i will rip your bones out and eat them";
+
+ server-port = cfg.port;
+ query-port = cfg.port;
+ };
+
+ symlinks.mods = pkgs.linkFarmFromDrvs "mods" (builtins.attrValues {
+ fabric = pkgs.fetchurl {
+ url = "https://cdn.modrinth.com/data/P7dR8mSH/versions/vMQdA5QJ/fabric-api-0.100.7%2B1.21.jar";
+ sha256 = "sha256-grNmYgSekBaTztR1SLbqZCOC6+QNUDLe4hp105qfibA=";
+ };
+ lithium = pkgs.fetchurl {
+ url = "https://cdn.modrinth.com/data/gvQqBUqZ/versions/my7uONjU/lithium-fabric-mc1.21-0.12.7.jar";
+ sha256 = "sha256-Qku6c545jVgrdxDSNe3BULVQlMtgGuXebNqirRcmsh0=";
+ };
+ noChatReports = pkgs.fetchurl {
+ url = "https://cdn.modrinth.com/data/qQyHxfxd/versions/riMhCAII/NoChatReports-FABRIC-1.21-v2.8.0.jar";
+ sha256 = "sha256-jskscOeK3ri2dt3mvWLPVmzddwPqBHJ8Ps+VfZ6l9os=";
+ };
+ appleskin = pkgs.fetchurl {
+ url = "https://cdn.modrinth.com/data/EsAfCjCV/versions/YxFxnyd4/appleskin-fabric-mc1.21-3.0.2.jar";
+ sha256 = "sha256-8XaZREWzA5Mi2/LTs/a6ACvDKmHWYIy8JcOfQaq4yiE=";
+ };
+ });
+ };
+ };
+}
diff --git a/modules/nixos/services/minecraft/zenith/default.nix b/modules/nixos/services/minecraft/zenith/default.nix
new file mode 100644
index 0000000..0bc19f7
--- /dev/null
+++ b/modules/nixos/services/minecraft/zenith/default.nix
@@ -0,0 +1,21 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+#TODO: nix-ify zenithproxy
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.services.minecraft.zenith;
+ impermanence = config.${namespace}.system.impermanence;
+in {
+ options.${namespace}.services.minecraft.zenith = with types; {
+ enable = mkEnableOption "zenithproxy server";
+
+ port = mkOption {
+ type = types.port;
+ default = 25565;
+ description = "server port";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ cfg.port ];
+ };
+}
diff --git a/modules/nixos/services/ssh/default.nix b/modules/nixos/services/ssh/default.nix
new file mode 100644
index 0000000..6856897
--- /dev/null
+++ b/modules/nixos/services/ssh/default.nix
@@ -0,0 +1,28 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.services.ssh;
+ impermanence = config.${namespace}.system.impermanence;
+in {
+ options.${namespace}.services.ssh = with types; {
+ enable = mkEnableOption "ssh server";
+
+ port = mkOption {
+ type = types.port;
+ default = 22;
+ description = "ssh server port";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ openssh = {
+ enable = true;
+ ports = [ cfg.port ];
+
+ settings = {
+ PermitRootLogin = "no";
+ PasswordAuthentication = false;
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/web/default.nix b/modules/nixos/services/web/default.nix
new file mode 100644
index 0000000..1e1e854
--- /dev/null
+++ b/modules/nixos/services/web/default.nix
@@ -0,0 +1,23 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.services.web;
+ impermanence = config.${namespace}.system.impermanence;
+in {
+ options.${namespace}.services.web = with types; {
+ enable = mkEnableOption "web";
+ };
+
+ config = mkIf cfg.enable {
+ environment.persistence.${impermanence.location} = {
+ directories = [
+ "/var/lib/acme"
+ ];
+ };
+
+ security.acme = {
+ acceptTerms = true;
+ defaults.email = "caroline@larimo.re";
+ };
+ };
+}
diff --git a/modules/nixos/services/web/images/default.nix b/modules/nixos/services/web/images/default.nix
new file mode 100644
index 0000000..b1c44e6
--- /dev/null
+++ b/modules/nixos/services/web/images/default.nix
@@ -0,0 +1,34 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.services.web.images;
+ impermanence = config.${namespace}.system.impermanence;
+in {
+ options.${namespace}.services.web.images = with types; {
+ enable = mkEnableOption "image webserver";
+ };
+
+ config = mkIf cfg.enable {
+ cxl.services.web.enable = true;
+
+ environment.persistence.${impermanence.location} = {
+ directories = [
+ "/srv/web/images"
+ ];
+ };
+
+ networking.firewall.allowedTCPPorts = [ 80 443 ];
+
+ services.nginx = {
+ enable = true;
+ virtualHosts = {
+ "i.cxl.sh" = {
+ addSSL = true;
+ enableACME = true;
+
+ root = "/srv/web/images";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/web/landing/default.nix b/modules/nixos/services/web/landing/default.nix
new file mode 100644
index 0000000..fe9e92b
--- /dev/null
+++ b/modules/nixos/services/web/landing/default.nix
@@ -0,0 +1,34 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.services.web.landing;
+ impermanence = config.${namespace}.system.impermanence;
+in {
+ options.${namespace}.services.web.landing = with types; {
+ enable = mkEnableOption "cxl.sh landing page webserver";
+ };
+
+ config = mkIf cfg.enable {
+ cxl.services.web.enable = true;
+
+ environment.persistence.${impermanence.location} = {
+ directories = [
+ "/srv/web/landing"
+ ];
+ };
+
+ networking.firewall.allowedTCPPorts = [ 80 443 ];
+
+ services.nginx = {
+ enable = true;
+ virtualHosts = {
+ "cxl.sh" = {
+ addSSL = true;
+ enableACME = true;
+
+ root = "/srv/web/landing";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/web/personal/default.nix b/modules/nixos/services/web/personal/default.nix
new file mode 100644
index 0000000..daf94c1
--- /dev/null
+++ b/modules/nixos/services/web/personal/default.nix
@@ -0,0 +1,63 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.services.web.personal;
+ impermanence = config.${namespace}.system.impermanence;
+
+ package = (pkgs.buildGoModule rec {
+ pname = "site";
+ version = "6612d84c63a7bbc2a5b70607f2ec32ea070c4659";
+
+ src = pkgs.fetchFromGitHub {
+ owner = "CartConnoisseur";
+ repo = "site";
+ rev = "${version}";
+ hash = "sha256-n54+LdtMyjoLfaFqd7tcDQqBiYCdUW/Rs67Vc4QwEJ0=";
+ };
+
+ # kinda a hack, but whatever
+ postBuild = ''
+ mkdir -p $out/share/site
+ cp -r $src/* $out/share/site/
+ '';
+
+ vendorHash = "sha256-2/4Wv7nsaT0wnUzkRgHKpSswigDj9nOvlmYXK29rvLU=";
+ });
+in {
+ options.${namespace}.services.personal.images = with types; {
+ enable = mkEnableOption "personal site webserver";
+ };
+
+ config = mkIf cfg.enable {
+ cxl.services.web.enable = true;
+
+ networking.firewall.allowedTCPPorts = [ 80 443 ];
+
+ services.nginx = {
+ enable = true;
+ virtualHosts = {
+ "caroline.larimo.re" = {
+ # serverAliases = [ "cxl.sh" ];
+
+ addSSL = true;
+ enableACME = true;
+
+ locations."/" = {
+ recommendedProxySettings = true;
+ proxyPass = "http://127.0.0.1:8080/";
+ };
+ };
+ };
+ };
+
+ systemd.services."cxl.web.personal" = {
+ enable = true;
+ wantedBy = [ "multi-user.target" ];
+
+ serviceConfig = {
+ WorkingDirectory = "${package}/share/site";
+ ExecStart = "${package}/bin/site";
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/web/stargazers/default.nix b/modules/nixos/services/web/stargazers/default.nix
new file mode 100644
index 0000000..3e9b46e
--- /dev/null
+++ b/modules/nixos/services/web/stargazers/default.nix
@@ -0,0 +1,34 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.services.web.stargazers;
+ impermanence = config.${namespace}.system.impermanence;
+in {
+ options.${namespace}.services.web.stargazers = with types; {
+ enable = mkEnableOption "stargazers webserver";
+ };
+
+ config = mkIf cfg.enable {
+ cxl.services.web.enable = true;
+
+ environment.persistence.${impermanence.location} = {
+ directories = [
+ "/srv/web/stargazers"
+ ];
+ };
+
+ networking.firewall.allowedTCPPorts = [ 80 443 ];
+
+ services.nginx = {
+ enable = true;
+ virtualHosts = {
+ "stargazers.xn--6frz82g" = {
+ addSSL = true;
+ enableACME = true;
+
+ root = "/srv/web/stargazers";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/suites/common/default.nix b/modules/nixos/suites/common/default.nix
new file mode 100644
index 0000000..1e7a053
--- /dev/null
+++ b/modules/nixos/suites/common/default.nix
@@ -0,0 +1,25 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.suites.common;
+in {
+ options.${namespace}.suites.common = with types; {
+ enable = mkEnableOption "common";
+ };
+
+ config = mkIf cfg.enable {
+ cxl = {
+ hardware = {
+ keyboard.enable = true;
+ };
+
+ tools = {
+ bash.enable = true;
+ vim.enable = true;
+ git.enable = true;
+ misc.enable = true;
+ rebuild.enable = true;
+ };
+ };
+ };
+}
diff --git a/modules/nixos/suites/desktop/default.nix b/modules/nixos/suites/desktop/default.nix
new file mode 100644
index 0000000..246f38c
--- /dev/null
+++ b/modules/nixos/suites/desktop/default.nix
@@ -0,0 +1,27 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.suites.desktop;
+in {
+ options.${namespace}.suites.desktop = with types; {
+ enable = mkEnableOption "desktop";
+ };
+
+ config = mkIf cfg.enable {
+ cxl = {
+ hardware = {
+ audio.enable = true;
+ keyboard.jp.enable = true;
+ };
+
+ apps = {
+ i3.enable = true;
+ playerctl.enable = true;
+ };
+
+ system.fonts.enable = true;
+ };
+
+ programs.dconf.enable = true;
+ };
+}
diff --git a/modules/nixos/suites/gaming/default.nix b/modules/nixos/suites/gaming/default.nix
new file mode 100644
index 0000000..e95e1cd
--- /dev/null
+++ b/modules/nixos/suites/gaming/default.nix
@@ -0,0 +1,17 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.suites.gaming;
+in {
+ options.${namespace}.suites.gaming = with types; {
+ enable = mkEnableOption "gaming";
+ };
+
+ config = mkIf cfg.enable {
+ cxl = {
+ apps = {
+ steam.enable = true;
+ };
+ };
+ };
+}
diff --git a/modules/nixos/system/default.nix b/modules/nixos/system/default.nix
new file mode 100644
index 0000000..96c5654
--- /dev/null
+++ b/modules/nixos/system/default.nix
@@ -0,0 +1,30 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.system;
+in {
+ options.${namespace}.system = with types; {
+ hostname = mkOption {
+ type = strMatching "^$|^[[:alnum:]]([[:alnum:]_-]{0,61}[[:alnum:]])?$";
+ };
+
+ id = mkOption {
+ default = null;
+ type = nullOr str;
+ };
+
+ timezone = mkOption {
+ default = "America/Los_Angeles";
+ type = nullOr str;
+ };
+ };
+
+ config = {
+ nix.settings.experimental-features = [ "nix-command" "flakes" ];
+
+ networking.hostName = cfg.hostname;
+ networking.hostId = cfg.id;
+
+ time.timeZone = cfg.timezone;
+ };
+}
diff --git a/modules/nixos/system/fonts/default.nix b/modules/nixos/system/fonts/default.nix
new file mode 100644
index 0000000..c510679
--- /dev/null
+++ b/modules/nixos/system/fonts/default.nix
@@ -0,0 +1,38 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.system.fonts;
+in {
+ options.${namespace}.system.fonts = with types; {
+ enable = mkEnableOption "fonts";
+ nerdfonts = mkEnableOption "nerdfonts";
+ extra = mkOption {
+ type = listOf package;
+ default = [];
+ description = ''
+ additional fonts to install
+ '';
+ };
+ };
+
+ config = mkIf cfg.enable {
+ fonts = {
+ packages = with pkgs; [
+ noto-fonts
+ noto-fonts-cjk-sans
+ noto-fonts-cjk-serif
+ noto-fonts-emoji
+ ] ++ (
+ optionals cfg.nerdfonts (
+ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts)
+ )
+ ) ++ cfg.extra;
+
+ fontconfig.defaultFonts = {
+ monospace = [ "CaskaydiaMono Nerd Font" ];
+ sansSerif = [ "DejaVu Sans" "Noto Sans CJK JP" "Noto Sans" ];
+ serif = [ "DejaVu Serif" "Noto Serif CJK JP" "Noto Serif" ];
+ };
+ };
+ };
+}
diff --git a/modules/nixos/system/impermanence/default.nix b/modules/nixos/system/impermanence/default.nix
new file mode 100644
index 0000000..b82579b
--- /dev/null
+++ b/modules/nixos/system/impermanence/default.nix
@@ -0,0 +1,49 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.system.impermanence;
+in {
+ options.${namespace}.system.impermanence = with types; {
+ enable = mkEnableOption "root impermanence";
+
+ location = mkOption {
+ type = str;
+ default = "/persist/system";
+ };
+
+ #TODO: multi-user support
+ home = {
+ enable = mkEnableOption "home impermanence";
+
+ location = mkOption {
+ type = str;
+ default = "/persist/home";
+ };
+
+ secure.location = mkOption {
+ type = str;
+ default = "/persist/secure/home";
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ programs.fuse.userAllowOther = true;
+
+ environment.persistence.${cfg.location} = {
+ hideMounts = true;
+
+ directories = [
+ "/etc/nixos"
+ "/var/log"
+ "/var/lib/nixos"
+ "/var/lib/systemd/coredump"
+ # "/var/lib/bluetooth"
+ ];
+
+ files = [
+ "/etc/machine-id"
+ ];
+ };
+ };
+}
diff --git a/modules/nixos/tools/bash/default.nix b/modules/nixos/tools/bash/default.nix
new file mode 100644
index 0000000..180db1f
--- /dev/null
+++ b/modules/nixos/tools/bash/default.nix
@@ -0,0 +1,29 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.tools.bash;
+in {
+ options.${namespace}.tools.bash = with types; {
+ enable = mkEnableOption "tools";
+ };
+
+ config = mkIf cfg.enable {
+ environment.localBinInPath = true;
+
+ programs.bash = {
+ shellAliases = {
+ lsa = "ls -lAsh";
+ p = "nix-shell -p";
+ };
+
+ interactiveShellInit = ''
+ source "${./prompt.sh}"
+
+ mkcd() {
+ mkdir -p "$1"
+ cd "$1"
+ }
+ '';
+ };
+ };
+}
diff --git a/modules/nixos/tools/bash/prompt.sh b/modules/nixos/tools/bash/prompt.sh
new file mode 100644
index 0000000..d4d7c69
--- /dev/null
+++ b/modules/nixos/tools/bash/prompt.sh
@@ -0,0 +1,84 @@
+PROMPT_CHAR='❯'
+
+if [[ "$TERM" == "xterm-kitty" ]]; then
+ function prompt.bubble {
+ printf '\[\e[49m\e[38;5;237m\]◖\[\e[48;5;237m\e[39m\]%s\[\e[0m\e[49m\e[38;5;237m\]◗\[\e[0m\]' "$@";
+ }
+elif [[ "$TERM" == "xterm-256color" ]]; then
+ function prompt.bubble {
+ printf '\[\e[38;5;237m\](\[\e[0m\]%s\[\e[0m\e[38;5;237m\])\[\e[0m\]' "$@";
+ }
+else
+ PROMPT_CHAR='>'
+ function prompt.bubble {
+ printf '\[\e[2;39m\](\[\e[0m\]%s\[\e[0m\e[2;39m\])\[\e[0m\]' "$@";
+ }
+fi
+
+function prompt.git {
+ GIT_PS1_STATESEPARATOR=';'
+ GIT_PS1_SHOWDIRTYSTATE=1
+ GIT_PS1_SHOWUNTRACKEDFILES=
+ GIT_PS1_SHOWUPSTREAM=
+
+ GIT_PS1_HIDE_IF_PWD_IGNORED=1
+
+ local git_ps1="$(__git_ps1)"
+ git_ps1="${git_ps1##' ('}"
+ git_ps1="${git_ps1%')'}"
+
+ IFS=';' read -r branch state _ <<< "$git_ps1"
+
+ if [[ -n "$branch" ]]; then
+ printf ' '
+
+ if [[ "$state" == '*' ]]; then
+ prompt.bubble "$(printf '\[\e[4;32m\]%s' "$branch")"
+ else
+ prompt.bubble "$(printf '\[\e[32m\]%s' "$branch")"
+ fi
+ fi
+}
+
+function prompt.prepare {
+ local err=$?
+ PS1="\\[\e[0m\\]\n"
+
+ local subshell=''
+ local base_shlvl=1
+ local shlvl=$((SHLVL-base_shlvl))
+
+ if [[ -n "$IN_NIX_SHELL" ]]; then
+ subshell="\\[\e[33m\\]nix"
+ fi
+ if [[ $shlvl != 0 && ! ($shlvl == 1 && -n "$IN_NIX_SHELL") ]]; then
+ if [[ -n "$subshell" ]]; then subshell+="\\[\e[39m\\] "; fi
+ subshell+="\\[\e[2;37m\\]$shlvl"
+ fi
+ if [[ -n "$subshell" ]]; then
+ PS1+="$(prompt.bubble "$subshell") "
+ fi
+
+ if [[ $EUID == 0 ]]; then
+ PS1+="$(prompt.bubble "\\[\e[4m\\]\u@\H")"
+ else
+ PS1+="$(prompt.bubble "\u@\H")"
+ fi
+
+ PS1+=" $(prompt.bubble "\\[\e[34m\\]\w")"
+ PS1+="$(prompt.git)"
+ if [[ $err != 0 ]]; then
+ PS1+=" $(prompt.bubble "\\[\e[31m\\]$err")"
+ fi
+ PS1+=" $(prompt.bubble "$PROMPT_CHAR") "
+
+ if [[ $err != 0 ]]; then
+ (exit "$err")
+ fi
+}
+
+PROMPT_COMMAND='prompt.prepare'
+
+function baller {
+ printf '🮲🮳⚽︎ \n'
+}
diff --git a/modules/nixos/tools/git/default.nix b/modules/nixos/tools/git/default.nix
new file mode 100644
index 0000000..f58ed62
--- /dev/null
+++ b/modules/nixos/tools/git/default.nix
@@ -0,0 +1,16 @@
+{ options, config, lib, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.tools.git;
+in {
+ options.${namespace}.tools.git = with types; {
+ enable = mkEnableOption "git";
+ };
+
+ config = mkIf cfg.enable {
+ programs.git = {
+ enable = true;
+ prompt.enable = true;
+ };
+ };
+}
diff --git a/modules/nixos/tools/misc/default.nix b/modules/nixos/tools/misc/default.nix
new file mode 100644
index 0000000..a06a141
--- /dev/null
+++ b/modules/nixos/tools/misc/default.nix
@@ -0,0 +1,19 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.tools.misc;
+in {
+ options.${namespace}.tools.misc = with types; {
+ enable = mkEnableOption "misc tools";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ jq
+ killall
+ moreutils
+ unzip
+ wget
+ ];
+ };
+}
diff --git a/modules/nixos/tools/rebuild/default.nix b/modules/nixos/tools/rebuild/default.nix
new file mode 100644
index 0000000..368f29f
--- /dev/null
+++ b/modules/nixos/tools/rebuild/default.nix
@@ -0,0 +1,16 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.tools.rebuild;
+in {
+ options.${namespace}.tools.rebuild = with types; {
+ enable = mkEnableOption "rebuild scripts";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ (writeShellScriptBin "rb" "sudo nixos-rebuild switch --flake /etc/nixos")
+ (writeShellScriptBin "rbf" "sudo nixos-rebuild switch --flake path:/etc/nixos")
+ ];
+ };
+}
diff --git a/modules/nixos/tools/vim/default.nix b/modules/nixos/tools/vim/default.nix
new file mode 100644
index 0000000..9aa0a2c
--- /dev/null
+++ b/modules/nixos/tools/vim/default.nix
@@ -0,0 +1,19 @@
+{ options, config, lib, pkgs, namespace, ... }:
+
+with lib; with lib.${namespace}; let
+ cfg = config.${namespace}.tools.vim;
+in {
+ options.${namespace}.tools.vim = with types; {
+ enable = mkEnableOption "vim";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ vim
+ ];
+
+ environment.variables = {
+ EDITOR = "${pkgs.vim}/bin/vim";
+ };
+ };
+}