From 1f978da586c8c3e6c6fd6f6eb94b14c3a470507d Mon Sep 17 00:00:00 2001 From: asnev Date: Mon, 7 Sep 2026 03:21:32 +0700 Subject: [PATCH] unliterated my config --- .gitignore | 2 +- LICENSE | 2 - flake.lock | 6 +- flake.nix | 440 +------ home/coyote/default.nix | 176 +++ home/coyote/vim.nix | 70 + hosts/phostron/configuration.nix | 23 + hosts/phostron/default.nix | 8 + hosts/phostron/hardware-configuration.nix | 30 + modules/common.nix | 193 +++ modules/desktop/kde-plasma.nix | 18 + modules/users/coyote/default.nix | 33 + modules/users/coyote/home-manager-module.nix | 8 + nixos.html | 1193 ------------------ nixos.lit | 858 ------------- style.css | 1 - 16 files changed, 566 insertions(+), 2495 deletions(-) create mode 100644 home/coyote/default.nix create mode 100644 home/coyote/vim.nix create mode 100644 hosts/phostron/configuration.nix create mode 100644 hosts/phostron/default.nix create mode 100644 hosts/phostron/hardware-configuration.nix create mode 100644 modules/common.nix create mode 100644 modules/desktop/kde-plasma.nix create mode 100644 modules/users/coyote/default.nix create mode 100644 modules/users/coyote/home-manager-module.nix delete mode 100644 nixos.html delete mode 100644 nixos.lit delete mode 100644 style.css diff --git a/.gitignore b/.gitignore index ea34fde..2b00143 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .directory *.swp result -result/ +result-* diff --git a/LICENSE b/LICENSE index 907c8d7..f12af43 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,3 @@ -# LICENSE MIT License Copyright (c) 2026 asnev @@ -20,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/flake.lock b/flake.lock index ab431c2..b30bad7 100644 --- a/flake.lock +++ b/flake.lock @@ -23,11 +23,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1788405554, - "narHash": "sha256-r2f1oUwixlgq9zOdYLqJLfS/lWBT60/IITjhTKI59JU=", + "lastModified": 1788584326, + "narHash": "sha256-Fd3OB8J9JhgliQwOKcqx4M672CInxi1I5VnwsaXeSQo=", "owner": "nixos", "repo": "nixpkgs", - "rev": "a5cc6f2c37bf518436dc8d1c288ccd0c43c2f4c4", + "rev": "6713828a351efa628b025a1adf7f43cbf8597513", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 9e4c7f2..75af936 100644 --- a/flake.nix +++ b/flake.nix @@ -1,4 +1,3 @@ -# flake.nix { description = "asnev's NixOS configuration"; @@ -22,446 +21,13 @@ home-manager, ... }: { - # flake-modules nixosConfigurations.phostron = nixpkgs.lib.nixosSystem { specialArgs = {inherit inputs;}; modules = [ - # phostron-configuration - # nixos-configuration - ({ config, lib, pkgs, inputs, ... }: { - # nixos-configuration-contents - nix.settings.experimental-features = ["nix-command" "flakes"]; - nix.settings.auto-optimise-store = true; - nix.package = pkgs.lixPackageSets.stable.lix; - nixpkgs.config.allowUnfree = true; - nixpkgs.overlays = [ - (final: prev: { - unstable = import inputs.nixpkgs-unstable { - system = prev.stdenv.hostPlatform.system; - config.allowUnfree = true; - }; - }) - (final: prev: { - inherit (prev.lixPackageSets.stable) - nixpkgs-review - nix-eval-jobs - nix-fast-build - colmena; - }) - ]; - boot = { - loader.systemd-boot.enable = true; - loader.systemd-boot.configurationLimit = 10; - loader.efi.canTouchEfiVariables = true; - loader.timeout = 2; - kernelParams = ["quiet" "rd.udev.log_level=3" "rd.systemd.show_status=auto"]; - initrd.verbose = false; - consoleLogLevel = 3; - kernelPackages = pkgs.linuxPackages; - }; - time.timeZone = "Asia/Jakarta"; - i18n.defaultLocale = "en_GB.UTF-8"; - services = { - fwupd.enable = true; - xserver.xkb.layout = "us"; - locate.enable = true; - printing.enable = true; - openssh.enable = false; - pulseaudio.enable = false; - - pipewire.enable = true; - pipewire.alsa.enable = true; - pipewire.alsa.support32Bit = true; - pipewire.pulse.enable = true; - }; - security.rtkit.enable = true; - security.sudo.enable = false; - - security.doas.enable = true; - security.doas.extraRules = [{ - groups = ["wheel"]; - keepEnv = true; - persist = true; - }]; - environment.systemPackages = with pkgs; [ - nh alejandra literate git - # system utils - firmware-updater mtr gnupg ddate testdisk tree wget btop plocate traceroute - rlwrap entr unzip ffmpeg imagemagick gnome-disk-utility - # extra (oxidised) utils - fd bat xh tlrc dysk dust hyperfine ripgrep fzf eza - ]; - environment.shellAliases = { - sudo = "doas"; - l = "eza --grid --all"; - ll = "eza --long --all"; - ls = "eza --long"; - ".." = "cd .."; - "..." = "cd ../.."; - cat = "bat"; # this line is really funny to me - }; - environment.sessionVariables.XDG_DATA_DIRS = [ - "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}" - "${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}" - ]; - programs = { - # nixos-configuration-programs-contents - fish.enable = true; - - atuin.enable = true; - atuin.settings.sync_address = "https://api.atuin.sh"; - atuin.settings.enter_accept = true; - - starship.enable = true; - starship.transientPrompt.enable = true; - starship.transientPrompt.left = "starship module character"; - starship.settings = { - "$schema" = "https://starship.rs/config-schema.json"; - git_status = { - ahead = ">"; - behind = "<"; - diverged = "<>"; - renamed = "r"; - deleted = "d"; - }; - character.success_symbol = "[λ](bold green)"; - character.error_symbol = "[λ](bold red)"; - }; - - git.enable = true; - git.config = { - init.defaultBranch = "main"; - advice.defaultBranchName = false; - gpg.format = "ssh"; - commit.gpgSign = true; - url."https://github.com/".insteadOf = ["github:"]; - }; - - steam.enable = true; - obs-studio.enableVirtualCamera = true; - ssh.startAgent = true; - nix-ld.enable = true; - nix-ld.libraries = with pkgs; [fuse e2fsprogs]; - - }; - fonts.packages = with pkgs; [ - # GUI fonts - inter corefonts vista-fonts roboto cantarell-fonts - # fonts for i18n - noto-fonts noto-fonts-cjk-sans noto-fonts-cjk-serif noto-fonts-color-emoji - noto-fonts-monochrome-emoji unifont unifont_upper unifont-csur - # terminal fonts - nerd-fonts.iosevka - ]; - fonts.fontconfig.antialias = true; - fonts.fontconfig.subpixel.rgba = "rgb"; - xdg.portal.enable = true; - xdg.portal.config.common.default = ["gtk"]; - xdg.portal.extraPortals = with pkgs; [xdg-desktop-portal-wlr]; - - }) - - # kde-plasma-configuration - ({pkgs, ...}: { - services.displayManager.sddm.enable = true; - services.desktopManager.plasma6.enable = true; - environment.systemPackages = with pkgs.kdePackages; [ - kate elisa bluez-qt kalk filelight kamoso konversation kmail ktorrent - kclock - ]; - environment.plasma6.excludePackages = [pkgs.kdePackages.discover]; - }) - - ({ config, lib, pkgs, modulesPath, ... }: { - # phostron-hardware-configuration-contents - imports = [(modulesPath + "/installer/scan/not-detected.nix")]; - - boot.initrd.availableKernelModules = ["nvme" "ehci_pci" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci"]; - boot.initrd.kernelModules = []; - boot.kernelModules = ["kvm-amd"]; - boot.extraModulePackages = []; - - fileSystems."/" = { - device = "/dev/disk/by-uuid/24fb172c-c29f-40c3-ae4d-ff652358563a"; - fsType = "ext4"; - }; - - fileSystems."/boot" = { - device = "/dev/disk/by-uuid/DFC9-994A"; - fsType = "vfat"; - options = ["fmask=0077" "dmask=0077"]; - }; - - swapDevices = [{device = "/dev/disk/by-uuid/91d96247-85c3-4e0a-93a2-5632b96179b6";}]; - - nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; - hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; - - # phostron-configuration-contents - system.stateVersion = "26.05"; # I didn't read the comment. :) - - networking.hostName = "phostron"; - networking.networkmanager.enable = true; - networking.firewall.enable = true; - - services.printing.enable = true; - services.printing.drivers = [pkgs.epson-escpr]; - - hardware.bluetooth.enable = true; - hardware.sane.enable = true; - hardware.sane.extraBackends = [pkgs.epsonscan2]; - services.displayManager.sddm.settings.Theme.Font = "Inter"; - services.displayManager.sddm.settings.Theme.CursorSize = 18; - - }) - - # coyote-configuration - ({ pkgs, config, ... }: let - # coyote-configuration-variables - USER_ID = 1000; - KEY_FILE = "id_ed25519"; - - in { - # coyote-configuration-contents - users.users.coyote = { - isNormalUser = true; - description = "coyote"; - extraGroups = ["wheel" "networkmanager" "lp" "scanner"]; - uid = USER_ID; - }; - users.defaultUserShell = pkgs.unstable.fish; - environment.sessionVariables.SSH_AUTH_SOCK = "/run/user/${builtins.toString USER_ID}/ssh-agent"; - - systemd.user.services.ssh-add-key = { - wantedBy = ["default.target"]; - after = ["ssh-agent.service"]; - serviceConfig = { - Type = "oneshot"; - ExecStartPre = "${pkgs.coreutils-full}/bin/sleep 1"; - ExecStart = [ - "${pkgs.openssh}/bin/ssh-add ${config.users.users.coyote.home}/.ssh/${KEY_FILE}" - ]; - Restart = "on-failure"; - RestartSec = 1; - }; - }; - - }) - home-manager.nixosModules.home-manager - { - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - home-manager.extraSpecialArgs = {inherit inputs;}; - home-manager.users.coyote.imports = [ - ({ pkgs, config, lib, inputs, ... }: { - # coyote-home-manager-configuration - # coyote-home-manager-configuration-contents - home.stateVersion = "26.05"; # Nope, didn't read the comment either. - home.username = "coyote"; - home.homeDirectory = "/home/coyote"; - home.shell.enableShellIntegration = true; - home.packages = with pkgs; [ - # TUI - tdf neocities - # productivity - libreoffice-fresh karp keepassxc pdfarranger thunderbird - # multimedia - furnace corrscope vlc haruna subtitlecomposer kid3 kdePackages.kdenlive - unstable.audacity lmms-full calf vital - # Internet - ungoogled-chromium - # games - osu-lazer-bin pcsx2 flycast hail - # emulation - (unstable.bottles.override {removeWarningPopup = true;}) - # devel - unstable.racket unstable.lazygit mitscheme - ]; - home.file = let - mkVimAfterFtplugin = content: langs: - builtins.listToAttrs (map (lang: { - name = ".vim/after/ftplugin/${lang}.vim"; - value = {text = content;}; - }) - langs); - tab2Vim = '' - setlocal expandtab - setlocal tabstop=2 - setlocal shiftwidth=2 - setlocal softtabstop=2 - ''; - tab4Vim = '' - setlocal expandtab - setlocal tabstop=4 - setlocal shiftwidth=4 - setlocal softtabstop=4 - ''; - tabsVim = '' - setlocal noexpandtab - setlocal tabstop=4 - setlocal shiftwidth=4 - setlocal softtabstop=0 - ''; - lispVim = '' - setlocal expandtab - setlocal tabstop=2 - setlocal shiftwidth=2 - setlocal softtabstop=2 - - setlocal lisp - setlocal autoindent - setlocal showmatch - - setlocal lispwords+=defun,defmacro,defvar,defparameter,defmethod,define-syntax,lambda,let,let*,letre,flet,labels,progn,when,unless,if,cond - ''; - in - lib.mkMerge [ - (mkVimAfterFtplugin tab2Vim ["javascript" "typescript" "html" "css" "json" "nix" "vim"]) - (mkVimAfterFtplugin tab4Vim ["python" "rust" "java" "lua" "c" "cpp" "h" "hpp"]) - (mkVimAfterFtplugin tabsVim ["go" "make"]) - (mkVimAfterFtplugin lispVim ["lisp" "scheme" "clojure" "racket"]) - ]; - - programs = { - # coyote-home-manager-programs - # coyote-home-manager-programs-general - tmux = { - enable = true; - clock24 = true; - baseIndex = 1; - shortcut = "a"; - keyMode = "vi"; - terminal = "screen-256color"; - escapeTime = 0; - extraConfig = '' - set -g pane-base-index 1 - set-window-option -g pane-base-index 1 - set-option -g renumber-windows on - set-option -g status-right "\"#W\"" - set -ga terminal-overrides ",*:RGB" - set -g mouse on - set -g set-clipboard on - ''; - }; - - librewolf.enable = true; - librewolf.languagePacks = ["en-GB"]; - librewolf.settings = { - "privacy.resistFingerprinting" = false; - "librewolf.webgl.prompt" = false; - "identity.fxaccounts.enabled" = true; - "middlemouse.paste" = false; - "general.autoScroll" = true; - "browser.discovery.containers.enabled" = false; - }; - - yt-dlp.enable = true; - yt-dlp.package = pkgs.unstable.yt-dlp; - - starship.package = pkgs.unstable.starship; - - obs-studio.enable = true; - obs-studio.plugins = with pkgs.obs-studio-plugins; [ - input-overlay droidcam-obs wlrobs - ]; - - # coyote-home-manager-programs-vim - vim.enable = true; - vim.packageConfigurable = pkgs.unstable.vim-full; - vim.defaultEditor = true; - vim.plugins = let - literate-vim = pkgs.vimUtils.buildVimPlugin { - name = "literate.vim"; - src = pkgs.fetchFromGitHub { - owner = "zyedidia"; - repo = "literate.vim"; - rev = "4ffd45cb1657b67f4ed0eb639478a69209ec1f94"; - sha256 = "sha256-X5iJyjeLBkKh4tUoDG8VDO6DwYVOI9DpRqpic8NinwA="; - }; - }; - in - with pkgs.unstable.vimPlugins; [ - gruvbox rainbow literate-vim undotree - ]; - vim.extraConfig = '' - set nocompatible - set encoding=utf-8 - set backspace=indent,eol,start - set clipboard=unnamedplus - set mouse=a - set history=1000 - set updatetime=300 - - syntax on - set ruler - set showcmd - set showmode - set laststatus=1 - set wildmenu - set wildmode=longest,list,full - set ttyfast - set lazyredraw - - filetype plugin indent on - set autoindent - set smartindent - set expandtab - set smarttab - set tabstop=4 - set shiftwidth=4 - set softtabstop=4 - - set hlsearch - set incsearch - set ignorecase - set smartcase - inoremap λ - set termguicolors - set background=dark - colorscheme gruvbox - let g:terminal_ansi_colors = ['#282828', '#cc241d', '#98971a', '#d79921', '#458588', '#b16286', '#689d6a', '#a89984', '#928374', '#fb4934', '#b8bb26', '#fabd2f', '#83a598', '#d3869b', '#8ec07c', '#ebdbb2'] - let g:rainbow_active = 1 - ''; - - # coyote-home-manager-programs-fastfetch - fastfetch.enable = true; - fastfetch.settings = { - "$schema" = "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json"; - logo.type = "small"; - logo.padding.top = 4; - logo.padding.left = 3; - logo.padding.right = 4; - display.separator = " "; - modules = [ - {key = "╭─────────╮"; type = "custom";} - {key = "│ {#31}user {#keys}│"; type = "title"; format = "{user-name}";} - {key = "│ {#32}host {#keys}│"; type = "title"; format = "{host-name}";} - {key = "│ {#33}uptime {#keys}│"; type = "uptime";} - {key = "│ {#34}distro {#keys}│"; type = "os";} - {key = "│ {#35}kernel {#keys}│"; type = "kernel";} - {key = "│ {#36}desktop {#keys}│"; type = "de";} - {key = "│ {#31}term {#keys}│"; type = "terminal";} - {key = "│ {#32}shell {#keys}│"; type = "shell";} - {key = "│ {#33}cpu {#keys}│"; type = "cpu"; showPeCoreCount = true;} - {key = "│ {#34}disk {#keys}│"; type = "disk"; folders = "/";} - {key = "│ {#35}memory {#keys}│"; type = "memory";} - {key = "│ {#36}network {#keys}│"; type = "localip"; format = "{ipv4} ({ifname})";} - {key = "├─────────┤"; type = "custom";} - {key = "│ {#39}colors {#keys}│"; type = "colors"; symbol = "circle";} - {key = "╰─────────╯"; type = "custom";} - ]; - }; - - - }; - - }) - ]; - } - + ./hosts/phostron + ./modules/users/coyote + ./modules/users/coyote/home-manager-module.nix ]; }; - }; } - diff --git a/home/coyote/default.nix b/home/coyote/default.nix new file mode 100644 index 0000000..308a136 --- /dev/null +++ b/home/coyote/default.nix @@ -0,0 +1,176 @@ +{ + pkgs, + config, + lib, + inputs, + ... +}: { + imports = [ + ./vim.nix + ]; + + home.stateVersion = "26.05"; # Nope, didn't read the comment either. + home.username = "coyote"; + home.homeDirectory = "/home/coyote"; + home.shell.enableShellIntegration = true; + + home.packages = with pkgs; [ + # TUI + tdf + neocities + # productivity + libreoffice-fresh + karp + keepassxc + pdfarranger + thunderbird + # multimedia + furnace + corrscope + vlc + haruna + subtitlecomposer + kid3 + kdePackages.kdenlive + unstable.audacity + lmms-full + calf + vital + # Internet + ungoogled-chromium + # games + osu-lazer-bin + pcsx2 + # emulation + (unstable.bottles.override {removeWarningPopup = true;}) + # devel + unstable.racket + unstable.lazygit + ]; + + programs = { + tmux = { + enable = true; + clock24 = true; + baseIndex = 1; + shortcut = "a"; + keyMode = "vi"; + terminal = "screen-256color"; + escapeTime = 0; + extraConfig = '' + set -g pane-base-index 1 + set-window-option -g pane-base-index 1 + set-option -g renumber-windows on + set-option -g status-right "\"#W\"" + set -ga terminal-overrides ",*:RGB" + set -g mouse on + set -g set-clipboard on + ''; + }; + + librewolf.enable = true; + librewolf.languagePacks = ["en-GB"]; + librewolf.settings = { + "privacy.resistFingerprinting" = false; + "librewolf.webgl.prompt" = false; + "identity.fxaccounts.enabled" = true; + "middlemouse.paste" = false; + "general.autoScroll" = true; + "browser.discovery.containers.enabled" = false; + }; + + yt-dlp.enable = true; + yt-dlp.package = pkgs.unstable.yt-dlp; + + starship.package = pkgs.unstable.starship; + + obs-studio.enable = true; + obs-studio.plugins = with pkgs.obs-studio-plugins; [ + input-overlay + droidcam-obs + wlrobs + ]; + + fastfetch.enable = true; + fastfetch.settings = { + "$schema" = "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json"; + logo.type = "small"; + logo.padding.top = 4; + logo.padding.left = 3; + logo.padding.right = 4; + display.separator = " "; + modules = [ + { + key = "╭─────────╮"; + type = "custom"; + } + { + key = "│ {#31}user {#keys}│"; + type = "title"; + format = "{user-name}"; + } + { + key = "│ {#32}host {#keys}│"; + type = "title"; + format = "{host-name}"; + } + { + key = "│ {#33}uptime {#keys}│"; + type = "uptime"; + } + { + key = "│ {#34}distro {#keys}│"; + type = "os"; + } + { + key = "│ {#35}kernel {#keys}│"; + type = "kernel"; + } + { + key = "│ {#36}desktop {#keys}│"; + type = "de"; + } + { + key = "│ {#31}term {#keys}│"; + type = "terminal"; + } + { + key = "│ {#32}shell {#keys}│"; + type = "shell"; + } + { + key = "│ {#33}cpu {#keys}│"; + type = "cpu"; + showPeCoreCount = true; + } + { + key = "│ {#34}disk {#keys}│"; + type = "disk"; + folders = "/"; + } + { + key = "│ {#35}memory {#keys}│"; + type = "memory"; + } + { + key = "│ {#36}network {#keys}│"; + type = "localip"; + format = "{ipv4} ({ifname})"; + } + { + key = "├─────────┤"; + type = "custom"; + } + { + key = "│ {#39}colors {#keys}│"; + type = "colors"; + symbol = "circle"; + } + { + key = "╰─────────╯"; + type = "custom"; + } + ]; + }; + }; +} diff --git a/home/coyote/vim.nix b/home/coyote/vim.nix new file mode 100644 index 0000000..fc97f1a --- /dev/null +++ b/home/coyote/vim.nix @@ -0,0 +1,70 @@ +{pkgs, ...}: { + programs.vim = { + enable = true; + packageConfigurable = pkgs.unstable.vim-full; + defaultEditor = true; + + plugins = with pkgs.unstable.vimPlugins; [ + gruvbox + rainbow + undotree + ]; + + extraConfig = '' + set nocompatible + set encoding=utf-8 + set backspace=indent,eol,start + set clipboard=unnamedplus + set mouse=a + set history=1000 + set updatetime=300 + + syntax on + set ruler + set showcmd + set showmode + set laststatus=1 + set wildmenu + set wildmode=longest,list,full + set ttyfast + set lazyredraw + + filetype plugin indent on + set autoindent + set smartindent + set expandtab + set smarttab + set tabstop=4 + set shiftwidth=4 + set softtabstop=4 + + set hlsearch + set incsearch + set ignorecase + set smartcase + + inoremap λ + + set termguicolors + set background=dark + colorscheme gruvbox + let g:terminal_ansi_colors = ['#282828', '#cc241d', '#98971a', '#d79921', '#458588', '#b16286', '#689d6a', '#a89984', '#928374', '#fb4934', '#b8bb26', '#fabd2f', '#83a598', '#d3869b', '#8ec07c', '#ebdbb2'] + + let g:rainbow_active = 1 + + augroup coyote_filetype_settings + autocmd! + autocmd FileType javascript,typescript,html,css,json,nix,vim + \ setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 + autocmd FileType python,rust,java,lua,c,cpp,h,hpp + \ setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4 + autocmd FileType go,make + \ setlocal noexpandtab tabstop=4 shiftwidth=4 softtabstop=0 + autocmd FileType lisp,scheme,clojure,racket + \ setlocal expandtab tabstop=2 shiftwidth=2 softtabstop=2 + \ lisp autoindent showmatch + \ lispwords+=defun,defmacro,defvar,defparameter,defmethod,define-syntax,lambda,let,let*,letre,flet,labels,progn,when,unless,if,cond + augroup END + ''; + }; +} diff --git a/hosts/phostron/configuration.nix b/hosts/phostron/configuration.nix new file mode 100644 index 0000000..c2a87a9 --- /dev/null +++ b/hosts/phostron/configuration.nix @@ -0,0 +1,23 @@ +{ + config, + lib, + pkgs, + ... +}: { + system.stateVersion = "26.05"; # I didn't read the comment. + + networking.hostName = "phostron"; + networking.networkmanager.enable = true; + networking.firewall.enable = true; + + services.printing.enable = true; + services.printing.drivers = [pkgs.epson-escpr]; + + hardware.bluetooth.enable = true; + hardware.sane.enable = true; + hardware.sane.extraBackends = [pkgs.epsonscan2]; + + # SDDM look, specific to this machine + services.displayManager.sddm.settings.Theme.Font = "Inter"; + services.displayManager.sddm.settings.Theme.CursorSize = 18; +} diff --git a/hosts/phostron/default.nix b/hosts/phostron/default.nix new file mode 100644 index 0000000..29ac9f8 --- /dev/null +++ b/hosts/phostron/default.nix @@ -0,0 +1,8 @@ +{...}: { + imports = [ + ../../modules/common.nix + ../../modules/desktop/kde-plasma.nix + ./hardware-configuration.nix + ./configuration.nix + ]; +} diff --git a/hosts/phostron/hardware-configuration.nix b/hosts/phostron/hardware-configuration.nix new file mode 100644 index 0000000..046f679 --- /dev/null +++ b/hosts/phostron/hardware-configuration.nix @@ -0,0 +1,30 @@ +{ + config, + lib, + pkgs, + modulesPath, + ... +}: { + imports = [(modulesPath + "/installer/scan/not-detected.nix")]; + + boot.initrd.availableKernelModules = ["nvme" "ehci_pci" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci"]; + boot.initrd.kernelModules = []; + boot.kernelModules = ["kvm-amd"]; + boot.extraModulePackages = []; + + fileSystems."/" = { + device = "/dev/disk/by-uuid/24fb172c-c29f-40c3-ae4d-ff652358563a"; + fsType = "ext4"; + }; + + fileSystems."/boot" = { + device = "/dev/disk/by-uuid/DFC9-994A"; + fsType = "vfat"; + options = ["fmask=0077" "dmask=0077"]; + }; + + swapDevices = [{device = "/dev/disk/by-uuid/91d96247-85c3-4e0a-93a2-5632b96179b6";}]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/modules/common.nix b/modules/common.nix new file mode 100644 index 0000000..580fd83 --- /dev/null +++ b/modules/common.nix @@ -0,0 +1,193 @@ +{ + config, + lib, + pkgs, + inputs, + ... +}: { + # use flakes and Lix instead of the default Nix implementation + nix.settings.experimental-features = ["nix-command" "flakes"]; + nix.settings.auto-optimise-store = true; + nix.package = pkgs.lixPackageSets.stable.lix; + + # global nixpkgs-unstable overlay, so unstable packages are available to + # Home Manager userspaces too, plus a couple of Lix-related package pins + nixpkgs.config.allowUnfree = true; + nixpkgs.overlays = [ + (final: prev: { + unstable = import inputs.nixpkgs-unstable { + system = prev.stdenv.hostPlatform.system; + config.allowUnfree = true; + }; + }) + (final: prev: { + inherit + (prev.lixPackageSets.stable) + nixpkgs-review + nix-eval-jobs + nix-fast-build + colmena + ; + }) + ]; + + boot = { + loader.systemd-boot.enable = true; + loader.systemd-boot.configurationLimit = 10; + loader.efi.canTouchEfiVariables = true; + loader.timeout = 2; + kernelParams = ["quiet" "rd.udev.log_level=3" "rd.systemd.show_status=auto"]; + initrd.verbose = false; + consoleLogLevel = 3; + kernelPackages = pkgs.linuxPackages; + }; + + time.timeZone = "Asia/Jakarta"; + i18n.defaultLocale = "en_GB.UTF-8"; + + services = { + fwupd.enable = true; + xserver.xkb.layout = "us"; + locate.enable = true; + printing.enable = true; + openssh.enable = false; + pulseaudio.enable = false; + + pipewire.enable = true; + pipewire.alsa.enable = true; + pipewire.alsa.support32Bit = true; + pipewire.pulse.enable = true; + }; + + security.rtkit.enable = true; + security.sudo.enable = false; + + security.doas.enable = true; + security.doas.extraRules = [ + { + groups = ["wheel"]; + keepEnv = true; + persist = true; + } + ]; + + environment.systemPackages = with pkgs; [ + nh + alejandra + git + # system utils + firmware-updater + mtr + gnupg + ddate + testdisk + tree + wget + btop + plocate + traceroute + rlwrap + entr + unzip + ffmpeg + imagemagick + gnome-disk-utility + # extra (oxidised) utils + fd + bat + xh + tlrc + dysk + dust + hyperfine + ripgrep + fzf + eza + ]; + + environment.shellAliases = { + sudo = "doas"; + l = "eza --grid --all"; + ll = "eza --long --all"; + ls = "eza --long"; + ".." = "cd .."; + "..." = "cd ../.."; + cat = "bat"; + }; + + # fixes Librewolf not rendering text in its UI (as of 2026-07-30) + environment.sessionVariables.XDG_DATA_DIRS = [ + "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}" + "${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}" + ]; + + programs = { + fish.enable = true; + + atuin.enable = true; + atuin.settings.sync_address = "https://api.atuin.sh"; + atuin.settings.enter_accept = true; + + starship.enable = true; + starship.transientPrompt.enable = true; + starship.transientPrompt.left = "starship module character"; + starship.settings = { + "$schema" = "https://starship.rs/config-schema.json"; + git_status = { + ahead = ">"; + behind = "<"; + diverged = "<>"; + renamed = "r"; + deleted = "d"; + }; + character.success_symbol = "[λ](bold green)"; + character.error_symbol = "[λ](bold red)"; + }; + + git.enable = true; + git.config = { + init.defaultBranch = "main"; + advice.defaultBranchName = false; + gpg.format = "ssh"; + commit.gpgSign = true; + url."https://github.com/".insteadOf = ["github:"]; + }; + + steam.enable = true; + + # one-off options that would live in the Home Manager section if the + # relevant modules existed there + obs-studio.enableVirtualCamera = true; + ssh.startAgent = true; + + nix-ld.enable = true; + nix-ld.libraries = with pkgs; [fuse e2fsprogs]; + }; + + fonts.packages = with pkgs; [ + # GUI fonts + inter + corefonts + vista-fonts + roboto + cantarell-fonts + # fonts for i18n + noto-fonts + noto-fonts-cjk-sans + noto-fonts-cjk-serif + noto-fonts-color-emoji + noto-fonts-monochrome-emoji + unifont + unifont_upper + unifont-csur + # terminal fonts + nerd-fonts.iosevka + ]; + + fonts.fontconfig.antialias = true; + fonts.fontconfig.subpixel.rgba = "rgb"; + + xdg.portal.enable = true; + xdg.portal.config.common.default = ["gtk"]; + xdg.portal.extraPortals = with pkgs; [xdg-desktop-portal-wlr]; +} diff --git a/modules/desktop/kde-plasma.nix b/modules/desktop/kde-plasma.nix new file mode 100644 index 0000000..c1af03f --- /dev/null +++ b/modules/desktop/kde-plasma.nix @@ -0,0 +1,18 @@ +{pkgs, ...}: { + services.displayManager.sddm.enable = true; + services.desktopManager.plasma6.enable = true; + environment.systemPackages = with pkgs.kdePackages; [ + kate + elisa + bluez-qt + kalk + filelight + kamoso + konversation + kmail + ktorrent + kclock + ]; + + environment.plasma6.excludePackages = [pkgs.kdePackages.discover]; +} diff --git a/modules/users/coyote/default.nix b/modules/users/coyote/default.nix new file mode 100644 index 0000000..92ab002 --- /dev/null +++ b/modules/users/coyote/default.nix @@ -0,0 +1,33 @@ +{ + pkgs, + config, + ... +}: let + USER_ID = 1000; + KEY_FILE = "id_ed25519"; +in { + users.users.coyote = { + isNormalUser = true; + description = "coyote"; + extraGroups = ["wheel" "networkmanager" "lp" "scanner"]; + uid = USER_ID; + }; + users.defaultUserShell = pkgs.unstable.fish; + + # daemon blurb to get SSH for Git working + environment.sessionVariables.SSH_AUTH_SOCK = "/run/user/${builtins.toString USER_ID}/ssh-agent"; + + systemd.user.services.ssh-add-key = { + wantedBy = ["default.target"]; + after = ["ssh-agent.service"]; + serviceConfig = { + Type = "oneshot"; + ExecStartPre = "${pkgs.coreutils-full}/bin/sleep 1"; + ExecStart = [ + "${pkgs.openssh}/bin/ssh-add ${config.users.users.coyote.home}/.ssh/${KEY_FILE}" + ]; + Restart = "on-failure"; + RestartSec = 1; + }; + }; +} diff --git a/modules/users/coyote/home-manager-module.nix b/modules/users/coyote/home-manager-module.nix new file mode 100644 index 0000000..fefabde --- /dev/null +++ b/modules/users/coyote/home-manager-module.nix @@ -0,0 +1,8 @@ +{inputs, ...}: { + imports = [inputs.home-manager.nixosModules.home-manager]; + + home-manager.useGlobalPkgs = true; + home-manager.useUserPackages = true; + home-manager.extraSpecialArgs = {inherit inputs;}; + home-manager.users.coyote.imports = [../../../home/coyote]; +} diff --git a/nixos.html b/nixos.html deleted file mode 100644 index 1518b7c..0000000 --- a/nixos.html +++ /dev/null @@ -1,1193 +0,0 @@ - - - - -asnev's NixOS configuration - - - - -
-

asnev's NixOS configuration

-

1. introduction

-

welcome! this page is the literate configuration for my NixOS setup. here, -declarations are set to configure my (currently) only host system, phostron, -a ThinkPad L14 Gen 1, to use flakes, Home Manager, a global nixpkgs-unstable -overlay, alongside general NixOS configurations tailored to my hardware and -user environment preferences.

-

-

being a literate configuration file, this means that both the HTML page you're -reading right now, and the Nix flake file that get parsed when building the -system, are compiled from the same exact source file. that's literate -programming in a nutshell--programming with a documentation-first paradigm. -though of course, the details don't stop there. the rabbit hole can get really, -really deep; just ask your favourite search engine for all the -breathtakingly comprehensive NixOS configs (literate or otherwise) that are -out there!

-

-

you can get the source code at my repo here. -

-

the latest version of this document is hosted on my - Neocities. -

-
-



-

- -
-

2. limitations

-

this is a simple configuration. i don't have immediate plans in declaratively -configuring absolutely everything there is on my system. as someone who still -has many things to learn about Nix(OS), my current rationale is to configure -everything that's comfortably sensible. additional options and/or verbosity can -be added later as my configuration grows in the future (or not). following the -'simple' nature of my configuration, Home Manager is notably installed as a -NixOS module instead of being standalone. while doing so does make rebuilding -the user environment a bit annoying, personally, i don't mind it that -much.

-

-

this is also a simple configuration, in the way of the literate programming -tools used, which is Literate. while it -does offer a very approachable format based on Markdown, it's a bit lacking in -that it can't provide syntax highlighting in multiple different languages -(you'll see the mixed-up colours later, sorry), and it can't export source code -files into files which live within subdirectories. i've resorted to let -everything reside within one flake.nix file which, while it does make users -who wish to navigate through the unwoven (without comments) configuration -expressions quite... annoying, at least everything is organised when viewed -through the literate source code.

-

-

eventually, when i can build up the courage... i'd like to begin my 'journey' -with Emacs and utilise Org-mode and Org-babel, a much, much more flexible -literate programming environment.
-

-

emphasis on 'eventually'...

-

-

i don't expect anyone reading this to be wishing to use my specific -configuration for their setup, so i'll skip over instructions for installing -the operating system and let the following configurations assume that a fresh, -flake-enabled NixOS system is present and ready to go. -

-



-

- -
-

3. flake structure

-

we'll outline a basic flake for the system(s)... -

- -
-{flake.nix 3} -
-{
-  description = "asnev's NixOS configuration";
-
-  inputs = {
-    nixpkgs = {
-      url = "github:nixos/nixpkgs/nixos-26.05";
-    };
-    nixpkgs-unstable = {
-      url = "github:nixos/nixpkgs/nixos-unstable";
-    };
-    home-manager = {
-      url = "github:nix-community/home-manager/release-26.05";
-      inputs.nixpkgs.follows = "nixpkgs";
-    };
-  };
-
-  outputs = inputs @ {
-    self,
-    nixpkgs,
-    nixpkgs-unstable,
-    home-manager,
-    ...
-  }: {
-    {flake-modules, 3}
-  };
-}
-
- - - -
-

...and configure the modules. declared below are separate modules for the host, -user, and user environment managed by Home Manager. everything lives within the -one NixOS module, so it is structured thusly: -

- -
-{flake-modules 3} -
-nixosConfigurations.phostron = nixpkgs.lib.nixosSystem {
-  specialArgs = {inherit inputs;};
-  modules = [
-    {phostron-configuration, 5}
-    {coyote-configuration, 7}
-  ];
-};
-
- - - -
-

TODO: consider adding a shell environment module? -

-



-

- -
-

4. global NixOS options

-

before getting into the host-specific configurations, here we set options that -get applied to all NixOS systems, regardless of machine. we'll start by -declaring the initial attribute set arguments, which will soon be a familiar -pattern here... -

- -
-{nixos-configuration 4} -
-({ config, lib, pkgs, inputs, ... }: {
-  {nixos-configuration-contents, 4}
-})
-
- - -

Used in section 5

-
-

...then we set Nix-related declarations since we'd like to declare the system -to use flakes, and, to utilise Lix, -

- -
-{nixos-configuration-contents 4} -
-nix.settings.experimental-features = ["nix-command" "flakes"];
-nix.settings.auto-optimise-store = true;
-nix.package = pkgs.lixPackageSets.stable.lix;
-
- - - -
-

but also have an overlay of nixpkgs-unstable to be available globally. this -is so that i can have unstable packages installed in userspaces managed via -Home Manager. plus, some additional tweaks for Lix. -

- -
-{nixos-configuration-contents 4} += -
-nixpkgs.config.allowUnfree = true;
-nixpkgs.overlays = [
-  (final: prev: {
-    unstable = import inputs.nixpkgs-unstable {
-      system = prev.stdenv.hostPlatform.system;
-      config.allowUnfree = true;
-    };
-  })
-  (final: prev: {
-    inherit (prev.lixPackageSets.stable)
-      nixpkgs-review
-      nix-eval-jobs
-      nix-fast-build
-      colmena;
-  })
-];
-
- - - -
-

getting into the rest of the options, let's configure the way the system should -boot. i like to have absolutely nothing being displayed as my computer turns -on. -

- -
-{nixos-configuration-contents 4} += -
-boot = {
-  loader.systemd-boot.enable = true;
-  loader.systemd-boot.configurationLimit = 10;
-  loader.efi.canTouchEfiVariables = true;
-  loader.timeout = 2;
-  kernelParams = ["quiet" "rd.udev.log_level=3" "rd.systemd.show_status=auto"];
-  initrd.verbose = false;
-  consoleLogLevel = 3;
-  kernelPackages = pkgs.linuxPackages;
-};
-
- - - -
-

next, some basic locale settings. -

- -
-{nixos-configuration-contents 4} += -
-time.timeZone = "Asia/Jakarta";
-i18n.defaultLocale = "en_GB.UTF-8";
-
- - - -
-

service options. note the options for PipeWire here. -

- -
-{nixos-configuration-contents 4} += -
-services = {
-  fwupd.enable = true;
-  xserver.xkb.layout = "us";
-  locate.enable = true;
-  printing.enable = true;
-  openssh.enable = false;
-  pulseaudio.enable = false;
-
-  pipewire.enable = true;
-  pipewire.alsa.enable = true;
-  pipewire.alsa.support32Bit = true;
-  pipewire.pulse.enable = true;
-};
-
- - - -
-

basic security options and doas configuration. -

- -
-{nixos-configuration-contents 4} += -
-security.rtkit.enable = true;
-security.sudo.enable = false;
-
-security.doas.enable = true;
-security.doas.extraRules = [{
-  groups = ["wheel"];
-  keepEnv = true;
-  persist = true;
-}];
-
- - - -
-

and now we get into the fun (translation: less boring) stuff with system -packages! -

- -
-{nixos-configuration-contents 4} += -
-environment.systemPackages = with pkgs; [
-  nh alejandra literate git
-  # system utils
-  firmware-updater mtr gnupg ddate testdisk tree wget btop plocate traceroute
-  rlwrap entr unzip ffmpeg imagemagick gnome-disk-utility
-  # extra (oxidised) utils
-  fd bat xh tlrc dysk dust hyperfine ripgrep fzf eza
-];
-
- - - -
-

if the list seems a bit sparse for desktop applications, that's intentional. i -prefer to keep those within userspace via Home Manager, which will be -explored later below.

-

-

let's set a few useful shell aliases, notably substituting ls for eza for a -prettier directory output. (TODO: consider figuring how to switch to uutils -globally maybe?) -

- -
-{nixos-configuration-contents 4} += -
-environment.shellAliases = {
-  sudo = "doas";
-  l = "eza --grid --all";
-  ll = "eza --long --all";
-  ls = "eza --long";
-  ".." = "cd ..";
-  "..." = "cd ../..";
-  cat = "bat"; # this line is really funny to me
-};
-
- - - -
-

quick fix for Librewolf not rendering text in its UI (as of 2026-07-30). -

- -
-{nixos-configuration-contents 4} += -
-environment.sessionVariables.XDG_DATA_DIRS = [
-  "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}"
-  "${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}"
-];
-
- - - -
-

here's the start of options for programmes... -

- -
-{nixos-configuration-contents 4} += -
-programs = {
-  {nixos-configuration-programs-contents, 4}
-};
-
- - - -
-

nothing much here, starting with a few options to prettify the terminal a bit. -

-

"zsh is bash with plugins; fish is zsh with plugins" - --0atman -

-
-

yes, the lambda (λ) as a terminal prompt character absolutely counts towards -style points. -

- -
-{nixos-configuration-programs-contents 4} -
-fish.enable = true;
-
-atuin.enable = true;
-atuin.settings.sync_address = "https://api.atuin.sh";
-atuin.settings.enter_accept = true;
-
-starship.enable = true;
-starship.transientPrompt.enable = true;
-starship.transientPrompt.left = "starship module character";
-starship.settings = {
-  "$schema" = "https://starship.rs/config-schema.json";
-  git_status = {
-    ahead = ">";
-    behind = "<";
-    diverged = "<>";
-    renamed = "r";
-    deleted = "d";
-  };
-  character.success_symbol = "[λ](bold green)";
-  character.error_symbol = "[λ](bold red)";
-};
-
-git.enable = true;
-git.config = {
-  init.defaultBranch = "main";
-  advice.defaultBranchName = false;
-  gpg.format = "ssh";
-  commit.gpgSign = true;
-  url."https://github.com/".insteadOf = ["github:"];
-};
-
-steam.enable = true;
-
- - - -
-

a few one-off options here. these settings would be in the Home Manager section -if they existed there, but they don't, so, oh well. -

- -
-{nixos-configuration-programs-contents 4} += -
-obs-studio.enableVirtualCamera = true;
-ssh.startAgent = true;
-
- - - -
-

nix-ld is important for running generic binaries and AppImages. ironically, -i have yet felt the need to utilise software outside of the nixpkgs -repository, hence the sparse libraries pkgs list, lol. -

- -
-{nixos-configuration-programs-contents 4} += -
-nix-ld.enable = true;
-nix-ld.libraries = with pkgs; [fuse e2fsprogs];
-
- - - -
-

fonts! because typography (and internationalisation) matters. -

- -
-{nixos-configuration-contents 4} += -
-fonts.packages = with pkgs; [
-  # GUI fonts
-  inter corefonts vista-fonts roboto cantarell-fonts
-  # fonts for i18n
-  noto-fonts noto-fonts-cjk-sans noto-fonts-cjk-serif noto-fonts-color-emoji
-  noto-fonts-monochrome-emoji unifont unifont_upper unifont-csur
-  # terminal fonts
-  nerd-fonts.iosevka
-];
-
- - - -
-

some font settings. -

- -
-{nixos-configuration-contents 4} += -
-fonts.fontconfig.antialias = true;
-fonts.fontconfig.subpixel.rgba = "rgb";
-
- - - -
-

finally, XDG portal settings... which i'll admit i don't quite understand but -they're here so here they are. -

- -
-{nixos-configuration-contents 4} += -
-xdg.portal.enable = true;
-xdg.portal.config.common.default = ["gtk"];
-xdg.portal.extraPortals = with pkgs; [xdg-desktop-portal-wlr];
-
- - - -
-

we're finished with the global config, let's move into the per-machine options. -

-



-

- -
-

5. host configuration: phostron

-

we make sure that we load in the global options we've set, alongside a choice -of one's preferred graphical interface. -

- -
-{phostron-configuration 5} -
-{nixos-configuration, 4}
-{kde-plasma-configuration, 6}
-
- - -

Used in section 3

-
-

then we may start with configuring the machine specifically. with the NixOS -installer's automatically generated hardware-configuration.nix file, our job -is basically half done here. -

- -
-{phostron-configuration 5} += -
-({ config, lib, pkgs, modulesPath, ... }: {
-  {phostron-hardware-configuration-contents, 5}
-  {phostron-configuration-contents, 5}
-})
-
- - -

Used in section 3

-
-

i'll copy over said file verbatim (excluding the pre-generated comment blurb at -the beginning of the file). -

- -
-{phostron-hardware-configuration-contents 5} -
-imports = [(modulesPath + "/installer/scan/not-detected.nix")];
-
-boot.initrd.availableKernelModules = ["nvme" "ehci_pci" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci"];
-boot.initrd.kernelModules = [];
-boot.kernelModules = ["kvm-amd"];
-boot.extraModulePackages = [];
-
-fileSystems."/" = {
-  device = "/dev/disk/by-uuid/24fb172c-c29f-40c3-ae4d-ff652358563a";
-  fsType = "ext4";
-};
-
-fileSystems."/boot" = {
-  device = "/dev/disk/by-uuid/DFC9-994A";
-  fsType = "vfat";
-  options = ["fmask=0077" "dmask=0077"];
-};
-
-swapDevices = [{device = "/dev/disk/by-uuid/91d96247-85c3-4e0a-93a2-5632b96179b6";}];
-
-nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
-hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
-
- - - -
-

with that done, we can move on to the less scary stuff. -

- -
-{phostron-configuration-contents 5} -
-system.stateVersion = "26.05"; # I didn't read the comment. :)
-
-networking.hostName = "phostron";
-networking.networkmanager.enable = true;
-networking.firewall.enable = true;
-
-services.printing.enable = true;
-services.printing.drivers = [pkgs.epson-escpr];
-
-hardware.bluetooth.enable = true;
-hardware.sane.enable = true;
-hardware.sane.extraBackends = [pkgs.epsonscan2];
-
-

Added to in section 6

- - -
-



-

- -
-

6. desktop configuration: KDE Plasma

-

let's bring ourselves to the 90s with a proper graphical user interface! and -have some additional apps to boot. -

- -
-{kde-plasma-configuration 6} -
-({pkgs, ...}: {
-  services.displayManager.sddm.enable = true;
-  services.desktopManager.plasma6.enable = true;
-  environment.systemPackages = with pkgs.kdePackages; [
-    kate elisa bluez-qt kalk filelight kamoso konversation kmail ktorrent
-    kclock
-  ];
-
- - -

Used in section 5

-
-

"Discover? Where we're going... we don't need Discover." -

-
- -
-{kde-plasma-configuration 6} += -
-  environment.plasma6.excludePackages = [pkgs.kdePackages.discover];
-})
-
- - -

Used in section 5

-
-

i've set some additional options in how i'd like SDDM to look for phostron -specifically. -

- -
-{phostron-configuration-contents 5} += -
-services.displayManager.sddm.settings.Theme.Font = "Inter";
-services.displayManager.sddm.settings.Theme.CursorSize = 18;
-
- - -

Used in section 5

-
-

(TODO: consider adding the plasma-manager flake module in the future?) -

-



-

- -
-

7. user configuration: coyote

-

that's me. :3c

-

-

not just NixOS options, but also any other modules loaded into the system via -the flake, like Home Manager, as seen later. -

- -
-{coyote-configuration 7} -
-({ pkgs, config, ... }: let
-  {coyote-configuration-variables, 7}
-in {
-  {coyote-configuration-contents, 7}
-})
-
-

Added to in section 8

- -

Used in section 3

-
-

let's get the user-specific NixOS options out of the way. basic user management -stuff and setting the default shell of choice. -

- -
-{coyote-configuration-variables 7} -
-USER_ID = 1000;
-
- - - -
- -
-{coyote-configuration-contents 7} -
-users.users.coyote = {
-  isNormalUser = true;
-  description = "coyote";
-  extraGroups = ["wheel" "networkmanager" "lp" "scanner"];
-  uid = USER_ID;
-};
-users.defaultUserShell = pkgs.unstable.fish;
-
- - - -
-

for me, i have a little daemon blurb to get SSH for Git working... properly? i -can't remember--i think i stole this from GitHub somewhere...

-

-

there's another variable we need to set before getting there though. -

- -
-{coyote-configuration-variables 7} += -
-KEY_FILE = "id_ed25519";
-
- - - -
- -
-{coyote-configuration-contents 7} += -
-environment.sessionVariables.SSH_AUTH_SOCK = "/run/user/${builtins.toString USER_ID}/ssh-agent";
-
-systemd.user.services.ssh-add-key = {
-  wantedBy = ["default.target"];
-  after = ["ssh-agent.service"];
-  serviceConfig = {
-    Type = "oneshot";
-    ExecStartPre = "${pkgs.coreutils-full}/bin/sleep 1";
-    ExecStart = [
-      "${pkgs.openssh}/bin/ssh-add ${config.users.users.coyote.home}/.ssh/${KEY_FILE}"
-    ];
-    Restart = "on-failure";
-    RestartSec = 1;
-  };
-};
-
- - - -
-



-

- -
-

8. Home Manager configuration: coyote

-

let's get into the fun fun stuff, yaeh.

-

-

not forgetting to set the flake module for it first though. as mentioned in the -beginning, my preference is to have it loaded as a NixOS module. -

- -
-{coyote-configuration 7} += -
-home-manager.nixosModules.home-manager
-{
-  home-manager.useGlobalPkgs = true;
-  home-manager.useUserPackages = true;
-  home-manager.extraSpecialArgs = {inherit inputs;};
-  home-manager.users.coyote.imports = [
-    ({ pkgs, config, lib, inputs, ... }: {
-      {coyote-home-manager-configuration, 8}
-    })
-  ];
-}
-
- - -

Used in section 3

-
-

the basic contents structure is as follows. a separate section for programmes -should make it easier for including more software configurations in the future. -

- -
-{coyote-home-manager-configuration 8} -
-{coyote-home-manager-configuration-contents, 8}
-programs = {
-  {coyote-home-manager-programs, 8}
-};
-
- - - -
-

standard configuration stuff. -

- -
-{coyote-home-manager-configuration-contents 8} -
-home.stateVersion = "26.05"; # Nope, didn't read the comment either.
-home.username = "coyote";
-home.homeDirectory = "/home/coyote";
-home.shell.enableShellIntegration = true;
-
- - - -
-

now we get to configure the user packages! there's... not a lot of them. -

- -
-{coyote-home-manager-configuration-contents 8} += -
-home.packages = with pkgs; [
-  # TUI
-  tdf neocities
-  # productivity
-  libreoffice-fresh karp keepassxc pdfarranger thunderbird
-  # multimedia
-  furnace corrscope vlc haruna subtitlecomposer kid3 kdePackages.kdenlive
-  unstable.audacity lmms-full calf vital
-  # Internet
-  ungoogled-chromium
-  # games
-  osu-lazer-bin pcsx2 flycast hail
-  # emulation
-  (unstable.bottles.override {removeWarningPopup = true;})
-  # devel
-  unstable.racket unstable.lazygit mitscheme
-];
-
- - - -
-

next is (arguably) the more fun way to install and configure programmes, via -programme options. not every programme will get a dedicated section. for the -ones that are too short to consider notable, i'll have them clumped with a -bunch of others. -

- -
-{coyote-home-manager-programs 8} -
-{coyote-home-manager-programs-general, 8}
-{coyote-home-manager-programs-vim, 8}
-{coyote-home-manager-programs-fastfetch, 8}
-
- - - -
-

these don't need much explanation. (TODO: could try declaratively setting -LibreWolf profiles.) -

- -
-{coyote-home-manager-programs-general 8} -
-tmux = {
-  enable = true;
-  clock24 = true;
-  baseIndex = 1;
-  shortcut = "a";
-  keyMode = "vi";
-  terminal = "screen-256color";
-  escapeTime = 0;
-  extraConfig = ''
-    set -g pane-base-index 1
-    set-window-option -g pane-base-index 1
-    set-option -g renumber-windows on
-    set-option -g status-right "\"#W\""
-    set -ga terminal-overrides ",*:RGB"
-    set -g mouse on
-    set -g set-clipboard on
-  '';
-};
-
-librewolf.enable = true;
-librewolf.languagePacks = ["en-GB"];
-librewolf.settings = {
-  "privacy.resistFingerprinting" = false;
-  "librewolf.webgl.prompt" = false;
-  "identity.fxaccounts.enabled" = true;
-  "middlemouse.paste" = false;
-  "general.autoScroll" = true;
-  "browser.discovery.containers.enabled" = false;
-};
-
-yt-dlp.enable = true;
-yt-dlp.package = pkgs.unstable.yt-dlp;
-
-starship.package = pkgs.unstable.starship;
-
-obs-studio.enable = true;
-obs-studio.plugins = with pkgs.obs-studio-plugins; [
-  input-overlay droidcam-obs wlrobs
-];
-
- - - -
-

and here... lies my dreaded Vim configuration... -

- -
-{coyote-home-manager-programs-vim 8} -
-vim.enable = true;
-vim.packageConfigurable = pkgs.unstable.vim-full;
-vim.defaultEditor = true;
-vim.plugins = let
-  literate-vim = pkgs.vimUtils.buildVimPlugin {
-    name = "literate.vim";
-    src = pkgs.fetchFromGitHub {
-      owner = "zyedidia";
-      repo = "literate.vim";
-      rev = "4ffd45cb1657b67f4ed0eb639478a69209ec1f94";
-      sha256 = "sha256-X5iJyjeLBkKh4tUoDG8VDO6DwYVOI9DpRqpic8NinwA=";
-    };
-  };
-in
-  with pkgs.unstable.vimPlugins; [
-    gruvbox rainbow literate-vim undotree
-  ];
-
- - - -
-

.vimrc moment...

-

-

there's really not much, starting with bog-standard Vimscript for sensible -options, -

- -
-{coyote-home-manager-programs-vim 8} += -
-vim.extraConfig = ''
-  set nocompatible
-  set encoding=utf-8
-  set backspace=indent,eol,start
-  set clipboard=unnamedplus
-  set mouse=a
-  set history=1000
-  set updatetime=300
-
-  syntax on
-  set ruler
-  set showcmd
-  set showmode
-  set laststatus=1
-  set wildmenu
-  set wildmode=longest,list,full
-  set ttyfast
-  set lazyredraw
-
-  filetype plugin indent on
-  set autoindent
-  set smartindent
-  set expandtab
-  set smarttab
-  set tabstop=4
-  set shiftwidth=4
-  set softtabstop=4
-
-  set hlsearch
-  set incsearch
-  set ignorecase
-  set smartcase
-
- - - -
-

and you gotta map a keybind to output lambda to live out that Lisp/Scheme vibe -😎 (i barely can even code in them) -

- -
-{coyote-home-manager-programs-vim 8} += -
-  inoremap <C-l> λ
-
- - - -
-

i love Gruvbox... (hi Vimjoyer) -

- -
-{coyote-home-manager-programs-vim 8} += -
-  set termguicolors
-  set background=dark
-  colorscheme gruvbox
-  let g:terminal_ansi_colors = ['#282828', '#cc241d', '#98971a', '#d79921', '#458588', '#b16286', '#689d6a', '#a89984', '#928374', '#fb4934', '#b8bb26', '#fabd2f', '#83a598', '#d3869b', '#8ec07c', '#ebdbb2']
-
- - - -
-

finally, plugin configs! there's only one... -

- -
-{coyote-home-manager-programs-vim 8} += -
-  let g:rainbow_active = 1
-'';
-
- - - -
-

this part is kinda... bodgy, but, it's the only way i've found to consistently -configure per-language settings in Vim, thru Home Manager's home.file.<...> -dotfiles generation into ~/.vim/after/ftplugin/.

-

-

TODO: find a more efficient way of doing this, for sure.

-

-

we'll set a little function to automate that for us. -

- -
-{coyote-home-manager-configuration-contents 8} += -
-home.file = let
-mkVimAfterFtplugin = content: langs:
-  builtins.listToAttrs (map (lang: {
-      name = ".vim/after/ftplugin/${lang}.vim";
-      value = {text = content;};
-    })
-    langs);
-
- - - -
-

next are the actual per-language configurations for Vim. -

- -
-{coyote-home-manager-configuration-contents 8} += -
-tab2Vim = ''
-  setlocal expandtab
-  setlocal tabstop=2
-  setlocal shiftwidth=2
-  setlocal softtabstop=2
-'';
-tab4Vim = ''
-  setlocal expandtab
-  setlocal tabstop=4
-  setlocal shiftwidth=4
-  setlocal softtabstop=4
-'';
-tabsVim = ''
-  setlocal noexpandtab
-  setlocal tabstop=4
-  setlocal shiftwidth=4
-  setlocal softtabstop=0
-'';
-lispVim = ''
-  setlocal expandtab
-  setlocal tabstop=2
-  setlocal shiftwidth=2
-  setlocal softtabstop=2
-
-  setlocal lisp
-  setlocal autoindent
-  setlocal showmatch
-
-  setlocal lispwords+=defun,defmacro,defvar,defparameter,defmethod,define-syntax,lambda,let,let*,letre,flet,labels,progn,when,unless,if,cond
-'';
-
- - - -
-

now all we have to do is set the languages to their designated configs and all -the .vim files get generated automatically! -

- -
-{coyote-home-manager-configuration-contents 8} += -
-in
-  lib.mkMerge [
-    (mkVimAfterFtplugin tab2Vim ["javascript" "typescript" "html" "css" "json" "nix" "vim"])
-    (mkVimAfterFtplugin tab4Vim ["python" "rust" "java" "lua" "c" "cpp" "h" "hpp"])
-    (mkVimAfterFtplugin tabsVim ["go" "make"])
-    (mkVimAfterFtplugin lispVim ["lisp" "scheme" "clojure" "racket"])
-  ];
-
- - - -
-

moving to a little Fastfetch configuring just for pretty. mine is taken from -one of the preset settings but with a minified distro logo. -

- -
-{coyote-home-manager-programs-fastfetch 8} -
-fastfetch.enable = true;
-fastfetch.settings = {
-  "$schema" = "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json";
-  logo.type = "small";
-  logo.padding.top = 4;
-  logo.padding.left = 3;
-  logo.padding.right = 4;
-  display.separator = " ";
-  modules = [
-    {key = "╭─────────╮"; type = "custom";}
-    {key = "│ {#31}user    {#keys}│"; type = "title"; format = "{user-name}";}
-    {key = "│ {#32}host    {#keys}│"; type = "title"; format = "{host-name}";}
-    {key = "│ {#33}uptime  {#keys}│"; type = "uptime";}
-    {key = "│ {#34}distro  {#keys}│"; type = "os";}
-    {key = "│ {#35}kernel  {#keys}│"; type = "kernel";}
-    {key = "│ {#36}desktop {#keys}│"; type = "de";}
-    {key = "│ {#31}term    {#keys}│"; type = "terminal";}
-    {key = "│ {#32}shell   {#keys}│"; type = "shell";}
-    {key = "│ {#33}cpu     {#keys}│"; type = "cpu"; showPeCoreCount = true;}
-    {key = "│ {#34}disk    {#keys}│"; type = "disk"; folders = "/";}
-    {key = "│ {#35}memory  {#keys}│"; type = "memory";}
-    {key = "│ {#36}network {#keys}│"; type = "localip"; format = "{ipv4} ({ifname})";}
-    {key = "├─────────┤"; type = "custom";}
-    {key = "│ {#39}colors  {#keys}│"; type = "colors"; symbol = "circle";}
-    {key = "╰─────────╯"; type = "custom";}
-  ];
-};
-
- - - -
-



-

- -
-

9. licence

-

this configuration is provided under the MIT licence, a copy of which can be -read below. -

- -
-{LICENSE 9} -
-MIT License
-
-Copyright (c) 2026 asnev
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
- - - -
- -
- diff --git a/nixos.lit b/nixos.lit deleted file mode 100644 index 14221dd..0000000 --- a/nixos.lit +++ /dev/null @@ -1,858 +0,0 @@ -@code_type nix .nix -@comment_type # %s -@overwrite_css style.css - -@title asnev's NixOS configuration - -@s introduction - -welcome! this page is the literate configuration for my NixOS setup. here, -declarations are set to configure my (currently) only host system, `phostron`, -a ThinkPad L14 Gen 1, to use flakes, Home Manager, a global nixpkgs-unstable -overlay, alongside general NixOS configurations tailored to my hardware and -user environment preferences.

- -being a literate configuration file, this means that both the HTML page you're -reading right now, and the Nix flake file that get parsed when building the -system, are compiled from the *same* exact source file. that's literate -programming in a nutshell--programming with a documentation-first paradigm. -though of course, the details don't stop there. the rabbit hole can get really, -*really* deep; just ask your favourite search engine for all the -*breathtakingly comprehensive* NixOS configs (literate or otherwise) that are -out there!

- -you can get the source code at my repo [here](https://git.gay/asnev/nixos). - -> the latest version of this document is [hosted on my -> Neocities](https://asnev.neocities.org/nixos.html). - -

- -@s limitations - -this is a simple configuration. i don't have immediate plans in declaratively -configuring absolutely *everything* there is on my system. as someone who still -has many things to learn about Nix(OS), my current rationale is to configure -everything that's comfortably sensible. additional options and/or verbosity can -be added later as my configuration grows in the future (or not). following the -'simple' nature of my configuration, Home Manager is notably installed as a -NixOS module instead of being standalone. while doing so does make rebuilding -the user environment a bit annoying, personally, i don't mind it that -much.

- -this is also a simple configuration, in the way of the literate programming -tools used, which is [Literate](https://github.com/zyedidia/Literate). while it -does offer a very approachable format based on Markdown, it's a bit lacking in -that it can't provide syntax highlighting in multiple different languages -(you'll see the mixed-up colours later, sorry), and it can't export source code -files into files which live within subdirectories. i've resorted to let -*everything* reside within one `flake.nix` file which, while it does make users -who wish to navigate through the unwoven (without comments) configuration -expressions quite... annoying, at least everything is organised when viewed -through the literate source code.

- -eventually, when i can build up the courage... i'd like to begin my 'journey' -with Emacs and utilise Org-mode and Org-babel, a much, *much* more flexible -literate programming environment.
- -emphasis on 'eventually'...

- -i don't expect anyone reading this to be wishing to use *my* specific -configuration for their setup, so i'll skip over instructions for installing -the operating system and let the following configurations assume that a fresh, -flake-enabled NixOS system is present and ready to go. - -

- -@s flake structure - -we'll outline a basic flake for the system(s)... - ---- flake.nix -{ - description = "asnev's NixOS configuration"; - - inputs = { - nixpkgs = { - url = "github:nixos/nixpkgs/nixos-26.05"; - }; - nixpkgs-unstable = { - url = "github:nixos/nixpkgs/nixos-unstable"; - }; - home-manager = { - url = "github:nix-community/home-manager/release-26.05"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - }; - - outputs = inputs @ { - self, - nixpkgs, - nixpkgs-unstable, - home-manager, - ... - }: { - @{flake-modules} - }; -} ---- - -...and configure the modules. declared below are separate modules for the host, -user, and user environment managed by Home Manager. everything lives within the -one NixOS module, so it is structured thusly: - ---- flake-modules -nixosConfigurations.phostron = nixpkgs.lib.nixosSystem { - specialArgs = {inherit inputs;}; - modules = [ - @{phostron-configuration} - @{coyote-configuration} - ]; -}; ---- - -TODO: consider adding a shell environment module? - -

- -@s global NixOS options - -before getting into the host-specific configurations, here we set options that -get applied to *all* NixOS systems, regardless of machine. we'll start by -declaring the initial attribute set arguments, which will soon be a familiar -pattern here... - ---- nixos-configuration -({ config, lib, pkgs, inputs, ... }: { - @{nixos-configuration-contents} -}) ---- - -...then we set Nix-related declarations since we'd like to declare the system -to use flakes, and, to utilise [Lix](https://lix.systems), - ---- nixos-configuration-contents -nix.settings.experimental-features = ["nix-command" "flakes"]; -nix.settings.auto-optimise-store = true; -nix.package = pkgs.lixPackageSets.stable.lix; ---- - -but also have an overlay of `nixpkgs-unstable` to be available globally. this -is so that i can have unstable packages installed in userspaces managed via -Home Manager. plus, some additional tweaks for Lix. - ---- nixos-configuration-contents += -nixpkgs.config.allowUnfree = true; -nixpkgs.overlays = [ - (final: prev: { - unstable = import inputs.nixpkgs-unstable { - system = prev.stdenv.hostPlatform.system; - config.allowUnfree = true; - }; - }) - (final: prev: { - inherit (prev.lixPackageSets.stable) - nixpkgs-review - nix-eval-jobs - nix-fast-build - colmena; - }) -]; ---- - -getting into the rest of the options, let's configure the way the system should -boot. i like to have absolutely nothing being displayed as my computer turns -on. - ---- nixos-configuration-contents += -boot = { - loader.systemd-boot.enable = true; - loader.systemd-boot.configurationLimit = 10; - loader.efi.canTouchEfiVariables = true; - loader.timeout = 2; - kernelParams = ["quiet" "rd.udev.log_level=3" "rd.systemd.show_status=auto"]; - initrd.verbose = false; - consoleLogLevel = 3; - kernelPackages = pkgs.linuxPackages; -}; ---- - -next, some basic locale settings. - ---- nixos-configuration-contents += -time.timeZone = "Asia/Jakarta"; -i18n.defaultLocale = "en_GB.UTF-8"; ---- - -service options. note the options for PipeWire here. - ---- nixos-configuration-contents += -services = { - fwupd.enable = true; - xserver.xkb.layout = "us"; - locate.enable = true; - printing.enable = true; - openssh.enable = false; - pulseaudio.enable = false; - - pipewire.enable = true; - pipewire.alsa.enable = true; - pipewire.alsa.support32Bit = true; - pipewire.pulse.enable = true; -}; ---- - -basic security options and `doas` configuration. - ---- nixos-configuration-contents += -security.rtkit.enable = true; -security.sudo.enable = false; - -security.doas.enable = true; -security.doas.extraRules = [{ - groups = ["wheel"]; - keepEnv = true; - persist = true; -}]; ---- - -and now we get into the fun (translation: less boring) stuff with system -packages! - ---- nixos-configuration-contents += -environment.systemPackages = with pkgs; [ - nh alejandra literate git - # system utils - firmware-updater mtr gnupg ddate testdisk tree wget btop plocate traceroute - rlwrap entr unzip ffmpeg imagemagick gnome-disk-utility - # extra (oxidised) utils - fd bat xh tlrc dysk dust hyperfine ripgrep fzf eza -]; ---- - -if the list seems a bit sparse for desktop applications, that's intentional. i -prefer to keep those within userspace via Home Manager, which will be -explored later below.

- -let's set a few useful shell aliases, notably substituting `ls` for `eza` for a -prettier directory output. (TODO: consider figuring how to switch to `uutils` -globally maybe?) - ---- nixos-configuration-contents += -environment.shellAliases = { - sudo = "doas"; - l = "eza --grid --all"; - ll = "eza --long --all"; - ls = "eza --long"; - ".." = "cd .."; - "..." = "cd ../.."; - cat = "bat"; # this line is really funny to me -}; ---- - -quick fix for Librewolf not rendering text in its UI (as of 2026-07-30). - ---- nixos-configuration-contents += -environment.sessionVariables.XDG_DATA_DIRS = [ - "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}" - "${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}" -]; ---- - -here's the start of options for programmes... - ---- nixos-configuration-contents += -programs = { - @{nixos-configuration-programs-contents} -}; ---- - -nothing much here, starting with a few options to prettify the terminal a bit. - -> "zsh is bash with plugins; fish is zsh with plugins" -> --[0atman](https://youtu.be/rWMQ-g2QDsI?t=117) - -yes, the lambda (λ) as a terminal prompt character absolutely counts towards -style points. - ---- nixos-configuration-programs-contents -fish.enable = true; - -atuin.enable = true; -atuin.settings.sync_address = "https://api.atuin.sh"; -atuin.settings.enter_accept = true; - -starship.enable = true; -starship.transientPrompt.enable = true; -starship.transientPrompt.left = "starship module character"; -starship.settings = { - "$schema" = "https://starship.rs/config-schema.json"; - git_status = { - ahead = ">"; - behind = "<"; - diverged = "<>"; - renamed = "r"; - deleted = "d"; - }; - character.success_symbol = "[λ](bold green)"; - character.error_symbol = "[λ](bold red)"; -}; - -git.enable = true; -git.config = { - init.defaultBranch = "main"; - advice.defaultBranchName = false; - gpg.format = "ssh"; - commit.gpgSign = true; - url."https://github.com/".insteadOf = ["github:"]; -}; - -steam.enable = true; ---- - -a few one-off options here. these settings would be in the Home Manager section -if they existed there, but they don't, so, oh well. - ---- nixos-configuration-programs-contents += -obs-studio.enableVirtualCamera = true; -ssh.startAgent = true; ---- - -`nix-ld` is important for running generic binaries and AppImages. ironically, -i have yet felt the need to utilise software outside of the `nixpkgs` -repository, hence the sparse `libraries` pkgs list, lol. - ---- nixos-configuration-programs-contents += -nix-ld.enable = true; -nix-ld.libraries = with pkgs; [fuse e2fsprogs]; ---- - -fonts! because typography (and internationalisation) matters. - ---- nixos-configuration-contents += -fonts.packages = with pkgs; [ - # GUI fonts - inter corefonts vista-fonts roboto cantarell-fonts - # fonts for i18n - noto-fonts noto-fonts-cjk-sans noto-fonts-cjk-serif noto-fonts-color-emoji - noto-fonts-monochrome-emoji unifont unifont_upper unifont-csur - # terminal fonts - nerd-fonts.iosevka -]; ---- - -some font settings. - ---- nixos-configuration-contents += -fonts.fontconfig.antialias = true; -fonts.fontconfig.subpixel.rgba = "rgb"; ---- - -finally, XDG portal settings... which i'll admit i don't quite understand but -they're here so here they are. - ---- nixos-configuration-contents += -xdg.portal.enable = true; -xdg.portal.config.common.default = ["gtk"]; -xdg.portal.extraPortals = with pkgs; [xdg-desktop-portal-wlr]; ---- - -we're finished with the global config, let's move into the per-machine options. - -

- -@s host configuration: phostron - -we make sure that we load in the global options we've set, alongside a choice -of one's preferred graphical interface. - ---- phostron-configuration -@{nixos-configuration} -@{kde-plasma-configuration} ---- - -then we may start with configuring the machine specifically. with the NixOS -installer's automatically generated `hardware-configuration.nix` file, our job -is basically half done here. - ---- phostron-configuration += -({ config, lib, pkgs, modulesPath, ... }: { - @{phostron-hardware-configuration-contents} - @{phostron-configuration-contents} -}) ---- - -i'll copy over said file verbatim (excluding the pre-generated comment blurb at -the beginning of the file). - ---- phostron-hardware-configuration-contents -imports = [(modulesPath + "/installer/scan/not-detected.nix")]; - -boot.initrd.availableKernelModules = ["nvme" "ehci_pci" "xhci_pci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci"]; -boot.initrd.kernelModules = []; -boot.kernelModules = ["kvm-amd"]; -boot.extraModulePackages = []; - -fileSystems."/" = { - device = "/dev/disk/by-uuid/24fb172c-c29f-40c3-ae4d-ff652358563a"; - fsType = "ext4"; -}; - -fileSystems."/boot" = { - device = "/dev/disk/by-uuid/DFC9-994A"; - fsType = "vfat"; - options = ["fmask=0077" "dmask=0077"]; -}; - -swapDevices = [{device = "/dev/disk/by-uuid/91d96247-85c3-4e0a-93a2-5632b96179b6";}]; - -nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; -hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; ---- - -with that done, we can move on to the less scary stuff. - ---- phostron-configuration-contents -system.stateVersion = "26.05"; # I didn't read the comment. :) - -networking.hostName = "phostron"; -networking.networkmanager.enable = true; -networking.firewall.enable = true; - -services.printing.enable = true; -services.printing.drivers = [pkgs.epson-escpr]; - -hardware.bluetooth.enable = true; -hardware.sane.enable = true; -hardware.sane.extraBackends = [pkgs.epsonscan2]; ---- - -

- -@s desktop configuration: KDE Plasma - -let's bring ourselves to the 90s with a proper graphical user interface! and -have some additional apps to boot. - ---- kde-plasma-configuration -({pkgs, ...}: { - services.displayManager.sddm.enable = true; - services.desktopManager.plasma6.enable = true; - environment.systemPackages = with pkgs.kdePackages; [ - kate elisa bluez-qt kalk filelight kamoso konversation kmail ktorrent - kclock - ]; ---- - -> "Discover? Where we're going... we don't need Discover." - ---- kde-plasma-configuration += - environment.plasma6.excludePackages = [pkgs.kdePackages.discover]; -}) ---- - -i've set some additional options in how i'd like SDDM to look for `phostron` -specifically. - ---- phostron-configuration-contents += -services.displayManager.sddm.settings.Theme.Font = "Inter"; -services.displayManager.sddm.settings.Theme.CursorSize = 18; ---- - -(TODO: consider adding the `plasma-manager` flake module in the future?) - -

- -@s user configuration: coyote - -that's me. `:3c`

- -not just NixOS options, but also any other modules loaded into the system via -the flake, like Home Manager, as seen later. - ---- coyote-configuration -({ pkgs, config, ... }: let - @{coyote-configuration-variables} -in { - @{coyote-configuration-contents} -}) ---- - -let's get the user-specific NixOS options out of the way. basic user management -stuff and setting the default shell of choice. - ---- coyote-configuration-variables -USER_ID = 1000; ---- - ---- coyote-configuration-contents -users.users.coyote = { - isNormalUser = true; - description = "coyote"; - extraGroups = ["wheel" "networkmanager" "lp" "scanner"]; - uid = USER_ID; -}; -users.defaultUserShell = pkgs.unstable.fish; ---- - -for me, i have a little daemon blurb to get SSH for Git working... properly? i -can't remember--i think i stole this from GitHub somewhere...

- -there's another variable we need to set before getting there though. - ---- coyote-configuration-variables += -KEY_FILE = "id_ed25519"; ---- - ---- coyote-configuration-contents += -environment.sessionVariables.SSH_AUTH_SOCK = "/run/user/${builtins.toString USER_ID}/ssh-agent"; - -systemd.user.services.ssh-add-key = { - wantedBy = ["default.target"]; - after = ["ssh-agent.service"]; - serviceConfig = { - Type = "oneshot"; - ExecStartPre = "${pkgs.coreutils-full}/bin/sleep 1"; - ExecStart = [ - "${pkgs.openssh}/bin/ssh-add ${config.users.users.coyote.home}/.ssh/${KEY_FILE}" - ]; - Restart = "on-failure"; - RestartSec = 1; - }; -}; ---- - -

- -@s Home Manager configuration: coyote - -let's get into the *fun* fun stuff, [yaeh](https://youtu.be/SacogDL_4JU).

- -not forgetting to set the flake module for it first though. as mentioned in the -beginning, my preference is to have it loaded as a NixOS module. - ---- coyote-configuration += -home-manager.nixosModules.home-manager -{ - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - home-manager.extraSpecialArgs = {inherit inputs;}; - home-manager.users.coyote.imports = [ - ({ pkgs, config, lib, inputs, ... }: { - @{coyote-home-manager-configuration} - }) - ]; -} ---- - -the basic contents structure is as follows. a separate section for programmes -should make it easier for including more software configurations in the future. - ---- coyote-home-manager-configuration -@{coyote-home-manager-configuration-contents} -programs = { - @{coyote-home-manager-programs} -}; ---- - -standard configuration stuff. - ---- coyote-home-manager-configuration-contents -home.stateVersion = "26.05"; # Nope, didn't read the comment either. -home.username = "coyote"; -home.homeDirectory = "/home/coyote"; -home.shell.enableShellIntegration = true; ---- - -now we get to configure the user packages! there's... not a lot of them. - ---- coyote-home-manager-configuration-contents += -home.packages = with pkgs; [ - # TUI - tdf neocities - # productivity - libreoffice-fresh karp keepassxc pdfarranger thunderbird - # multimedia - furnace corrscope vlc haruna subtitlecomposer kid3 kdePackages.kdenlive - unstable.audacity lmms-full calf vital - # Internet - ungoogled-chromium - # games - osu-lazer-bin pcsx2 flycast hail - # emulation - (unstable.bottles.override {removeWarningPopup = true;}) - # devel - unstable.racket unstable.lazygit mitscheme -]; ---- - -next is (arguably) the more fun way to install and configure programmes, via -programme options. not every programme will get a dedicated section. for the -ones that are too short to consider notable, i'll have them clumped with a -bunch of others. - ---- coyote-home-manager-programs -@{coyote-home-manager-programs-general} -@{coyote-home-manager-programs-vim} -@{coyote-home-manager-programs-fastfetch} ---- - -these don't need much explanation. (TODO: could try declaratively setting -LibreWolf profiles.) - ---- coyote-home-manager-programs-general -tmux = { - enable = true; - clock24 = true; - baseIndex = 1; - shortcut = "a"; - keyMode = "vi"; - terminal = "screen-256color"; - escapeTime = 0; - extraConfig = '' - set -g pane-base-index 1 - set-window-option -g pane-base-index 1 - set-option -g renumber-windows on - set-option -g status-right "\"#W\"" - set -ga terminal-overrides ",*:RGB" - set -g mouse on - set -g set-clipboard on - ''; -}; - -librewolf.enable = true; -librewolf.languagePacks = ["en-GB"]; -librewolf.settings = { - "privacy.resistFingerprinting" = false; - "librewolf.webgl.prompt" = false; - "identity.fxaccounts.enabled" = true; - "middlemouse.paste" = false; - "general.autoScroll" = true; - "browser.discovery.containers.enabled" = false; -}; - -yt-dlp.enable = true; -yt-dlp.package = pkgs.unstable.yt-dlp; - -starship.package = pkgs.unstable.starship; - -obs-studio.enable = true; -obs-studio.plugins = with pkgs.obs-studio-plugins; [ - input-overlay droidcam-obs wlrobs -]; ---- - -and here... lies my dreaded Vim configuration... - ---- coyote-home-manager-programs-vim -vim.enable = true; -vim.packageConfigurable = pkgs.unstable.vim-full; -vim.defaultEditor = true; -vim.plugins = let - literate-vim = pkgs.vimUtils.buildVimPlugin { - name = "literate.vim"; - src = pkgs.fetchFromGitHub { - owner = "zyedidia"; - repo = "literate.vim"; - rev = "4ffd45cb1657b67f4ed0eb639478a69209ec1f94"; - sha256 = "sha256-X5iJyjeLBkKh4tUoDG8VDO6DwYVOI9DpRqpic8NinwA="; - }; - }; -in - with pkgs.unstable.vimPlugins; [ - gruvbox rainbow literate-vim undotree - ]; ---- - -`.vimrc` moment...

- -there's really not much, starting with bog-standard Vimscript for sensible -options, - ---- coyote-home-manager-programs-vim += -vim.extraConfig = '' - set nocompatible - set encoding=utf-8 - set backspace=indent,eol,start - set clipboard=unnamedplus - set mouse=a - set history=1000 - set updatetime=300 - - syntax on - set ruler - set showcmd - set showmode - set laststatus=1 - set wildmenu - set wildmode=longest,list,full - set ttyfast - set lazyredraw - - filetype plugin indent on - set autoindent - set smartindent - set expandtab - set smarttab - set tabstop=4 - set shiftwidth=4 - set softtabstop=4 - - set hlsearch - set incsearch - set ignorecase - set smartcase ---- - -and you gotta map a keybind to output lambda to live out that Lisp/Scheme vibe -😎 (i barely can even code in them) - ---- coyote-home-manager-programs-vim += - inoremap λ ---- - -i love Gruvbox... (hi Vimjoyer) - ---- coyote-home-manager-programs-vim += - set termguicolors - set background=dark - colorscheme gruvbox - let g:terminal_ansi_colors = ['#282828', '#cc241d', '#98971a', '#d79921', '#458588', '#b16286', '#689d6a', '#a89984', '#928374', '#fb4934', '#b8bb26', '#fabd2f', '#83a598', '#d3869b', '#8ec07c', '#ebdbb2'] ---- - -finally, plugin configs! there's only one... - ---- coyote-home-manager-programs-vim += - let g:rainbow_active = 1 -''; ---- - -this part is kinda... bodgy, but, it's the only way i've found to consistently -configure per-language settings in Vim, thru Home Manager's `home.file.<...>` -dotfiles generation into `~/.vim/after/ftplugin/`.

- -TODO: find a more efficient way of doing this, for sure.

- -we'll set a little function to automate that for us. - ---- coyote-home-manager-configuration-contents += -home.file = let -mkVimAfterFtplugin = content: langs: - builtins.listToAttrs (map (lang: { - name = ".vim/after/ftplugin/${lang}.vim"; - value = {text = content;}; - }) - langs); ---- - -next are the actual per-language configurations for Vim. - ---- coyote-home-manager-configuration-contents += -tab2Vim = '' - setlocal expandtab - setlocal tabstop=2 - setlocal shiftwidth=2 - setlocal softtabstop=2 -''; -tab4Vim = '' - setlocal expandtab - setlocal tabstop=4 - setlocal shiftwidth=4 - setlocal softtabstop=4 -''; -tabsVim = '' - setlocal noexpandtab - setlocal tabstop=4 - setlocal shiftwidth=4 - setlocal softtabstop=0 -''; -lispVim = '' - setlocal expandtab - setlocal tabstop=2 - setlocal shiftwidth=2 - setlocal softtabstop=2 - - setlocal lisp - setlocal autoindent - setlocal showmatch - - setlocal lispwords+=defun,defmacro,defvar,defparameter,defmethod,define-syntax,lambda,let,let*,letre,flet,labels,progn,when,unless,if,cond -''; ---- - -now all we have to do is set the languages to their designated configs and all -the `.vim` files get generated automatically! - ---- coyote-home-manager-configuration-contents += -in - lib.mkMerge [ - (mkVimAfterFtplugin tab2Vim ["javascript" "typescript" "html" "css" "json" "nix" "vim"]) - (mkVimAfterFtplugin tab4Vim ["python" "rust" "java" "lua" "c" "cpp" "h" "hpp"]) - (mkVimAfterFtplugin tabsVim ["go" "make"]) - (mkVimAfterFtplugin lispVim ["lisp" "scheme" "clojure" "racket"]) - ]; ---- - -moving to a little Fastfetch configuring just for pretty. mine is taken from -one of the preset settings but with a minified distro logo. - ---- coyote-home-manager-programs-fastfetch -fastfetch.enable = true; -fastfetch.settings = { - "$schema" = "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json"; - logo.type = "small"; - logo.padding.top = 4; - logo.padding.left = 3; - logo.padding.right = 4; - display.separator = " "; - modules = [ - {key = "╭─────────╮"; type = "custom";} - {key = "│ {#31}user {#keys}│"; type = "title"; format = "{user-name}";} - {key = "│ {#32}host {#keys}│"; type = "title"; format = "{host-name}";} - {key = "│ {#33}uptime {#keys}│"; type = "uptime";} - {key = "│ {#34}distro {#keys}│"; type = "os";} - {key = "│ {#35}kernel {#keys}│"; type = "kernel";} - {key = "│ {#36}desktop {#keys}│"; type = "de";} - {key = "│ {#31}term {#keys}│"; type = "terminal";} - {key = "│ {#32}shell {#keys}│"; type = "shell";} - {key = "│ {#33}cpu {#keys}│"; type = "cpu"; showPeCoreCount = true;} - {key = "│ {#34}disk {#keys}│"; type = "disk"; folders = "/";} - {key = "│ {#35}memory {#keys}│"; type = "memory";} - {key = "│ {#36}network {#keys}│"; type = "localip"; format = "{ipv4} ({ifname})";} - {key = "├─────────┤"; type = "custom";} - {key = "│ {#39}colors {#keys}│"; type = "colors"; symbol = "circle";} - {key = "╰─────────╯"; type = "custom";} - ]; -}; ---- - -

- -@s licence - -this configuration is provided under the MIT licence, a copy of which can be -read below. - ---- "LICENSE" -MIT License - -Copyright (c) 2026 asnev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. ---- diff --git a/style.css b/style.css deleted file mode 100644 index 6435d5f..0000000 --- a/style.css +++ /dev/null @@ -1 +0,0 @@ -body{min-width:200px;max-width:780px;margin:0 auto;padding:30px;font-family:Inter,Arial,sans-serif;font-size:1em}pre,code,.codeblock_name{font-family:Iosevka,Consolas,monospace}pre{-moz-tab-size:4;-o-tab-size:4;tab-size:4}pre.prettyprint{color:#ab9bab;font-size:10pt;line-height:1.5;padding:10px;border-radius:10px;white-space:pre-wrap}.prettyprint{background:#1d1f21!important;font-family:Iosevka,Consolas,monospace!important;border:0!important}pre code{padding:0!important;background:transparent!important;border:0!important}.pln{color:#c5c8c6}.str{color:#918b3b}.kwd{color:#7b59c0}.com{color:#9e8f9e}.typ,.fun{color:#516aec}.lit,.atn,.dec{color:#a65926}.clo,.opn,.pun{color:#1b181b}.tag,.var{color:#ca402b}.atv{color:#159393}ol.linenums{margin:0;color:#969896}li.L0,li.L1,li.L2,li.L3,li.L4,li.L5,li.L6,li.L7,li.L8,li.L9{padding-left:1em;background-color:#1d1f21;list-style-type:decimal}.math{font-size:10pt;text-indent:0}.chapter-nav{font-size:10pt}.codeblock{page-break-inside:avoid;padding-bottom:15px}.codeblock_name{margin-top:1.25em;display:block}.codeblock_name,.seealso{font-size:8pt!important}h4{padding-right:1.25em}h4.noheading{margin-bottom:0}p:not(.notp){margin:0;text-indent:0!important}code{font-size:1em;padding:2px 4px;background:#f7f3f7;border:1px solid #d8cad8;border-radius:4px}blockquote{font-style:italic;border-left:4px solid #969896;background:#f7f3f7;padding:10px 20px;margin:15px 0}.two-col{list-style-type:none}.two-col li:before{content:collapse;content:'-';padding:5px;margin-right:5px;color:orange;background-color:#fff;display:inline-block}a:link,a:visited{color:#00f}a:link{text-decoration:none}a:link:not(.lit):hover{color:#00f;text-decoration:underline}a:link:active{color:red}p:not(.seealso) a::after{content:" (" attr(href) ")";font-size:0.7em}@media screen{.str{color:#b5bd68}.kwd{color:#b294bb}.com{color:#969896}.typ,.fun{color:#81a2be}.lit,.atn,.dec{color:#de935f}.pun,.opn,.clo{color:#c5c8c6}.tag,.var{color:#c66}.atv{color:#8abeb7}}@media print{body{font-size:10pt}pre.prettyprint{font-size:8pt}.seealso{font-size:9pt}.codeblock_name,.math{font-size:8pt}}