aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flake.nix7
-rw-r--r--hosts/adam/configuration.nix66
-rw-r--r--hosts/lilith/configuration.nix51
-rw-r--r--hosts/sachiel/configuration.nix214
-rw-r--r--lib/default.nix32
-rw-r--r--modules/desktop/cinnamon/default.nix34
-rw-r--r--modules/desktop/default.nix13
-rw-r--r--modules/hosts/audio/default.nix29
-rw-r--r--modules/hosts/default.nix13
-rw-r--r--modules/hosts/desktop/cinnamon/default.nix38
-rw-r--r--modules/hosts/desktop/default.nix14
-rw-r--r--modules/hosts/desktop/dunst.nix (renamed from modules/desktop/dunst.nix)8
-rw-r--r--modules/hosts/desktop/gnome/dconf.nix (renamed from modules/desktop/gnome/dconf.nix)6
-rw-r--r--modules/hosts/desktop/gnome/default.nix (renamed from modules/desktop/gnome/default.nix)8
-rw-r--r--modules/hosts/desktop/hyprland/default.nix183
-rw-r--r--modules/hosts/desktop/hyprland/hyprlock.nix (renamed from modules/desktop/hyprland/hyprlock.nix)13
-rw-r--r--modules/hosts/desktop/kde/default.nix (renamed from modules/desktop/kde/default.nix)11
-rw-r--r--modules/hosts/desktop/labwc/default.nix (renamed from modules/desktop/labwc/default.nix)7
-rw-r--r--modules/hosts/desktop/labwc/sfwbar.nix (renamed from modules/desktop/labwc/sfwbar.nix)8
-rw-r--r--modules/hosts/desktop/sway/default.nix (renamed from modules/desktop/sway/default.nix)8
-rw-r--r--modules/hosts/desktop/sway/swayidle.nix (renamed from modules/desktop/sway/swayidle.nix)8
-rw-r--r--modules/hosts/desktop/sway/swaylock.nix (renamed from modules/desktop/sway/swaylock.nix)8
-rw-r--r--modules/hosts/desktop/waybar.nix (renamed from modules/desktop/waybar.nix)8
-rw-r--r--modules/hosts/openssh/default.nix25
-rw-r--r--modules/hosts/printer/default.nix32
-rw-r--r--modules/hosts/server/default.nix29
-rw-r--r--modules/hosts/server/fail2ban/default.nix31
-rw-r--r--modules/hosts/server/nextcloud/default.nix156
-rw-r--r--modules/hosts/server/nginx/default.nix56
-rw-r--r--modules/hosts/server/openssh/default.nix53
-rw-r--r--modules/hosts/server/site/default.nix32
-rw-r--r--modules/hosts/system/default.nix10
-rw-r--r--modules/hosts/system/localisation.nix (renamed from modules/system/localisation.nix)0
-rw-r--r--modules/hosts/system/network.nix (renamed from modules/system/network.nix)0
-rw-r--r--modules/hosts/system/nix-options.nix18
-rw-r--r--modules/hosts/system/users.nix (renamed from modules/system/users.nix)2
-rw-r--r--modules/hosts/wooting/default.nix26
-rw-r--r--modules/programs/anki.nix22
-rw-r--r--modules/programs/default.nix26
-rw-r--r--modules/programs/firefox.nix248
-rw-r--r--modules/programs/foot.nix60
-rw-r--r--modules/programs/gemini.nix22
-rw-r--r--modules/programs/gh.nix17
-rw-r--r--modules/programs/git.nix42
-rw-r--r--modules/programs/gpg.nix27
-rw-r--r--modules/programs/kitty.nix37
-rw-r--r--modules/programs/latex.nix32
-rw-r--r--modules/programs/neovim/default.nix40
-rw-r--r--modules/programs/nixcord.nix32
-rw-r--r--modules/programs/obsidian.nix17
-rw-r--r--modules/programs/opencode.nix20
-rw-r--r--modules/programs/spicetify.nix38
-rw-r--r--modules/programs/tmux.nix45
-rw-r--r--modules/programs/typst.nix19
-rw-r--r--modules/programs/vscode.nix63
-rw-r--r--modules/programs/zathura.nix34
-rw-r--r--modules/programs/zed.nix25
-rw-r--r--modules/programs/zsh.nix79
-rw-r--r--modules/services/default.nix14
-rw-r--r--modules/services/keyring.nix16
-rw-r--r--modules/services/mullvad.nix16
-rw-r--r--modules/services/nextcloud-client.nix22
-rw-r--r--modules/services/openssh.nix17
-rw-r--r--modules/services/pipewire.nix19
-rw-r--r--modules/services/polkit.nix29
-rw-r--r--modules/services/printer.nix21
-rw-r--r--modules/services/wooting.nix16
-rw-r--r--modules/system/default.nix10
-rw-r--r--modules/system/nix-options.nix18
-rw-r--r--modules/users/browsers/default.nix6
-rw-r--r--modules/users/browsers/firefox/default.nix276
-rw-r--r--modules/users/cli/default.nix7
-rw-r--r--modules/users/cli/opencode/default.nix30
-rw-r--r--modules/users/cli/tmux/default.nix55
-rw-r--r--modules/users/default.nix16
-rw-r--r--modules/users/editors/default.nix8
-rw-r--r--modules/users/editors/neovim/default.nix109
-rw-r--r--modules/users/editors/neovim/init.lua (renamed from modules/programs/neovim/init.lua)107
-rw-r--r--modules/users/editors/vscode/default.nix142
-rw-r--r--modules/users/editors/zed/default.nix94
-rw-r--r--modules/users/git/default.nix81
-rw-r--r--modules/users/gpg/default.nix62
-rw-r--r--modules/users/media/default.nix7
-rw-r--r--modules/users/media/nixcord/default.nix42
-rw-r--r--modules/users/media/spicetify/default.nix45
-rw-r--r--modules/users/productivity/anki/default.nix30
-rw-r--r--modules/users/productivity/default.nix10
-rw-r--r--modules/users/productivity/latex/default.nix47
-rw-r--r--modules/users/productivity/nextcloud-client/default.nix28
-rw-r--r--modules/users/productivity/obsidian/default.nix23
-rw-r--r--modules/users/productivity/typst/default.nix25
-rw-r--r--modules/users/shells/default.nix6
-rw-r--r--modules/users/shells/zsh/default.nix66
-rw-r--r--modules/users/terminal/default.nix36
-rw-r--r--modules/users/terminal/foot.nix57
-rw-r--r--modules/users/terminal/kitty.nix33
-rw-r--r--modules/users/zathura/default.nix41
97 files changed, 2333 insertions, 1556 deletions
diff --git a/flake.nix b/flake.nix
index bab54d8..37cbed1 100644
--- a/flake.nix
+++ b/flake.nix
@@ -27,9 +27,7 @@
linux-system = "x86_64-linux";
darwin-system = "aarch64-darwin";
username = "schererleander";
- overlays = [
- inputs.neovim-nightly-overlay.overlays.default
- ];
+ overlays = [ ];
lib = import ./lib { inherit inputs; };
in
{
@@ -45,9 +43,6 @@
username = "administrator";
system = linux-system;
useHomeManager = false;
- extraModules = [
- inputs.site.nixosModules.default
- ];
};
};
darwinConfigurations.lilith = lib.mkSystem {
diff --git a/hosts/adam/configuration.nix b/hosts/adam/configuration.nix
index 99e2726..491ab90 100644
--- a/hosts/adam/configuration.nix
+++ b/hosts/adam/configuration.nix
@@ -1,18 +1,17 @@
{
pkgs,
username,
+ inputs,
...
}:
{
imports = [
./hardware-configuration.nix
- ../../modules/desktop
- ../../modules/programs
- ../../modules/system
- ../../modules/services
];
+ home-manager.extraSpecialArgs = { inherit inputs; };
+
boot = {
kernelPackages = pkgs.linuxPackages_latest;
kernelParams = [
@@ -70,26 +69,48 @@
home-manager.users.${username} = {
home.username = username;
home.homeDirectory = "/home/${username}";
+ imports = [ ../../modules/users ];
programs.home-manager.enable = true;
-
home.packages = with pkgs; [
- firefox
- blender
- godot
imv
mpv
+ firefox
zoxide
-
- noto-fonts-cjk-sans
- noto-fonts-color-emoji
];
programs.zsh.shellAliases = {
open = "xdg-open";
};
+ nx = {
+ #browsers.firefox.enable = true;
+ editors = {
+ neovim = {
+ enable = true;
+ langs = {
+ python = true;
+ go = true;
+ java = true;
+ latex = true;
+ };
+ };
+ };
+ git.enable = true;
+ cli = {
+ opencode.enable = true;
+ };
+ media = {
+ spicetify.enable = true;
+ nixcord.enable = true;
+ };
+ productivity = {
+ obsidian.enable = true;
+ latex.enable = true;
+ };
+ };
+
home.stateVersion = "25.11";
};
@@ -97,29 +118,6 @@
desktop = {
kde.enable = true;
};
- programs = {
- kitty.enable = true;
- git.enable = true;
- gh.enable = true;
- gpg.enable = true;
- neovim.enable = true;
- tmux.enable = true;
- zsh.enable = true;
- spicetify.enable = true;
- obsidian.enable = true;
- gemini-cli.enable = true;
- opencode.enable = true;
- nixcord.enable = true;
- };
- services = {
- openssh.enable = true;
- printer.enable = true;
- pipewire.enable = true;
- polkit.enable = true;
- wooting.enable = true;
- mullvad.enable = true;
- nextcloud-client.enable = true;
- };
};
system.stateVersion = "25.11";
diff --git a/hosts/lilith/configuration.nix b/hosts/lilith/configuration.nix
index a3c138f..f3962d8 100644
--- a/hosts/lilith/configuration.nix
+++ b/hosts/lilith/configuration.nix
@@ -2,14 +2,11 @@
pkgs,
host,
username,
+ inputs,
...
}:
{
- imports = [
- ../../modules/programs
- ];
-
users.users.${username}.home = "/Users/${username}";
networking.hostName = host;
@@ -19,6 +16,12 @@
home.homeDirectory = "/Users/${username}";
programs.home-manager.enable = true;
+ imports = [
+ ../../modules/users
+ inputs.nixcord.homeModules.nixcord
+ inputs.spicetify-nix.homeManagerModules.spicetify
+ ];
+
home.packages = with pkgs; [
htop
ffmpeg
@@ -30,7 +33,7 @@
rectangle
slack
podman
- jetbrains.idea-community
+ jetbrains.idea-community
nerd-fonts.symbols-only
];
@@ -38,6 +41,32 @@
home.sessionVariables = {
PATH = "/opt/homebrew/opt/openjdk@21/bin:$PATH";
};
+
+ nx = {
+ editors = {
+ neovim = {
+ enable = true;
+ langs = {
+ python = true;
+ go = true;
+ java = true;
+ latex = true;
+ };
+ };
+ };
+ git.enable = true;
+ cli = {
+ opencode.enable = true;
+ };
+ media = {
+ spicetify.enable = true;
+ nixcord.enable = true;
+ };
+ productivity = {
+ obsidian.enable = true;
+ latex.enable = true;
+ };
+ };
};
system.primaryUser = username;
@@ -79,18 +108,6 @@
onActivation.upgrade = true;
};
- nx = {
- programs = {
- neovim.enable = true;
- zsh.enable = true;
- anki.enable = true;
- spicetify.enable = true;
- zed-editor.enable = true;
- obsidian.enable = true;
- opencode.enable = true;
- };
- };
-
nix.enable = false;
system.stateVersion = 5;
diff --git a/hosts/sachiel/configuration.nix b/hosts/sachiel/configuration.nix
index 0537569..3944006 100644
--- a/hosts/sachiel/configuration.nix
+++ b/hosts/sachiel/configuration.nix
@@ -1,8 +1,6 @@
{
pkgs,
host,
- lib,
- config,
username,
...
}:
@@ -66,212 +64,12 @@
};
};
- services.fail2ban = {
- enable = true;
- bantime = "1h";
- jails = {
- sshd = {
- enabled = true;
- settings = {
- port = 8693;
- backend = "systemd";
- maxretry = 4;
- findtime = "10m";
- bantime = "1h";
- };
- };
- nextcloud = {
- enabled = true;
- settings = {
- # START modification to work with syslog instead of logile
- backend = "systemd";
- journalmatch = "SYSLOG_IDENTIFIER=Nextcloud";
- # END modification to work with syslog instead of logile
- port = 443;
- protocol = "tcp";
- filter = "nextcloud";
- maxretry = 3;
- bantime = 86400;
- findtime = 43200;
- };
- };
- };
- };
-
- environment.etc = {
- # Adapted failregex for syslogs
- "fail2ban/filter.d/nextcloud.local".text = pkgs.lib.mkDefault (
- pkgs.lib.mkAfter ''
- [Definition]
- _groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
- failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
- ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
- datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
- ''
- );
- };
-
- services.openssh = {
- enable = true;
- ports = [ 8693 ];
- settings = {
- PasswordAuthentication = false;
- AllowUsers = [ username ];
- X11Forwarding = false;
- PermitRootLogin = "no";
- };
- };
-
- security.acme = {
- acceptTerms = true;
- defaults.email = "leander@schererleander.de";
- };
-
- services.nginx = {
- enable = true;
- recommendedGzipSettings = true;
- recommendedOptimisation = true;
- recommendedProxySettings = true;
- recommendedTlsSettings = true;
- appendHttpConfig = ''
- map $scheme $hsts_header {
- https "max-age=31536000; includeSubdomains; preload";
- }
- add_header Strict-Transport-Security $hsts_header;
- #add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'self';" always;
- add_header 'Referrer-Policy' 'same-origin';
- add_header X-Frame-Options DENY;
- add_header X-Content-Type-Options nosniff;
- '';
-
- #virtualHosts."bitwarden.schererleander.de" = {
- # forceSSL = true;
- # sslCertificate = "/etc/ssl/schererleander.de/fullchain.pem";
- # sslCertificateKey = "/etc/ssl/schererleander.de/privkey.key";
- # locations."/" = {
- # proxyPass = "http://127.0.0.1:${toString config.services.vaultwarden.config.ROCKET_PORT}";
- # };
- #};
-
- virtualHosts."cloud.schererleander.de" = {
- forceSSL = true;
- sslCertificate = "/etc/ssl/schererleander.de/fullchain.pem";
- sslCertificateKey = "/etc/ssl/schererleander.de/privkey.key";
- };
- };
-
- services.site = {
- enable = true;
- domain = "schererleander.de";
- sslCertificate = "/etc/ssl/schererleander.de/fullchain.pem";
- sslCertificateKey = "/etc/ssl/schererleander.de/privkey.key";
- };
-
- # services.vaultwarden = {
- # enable = true;
- # environmentFile = "/var/lib/vaultwarden.env";
- # backupDir = "/var/backup/vaultwarden";
- # config = {
- # DOMAIN = "https://bitwarden.schererleander.de";
- # SIGNUPS_ALLOWED = true;
- # ROCKET_ADDRESS = "127.0.0.1";
- # ROCKET_PORT = 8222;
- # ROCKET_LOG = "critical";
- # KDF = "PBKDF2";
- # KDFIterations = 600000;
- # };
- # };
- #
- # services.borgbackup.jobs.vaultwarden = {
- # paths = [ "/var/backup/vaultwarden" ];
- # repo = "t7e4d4f9@t7e4d4f9.repo.borgbase.com:repo";
- # encryption.mode = "none";
- # environment.BORG_RSH = "ssh -i /home/${username}/.ssh/borgbase-vaultwarden -o StrictHostKeyChecking=accept-new";
- # compression = "auto,lzma";
- # startAt = "daily";
- # };
-
- services.nextcloud = {
- enable = true;
- package = pkgs.nextcloud32;
- hostName = "cloud.schererleander.de";
- https = true;
- database.createLocally = true;
- maxUploadSize = "16G";
- config = {
- dbtype = "mysql";
- adminuser = "schererleander";
- adminpassFile = "/etc/nextcloud-admin-pass";
- };
- settings = {
- maintenance_window_start = 2; # 02:00
- default_phone_region = "de";
- overwriteProtocol = "https";
- trusted_domains = [ "cloud.schererleander.de" ];
- logtimezone = "Europe/Berlin";
- log_type = "file";
- };
- phpOptions."opcache.interned_strings_buffer" = "64";
- };
-
- services.borgbackup.jobs.nextcloud = {
- paths = [
- "/var/lib/nextcloud"
- "/var/lib/backup/nextcloud/db"
- ];
- repo = "h8xn8qvo@h8xn8qvo.repo.borgbase.com:repo";
- encryption.mode = "none";
- environment = {
- BORG_RSH = "ssh -i /home/${username}/.ssh/borgbase-nextcloud -o StrictHostKeyChecking=accept-new";
- TMPDIR = "/var/tmp";
- };
- compression = "auto,lzma";
- startAt = "daily";
- readWritePaths = [
- "/var/lib/backup"
- "/var/lib/nextcloud"
- ];
- preHook = ''
- set -euo pipefail
- INSTALL="${pkgs.coreutils}/bin/install"
- FIND="${pkgs.findutils}/bin/find"
- MYSQLDUMP="${pkgs.mariadb.client}/bin/mysql-dump"
- GZIP="${pkgs.gzip}/bin/gzip"
- OCC="${lib.getExe config.services.nextcloud.occ}"
-
- # This command requires write access to /var/lib/backup.
- $INSTALL -d -m 0750 -o root -g root /var/lib/backup/nextcloud/db
-
- trap "$OCC maintenance:mode --off >/dev/null 2>&1 || true" EXIT
-
- $OCC maintenance:mode --on
-
- # Make a consistent database dump without locking the site.
- $MYSQLDUMP --single-transaction --quick --lock-tables=false --databases nextcloud \
- | $GZIP -c > /var/lib/backup/nextcloud/db/nextcloud-$(date +%F-%H%M%S).sql.gz
-
- # Delete local dump files older than 14 days.
- $FIND /var/lib/backup/nextcloud/db -type f -name "*.sql.gz" -mtime +14 -delete || true
- '';
- postHook = ''
- set -euo pipefail
- ${lib.getExe config.services.nextcloud.occ} maintenance:mode --off || true
- '';
- };
-
- security.auditd.enable = true;
- security.audit = {
- enable = true;
- rules = [ "-a exit,always -F arch=b64 -S execve" ];
- };
-
- networking.firewall = {
- allowPing = false;
- allowedTCPPorts = [
- 80
- 443
- 8693
- ];
+ nx.server = {
+ openssh.enable = true;
+ fail2ban.enable = true;
+ nginx.enable = true;
+ nextcloud.enable = true;
+ site.enable = true;
};
nixpkgs.config.allowUnfree = true;
diff --git a/lib/default.nix b/lib/default.nix
index df6aa0f..76bcb08 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -25,24 +25,24 @@ in
nixpkgs.overlays = overlays;
nixpkgs.config.allowUnfree = true;
- nix.settings.experimental-features = [
- "nix-command"
- "flakes"
- ];
+ nix.settings.experimental-features = [
+ "nix-command"
+ "flakes"
+ ];
};
- modules =
- [
- hostCfg
- nixpkgsModule
- ]
- ++ (lib.optional useHomeManager (
- if darwinHost then
- inputs.home-manager.darwinModules.home-manager
- else
- inputs.home-manager.nixosModules.home-manager
- ))
- ++ extraModules;
+ modules = [
+ hostCfg
+ nixpkgsModule
+ ]
+ ++ (lib.optional (!darwinHost) ../modules/hosts)
+ ++ (lib.optional useHomeManager (
+ if darwinHost then
+ inputs.home-manager.darwinModules.home-manager
+ else
+ inputs.home-manager.nixosModules.home-manager
+ ))
+ ++ extraModules;
in
builder {
system = system;
diff --git a/modules/desktop/cinnamon/default.nix b/modules/desktop/cinnamon/default.nix
deleted file mode 100644
index b6e2c6b..0000000
--- a/modules/desktop/cinnamon/default.nix
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- config,
- pkgs,
- lib,
- ...
-}:
-
-{
- options.nx.desktop.cinnamon = {
- enable = lib.mkEnableOption "Enable Cinnamon desktop environment";
- };
-
- config = lib.mkIf config.nx.desktop.cinnamon.enable {
- services.xserver.enable = true;
- services.xserver.displayManager.lightdm.enable = true;
- services.xserver.desktopManager.cinnamon.enable = true;
-
- services.speechd.enable = lib.mkForce false;
- services.orca.enable = lib.mkForce true;
-
- environment.systemPackages = with pkgs; [
- nemo-preview
- ];
-
- environment.variables.QT_QPA_PLATFORMTHEME = "qt5ct";
-
- services.xserver.xkb = {
- layout = "de";
- variant = "";
- };
-
- console.keyMap = "de";
- };
-}
diff --git a/modules/desktop/default.nix b/modules/desktop/default.nix
deleted file mode 100644
index f3efbf5..0000000
--- a/modules/desktop/default.nix
+++ /dev/null
@@ -1,13 +0,0 @@
-{ ... }:
-
-{
- imports = [
- ./sway
- ./dunst.nix
- ./waybar.nix
- ./gnome
- ./cinnamon
- ./kde
- ./labwc
- ];
-}
diff --git a/modules/hosts/audio/default.nix b/modules/hosts/audio/default.nix
new file mode 100644
index 0000000..3cd06e4
--- /dev/null
+++ b/modules/hosts/audio/default.nix
@@ -0,0 +1,29 @@
+{
+ config,
+ lib,
+ ...
+}:
+
+let
+ inherit (lib) mkOption types mkIf;
+ cfg = config.nx.services.audio;
+in
+{
+ options.nx.services.audio = {
+ enable = mkOption {
+ description = "enable sound";
+ type = types.bool;
+ default = false;
+ };
+ };
+ config = mkIf cfg.enable {
+ security.rtkit.enable = true;
+ services.pipewire = {
+ enable = true;
+ alsa.enable = true;
+ alsa.support32Bit = true;
+ pulse.enable = true;
+ wireplumber.enable = true;
+ };
+ };
+}
diff --git a/modules/hosts/default.nix b/modules/hosts/default.nix
new file mode 100644
index 0000000..a1eaafc
--- /dev/null
+++ b/modules/hosts/default.nix
@@ -0,0 +1,13 @@
+{ ... }:
+
+{
+ imports = [
+ ./audio
+ ./desktop
+ ./openssh
+ ./printer
+ ./server
+ ./system
+ ./wooting
+ ];
+}
diff --git a/modules/hosts/desktop/cinnamon/default.nix b/modules/hosts/desktop/cinnamon/default.nix
new file mode 100644
index 0000000..356bf42
--- /dev/null
+++ b/modules/hosts/desktop/cinnamon/default.nix
@@ -0,0 +1,38 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+let
+ inherit (lib) mkEnableOption mkIf mkForce;
+ cfg = config.nx.desktop.cinnamon;
+in
+{
+ options.nx.desktop.cinnamon = {
+ enable = mkEnableOption "Enable Cinnamon desktop environment";
+ };
+
+ config = mkIf cfg.enable {
+ services.xserver.enable = true;
+ services.xserver.displayManager.lightdm.enable = true;
+ services.xserver.desktopManager.cinnamon.enable = true;
+
+ services.speechd.enable = mkForce false;
+ services.orca.enable = mkForce true;
+
+ environment.systemPackages = with pkgs; [
+ nemo-preview
+ ];
+
+ environment.variables.QT_QPA_PLATFORMTHEME = "qt5ct";
+
+ services.xserver.xkb = {
+ layout = "de";
+ variant = "";
+ };
+
+ console.keyMap = "de";
+ };
+}
diff --git a/modules/hosts/desktop/default.nix b/modules/hosts/desktop/default.nix
new file mode 100644
index 0000000..137b68c
--- /dev/null
+++ b/modules/hosts/desktop/default.nix
@@ -0,0 +1,14 @@
+{ ... }:
+
+{
+ imports = [
+ #./sway
+ #./dunst.nix
+ #./waybar.nix
+ #./gnome
+ ./cinnamon
+ ./kde
+ #./labwc
+ #./hyprland
+ ];
+}
diff --git a/modules/desktop/dunst.nix b/modules/hosts/desktop/dunst.nix
index 46e6445..4c5f74e 100644
--- a/modules/desktop/dunst.nix
+++ b/modules/hosts/desktop/dunst.nix
@@ -6,9 +6,13 @@
...
}:
+let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.dunst;
+in
{
- options.nx.desktop.dunst.enable = lib.mkEnableOption "Enable dunst notification";
- config = lib.mkIf config.nx.desktop.dunst.enable {
+ options.nx.desktop.dunst.enable = mkEnableOption "Enable dunst notification";
+ config = mkIf cfg.enable {
home-manager.users.${username} = {
home.packages = with pkgs; [
libnotify
diff --git a/modules/desktop/gnome/dconf.nix b/modules/hosts/desktop/gnome/dconf.nix
index 580433d..74b9b4a 100644
--- a/modules/desktop/gnome/dconf.nix
+++ b/modules/hosts/desktop/gnome/dconf.nix
@@ -5,8 +5,12 @@
...
}:
+let
+ inherit (lib) mkIf;
+ cfg = config.nx.desktop.gnome;
+in
{
- config = lib.mkIf config.nx.desktop.gnome.enable {
+ config = mkIf cfg.enable {
home-manager.users."${username}".dconf.settings = {
"org/gnome/desktop/interface" = {
color-scheme = "prefer-dark";
diff --git a/modules/desktop/gnome/default.nix b/modules/hosts/desktop/gnome/default.nix
index 40824a1..2aa62ed 100644
--- a/modules/desktop/gnome/default.nix
+++ b/modules/hosts/desktop/gnome/default.nix
@@ -5,16 +5,20 @@
...
}:
+let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.gnome;
+in
{
imports = [
./dconf.nix
];
options.nx.desktop.gnome = {
- enable = lib.mkEnableOption "Enable GNOME desktop environment";
+ enable = mkEnableOption "Enable GNOME desktop environment";
};
- config = lib.mkIf config.nx.desktop.gnome.enable {
+ config = mkIf cfg.enable {
services.displayManager.gdm.enable = true;
services.desktopManager.gnome.enable = true;
services.gnome.core-developer-tools.enable = false;
diff --git a/modules/hosts/desktop/hyprland/default.nix b/modules/hosts/desktop/hyprland/default.nix
new file mode 100644
index 0000000..2bc2525
--- /dev/null
+++ b/modules/hosts/desktop/hyprland/default.nix
@@ -0,0 +1,183 @@
+{
+ config,
+ username,
+ lib,
+ pkgs,
+ ...
+}:
+
+let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.hyprland;
+in
+{
+ imports = [
+ ./hyprlock.nix
+ ];
+
+ options.nx.desktop.hyprland.enable = mkEnableOption "Enable hyprland and setup";
+ config = mkIf cfg.enable {
+ nx.desktop.hyprlock.enable = true;
+ home-manager.users.${username} = {
+ home.packages = with pkgs; [
+ hyprshot
+ hyprpicker
+ ];
+ wayland.windowManager.hyprland = {
+ enable = true;
+ systemd.enable = true;
+ xwayland.enable = true;
+ settings = {
+ monitor = [
+ "DP-1,highrr,0x0,auto"
+ ];
+
+ "$background" = "rgba(000000FF)";
+ "$accent" = "rgba(FFFFFFFF)";
+
+ exec-once = [
+ ];
+
+ env = [
+ "XCURSOR_SIZE,24"
+ ];
+
+ input = {
+ kb_layout = "de";
+ follow_mouse = 1;
+ touchpad = {
+ natural_scroll = "yes";
+ };
+ };
+
+ "device:logitech-g-pro--1" = {
+ sensitivity = -0.5;
+ };
+
+ general = {
+ gaps_in = 5;
+ gaps_out = 10;
+ border_size = 2;
+ "col.active_border" = "$accent";
+ "col.inactive_border" = "$background";
+ layout = "dwindle";
+ };
+
+ decoration = {
+ rounding = 5;
+ active_opacity = 0.8;
+ inactive_opacity = 0.7;
+
+ blur = {
+ enabled = true;
+ size = 4;
+ passes = 4;
+ ignore_opacity = true;
+ contrast = 1.1;
+ brightness = 1.0;
+ };
+
+ drop_shadow = false;
+ shadow_range = 30;
+ shadow_render_power = 4;
+ "col.shadow" = "$background";
+ };
+
+ animations = {
+ enabled = "yes";
+ bezier = "myBezier, 0.05, 0.9, 0.1, 1.05";
+ animation = [
+ "windows, 1, 7, myBezier"
+ "windowsOut, 1, 7, default, popin 80%"
+ "border, 1, 10, default"
+ "fade, 1, 7, default"
+ "workspaces, 1, 6, default"
+ ];
+ };
+
+ misc = {
+ disable_hyprland_logo = true;
+ vrr = 1;
+ };
+
+ dwindle = {
+ pseudotile = "yes";
+ preserve_split = "yes";
+ };
+
+ master = {
+ new_is_master = true;
+ };
+
+ xwayland = {
+ force_zero_scaling = true;
+ };
+
+ windowrulev2 = [
+ "noborder,class:(steam)"
+ ];
+
+ "$mod" = "SUPER";
+
+ bind = [
+ "$mod, l, exec, hyprlock"
+ "$mod, s, exec, hyprshot --mode region"
+ "$mod, r, exec, wofi --show run"
+ "$mod, d, exec, wofi --show drun"
+ "$mod, c, exec, hyprpicker -r -a"
+ "$mod, return, exec, kitty"
+ "$mod, q, killactive,"
+ "$mod, m, exit,"
+ "$mod, f, fullscreen"
+ "$mod, v, togglefloating,"
+ "$mod, P, pseudo,"
+
+ ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+"
+ ", XF86AudioLowerVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%-"
+ ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
+
+ ", XF86AudioPlay, exec, playerctl play-pause"
+ ", XF86AudioNext, exec, playerctl next"
+ ", XF86AudioPrev, exec, playerctl previous"
+ ", XF86Audiostop, exec, playerctl stop"
+
+ "$mod, left, movefocus, l"
+ "$mod, right, movefocus, r"
+ "$mod, up, movefocus, u"
+ "$mod, down, movefocus, d"
+
+ "$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, 0, workspace, 10"
+
+ "$mod SHIFT, 1, movetoworkspace, 1"
+ "$mod SHIFT, 2, movetoworkspace, 2"
+ "$mod SHIFT, 3, movetoworkspace, 3"
+ "$mod SHIFT, 4, movetoworkspace, 4"
+ "$mod SHIFT, 5, movetoworkspace, 5"
+ "$mod SHIFT, 6, movetoworkspace, 6"
+ "$mod SHIFT, 7, movetoworkspace, 7"
+ "$mod SHIFT, 8, movetoworkspace, 8"
+ "$mod SHIFT, 9, movetoworkspace, 9"
+ "$mod SHIFT, 0, movetoworkspace, 10"
+
+ "$mod, mouse_down, workspace, e+1"
+ "$mod, mouse_up, workspace, e-1"
+ ];
+
+ bindm = [
+ "$mod, mouse:272, movewindow"
+ "$mod, mouse:273, resizewindow"
+ ];
+ };
+ };
+ };
+ };
+}
diff --git a/modules/desktop/hyprland/hyprlock.nix b/modules/hosts/desktop/hyprland/hyprlock.nix
index 425f83c..2d2ab03 100644
--- a/modules/desktop/hyprland/hyprlock.nix
+++ b/modules/hosts/desktop/hyprland/hyprlock.nix
@@ -5,11 +5,20 @@
...
}:
+let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.hyprlock;
+in
{
- options.nx.desktop.hyprlock.enable = lib.mkEnableOption "Hyprlock is a screen locker for Hyprland.";
- config = lib.mkIf config.nx.desktop.hyprlock.enable {
+ options.nx.desktop.hyprlock.enable = mkEnableOption "Hyprlock is a screen locker for Hyprland." // {
+ default = config.nx.desktop.hyprland.enable;
+ };
+ config = mkIf cfg.enable {
programs.hyprlock = {
enable = true;
+ };
+ home-manager.users.${username}.programs.hyprlock = {
+ enable = true;
settings = {
general = {
immediate_render = true;
diff --git a/modules/desktop/kde/default.nix b/modules/hosts/desktop/kde/default.nix
index d2d37dd..d53e1c8 100644
--- a/modules/desktop/kde/default.nix
+++ b/modules/hosts/desktop/kde/default.nix
@@ -5,17 +5,22 @@
...
}:
+let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.kde;
+in
{
- options.nx.desktop.kde.enable = lib.mkEnableOption "Enable kde";
- config = lib.mkIf config.nx.desktop.kde.enable {
+ options.nx.desktop.kde.enable = mkEnableOption "Enable kde";
+ config = mkIf cfg.enable {
services.displayManager.sddm.enable = true;
services.displayManager.sddm.wayland.enable = true;
services.desktopManager.plasma6.enable = true;
+ security.pam.services.sddm.enableKwallet = true;
environment.plasma6.excludePackages = with pkgs.kdePackages; [
elisa
- kate
+ kate
];
};
}
diff --git a/modules/desktop/labwc/default.nix b/modules/hosts/desktop/labwc/default.nix
index 9f15641..fd7c062 100644
--- a/modules/desktop/labwc/default.nix
+++ b/modules/hosts/desktop/labwc/default.nix
@@ -7,6 +7,9 @@
}:
let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.labwc;
+
gruvbox-openbox = pkgs.stdenv.mkDerivation {
pname = "gruvbox-openbox";
version = "0-unstable-2024-02-14";
@@ -31,8 +34,8 @@ in
./sfwbar.nix
];
- options.nx.desktop.labwc.enable = lib.mkEnableOption "Enable labwc";
- config = lib.mkIf config.nx.desktop.labwc.enable {
+ options.nx.desktop.labwc.enable = mkEnableOption "Enable labwc";
+ config = mkIf cfg.enable {
home-manager.users.${username} = {
home.packages = with pkgs; [
labwc-tweaks
diff --git a/modules/desktop/labwc/sfwbar.nix b/modules/hosts/desktop/labwc/sfwbar.nix
index 62c4982..7021374 100644
--- a/modules/desktop/labwc/sfwbar.nix
+++ b/modules/hosts/desktop/labwc/sfwbar.nix
@@ -6,12 +6,16 @@
...
}:
+let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.sfwbar;
+in
{
- options.nx.desktop.sfwbar.enable = lib.mkEnableOption "Enable sfwbar" // {
+ options.nx.desktop.sfwbar.enable = mkEnableOption "Enable sfwbar" // {
default = config.nx.desktop.labwc.enable;
};
- config = lib.mkIf config.nx.desktop.sfwbar.enable {
+ config = mkIf cfg.enable {
home-manager.users.${username} = {
home.packages = with pkgs; [
sfwbar
diff --git a/modules/desktop/sway/default.nix b/modules/hosts/desktop/sway/default.nix
index 7de94a6..c149c21 100644
--- a/modules/desktop/sway/default.nix
+++ b/modules/hosts/desktop/sway/default.nix
@@ -7,7 +7,9 @@
}:
let
+ inherit (lib) mkEnableOption mkIf mkOptionDefault;
mod = config.home-manager.users.${username}.wayland.windowManager.sway.config.modifier;
+ cfg = config.nx.desktop.sway;
in
{
imports = [
@@ -15,8 +17,8 @@ in
./swaylock.nix
];
- options.nx.desktop.sway.enable = lib.mkEnableOption "Enable sway and setup";
- config = lib.mkIf config.nx.desktop.sway.enable {
+ options.nx.desktop.sway.enable = mkEnableOption "Enable sway and setup";
+ config = mkIf cfg.enable {
home-manager.users.${username} = {
home.packages = with pkgs; [
wmenu
@@ -57,7 +59,7 @@ in
modifier = "Mod4";
- keybindings = lib.mkOptionDefault {
+ keybindings = mkOptionDefault {
"${mod}+q" = "kill";
"${mod}+Shift+s" = "exec grimshot savecopy area";
"XF86AudioPlay" = "exec playerctl play-pause";
diff --git a/modules/desktop/sway/swayidle.nix b/modules/hosts/desktop/sway/swayidle.nix
index 0708abc..df8dbdc 100644
--- a/modules/desktop/sway/swayidle.nix
+++ b/modules/hosts/desktop/sway/swayidle.nix
@@ -6,11 +6,15 @@
...
}:
+let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.swayidle;
+in
{
- options.nx.desktop.swayidle.enable = lib.mkEnableOption "Enable swayidle configuration" // {
+ options.nx.desktop.swayidle.enable = mkEnableOption "Enable swayidle configuration" // {
default = config.nx.desktop.sway.enable;
};
- config = lib.mkIf config.nx.desktop.swayidle.enable {
+ config = mkIf cfg.enable {
home-manager.users."${username}" = {
services.swayidle = {
enable = true;
diff --git a/modules/desktop/sway/swaylock.nix b/modules/hosts/desktop/sway/swaylock.nix
index 66e418b..9ba43a1 100644
--- a/modules/desktop/sway/swaylock.nix
+++ b/modules/hosts/desktop/sway/swaylock.nix
@@ -5,11 +5,15 @@
...
}:
+let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.swaylock;
+in
{
- options.nx.desktop.swaylock.enable = lib.mkEnableOption "Enable and setup swaylock" // {
+ options.nx.desktop.swaylock.enable = mkEnableOption "Enable and setup swaylock" // {
default = config.nx.desktop.sway.enable;
};
- config = lib.mkIf config.nx.desktop.swaylock.enable {
+ config = mkIf cfg.enable {
home-manager.users."${username}" = {
programs.swaylock = {
enable = true;
diff --git a/modules/desktop/waybar.nix b/modules/hosts/desktop/waybar.nix
index 874b50f..23b0f59 100644
--- a/modules/desktop/waybar.nix
+++ b/modules/hosts/desktop/waybar.nix
@@ -5,9 +5,13 @@
...
}:
+let
+ inherit (lib) mkEnableOption mkIf;
+ cfg = config.nx.desktop.waybar;
+in
{
- options.nx.desktop.waybar.enable = lib.mkEnableOption "Enable and configure Waybar";
- config = lib.mkIf config.nx.desktop.waybar.enable {
+ options.nx.desktop.waybar.enable = mkEnableOption "Enable and configure Waybar";
+ config = mkIf cfg.enable {
home-manager.users."${username}" = {
programs.waybar = {
enable = true;
diff --git a/modules/hosts/openssh/default.nix b/modules/hosts/openssh/default.nix
new file mode 100644
index 0000000..49c0527
--- /dev/null
+++ b/modules/hosts/openssh/default.nix
@@ -0,0 +1,25 @@
+{
+ config,
+ username,
+ lib,
+ ...
+}:
+let
+ inherit (lib) mkOption types mkIf;
+ cfg = config.nx.services.openssh;
+in
+{
+ options.nx.services.openssh.enable = mkOption {
+ description = "Setup openssh server";
+ type = types.bool;
+ default = false;
+ };
+ config = mkIf cfg.enable {
+ services.openssh = {
+ enable = true;
+ settings = {
+ AllowUsers = [ username ];
+ };
+ };
+ };
+}
diff --git a/modules/hosts/printer/default.nix b/modules/hosts/printer/default.nix
new file mode 100644
index 0000000..d094c21
--- /dev/null
+++ b/modules/hosts/printer/default.nix
@@ -0,0 +1,32 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+let
+ inherit (lib) mkOption types mkIf;
+ cfg = config.nx.printer;
+in
+{
+
+ options.nx.printer = {
+ enable = mkOption {
+ description = "Setup printer service";
+ type = types.bool;
+ default = false;
+ };
+ };
+ config = mkIf cfg.enable {
+ services.printing = {
+ enable = true;
+ drivers = [ pkgs.brlaser ];
+ };
+ # printer autodiscovery
+ services.avahi = {
+ enable = true;
+ nssmdns4 = true;
+ openFirewall = true;
+ };
+ };
+}
diff --git a/modules/hosts/server/default.nix b/modules/hosts/server/default.nix
new file mode 100644
index 0000000..ca3ca4f
--- /dev/null
+++ b/modules/hosts/server/default.nix
@@ -0,0 +1,29 @@
+{
+ lib,
+ ...
+}:
+let
+ inherit (lib) mkOption types;
+in
+{
+ options.nx.server = {
+ enable = mkOption {
+ description = "Set this host as server";
+ type = types.bool;
+ default = false;
+ };
+ timeZone = mkOption {
+ description = "Time Zone of the server";
+ type = types.str;
+ default = "Europe/Berlin";
+ };
+ };
+
+ imports = [
+ ./openssh
+ ./nginx
+ ./fail2ban
+ ./nextcloud
+ ./site
+ ];
+}
diff --git a/modules/hosts/server/fail2ban/default.nix b/modules/hosts/server/fail2ban/default.nix
new file mode 100644
index 0000000..09fcdf2
--- /dev/null
+++ b/modules/hosts/server/fail2ban/default.nix
@@ -0,0 +1,31 @@
+{
+ config,
+ pkgs,
+ options,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.server.fail2ban;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ options.nx.server.fail2ban = {
+ enable = mkOption {
+ description = "Setup fail2ban service";
+ type = types.bool;
+ default = false;
+ };
+ bantime = mkOption {
+ description = "default bantime";
+ type = types.str;
+ default = "1h";
+ };
+ };
+ config = mkIf cfg.enable {
+ services.fail2ban = {
+ enable = true;
+ bantime = cfg.bantime;
+ };
+ };
+}
diff --git a/modules/hosts/server/nextcloud/default.nix b/modules/hosts/server/nextcloud/default.nix
new file mode 100644
index 0000000..a527de2
--- /dev/null
+++ b/modules/hosts/server/nextcloud/default.nix
@@ -0,0 +1,156 @@
+{
+ pkgs,
+ config,
+ username,
+ options,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.server.nextcloud;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ options.nx.server.nextcloud = {
+ enable = mkOption {
+ description = "Setup nextcloud server";
+ type = types.bool;
+ default = false;
+ };
+ adminUser = mkOption {
+ description = "Admin user";
+ type = types.str;
+ default = "schererleander";
+ };
+ adminPassFile = mkOption {
+ description = "Admin user key file";
+ type = types.str;
+ default = "/etc/nextcloud-admin-pass";
+ };
+ hostName = mkOption {
+ description = "Nextcloud hostname";
+ type = types.str;
+ default = "cloud.schererleander.de";
+ };
+ backup = mkOption {
+ description = "enable borgbase backups";
+ type = types.bool;
+ default = true;
+ };
+ jail = mkOption {
+ description = "setup fail2ban jail";
+ type = types.bool;
+ default = config.nx.server.fail2ban.enable;
+ };
+ };
+
+ config = mkIf cfg.enable {
+ services.nextcloud = {
+ enable = true;
+ package = pkgs.nextcloud32;
+ hostName = cfg.hostName;
+ https = true;
+ database.createLocally = true;
+ maxUploadSize = "16G";
+ config = {
+ dbtype = "mysql";
+ adminuser = cfg.adminUser;
+ adminpassFile = cfg.adminPassFile;
+ };
+ settings = {
+ maintenance_window_start = 2; # 02:00
+ default_phone_region = "de";
+ overwriteProtocol = "https";
+ trusted_domains = [ cfg.hostName ];
+ logtimezone = config.nx.server.timeZone;
+ log_type = "file";
+ };
+ phpOptions."opcache.interned_strings_buffer" = "64";
+ };
+
+ services.nginx.virtualHosts = mkIf ((config.nx.server.nginx or { }).enable or false) {
+ "${cfg.hostName}" = {
+ forceSSL = true;
+ sslCertificate = config.nx.server.nginx.sslCertificate;
+ sslCertificateKey = config.nx.server.nginx.sslCertificateKey;
+ };
+ };
+
+ services.borgbackup.jobs.nextcloud = mkIf cfg.backup {
+ paths = [
+ "/var/lib/nextcloud"
+ "/var/lib/backup/nextcloud/db"
+ ];
+ repo = "h8xn8qvo@h8xn8qvo.repo.borgbase.com:repo";
+ encryption.mode = "none";
+ environment = {
+ BORG_RSH = "ssh -i /home/${username}/.ssh/borgbase-nextcloud -o StrictHostKeyChecking=accept-new";
+ TMPDIR = "/var/tmp";
+ };
+ compression = "auto,lzma";
+ startAt = "daily";
+ readWritePaths = [
+ "/var/lib/backup"
+ "/var/lib/nextcloud"
+ ];
+ preHook = ''
+ set -euo pipefail
+ INSTALL="${pkgs.coreutils}/bin/install"
+ FIND="${pkgs.findutils}/bin/find"
+ MYSQLDUMP="${pkgs.mariadb.client}/bin/mysql-dump"
+ GZIP="${pkgs.gzip}/bin/gzip"
+ OCC="${lib.getExe config.services.nextcloud.occ}"
+
+ # This command requires write access to /var/lib/backup.
+ $INSTALL -d -m 0750 -o root -g root /var/lib/backup/nextcloud/db
+
+ trap "$OCC maintenance:mode --off >/dev/null 2>&1 || true" EXIT
+
+ $OCC maintenance:mode --on
+
+ # Make a consistent database dump without locking the site.
+ $MYSQLDUMP --single-transaction --quick --lock-tables=false --databases nextcloud \
+ | $GZIP -c > /var/lib/backup/nextcloud/db/nextcloud-$(date +%F-%H%M%S).sql.gz
+
+ # Delete local dump files older than 14 days.
+ $FIND /var/lib/backup/nextcloud/db -type f -name "*.sql.gz" -mtime +14 -delete || true
+ '';
+ postHook = ''
+ set -euo pipefail
+ ${lib.getExe config.services.nextcloud.occ} maintenance:mode --off || true
+ '';
+ };
+
+ services.fail2ban = mkIf cfg.jail {
+ jails = {
+ nextcloud = {
+ enabled = true;
+ settings = {
+ backend = "systemd";
+ journalmatch = "SYSLOG_IDENTIFIER=Nextcloud";
+ # END modification to work with syslog instead of logile
+ port = 443;
+ protocol = "tcp";
+ filter = "nextcloud";
+ maxretry = 3;
+ bantime = 86400;
+ findtime = 43200;
+ };
+ };
+ };
+ };
+
+ environment.etc = mkIf cfg.jail {
+ # Adapted failregex for syslogs
+ "fail2ban/filter.d/nextcloud.local".text = pkgs.lib.mkDefault (
+ pkgs.lib.mkAfter ''
+ [Definition]
+ _groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
+ failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
+ ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
+ datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
+ ''
+ );
+ };
+ };
+}
diff --git a/modules/hosts/server/nginx/default.nix b/modules/hosts/server/nginx/default.nix
new file mode 100644
index 0000000..438ab49
--- /dev/null
+++ b/modules/hosts/server/nginx/default.nix
@@ -0,0 +1,56 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.server.nginx;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ options.nx.server.nginx = {
+ enable = mkOption {
+ description = "Setup nginx reverse proxy";
+ type = types.bool;
+ default = true;
+ };
+ hostName = mkOption {
+ description = "url of server";
+ type = types.str;
+ default = "schererleander.de";
+ };
+ sslCertificate = mkOption {
+ description = "ssl certificate to use";
+ type = types.nullOr types.str;
+ default = "/etc/ssl/${cfg.hostName}/fullchain.pem";
+ };
+ sslCertificateKey = mkOption {
+ description = "ssl certificate key to use";
+ type = types.nullOr types.str;
+ default = "/etc/ssl/${cfg.hostName}/privkey.key";
+ };
+ };
+ config = mkIf cfg.enable {
+ services.nginx = {
+ enable = true;
+ recommendedGzipSettings = true;
+ recommendedOptimisation = true;
+ recommendedProxySettings = true;
+ recommendedTlsSettings = true;
+ appendHttpConfig = ''
+ map $scheme $hsts_header {
+ https "max-age=31536000; includeSubdomains; preload";
+ }
+ add_header Strict-Transport-Security $hsts_header;
+ #add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; font-src 'self'; connect-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'self';" always;
+ add_header 'Referrer-Policy' 'same-origin';
+ add_header X-Frame-Options DENY;
+ add_header X-Content-Type-Options nosniff;
+ '';
+ };
+ networking.firewall.allowedTCPPorts = [
+ 80
+ 443
+ ];
+ };
+}
diff --git a/modules/hosts/server/openssh/default.nix b/modules/hosts/server/openssh/default.nix
new file mode 100644
index 0000000..fbb15db
--- /dev/null
+++ b/modules/hosts/server/openssh/default.nix
@@ -0,0 +1,53 @@
+{
+ config,
+ username,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.server.openssh;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ options.nx.server.openssh = {
+ enable = mkOption {
+ description = "Setup openssh for server";
+ type = types.bool;
+ default = false;
+ };
+ port = mkOption {
+ description = "Port for openssh";
+ type = types.port;
+ default = 8693;
+ };
+ };
+
+ config = mkIf cfg.enable {
+ services.openssh = {
+ enable = true;
+ ports = [ cfg.port ];
+ settings = {
+ PasswordAuthentication = false;
+ AllowUsers = [ username ];
+ X11Forwarding = false;
+ PermitRootLogin = "yes";
+ };
+ };
+ networking.firewall.allowedTCPPorts = [ cfg.port ];
+
+ services.fail2ban = {
+ jails = {
+ sshd = {
+ enabled = true;
+ settings = {
+ port = 8693;
+ backend = "systemd";
+ maxretry = 4;
+ findtime = "10m";
+ bantime = "1h";
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/hosts/server/site/default.nix b/modules/hosts/server/site/default.nix
new file mode 100644
index 0000000..24807d3
--- /dev/null
+++ b/modules/hosts/server/site/default.nix
@@ -0,0 +1,32 @@
+{
+ config,
+ lib,
+ inputs,
+ ...
+}:
+let
+ cfg = config.nx.server.site;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ imports = [
+ inputs.site.nixosModules.default
+ ];
+
+ options.nx.server.site = {
+ enable = mkOption {
+ description = "Setup personal website";
+ type = types.bool;
+ default = false;
+ };
+ };
+
+ config = mkIf cfg.enable {
+ services.site = {
+ enable = true;
+ domain = "schererleander.de";
+ sslCertificate = "/etc/ssl/schererleander.de/fullchain.pem";
+ sslCertificateKey = "/etc/ssl/schererleander.de/privkey.key";
+ };
+ };
+}
diff --git a/modules/hosts/system/default.nix b/modules/hosts/system/default.nix
new file mode 100644
index 0000000..93452a6
--- /dev/null
+++ b/modules/hosts/system/default.nix
@@ -0,0 +1,10 @@
+{ ... }:
+
+{
+ imports = [
+ ./localisation.nix
+ ./network.nix
+ ./nix-options.nix
+ ./users.nix
+ ];
+}
diff --git a/modules/system/localisation.nix b/modules/hosts/system/localisation.nix
index 229c45f..229c45f 100644
--- a/modules/system/localisation.nix
+++ b/modules/hosts/system/localisation.nix
diff --git a/modules/system/network.nix b/modules/hosts/system/network.nix
index 383480b..383480b 100644
--- a/modules/system/network.nix
+++ b/modules/hosts/system/network.nix
diff --git a/modules/hosts/system/nix-options.nix b/modules/hosts/system/nix-options.nix
new file mode 100644
index 0000000..14d7fb7
--- /dev/null
+++ b/modules/hosts/system/nix-options.nix
@@ -0,0 +1,18 @@
+{ ... }:
+
+{
+ nix = {
+ settings = {
+ experimental-features = [
+ "nix-command"
+ "flakes"
+ ];
+ auto-optimise-store = true;
+ };
+ gc = {
+ automatic = true;
+ dates = "daily";
+ options = "--delete-older-than 15d";
+ };
+ };
+}
diff --git a/modules/system/users.nix b/modules/hosts/system/users.nix
index d42dac3..5ecdfba 100644
--- a/modules/system/users.nix
+++ b/modules/hosts/system/users.nix
@@ -16,7 +16,7 @@
(lib.mkIf config.networking.networkmanager.enable "networkmanager")
];
shell = pkgs.zsh;
- ignoreShellProgramCheck = true;
+ ignoreShellProgramCheck = true;
};
security.sudo.wheelNeedsPassword = false;
}
diff --git a/modules/hosts/wooting/default.nix b/modules/hosts/wooting/default.nix
new file mode 100644
index 0000000..b2b78c0
--- /dev/null
+++ b/modules/hosts/wooting/default.nix
@@ -0,0 +1,26 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+let
+ inherit (lib) mkOption types mkIf;
+ cfg = config.nx.wooting;
+in
+{
+ options.nx.wooting = {
+ enable = mkOption {
+ description = "Setup wootility, udev rules to discover keyboards";
+ type = types.bool;
+ default = false;
+ };
+ };
+ config = mkIf cfg.enable {
+ services.udev.packages = [ pkgs.wooting-udev-rules ];
+ environment.systemPackages = with pkgs; [
+ wootility
+ ];
+ };
+}
diff --git a/modules/programs/anki.nix b/modules/programs/anki.nix
deleted file mode 100644
index e63fe01..0000000
--- a/modules/programs/anki.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- config,
- pkgs,
- lib,
- username,
- ...
-}:
-
-{
- options.nx.programs.anki.enable = lib.mkEnableOption "Enable anki";
- config = lib.mkIf config.nx.programs.anki.enable {
- # Marked as broken
- #home-manager.users.${username}.programs.anki = {
- #enable = true;
- #style = "native";
- #addons = with pkgs.ankiAddons; [
- # anki-connect
- # review-heatmap
- #];
- #};
- };
-}
diff --git a/modules/programs/default.nix b/modules/programs/default.nix
deleted file mode 100644
index 5a9c001..0000000
--- a/modules/programs/default.nix
+++ /dev/null
@@ -1,26 +0,0 @@
-{ ... }:
-
-{
- imports = [
- ./anki.nix
- ./foot.nix
- ./git.nix
- ./latex.nix
- ./nixcord.nix
- ./spicetify.nix
- ./typst.nix
- ./zathura.nix
- ./firefox.nix
- ./gh.nix
- ./gpg.nix
- ./neovim
- ./tmux.nix
- ./vscode.nix
- ./zsh.nix
- ./zed.nix
- ./obsidian.nix
- ./opencode.nix
- ./gemini.nix
- ./kitty.nix
- ];
-}
diff --git a/modules/programs/firefox.nix b/modules/programs/firefox.nix
deleted file mode 100644
index 28bdfea..0000000
--- a/modules/programs/firefox.nix
+++ /dev/null
@@ -1,248 +0,0 @@
-{
- config,
- username,
- lib,
- pkgs,
- inputs,
- ...
-}:
-
-{
- options.nx.programs.firefox.enable = lib.mkEnableOption "Setup firefox";
- config = lib.mkIf config.nx.programs.firefox.enable {
- home-manager.users.${username} = {
- programs.firefox = {
- enable = true;
- profiles.default = {
- extensions = {
- packages = with inputs.firefox-addons.packages.${pkgs.system}; [
- ublock-origin
- istilldontcareaboutcookies
- sponsorblock
- decentraleyes
- vimium-c
- ];
-
- force = true;
-
- settings."uBlock0@raymondhill.net".settings = {
- UserMessaging = {
- uiTheme = "dark";
- uiAccentCustom = true;
- uiAccentCustom0 = "#2C2C2C";
- cloudStorageEnabled = false;
- contextMenuEnabled = false;
- };
- # Block annoying login with google banner
- userFilters = ''
- ||accounts.google.com/gsi/*
- '';
- };
- };
-
- search.engines = {
- nix-packages = {
- name = "Nix Packages";
- urls = [
- {
- template = "https://search.nixos.org/packages";
- params = [
- {
- name = "type";
- value = "packages";
- }
- {
- name = "query";
- value = "{searchTerms}";
- }
- ];
- }
- ];
-
- icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
- definedAliases = [ "@np" ];
- };
-
- nixos-wiki = {
- name = "NixOS Wiki";
- urls = [ { template = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; } ];
- iconMapObj."16" = "https://wiki.nixos.org/favicon.ico";
- definedAliases = [ "@nw" ];
- };
-
- startpage = {
- name = "Startpage";
- urls = [
- {
- template = "https://www.startpage.com/sp/search?query={searchTerms}";
- }
- ];
- icon = "https://www.startpage.com/favicon.ico";
- definedAliases = [ "@s" ];
- };
-
- bing.metaData.hidden = true;
- google.metaData.alias = "@g";
- };
-
- search.default = "startpage";
-
- settings = {
- };
-
- userChrome = ''
- /* Hide Back, Forward, Reload, Stop, All Tabs, Firefox View buttons */
- #back-button,
- #forward-button,
- #reload-button,
- #stop-button,
- #alltabs-button,
- #firefox-view-button {
- display: none !important;
- }
-
- .titlebar-buttonbox-container {
- display: none;
- }
-
- #tabbrowser-tabs {
- border-inline: none !important;
- }
-
- /* Transparent background tabs (above url bar) */
- #navigator-toolbox {
- -moz-appearance: -moz-vibrant-titlebar !important;
- background: rgba(0, 0, 0, 0.8) !important;
- }
-
- /* Transparent background (behind url bar) */
- #nav-bar {
- background: none !important;
- box-shadow: none !important;
- border-top: 0px !important;
- }
-
- .tab-background[selected="true"] {
- background-color: #393e43 !important;
- background-image: none !important;
- }
-
- .tab-background {
- background-color: var(--background) !important;
- color: var(--foreground) !important;
- box-shadow: none !important;;
- }
-
- .tab-background[selected] {
- background-color: rgba(0, 0, 0, 0.30) !important;
- color: var(--foreground) !important;
- box-shadow: none !important;
- }
-
- /* Needed for transparency in general */
- :root {
- --tabpanel-background-color: transparent !important;
- --chrome-content-separator-color: transparent !important;
- --toolbar-bgcolor: rgba(0, 0, 0, 0.9) !important;
- --newtab-background-color: rgba(0, 0, 0, 0.9) !important;
- --newtab-background-color-secondary: transparent !important;
- --toolbar-field-background-color: rgba(120, 120, 120, 0.10) !important;
- }
- '';
- userContent = ''
- @-moz-document url-prefix("about:"), url("about:home") {
- /* Transparent about:settings about:config about:policies */
- :root {
- background: rgba(0, 0, 0, 0.0) !important;
- }
- }
-
- /* Transparent about:home */
- * {
- --newtab-background-color: transparent !important;
- --newtab-background-color-secondary: transparent !important;
- }
-
- /* Transparent elements in about:* */
- * {
- --in-content-page-background: transparent !important;
- --background-color-box: rgba(0, 0, 0, 0.5) !important;
- }
- '';
- };
-
- policies = {
- DisableTelemetry = true;
- DisableFirefoxStudies = true;
- #PasswordManagerEnabled = false;
- OfferToSaveLogins = false;
- DisablePocket = true;
- DisplayBookmarksToolbar = "never";
- NoDefaultBookmarks = true;
-
- EnableTrackingProtection = {
- Value = true;
- Locked = true;
- Cryptomining = true;
- Fingerprinting = true;
- };
-
- EncryptedMediaExtensions = {
- Enabled = true;
- Locked = true;
- };
-
- FirefoxHome = {
- Search = true;
- TopSites = true;
- SponsoredTopSites = false;
- Highlights = true;
- Pocket = false;
- SponsoredPocket = false;
- Snippets = false;
- Locked = true;
- };
-
- UserMessaging = {
- ExtensionRecommendations = false;
- FeatureRecommendations = false;
- Locked = true;
- MoreFromMozilla = false;
- SkipOnboarding = true;
- UrlbarInterventions = false;
- WhatsNew = false;
- };
-
- Preferences = {
- "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
- "browser.toolbars.bookmarks.visibility" = "never";
-
- # Disable fullscreen notification
- "full-screen-api.warning.timeout" = "0";
-
- # Disable annoying translation popup
- "browser.translations.automaticallyPopup" = false;
-
- # Enable all extensions automatically
- "extensions.autoDisableScopes" = 0;
-
- # Hide ctr-tab tab preview menu
- "browser.ctrlTab.sortByRecentlyUsed" = false;
-
- # Hide pip controls
- "media.videocontrols.picture-in-picture.video-toggle.enabled" = false;
-
- # Set homepage
- "browser.startup.homepage" = "about:blank";
- "browser.newtab.url" = "about:blank";
- "browser.newtabpage.enabled" = false;
-
- # transparency
- "browser.tabs.allow_transparent_browser" = true;
- "gfx.webrender.all" = true;
- };
- };
- };
- };
- };
-} \ No newline at end of file
diff --git a/modules/programs/foot.nix b/modules/programs/foot.nix
deleted file mode 100644
index 866757b..0000000
--- a/modules/programs/foot.nix
+++ /dev/null
@@ -1,60 +0,0 @@
-{
- config,
- username,
- lib,
- pkgs,
- ...
-}:
-
-{
- options.nx.programs.foot.enable = lib.mkEnableOption "Enable foot terminal";
- config = lib.mkIf config.nx.programs.foot.enable {
- home-manager.users.${username} = {
- home.packages = with pkgs; [
- nerd-fonts.space-mono
- ];
-
- programs.foot = {
- enable = true;
- settings = {
- main = {
- pad = "10x10";
- font = "SpaceMono Nerd Font Mono:size=10";
- line-height = 12;
- };
-
- cursor = {
- style = "underline";
- unfocused-style = "unchanged";
- blink = true;
- };
-
- colors = {
- alpha = 0.9;
- # Gruvbox Theme
- background = "000000";
- foreground = "ebdbb2";
-
- regular0 = "282828";
- regular1 = "cc241d";
- regular2 = "98971a";
- regular3 = "d79921";
- regular4 = "458588";
- regular5 = "b16286";
- regular6 = "689d6a";
- regular7 = "a89984";
-
- bright0 = "928374";
- bright1 = "fb4934";
- bright2 = "b8bb26";
- bright3 = "fabd2f";
- bright4 = "83a598";
- bright5 = "d3869b";
- bright6 = "8ec07c";
- bright7 = "ebdbb2";
- };
- };
- };
- };
- };
-} \ No newline at end of file
diff --git a/modules/programs/gemini.nix b/modules/programs/gemini.nix
deleted file mode 100644
index 70c5260..0000000
--- a/modules/programs/gemini.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- config,
- lib,
- username,
- ...
-}:
-
-{
- options.nx.programs.gemini-cli.enable = lib.mkEnableOption "Install Gemini CLI tool";
- config = lib.mkIf config.nx.programs.gemini-cli.enable {
- home-manager.users."${username}".programs.gemini-cli = {
- enable = true;
- # Cant store credentials due config read-only
- #settings = {
- # "ui.theme" = "Default";
- # "general.preferredEditor" = "nvim";
- # "general.disableAutoUpdate" = true;
- # "privacy.usageStatisticsEnabled" = false;
- #};
- };
- };
-}
diff --git a/modules/programs/gh.nix b/modules/programs/gh.nix
deleted file mode 100644
index 52a34e3..0000000
--- a/modules/programs/gh.nix
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- config,
- username,
- lib,
- ...
-}:
-
-{
- options.nx.programs.gh.enable = lib.mkEnableOption "Setup gh";
- config = lib.mkIf config.nx.programs.gh.enable {
- home-manager.users.${username} = {
- programs.gh = {
- enable = true;
- };
- };
- };
-} \ No newline at end of file
diff --git a/modules/programs/git.nix b/modules/programs/git.nix
deleted file mode 100644
index 52ae045..0000000
--- a/modules/programs/git.nix
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- config,
- username,
- lib,
- ...
-}:
-
-{
- options.nx.programs.git.enable = lib.mkEnableOption "Enable git" // {
- default = true;
- };
- config = lib.mkIf config.nx.programs.git.enable {
- home-manager.users.${username} = {
- programs.git = {
- enable = true;
- signing = {
- key = "A3502B180BC1D41A";
- signByDefault = true;
- };
- ignores = [
- "*~"
- ".DS_Store"
- ];
- settings = {
- user.name = "schererleander";
- user.email = "leander@schererleander.de";
- alias = {
- st = "status";
- co = "checkout";
- br = "branch";
- };
- pull.rebase = true;
- url."git@github.com:".insteadOf = "https://github.com";
- };
- };
- programs.diff-highlight = {
- enable = true;
- enableGitIntegration = true;
- };
- };
- };
-}
diff --git a/modules/programs/gpg.nix b/modules/programs/gpg.nix
deleted file mode 100644
index 97eedf7..0000000
--- a/modules/programs/gpg.nix
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- config,
- username,
- pkgs,
- lib,
- ...
-}:
-
-let
- pinentryPackage = if pkgs.stdenv.isDarwin then pkgs.pinentry_mac else pkgs.pinentry-curses;
- pinentryProgram = if pkgs.stdenv.isDarwin then "pinentry-mac" else "pinentry-curses";
-in
-{
- options.nx.programs.gpg.enable = lib.mkEnableOption "Setup gpg and agent" // {
- default = true;
- };
- config = lib.mkIf config.nx.programs.gpg.enable {
- home-manager.users.${username} = {
- programs.gpg.enable = true;
- services.gpg-agent = {
- enable = true;
- pinentry.package = pinentryPackage;
- pinentry.program = pinentryProgram;
- };
- };
- };
-}
diff --git a/modules/programs/kitty.nix b/modules/programs/kitty.nix
deleted file mode 100644
index 619d1db..0000000
--- a/modules/programs/kitty.nix
+++ /dev/null
@@ -1,37 +0,0 @@
-{
- config,
- username,
- lib,
- ...
-}:
-
-{
- options.nx.programs.kitty.enable = lib.mkEnableOption "Enable git";
- config = lib.mkIf config.nx.programs.kitty.enable {
- home-manager.users.${username} = {
- programs.kitty = {
- enable = true;
- enableGitIntegration = true;
- font = {
- name = "monospace";
- size = 11;
- };
- settings = {
- cursor_shape = "underline";
- cursor_blink_interval = "-1";
- cursor_stop_blinking_after = "15.0";
-
- set_opacity = ".3";
-
- enable_audio_bell = false;
- bell_on_tab = false;
-
- window_border_width = "0";
- window_margin_width = "4";
- window_padding_width = "5";
- };
- };
- };
- };
-}
-
diff --git a/modules/programs/latex.nix b/modules/programs/latex.nix
deleted file mode 100644
index 5a9f8b4..0000000
--- a/modules/programs/latex.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- config,
- username,
- pkgs,
- lib,
- ...
-}:
-
-{
- options.nx.programs.latex.enable = lib.mkEnableOption "Setup latex";
- config = lib.mkIf config.nx.programs.latex.enable {
- home-manager.users.${username} = {
- programs.texlive = {
- enable = true;
- # See https://mynixos.com/search?q=texlivepackages.collection for more collections
- # and https://mynixos.com/search?q=texlivepackages for more individual packages.
- extraPackages = tpkgs: { inherit (tpkgs) collection-basic collection-latex collection-latexrecommended biblatex; };
- };
-
- home.packages = with pkgs; [
- biber
- ];
-
- programs.pandoc = {
- enable = true;
- defaults = {
- pdf-engine = "pdfetex";
- };
- };
- };
- };
-} \ No newline at end of file
diff --git a/modules/programs/neovim/default.nix b/modules/programs/neovim/default.nix
deleted file mode 100644
index d850fa7..0000000
--- a/modules/programs/neovim/default.nix
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- config,
- username,
- lib,
- pkgs,
- ...
-}:
-
-{
- options.nx.programs.neovim.enable = lib.mkEnableOption "Setup neovim";
- config = lib.mkIf config.nx.programs.neovim.enable {
- home-manager.users.${username} = {
- programs.neovim = {
- enable = true;
- package = pkgs.neovim;
- extraConfig = ''
- luafile ${./init.lua}
- '';
- };
- home.packages = with pkgs; [
- ripgrep
- gcc
-
- # language servers
- lua-language-server
- nixd
- pyright
- gopls
- java-language-server
- typescript-language-server
- rust-analyzer
- tailwindcss-language-server
-
- # formatter
- nixfmt-rfc-style
- luaformatter
- ];
- };
- };
-}
diff --git a/modules/programs/nixcord.nix b/modules/programs/nixcord.nix
deleted file mode 100644
index 191dcfb..0000000
--- a/modules/programs/nixcord.nix
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- config,
- lib,
- inputs,
- username,
- ...
-}:
-
-{
- options.nx.programs.nixcord.enable = lib.mkEnableOption "Enable nixcord and setup";
- config = lib.mkIf config.nx.programs.nixcord.enable {
- home-manager.users.${username} = { ... }: {
- imports = [ inputs.nixcord.homeModules.nixcord ];
-
- programs.nixcord = {
- enable = true;
- config = {
- themeLinks = [
- "https://refact0r.github.io/system24/theme/system24.theme.css"
- ];
- frameless = true;
- plugins = {
- alwaysAnimate.enable = false;
- imageLink.enable = true;
- imageZoom.enable = true;
- translate.enable = true;
- };
- };
- };
- };
- };
-}
diff --git a/modules/programs/obsidian.nix b/modules/programs/obsidian.nix
deleted file mode 100644
index 70aa47d..0000000
--- a/modules/programs/obsidian.nix
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- config,
- lib,
- username,
- ...
-}:
-
-{
- options.nx.programs.obsidian.enable = lib.mkEnableOption "Obsidian note-taking application";
- config = lib.mkIf config.nx.programs.obsidian.enable {
- home-manager.users."${username}" = {
- programs.obsidian = {
- enable = true;
- };
- };
- };
-}
diff --git a/modules/programs/opencode.nix b/modules/programs/opencode.nix
deleted file mode 100644
index 3ceb6fb..0000000
--- a/modules/programs/opencode.nix
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- config,
- username,
- lib,
- ...
-}:
-
-{
- options.nx.programs.opencode.enable = lib.mkEnableOption "Setup opencode";
- config = lib.mkIf config.nx.programs.opencode.enable {
- home-manager.users.${username}.programs.opencode = {
- enable = true;
- settings = {
- theme = "system";
- share = "disabled";
- autoupdate = false;
- };
- };
- };
-}
diff --git a/modules/programs/spicetify.nix b/modules/programs/spicetify.nix
deleted file mode 100644
index 0582f72..0000000
--- a/modules/programs/spicetify.nix
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- config,
- lib,
- pkgs,
- inputs,
- username,
- ...
-}:
-
-let
- spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.system};
-in
-{
- options.nx.programs.spicetify.enable = lib.mkEnableOption "Enable Spicetify integration";
- config = lib.mkIf config.nx.programs.spicetify.enable {
- home-manager.users.${username} = { ... }: {
- imports = [ inputs.spicetify-nix.homeManagerModules.spicetify ];
- nixpkgs.config.allowUnfree = true;
- programs.spicetify = {
- enable = true;
- enabledSnippets = with spicePkgs.snippets; [
- pointer
- sonicDancing
- modernScrollbar
- nyanCatProgressBar
- declutterNowPlayingBar
- ];
-
- enabledExtensions = with spicePkgs.extensions; [
- keyboardShortcut
- ];
-
- theme = spicePkgs.themes.sleek;
- colorScheme = "Coral";
- };
- };
- };
-}
diff --git a/modules/programs/tmux.nix b/modules/programs/tmux.nix
deleted file mode 100644
index 41d6e22..0000000
--- a/modules/programs/tmux.nix
+++ /dev/null
@@ -1,45 +0,0 @@
-{
- config,
- username,
- lib,
- ...
-}:
-
-{
- options.nx.programs.tmux.enable = lib.mkEnableOption "Enable and configure Tmux";
- config = lib.mkIf config.nx.programs.tmux.enable {
- home-manager.users.${username} = {
- programs.tmux = {
- enable = true;
- extraConfig = ''
- set -g default-terminal "xterm-256color"
-
- unbind C-b
- set-option -g prefix C-a
- bind-key C-a send-prefix
- bind -n M-Left select-pane -L
- bind -n M-Right select-pane -R
- bind -n M-Up select-pane -U
- bind -n M-Down select-pane -D
-
- # style
- set -g status-position top
- set -g status-justify absolute-centre
- set -g status-style 'fg=color7 bg=default'
- set -g status-right ""
- # set -g status-right ' #(cd #{pane_current_path}; git rev-parse --abbrev-ref HEAD)'
- # set -g status-right ""
- set -g status-left '#S'
- set -g status-left-style 'fg=color8'
- set -g status-right-length 0
- set -g status-left-length 100
- setw -g window-status-current-style 'fg=colour6 bg=default bold'
- setw -g window-status-current-format '#I:#W '
- setw -g window-status-style 'fg=color8'
-
- set -g mouse on
- '';
- };
- };
- };
-} \ No newline at end of file
diff --git a/modules/programs/typst.nix b/modules/programs/typst.nix
deleted file mode 100644
index 8af406b..0000000
--- a/modules/programs/typst.nix
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- config,
- username,
- pkgs,
- lib,
- ...
-}:
-
-{
- options.nx.programs.typst.enable = lib.mkEnableOption "Setup typst";
- config = lib.mkIf config.nx.programs.typst.enable {
- home-manager.users.${username} = {
- home.packages = with pkgs; [
- typst
- typst-fmt
- ];
- };
- };
-} \ No newline at end of file
diff --git a/modules/programs/vscode.nix b/modules/programs/vscode.nix
deleted file mode 100644
index beb347c..0000000
--- a/modules/programs/vscode.nix
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- config,
- username,
- lib,
- pkgs,
- ...
-}:
-
-{
- options.nx.programs.vscode.enable = lib.mkEnableOption "Enable vscode and setup";
- config = lib.mkIf config.nx.programs.vscode.enable {
- home-manager.users.${username} = {
- programs.vscode = {
- enable = true;
- mutableExtensionsDir = false;
- profiles.default = {
- enableUpdateCheck = true;
- enableExtensionUpdateCheck = true;
-
- userSettings = {
- "update.mode" = "none";
- "workbench.colorTheme" = "Minimal";
- "editor.fontFamily" = "monospace";
- "editor.tabSize" = 2;
- "editor.minimap.enabled" = false;
- "terminal.integrated.cursorStyle" = "underline";
- "terminal.integrated.cursorStyleInactive" = "underline";
- "terminal.integrated.fontFamily" = "monospace";
- "terminal.integrated.fontSize" = 13;
- "git.autofetch" = true;
- "window.controlsStyle" = "custom";
- };
-
- extensions = (
- with pkgs.vscode-extensions;
- [
- ms-vscode.cmake-tools
- ms-azuretools.vscode-docker
- github.copilot
- ms-python.python
- golang.go
- rust-lang.rust-analyzer
- vscjava.vscode-maven
- sumneko.lua
- #fwcd.kotlin
- bradlc.vscode-tailwindcss
- adpyke.codesnap
- esbenp.prettier-vscode
- ]
- ++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [
- {
- name = "minimalist-dark";
- publisher = "nichabosh";
- version = "1.0.0";
- sha256 = "sha256-lw+Scfada6DycLdRT2Cz+Fd12JucglIrw3uRd2ZhabQ=";
- }
- ]
- );
- };
- };
- };
- };
-} \ No newline at end of file
diff --git a/modules/programs/zathura.nix b/modules/programs/zathura.nix
deleted file mode 100644
index 35304a4..0000000
--- a/modules/programs/zathura.nix
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- config,
- username,
- lib,
- ...
-}:
-
-{
- options.nx.programs.zathura.enable = lib.mkEnableOption "Enable zathura and setup";
- config = lib.mkIf config.nx.programs.zathura.enable {
- home-manager.users.${username} = {
- programs.zathura = {
- enable = true;
- options = {
- recolor-lightcolor = "rgba(0, 0, 0, 0)";
- recolor-darkcolor = "rgba(255, 255, 255, 1)";
- recolor = true;
- adjust-open = "width";
- guioptions = "none";
- zoom-center = true;
- page-padding = 0;
- pages-per-row = 1;
- scroll-page-aware = true;
- };
-
- mappings = {
- i = "recolor";
- j = "navigate previous";
- k = "navigate next";
- };
- };
- };
- };
-} \ No newline at end of file
diff --git a/modules/programs/zed.nix b/modules/programs/zed.nix
deleted file mode 100644
index 305f5f3..0000000
--- a/modules/programs/zed.nix
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- config,
- lib,
- username,
- ...
-}:
-
-{
- options.nx.programs.zed-editor.enable = lib.mkEnableOption "Enable and setup zed editor";
- config = lib.mkIf config.nx.programs.zed-editor.enable {
- home-manager.users."${username}" = {
- programs.zed-editor = {
- enable = true;
- extensions = [
- "nix"
- ];
- userSettings = {
- telemetry = {
- metrics = false;
- };
- };
- };
- };
- };
-}
diff --git a/modules/programs/zsh.nix b/modules/programs/zsh.nix
deleted file mode 100644
index d3fa72e..0000000
--- a/modules/programs/zsh.nix
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- config,
- pkgs,
- lib,
- username,
- ...
-}:
-{
- options.nx.programs.zsh.enable = lib.mkEnableOption "Configure zsh";
- config = lib.mkIf config.nx.programs.zsh.enable {
- home-manager.users.${username} = {
- home.packages = with pkgs; [
- zoxide
- imagemagick
- ];
- programs.zsh = {
- enable = true;
- enableCompletion = true;
- autosuggestion.enable = true;
- syntaxHighlighting.enable = true;
- initContent = ''
- # view man pages with nvim
- export MANPAGER="nvim +Man!"
-
- # Directory completion with trailing slash
- zstyle ':completion:*' list-dirs-first true
- zstyle ':completion:*' special-dirs true
- zstyle ':completion:*' squeeze-slashes true
- zstyle ':completion:*' add-space false
-
- # Case-insensitive completion
- zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
- # vim keybindings
- bindkey -v
-
- # imagemagick wrapper function to remove background
- remove_bg() {
- if [[ $# -lt 2 ]]; then
- echo 'Usage: remove_bg <input_file> <fuzz_percentage> [transparent_color] [output_file]'
- return 1
- fi
- local input_file=$1
- local fuzz=$2
- local transparent_color=$3
- local output_file=$4
-
- magick "$input_file" \
- -fuzz $fuzz -transparent "$transparent_color" \
- -alpha on -channel A -blur 0x2 -level 5%,100% +channel \
- "$output_file"
-
- echo "Saved transparent image to: $output_file"
- }
-
- eval "$(zoxide init zsh)"
- '';
- shellAliases = {
- ls = "ls --color=auto";
- nixceck = "nix flake check --all-systems";
- };
- zplug = {
- enable = true;
- plugins = [
- { name = "mafredri/zsh-async"; }
- {
- name = "sindresorhus/pure";
- tags = [
- "as:theme"
- "use:pure.zsh"
- ];
- }
- { name = "zdharma-continuum/fast-syntax-highlighting"; }
- { name = "zsh-users/zsh-autosuggestions"; }
- ];
- };
- };
- };
- };
-}
diff --git a/modules/services/default.nix b/modules/services/default.nix
deleted file mode 100644
index 85a5d80..0000000
--- a/modules/services/default.nix
+++ /dev/null
@@ -1,14 +0,0 @@
-{ ... }:
-
-{
- imports = [
- ./printer.nix
- ./polkit.nix
- ./pipewire.nix
- ./mullvad.nix
- ./nextcloud-client.nix
- ./wooting.nix
- ./openssh.nix
- ./keyring.nix
- ];
-}
diff --git a/modules/services/keyring.nix b/modules/services/keyring.nix
deleted file mode 100644
index c08ca1e..0000000
--- a/modules/services/keyring.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- config,
- lib,
- ...
-}:
-
-{
- options.nx.services.keyring.enable = lib.mkEnableOption "Enable keyring service";
-
- config = lib.mkIf config.nx.services.keyring.enable {
- security.pam.services.login.enableKwallet = lib.mkIf config.nx.desktop.kde.enable true;
-
- # default keyring to use
- services.gnome.gnome-keyring.enable = lib.mkIf (!config.nx.desktop.kde.enable) true;
- };
-}
diff --git a/modules/services/mullvad.nix b/modules/services/mullvad.nix
deleted file mode 100644
index 0d486be..0000000
--- a/modules/services/mullvad.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- config,
- lib,
- pkgs,
- ...
-}:
-
-{
- options.nx.services.mullvad.enable = lib.mkEnableOption "Enable and setup mullvad";
- config = lib.mkIf config.nx.services.mullvad.enable {
- services.mullvad-vpn = {
- enable = true;
- package = pkgs.mullvad-vpn;
- };
- };
-}
diff --git a/modules/services/nextcloud-client.nix b/modules/services/nextcloud-client.nix
deleted file mode 100644
index 8bf7b1e..0000000
--- a/modules/services/nextcloud-client.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- config,
- lib,
- pkgs,
- username,
- ...
-}:
-
-{
- options.nx.services.nextcloud-client.enable =
- lib.mkEnableOption "Enable and setup nextcloud-client";
- config = lib.mkIf config.nx.services.nextcloud-client.enable {
- nx.services.keyring.enable = true;
- home-manager.users."${username}" = {
- home.packages = with pkgs; [ nextcloud-client ];
- services.nextcloud-client = {
- enable = true;
- startInBackground = true;
- };
- };
- };
-}
diff --git a/modules/services/openssh.nix b/modules/services/openssh.nix
deleted file mode 100644
index c6a73cb..0000000
--- a/modules/services/openssh.nix
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- config,
- username,
- lib,
- ...
-}:
-{
- options.nx.services.openssh.enable = lib.mkEnableOption "Enable openssh service";
- config = lib.mkIf config.nx.services.openssh.enable {
- services.openssh = {
- enable = true;
- settings = {
- AllowUsers = [ username ];
- };
- };
- };
-}
diff --git a/modules/services/pipewire.nix b/modules/services/pipewire.nix
deleted file mode 100644
index 12b1ae2..0000000
--- a/modules/services/pipewire.nix
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- config,
- lib,
- ...
-}:
-
-{
- options.nx.services.pipewire.enable = lib.mkEnableOption "Enable pipewire for audio";
- config = lib.mkIf config.nx.services.pipewire.enable {
- security.rtkit.enable = true;
- services.pipewire = {
- enable = true;
- alsa.enable = true;
- alsa.support32Bit = true;
- pulse.enable = true;
- wireplumber.enable = true;
- };
- };
-}
diff --git a/modules/services/polkit.nix b/modules/services/polkit.nix
deleted file mode 100644
index abd050f..0000000
--- a/modules/services/polkit.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- config,
- pkgs,
- lib,
- ...
-}:
-{
- options.nx.services.polkit.enable = lib.mkEnableOption "Enable and setup polkit service";
- config = lib.mkIf config.nx.services.polkit.enable {
- environment.systemPackages = with pkgs; [
- polkit
- polkit_gnome
- ];
- security.polkit.enable = true;
- systemd.user.services.polkit-gnome-authentication-agent-1 = {
- description = "polkit-gnome-authentication-agent-1";
- wantedBy = [ "graphical-session.target" ];
- wants = [ "graphical-session.target" ];
- after = [ "graphical-session.target" ];
- serviceConfig = {
- Type = "simple";
- ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
- Restart = "on-failure";
- RestartSec = 1;
- TimeoutStopSec = 10;
- };
- };
- };
-}
diff --git a/modules/services/printer.nix b/modules/services/printer.nix
deleted file mode 100644
index 0f6d82b..0000000
--- a/modules/services/printer.nix
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- config,
- pkgs,
- lib,
- ...
-}:
-{
- options.nx.services.printer.enable = lib.mkEnableOption "Enable printer service";
- config = lib.mkIf config.nx.services.printer.enable {
- services.printing = {
- enable = true;
- drivers = [ pkgs.brlaser ];
- };
- # printer autodiscovery
- services.avahi = {
- enable = true;
- nssmdns4 = true;
- openFirewall = true;
- };
- };
-}
diff --git a/modules/services/wooting.nix b/modules/services/wooting.nix
deleted file mode 100644
index 6cab0b1..0000000
--- a/modules/services/wooting.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- config,
- lib,
- pkgs,
- ...
-}:
-
-{
- options.nx.services.wooting.enable = lib.mkEnableOption "Wootility service";
- config = lib.mkIf config.nx.services.wooting.enable {
- services.udev.packages = [ pkgs.wooting-udev-rules ];
- environment.systemPackages = with pkgs; [
- wootility
- ];
- };
-}
diff --git a/modules/system/default.nix b/modules/system/default.nix
deleted file mode 100644
index a3e0fcd..0000000
--- a/modules/system/default.nix
+++ /dev/null
@@ -1,10 +0,0 @@
-{ ... }:
-
-{
- imports = [
- ./localisation.nix
- ./network.nix
- ./nix-options.nix
- ./users.nix
- ];
-}
diff --git a/modules/system/nix-options.nix b/modules/system/nix-options.nix
deleted file mode 100644
index fbbed29..0000000
--- a/modules/system/nix-options.nix
+++ /dev/null
@@ -1,18 +0,0 @@
-{ ... }:
-
-{
- nix = {
- settings = {
- experimental-features = [
- "nix-command"
- "flakes"
- ];
- auto-optimise-store = true;
- };
- gc = {
- automatic = true;
- dates = "daily";
- options = "--delete-older-than 15d";
- };
- };
-}
diff --git a/modules/users/browsers/default.nix b/modules/users/browsers/default.nix
new file mode 100644
index 0000000..70a8be5
--- /dev/null
+++ b/modules/users/browsers/default.nix
@@ -0,0 +1,6 @@
+{ ... }:
+{
+ imports = [
+ ./firefox
+ ];
+}
diff --git a/modules/users/browsers/firefox/default.nix b/modules/users/browsers/firefox/default.nix
new file mode 100644
index 0000000..b5212a2
--- /dev/null
+++ b/modules/users/browsers/firefox/default.nix
@@ -0,0 +1,276 @@
+{
+ pkgs,
+ inputs,
+ config,
+ lib,
+ ...
+}:
+let
+
+ cfg = config.nx.browsers.firefox;
+ inherit (lib)
+ mkOption
+ types
+ mkIf
+ optionalString
+ optionalAttrs
+ ;
+in
+{
+
+ options.nx.browsers.firefox = {
+ enable = mkOption {
+ description = "mozilla firefox";
+ type = types.bool;
+ default = false;
+ };
+ blockGoogle = mkOption {
+ description = "blocks google banner and other";
+ type = types.bool;
+ default = true;
+ };
+ transparent = mkOption {
+ description = "make firefox transparent";
+ type = types.bool;
+ default = false;
+ };
+ cleanHome = mkOption {
+ description = "clean up firefox home";
+ type = types.bool;
+ default = true;
+ };
+ hideRecommendations = mkOption {
+ description = "hide firefox recommendations";
+ type = types.bool;
+ default = true;
+ };
+ disablePasswordManager = mkOption {
+ description = "disable built-in browser password manager";
+ type = types.bool;
+ default = true;
+ };
+ };
+
+ config = mkIf cfg.enable {
+ programs.firefox = {
+ enable = true;
+ profiles.default = {
+ extensions = {
+ packages = with inputs.firefox-addons.packages.${pkgs.system}; [
+ ublock-origin
+ istilldontcareaboutcookies
+ sponsorblock
+ decentraleyes
+ vimium-c
+ ];
+
+ force = true;
+
+ settings."uBlock0@raymondhill.net".settings = {
+ UserMessaging = {
+ uiTheme = "dark";
+ uiAccentCustom = true;
+ uiAccentCustom0 = "#2C2C2C";
+ cloudStorageEnabled = false;
+ contextMenuEnabled = false;
+ };
+ # Block annoying login with google banner
+ userFilters = optionalString cfg.blockGoogle ''
+ ||accounts.google.com/gsi/*
+ '';
+ };
+ };
+
+ search = {
+ default = "DuckDuckGo";
+ engines = {
+ nix-packages = {
+ name = "Nix Packages";
+ urls = [
+ {
+ template = "https://search.nixos.org/packages";
+ params = [
+ {
+ name = "type";
+ value = "packages";
+ }
+ {
+ name = "query";
+ value = "{searchTerms}";
+ }
+ ];
+ }
+ ];
+
+ icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+ definedAliases = [ "@np" ];
+ };
+
+ nixos-wiki = {
+ name = "NixOS Wiki";
+ urls = [ { template = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; } ];
+ iconMapObj."16" = "https://wiki.nixos.org/favicon.ico";
+ definedAliases = [ "@nw" ];
+ };
+
+ bing.metaData.hidden = true;
+ google.metaData.alias = "@g";
+ };
+ force = true;
+ };
+
+ userChrome = optionalString cfg.transparent ''
+ /* Hide Back, Forward, Reload, Stop, All Tabs, Firefox View buttons */
+ #back-button,
+ #forward-button,
+ #reload-button,
+ #stop-button,
+ #alltabs-button,
+ #firefox-view-button {
+ display: none !important;
+ }
+
+ .titlebar-buttonbox-container {
+ display: none;
+ }
+
+ #tabbrowser-tabs {
+ border-inline: none !important;
+ }
+
+ /* Transparent background tabs (above url bar) */
+ #navigator-toolbox {
+ -moz-appearance: -moz-vibrant-titlebar !important;
+ background: rgba(0, 0, 0, 0.8) !important;
+ }
+
+ /* Transparent background (behind url bar) */
+ #nav-bar {
+ background: none !important;
+ box-shadow: none !important;
+ border-top: 0px !important;
+ }
+
+ .tab-background[selected="true"] {
+ background-color: #393e43 !important;
+ background-image: none !important;
+ }
+
+ .tab-background {
+ background-color: var(--background) !important;
+ color: var(--foreground) !important;
+ box-shadow: none !important;;
+ }
+
+ .tab-background[selected] {
+ background-color: rgba(0, 0, 0, 0.30) !important;
+ color: var(--foreground) !important;
+ box-shadow: none !important;
+ }
+
+ /* Needed for transparency in general */
+ :root {
+ --tabpanel-background-color: transparent !important;
+ --chrome-content-separator-color: transparent !important;
+ --toolbar-bgcolor: rgba(0, 0, 0, 0.9) !important;
+ --newtab-background-color: rgba(0, 0, 0, 0.9) !important;
+ --newtab-background-color-secondary: transparent !important;
+ --toolbar-field-background-color: rgba(120, 120, 120, 0.10) !important;
+ }
+ '';
+ userContent = optionalString cfg.transparent ''
+ @-moz-document url-prefix("about:"), url("about:home") {
+ /* Transparent about:settings about:config about:policies */
+ :root {
+ background: rgba(0, 0, 0, 0.0) !important;
+ }
+ }
+
+ /* Transparent about:home */
+ * {
+ --newtab-background-color: transparent !important;
+ --newtab-background-color-secondary: transparent !important;
+ }
+
+ /* Transparent elements in about:* */
+ * {
+ --in-content-page-background: transparent !important;
+ --background-color-box: rgba(0, 0, 0, 0.5) !important;
+ }
+ '';
+ };
+
+ policies = {
+ DisableTelemetry = true;
+ DisableFirefoxStudies = true;
+ PasswordManagerEnabled = !cfg.disablePasswordManager;
+ OfferToSaveLogins = !cfg.disablePasswordManager;
+ DisplayBookmarksToolbar = "never";
+ NoDefaultBookmarks = true;
+
+ Homepage = optionalAttrs cfg.cleanHome {
+ URL = "about:blank";
+ Locked = true;
+ StartPage = "homepage";
+ };
+
+ NewTabPage = !cfg.cleanHome;
+
+ PictureInPicture = {
+ Enabled = false;
+ };
+
+ EnableTrackingProtection = {
+ Value = true;
+ Locked = true;
+ Cryptomining = true;
+ Fingerprinting = true;
+ };
+
+ EncryptedMediaExtensions = {
+ Enabled = true;
+ Locked = true;
+ };
+
+ FirefoxHome = {
+ Search = true;
+ TopSites = true;
+ SponsoredTopSites = !cfg.cleanHome;
+ Highlights = true;
+ Pocket = !cfg.cleanHome;
+ SponsoredPocket = !cfg.cleanHome;
+ Locked = true;
+ };
+
+ UserMessaging = {
+ ExtensionRecommendations = !cfg.hideRecommendations;
+ FeatureRecommendations = !cfg.hideRecommendations;
+ Locked = true;
+ MoreFromMozilla = !cfg.hideRecommendations;
+ SkipOnboarding = true;
+ UrlbarInterventions = !cfg.hideRecommendations;
+ };
+
+ Preferences = {
+ # Disable fullscreen notification
+ "full-screen-api.warning.timeout" = "0";
+
+ # Disable annoying translation popup
+ "browser.translations.automaticallyPopup" = false;
+
+ # Enable all extensions automatically
+ "extensions.autoDisableScopes" = 0;
+
+ # Hide ctr-tab tab preview menu
+ "browser.ctrlTab.sortByRecentlyUsed" = false;
+ }
+ // optionalAttrs cfg.transparent {
+ # transparency
+ "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
+ "browser.tabs.allow_transparent_browser" = true;
+ "gfx.webrender.all" = true;
+ };
+ };
+ };
+ };
+}
diff --git a/modules/users/cli/default.nix b/modules/users/cli/default.nix
new file mode 100644
index 0000000..98fe1fb
--- /dev/null
+++ b/modules/users/cli/default.nix
@@ -0,0 +1,7 @@
+{ ... }:
+{
+ imports = [
+ ./tmux
+ ./opencode
+ ];
+}
diff --git a/modules/users/cli/opencode/default.nix b/modules/users/cli/opencode/default.nix
new file mode 100644
index 0000000..8c1071d
--- /dev/null
+++ b/modules/users/cli/opencode/default.nix
@@ -0,0 +1,30 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.cli.opencode;
+ inherit (lib) mkOption types mkIf;
+in
+{
+
+ options.nx.cli.opencode = {
+ enable = mkOption {
+ description = "opencode open source ai coding agent";
+ type = types.bool;
+ default = false;
+ };
+ };
+
+ config = mkIf cfg.enable {
+ programs.opencode = {
+ enable = true;
+ settings = {
+ theme = "system";
+ share = "disabled";
+ autoupdate = false;
+ };
+ };
+ };
+}
diff --git a/modules/users/cli/tmux/default.nix b/modules/users/cli/tmux/default.nix
new file mode 100644
index 0000000..9259c0b
--- /dev/null
+++ b/modules/users/cli/tmux/default.nix
@@ -0,0 +1,55 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+let
+ inherit (lib) mkOption types mkIf;
+ cfg = config.nx.tmux;
+
+in
+{
+ options.nx.tmux = {
+ enable = mkOption {
+ description = "tmux";
+ type = types.bool;
+ default = config.nx.terminal.multiplexer == "tmux";
+ };
+ };
+ config = mkIf cfg.enable {
+ programs.tmux = {
+ enable = true;
+ keyMode = "vi";
+ secureSocket = true;
+ shell = "${pkgs.${config.nx.terminal.defaultShell}}/bin/${config.nx.terminal.defaultShell}";
+ terminal = "xterm-256color";
+ extraConfig = ''
+ unbind C-b
+ set-option -g prefix C-a
+ bind-key C-a send-prefix
+ bind -n M-Left select-pane -L
+ bind -n M-Right select-pane -R
+ bind -n M-Up select-pane -U
+ bind -n M-Down select-pane -D
+
+ # style
+ set -g status-position top
+ set -g status-justify absolute-centre
+ set -g status-style 'fg=color7 bg=default'
+ set -g status-right ""
+ # set -g status-right ' #(cd #{pane_current_path}; git rev-parse --abbrev-ref HEAD)'
+ # set -g status-right ""
+ set -g status-left '#S'
+ set -g status-left-style 'fg=color8'
+ set -g status-right-length 0
+ set -g status-left-length 100
+ setw -g window-status-current-style 'fg=colour6 bg=default bold'
+ setw -g window-status-current-format '#I:#W '
+ setw -g window-status-style 'fg=color8'
+
+ set -g mouse on
+ '';
+ };
+ };
+}
diff --git a/modules/users/default.nix b/modules/users/default.nix
new file mode 100644
index 0000000..06999d5
--- /dev/null
+++ b/modules/users/default.nix
@@ -0,0 +1,16 @@
+{ ... }:
+
+{
+ imports = [
+ ./browsers
+ ./cli
+ ./editors
+ ./git
+ ./gpg
+ ./media
+ ./productivity
+ ./shells
+ ./terminal
+ ./zathura
+ ];
+}
diff --git a/modules/users/editors/default.nix b/modules/users/editors/default.nix
new file mode 100644
index 0000000..76f3b96
--- /dev/null
+++ b/modules/users/editors/default.nix
@@ -0,0 +1,8 @@
+{ ... }:
+{
+ imports = [
+ ./neovim
+ ./vscode
+ ./zed
+ ];
+}
diff --git a/modules/users/editors/neovim/default.nix b/modules/users/editors/neovim/default.nix
new file mode 100644
index 0000000..975fae8
--- /dev/null
+++ b/modules/users/editors/neovim/default.nix
@@ -0,0 +1,109 @@
+{
+ config,
+ username,
+ lib,
+ pkgs,
+ ...
+}:
+
+let
+ inherit (lib)
+ mkOption
+ types
+ mkIf
+ optionals
+ ;
+ cfg = config.nx.editors.neovim;
+in
+{
+ options.nx.editors.neovim = {
+ enable = mkOption {
+ description = "Neovim editor";
+ type = types.bool;
+ default = true;
+ };
+
+ langs = {
+ python = mkOption {
+ description = "enable the python integration";
+ type = types.bool;
+ default = false;
+ };
+ go = mkOption {
+ description = "enable go integration";
+ type = types.bool;
+ default = false;
+ };
+ ts = mkOption {
+ description = "enable the js/ts integration";
+ type = types.bool;
+ default = false;
+ };
+ java = mkOption {
+ description = "enable the java integration";
+ type = types.bool;
+ default = false;
+ };
+ nix = mkOption {
+ description = "enable the nix integration";
+ type = types.bool;
+ default = true;
+ };
+ latex = mkOption {
+ description = "enable latex integration";
+ type = types.bool;
+ default = false;
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ programs.neovim = {
+ defaultEditor = true;
+ enable = true;
+ package = pkgs.neovim-unwrapped;
+ extraPackages =
+ with pkgs;
+ [
+ tree-sitter
+ git
+ ripgrep
+ fd
+ gcc
+ ]
+ ++ (optionals cfg.langs.ts [ pkgs.nodePackages.typescript-language-server ])
+ ++ (optionals cfg.langs.python [ ])
+ ++ (optionals cfg.langs.go [ pkgs.gopls ])
+ ++ (optionals cfg.langs.java [ pkgs.jdt-language-server ])
+ ++ (optionals cfg.langs.nix [
+ pkgs.nil
+ pkgs.nixfmt-rfc-style
+ ])
+ ++ (optionals cfg.langs.latex [ pkgs.texlab ]);
+
+ plugins = with pkgs.vimPlugins; [
+ gruvbox-nvim
+ mini-starter
+ gitsigns-nvim
+ nvim-autopairs
+ telescope-nvim
+ fidget-nvim
+ plenary-nvim
+ nvim-treesitter.withAllGrammars
+ nvim-lspconfig
+ nvim-cmp
+ cmp-nvim-lsp
+ cmp-buffer
+ cmp-path
+ cmp-cmdline
+ luasnip
+ cmp_luasnip
+ lspkind-nvim
+ ];
+
+ extraConfig = ''
+ luafile ${./init.lua}
+ '';
+ };
+ };
+}
diff --git a/modules/programs/neovim/init.lua b/modules/users/editors/neovim/init.lua
index 79c49a5..1d2bdbb 100644
--- a/modules/programs/neovim/init.lua
+++ b/modules/users/editors/neovim/init.lua
@@ -20,32 +20,53 @@ map('n', '<leader>o', '<CMD>update<BAR>source %<CR>', { desc = 'Save & reload in
map('n', '<leader>w', '<CMD>write<CR>')
map('n', '<leader>q', '<CMD>quit<CR>')
-vim.pack.add({
- { src = "https://github.com/ellisonleao/gruvbox.nvim" },
- { src = "https://github.com/echasnovski/mini.starter" },
- { src = "https://github.com/lewis6991/gitsigns.nvim" },
- { src = "https://github.com/windwp/nvim-autopairs" },
- { src = "https://github.com/nvim-telescope/telescope.nvim" },
- { src = "https://github.com/j-hui/fidget.nvim" },
- { src = "https://github.com/nvim-lua/plenary.nvim" },
- { src = "https://github.com/nvim-treesitter/nvim-treesitter" },
- { src = "https://github.com/neovim/nvim-lspconfig" },
- { src = "https://github.com/hrsh7th/nvim-cmp" },
- { src = "https://github.com/hrsh7th/cmp-nvim-lsp" },
- { src = "https://github.com/hrsh7th/cmp-buffer" },
- { src = "https://github.com/hrsh7th/cmp-path" },
- { src = "https://github.com/hrsh7th/cmp-cmdline" },
- { src = "https://github.com/L3MON4D3/LuaSnip" },
- { src = "https://github.com/saadparwaiz1/cmp_luasnip" },
- { src = "https://github.com/onsails/lspkind-nvim" }
-})
-require("nvim-treesitter.configs").setup({
- ensure_installed = { "lua", "nix" },
- highlight = { enable = true },
+require("mini.starter").setup({
+ header = table.concat({
+ " /l、 ",
+ "(゚、 。 7 ",
+ " l ~ ヽ ",
+ " じしf_,)ノ ",
+ }, "\n"),
+ footer = "",
+ content_hooks = {
+ require("mini.starter").gen_hook.adding_bullet("» "),
+ require("mini.starter").gen_hook.aligning("center", "center"),
+ },
})
+require("gitsigns").setup()
+require("nvim-autopairs").setup()
+require("fidget").setup()
+
+vim.cmd("colorscheme gruvbox")
+
+local hl = vim.api.nvim_set_hl
+hl(0, 'Normal', { bg = 'none' })
+hl(0, 'NormalFloat', { bg = 'none' })
+hl(0, 'NormalNC', { bg = 'none' })
+hl(0, 'StatusLine', { bg = 'none' })
+hl(0, 'SignColumn', { bg = 'none' })
+hl(0, "DiagnosticError", { bg = "none" })
+hl(0, "DiagnosticSignError", { bg = "none" })
+hl(0, "DiagnosticSignHint", { bg = "none" })
+hl(0, "DiagnosticSignInfo", { bg = "none" })
+hl(0, "DiagnosticSignWarn", { bg = "none" })
+
+hl(0, "Pmenu", { bg = "none" })
+hl(0, "PmenuSel", { bg = "none" })
+hl(0, "FloatBorder", { bg = "none" })
+
+local status_ok, configs = pcall(require, "nvim-treesitter.configs")
+if status_ok then
+ configs.setup({
+ highlight = { enable = true },
+ indent = { enable = true },
+ })
+end
+
local builtin = require('telescope.builtin')
+local map = vim.keymap.set
map('n', '<leader>ff', builtin.find_files, { desc = 'Telescope find files' })
map('n', '<leader>fg', builtin.live_grep, { desc = 'Telescope live grep' })
map('n', '<leader>fb', builtin.buffers, { desc = 'Telescope buffers' })
@@ -155,51 +176,15 @@ local servers = {
ts_ls = {},
}
-local server_names = {}
+
+local lspconfig = require('lspconfig')
for server, config in pairs(servers) do
config.capabilities = capabilities
- vim.lsp.config(server, config)
- table.insert(server_names, server)
+ lspconfig[server].setup(config)
end
-vim.lsp.enable(server_names)
-
vim.diagnostic.config({
virtual_text = { source = "if_many" },
underline = true,
severity_sort = true,
})
-
-
-require("mini.starter").setup({
- header = table.concat({
- " /l、 ",
- "(゚、 。 7 ",
- " l ~ ヽ ",
- " じしf_,)ノ ",
- }, "\n"),
- footer = "",
- content_hooks = {
- require("mini.starter").gen_hook.adding_bullet("» "),
- require("mini.starter").gen_hook.aligning("center", "center"),
- },
-})
-
-
-require("gitsigns").setup()
-require("nvim-autopairs").setup()
-require("fidget").setup()
-
-vim.cmd("colorscheme gruvbox")
-
-local hl = vim.api.nvim_set_hl
-hl(0, 'Normal', { bg = 'none' })
-hl(0, 'NormalFloat', { bg = 'none' })
-hl(0, 'NormalNC', { bg = 'none' })
-hl(0, 'StatusLine', { bg = 'none' })
-hl(0, 'SignColumn', { bg = 'none' })
-hl(0, "DiagnosticError", { bg = "none" })
-hl(0, "DiagnosticSignError", { bg = "none" })
-hl(0, "DiagnosticSignHint", { bg = "none" })
-hl(0, "DiagnosticSignInfo", { bg = "none" })
-hl(0, "DiagnosticSignWarn", { bg = "none" })
diff --git a/modules/users/editors/vscode/default.nix b/modules/users/editors/vscode/default.nix
new file mode 100644
index 0000000..fe2c444
--- /dev/null
+++ b/modules/users/editors/vscode/default.nix
@@ -0,0 +1,142 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+let
+ inherit (lib)
+ mkOption
+ types
+ mkIf
+ optionals
+ ;
+ cfg = config.nx.editors.vscode;
+in
+{
+ options.nx.editors.vscode = {
+ enable = mkOption {
+ description = "vscode editor";
+ type = types.bool;
+ default = false;
+ };
+
+ useVSCodium = mkOption {
+ description = "Use vscodium instead of vscode";
+ type = types.bool;
+ default = false;
+ };
+
+ theme = mkOption {
+ description = "Theme to use for vscode";
+ type = types.enum [
+ "minimal"
+ "dark"
+ "light"
+ ];
+ default = "minimal";
+ };
+
+ langs = {
+ cmake = mkOption {
+ description = "enable cmake integration";
+ type = types.bool;
+ default = false;
+ };
+ docker = mkOption {
+ description = "enable docker integration";
+ type = types.bool;
+ default = false;
+ };
+ python = mkOption {
+ description = "enable python integration";
+ type = types.bool;
+ default = false;
+ };
+ go = mkOption {
+ description = "enable go integration";
+ type = types.bool;
+ default = false;
+ };
+ rust = mkOption {
+ description = "enable rust integration";
+ type = types.bool;
+ default = false;
+ };
+ java = mkOption {
+ description = "enable java integration";
+ type = types.bool;
+ default = false;
+ };
+ lua = mkOption {
+ description = "enable lua integration";
+ type = types.bool;
+ default = false;
+ };
+ tailwindcss = mkOption {
+ description = "enable tailwindcss integration";
+ type = types.bool;
+ default = false;
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ programs.vscode = {
+ enable = true;
+ package = if cfg.useVSCodium then pkgs.vscodium else pkgs.vscode;
+ mutableExtensionsDir = false;
+ profiles.default = {
+ enableUpdateCheck = true;
+ enableExtensionUpdateCheck = true;
+
+ userSettings = {
+ "update.mode" = "none";
+ "workbench.colorTheme" =
+ if cfg.theme == "minimal" then
+ "Minimal"
+ else if cfg.theme == "dark" then
+ "Default Dark Modern"
+ else
+ "Default Light Modern";
+ "editor.fontFamily" = "monospace";
+ "editor.tabSize" = 2;
+ "editor.minimap.enabled" = false;
+ "terminal.integrated.cursorStyle" = "underline";
+ "terminal.integrated.cursorStyleInactive" = "underline";
+ "terminal.integrated.fontFamily" = "monospace";
+ "terminal.integrated.fontSize" = 13;
+ "git.autofetch" = true;
+ "window.controlsStyle" = "custom";
+ };
+
+ extensions =
+ with pkgs.vscode-extensions;
+ [
+ github.copilot
+ adpyke.codesnap
+ esbenp.prettier-vscode
+ ]
+ ++ (optionals cfg.langs.cmake [ ms-vscode.cmake-tools ])
+ ++ (optionals cfg.langs.docker [ ms-azuretools.vscode-docker ])
+ ++ (optionals cfg.langs.python [ ms-python.python ])
+ ++ (optionals cfg.langs.go [ golang.go ])
+ ++ (optionals cfg.langs.rust [ rust-lang.rust-analyzer ])
+ ++ (optionals cfg.langs.java [ vscjava.vscode-maven ])
+ ++ (optionals cfg.langs.lua [ sumneko.lua ])
+ ++ (optionals cfg.langs.tailwindcss [ bradlc.vscode-tailwindcss ])
+ ++ (optionals (cfg.theme == "minimal") (
+ pkgs.vscode-utils.extensionsFromVscodeMarketplace [
+ {
+ name = "minimalist-dark";
+ publisher = "nichabosh";
+ version = "1.0.0";
+ sha256 = "sha256-lw+Scfada6DycLdRT2Cz+Fd12JucglIrw3uRd2ZhabQ=";
+ }
+ ]
+ ));
+ };
+ };
+ };
+}
diff --git a/modules/users/editors/zed/default.nix b/modules/users/editors/zed/default.nix
new file mode 100644
index 0000000..5ff0714
--- /dev/null
+++ b/modules/users/editors/zed/default.nix
@@ -0,0 +1,94 @@
+{
+ config,
+ lib,
+ ...
+}:
+
+let
+ inherit (lib)
+ mkOption
+ types
+ mkIf
+ optionals
+ ;
+ cfg = config.nx.editors.zed-editor;
+in
+{
+ options.nx.editors.zed-editor = {
+ enable = mkOption {
+ description = "Enable and setup zed editor";
+ type = types.bool;
+ default = false;
+ };
+
+ langs = {
+ nix = mkOption {
+ description = "enable nix integration";
+ type = types.bool;
+ default = true;
+ };
+ python = mkOption {
+ description = "enable python integration";
+ type = types.bool;
+ default = false;
+ };
+ rust = mkOption {
+ description = "enable rust integration";
+ type = types.bool;
+ default = false;
+ };
+ go = mkOption {
+ description = "enable go integration";
+ type = types.bool;
+ default = false;
+ };
+ lua = mkOption {
+ description = "enable lua integration";
+ type = types.bool;
+ default = false;
+ };
+ docker = mkOption {
+ description = "enable docker integration";
+ type = types.bool;
+ default = false;
+ };
+ java = mkOption {
+ description = "enable java integration";
+ type = types.bool;
+ default = false;
+ };
+ cmake = mkOption {
+ description = "enable cmake integration";
+ type = types.bool;
+ default = false;
+ };
+ toml = mkOption {
+ description = "enable toml integration";
+ type = types.bool;
+ default = false;
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ programs.zed-editor = {
+ enable = true;
+ extensions =
+ [ ]
+ ++ (optionals cfg.langs.nix [ "nix" ])
+ ++ (optionals cfg.langs.python [ "python" ])
+ ++ (optionals cfg.langs.rust [ "rust" ])
+ ++ (optionals cfg.langs.go [ "go" ])
+ ++ (optionals cfg.langs.lua [ "lua" ])
+ ++ (optionals cfg.langs.docker [ "dockerfile" ])
+ ++ (optionals cfg.langs.java [ "java" ])
+ ++ (optionals cfg.langs.cmake [ "cmake" ])
+ ++ (optionals cfg.langs.toml [ "toml" ]);
+ userSettings = {
+ telemetry = {
+ metrics = false;
+ };
+ };
+ };
+ };
+}
diff --git a/modules/users/git/default.nix b/modules/users/git/default.nix
new file mode 100644
index 0000000..f1f555e
--- /dev/null
+++ b/modules/users/git/default.nix
@@ -0,0 +1,81 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.git;
+ inherit (lib) mkOption mkIf types;
+in
+{
+ options.nx.git = {
+ enable = mkOption {
+ description = "Enable git";
+ type = types.bool;
+ default = false;
+ };
+
+ userName = mkOption {
+ description = "Git username";
+ type = types.str;
+ default = "Leander Scherer";
+ };
+
+ userEmail = mkOption {
+ description = "Git email";
+ type = types.str;
+ default = "leander@schererleander.de";
+ };
+
+ signKey = mkOption {
+ description = "Sign key";
+ type = types.nullOr types.str;
+ default = "A3502B180BC1D41A";
+ };
+
+ signFlavor = mkOption {
+ description = "Sign key flavor";
+ type = types.enum [
+ "ssh"
+ "openpgp"
+ ];
+ default = "openpgp";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ programs.git = {
+ enable = true;
+
+ signing = mkIf (cfg.signKey != null) {
+ key = cfg.signKey;
+ signByDefault = true;
+ };
+
+ ignores = [
+ "*~"
+ ".DS_Store"
+ ".direnv"
+ ".envrc"
+ ];
+
+ settings = {
+ user.name = cfg.userName;
+ user.email = cfg.userEmail;
+ help.autocorrect = 20;
+ alias = {
+ st = "status";
+ co = "checkout";
+ br = "branch";
+ };
+ pull.rebase = true;
+ gpg.format = cfg.signFlavor;
+ url."git@github.com:".insteadOf = "https://github.com";
+ };
+ };
+ programs.diff-highlight = {
+ enable = true;
+ enableGitIntegration = true;
+ };
+ };
+}
diff --git a/modules/users/gpg/default.nix b/modules/users/gpg/default.nix
new file mode 100644
index 0000000..d5714b0
--- /dev/null
+++ b/modules/users/gpg/default.nix
@@ -0,0 +1,62 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+let
+ inherit (lib)
+ mkOption
+ types
+ mkIf
+ ;
+ cfg = config.nx.gpg;
+in
+{
+
+ options.nx.gpg = {
+ enable = mkOption {
+ description = "GNU Privacy Guard";
+ type = types.bool;
+ default = config.nx.git.enable;
+ };
+
+ gpgKey = mkOption {
+ description = "default gpg key";
+ type = types.nullOr types.str;
+ default = "";
+ };
+
+ pinentry = mkOption {
+ description = "pinentry flavor";
+ type = types.enum [
+ "curses"
+ "gnome3"
+ "qt"
+ "mac"
+ ];
+ default = if pkgs.stdenv.isDarwin then "mac" else "curses";
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ programs.gpg = {
+ enable = true;
+ #settings.default-key = mkIf (cfg.gpgKey != null) cfg.gpgKey;
+ };
+
+ services.gpg-agent = {
+ enable = true;
+ pinentry.package =
+ if cfg.pinentry == "gnome3" then
+ pkgs.pinentry-gnome3
+ else if cfg.pinentry == "qt" then
+ pkgs.pinentry-qt
+ else if cfg.pinentry == "mac" then
+ pkgs.pinentry_mac
+ else
+ pkgs.pinentry-curses;
+ };
+ };
+}
diff --git a/modules/users/media/default.nix b/modules/users/media/default.nix
new file mode 100644
index 0000000..89daaba
--- /dev/null
+++ b/modules/users/media/default.nix
@@ -0,0 +1,7 @@
+{ ... }:
+{
+ imports = [
+ ./nixcord
+ ./spicetify
+ ];
+}
diff --git a/modules/users/media/nixcord/default.nix b/modules/users/media/nixcord/default.nix
new file mode 100644
index 0000000..329fa18
--- /dev/null
+++ b/modules/users/media/nixcord/default.nix
@@ -0,0 +1,42 @@
+{
+ config,
+ lib,
+ inputs,
+ ...
+}:
+let
+ cfg = config.nx.media.nixcord;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ imports = [ inputs.nixcord.homeModules.nixcord ];
+ options.nx.media.nixcord = {
+ enable = lib.mkOption {
+ description = "Enable nixcord and setup";
+ type = types.bool;
+ default = false;
+ };
+ frameless = mkOption {
+ description = "Make discord frameless";
+ type = types.bool;
+ default = true;
+ };
+ };
+ config = mkIf cfg.enable {
+ programs.nixcord = {
+ enable = true;
+ config = {
+ themeLinks = [
+ "https://refact0r.github.io/system24/theme/system24.theme.css"
+ ];
+ frameless = cfg.frameless;
+ plugins = {
+ alwaysAnimate.enable = false;
+ imageLink.enable = true;
+ imageZoom.enable = true;
+ translate.enable = true;
+ };
+ };
+ };
+ };
+}
diff --git a/modules/users/media/spicetify/default.nix b/modules/users/media/spicetify/default.nix
new file mode 100644
index 0000000..239f80f
--- /dev/null
+++ b/modules/users/media/spicetify/default.nix
@@ -0,0 +1,45 @@
+{
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+
+let
+ spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.system};
+ cfg = config.nx.media.spicetify;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ imports = [ inputs.spicetify-nix.homeManagerModules.spicetify ];
+
+ options.nx.media.spicetify = {
+ enable = mkOption {
+ description = "Command-line tool to customize the official Spotify client";
+ type = types.bool;
+ default = false;
+ };
+ };
+
+ config = mkIf cfg.enable {
+ nixpkgs.config.allowUnfree = true;
+ programs.spicetify = {
+ enable = true;
+ enabledSnippets = with spicePkgs.snippets; [
+ pointer
+ sonicDancing
+ modernScrollbar
+ nyanCatProgressBar
+ declutterNowPlayingBar
+ ];
+
+ enabledExtensions = with spicePkgs.extensions; [
+ keyboardShortcut
+ ];
+
+ theme = spicePkgs.themes.sleek;
+ colorScheme = "Coral";
+ };
+ };
+}
diff --git a/modules/users/productivity/anki/default.nix b/modules/users/productivity/anki/default.nix
new file mode 100644
index 0000000..efe4ab5
--- /dev/null
+++ b/modules/users/productivity/anki/default.nix
@@ -0,0 +1,30 @@
+{
+ config,
+ options,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.productivity.anki;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ options.nx.productivity.anki = {
+ enable = mkOption {
+ description = "Anki free and open-source flashcard program";
+ type = types.bool;
+ default = false;
+ };
+ };
+ config = mkIf cfg.enable {
+ # Marked as broken
+ #home-manager.users.${username}.programs.anki = {
+ #enable = true;
+ #style = "native";
+ #addons = with pkgs.ankiAddons; [
+ # anki-connect
+ # review-heatmap
+ #];
+ #};
+ };
+}
diff --git a/modules/users/productivity/default.nix b/modules/users/productivity/default.nix
new file mode 100644
index 0000000..9e05dde
--- /dev/null
+++ b/modules/users/productivity/default.nix
@@ -0,0 +1,10 @@
+{ ... }:
+{
+ imports = [
+ ./anki
+ ./latex
+ ./obsidian
+ ./typst
+ ./nextcloud-client
+ ];
+}
diff --git a/modules/users/productivity/latex/default.nix b/modules/users/productivity/latex/default.nix
new file mode 100644
index 0000000..0720664
--- /dev/null
+++ b/modules/users/productivity/latex/default.nix
@@ -0,0 +1,47 @@
+{
+ config,
+ options,
+ pkgs,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.productivity.latex;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ options.nx.productivity.latex = {
+ enable = mkOption {
+ description = "LaTeX typesetting system";
+ type = types.bool;
+ default = false;
+ };
+ };
+
+ config = mkIf cfg.enable {
+ programs.texlive = {
+ enable = true;
+ # See https://mynixos.com/search?q=texlivepackages.collection for more collections
+ # and https://mynixos.com/search?q=texlivepackages for more individual packages.
+ extraPackages = tpkgs: {
+ inherit (tpkgs)
+ collection-basic
+ collection-latex
+ collection-latexrecommended
+ biblatex
+ ;
+ };
+ };
+
+ home.packages = with pkgs; [
+ biber
+ ];
+
+ programs.pandoc = {
+ enable = true;
+ defaults = {
+ pdf-engine = "pdfetex";
+ };
+ };
+ };
+}
diff --git a/modules/users/productivity/nextcloud-client/default.nix b/modules/users/productivity/nextcloud-client/default.nix
new file mode 100644
index 0000000..1b92bb0
--- /dev/null
+++ b/modules/users/productivity/nextcloud-client/default.nix
@@ -0,0 +1,28 @@
+{
+ config,
+ lib,
+ pkgs,
+ username,
+ ...
+}:
+
+let
+ inherit (lib) mkOption types mkIf;
+ cfg = config.nx.productivity.nextcloud-client;
+in
+{
+ options.nx.productivity.nextcloud-client = {
+ enable = mkOption {
+ description = "Client for nextcloud";
+ type = types.bool;
+ default = false;
+ };
+ };
+ config = mkIf cfg.enable {
+ #home.packages = with pkgs; [ nextcloud-client ];
+ services.nextcloud-client = {
+ enable = true;
+ startInBackground = true;
+ };
+ };
+}
diff --git a/modules/users/productivity/obsidian/default.nix b/modules/users/productivity/obsidian/default.nix
new file mode 100644
index 0000000..21b3f34
--- /dev/null
+++ b/modules/users/productivity/obsidian/default.nix
@@ -0,0 +1,23 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.productivity.obsidian;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ options.nx.productivity.obsidian = {
+ enable = mkOption {
+ description = "Obsidian note-taking application";
+ type = types.bool;
+ default = false;
+ };
+ };
+ config = mkIf cfg.enable {
+ programs.obsidian = {
+ enable = true;
+ };
+ };
+}
diff --git a/modules/users/productivity/typst/default.nix b/modules/users/productivity/typst/default.nix
new file mode 100644
index 0000000..f3e1981
--- /dev/null
+++ b/modules/users/productivity/typst/default.nix
@@ -0,0 +1,25 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.productivity.typst;
+ inherit (lib) mkOption types mkIf;
+in
+{
+ options.nx.productivity.typst = {
+ enable = mkOption {
+ description = "Typst markup-based typesetting system";
+ type = types.bool;
+ default = false;
+ };
+ };
+ config = mkIf cfg.enable {
+ home.packages = with pkgs; [
+ typst
+ typst-fmt
+ ];
+ };
+}
diff --git a/modules/users/shells/default.nix b/modules/users/shells/default.nix
new file mode 100644
index 0000000..c3f96c7
--- /dev/null
+++ b/modules/users/shells/default.nix
@@ -0,0 +1,6 @@
+{ ... }:
+{
+ imports = [
+ ./zsh
+ ];
+}
diff --git a/modules/users/shells/zsh/default.nix b/modules/users/shells/zsh/default.nix
new file mode 100644
index 0000000..5a48cf0
--- /dev/null
+++ b/modules/users/shells/zsh/default.nix
@@ -0,0 +1,66 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+let
+ inherit (lib) mkOption mkIf types;
+ cfg = config.nx.shells.zsh;
+in
+{
+ options.nx.shells.zsh = {
+ enable = mkOption {
+ type = types.bool;
+ default = config.nx.terminal.defaultShell == "zsh";
+ };
+ };
+
+ config = mkIf cfg.enable {
+ home.packages = with pkgs; [
+ zoxide
+ ];
+
+ programs.zsh = {
+ enable = true;
+ enableCompletion = true;
+ autosuggestion.enable = true;
+ syntaxHighlighting.enable = true;
+ initContent = ''
+ # view man pages with nvim
+ export MANPAGER="nvim +Man!"
+
+ # Directory completion with trailing slash
+ zstyle ':completion:*' list-dirs-first true
+ zstyle ':completion:*' special-dirs true
+ zstyle ':completion:*' squeeze-slashes true
+ zstyle ':completion:*' add-space false
+
+ # Case-insensitive completion
+ zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'
+ # vim keybindings
+ bindkey -v
+ '';
+ shellAliases = {
+ ls = "ls --color=auto";
+ };
+
+ zplug = {
+ enable = true;
+ plugins = [
+ { name = "mafredri/zsh-async"; }
+ {
+ name = "sindresorhus/pure";
+ tags = [
+ "as:theme"
+ "use:pure.zsh"
+ ];
+ }
+ { name = "zdharma-continuum/fast-syntax-highlighting"; }
+ { name = "zsh-users/zsh-autosuggestions"; }
+ ];
+ };
+ };
+ };
+}
diff --git a/modules/users/terminal/default.nix b/modules/users/terminal/default.nix
new file mode 100644
index 0000000..4a9b254
--- /dev/null
+++ b/modules/users/terminal/default.nix
@@ -0,0 +1,36 @@
+{
+ pkgs,
+ config,
+ lib,
+ ...
+}:
+let
+ inherit (lib) mkOption types;
+ cfg = config.nx.terminal;
+in
+{
+ imports = [
+ ./foot.nix
+ ./kitty.nix
+ ];
+ options.nx.terminal = {
+ font = mkOption {
+ description = "default font";
+ default = "Victor Mono";
+ };
+
+ multiplexer = mkOption {
+ type = types.enum [ "tmux" ];
+ default = "tmux";
+ };
+
+ defaultShell = mkOption {
+ description = "default shell";
+ type = types.enum [
+ "bash"
+ "zsh"
+ ];
+ default = "zsh";
+ };
+ };
+}
diff --git a/modules/users/terminal/foot.nix b/modules/users/terminal/foot.nix
new file mode 100644
index 0000000..fbaba8f
--- /dev/null
+++ b/modules/users/terminal/foot.nix
@@ -0,0 +1,57 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+{
+ options.nx.terminal.foot.enable = lib.mkEnableOption "Enable foot terminal";
+ config = lib.mkIf config.nx.terminal.foot.enable {
+ home.packages = with pkgs; [
+ nerd-fonts.space-mono
+ ];
+
+ programs.foot = {
+ enable = true;
+ settings = {
+ main = {
+ pad = "10x10";
+ font = "SpaceMono Nerd Font Mono:size=10";
+ line-height = 12;
+ };
+
+ cursor = {
+ style = "underline";
+ unfocused-style = "unchanged";
+ blink = true;
+ };
+
+ colors = {
+ alpha = 0.9;
+ # Gruvbox Theme
+ background = "000000";
+ foreground = "ebdbb2";
+
+ regular0 = "282828";
+ regular1 = "cc241d";
+ regular2 = "98971a";
+ regular3 = "d79921";
+ regular4 = "458588";
+ regular5 = "b16286";
+ regular6 = "689d6a";
+ regular7 = "a89984";
+
+ bright0 = "928374";
+ bright1 = "fb4934";
+ bright2 = "b8bb26";
+ bright3 = "fabd2f";
+ bright4 = "83a598";
+ bright5 = "d3869b";
+ bright6 = "8ec07c";
+ bright7 = "ebdbb2";
+ };
+ };
+ };
+ };
+}
diff --git a/modules/users/terminal/kitty.nix b/modules/users/terminal/kitty.nix
new file mode 100644
index 0000000..02789cd
--- /dev/null
+++ b/modules/users/terminal/kitty.nix
@@ -0,0 +1,33 @@
+{
+ config,
+ lib,
+ ...
+}:
+
+{
+ options.nx.programs.kitty.enable = lib.mkEnableOption "Enable kitty";
+ config = lib.mkIf config.nx.programs.kitty.enable {
+ programs.kitty = {
+ enable = true;
+ shellIntegration.enableFishIntegration = true;
+ font = {
+ name = "monospace";
+ size = 11;
+ };
+ settings = {
+ cursor_shape = "underline";
+ cursor_blink_interval = "-1";
+ cursor_stop_blinking_after = "15.0";
+
+ background_opacity = "0.3";
+
+ enable_audio_bell = false;
+ bell_on_tab = false;
+
+ window_border_width = "0";
+ window_margin_width = "4";
+ window_padding_width = "5";
+ };
+ };
+ };
+}
diff --git a/modules/users/zathura/default.nix b/modules/users/zathura/default.nix
new file mode 100644
index 0000000..f07707c
--- /dev/null
+++ b/modules/users/zathura/default.nix
@@ -0,0 +1,41 @@
+{
+ config,
+ lib,
+ ...
+}:
+let
+ cfg = config.nx.programs.zathura;
+ inherit (lib) mkOption mkIf types;
+in
+{
+ options.nx.programs.zathura = {
+ enable = mkOption {
+ default = false;
+ description = "zathura document viewer";
+ type = types.bool;
+ };
+ };
+
+ config = mkIf cfg.enable {
+ programs.zathura = {
+ enable = true;
+ options = {
+ recolor-lightcolor = "rgba(0, 0, 0, 0)";
+ recolor-darkcolor = "rgba(255, 255, 255, 1)";
+ recolor = true;
+ adjust-open = "width";
+ guioptions = "none";
+ zoom-center = true;
+ page-padding = 0;
+ pages-per-row = 1;
+ scroll-page-aware = true;
+ };
+
+ mappings = {
+ i = "recolor";
+ j = "navigate previous";
+ k = "navigate next";
+ };
+ };
+ };
+}