Flake for my desktop, laptop, and my homelab.
0

Configure Feed

Select the types of activity you want to include in your feed.

dendritic migration 2026-05-05

Adam0 (May 5, 2026, 9:54 PM +0200) 67e5ca0b

+3079
+2
.envrc
··· 1 + #!/usr/bin/env bash 2 + use flake
+5
.gitignore
··· 1 + # keep-sorted start 2 + .direnv 3 + .rumdl_cache 4 + result* 5 + # keep-sorted end
+20
.sops.yaml
··· 1 + keys: 2 + - &users "": 3 + - &adam0 3666B440B0E872931B8E78596CFFE3FBA5DD84B9 4 + - &hosts "": 5 + # keep-sorted start 6 + - &desktop age1drzqscusazfcunmt4xkayc3340fpna2yl3eg5007euej05mu7fkswz4tqt 7 + - &laptop age1k25zg5u386wqlxf73gyr5f9d7c0q2hawyqrpdd22j94xt0y78s0sgjayuv 8 + - &vm age18xgnqqn70msl9wzqpnlwjpupwtkzzyxq65tvpsr7zzpkq7av6fjs2hz79d 9 + # keep-sorted end 10 + creation_rules: 11 + - path_regex: secrets/[^/]+\.(yaml|json|env|ini)$ 12 + key_groups: 13 + - pgp: 14 + - *adam0 15 + age: 16 + # keep-sorted start 17 + - *desktop 18 + - *laptop 19 + - *vm 20 + # keep-sorted end
+89
README.md
··· 1 + <div align="center"> 2 + <img src="./face.png" alt="Avatar" width="112" /> 3 + <img src="./modules/home/cli/fastfetch/logo.png" alt="Nix logo" width="112" /> 4 + 5 + # adam0's NixOS configuration 6 + 7 + Modular multi-host NixOS and Home Manager flake for desktop, laptop, and virtual machine systems. 8 + 9 + [![CI](https://img.shields.io/github/actions/workflow/status/adam01110/nixos/ci.yml?branch=main&style=flat-square&label=CI&labelColor=504945&color=cc241d)](https://github.com/adam01110/nixos/actions/workflows/ci.yml) 10 + [![Repo Size](https://img.shields.io/github/repo-size/adam01110/nixos?style=flat-square&label=repo%20size&labelColor=504945&color=3c3836)](https://github.com/adam01110/nixos) 11 + <br /> 12 + [![NixOS](https://img.shields.io/badge/NixOS-unstable-458588?style=flat-square&labelColor=504945&logo=nixos&logoColor=ebdbb2)](https://nixos.org) 13 + [![Flakes](https://img.shields.io/badge/Nix-flakes-689d6a?style=flat-square&labelColor=504945&logo=nixos&logoColor=ebdbb2)](https://nixos.wiki/wiki/Flakes) 14 + [![Home Manager](https://img.shields.io/badge/Home%20Manager-managed-b16286?style=flat-square&labelColor=504945&logo=nixos&logoColor=ebdbb2)](https://github.com/nix-community/home-manager) 15 + [![Stylix](https://img.shields.io/badge/Stylix-theming-8f3f71?style=flat-square&labelColor=504945&logo=nixos&logoColor=ebdbb2)](https://github.com/danth/stylix) 16 + [![SOPS Nix](https://img.shields.io/badge/SOPS%20Nix-secrets-fe8019?style=flat-square&labelColor=504945&logo=nixos&logoColor=ebdbb2)](https://github.com/Mic92/sops-nix) 17 + [![Disko](https://img.shields.io/badge/Disko-managed%20storage-98971a?style=flat-square&labelColor=504945&logo=nixos&logoColor=ebdbb2)](https://github.com/nix-community/disko) 18 + [![Lanzaboote](https://img.shields.io/badge/Lanzaboote-secure%20boot-458588?style=flat-square&labelColor=504945&logo=nixos&logoColor=ebdbb2)](https://github.com/nix-community/lanzaboote) 19 + 20 + [Overview](#overview) - [Hosts](#hosts) - [Usage](#usage) - [Secrets](#secrets) - [Customization](#Customization) - [Tooling](#Tooling) 21 + </div> 22 + 23 + This repository contains a personal NixOS setup built around `flake-parts`, `Home Manager`, and a heavily modular directory layout. It shares a common base across multiple machines, then layers host-specific hardware, service, and desktop overrides on top. 24 + 25 + ## Overview 26 + 27 + - Shared NixOS modules under `modules/system`, Home Manager modules under `modules/home`, and per-host overrides under `modules/hosts`. 28 + - Three flake outputs: `desktop`, `laptop`, and `vm`, all created from the same module stack in `flake/nixos.nix`. 29 + - Declarative storage with `Disko`, encrypted secrets with `Sops-nix`, Secure Boot with `Lanzaboote`, and theming through `Stylix`. 30 + - Desktop built on `Hyprland`, `UWSM`, `greetd` + `tuigreet`, and `Noctalia Shell`. 31 + 32 + ## Hosts 33 + 34 + | Host | Purpose | Notable differences | 35 + | --- | --- | --- | 36 + | `desktop` | Main workstation | ROCm enabled, dual-monitor Hyprland layout, Wooting and Roccat support, AMD + Intel GPU monitoring | 37 + | `laptop` | Mobile system | Wi-Fi, Bluetooth, TLP, SCX, lid switch handling, battery-oriented tuning, touch support | 38 + | `vm` | QEMU/KVM guest | `/dev/vda` Disko target, SSH enabled, guest agents, simplified display setup | 39 + 40 + ## Usage 41 + 42 + From the repository root: 43 + 44 + ```bash 45 + # Inspect flake outputs 46 + nix flake show 47 + 48 + # Apply a host configuration 49 + sudo nixos-rebuild switch --flake .#desktop 50 + 51 + # Format the repository 52 + nix fmt 53 + 54 + # Enter the dev shell 55 + nix develop 56 + ``` 57 + 58 + > [!IMPORTANT] 59 + > The host modules point at real installation devices such as `/dev/nvme0n1` and `/dev/vda`, and the configuration expects an Age key at `/var/lib/sops-nix/key.txt`. Review `modules/hosts/*/default.nix`, `modules/system/disk.nix`, and `modules/system/sops.nix` before using this on a new machine. 60 + 61 + ## Secrets 62 + 63 + - Secrets live in `secrets/secrets.yaml` and are managed with Sops-nix. 64 + - Recipient rules are defined in `.sops.yaml` for one user key and three host Age keys. 65 + 66 + Edit flow: 67 + 68 + ```bash 69 + sops secrets/secrets.yaml 70 + ``` 71 + 72 + ## Customization 73 + 74 + - Edit shared identity, locale, and Git metadata in `vars.nix`. 75 + - Adjust host-specific hardware and service choices in `modules/hosts/<host>/`. 76 + - Add or override shared behavior in `modules/system/` and `modules/home/`. 77 + - Extend package selection through `pkgs/` and `overlays/`. 78 + 79 + ## Tooling 80 + 81 + - Formatting and linting are wired through `treefmt` in `flake/treefmt.nix`. 82 + - The repository uses `import-tree` extensively to auto-discover modules, overlays, and local packages. 83 + 84 + ## Licensing 85 + 86 + - This repository is mixed-license. The root `LICENSE` file contains the `AGPL-3.0-or-later` text intended for original work authored for this repository, unless a file says otherwise. 87 + - Files derived from Nixpkgs are kept under MIT-compatible treatment with upstream attribution preserved. See `pkgs/lutris.nix`, `pkgs/zaread.nix`, and `THIRD_PARTY_NOTICES.md`. 88 + - Adapter scripts adapted from `ripgrep-all` discussion posts are marked as adapted third-party material with provenance notices. They are not being confidently relabeled as `AGPL-3.0-or-later` without a clearer relicensing basis. 89 + - Other copied or vendored third-party material keeps its own attribution and should be reviewed under `THIRD_PARTY_NOTICES.md` rather than assumed to follow the repo default.
+37
THIRD_PARTY_NOTICES.md
··· 1 + <!-- SPDX-License-Identifier: AGPL-3.0-or-later --> 2 + 3 + # Third-Party Notices 4 + 5 + This repository is mixed-license. 6 + 7 + Unless a file says otherwise, original repository code and configuration authored for this repository are intended to be licensed under `AGPL-3.0-or-later`. 8 + 9 + Third-party and mixed-provenance files must keep their own attribution and license treatment. 10 + 11 + ## Derived From Nixpkgs 12 + 13 + These files are derived from Nixpkgs package expressions and should continue to carry Nixpkgs attribution and MIT treatment. 14 + 15 + | Path | Upstream | Treatment | 16 + | --- | --- | --- | 17 + | `pkgs/lutris.nix` | Nixpkgs `pkgs/applications/misc/lutris/fhsenv.nix` | Keep `Copyright (c) Nixpkgs contributors` and `SPDX-License-Identifier: MIT`. Do not relabel as solely AGPL. | 18 + | `pkgs/zaread.nix` | Nixpkgs package expression for `zaread` | Keep `Copyright (c) Nixpkgs contributors` and `SPDX-License-Identifier: MIT`. Do not relabel as solely AGPL. | 19 + 20 + Nixpkgs is distributed under the MIT license. The required MIT notice must remain with substantial copied or adapted material from Nixpkgs. 21 + 22 + ## Adapted From ripgrep-all Discussions 23 + 24 + These files were adapted from code posted in GitHub Discussions associated with `phiresky/ripgrep-all`. 25 + 26 + | Path | Provenance | Treatment | 27 + | --- | --- | --- | 28 + | `pkgs/scripts/ripgrep-all-adapters/djvutorga-adapter.nix` | `https://github.com/phiresky/ripgrep-all/discussions/166` | Keep provenance and adaptation notice. Do not assert a new SPDX identifier until the licensing basis for the discussion-posted code is confirmed. | 29 + | `pkgs/scripts/ripgrep-all-adapters/pptx2md-adapter.nix` | `https://github.com/phiresky/ripgrep-all/discussions/199` | Keep provenance and adaptation notice. Do not assert a new SPDX identifier until the licensing basis for the discussion-posted code is confirmed. | 30 + 31 + The `ripgrep-all` repository itself is `AGPL-3.0-or-later`, but these snippets were copied from discussion posts rather than from the main source tree. That is not a strong enough basis, by itself, to confidently relabel the adapted copies here as `AGPL-3.0-or-later`. 32 + 33 + ## Other Third-Party Material 34 + 35 + | Path | Provenance | Treatment | 36 + | --- | --- | --- | 37 + | `modules/home/gui/discord/themes/system24.css` | `https://github.com/refact0r/system24` | Upstream repository is MIT-licensed. Preserve existing attribution block and keep MIT notice in mind when redistributing substantial copied copies. |
assets/face.png

This is a binary file and will not be displayed.

assets/nix.png

This is a binary file and will not be displayed.

+16
flake.nix
··· 1 + # DO-NOT-EDIT. This file was auto-generated using github:vic/flake-file. 2 + # Use `nix run .#write-flake` to regenerate it. 3 + { 4 + outputs = inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } (inputs.import-tree ./modules); 5 + 6 + inputs = { 7 + flake-file.url = "github:vic/flake-file"; 8 + flake-parts = { 9 + url = "github:hercules-ci/flake-parts"; 10 + inputs.nixpkgs-lib.follows = "nixpkgs-lib"; 11 + }; 12 + import-tree.url = "github:vic/import-tree"; 13 + nixpkgs.url = "https://channels.nixos.org/nixpkgs-unstable/nixexprs.tar.xz"; 14 + nixpkgs-lib.follows = "nixpkgs"; 15 + }; 16 + }
+13
keys/adam0.asc
··· 1 + -----BEGIN PGP PUBLIC KEY BLOCK----- 2 + 3 + mDMEaO41uRYJKwYBBAHaRw8BAQdANOK/JVHP1J9K1b3Wmn4WQZmoe/7+3Y93Om47 4 + qMWkdly0KUFkYW0wIChTb3BzIGtleSkgPGFsdW1haWxAcHJvdG9ubWFpbC5jb20+ 5 + iJAEExYKADgWIQQ2ZrRAsOhykxuOeFls/+P7pd2EuQUCaO41uQIbAwULCQgHAgYV 6 + CgkICwIEFgIDAQIeAQIXgAAKCRBs/+P7pd2EuZOtAP9KHStZZI+T8rDAOd2GiLhn 7 + C5SeF6vyILmvC/pbXTmwSAD/WZTNknUZf13oUr+Wqnv3TsfBs5qKMc3+U26HpwD0 8 + ng+4OARo7jW5EgorBgEEAZdVAQUBAQdAe3UctXs7DZSE+aLQtiYjAXoPa6Vbc4do 9 + WqG2kB9x2koDAQgHiHgEGBYKACAWIQQ2ZrRAsOhykxuOeFls/+P7pd2EuQUCaO41 10 + uQIbDAAKCRBs/+P7pd2EudI7AP428Sj0KOAh6/LcCCfMwDprNKFU4ro4rY74NkuD 11 + GG6guQD9GzLC15UMcz8ozvPcqA64Mj3eTnZReMVTfPYx+8ZehwI= 12 + =Xfgr 13 + -----END PGP PUBLIC KEY BLOCK-----
+109
modules/desktop/tuigreet.nix
··· 1 + {inputs, ...}: { 2 + flake-file.inputs.tuigreet = { 3 + url = "github:notashelf/tuigreet"; 4 + inputs.nixpkgs.follows = "nixpkgs"; 5 + }; 6 + 7 + # keep-sorted start block=yes newline_separated=yes 8 + flake.overlays.tuigreet = final: _prev: let 9 + inherit (final.stdenv.hostPlatform) system; 10 + in { 11 + tuigreet = inputs.tuigreet.packages.${system}.tuigreet; 12 + }; 13 + 14 + flake.modules.nixos.tuigreet = { 15 + # keep-sorted start 16 + config, 17 + lib, 18 + pkgs, 19 + vars, 20 + # keep-sorted end 21 + ... 22 + }: let 23 + inherit 24 + (lib) 25 + # keep-sorted start 26 + getExe 27 + getExe' 28 + # keep-sorted end 29 + ; 30 + inherit (vars) username; 31 + tomlFormat = pkgs.formats.toml {}; 32 + in { 33 + imports = [inputs.self.modules.generic.vars]; 34 + 35 + # keep-sorted start block=yes newline_separated=yes 36 + environment = { 37 + # Generate tuigreet configuration. 38 + etc."tuigreet/config.toml".source = let 39 + # keep-sorted start 40 + hyprland = getExe' config.programs.hyprland.package "start-hyprland"; 41 + uwsm = getExe config.programs.uwsm.package; 42 + # keep-sorted end 43 + in 44 + tomlFormat.generate "tuigreet-config.toml" { 45 + # keep-sorted start block=yes newline_separated=yes 46 + session = { 47 + command = "${uwsm} start -eD Hyprland -- ${hyprland}"; 48 + sessions_dirs = []; 49 + xsessions_dirs = []; 50 + }; 51 + 52 + display = { 53 + show_time = true; 54 + greeting = "authentication required."; 55 + time_format = "%Y-%m-%d %H:%M:%S"; 56 + }; 57 + 58 + remember = { 59 + username = true; 60 + default_user = username; 61 + }; 62 + 63 + secret.mode = "characters"; 64 + 65 + layout = { 66 + # keep-sorted start 67 + container_padding = 1; 68 + prompt_padding = 1; 69 + window_padding = 1; 70 + # keep-sorted end 71 + }; 72 + 73 + power = { 74 + use_setsid = false; 75 + shutdown = "systemctl poweroff"; 76 + reboot = "systemctl reboot"; 77 + }; 78 + 79 + theme = { 80 + # keep-sorted start 81 + action = "white"; 82 + border = "blue"; 83 + button = "green"; 84 + container = "black"; 85 + greet = "white"; 86 + input = "white"; 87 + prompt = "blue"; 88 + text = "white"; 89 + time = "green"; 90 + title = "white"; 91 + # keep-sorted end 92 + }; 93 + # keep-sorted end 94 + }; 95 + }; 96 + 97 + services.greetd = { 98 + enable = true; 99 + 100 + # Required by nixpkgs' greetd module for TTY greeters such as tuigreet. 101 + useTextGreeter = true; 102 + settings.default_session.command = getExe pkgs.tuigreet; 103 + }; 104 + 105 + nixpkgs.overlays = [inputs.self.overlays.tuigreet]; 106 + # keep-sorted end 107 + }; 108 + # keep-sorted end 109 + }
+12
modules/nix/dendritic.nix
··· 1 + {inputs, ...}: { 2 + flake-file.inputs = { 3 + flake-parts.url = "github:hercules-ci/flake-parts"; 4 + flake-file.url = "github:vic/flake-file"; 5 + import-tree.url = "github:vic/import-tree"; 6 + }; 7 + 8 + imports = [ 9 + inputs.flake-parts.flakeModules.modules 10 + inputs.flake-file.flakeModules.dendritic 11 + ]; 12 + }
+12
modules/nix/determinate.nix
··· 1 + {inputs, ...}: { 2 + flake-file.inputs = { 3 + determinate = { 4 + url = "https://flakehub.com/f/DeterminateSystems/determinate/3"; 5 + inputs.flake-parts.follows = "flake-parts"; 6 + }; 7 + }; 8 + 9 + flake.overlays.determinate = final: _prev: { 10 + nix = inputs.determinate.packages.${final.stdenv.hostPlatform.system}.default; 11 + }; 12 + }
+8
modules/nix/home-manager.nix
··· 1 + {inputs, ...}: { 2 + flake-file.inputs = { 3 + url = "github:nix-community/home-manager"; 4 + home-manager.inputs.nixpkgs.follows = "nixpkgs"; 5 + }; 6 + 7 + imports = [inputs.home-manager.flakeModules.home-manager]; 8 + }
+33
modules/nix/sops.nix
··· 1 + {inputs, ...}: let 2 + sopsConfig = { 3 + # Keep the shared secret inventory in the repository copy. 4 + defaultSopsFile = "${inputs.self}/secrets/secrets.yaml"; 5 + defaultSopsFormat = "yaml"; 6 + 7 + validateSopsFiles = false; 8 + 9 + # Use a pre-provisioned age key file on disk. 10 + age = { 11 + sshKeyPaths = []; 12 + generateKey = false; 13 + keyFile = "/var/lib/sops-nix/key.txt"; 14 + }; 15 + }; 16 + in { 17 + flake-file.inputs = { 18 + sops-nix = { 19 + url = "github:Mic92/sops-nix"; 20 + inputs.nixpkgs.follows = "nixpkgs"; 21 + }; 22 + }; 23 + 24 + flake.modules.nixos.sops = { 25 + imports = [inputs.sops-nix.nixosModules.sops]; 26 + sops = sopsConfig; 27 + }; 28 + 29 + flake.modules.homeManager.sops = { 30 + imports = [inputs.sops-nix.homeManagerModules.sops]; 31 + sops = sopsConfig; 32 + }; 33 + }
+9
modules/nix/vars.nix
··· 1 + {inputs, ...}: let 2 + vars = import "${inputs.self}/vars.nix"; 3 + in { 4 + flake.vars = vars; 5 + 6 + flake.modules.generic.vars = { 7 + _module.args.vars = vars; 8 + }; 9 + }
+40
modules/profiles/slim.nix
··· 1 + { 2 + flake.modules.nixos.slim = {lib, ...}: let 3 + inherit (builtins) filter; 4 + inherit (lib) mkForce; 5 + in { 6 + # keep-sorted start block=yes newline_separated=yes 7 + documentation = { 8 + # keep-sorted start 9 + doc.enable = mkForce false; 10 + info.enable = mkForce false; 11 + # keep-sorted end 12 + }; 13 + 14 + # Drop the default package seed so profiles start empty. 15 + environment.defaultPackages = mkForce []; 16 + 17 + # Slim xdg-desktop-portal-gtk globally to avoid duplicate user units. 18 + nixpkgs.overlays = [ 19 + (_final: prev: { 20 + xdg-desktop-portal-gtk = prev.xdg-desktop-portal-gtk.overrideAttrs (old: { 21 + buildInputs = 22 + filter ( 23 + pkg: pkg != prev.gnome-desktop && pkg != prev.gnome-settings-daemon 24 + ) 25 + old.buildInputs; 26 + mesonFlags = (old.mesonFlags or []) ++ ["-Dwallpaper=disabled"]; 27 + }); 28 + }) 29 + ]; 30 + 31 + services = { 32 + # Disable speech stack. 33 + # keep-sorted start 34 + orca.enable = mkForce false; 35 + speechd.enable = mkForce false; 36 + # keep-sorted end 37 + }; 38 + # keep-sorted end 39 + }; 40 + }
+182
modules/profiles/tweaks.nix
··· 1 + { 2 + flake.modules.nixos.tweaks = { 3 + # keep-sorted start 4 + config, 5 + lib, 6 + pkgs, 7 + # keep-sorted end 8 + ... 9 + }: let 10 + inherit (builtins) attrValues; 11 + inherit 12 + (lib) 13 + # keep-sorted start 14 + getExe 15 + getExe' 16 + mkEnableOption 17 + optional 18 + # keep-sorted end 19 + ; 20 + in { 21 + options.optTweaks.rcuLazy.enable = mkEnableOption "Enable RCU lazy mode."; 22 + 23 + config = { 24 + # keep-sorted start block=yes newline_separated=yes 25 + # Kernel parameters aimed at low latency desktops. 26 + boot = { 27 + # Audio power management: disable power saving for continuous audio availability. 28 + extraModprobeConfig = '' 29 + options snd_hda_intel power_save=0 30 + 31 + # Disable hardware watchdogs for lower latency. 32 + blacklist iTCO_wdt 33 + blacklist wdat_wdt 34 + ''; 35 + 36 + # Enable nt sync for better wine/proton performance. 37 + kernelModules.ntsync = true; 38 + 39 + # Memory and system tuning for desktop responsiveness. 40 + kernel.sysctl = { 41 + # Prefer compressed swap sooner to keep file cache and anonymous memory flexible. 42 + # keep-sorted start 43 + "vm.swappiness" = 100; 44 + "vm.vfs_cache_pressure" = 50; 45 + # keep-sorted end 46 + 47 + # Cap dirty data in bytes so writeback starts predictably across ram sizes. 48 + # keep-sorted start 49 + "vm.dirty_background_bytes" = 67108864; 50 + "vm.dirty_bytes" = 268435456; 51 + "vm.dirty_writeback_centisecs" = 1500; 52 + "vm.page-cluster" = 0; 53 + # keep-sorted end 54 + 55 + # Drop watchdog and console noise that can add scheduler jitter. 56 + # keep-sorted start 57 + "kernel.nmi_watchdog" = 0; 58 + "kernel.printk" = "3 3 3 3"; 59 + "kernel.unprivileged_userns_clone" = 1; 60 + # keep-sorted end 61 + 62 + # Keep kernel address exposure and kexec locked down despite the performance focus. 63 + # keep-sorted start 64 + "kernel.kexec_load_disabled" = 1; 65 + "kernel.kptr_restrict" = 2; 66 + # keep-sorted end 67 + 68 + # Leave headroom for heavier desktop and gaming network bursts. 69 + # keep-sorted start 70 + "fs.file-max" = 2097152; 71 + "net.core.netdev_max_backlog" = 4096; 72 + "net.ipv4.ip_forward" = 1; 73 + "net.ipv4.tcp_mtu_probing" = 1; 74 + "net.ipv4.tcp_tw_reuse" = 1; 75 + # keep-sorted end 76 + 77 + # Remove the global rt throttle so audio workloads can hold cpu time when needed. 78 + "kernel.sched_rt_runtime_us" = -1; 79 + }; 80 + 81 + # Kernel boot parameters for additional tuning. 82 + kernelParams = 83 + [ 84 + # Enable lru page generation for better memory management. 85 + "lru_gen=y" 86 + ] 87 + # Optionally enable rcu lazy mode for battery life on laptops. 88 + ++ optional config.optTweaks.rcuLazy.enable "rcutree.enable_rcu_lazy=1"; 89 + }; 90 + 91 + # Assorted low-level tweaks and helper tools. 92 + environment.systemPackages = attrValues { 93 + inherit 94 + (pkgs) 95 + # keep-sorted start 96 + bash 97 + coreutils 98 + hdparm 99 + # keep-sorted end 100 + ; 101 + }; 102 + 103 + # Systemd limits and tmpfiles overrides. 104 + systemd = { 105 + tmpfiles.rules = [ 106 + "e /var/lib/systemd/coredump - - - 3d" 107 + 108 + "w! /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none - - - - 409" 109 + "w! /sys/kernel/mm/transparent_hugepage/defrag - - - - defer+madvise" 110 + ]; 111 + 112 + user.extraConfig = '' 113 + [Manager] 114 + DefaultLimitNOFILE=1024:1048576 115 + ''; 116 + 117 + settings.Manager = { 118 + # keep-sorted start 119 + DefaultLimitNOFILE = "2048:2097152"; 120 + DefaultTimeoutStartSec = "15s"; 121 + DefaultTimeoutStopSec = "10s"; 122 + # keep-sorted end 123 + }; 124 + }; 125 + # keep-sorted end 126 + 127 + # Udev rules for audio power saving and disk scheduler tuning. 128 + services.udev.extraRules = let 129 + # keep-sorted start 130 + bash = getExe pkgs.bash; 131 + hdparm = getExe pkgs.hdparm; 132 + # keep-sorted end 133 + 134 + # keep-sorted start 135 + cat = getExe' pkgs.coreutils "cat"; 136 + echo = getExe' pkgs.coreutils "echo"; 137 + touch = getExe' pkgs.coreutils "touch"; 138 + # keep-sorted end 139 + in '' 140 + ACTION=="add", SUBSYSTEM=="sound", KERNEL=="card*", DRIVERS=="snd_hda_intel", TEST!="/run/udev/snd-hda-intel-powersave", \ 141 + RUN+="${bash} -c '${touch} /run/udev/snd-hda-intel-powersave; \ 142 + [[ $$((${cat} /sys/class/power_supply/BAT0/status 2>/dev/null) != \"Discharging\" ]] && \ 143 + ${echo} $$((${cat} /sys/module/snd_hda_intel/parameters/power_save) > /run/udev/snd-hda-intel-powersave && \ 144 + ${echo} 0 > /sys/module/snd_hda_intel/parameters/power_save'" 145 + 146 + SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", TEST=="/sys/module/snd_hda_intel", \ 147 + RUN+="${bash} -c '${echo} $$((${cat} /run/udev/snd-hda-intel-powersave 2>/dev/null || \ 148 + ${echo} 10) > /sys/module/snd_hda_intel/parameters/power_save'" 149 + 150 + SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="1", TEST=="/sys/module/snd_hda_intel", \ 151 + RUN+="${bash} -c '[[ $$((${cat} /sys/module/snd_hda_intel/parameters/power_save) != 0 ]] && \ 152 + ${echo} $$(${cat} /sys/module/snd_hda_intel/parameters/power_save) > /run/udev/snd-hda-intel-powersave; \ 153 + ${echo} 0 > /sys/module/snd_hda_intel/parameters/power_save'" 154 + 155 + ACTION=="change", KERNEL=="zram0", ATTR{initstate}=="1", SYSCTL{vm.swappiness}="150", \ 156 + RUN+="${bash} -c '${echo} N > /sys/module/zswap/parameters/enabled'" 157 + 158 + KERNEL=="rtc0", GROUP="audio" 159 + KERNEL=="hpet", GROUP="audio" 160 + 161 + ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", \ 162 + ATTR{link_power_management_policy}=="*", \ 163 + ATTR{link_power_management_supported}=="1", \ 164 + ATTR{link_power_management_policy}="max_performance" 165 + 166 + ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="1", \ 167 + ATTR{queue/scheduler}="bfq" 168 + 169 + ACTION=="add|change", KERNEL=="sd[a-z]*|mmcblk[0-9]*", ATTR{queue/rotational}=="0", \ 170 + ATTR{queue/scheduler}="adios" 171 + 172 + ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/rotational}=="0", \ 173 + ATTR{queue/scheduler}="adios" 174 + 175 + ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", \ 176 + ATTRS{id/bus}=="ata", RUN+="${hdparm} -B 254 -S 0 /dev/%k" 177 + 178 + DEVPATH=="/devices/virtual/misc/cpu_dma_latency", OWNER="root", GROUP="audio", MODE="0660" 179 + ''; 180 + }; 181 + }; 182 + }
+6
modules/programs/cli/bandwhich.nix
··· 1 + { 2 + flake.modules.nixos.bandwhich = { 3 + # Show per-process bandwidth usage from the tui. 4 + programs.bandwhich.enable = true; 5 + }; 6 + }
+15
modules/programs/cli/bat.nix
··· 1 + { 2 + flake.modules.homeManager.bat = {pkgs, ...}: { 3 + # Enable bat with manuals. 4 + programs.bat = { 5 + enable = true; 6 + 7 + extraPackages = [pkgs.bat-extras.batman]; 8 + 9 + syntaxes.just = { 10 + src = pkgs.nur.repos.adam0.bat-syntax-just; 11 + file = "Just.sublime-syntax"; 12 + }; 13 + }; 14 + }; 15 + }
+17
modules/programs/cli/bonsai.nix
··· 1 + { 2 + flake.modules.homeManager.bonsai = { 3 + # keep-sorted start 4 + lib, 5 + pkgs, 6 + # keep-sorted end 7 + ... 8 + }: let 9 + inherit (lib) getExe; 10 + bonsai = pkgs.nur.repos.Dev380.rbonsai; 11 + in { 12 + home = { 13 + packages = [bonsai]; 14 + shellAliases.bonsai = "${getExe bonsai} -S"; 15 + }; 16 + }; 17 + }
+17
modules/programs/cli/cpond.nix
··· 1 + { 2 + flake.modules.homeManager.cpond = { 3 + # keep-sorted start 4 + lib, 5 + pkgs, 6 + # keep-sorted end 7 + ... 8 + }: let 9 + inherit (lib) getExe; 10 + inherit (pkgs.nur.repos.adam0) cpond; 11 + in { 12 + home = { 13 + packages = [cpond]; 14 + shellAliases.cpond = "${getExe cpond} -b -c 16"; 15 + }; 16 + }; 17 + }
+10
modules/programs/cli/direnv.nix
··· 1 + { 2 + flake.modules.homeManager.direnv = _: { 3 + programs.direnv = { 4 + enable = true; 5 + 6 + # Use nix-direnv for fast, cached shell hooks. 7 + nix-direnv.enable = true; 8 + }; 9 + }; 10 + }
+19
modules/programs/cli/eza.nix
··· 1 + { 2 + flake.modules.homeManager.eza = _: { 3 + programs.eza = { 4 + enable = true; 5 + 6 + colors = "always"; 7 + icons = "always"; 8 + extraOptions = [ 9 + # keep-sorted start 10 + "--all" 11 + "--group-directories-first" 12 + "--long" 13 + "--mounts" 14 + "--time-style=long-iso" 15 + # keep-sorted end 16 + ]; 17 + }; 18 + }; 19 + }
+207
modules/programs/cli/fastfetch.nix
··· 1 + { 2 + # keep-sorted start 3 + lib, 4 + pkgs, 5 + # keep-sorted end 6 + ... 7 + }: let 8 + inherit (builtins) fromJSON; 9 + inherit (lib) getExe; 10 + inherit (pkgs) writeShellApplication; 11 + 12 + # Escape code for fastfetch color formatting. 13 + esc = fromJSON "\"\\u001b\""; 14 + in { 15 + programs.fastfetch = { 16 + enable = true; 17 + 18 + settings = { 19 + # Use custom logo and kitty terminal image display. 20 + logo = { 21 + source = ./logo.png; 22 + type = "kitty"; 23 + height = 15; 24 + width = 35; 25 + }; 26 + 27 + # Configure display formatting and binary prefix standards. 28 + display = { 29 + separator = " "; 30 + size.binaryPrefix = "jedec"; 31 + }; 32 + 33 + # Define information modules to show in system overview. 34 + modules = [ 35 + "break" 36 + 37 + { 38 + type = "os"; 39 + key = "{#7}  DISTRO "; 40 + keyColor = "blue"; 41 + format = "${esc}[34m{#1}{#7} {3} "; 42 + } 43 + 44 + { 45 + type = "kernel"; 46 + key = "│ ├ KERNEL"; 47 + keyColor = "34"; 48 + format = "{2}"; 49 + } 50 + 51 + { 52 + type = "packages"; 53 + key = "│ ├󰏖 PACKAGES"; 54 + keyColor = "34"; 55 + } 56 + 57 + { 58 + type = "shell"; 59 + key = "│ ├ SHELL"; 60 + keyColor = "34"; 61 + } 62 + 63 + { 64 + type = "command"; 65 + key = "│ ├󰅐 OS-AGE"; 66 + keyColor = "34"; 67 + 68 + # Calculate system installation age from root filesystem birth time. 69 + text = getExe (writeShellApplication { 70 + name = "os-age"; 71 + runtimeInputs = [pkgs.coreutils]; 72 + text = '' 73 + birth_install="$(stat -c %W /)" 74 + current="$(date +%s)" 75 + time_progression="$((current - birth_install))" 76 + days_difference="$((time_progression / 86400))" 77 + 78 + echo "$days_difference days" 79 + ''; 80 + }); 81 + } 82 + 83 + { 84 + type = "uptime"; 85 + key = "│ └󰅐 UPTIME"; 86 + keyColor = "34"; 87 + } 88 + 89 + { 90 + type = "custom"; 91 + format = "{#1}${esc}[34m└─────────────────────────────────────────────────────────────"; 92 + } 93 + 94 + { 95 + type = "wm"; 96 + key = "{#7}  DE/WM "; 97 + keyColor = "36"; 98 + format = "${esc}[36m{#1}{#7} {2} {3} "; 99 + } 100 + 101 + { 102 + type = "de"; 103 + key = "│ ├󰧨 DE"; 104 + keyColor = "cyan"; 105 + } 106 + 107 + { 108 + type = "lm"; 109 + key = "│ ├󰧨 LM"; 110 + keyColor = "cyan"; 111 + } 112 + 113 + { 114 + type = "theme"; 115 + key = "│ ├󰉼 THEME"; 116 + keyColor = "cyan"; 117 + } 118 + 119 + { 120 + type = "icons"; 121 + key = "│ ├󰀻 ICONS"; 122 + keyColor = "cyan"; 123 + } 124 + 125 + { 126 + type = "terminal"; 127 + key = "│ ├ TERMINAL"; 128 + keyColor = "cyan"; 129 + } 130 + 131 + { 132 + type = "terminalfont"; 133 + key = "│ └ FONT"; 134 + keyColor = "cyan"; 135 + } 136 + 137 + { 138 + type = "custom"; 139 + format = "{#1}${esc}[36m└─────────────────────────────────────────────────────────────"; 140 + } 141 + 142 + { 143 + type = "board"; 144 + key = "{#7}  HARDWARE "; 145 + keyColor = "31"; 146 + format = "${esc}[31m{#1}{#7} {1} ({2}) "; 147 + } 148 + 149 + { 150 + type = "cpu"; 151 + key = "│ ├ CPU"; 152 + keyColor = "red"; 153 + } 154 + 155 + { 156 + type = "gpu"; 157 + key = "│ ├󰍛 GPU"; 158 + keyColor = "red"; 159 + format = "{2} {3}"; 160 + } 161 + 162 + { 163 + type = "memory"; 164 + key = "│ ├󰑭 RAM"; 165 + keyColor = "red"; 166 + format = "{4} {1} / {2} ({3})"; 167 + } 168 + 169 + { 170 + type = "disk"; 171 + key = "│ ├ DISKS"; 172 + keyColor = "red"; 173 + } 174 + 175 + { 176 + type = "custom"; 177 + format = "{#1}${esc}[31m└─────────────────────────────────────────────────────────────"; 178 + } 179 + 180 + { 181 + type = "display"; 182 + key = "{#7} 󰍹 DISPLAY "; 183 + keyColor = "38"; 184 + format = "{#1}{#7}${esc}[32m {6} {1}x{2} @{3}Hz ({7}) "; 185 + } 186 + 187 + { 188 + type = "media"; 189 + key = "│ ├󰝚 TRACK"; 190 + keyColor = "38"; 191 + format = "{3} - {1} ({5})"; 192 + } 193 + 194 + { 195 + type = "sound"; 196 + key = "│ └ VOLUME"; 197 + keyColor = "38"; 198 + } 199 + 200 + { 201 + type = "custom"; 202 + format = "{#1}${esc}[37m└─────────────────────────────────────────────────────────────"; 203 + } 204 + ]; 205 + }; 206 + }; 207 + }
+15
modules/programs/cli/fd.nix
··· 1 + { 2 + flake.modules.homeManager.fd = _: { 3 + programs.fd = { 4 + enable = true; 5 + 6 + hidden = true; 7 + extraOptions = [ 8 + # keep-sorted start 9 + "--color" 10 + "always" 11 + # keep-sorted end 12 + ]; 13 + }; 14 + }; 15 + }
+20
modules/programs/cli/gh.nix
··· 1 + { 2 + flake.modules.homeManager.gh = {vars, ...}: let 3 + inherit (vars) gitUsername; 4 + in { 5 + programs.gh = { 6 + enable = true; 7 + 8 + hosts."github.com".user = gitUsername; 9 + 10 + settings = { 11 + # keep-sorted start 12 + git_protocol = "ssh"; 13 + telemetry = "disabled"; 14 + # keep-sorted end 15 + }; 16 + }; 17 + 18 + home.sessionVariables.GH_TELEMETRY = false; 19 + }; 20 + }
+20
modules/programs/cli/man.nix
··· 1 + { 2 + flake.modules.nixos.man = {pkgs, ...}: let 3 + inherit (builtins) attrValues; 4 + in { 5 + documentation = { 6 + man.cache.enable = true; 7 + dev.enable = true; 8 + }; 9 + 10 + environment.systemPackages = attrValues { 11 + inherit 12 + (pkgs) 13 + # keep-sorted start 14 + man-pages 15 + man-pages-posix 16 + # keep-sorted end 17 + ; 18 + }; 19 + }; 20 + }
+12
modules/programs/cli/nh.nix
··· 1 + { 2 + flake.modules.nixos.nh = {vars, ...}: let 3 + inherit (vars) username; 4 + in { 5 + programs.nh = { 6 + enable = true; 7 + 8 + # Set flake root. 9 + flake = "/home/${username}/Nixos"; 10 + }; 11 + }; 12 + }
+30
modules/programs/cli/npm.nix
··· 1 + { 2 + flake.modules.homeManager.npm = {config, ...}: let 3 + inherit 4 + (config.xdg) 5 + # keep-sorted start 6 + cacheHome 7 + configHome 8 + dataHome 9 + stateHome 10 + # keep-sorted end 11 + ; 12 + in { 13 + programs.npm = { 14 + enable = true; 15 + 16 + # Dont install npm, eww. 17 + package = null; 18 + 19 + # Route npm paths to XDG paths instead of ~/.npm. 20 + settings = { 21 + # keep-sorted start 22 + cache = "${cacheHome}/npm"; 23 + init-module = "${configHome}/npm/config/npm-init.js"; 24 + logs-dir = "${stateHome}/npm/logs"; 25 + prefix = "${dataHome}/npm"; 26 + # keep-sorted end 27 + }; 28 + }; 29 + }; 30 + }
+10
modules/programs/cli/nys.nix
··· 1 + { 2 + flake.modules.homeManager.nys = _: { 3 + programs.nix-your-shell = { 4 + enable = true; 5 + 6 + # Show build progress with nom. 7 + nix-output-monitor.enable = true; 8 + }; 9 + }; 10 + }
+17
modules/programs/cli/pipes.nix
··· 1 + { 2 + flake.modules.homeManager.pipes = { 3 + # keep-sorted start 4 + lib, 5 + pkgs, 6 + # keep-sorted end 7 + ... 8 + }: let 9 + inherit (lib) getExe; 10 + pipes = pkgs.pipes-rs; 11 + in { 12 + home = { 13 + packages = [pipes]; 14 + shellAliases.pipes = "${getExe pipes} -p 4"; 15 + }; 16 + }; 17 + }
+22
modules/programs/cli/ripgrep.nix
··· 1 + { 2 + flake.modules.homeManager.ripgrep = { 3 + # keep-sorted start 4 + config, 5 + lib, 6 + # keep-sorted end 7 + ... 8 + }: let 9 + inherit (lib) getExe; 10 + ripgrep = getExe config.programs.ripgrep.package; 11 + in { 12 + programs.ripgrep.enable = true; 13 + 14 + home.shellAliases = { 15 + # keep-sorted start 16 + egrep = ripgrep; 17 + fgrep = "${ripgrep} -F"; 18 + grep = ripgrep; 19 + # keep-sorted end 20 + }; 21 + }; 22 + }
+14
modules/programs/cli/rumdl.nix
··· 1 + { 2 + flake.modules.homeManager.rumdl = { 3 + config, 4 + pkgs, 5 + ... 6 + }: let 7 + tomlFormat = pkgs.formats.toml {}; 8 + in { 9 + # Generate rumdl settings. 10 + xdg.configFile."rumdl/rumdl.toml".source = tomlFormat.generate "rumdl-config.toml" { 11 + global.cache_dir = "${config.xdg.cacheHome}/rumdl"; 12 + }; 13 + }; 14 + }
+17
modules/programs/cli/speedtest.nix
··· 1 + { 2 + flake.modules.homeManager.speedtest = { 3 + # keep-sorted start 4 + lib, 5 + pkgs, 6 + # keep-sorted end 7 + ... 8 + }: let 9 + inherit (lib) getExe; 10 + speedtest = pkgs.speedtest-go; 11 + in { 12 + home = { 13 + packages = [speedtest]; 14 + shellAliases.speedtest = getExe pkgs.speedtest-go; 15 + }; 16 + }; 17 + }
+17
modules/programs/cli/sudo.nix
··· 1 + { 2 + flake.modules.nixos.sudo = { 3 + security = { 4 + sudo.enable = false; 5 + 6 + sudo-rs = { 7 + enable = true; 8 + execWheelOnly = true; 9 + 10 + # Enable password feedback. 11 + extraConfig = '' 12 + Defaults env_reset,pwfeedback 13 + ''; 14 + }; 15 + }; 16 + }; 17 + }
+15
modules/programs/cli/systeroid.nix
··· 1 + { 2 + flake.modules.homeManager.systeroid = {pkgs, ...}: let 3 + iniFormat = pkgs.formats.ini {}; 4 + in { 5 + # keep-sorted start block=yes newline_separated=yes 6 + home.packages = [pkgs.systeroid]; 7 + 8 + # Generate systeroid settings. 9 + xdg.configFile."systeroid/systeroid.conf".source = iniFormat.generate "systeroid.conf" { 10 + general.display_deprecated = true; 11 + cli.output_type = "tree"; 12 + }; 13 + # keep-sorted end 14 + }; 15 + }
+37
modules/programs/cli/tlrc.nix
··· 1 + { 2 + flake.modules.homeManager.tlrc = {pkgs, ...}: let 3 + tomlFormat = pkgs.formats.toml {}; 4 + in { 5 + # keep-sorted start block=yes newline_separated=yes 6 + home.packages = [pkgs.tlrc]; 7 + 8 + # Generate systeroid settings. 9 + xdg.configFile."tlrc/config.toml".source = tomlFormat.generate "tlrc-config.toml" { 10 + cache.auto_update = false; 11 + 12 + output = { 13 + platform_title = true; 14 + 15 + show_hyphens = true; 16 + example_prefix = "◇ "; 17 + 18 + option_style = "both"; 19 + }; 20 + 21 + style = { 22 + title = { 23 + color = "magenta"; 24 + underline = true; 25 + }; 26 + 27 + description.color = "white"; 28 + 29 + bullet = { 30 + color = "green"; 31 + bold = true; 32 + }; 33 + }; 34 + }; 35 + # keep-sorted end 36 + }; 37 + }
+9
modules/programs/cli/zoxide.nix
··· 1 + { 2 + flake.modules.homeManager.zoxide = { 3 + programs.zoxide = { 4 + enable = true; 5 + 6 + options = ["--cmd cd"]; 7 + }; 8 + }; 9 + }
+35
modules/programs/gui/steam.nix
··· 1 + { 2 + flake.modules.nixos.steam = {pkgs, ...}: { 3 + programs.steam = { 4 + enable = true; 5 + 6 + # Use millennium. 7 + package = pkgs.millennium-steam; 8 + 9 + # Open necessary ports for remote play and on-LAN transfers. 10 + localNetworkGameTransfers.openFirewall = true; 11 + remotePlay.openFirewall = true; 12 + 13 + protontricks.enable = true; 14 + 15 + # Include custom proton builds. 16 + extraCompatPackages = [pkgs.proton-ge-bin]; 17 + 18 + fontPackages = [pkgs.noto-fonts-cjk-sans]; 19 + }; 20 + 21 + # Match the SteamOS defaults used on Steam Deck. 22 + boot.kernel.sysctl = { 23 + # keep-sorted start 24 + # last checked with https://steamdeck-packages.steamos.cloud/archlinux-mirror/jupiter-main/os/x86_64/steamos-customizations-jupiter-20250117.1-1-any.pkg.tar.zst 25 + "kernel.sched_cfs_bandwidth_slice_us" = 3000; 26 + # Avoid split lock slowdown on supported kernels. 27 + "kernel.split_lock_mitigate" = 0; 28 + # Shorten fin timeout for games that restart quickly. 29 + "net.ipv4.tcp_fin_timeout" = 5; 30 + # Use MAX_INT - MAPCOUNT_ELF_CORE_MARGIN. 31 + "vm.max_map_count" = 2147483642; 32 + # keep-sorted end 33 + }; 34 + }; 35 + }
+109
modules/programs/gui/zen/chrome.nix
··· 1 + { 2 + flake.modules.homeManager.zen = { 3 + # keep-sorted start 4 + flakeLib, 5 + inputs, 6 + osConfig, 7 + pkgs, 8 + # keep-sorted end 9 + ... 10 + }: let 11 + inherit (builtins) readFile; 12 + inherit (pkgs.lib) mkAfter; 13 + inherit (flakeLib) stylixPalette; 14 + 15 + inherit (pkgs.stdenv.hostPlatform) system; 16 + 17 + # Convert the stylix base16 scheme into a format accepted by nix-userstyles. 18 + palette = stylixPalette osConfig; 19 + in { 20 + # Remove rounded corners in zen browser interface. 21 + programs.zen-browser.profiles.default = { 22 + userChrome = '' 23 + *, 24 + *::before, 25 + *::after { 26 + border-radius: 0px !important; 27 + } 28 + ''; 29 + 30 + # Append generated site styles after profile content overrides. 31 + userContent = mkAfter ( 32 + readFile (inputs.nix-userstyles.lib.mkUserContent system { 33 + inherit palette; 34 + 35 + # Apply nix-userstyles themes. 36 + userStyles = [ 37 + # keep-sorted start 38 + "advent-of-code" 39 + "alternativeto" 40 + "anonymous-overflow" 41 + "arch-wiki" 42 + "brave-search" 43 + "bsky" 44 + "bstats" 45 + "chatgpt" 46 + "codeberg" 47 + "crates.io" 48 + "dev.to" 49 + "devdocs" 50 + "discord" 51 + "docs.deno.com" 52 + "docs.rs" 53 + "freedesktop" 54 + "ghostty.org" 55 + "github" 56 + "gmail" 57 + "google" 58 + "google-drive" 59 + "hacker-news" 60 + "home-manager-options-search" 61 + "indie-wiki-buddy" 62 + "lastfm" 63 + "linkedin" 64 + "lobste.rs" 65 + "mastodon" 66 + "mdbook" 67 + "mdn" 68 + "modrinth" 69 + "namemc" 70 + "neovim.io" 71 + "nitter" 72 + "nixos-manual" 73 + "nixos-search" 74 + "npm" 75 + "planet-minecraft" 76 + "porkbun" 77 + "proton" 78 + "pypi" 79 + "react.dev" 80 + "reddit" 81 + "regex101" 82 + "rentry.co" 83 + "searchix" 84 + "shinigami-eyes" 85 + "spotify-web" 86 + "stack-overflow" 87 + "twitch" 88 + "web.dev" 89 + "wiki.nixos.org" 90 + "wikipedia" 91 + "wikiwand" 92 + "youtube" 93 + "zen-browser-docs" 94 + # keep-sorted end 95 + ]; 96 + 97 + # Remove rounded corners on sites and apply nix-userstyles themes. 98 + extraCss = '' 99 + *, 100 + *::before, 101 + *::after { 102 + border-radius: 0px !important; 103 + } 104 + ''; 105 + }) 106 + ); 107 + }; 108 + }; 109 + }
+21
modules/programs/gui/zen/default.nix
··· 1 + {inputs, ...}: { 2 + flake-file.inputs = { 3 + zen-browser = { 4 + url = "github:0xc000022070/zen-browser-flake?ref=beta"; 5 + inputs = { 6 + # keep-sorted start 7 + home-manager.follows = "home-manager"; 8 + nixpkgs.follows = "nixpkgs"; 9 + # keep-sorted end 10 + }; 11 + }; 12 + }; 13 + 14 + flake.modules.homeManager.zen = { 15 + imports = [ 16 + inputs.zen-browser.homeModules.beta 17 + ]; 18 + 19 + programs.zen-browser.enable = true; 20 + }; 21 + }
+69
modules/programs/gui/zen/extensions.nix
··· 1 + { 2 + flake.modules.homeManager.zen = {pkgs, ...}: let 3 + inherit 4 + (builtins) 5 + # keep-sorted start 6 + attrValues 7 + mapAttrs 8 + # keep-sorted end 9 + ; 10 + in { 11 + # Add extensions in nur. 12 + programs.zen-browser.profiles.default.extensions = { 13 + # Force extensions to be enabled. 14 + force = true; 15 + packages = attrValues { 16 + inherit 17 + (pkgs.nur.repos.rycee.firefox-addons) 18 + # Content blocking. 19 + # keep-sorted start 20 + consent-o-matic 21 + don-t-fuck-with-paste 22 + fastforwardteam 23 + istilldontcareaboutcookies 24 + localcdn 25 + sponsorblock 26 + ublock-origin 27 + # keep-sorted end 28 + # Annoyances. 29 + # keep-sorted start 30 + bitwarden 31 + darkreader 32 + dearrow 33 + indie-wiki-buddy 34 + libredirect 35 + modrinthify 36 + pronoundb 37 + return-youtube-dislikes 38 + shinigami-eyes 39 + translate-web-pages 40 + violentmonkey 41 + wikiwand-wikipedia-modernized 42 + # keep-sorted end 43 + ; 44 + }; 45 + }; 46 + 47 + # Add extensions not in nur. 48 + programs.zen-browser.policies.ExtensionSettings = let 49 + mkExtensionSettings = mapAttrs ( 50 + _: pluginId: { 51 + install_url = "https://addons.mozilla.org/firefox/downloads/latest/${pluginId}/latest.xpi"; 52 + installation_mode = "force_installed"; 53 + } 54 + ); 55 + in 56 + (mkExtensionSettings { 57 + "{76ef94a4-e3d0-4c6f-961a-d38a429a332b}" = "ttv-lol-pro"; 58 + "{3507f56d-2ef5-45c1-b6d7-5297a0ba7642}" = "cookie-remover"; 59 + "{microslop@4o4}" = "microslop"; 60 + "@crw-extension-firefox" = "consumer-rights-wiki"; 61 + }) 62 + // { 63 + "magnolia@12.34" = { 64 + install_url = "https://gitflic.ru/project/magnolia1234/bpc_uploads/blob/raw?file=bypass_paywalls_clean-latest.xpi"; 65 + installation_mode = "force_installed"; 66 + }; 67 + }; 68 + }; 69 + }
+22
modules/programs/gui/zen/mods.nix
··· 1 + { 2 + flake.modules.homeManager.zen = { 3 + programs.zen-browser.profiles.default.mods = [ 4 + # keep-sorted start newline_separated=yes 5 + # Customize the zen context menu. 6 + "81fcd6b3-f014-4796-988f-6c3cb3874db8" 7 + 8 + # Show a floating status bar. 9 + "906c6915-5677-48ff-9bfc-096a02a72379" 10 + 11 + # Use better find bar. 12 + "a6335949-4465-4b71-926c-4a52d34bc9c0" 13 + 14 + # Enable ghost tabs. 15 + "c01d3e22-1cee-45c1-a25e-53c0f180eea8" 16 + 17 + # Disable highlight split. 18 + "f50841b2-5e4a-4534-985d-b7f7b96088c2" 19 + # keep-sorted end 20 + ]; 21 + }; 22 + }
+49
modules/programs/gui/zen/policies.nix
··· 1 + { 2 + flake.modules.homeManager.zen = { 3 + programs.zen-browser.policies = { 4 + # keep-sorted start 5 + AutofillAddressEnabled = false; 6 + AutofillCreditCardEnabled = false; 7 + DisableAppUpdate = true; 8 + DisableFeedbackCommands = true; 9 + DisableFirefoxScreenshots = true; 10 + DisableFirefoxStudies = true; 11 + DisableForgetButton = true; 12 + DisableFormHistory = true; 13 + DisableMasterPasswordCreation = true; 14 + DisablePasswordReveal = true; 15 + DisablePocket = true; 16 + DisableSafeMode = true; 17 + DisableSetDesktopBackground = true; 18 + DisableTelemetry = true; 19 + DontCheckDefaultBrowser = true; 20 + HttpsOnlyMode = true; 21 + NoDefaultBookmarks = true; 22 + OfferToSaveLogins = false; 23 + PDFjs.Enabled = false; 24 + PasswordManagerEnabled = false; 25 + SearchSuggestEnabled = false; 26 + SkipTermsOfUse = true; 27 + StartDownloadsInTempDirectory = true; 28 + TranslateEnabled = false; 29 + # keep-sorted end 30 + 31 + # keep-sorted start block=yes newline_separated=yes 32 + EnableTrackingProtection = { 33 + Value = true; 34 + Locked = true; 35 + Cryptomining = true; 36 + Fingerprinting = true; 37 + }; 38 + 39 + GenerativeAI = { 40 + Enabled = false; 41 + Chatbot = false; 42 + LinkPreviews = false; 43 + TabGroups = false; 44 + Locked = true; 45 + }; 46 + # keep-sorted end 47 + }; 48 + }; 49 + }
+565
modules/programs/gui/zen/preferences.nix
··· 1 + { 2 + flake.modules.homeManager.zen = { 3 + # keep-sorted start 4 + config, 5 + lib, 6 + vars, 7 + # keep-sorted end 8 + ... 9 + }: let 10 + inherit 11 + (lib) 12 + # keep-sorted start 13 + concatMapAttrs 14 + isAttrs 15 + mkEnableOption 16 + mkOption 17 + types 18 + # keep-sorted end 19 + ; 20 + inherit (vars) countryCode; 21 + in { 22 + options.zen-browser = { 23 + # keep-sorted start block=yes newline_separated=yes 24 + commit-space = mkOption { 25 + type = types.int; 26 + description = "Memory threshold (in MiB) at which tabs are unloaded when available commit space is low"; 27 + }; 28 + 29 + travel.enable = mkEnableOption "Enable travel specific preferences."; 30 + # keep-sorted end 31 + }; 32 + 33 + config.programs.zen-browser.profiles.default.settings = let 34 + # keep-sorted start 35 + cfgCommitSpace = config.zen-browser.commit-space; 36 + cfgTravel = config.zen-browser.travel.enable; 37 + # keep-sorted end 38 + 39 + flattenSettings = prefix: 40 + concatMapAttrs (name: value: let 41 + key = 42 + if prefix == "" 43 + then name 44 + else "${prefix}.${name}"; 45 + in 46 + if isAttrs value 47 + then flattenSettings key value 48 + else {${key} = value;}); 49 + in 50 + flattenSettings "" { 51 + # keep-sorted start 52 + captivedetect.canonicalURL = " "; 53 + content.notify.interval = 100000; 54 + devtools.selfxss.count = 0; 55 + doh-rollout.home-region = countryCode; 56 + lightweightThemes.getMoreURL = " "; 57 + pdfjs.sidebarViewOnLoad = 0; 58 + plain_text.wrap_long_lines = false; 59 + reader.parse-on-load.enabled = false; 60 + ui.key.menuAccessKey = 0; 61 + # keep-sorted end 62 + 63 + # keep-sorted start block=yes newline_separated=yes 64 + browser = { 65 + # keep-sorted start 66 + aboutConfig.showWarning = false; 67 + bookmarks.max_backups = 1; 68 + download.always_ask_before_handling_new_types = false; 69 + link.open_newwindow.restriction = 0; 70 + promo.focus.enabled = false; 71 + theme.dark-private-windows = false; 72 + topsites.useRemoteSetting = false; 73 + vpn_promo.enabled = false; 74 + warnOnQuitShortcut = false; 75 + # keep-sorted end 76 + 77 + # keep-sorted start 78 + low_commit_space_threshold_mb = cfgCommitSpace; 79 + low_commit_space_threshold_percent = 20; 80 + # keep-sorted end 81 + 82 + # keep-sorted start block=yes newline_separated=yes 83 + cache = { 84 + # keep-sorted start 85 + frecency_half_life_hours = 12; 86 + max_shutdown_io_lag = 16; 87 + # keep-sorted end 88 + 89 + # keep-sorted start block=yes newline_separated=yes 90 + disk = { 91 + smart_size.enabled = false; 92 + 93 + # keep-sorted start 94 + capacity = 8192000; 95 + metadata_memory_limit = 15360; 96 + # keep-sorted end 97 + }; 98 + 99 + memory = { 100 + # keep-sorted start 101 + capacity = 131072; 102 + max_entry_size = 327680; 103 + # keep-sorted end 104 + }; 105 + # keep-sorted end 106 + }; 107 + 108 + contentblocking = { 109 + # keep-sorted start block=yes newline_separated=yes 110 + category = "strict"; 111 + 112 + report = { 113 + # keep-sorted start 114 + hide_vpn_banner = true; 115 + lockwise.enabled = false; 116 + # keep-sorted end 117 + }; 118 + # keep-sorted end 119 + }; 120 + 121 + newtabpage.activity-stream = { 122 + # keep-sorted start 123 + default.sites = " "; 124 + feeds.section.topstories.options = "{\"hidden\":true}"; 125 + # keep-sorted end 126 + 127 + # keep-sorted start block=yes newline_separated=yes 128 + newtabWallpapers.v2.enabled = false; 129 + 130 + section.highlights = { 131 + # keep-sorted start 132 + includeDownloads = false; 133 + includeVisited = false; 134 + # keep-sorted end 135 + }; 136 + # keep-sorted end 137 + }; 138 + 139 + region = { 140 + # keep-sorted start 141 + network.url = " "; 142 + update.enabled = false; 143 + # keep-sorted end 144 + }; 145 + 146 + safebrowsing = { 147 + # keep-sorted start 148 + blockedURIs.enabled = false; 149 + malware.enabled = false; 150 + phishing.enabled = false; 151 + # keep-sorted end 152 + 153 + # keep-sorted start block=yes newline_separated=yes 154 + downloads = { 155 + # keep-sorted start 156 + dangerous.enabled = false; 157 + enabled = false; 158 + # keep-sorted end 159 + 160 + remote = { 161 + enabled = false; 162 + 163 + # keep-sorted start 164 + block_dangerous = false; 165 + block_dangerous_host = false; 166 + block_potentially_unwanted = false; 167 + block_uncommon = false; 168 + # keep-sorted end 169 + 170 + url = " "; 171 + }; 172 + }; 173 + 174 + provider = { 175 + # keep-sorted start block=yes newline_separated=yes 176 + google = { 177 + # keep-sorted start 178 + gethashURL = " "; 179 + reportURL = " "; 180 + updateURL = " "; 181 + # keep-sorted end 182 + }; 183 + 184 + google4 = { 185 + # keep-sorted start 186 + dataSharingURL = " "; 187 + gethashURL = " "; 188 + updateURL = " "; 189 + # keep-sorted end 190 + }; 191 + # keep-sorted end 192 + }; 193 + # keep-sorted end 194 + }; 195 + 196 + search = { 197 + # keep-sorted start 198 + separatePrivateDefault.ui.enabled = false; 199 + suggest.enabled.private = true; 200 + # keep-sorted end 201 + 202 + serpEventTelemetryCategorization = { 203 + # keep-sorted start 204 + enabled = false; 205 + regionEnabled = false; 206 + # keep-sorted end 207 + }; 208 + }; 209 + 210 + tabs = { 211 + # keep-sorted start 212 + min_inactive_duration_before_unload = 300000; 213 + searchclipboardfor.middleclick = false; 214 + unloadOnLowMemory = true; 215 + # keep-sorted end 216 + }; 217 + 218 + urlbar = { 219 + # keep-sorted start 220 + addons.featureGate = true; 221 + autoFill.adaptiveHistory.enabled = true; 222 + # keep-sorted end 223 + 224 + suggest = { 225 + # keep-sorted start 226 + clipboard = false; 227 + fakespot = false; 228 + quickactions = false; 229 + trending = false; 230 + weather = false; 231 + yelp = false; 232 + # keep-sorted end 233 + }; 234 + }; 235 + # keep-sorted end 236 + }; 237 + 238 + dom = { 239 + # keep-sorted start 240 + disable_window_move_resize = true; 241 + text_fragments.create_text_fragment.enabled = true; 242 + # keep-sorted end 243 + 244 + # keep-sorted start block=yes newline_separated=yes 245 + security = { 246 + # keep-sorted start 247 + https_only_mode.upgrade_onion = true; 248 + https_only_mode_pbm = true; 249 + # keep-sorted end 250 + }; 251 + 252 + timeout = { 253 + # keep-sorted start 254 + budget_throttling_max_delay = 0; 255 + throttling_delay = 40; 256 + # keep-sorted end 257 + }; 258 + 259 + webgpu = { 260 + # keep-sorted start 261 + enabled = true; 262 + service-workers.enabled = true; 263 + # keep-sorted end 264 + }; 265 + 266 + # keep-sorted end 267 + }; 268 + 269 + extensions = { 270 + # keep-sorted start 271 + autoDisableScopes = 0; 272 + enabledScopes = 7; 273 + postDownloadThirdPartyPrompt = false; 274 + # keep-sorted end 275 + 276 + # keep-sorted start 277 + webcompat-reporter.newIssueEndpoint = " "; 278 + webextensions.restrictedDomains = " "; 279 + # keep-sorted end 280 + 281 + pocket = { 282 + # keep-sorted start 283 + quarantinedDomains.enabled = false; 284 + showHome = false; 285 + # keep-sorted end 286 + 287 + # keep-sorted start 288 + api = " "; 289 + oAuthConsumerKey = " "; 290 + site = " "; 291 + # keep-sorted end 292 + }; 293 + }; 294 + 295 + general = { 296 + # keep-sorted start 297 + autoScroll = false; 298 + useragent.compatMode.firefox = true; 299 + # keep-sorted end 300 + }; 301 + 302 + gfx = { 303 + # keep-sorted start 304 + content.skia-font-cache-size = 80; 305 + webgpu.ignore-blocklist = true; 306 + # keep-sorted end 307 + 308 + # keep-sorted start block=yes newline_separated=yes 309 + canvas.accelerated = { 310 + # keep-sorted start 311 + cache-items = 32768; 312 + cache-size = 4096; 313 + # keep-sorted end 314 + }; 315 + 316 + webrender = { 317 + # keep-sorted start 318 + all = true; 319 + precache-shaders = true; 320 + program-binary-disk = true; 321 + quality.force-subpixel-aa-where-possible = true; 322 + # keep-sorted end 323 + 324 + "compositor" = true; 325 + }; 326 + 327 + # keep-sorted end 328 + }; 329 + 330 + image = { 331 + # keep-sorted start block=yes newline_separated=yes 332 + cache.size = 10485760; 333 + 334 + mem = { 335 + # keep-sorted start 336 + decode_bytes_at_a_time = 65536; 337 + shared.unmap.min_expiration_ms = 120000; 338 + # keep-sorted end 339 + }; 340 + # keep-sorted end 341 + }; 342 + 343 + javascript.options = { 344 + # keep-sorted start 345 + baselinejit.threshold = 50; 346 + concurrent_multiprocess_gcs.cpu_divisor = 8; 347 + ion.threshold = 5000; 348 + # keep-sorted end 349 + }; 350 + 351 + layers = { 352 + acceleration.force-enabled = true; 353 + mlgpu.enabled = true; 354 + 355 + gpu-process = { 356 + enabled = true; 357 + force-enabled = true; 358 + }; 359 + }; 360 + 361 + layout = { 362 + # keep-sorted start block=yes newline_separated=yes 363 + css = { 364 + # keep-sorted start 365 + grid-template-masonry-value.enabled = true; 366 + moz-document.content.enabled = true; 367 + # keep-sorted end 368 + }; 369 + 370 + spellcheckDefault = 2; 371 + # keep-sorted end 372 + }; 373 + 374 + media = { 375 + # keep-sorted start 376 + autoplay.default = 5; 377 + hardware-video-decoding.force-enabled = true; 378 + # keep-sorted end 379 + 380 + # keep-sorted start 381 + gpu-process-decoder = true; 382 + gpu-process-encoder = true; 383 + # keep-sorted end 384 + 385 + # keep-sorted start 386 + cache_readahead_limit = 7200; 387 + cache_resume_threshold = 3600; 388 + # keep-sorted end 389 + 390 + # keep-sorted start 391 + memory_cache_max_size = 1048576; 392 + memory_caches_combined_limit_kb = 3145728; 393 + memory_caches_combined_limit_pc_sysmem = 10; 394 + # keep-sorted end 395 + }; 396 + 397 + network = { 398 + # keep-sorted start 399 + captive-portal-service.enabled = cfgTravel; 400 + connectivity-service.enabled = false; 401 + # keep-sorted end 402 + 403 + # keep-sorted start 404 + auth.subresource-http-auth-allow = 1; 405 + ssl_tokens_cache_capacity = 32768; 406 + trr.mode = 2; 407 + # keep-sorted end 408 + 409 + # keep-sorted start 410 + dnsCacheEntries = 1000; 411 + dnsCacheExpiration = 3600; 412 + dnsCacheExpirationGracePeriod = 240; 413 + # keep-sorted end 414 + 415 + # keep-sorted start block=yes newline_separated=yes 416 + buffer.cache = { 417 + # keep-sorted start 418 + count = 48; 419 + size = 65535; 420 + # keep-sorted end 421 + }; 422 + 423 + http = { 424 + referer.XOriginTrimmingPolicy = 2; 425 + 426 + # keep-sorted start 427 + max-connections = 1800; 428 + max-persistent-connections-per-proxy = 48; 429 + max-persistent-connections-per-server = 10; 430 + max-urgent-start-excessive-connections-per-host = 5; 431 + # keep-sorted end 432 + 433 + pacing.requests = { 434 + enabled = false; 435 + 436 + # keep-sorted start 437 + burst = 14; 438 + min-parallelism = 10; 439 + # keep-sorted end 440 + }; 441 + # keep-sorted end 442 + }; 443 + 444 + predictor = { 445 + enable-prefetch = true; 446 + 447 + # keep-sorted start 448 + max-resources-per-entry = 250; 449 + max-uri-length = 1000; 450 + # keep-sorted end 451 + 452 + # keep-sorted start 453 + preconnect-min-confidence = 20; 454 + preresolve-min-confidence = 10; 455 + # keep-sorted end 456 + 457 + # keep-sorted start 458 + prefetch-force-valid-for = 3600; 459 + prefetch-min-confidence = 30; 460 + prefetch-rolling-load-count = 120; 461 + # keep-sorted end 462 + }; 463 + }; 464 + 465 + nglayout.initialpaint = { 466 + # keep-sorted start 467 + delay = 0; 468 + delay_in_oopif = 0; 469 + # keep-sorted end 470 + }; 471 + 472 + permissions = { 473 + # keep-sorted start block=yes newline_separated=yes 474 + default = { 475 + # keep-sorted start 476 + desktop-notification = 2; 477 + xr = 2; 478 + # keep-sorted end 479 + }; 480 + 481 + manager.defaultsUrl = " "; 482 + # keep-sorted end 483 + }; 484 + 485 + privacy = { 486 + # keep-sorted start 487 + donottrackheader.enabled = true; 488 + globalprivacycontrol.enabled = true; 489 + # keep-sorted end 490 + }; 491 + 492 + security = { 493 + # keep-sorted start block=yes newline_separated=yes 494 + OCSP = { 495 + require = true; 496 + enabled = 2; 497 + }; 498 + 499 + cert_pinning.enforcement_level = 2; 500 + 501 + ssl = { 502 + # keep-sorted start 503 + require_safe_negotiation = true; 504 + treat_unsafe_negotiation_as_broken = true; 505 + # keep-sorted end 506 + }; 507 + # keep-sorted end 508 + }; 509 + 510 + signon = { 511 + # keep-sorted start 512 + autofillForms = false; 513 + formlessCapture.enabled = false; 514 + management.page.breach-alerts.enabled = false; 515 + # keep-sorted end 516 + }; 517 + 518 + toolkit.telemetry = { 519 + # keep-sorted start 520 + cachedClientID = " "; 521 + server_owner = " "; 522 + # keep-sorted end 523 + }; 524 + 525 + widget = { 526 + # keep-sorted start block=yes newline_separated=yes 527 + gtk.non-native-titlebar-buttons.enabled = true; 528 + 529 + use-xdg-desktop-portal = { 530 + # keep-sorted start 531 + file-picker = 1; 532 + mime-handler = 1; 533 + open-uri = 1; 534 + # keep-sorted end 535 + }; 536 + # keep-sorted end 537 + }; 538 + 539 + zen = { 540 + # keep-sorted start 541 + view.experimental-no-window-controls = true; 542 + watermark.enabled = false; 543 + welcome-screen.seen = true; 544 + # keep-sorted end 545 + 546 + # keep-sorted start block=yes newline_separated=yes 547 + urlbar = { 548 + # keep-sorted start 549 + behavior = "float"; 550 + show-pip-button = true; 551 + # keep-sorted end 552 + }; 553 + 554 + workspaces = { 555 + # keep-sorted start 556 + continue-where-left-off = true; 557 + separate-essentials = false; 558 + # keep-sorted end 559 + }; 560 + # keep-sorted end 561 + }; 562 + # keep-sorted end 563 + }; 564 + }; 565 + }
+246
modules/programs/gui/zen/search.nix
··· 1 + { 2 + flake.modules.homeManager.zen = {pkgs, ...}: { 3 + programs.zen-browser.profiles.default = { 4 + search = { 5 + force = true; 6 + default = "brave"; 7 + engines = let 8 + nixIcon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; 9 + in { 10 + # General search engines. 11 + brave = { 12 + urls = [ 13 + { 14 + template = "https://search.brave.com/search"; 15 + params = [ 16 + { 17 + name = "q"; 18 + value = "{searchTerms}"; 19 + } 20 + ]; 21 + } 22 + ]; 23 + iconMapObj."16" = "https://brave.com/favicon.ico"; 24 + definedAliases = ["@b"]; 25 + }; 26 + google.metaData.alias = "@g"; 27 + 28 + # Wiki search engines. 29 + wikiwand = { 30 + urls = [ 31 + { 32 + template = "https://www.wikiwand.com/en/search"; 33 + params = [ 34 + { 35 + name = "q"; 36 + value = "{searchTerms}"; 37 + } 38 + ]; 39 + } 40 + ]; 41 + iconMapObj."16" = "https://wikiwand.com/favicon.ico"; 42 + definedAliases = ["@wi"]; 43 + }; 44 + 45 + # Media search engines. 46 + youtube = { 47 + urls = [ 48 + { 49 + template = "https://www.youtube.com/results"; 50 + params = [ 51 + { 52 + name = "search_query"; 53 + value = "{searchTerms}"; 54 + } 55 + ]; 56 + } 57 + ]; 58 + iconMapObj."16" = "https://www.youtube.com/favicon.ico"; 59 + definedAliases = ["@yt"]; 60 + }; 61 + 62 + # Disabled (hidden). 63 + bing.metaData.hidden = true; 64 + ddg.metaData.hidden = true; 65 + qwant.metaData.hidden = true; 66 + ecosia.metaData.hidden = true; 67 + 68 + # Nix related search engines. 69 + nix = { 70 + urls = [ 71 + { 72 + template = "https://searchix.ovh/"; 73 + params = [ 74 + { 75 + name = "query"; 76 + value = "{searchTerms}"; 77 + } 78 + ]; 79 + } 80 + ]; 81 + icon = nixIcon; 82 + definedAliases = ["@n"]; 83 + }; 84 + nixos = { 85 + urls = [ 86 + { 87 + template = "https://searchix.ovh/options/nixos/search"; 88 + params = [ 89 + { 90 + name = "query"; 91 + value = "{searchTerms}"; 92 + } 93 + ]; 94 + } 95 + ]; 96 + icon = nixIcon; 97 + definedAliases = ["@no"]; 98 + }; 99 + "home-manager" = { 100 + urls = [ 101 + { 102 + template = "https://searchix.ovh/options/home-manager/search"; 103 + params = [ 104 + { 105 + name = "query"; 106 + value = "{searchTerms}"; 107 + } 108 + ]; 109 + } 110 + ]; 111 + icon = nixIcon; 112 + definedAliases = ["@hm"]; 113 + }; 114 + "nix-packages" = { 115 + urls = [ 116 + { 117 + template = "https://searchix.ovh/packages/nixpkgs/search"; 118 + params = [ 119 + { 120 + name = "query"; 121 + value = "{searchTerms}"; 122 + } 123 + ]; 124 + } 125 + ]; 126 + icon = nixIcon; 127 + definedAliases = ["@np"]; 128 + }; 129 + nur = { 130 + urls = [ 131 + { 132 + template = "https://searchix.ovh/packages/nur/search"; 133 + params = [ 134 + { 135 + name = "query"; 136 + value = "{searchTerms}"; 137 + } 138 + ]; 139 + } 140 + ]; 141 + icon = nixIcon; 142 + definedAliases = ["@nu"]; 143 + }; 144 + 145 + # Wiki. 146 + "nixos-wiki" = { 147 + urls = [ 148 + { 149 + template = "https://wiki.nixos.org/w/index.php"; 150 + params = [ 151 + { 152 + name = "search"; 153 + value = "{searchTerms}"; 154 + } 155 + ]; 156 + } 157 + ]; 158 + icon = nixIcon; 159 + definedAliases = ["@nw"]; 160 + }; 161 + "arch-wiki" = { 162 + urls = [ 163 + { 164 + template = "https://wiki.archlinux.org/index.php"; 165 + params = [ 166 + { 167 + name = "search"; 168 + value = "{searchTerms}"; 169 + } 170 + ]; 171 + } 172 + ]; 173 + icon = nixIcon; 174 + definedAliases = ["@aw"]; 175 + }; 176 + "minecraft-wiki" = { 177 + urls = [ 178 + { 179 + template = "https://minecraft.wiki/"; 180 + params = [ 181 + { 182 + name = "search"; 183 + value = "{searchTerms}"; 184 + } 185 + ]; 186 + } 187 + ]; 188 + iconMapObj."16" = "https://minecraft.wiki/favicon.ico"; 189 + definedAliases = ["@mw"]; 190 + }; 191 + 192 + # Development resources. 193 + crates = { 194 + urls = [ 195 + { 196 + template = "https://crates.io/search"; 197 + params = [ 198 + { 199 + name = "q"; 200 + value = "{searchTerms}"; 201 + } 202 + ]; 203 + } 204 + ]; 205 + iconMapObj."16" = "https://crates.io/favicon.ico"; 206 + definedAliases = ["@c"]; 207 + }; 208 + dockerhub = { 209 + urls = [ 210 + { 211 + template = "https://hub.docker.com/search"; 212 + params = [ 213 + { 214 + name = "q"; 215 + value = "{searchTerms}"; 216 + } 217 + ]; 218 + } 219 + ]; 220 + iconMapObj."16" = "https://www.docker.com/favicon.ico"; 221 + definedAliases = ["@dh"]; 222 + }; 223 + github = { 224 + urls = [ 225 + { 226 + template = "https://github.com/search"; 227 + params = [ 228 + { 229 + name = "q"; 230 + value = "{searchTerms}"; 231 + } 232 + { 233 + name = "type"; 234 + value = "repositories"; 235 + } 236 + ]; 237 + } 238 + ]; 239 + iconMapObj."16" = "https://github.com/favicon.ico"; 240 + definedAliases = ["@gh"]; 241 + }; 242 + }; 243 + }; 244 + }; 245 + }; 246 + }
+34
modules/programs/gui/zen/spaces.nix
··· 1 + { 2 + flake.modules.homeManager.zen = { 3 + programs.zen-browser.profiles.default = { 4 + spacesForce = true; 5 + spaces = { 6 + # keep-sorted start block=yes newline_separated=yes 7 + "dev" = { 8 + id = "9b41acc7-1eb2-4c14-9fba-7f6d670db845"; 9 + position = 2000; 10 + icon = "🖥️"; 11 + }; 12 + 13 + "gaming" = { 14 + id = "70e211cd-676f-4abb-9317-35fac2078913"; 15 + position = 3000; 16 + icon = "🎮"; 17 + }; 18 + 19 + "general" = { 20 + id = "29680918-95d2-4162-ba72-1c41bd1b628d"; 21 + position = 1000; 22 + icon = "🧶"; 23 + }; 24 + 25 + "news" = { 26 + id = "b2e284cd-b0d6-4d05-9b0a-9021148ff0bb"; 27 + position = 4000; 28 + icon = "🗞️"; 29 + }; 30 + # keep-sorted end 31 + }; 32 + }; 33 + }; 34 + }
+10
modules/services/ananicy.nix
··· 1 + { 2 + flake.modules.nixos.ananicy = {pkgs, ...}: { 3 + services.ananicy = { 4 + enable = true; 5 + package = pkgs.ananicy-cpp; 6 + 7 + rulesProvider = pkgs.ananicy-rules-cachyos; 8 + }; 9 + }; 10 + }
+13
modules/services/avahi.nix
··· 1 + { 2 + flake.modules.nixos.avahi = { 3 + # mDNS/DNS-SD discovery for the local network. 4 + services.avahi = { 5 + enable = true; 6 + 7 + # keep-sorted start numeric=yes 8 + nssmdns4 = true; 9 + nssmdns6 = true; 10 + # keep-sorted end 11 + }; 12 + }; 13 + }
+20
modules/services/gnome-keyring.nix
··· 1 + { 2 + flake.modules.nixos.gnome-keyring = { 3 + # keep-sorted start block=yes newline_separated=yes 4 + security.pam.services = { 5 + greetd.enableGnomeKeyring = true; 6 + login.enableGnomeKeyring = true; 7 + }; 8 + 9 + services.gnome = { 10 + # keep-sorted start newline_separated=yes 11 + # Disable the gcr SSH agent managed by GNOME. 12 + gcr-ssh-agent.enable = false; 13 + 14 + # Start keyring services for secret storage. 15 + gnome-keyring.enable = true; 16 + # keep-sorted end 17 + }; 18 + # keep-sorted end 19 + }; 20 + }
+11
modules/services/gvfs.nix
··· 1 + { 2 + flake.modules.nixos.gvfs = {pkgs, ...}: { 3 + # GIO/GVFS backends: trash, SMB/MTP/AFC, network mounts, and more. 4 + services.gvfs = { 5 + enable = true; 6 + 7 + # Use minimal gvfs without the full GNOME desktop. 8 + package = pkgs.gvfs; 9 + }; 10 + }; 11 + }
+205
plan.md
··· 1 + Migration Plan 2 + flake-file: 3 + 4 + - flake.nix should become generated output, not hand-maintained. 5 + - Source-of-truth lives under modules/. 6 + - Use inputs.flake-file.flakeModules.dendritic for the dendritic setup. 7 + - Declare inputs through flake-file.inputs, preferably close to the module that needs them. 8 + - Generate with nix run .#write-flake after bootstrapping, or bootstrap with write-flake --arg modules ./modules. 9 + 10 + flake-parts: 11 + 12 + - Each file under modules/ should be a flake-parts module. 13 + - Use perSystem for packages, dev shells, formatter, checks. 14 + - Use flake.nixosConfigurations for hosts. 15 + - Use flake.modules.nixos.* and flake.modules.homeManager.* for reusable feature/aspect modules. 16 + - Use withSystem when host construction needs per-system packages or inputs. 17 + 18 + import-tree: 19 + 20 + - Keep it incidental. It is mainly the recursive loader behind the dendritic pattern. 21 + - Paths prefixed with _ are ignored by import-tree. 22 + 23 + Target Layout 24 + Based on the current ~/Infra template and your existing /home/adam0/Nixos structure: 25 + ~/Infra/ 26 + assets/ 27 + face.png 28 + logo.png 29 + modules/ 30 + nix/ 31 + dendritic.nix 32 + inputs.nix 33 + systems.nix 34 + treefmt.nix 35 + devshell.nix 36 + hosts/ 37 + desktop.nix 38 + laptop.nix 39 + vm.nix 40 + profiles/ 41 + base.nix 42 + desktop.nix 43 + laptop.nix 44 + vm.nix 45 + nixos/ 46 + boot.nix 47 + disk.nix 48 + locale.nix 49 + nix.nix 50 + sops.nix 51 + user.nix 52 + tweaks.nix 53 + nixos/services/ 54 + ananicy.nix 55 + avahi.nix 56 + bluetooth.nix 57 + geoclue.nix 58 + gnome-keyring.nix 59 + gvfs.nix 60 + locate.nix 61 + logind.nix 62 + network.nix 63 + other.nix 64 + pipewire.nix 65 + podman.nix 66 + printing.nix 67 + scx.nix 68 + ssh.nix 69 + timesyncd.nix 70 + timezone.nix 71 + tlp.nix 72 + zram.nix 73 + nixos/desktop/ 74 + hyprland.nix 75 + stylix.nix 76 + tablet.nix 77 + tuigreet.nix 78 + xdg-portal.nix 79 + nixos/gui/ 80 + lsfg.nix 81 + other.nix 82 + steam.nix 83 + virt-manager.nix 84 + nixos/cli/ 85 + man.nix 86 + nh.nix 87 + other.nix 88 + sudo-rs.nix 89 + home/ 90 + base.nix 91 + desktop.nix 92 + laptop.nix 93 + vm.nix 94 + packages/ 95 + default.nix 96 + scripts.nix 97 + lutris.nix 98 + nocheatsheet-nvim.nix 99 + telescope-all-recent-nvim.nix 100 + zaread.nix 101 + lib/ 102 + default.nix 103 + keys/ 104 + secrets/ 105 + vars.nix 106 + .sops.yaml 107 + .envrc 108 + README.md 109 + THIRD_PARTY_NOTICES.md 110 + Phase 1: Bootstrap Flake-File 111 + 112 + 1. Keep ~/Infra/flake.nix temporary until generation works. 113 + 2. Move optional inputs closer to usage later: 114 + - Hyprland-related inputs near Hyprland modules. 115 + - Stylix near Stylix module. 116 + - Nixcord/spicetify/zen/noctalia near home modules. 117 + - Kernel/boot inputs near boot modules. 118 + Phase 2: Move Flake-Parts Infrastructure 119 + 3. Move existing /home/adam0/Nixos/flake/treefmt.nix to modules/nix/treefmt.nix. 120 + 4. Move existing /home/adam0/Nixos/flake/devshell.nix to modules/nix/devshell.nix. 121 + 5. Convert package wiring from /home/adam0/Nixos/pkgs/default.nix into modules/packages/default.nix as perSystem.packages. 122 + 6. Keep systems = import inputs.systems in a small modules/nix/systems.nix. 123 + Phase 3: Convert NixOS Modules Into Dendritic Aspects 124 + 7. Current modules/system/*.nix files should stop being imported as one big tree. 125 + 8. Each should become a named exported module: 126 + - flake.modules.nixos.base 127 + - flake.modules.nixos.nix 128 + - flake.modules.nixos.sops 129 + - flake.modules.nixos.hyprland 130 + - flake.modules.nixos.pipewire 131 + - etc. 132 + 9. Preserve most module bodies as-is. The migration is mostly wrapping each module under flake.modules.nixos.<name> = { ... };. 133 + 10. Avoid large rewrites while migrating. First goal is equivalent behavior. 134 + Phase 4: Split Host Composition 135 + 11. Replace current mkHost style from /home/adam0/Nixos/flake/nixos.nix with one host file per host: 136 + - modules/hosts/desktop.nix 137 + - modules/hosts/laptop.nix 138 + - modules/hosts/vm.nix 139 + 12. Each host file defines flake.nixosConfigurations.<host>. 140 + 13. Each host composes modules from inputs.self.modules.nixos. 141 + 14. Host-specific hardware stays host-local. 142 + 15. Host-specific home-manager overrides move to modules/home/<host>.nix or inline host composition. 143 + Example composition shape: 144 + { 145 + 146 + inputs, 147 + withSystem, 148 + ... 149 + }: { 150 + 151 + flake.nixosConfigurations.laptop = withSystem "x86_64-linux" ({config, ...}: 152 + inputs.nixpkgs.lib.nixosSystem { 153 + system = "x86_64-linux"; 154 + modules = with inputs.self.modules.nixos; [ 155 + base 156 + nix 157 + sops 158 + disk 159 + user 160 + hyprland 161 + pipewire 162 + bluetooth 163 + tlp 164 + laptop 165 + ]; 166 + }); 167 + } 168 + Phase 5: Home-Manager Dendritic Modules 169 + 170 + 18. Convert home-manager settings into flake.modules.homeManager.*. 171 + 19. Keep user identity defaults in one user module. 172 + 20. Move host-specific home settings from: 173 + - modules/hosts/laptop/home.nix 174 + - modules/hosts/vm/home.nix 175 + - modules/hosts/desktop/home.nix 176 + 21. Compose home-manager modules from the NixOS host module through home-manager.users.${username}.imports. 177 + Phase 6: Input Locality Cleanup 178 + After equivalent behavior works: 179 + 22. Move hyprland, hyprland-plugins, hyprsplit, and tuigreet input declarations into desktop/Hyprland-related modules. 180 + 23. Move stylix into modules/nixos/desktop/stylix.nix. 181 + 24. Move nix-index-database into shell/CLI module. 182 + 25. Move nix-flatpak, millennium, spicetify-nix, nixcord, zen-browser, noctalia, oxicord, etc. into the feature module that consumes each input. 183 + 26. Keep only foundational inputs in modules/nix/inputs.nix. 184 + Phase 7: Generated Flake Workflow 185 + 27. Treat flake.nix as generated. 186 + 28. Generate it from modules/ using flake-file. 187 + 29. Verify generated flake.nix contains only inputs and generated outputs glue. 188 + 30. Add a check or workflow expectation that generated flake.nix is up to date. 189 + Commands for execution phase: 190 + nix run .#write-flake 191 + nix flake check 192 + Bootstrap fallback if .#write-flake is not available yet: 193 + nix-shell <https://github.com/vic/flake-file/archive/refs/heads/main.zip> \ 194 + -A flake-file.sh --run write-flake --arg modules ./modules 195 + Migration Order 196 + 31. Establish flake-file dendritic bootstrap in ~/Infra/modules/nix. 197 + 32. Port systems, treefmt, and devshell. 198 + 33. Port package outputs. 199 + 34. Export current NixOS modules as flake.modules.nixos.*. 200 + 35. Build laptop, desktop, and vm host compositions. 201 + 36. Port home-manager modules. 202 + 37. Move input declarations close to usage. 203 + 38. Generate flake.nix. 204 + 39. Run nix flake check. 205 + 40. Compare host builds against the old repo with nixos-rebuild build --flake .#<host>.
+515
todo.md
··· 1 + # Repo Migration Todo 2 + 3 + Checklist of repository files grouped by path for the dendritic migration. 4 + 5 + ## Root 6 + 7 + - [x] .envrc 8 + - [x] .gitignore 9 + - [ ] .luarc.json 10 + - [x] .sops.yaml 11 + - [ ] AGENTS.md 12 + - [x] LICENSE 13 + - [ ] README.md 14 + - [-] THIRD_PARTY_NOTICES.md 15 + - [x] face.png (moved to assets/face.png) 16 + - [-] flake.lock 17 + - [-] flake.nix 18 + - [x] vars.nix 19 + 20 + ## .github/ 21 + 22 + - [ ] dependabot.yml 23 + 24 + ## .github/workflows/ 25 + 26 + - [ ] ci.yml 27 + 28 + ## flake/ 29 + 30 + - [ ] devshell.nix 31 + - [ ] nixos.nix 32 + - [ ] treefmt.nix 33 + 34 + ## keys/users/ 35 + 36 + - [x] adam0.asc (moved to keys/) 37 + 38 + ## libs/ 39 + 40 + - [ ] attr-paths.nix 41 + - [ ] default.nix 42 + - [ ] env.nix 43 + - [ ] files.nix 44 + - [ ] mime.nix 45 + - [ ] starship.nix 46 + - [ ] stylix.nix 47 + 48 + ## modules/home/ 49 + 50 + - [ ] git.nix 51 + - [ ] gpg.nix 52 + - [ ] home.nix 53 + - [x] sops.nix (moved to modules/nix/sops.nix) 54 + - [ ] ssh.nix 55 + 56 + ## modules/home/cli/ 57 + 58 + (moved to modules/programs/cli) 59 + 60 + - [x] bat.nix 61 + - [x] bonsai.nix 62 + - [x] cpond.nix 63 + - [x] direnv.nix 64 + - [x] eza.nix 65 + - [x] fd.nix 66 + - [x] gh.nix 67 + - [ ] npm.nix (look at what to set in config) 68 + - [x] nys.nix 69 + - [ ] other.nix 70 + - [x] pipes.nix 71 + - [x] rumdl.nix 72 + - [x] systeroid.nix 73 + - [x] tlrc.nix 74 + - [x] zoxide.nix 75 + 76 + ### New files 77 + 78 + - [x] ripgrep.nix 79 + - [ ] bun.nix (look at what to set in config) 80 + 81 + ## modules/home/cli/fastfetch/ 82 + 83 + (moved to modules/programs/cli) 84 + 85 + - [x] default.nix 86 + - [x] logo.png (moved to assets/nix.png) 87 + 88 + ## modules/home/cli/fish/ 89 + 90 + - [ ] abbreviations.nix 91 + - [ ] aliases.nix 92 + - [ ] default.nix 93 + - [ ] plugins.nix 94 + 95 + ## modules/home/cli/fish/functions/ 96 + 97 + - [ ] fish_greeting.nix 98 + 99 + ## modules/home/cli/fish/functions/archive/ 100 + 101 + - [ ] 7z.nix 102 + - [ ] rar.nix 103 + - [ ] tar.nix 104 + - [ ] un7z.nix 105 + - [ ] unrar.nix 106 + - [ ] untar.nix 107 + - [ ] unzip.nix 108 + - [ ] zip.nix 109 + 110 + ## modules/home/cli/ripgrep-all/ 111 + 112 + - [ ] adapters.nix 113 + - [ ] default.nix 114 + 115 + ## modules/home/cli/ripgrep-all/adapters/ 116 + 117 + - [ ] gron.nix 118 + - [ ] other.nix 119 + 120 + ## modules/home/cli/starship/ 121 + 122 + - [ ] build.nix 123 + - [ ] container.nix 124 + - [ ] default.nix 125 + - [ ] disabled.nix 126 + - [ ] format.nix 127 + - [ ] general.nix 128 + - [ ] git.nix 129 + - [ ] languages.nix 130 + - [ ] runtimes.nix 131 + 132 + ## modules/home/desktop/ 133 + 134 + - [ ] default.nix 135 + - [ ] mangohud.nix 136 + - [ ] overzicht.nix 137 + 138 + ## modules/home/desktop/hyprland/ 139 + 140 + - [ ] appearance.nix 141 + - [ ] default.nix 142 + - [ ] general.nix 143 + - [ ] gestures.nix 144 + - [ ] keybinds.nix 145 + - [ ] monitors.nix 146 + - [ ] plugins.nix 147 + - [ ] rules.nix 148 + 149 + ## modules/home/desktop/noctalia/ 150 + 151 + - [ ] audio.nix 152 + - [ ] bar.nix 153 + - [ ] brightness.nix 154 + - [ ] calendar.nix 155 + - [ ] controlcenter.nix 156 + - [ ] default.nix 157 + - [ ] delobotomize.nix 158 + - [ ] dock.nix 159 + - [ ] general.nix 160 + - [ ] hooks.nix 161 + - [ ] idle.nix 162 + - [ ] launcher.nix 163 + - [ ] location.nix 164 + - [ ] network.nix 165 + - [ ] notifications.nix 166 + - [ ] plugins.nix 167 + - [ ] sessionmenu.nix 168 + - [ ] systemmonitor.nix 169 + - [ ] ui.nix 170 + - [ ] wallpaper.nix 171 + 172 + ## modules/home/desktop/noctalia/patches/ 173 + 174 + - [ ] noctalia-launcher-ipc.patch 175 + - [ ] noctalia-location-override.patch 176 + - [ ] noctalia-settings-fallback.patch 177 + 178 + ## modules/home/desktop/stylix/ 179 + 180 + - [ ] default.nix 181 + - [ ] delta.nix 182 + - [ ] disabled.nix 183 + - [ ] discord.nix 184 + - [ ] eza.nix 185 + - [ ] gtk.nix 186 + - [ ] hyprcursor.nix 187 + - [ ] noctalia.nix 188 + - [ ] opencode.nix 189 + - [ ] other.nix 190 + - [ ] overzicht.nix 191 + - [ ] spotify.nix 192 + - [ ] television.nix 193 + 194 + ## modules/home/desktop/xdg/ 195 + 196 + - [ ] applications.nix 197 + - [ ] autostart.nix 198 + - [ ] cleanup.nix 199 + - [ ] default.nix 200 + - [ ] portal.nix 201 + - [ ] terminal.nix 202 + 203 + ## modules/home/desktop/xdg/applications/ 204 + 205 + - [ ] audio.nix 206 + - [ ] code.nix 207 + - [ ] document-viewers.nix 208 + - [ ] files.nix 209 + - [ ] image-editors.nix 210 + - [ ] image-viewers.nix 211 + - [ ] protocols.nix 212 + - [ ] video.nix 213 + 214 + ## modules/home/gui/ 215 + 216 + - [ ] lutris.nix 217 + - [ ] onlyoffice.nix 218 + - [ ] other.nix 219 + - [ ] prism.nix 220 + - [ ] sober.nix 221 + - [ ] spotify.nix 222 + - [ ] zaread.nix 223 + - [ ] zathura.nix 224 + 225 + ## modules/home/gui/discord/ 226 + 227 + - [ ] default.nix 228 + 229 + ## modules/home/gui/discord/plugins/ 230 + 231 + - [ ] communication.nix 232 + - [ ] core.nix 233 + - [ ] integrations.nix 234 + - [ ] interface.nix 235 + - [ ] media.nix 236 + - [ ] social.nix 237 + 238 + ## modules/home/gui/discord/themes/ 239 + 240 + - [ ] snippets.css 241 + - [ ] system24.css 242 + 243 + ## modules/home/gui/ghostty/ 244 + 245 + - [ ] cursor.glsl 246 + - [ ] default.nix 247 + - [ ] keybinds.nix 248 + - [ ] settings.nix 249 + 250 + ## modules/home/gui/zen/ 251 + 252 + (moved to modules/programs/gui/zen) 253 + 254 + - [x] chrome.nix 255 + - [x] default.nix 256 + - [x] extensions.nix 257 + - [x] mods.nix 258 + - [x] policies.nix 259 + - [x] preferences.nix 260 + - [x] search.nix 261 + - [x] spaces.nix 262 + 263 + ## modules/home/services/ 264 + 265 + - [ ] flatpak.nix 266 + 267 + ## modules/home/tui/ 268 + 269 + - [ ] atuin.nix 270 + - [ ] bluetui.nix 271 + - [ ] btop.nix 272 + - [ ] cava.nix 273 + - [ ] fzf.nix 274 + - [ ] impala.nix 275 + - [ ] kmon.nix 276 + - [ ] nvtop.nix 277 + - [ ] other.nix 278 + - [ ] oxicord.nix 279 + - [ ] spotify-player.nix 280 + - [ ] wiremix.nix 281 + 282 + ## modules/home/tui/neovim/ 283 + 284 + - [ ] default.nix 285 + - [ ] keymap.nix 286 + - [ ] settings.nix 287 + - [ ] ui.nix 288 + 289 + ## modules/home/tui/neovim/components/ 290 + 291 + - [ ] autocomplete.nix 292 + - [ ] biscuits.nix 293 + - [ ] breadcrumbs.nix 294 + - [ ] bufferline.nix 295 + - [ ] cheatsheet.nix 296 + - [ ] dashboard.nix 297 + - [ ] dim.nix 298 + - [ ] git.nix 299 + - [ ] hardtime.nix 300 + - [ ] highlight.nix 301 + - [ ] indent.nix 302 + - [ ] notify.nix 303 + - [ ] presence.nix 304 + - [ ] profiler.nix 305 + - [ ] scroll.nix 306 + - [ ] scrollbar.nix 307 + - [ ] session.nix 308 + - [ ] statusline.nix 309 + - [ ] telescope.nix 310 + - [ ] yazi.nix 311 + 312 + ## modules/home/tui/neovim/languages/ 313 + 314 + - [ ] css.nix 315 + - [ ] default.nix 316 + - [ ] lua.nix 317 + - [ ] markdown.nix 318 + - [ ] nix.nix 319 + - [ ] other.nix 320 + - [ ] python.nix 321 + - [ ] rust.nix 322 + - [ ] toml.nix 323 + - [ ] typescript.nix 324 + 325 + ## modules/home/tui/opencode/ 326 + 327 + - [ ] default.nix 328 + - [ ] env.nix 329 + - [ ] formatter.nix 330 + - [ ] instructions.md 331 + - [ ] lsp.nix 332 + - [ ] mcp-wrappers.nix 333 + - [ ] plugins.nix 334 + - [ ] settings.nix 335 + 336 + ## modules/home/tui/opencode/skills/ 337 + 338 + - [ ] create-readme.md 339 + - [ ] default.nix 340 + - [ ] find-skills.md 341 + - [ ] nvf-config.md 342 + - [ ] uncodixfy.md 343 + 344 + ## modules/home/tui/opencode/skills/lazy-mcp/ 345 + 346 + - [ ] context7.md 347 + - [ ] github.md 348 + - [ ] grep-app.md 349 + 350 + ## modules/home/tui/opencode/skills/nix/ 351 + 352 + - [ ] debug.md 353 + - [ ] index.md 354 + - [ ] search.md 355 + 356 + ## modules/home/tui/television/ 357 + 358 + - [ ] channels.nix 359 + - [ ] default.nix 360 + - [ ] nix-search.nix 361 + - [ ] settings.nix 362 + 363 + ## modules/home/tui/television/channels/ 364 + 365 + - [ ] channels.nix 366 + - [ ] files.nix 367 + - [ ] man.nix 368 + - [ ] text.nix 369 + - [ ] tldr.nix 370 + - [ ] trash.nix 371 + - [ ] zoxide.nix 372 + 373 + ## modules/home/tui/yazi/ 374 + 375 + - [ ] default.nix 376 + - [ ] init.lua 377 + - [ ] keymap.nix 378 + - [ ] plugins.nix 379 + - [ ] settings.nix 380 + - [ ] theme.nix 381 + 382 + ## modules/home/tui/yazi/plugins/ 383 + 384 + - [ ] faster-piper.nix 385 + - [ ] mediainfo.nix 386 + - [ ] mount.nix 387 + - [ ] preview-cbz.nix 388 + - [ ] preview-epub.nix 389 + - [ ] preview-git.nix 390 + - [ ] recycle-bin.nix 391 + - [ ] relative-motions.nix 392 + - [ ] restore.nix 393 + - [ ] smart-enter.nix 394 + - [ ] smart-paste.nix 395 + - [ ] spot-audio.nix 396 + - [ ] spot-cbz.nix 397 + - [ ] spot-image.nix 398 + - [ ] spot-video.nix 399 + - [ ] tv.nix 400 + - [ ] ucp.nix 401 + 402 + ## modules/hosts/desktop/ 403 + 404 + - [ ] default.nix 405 + - [ ] hardware.nix 406 + - [ ] home.nix 407 + 408 + ## modules/hosts/laptop/ 409 + 410 + - [ ] default.nix 411 + - [ ] hardware.nix 412 + - [ ] home.nix 413 + 414 + ## modules/hosts/vm/ 415 + 416 + - [ ] default.nix 417 + - [ ] hardware.nix 418 + - [ ] home.nix 419 + 420 + ## modules/system/ 421 + 422 + - [ ] default.nix 423 + - [ ] disk.nix 424 + - [ ] locale.nix 425 + - [ ] nix.nix 426 + - [x] slim.nix (moved to modules/profiles/slim.nix) 427 + - [x] sops.nix (moved to modules/nix/sops.nix) 428 + - [x] tweaks.nix (moved to modules/profiles/tweaks.nix) 429 + - [ ] user.nix 430 + 431 + ## modules/system/cli/ 432 + 433 + (moved to modules/programs/cli) 434 + 435 + - [x] man.nix 436 + - [x] nh.nix 437 + - [x] other.nix (renamed to bandwhich.nix) 438 + - [x] sudo-rs.nix 439 + 440 + ## modules/system/desktop/ 441 + 442 + (moved to modules/desktop) 443 + 444 + - [ ] hyprland.nix 445 + - [ ] stylix.nix 446 + - [ ] tablet.nix 447 + - [x] tuigreet.nix 448 + - [ ] xdg-portal.nix 449 + 450 + ## modules/system/gui/ 451 + 452 + (moved to modules/programs/gui) 453 + 454 + - [ ] lsfg.nix 455 + - [ ] other.nix 456 + - [x] steam.nix 457 + - [ ] virt-manager.nix 458 + 459 + ## modules/system/services/ 460 + 461 + (moved to modules/services) 462 + 463 + - [x] ananicy.nix 464 + - [x] avahi.nix 465 + - [ ] bluetooth.nix 466 + - [ ] geoclue.nix 467 + - [x] gnome-keyring.nix 468 + - [x] gvfs.nix 469 + - [ ] locate.nix 470 + - [ ] logind.nix 471 + - [ ] network.nix 472 + - [ ] other.nix 473 + - [ ] pipewire.nix 474 + - [ ] podman.nix 475 + - [ ] printing.nix 476 + - [ ] scx.nix 477 + - [ ] ssh.nix 478 + - [ ] timesyncd.nix 479 + - [ ] timezone.nix 480 + - [ ] tlp.nix 481 + - [ ] zram.nix 482 + 483 + ## overlays/ 484 + 485 + - [ ] _inputs.nix 486 + - [ ] default.nix 487 + - [ ] envfs.nix 488 + - [ ] external-pkgs.nix 489 + - [ ] hyprland-plugins.nix 490 + - [ ] pkgs.nix 491 + - [ ] superhtml.nix 492 + - [ ] zaread.nix 493 + 494 + ## pkgs/ 495 + 496 + - [ ] default.nix 497 + - [ ] lutris.nix 498 + - [ ] nocheatsheet-nvim.nix 499 + - [ ] telescope-all-recent-nvim.nix 500 + - [ ] zaread.nix 501 + 502 + ## pkgs/scripts/ 503 + 504 + - [ ] performant-mode.nix 505 + - [ ] systemd-status-preview.nix 506 + - [ ] text-preview.nix 507 + 508 + ## pkgs/scripts/ripgrep-all-adapters/ 509 + 510 + - [ ] djvutorga-adapter.nix 511 + - [ ] pptx2md-adapter.nix 512 + 513 + ## secrets/ 514 + 515 + - [ ] secrets.yaml
+22
vars.nix
··· 1 + rec { 2 + # Identity shared across modules. 3 + # keep-sorted start 4 + fullName = "Adam0"; 5 + username = "adam0"; 6 + # keep-sorted end 7 + 8 + # Git and identity. 9 + # keep-sorted start 10 + gitPublicSshkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDk3Fc80bWSFt41iDx1pzhFHP8EzDwJwPiyrhVV01i+9 Authentication key alumail@protonmail.com"; 11 + gitSigningKey = "0FFE5DE6328D5EC9"; 12 + gitUsername = "${username}1110"; 13 + # keep-sorted end 14 + 15 + # Regional defaults for locale-sensitive modules. 16 + # keep-sorted start 17 + countryCode = "NL"; 18 + defaultLocale = "en_US.UTF-8"; 19 + noctaliaFirstDayOfWeek = 1; 20 + regionalLocale = "nl_${countryCode}.UTF-8"; 21 + # keep-sorted end 22 + }