├── .envrc ├── .gitattributes ├── .gitignore ├── README.md ├── THEME.txt ├── darwin.nix ├── docs └── asahi-luks.md ├── doom ├── config.el ├── custom.el ├── init.el └── packages.el ├── easyeffects ├── Apple AirPods Pro (2nd generation) ParametricEq.txt ├── Audio-Technica ATH-M50x ParametricEq.txt └── EasyEffects Microphone Preset: Masc NPR Voice + Noise Reduction.json ├── flake.lock ├── flake.nix ├── hardware ├── corbookair-nixos.nix ├── corbookpro-nixos.nix ├── corwork.nix ├── raspberry-pi.nix ├── vm-aarch64-parallels.nix ├── vm-aarch64-utm.nix └── vm-aarch64-vmware.nix ├── home-modules ├── aerospace.nix ├── aerospace.toml ├── awesome.nix ├── awesome │ ├── rc.lua │ └── theme.lua ├── bat.nix ├── chromium.nix ├── darwin.nix ├── direnv.nix ├── emacs.nix ├── flameshot.nix ├── fuzzel.nix ├── ghostty.nix ├── git.nix ├── gpg.nix ├── gtk.nix ├── helix.nix ├── kanshi.nix ├── lazygit.nix ├── niri.nix ├── nushell │ ├── config.nu │ ├── env.nu │ └── nushell.nix ├── packages.nix ├── ranger.nix ├── rofi.nix ├── stylix.nix ├── swaylock.nix ├── tmux.nix ├── waybar.nix ├── yazi.nix ├── yazi │ └── plugins │ │ └── smart-enter.yazi │ │ └── init.lua ├── zed.nix ├── zellij-config.kdl ├── zellij-layout-combined.kdl ├── zellij-layout.kdl ├── zellij.nix ├── zoxide.nix └── zsh.nix ├── machines ├── corbookair-nixos.nix ├── corbookpro-nixos.nix ├── corwork.nix ├── raspberry-pi.nix └── symbols │ └── mac-backtick-fix ├── modules ├── caddy.nix ├── code-server.nix ├── darwin.nix ├── docker.nix ├── environment.nix ├── fonts.nix ├── networking.nix ├── niri.nix ├── nix.nix ├── nixpkgs.nix ├── openssh.nix ├── stylix.nix ├── system-packages.nix ├── tailscale.nix ├── thunar.nix ├── users.nix ├── vmware-guest.nix ├── wireplumber.nix ├── xrandr.nix ├── xserver.nix └── zsh.nix ├── nixos.nix ├── vscode ├── keybindings.json └── settings.json └── wallpapers ├── eclipse.jpg ├── lake.jpg ├── leapoard-server.jpg ├── leaves.jpg ├── mountains.jpg ├── nix-space.jpg ├── purple.png ├── rose_pine.png ├── rose_pine_blockwavemoon.png ├── tiger.jpg └── waves.png /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.jpg filter=lfs diff=lfs merge=lfs -text 2 | *.png filter=lfs diff=lfs merge=lfs -text 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | result 2 | .direnv 3 | **/.claude/settings.local.json 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nixos-config 2 | 3 | My [NixOS](https://nixos.org), [nix-darwin](http://daiderd.com/nix-darwin/) and [Home Manager](https://github.com/nix-community/home-manager) configurations. 4 | 5 | ## Structure 6 | 7 | I use NixOS inside of a OrbStack on a M3 Mac running macOS. In addition to this, I use nix-darwin to configure macOS with `nix-darwin`. Both of these setups also use Home Manager. 8 | 9 | ### Modules 10 | 11 | There are two kinds of modules: 12 | 13 | 1. `modules/`, which define **NixOS** or **nix-darwin** level options. 14 | 2. `home-modules/`, which define **Home Manager** options on both NixOS and macOS. 15 | 16 | ### Configuration generating functions 17 | 18 | The modules mentioned above are imported inside of two configuration generation functions: 19 | 20 | 1. `./nixos.nix`, this function generates a `nixosConfiguration` 21 | 2. `./darwin.nix`, this function generates a `darwinConfiguration` 22 | 23 | These fucntions are used in `./flake.nix`'s `nixosConfigurations` and `darwinConfigurations` 24 | 25 | ## How to fork this configuration for your own usage 26 | 27 | _NOTE: These instructions are out of date_ 28 | 29 | 1. Do a project-wide search of my username, `cor` and replace it with `your_username`. Be careful not to replace things that are not my username, such as "core". 30 | 2. In `./nixos.nix`, replace the value of `hashedPassword` with one you've generated with `mkpasswd -m sha-512` [See here for more info](https://search.nixos.org/options?channel=22.05&show=users.users.%3Cname%3E.hashedPassword&from=0&size=50&sort=relevance&type=packages&query=users.users.%3Cname%3E.hash). 31 | 3. In `./programs/git.nix`, change `userName` and `extraConfig.github.user` to your GitHub username. Also change `signing.key` to the public GPG key you use for your GitHub account. 32 | 33 | ## OrbStack NixOS config 34 | 35 | 1. Download [OrbStack](https://orbstack.dev/) 36 | 2. Click Machines > New Machine 37 | 3. Select NixOS 24.05, CPU type Apple 38 | 4. Click create 39 | 5. Download this repo into `/home/cor/nixos-config` 40 | 6. Run `make` 41 | 42 | ## macOS Nix config with `nix-darwin` 43 | 44 | *NOTE: macOS Nix config is not required for setting up the NixOS VM. For instructions on this, check the previous section* 45 | 46 | *Make sure not to install **Homebrew** or **Xcode Command Line Tools**!* 47 | 48 | 1. Do a clean install macOS, deny analytics. 49 | 2. Install `Nix` on macOS with [the installer](https://nixos.org/download.html#nix-install-macos) 50 | 3. In ~, execute `nix-shell -p git --command "git clone https://github.com/cor/nixos-config"` 51 | 4. Install `nix-darwin` with [the nix-darwin installer](https://github.com/LnL7/nix-darwin). 52 | 5. Restart **Terminal.app** 53 | 6. `sudo mv /etc/nix/nix.conf /etc/nix/nix.conf.original` 54 | 7. In `~/nixos-config`, execute `nix-shell --no-sandbox -p cmake --command "make switch-darwin"` 55 | 8. [Download 1Password](https://1password.com/download) and browser extension 56 | 9. From 1Password, download SSH keys: `id_ed25519` and `id_ed25519.pub`. Move them to `~/.ssh~` 57 | 10. From 1Password, download GPG keys: `secret-key-backup.asc`. Import them with: `gpg --import ./secret-key-backup.asc`. Afterwards, run `rm ./secret-key-backup.asc` 58 | 11. From 1Password, download GPG `trust-db-backup.txt`. Import them with: `gpg --import-ownertrust < ./trustdb-backup.txt`, Afterwards, run `rm ./trustdb-backup.txt` 59 | 60 | ### Native apps to install 61 | 62 | - OrbStack 63 | - Ghostty 64 | - Tailscale 65 | - 1Password 66 | 67 | - Brave 68 | - Firefox 69 | 70 | - Signal 71 | - Telegram 72 | - ElementX 73 | 74 | - Portal 75 | - reMarkable 76 | - World Clock 77 | 78 | - Balance Lock 79 | - Vivid 80 | - Hidden Bar 81 | - Advanced Screen Share 82 | 83 | - Gifski 84 | - Photomator 85 | - Pixelmator 86 | - Final Cut Pro 87 | 88 | - AeroSpace 89 | - Lasso 90 | 91 | 92 | ### Settings to change 93 | 94 | 1. Change Screenshots folder and file format 95 | 2. Disable "automatically re-arrange spaces" 96 | 3. Disable auto brightness and true tone 97 | 4. Set capslock to control 98 | 5. Disable "recent apps" in Dock 99 | 6. Add screenshots folder to Dock 100 | 7. Sign in to email accounts 101 | 8. Set Safari search engine to DuckDuckGo 102 | 9. Enable Safari develop menu 103 | 10. Disable autocorrect everywhere 104 | 11. Enable "download full photos library" in Photos 105 | 106 | ## Raspberry Pi setup 107 | 108 | To bootstrap the SD card: 109 | 110 | 1. Enter orbstack 111 | 2. `nix build '.#nixosConfigurations.raspberry-pi.config.system.build.sdImage'` 112 | 3. `cp ./result/sd-image/nixos-...-linux.img.zst /Users/cor/Desktop` 113 | 4. On macOS, download [rpi-imager](https://www.raspberrypi.com/software/) 114 | 5. Insert SD card into MacBook 115 | 6. Flash the `.img.zst` from your Desktop to the rPi's sd card. 116 | 7. Insert sd card into raspberry pi and click the power button 117 | 118 | Your Raspberry Pi should now be bootstrapped and you should be able to SSH into it. 119 | 120 | To udpate the pi from the pi itself 121 | 122 | 1. clone this repo on the pi 123 | 2. `sudo nixos-rebuild switch --flake .#raspberry-pi` 124 | 125 | --- 126 | 127 | Config is partially based on https://github.com/mitchellh/nixos-config 128 | -------------------------------------------------------------------------------- /THEME.txt: -------------------------------------------------------------------------------- 1 | dark -------------------------------------------------------------------------------- /darwin.nix: -------------------------------------------------------------------------------- 1 | # This function creates a NixOS system based on our VM setup for a 2 | # particular architecture. 3 | name: { inputs, nixpkgs, home-manager, system, user, darwin }: 4 | let 5 | pkgs-unstable = import inputs.nixpkgs-unstable { inherit system; config.allowUnfree = true; }; 6 | in 7 | darwin.lib.darwinSystem { 8 | system = "aarch64-darwin"; 9 | 10 | # nix-darwin level modules 11 | modules = [ 12 | ./modules/nix.nix 13 | ./modules/zsh.nix 14 | ./modules/darwin.nix 15 | 16 | # The home-manager nix-darwin module 17 | home-manager.darwinModules.home-manager 18 | { 19 | users.users.cor = { 20 | name = "cor"; 21 | home = "/Users/cor"; 22 | }; 23 | home-manager = { 24 | useGlobalPkgs = true; 25 | useUserPackages = true; 26 | users.cor = { 27 | # Home-manager level modules 28 | imports = [ 29 | ./home-modules/darwin.nix 30 | ./home-modules/direnv.nix 31 | ./home-modules/ghostty.nix 32 | ./home-modules/git.nix 33 | ./home-modules/gpg.nix 34 | ./home-modules/zsh.nix 35 | # ./home-modules/kitty.nix 36 | # ./home-modules/helix.nix 37 | # ./home-modules/lazygit.nix 38 | # ./home-modules/wezterm.nix 39 | # ./home-modules/zellij.nix 40 | # ./home-modules/yazi.nix 41 | # ./home-modules/aerospace.nix 42 | ]; 43 | }; 44 | # Arguments that are exposed to every `home-module`. 45 | extraSpecialArgs = { 46 | inherit pkgs-unstable; 47 | theme = "dark"; 48 | currentSystemName = name; 49 | currentSystem = system; 50 | isDarwin = true; 51 | inherit inputs; 52 | }; 53 | }; 54 | } 55 | 56 | # Arguments that are exposed to every `module`. 57 | { 58 | config._module.args = { 59 | inherit pkgs-unstable; 60 | currentSystemName = name; 61 | currentSystem = system; 62 | isDarwin = true; 63 | }; 64 | } 65 | ]; 66 | inputs = { inherit darwin nixpkgs inputs; }; 67 | } 68 | -------------------------------------------------------------------------------- /docs/asahi-luks.md: -------------------------------------------------------------------------------- 1 | SOURCE: https://github.com/vilvo/mxdots/blob/main/README.md 2 | 3 | --- 4 | 5 | Archived because dotfiles of apple-silicon hosts are merged to https://github.com/vilvo/dotfiles 6 | 7 | # NixOS dotfiles on Apple M1 devices 8 | 9 | ## Why 10 | 11 | Great laptops with Linux. If you do `aarch64` development, native is better than cross-compilation. 12 | 13 | ## Basic usage 14 | 15 | ``` 16 | nix flake update 17 | sudo nixos-rebuild switch --flake .#blub --impure 18 | ``` 19 | 20 | `--impure` is required because of Apple firmware at `/boot/asahi` 21 | 22 | ## Prerequisities 23 | 24 | * [Read these instructions](https://github.com/tpwrules/nixos-apple-silicon/blob/main/docs/uefi-standalone.md) 25 | * Instead of just formatting the new root partition, use cryptsetup for LUKS 26 | 27 | ## Disk encryption with systemd-boot 28 | 29 | When you have created the root partition to fill up the free space, use cryptsetup: 30 | 31 | ``` 32 | cryptsetup luksFormat -type luks1 /dev/nvme0n1p5 33 | cryptsetup luksOpen /dev/nvme0n1p5 encrypted 34 | pvcreate /dev/mapper/encrypted 35 | vgcreate vg /dev/mapper/encrypted 36 | lvcreate -L 16G -n swap vg 37 | lvcreate -l '100%FREE' -n nixos vg 38 | mkfs.ext4 -L nixos /dev/vg/nixos 39 | mkswap -L swap /dev/vg/swap 40 | swapon /dev/vg/swap 41 | ``` 42 | 43 | Continue with the instructions [from NixOS Configuration](https://github.com/tpwrules/nixos-apple-silicon/blob/main/docs/uefi-standalone.md#nixos-configuration). 44 | 45 | After you've run `nixos-generate-config`, edit `configuration.nix`: 46 | 47 | ``` 48 | boot.loader.systemd-boot.enable = true; 49 | boot.loader.efi.canTouchEfiVariables = false; 50 | # check the uuid of your partition with lsblk -f - NOTE: "encrypted" must match whatever you set with cryptsetup luksOpen 51 | boot.initrd.luks.devices."encrypted".device = "/dev/disk/by-uuid/"; 52 | ``` 53 | 54 | Continue the configuration and finish the NixOS Installation. Boot and type your LUKS password in NixOS Stage 1. 55 | 56 | ## What if something goes wrong? 57 | 58 | * [Read these instructions](https://github.com/tpwrules/nixos-apple-silicon/blob/main/docs/uefi-standalone.md). 59 | * Really. The instructions covers all but encrypting your disk. 60 | * Really, even if you f your M1 internal NVMe - it covers the recovery with another Apple device. 61 | * Use idevicerestore and macOS 12.4. 62 | 63 | ## Thanks 64 | 65 | * @tpwrules for [`nixos-apple-silicon`](https://github.com/tpwrules/nixos-apple-silicon) 66 | * @yusernapora for above with flakes - [blog post worth reading](https://yusef.napora.org/blog/nixos-asahi/) 67 | 68 | I only added disk encryption and simplified the flake config with M1 host only. -------------------------------------------------------------------------------- /doom/config.el: -------------------------------------------------------------------------------- 1 | ;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- 2 | 3 | ;; Place your private configuration here! Remember, you do not need to run 'doom 4 | ;; sync' after modifying this file! 5 | 6 | 7 | ;; Some functionality uses this to identify you, e.g. GPG configuration, email 8 | ;; clients, file templates and snippets. It is optional. 9 | (setq user-full-name "cor" 10 | user-mail-address "cor@pruijs.dev") 11 | 12 | ;; Doom exposes five (optional) variables for controlling fonts in Doom: 13 | ;; 14 | ;; - `doom-font' -- the primary font to use 15 | ;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable) 16 | ;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for 17 | ;; presentations or streaming. 18 | ;; - `doom-symbol-font' -- for symbols 19 | ;; - `doom-serif-font' -- for the `fixed-pitch-serif' face 20 | ;; 21 | ;; See 'C-h v doom-font' for documentation and more examples of what they 22 | ;; accept. For example: 23 | ;; 24 | ;;(setq doom-font (font-spec :family "Fira Code" :size 12 :weight 'semi-light) 25 | ;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13)) 26 | ;; 27 | ;; If you or Emacs can't find your font, use 'M-x describe-font' to look them 28 | ;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to 29 | ;; refresh your font settings. If Emacs still can't find your font, it likely 30 | ;; wasn't installed correctly. Font issues are rarely Doom issues! 31 | 32 | ;; There are two ways to load a theme. Both assume the theme is installed and 33 | ;; available. You can either set `doom-theme' or manually load a theme with the 34 | ;; `load-theme' function. This is the default: 35 | (setq doom-theme 'doom-one) 36 | 37 | ;; This determines the style of line numbers in effect. If set to `nil', line 38 | ;; numbers are disabled. For relative line numbers, set this to `relative'. 39 | (setq display-line-numbers-type t) 40 | 41 | ;; If you use `org' and don't want your org files in the default location below, 42 | ;; change `org-directory'. It must be set before org loads! 43 | (setq org-directory "~/org/") 44 | 45 | 46 | ;; needed for magit forge 47 | (setq auth-sources '("/home/cor/.authinfo")) 48 | 49 | 50 | ;; Whenever you reconfigure a package, make sure to wrap your config in an 51 | ;; `after!' block, otherwise Doom's defaults may override your settings. E.g. 52 | ;; 53 | ;; (after! PACKAGE 54 | ;; (setq x y)) 55 | ;; 56 | ;; The exceptions to this rule: 57 | ;; 58 | ;; - Setting file/directory variables (like `org-directory') 59 | ;; - Setting variables which explicitly tell you to set them before their 60 | ;; package is loaded (see 'C-h v VARIABLE' to look up their documentation). 61 | ;; - Setting doom variables (which start with 'doom-' or '+'). 62 | ;; 63 | ;; Here are some additional functions/macros that will help you configure Doom. 64 | ;; 65 | ;; - `load!' for loading external *.el files relative to this one 66 | ;; - `use-package!' for configuring packages 67 | ;; - `after!' for running code after a package has loaded 68 | ;; - `add-load-path!' for adding directories to the `load-path', relative to 69 | ;; this file. Emacs searches the `load-path' when you load packages with 70 | ;; `require' or `use-package'. 71 | ;; - `map!' for binding new keys 72 | ;; 73 | ;; To get information about any of these functions/macros, move the cursor over 74 | ;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). 75 | ;; This will open documentation for it, including demos of how they are used. 76 | ;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, 77 | ;; etc). 78 | ;; 79 | ;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how 80 | ;; they are implemented. 81 | ;; (require 'dap-gdb) 82 | ;; (require 'dap-cpptools) 83 | ;; (defun dotspacemacs/user-load () 84 | (after! dap-mode 85 | (require 'dap-cpptools)) 86 | ;;(require 'dap-gdb-lldb) 87 | ;; (dap-register-debug-template "Rust::GDB Run Configuration" 88 | ;; (list :type "gdb" 89 | ;; :request "launch" 90 | ;; :name "GDB::Run" 91 | ;; :gdbpath "rust-gdb" 92 | ;; :target nil 93 | ;; :cwd nil)) 94 | ;; (dap-register-debug-template "Rust LLDB Debug Configuration" 95 | ;; (list :type "cppdbg" 96 | ;; :request "launch" 97 | ;; :name "Rust::Run" 98 | ;; :MIMode "lldb" 99 | ;; :gdbpath "rust-lldb" 100 | ;; :program (concat (projectile-project-root) "target/debug/" (projectile-project-name)) ;; Requires that the rust project is a project in projectile 101 | ;; :environment [] 102 | ;; :cwd (projectile-project-root))) 103 | 104 | ;; (setq browse-url-browser-function 'browse-url-generic 105 | ;; browse-url-generic-program "open") 106 | 107 | (defun my-browse-url (url &optional _new-window) 108 | "Open URL using `open`, escaping it appropriately." 109 | (let ((url-encoded (browse-url-encode-url url))) 110 | (start-process "open-url" nil "open" url-encoded))) 111 | 112 | (setq browse-url-browser-function 'my-browse-url) 113 | 114 | (defun btv-forge-browse-buffer-file () 115 | (interactive) 116 | (browse-url 117 | (let 118 | ((rev (magit-rev-abbrev "HEAD")) 119 | (repo (forge-get-repository 'stub)) 120 | (file (magit-file-relative-name buffer-file-name)) 121 | (highlight 122 | (if 123 | (use-region-p) 124 | (let ((l1 (line-number-at-pos (region-beginning))) 125 | (l2 (line-number-at-pos (- (region-end) 1)))) 126 | (format "#L%d-L%d" l1 l2)) 127 | "" 128 | ))) 129 | (forge--format repo "https://%h/%o/%n/blob/%r/%f%L" 130 | `((?r . ,rev) (?f . ,file) (?L . ,highlight)))))) 131 | -------------------------------------------------------------------------------- /doom/custom.el: -------------------------------------------------------------------------------- 1 | ;;; -*- lexical-binding: t -*- 2 | (custom-set-variables 3 | ;; custom-set-variables was added by Custom. 4 | ;; If you edit it by hand, you could mess it up, so be careful. 5 | ;; Your init file should contain only one such instance. 6 | ;; If there is more than one, they won't work right. 7 | '(custom-safe-themes 8 | '("2b501400e19b1dd09d8b3708cefcb5227fda580754051a24e8abf3aff0601f87" 9 | "456697e914823ee45365b843c89fbc79191fdbaff471b29aad9dcbe0ee1d5641" 10 | "56044c5a9cc45b6ec45c0eb28df100d3f0a576f18eef33ff8ff5d32bac2d9700" 11 | "d481904809c509641a1a1f1b1eb80b94c58c210145effc2631c1a7f2e4a2fdf4" 12 | "014cb63097fc7dbda3edf53eb09802237961cbb4c9e9abd705f23b86511b0a69" 13 | "88f7ee5594021c60a4a6a1c275614103de8c1435d6d08cc58882f920e0cec65e" 14 | "34cf3305b35e3a8132a0b1bdf2c67623bc2cb05b125f8d7d26bd51fd16d547ec" default))) 15 | (custom-set-faces 16 | ;; custom-set-faces was added by Custom. 17 | ;; If you edit it by hand, you could mess it up, so be careful. 18 | ;; Your init file should contain only one such instance. 19 | ;; If there is more than one, they won't work right. 20 | ) 21 | -------------------------------------------------------------------------------- /doom/init.el: -------------------------------------------------------------------------------- 1 | ;;; init.el -*- lexical-binding: t; -*- 2 | 3 | ;; This file controls what Doom modules are enabled and what order they load 4 | ;; in. Remember to run 'doom sync' after modifying it! 5 | 6 | ;; NOTE Press 'SPC h d h' (or 'C-h d h' for non-vim users) to access Doom's 7 | ;; documentation. There you'll find a link to Doom's Module Index where all 8 | ;; of our modules are listed, including what flags they support. 9 | 10 | ;; NOTE Move your cursor over a module's name (or its flags) and press 'K' (or 11 | ;; 'C-c c k' for non-vim users) to view its documentation. This works on 12 | ;; flags as well (those symbols that start with a plus). 13 | ;; 14 | ;; Alternatively, press 'gd' (or 'C-c c d') on a module to browse its 15 | ;; directory (for easy access to its source code). 16 | 17 | (doom! :input 18 | ;;bidi ; (tfel ot) thgir etirw uoy gnipleh 19 | ;;chinese 20 | ;;japanese 21 | ;;layout ; auie,ctsrnm is the superior home row 22 | 23 | :completion 24 | ;;company ; the ultimate code completion backend 25 | (corfu +orderless) ; complete with cap(f), cape and a flying feather! 26 | ;;helm ; the *other* search engine for love and life 27 | ;;ido ; the other *other* search engine... 28 | ;;ivy ; a search engine for love and life 29 | vertico ; the search engine of the future 30 | 31 | :ui 32 | ;;deft ; notational velocity for Emacs 33 | doom ; what makes DOOM look the way it does 34 | doom-dashboard ; a nifty splash screen for Emacs 35 | ;;doom-quit ; DOOM quit-message prompts when you quit Emacs 36 | (emoji +unicode) ; 🙂 37 | hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW 38 | ;;indent-guides ; highlighted indent columns 39 | ;;ligatures ; ligatures and symbols to make your code pretty again 40 | ;;minimap ; show a map of the code on the side 41 | modeline ; snazzy, Atom-inspired modeline, plus API 42 | ;;nav-flash ; blink cursor line after big motions 43 | ;;neotree ; a project drawer, like NERDTree for vim 44 | ophints ; highlight the region an operation acts on 45 | (popup +defaults) ; tame sudden yet inevitable temporary windows 46 | ;;tabs ; a tab bar for Emacs 47 | treemacs ; a project drawer, like neotree but cooler 48 | ;;unicode ; extended unicode support for various languages 49 | (vc-gutter +pretty) ; vcs diff in the fringe 50 | vi-tilde-fringe ; fringe tildes to mark beyond EOB 51 | ;;window-select ; visually switch windows 52 | workspaces ; tab emulation, persistence & separate workspaces 53 | ;;zen ; distraction-free coding or writing 54 | 55 | :editor 56 | (evil +everywhere); come to the dark side, we have cookies 57 | file-templates ; auto-snippets for empty files 58 | fold ; (nigh) universal code folding 59 | ;;(format +onsave) ; automated prettiness 60 | ;;god ; run Emacs commands without modifier keys 61 | ;;lispy ; vim for lisp, for people who don't like vim 62 | ;;multiple-cursors ; editing in many places at once 63 | ;;objed ; text object editing for the innocent 64 | ;;parinfer ; turn lisp into python, sort of 65 | ;;rotate-text ; cycle region at point between text candidates 66 | snippets ; my elves. They type so I don't have to 67 | ;;word-wrap ; soft wrapping with language-aware indent 68 | 69 | :emacs 70 | dired ; making dired pretty [functional] 71 | electric ; smarter, keyword-based electric-indent 72 | ;;eww ; the internet is gross 73 | ;;ibuffer ; interactive buffer management 74 | undo ; persistent, smarter undo for your inevitable mistakes 75 | vc ; version-control and Emacs, sitting in a tree 76 | 77 | :term 78 | eshell ; the elisp shell that works everywhere 79 | ;;shell ; simple shell REPL for Emacs 80 | ;;term ; basic terminal emulator for Emacs 81 | vterm ; the best terminal emulation in Emacs 82 | 83 | :checkers 84 | syntax ; tasing you for every semicolon you forget 85 | (spell +flyspell) ; tasing you for misspelling mispelling 86 | grammar ; tasing grammar mistake every you make 87 | 88 | :tools 89 | ;;ansible 90 | ;;biblio ; Writes a PhD for you (citation needed) 91 | ;;collab ; buffers with friends 92 | (debugger +lsp) ; FIXME stepping through code, to help you add bugs 93 | direnv 94 | ;;docker 95 | ;;editorconfig ; let someone else argue about tabs vs spaces 96 | ;;ein ; tame Jupyter notebooks with emacs 97 | (eval +overlay) ; run code, run (also, repls) 98 | lookup ; navigate your code and its documentation 99 | lsp ; M-x vscode 100 | (magit +forge) ; a git porcelain for Emacs 101 | ;;make ; run make tasks from Emacs 102 | ;;pass ; password manager for nerds 103 | ;;pdf ; pdf enhancements 104 | ;;prodigy ; FIXME managing external services & code builders 105 | ;;terraform ; infrastructure as code 106 | ;;tmux ; an API for interacting with tmux 107 | ;;tree-sitter ; syntax and parsing, sitting in a tree... 108 | ;;upload ; map local to remote projects via ssh/ftp 109 | 110 | :os 111 | (:if (featurep :system 'macos) macos) ; improve compatibility with macOS 112 | (tty +osc) ; improve the terminal Emacs experience 113 | 114 | :lang 115 | ;;agda ; types of types of types of types... 116 | ;;beancount ; mind the GAAP 117 | ;; required for debugging rust!! 118 | (cc +lsp) ; C > C++ == 1 119 | ;;clojure ; java with a lisp 120 | ;;common-lisp ; if you've seen one lisp, you've seen them all 121 | ;;coq ; proofs-as-programs 122 | ;;crystal ; ruby at the speed of c 123 | ;;csharp ; unity, .NET, and mono shenanigans 124 | ;;data ; config/data formats 125 | ;;(dart +flutter) ; paint ui and not much else 126 | ;;dhall 127 | ;;elixir ; erlang done right 128 | ;;elm ; care for a cup of TEA? 129 | emacs-lisp ; drown in parentheses 130 | ;;erlang ; an elegant language for a more civilized age 131 | ;;ess ; emacs speaks statistics 132 | ;;factor 133 | ;;faust ; dsp, but you get to keep your soul 134 | ;;fortran ; in FORTRAN, GOD is REAL (unless declared INTEGER) 135 | ;;fsharp ; ML stands for Microsoft's Language 136 | ;;fstar ; (dependent) types and (monadic) effects and Z3 137 | ;;gdscript ; the language you waited for 138 | (go +lsp) ; the hipster dialect 139 | (graphql +lsp) ; Give queries a REST 140 | (haskell +lsp) ; a language that's lazier than I am 141 | ;;hy ; readability of scheme w/ speed of python 142 | ;;idris ; a language you can depend on 143 | json ; At least it ain't XML 144 | ;;(java +lsp) ; the poster child for carpal tunnel syndrome 145 | javascript ; all(hope(abandon(ye(who(enter(here)))))) 146 | ;;julia ; a better, faster MATLAB 147 | ;;kotlin ; a better, slicker Java(Script) 148 | ;;latex ; writing papers in Emacs has never been so fun 149 | ;;lean ; for folks with too much to prove 150 | ;;ledger ; be audit you can be 151 | ;;lua ; one-based indices? one-based indices 152 | markdown ; writing docs for people to ignore 153 | ;;nim ; python + lisp at the speed of c 154 | nix ; I hereby declare "nix geht mehr!" 155 | ;;ocaml ; an objective camel 156 | org ; organize your plain life in plain text 157 | ;;php ; perl's insecure younger brother 158 | ;;plantuml ; diagrams for confusing people more 159 | ;;graphviz ; diagrams for confusing yourself even more 160 | ;;purescript ; javascript, but functional 161 | ;;python ; beautiful is better than ugly 162 | ;;qt ; the 'cutest' gui framework ever 163 | ;;racket ; a DSL for DSLs 164 | ;;raku ; the artist formerly known as perl6 165 | rest ; Emacs as a REST client 166 | ;;rst ; ReST in peace 167 | ;;(ruby +rails) ; 1.step {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} 168 | (rust +lsp) ; Fe2O3.unwrap().unwrap().unwrap().unwrap() 169 | ;;scala ; java, but good 170 | ;;(scheme +guile) ; a fully conniving family of lisps 171 | sh ; she sells {ba,z,fi}sh shells on the C xor 172 | ;;sml 173 | ;;solidity ; do you need a blockchain? No. 174 | ;;swift ; who asked for emoji variables? 175 | ;;terra ; Earth and Moon in alignment for performance. 176 | web ; the tubes 177 | ;;yaml ; JSON, but readable 178 | ;;zig ; C, but simpler 179 | 180 | :email 181 | ;;(mu4e +org +gmail) 182 | ;;notmuch 183 | ;;(wanderlust +gmail) 184 | 185 | :app 186 | ;;calendar 187 | ;;emms 188 | ;;everywhere ; *leave* Emacs!? You must be joking 189 | ;;irc ; how neckbeards socialize 190 | ;;(rss +org) ; emacs as an RSS reader 191 | 192 | :config 193 | ;;literate 194 | (default +bindings +smartparens)) 195 | -------------------------------------------------------------------------------- /doom/packages.el: -------------------------------------------------------------------------------- 1 | ;; -*- no-byte-compile: t; -*- 2 | ;;; $DOOMDIR/packages.el 3 | 4 | ;; To install a package with Doom you must declare them here and run 'doom sync' 5 | ;; on the command line, then restart Emacs for the changes to take effect -- or 6 | ;; use 'M-x doom/reload'. 7 | 8 | 9 | ;; To install SOME-PACKAGE from MELPA, ELPA or emacsmirror: 10 | ;; (package! some-package) 11 | 12 | ;; To install a package directly from a remote git repo, you must specify a 13 | ;; `:recipe'. You'll find documentation on what `:recipe' accepts here: 14 | ;; https://github.com/radian-software/straight.el#the-recipe-format 15 | ;; (package! another-package 16 | ;; :recipe (:host github :repo "username/repo")) 17 | 18 | ;; If the package you are trying to install does not contain a PACKAGENAME.el 19 | ;; file, or is located in a subdirectory of the repo, you'll need to specify 20 | ;; `:files' in the `:recipe': 21 | ;; (package! this-package 22 | ;; :recipe (:host github :repo "username/repo" 23 | ;; :files ("some-file.el" "src/lisp/*.el"))) 24 | 25 | ;; If you'd like to disable a package included with Doom, you can do so here 26 | ;; with the `:disable' property: 27 | ;; (package! builtin-package :disable t) 28 | 29 | ;; You can override the recipe of a built in package without having to specify 30 | ;; all the properties for `:recipe'. These will inherit the rest of its recipe 31 | ;; from Doom or MELPA/ELPA/Emacsmirror: 32 | ;; (package! builtin-package :recipe (:nonrecursive t)) 33 | ;; (package! builtin-package-2 :recipe (:repo "myfork/package")) 34 | 35 | ;; Specify a `:branch' to install a package from a particular branch or tag. 36 | ;; This is required for some packages whose default branch isn't 'master' (which 37 | ;; our package manager can't deal with; see radian-software/straight.el#279) 38 | ;; (package! builtin-package :recipe (:branch "develop")) 39 | 40 | ;; Use `:pin' to specify a particular commit to install. 41 | ;; (package! builtin-package :pin "1a2b3c4d5e") 42 | 43 | 44 | ;; Doom's packages are pinned to a specific commit and updated from release to 45 | ;; release. The `unpin!' macro allows you to unpin single packages... 46 | ;; (unpin! pinned-package) 47 | ;; ...or multiple packages 48 | ;; (unpin! pinned-package another-pinned-package) 49 | ;; ...Or *all* packages (NOT RECOMMENDED; will likely break things) 50 | ;; (unpin! t) 51 | 52 | 53 | (package! tldr) 54 | (package! gptel) 55 | ;; (package! evil-quickscope) 56 | -------------------------------------------------------------------------------- /easyeffects/Apple AirPods Pro (2nd generation) ParametricEq.txt: -------------------------------------------------------------------------------- 1 | Preamp: -3.30 dB 2 | Filter 1: ON LSC Fc 105.0 Hz Gain 2.6 dB Q 0.70 3 | Filter 2: ON PK Fc 37.2 Hz Gain 0.5 dB Q 1.64 4 | Filter 3: ON PK Fc 80.3 Hz Gain 1.5 dB Q 1.29 5 | Filter 4: ON PK Fc 129.0 Hz Gain -1.5 dB Q 1.48 6 | Filter 5: ON PK Fc 339.0 Hz Gain -2.8 dB Q 0.76 7 | Filter 6: ON PK Fc 663.3 Hz Gain 2.2 dB Q 1.69 8 | Filter 7: ON PK Fc 2177.3 Hz Gain 2.9 dB Q 2.20 9 | Filter 8: ON PK Fc 4293.7 Hz Gain 3.2 dB Q 2.26 10 | Filter 9: ON PK Fc 6229.3 Hz Gain -3.3 dB Q 4.29 11 | Filter 10: ON HSC Fc 10000.0 Hz Gain -2.1 dB Q 0.70 12 | -------------------------------------------------------------------------------- /easyeffects/Audio-Technica ATH-M50x ParametricEq.txt: -------------------------------------------------------------------------------- 1 | Preamp: -3.03 dB 2 | Filter 1: ON LSC Fc 105.0 Hz Gain 0.8 dB Q 0.70 3 | Filter 2: ON PK Fc 71.4 Hz Gain 1.5 dB Q 3.71 4 | Filter 3: ON PK Fc 125.7 Hz Gain -4.5 dB Q 0.67 5 | Filter 4: ON PK Fc 185.7 Hz Gain -1.4 dB Q 2.67 6 | Filter 5: ON PK Fc 334.1 Hz Gain 4.4 dB Q 1.57 7 | Filter 6: ON PK Fc 728.7 Hz Gain -0.5 dB Q 1.66 8 | Filter 7: ON PK Fc 3558.6 Hz Gain 2.4 dB Q 5.79 9 | Filter 8: ON PK Fc 4245.3 Hz Gain -2.0 dB Q 6.00 10 | Filter 9: ON PK Fc 7972.4 Hz Gain 3.5 dB Q 1.10 11 | Filter 10: ON HSC Fc 10000.0 Hz Gain -5.4 dB Q 0.70 12 | -------------------------------------------------------------------------------- /easyeffects/EasyEffects Microphone Preset: Masc NPR Voice + Noise Reduction.json: -------------------------------------------------------------------------------- 1 | { 2 | "input": { 3 | "blocklist": [], 4 | "compressor#0": { 5 | "attack": 5.0, 6 | "boost-amount": 6.0, 7 | "boost-threshold": -72.0, 8 | "bypass": false, 9 | "dry": -100.0, 10 | "hpf-frequency": 10.0, 11 | "hpf-mode": "off", 12 | "input-gain": 0.0, 13 | "knee": -6.0, 14 | "lpf-frequency": 20000.0, 15 | "lpf-mode": "off", 16 | "makeup": 0.0, 17 | "mode": "Downward", 18 | "output-gain": 0.0, 19 | "ratio": 4.0, 20 | "release": 75.0, 21 | "release-threshold": -40.0, 22 | "sidechain": { 23 | "lookahead": 0.0, 24 | "mode": "RMS", 25 | "preamp": 0.0, 26 | "reactivity": 10.0, 27 | "source": "Middle", 28 | "stereo-split-source": "Left/Right", 29 | "type": "Feed-forward" 30 | }, 31 | "stereo-split": false, 32 | "threshold": -20.0, 33 | "wet": 0.0 34 | }, 35 | "deesser#0": { 36 | "bypass": false, 37 | "detection": "RMS", 38 | "f1-freq": 3000.0, 39 | "f1-level": -6.0, 40 | "f2-freq": 5000.0, 41 | "f2-level": -6.0, 42 | "f2-q": 1.5000000000000004, 43 | "input-gain": 0.0, 44 | "laxity": 15, 45 | "makeup": 0.0, 46 | "mode": "Wide", 47 | "output-gain": 0.0, 48 | "ratio": 5.0, 49 | "sc-listen": false, 50 | "threshold": -20.0 51 | }, 52 | "equalizer#0": { 53 | "balance": 0.0, 54 | "bypass": false, 55 | "input-gain": 0.0, 56 | "left": { 57 | "band0": { 58 | "frequency": 50.0, 59 | "gain": 3.0, 60 | "mode": "RLC (BT)", 61 | "mute": false, 62 | "q": 0.7, 63 | "slope": "x1", 64 | "solo": false, 65 | "type": "Hi-pass", 66 | "width": 4.0 67 | }, 68 | "band1": { 69 | "frequency": 90.0, 70 | "gain": 3.0, 71 | "mode": "RLC (MT)", 72 | "mute": false, 73 | "q": 0.7, 74 | "slope": "x1", 75 | "solo": false, 76 | "type": "Lo-shelf", 77 | "width": 4.0 78 | }, 79 | "band2": { 80 | "frequency": 425.0, 81 | "gain": -2.0, 82 | "mode": "BWC (MT)", 83 | "mute": false, 84 | "q": 0.9999999999999998, 85 | "slope": "x2", 86 | "solo": false, 87 | "type": "Bell", 88 | "width": 4.0 89 | }, 90 | "band3": { 91 | "frequency": 3500.0, 92 | "gain": 3.0, 93 | "mode": "BWC (BT)", 94 | "mute": false, 95 | "q": 0.7, 96 | "slope": "x2", 97 | "solo": false, 98 | "type": "Bell", 99 | "width": 4.0 100 | }, 101 | "band4": { 102 | "frequency": 9000.0, 103 | "gain": 2.0, 104 | "mode": "LRX (MT)", 105 | "mute": false, 106 | "q": 0.7, 107 | "slope": "x1", 108 | "solo": false, 109 | "type": "Hi-shelf", 110 | "width": 4.0 111 | } 112 | }, 113 | "mode": "IIR", 114 | "num-bands": 5, 115 | "output-gain": 0.0, 116 | "pitch-left": 0.0, 117 | "pitch-right": 0.0, 118 | "right": { 119 | "band0": { 120 | "frequency": 50.0, 121 | "gain": 3.0, 122 | "mode": "RLC (BT)", 123 | "mute": false, 124 | "q": 0.7, 125 | "slope": "x1", 126 | "solo": false, 127 | "type": "Hi-pass", 128 | "width": 4.0 129 | }, 130 | "band1": { 131 | "frequency": 90.0, 132 | "gain": 3.0, 133 | "mode": "RLC (MT)", 134 | "mute": false, 135 | "q": 0.7, 136 | "slope": "x1", 137 | "solo": false, 138 | "type": "Lo-shelf", 139 | "width": 4.0 140 | }, 141 | "band2": { 142 | "frequency": 425.0, 143 | "gain": -2.0, 144 | "mode": "BWC (MT)", 145 | "mute": false, 146 | "q": 0.9999999999999998, 147 | "slope": "x2", 148 | "solo": false, 149 | "type": "Bell", 150 | "width": 4.0 151 | }, 152 | "band3": { 153 | "frequency": 3500.0, 154 | "gain": 3.0, 155 | "mode": "BWC (BT)", 156 | "mute": false, 157 | "q": 0.7, 158 | "slope": "x2", 159 | "solo": false, 160 | "type": "Bell", 161 | "width": 4.0 162 | }, 163 | "band4": { 164 | "frequency": 9000.0, 165 | "gain": 2.0, 166 | "mode": "LRX (MT)", 167 | "mute": false, 168 | "q": 0.7, 169 | "slope": "x1", 170 | "solo": false, 171 | "type": "Hi-shelf", 172 | "width": 4.0 173 | } 174 | }, 175 | "split-channels": false 176 | }, 177 | "gate#0": { 178 | "attack": 1.0, 179 | "bypass": false, 180 | "curve-threshold": -50.0, 181 | "curve-zone": -2.0, 182 | "dry": -100.0, 183 | "hpf-frequency": 10.0, 184 | "hpf-mode": "off", 185 | "hysteresis": true, 186 | "hysteresis-threshold": -3.0, 187 | "hysteresis-zone": -1.0, 188 | "input-gain": 0.0, 189 | "lpf-frequency": 20000.0, 190 | "lpf-mode": "off", 191 | "makeup": 1.0, 192 | "output-gain": 0.0, 193 | "reduction": -15.0, 194 | "release": 200.0, 195 | "sidechain": { 196 | "input": "Internal", 197 | "lookahead": 0.0, 198 | "mode": "RMS", 199 | "preamp": 0.0, 200 | "reactivity": 10.0, 201 | "source": "Middle", 202 | "stereo-split-source": "Left/Right" 203 | }, 204 | "stereo-split": false, 205 | "wet": -1.0 206 | }, 207 | "limiter#0": { 208 | "alr": false, 209 | "alr-attack": 5.0, 210 | "alr-knee": 0.0, 211 | "alr-release": 50.0, 212 | "attack": 1.0, 213 | "bypass": false, 214 | "dithering": "16bit", 215 | "external-sidechain": false, 216 | "gain-boost": true, 217 | "input-gain": 0.0, 218 | "lookahead": 5.0, 219 | "mode": "Herm Wide", 220 | "output-gain": 0.0, 221 | "oversampling": "Half x2(2L)", 222 | "release": 5.0, 223 | "sidechain-preamp": 0.0, 224 | "stereo-link": 100.0, 225 | "threshold": -1.0 226 | }, 227 | "plugins_order": [ 228 | "rnnoise#0", 229 | "gate#0", 230 | "deesser#0", 231 | "compressor#0", 232 | "equalizer#0", 233 | "speex#0", 234 | "limiter#0" 235 | ], 236 | "rnnoise#0": { 237 | "bypass": false, 238 | "enable-vad": false, 239 | "input-gain": 0.0, 240 | "model-path": "", 241 | "output-gain": 0.0, 242 | "release": 20.0, 243 | "vad-thres": 50.0, 244 | "wet": 0.0 245 | }, 246 | "speex#0": { 247 | "bypass": false, 248 | "enable-agc": false, 249 | "enable-denoise": false, 250 | "enable-dereverb": false, 251 | "input-gain": 0.0, 252 | "noise-suppression": -70, 253 | "output-gain": 0.0, 254 | "vad": { 255 | "enable": true, 256 | "probability-continue": 90, 257 | "probability-start": 95 258 | } 259 | } 260 | } 261 | } 262 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "NixOS systems and tools by cor"; 3 | 4 | inputs = { 5 | nixpkgs.url = "github:nixos/nixpkgs/release-25.05"; 6 | nixpkgs-unstable.url = "github:nixos/nixpkgs/nixpkgs-unstable"; 7 | open-project.url = "github:cor/open-project"; 8 | gh-permalink.url = "github:cor/gh-permalink"; 9 | nixos-hardware.url = "github:NixOS/nixos-hardware/master"; 10 | 11 | union-tools.url = "github:unionlabs/tools"; 12 | 13 | # Used for caddy plugins 14 | nixpkgs-caddy.url = "github:jpds/nixpkgs/caddy-external-plugins"; 15 | 16 | helix.url = "github:helix-editor/helix"; 17 | yazi.url = "github:sxyazi/yazi"; 18 | emacs-overlay.url = "github:nix-community/emacs-overlay"; 19 | ghostty.url = "github:ghostty-org/ghostty"; 20 | 21 | flake-utils.url = "github:numtide/flake-utils"; 22 | raspberry-pi-nix.url = "github:nix-community/raspberry-pi-nix/v0.4.1"; 23 | niri.url = "github:sodiboo/niri-flake"; 24 | 25 | darwin = { 26 | url = "github:lnl7/nix-darwin/master"; 27 | inputs.nixpkgs.follows = "nixpkgs"; 28 | }; 29 | 30 | home-manager = { 31 | url = "github:nix-community/home-manager/release-25.05"; 32 | inputs.nixpkgs.follows = "nixpkgs"; 33 | }; 34 | 35 | stylix.url = "github:danth/stylix/release-25.05"; 36 | }; 37 | 38 | outputs = { self, union-tools, darwin, nixpkgs, nixpkgs-unstable, nixos-hardware, home-manager, flake-utils, raspberry-pi-nix, ... }@inputs: 39 | let 40 | mkNixos = import ./nixos.nix; 41 | mkDarwin = import ./darwin.nix; 42 | user = { 43 | name = "cor"; 44 | githubName = "cor"; 45 | email = "cor@pruijs.dev"; 46 | hashedPassword = "$6$sb3eB/EbsWnfAqzy$szu0h/hbX9/23n5RKE0dwzV8lmq.1Yj2NzI/jYQxJZIbzmY8dpIYRdhUVZgCMnR0CeqrQfgzs6FtPoGUiCqDR0"; 47 | codeHashedPassword = "$argon2i$v=19$m=4096,t=3,p=1$EhoOotFaUezZdQ+6Nfaz6w$ba74RTp6245H0K0URZmDsV1GBmVSHwzF5BT42FA9Y3I"; 48 | sshKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAN0JRbnTsz4eEUeL6My/ew+rX3Qojawn+Y1B3buPuyC"; 49 | }; 50 | 51 | corworkUser = user // { 52 | hashedPassword = "$6$8w3GvquMlrc0rbZX$85TiiuiouAgD5jbU9qtnI7HUy7GfOJ.aKm3/Jyne0QrvEPB7FUXXhe.J6rqAzIWcuxMu3uJUV1VbzTlTJxjUx1"; 53 | }; 54 | in 55 | { 56 | nixosConfigurations = { 57 | corwork = mkNixos { 58 | inherit inputs nixpkgs home-manager; 59 | user = corworkUser; 60 | machine = { 61 | domain = "corwork.cor.systems"; 62 | name = "corwork"; 63 | system = "x86_64-linux"; 64 | darwin = false; 65 | headless = false; 66 | stateVersion = "24.11"; 67 | homeStateVersion = "24.11"; 68 | }; 69 | }; 70 | 71 | corbookpro-nixos = mkNixos { 72 | inherit inputs nixpkgs home-manager user; 73 | machine = { 74 | domain = "corbookpro-nixos.cor.systems"; 75 | name = "corbookpro-nixos"; 76 | system = "aarch64-linux"; 77 | darwin = false; 78 | headless = true; 79 | stateVersion = "24.05"; 80 | homeStateVersion = "24.05"; 81 | }; 82 | }; 83 | 84 | corbookair-nixos = mkNixos { 85 | inherit inputs nixpkgs home-manager user; 86 | machine = { 87 | domain = "corbookair-nixos.cor.systems"; 88 | name = "corbookair-nixos"; 89 | system = "aarch64-linux"; 90 | darwin = false; 91 | headless = true; 92 | stateVersion = "24.05"; 93 | homeStateVersion = "24.05"; 94 | }; 95 | }; 96 | 97 | raspberry-pi = mkNixos { 98 | inherit inputs nixpkgs home-manager user; 99 | machine = { 100 | domain = "raspberry-pi.cor.systems"; 101 | name = "raspberry-pi"; 102 | system = "aarch64-linux"; 103 | darwin = false; 104 | headless = true; 105 | stateVersion = "23.11"; 106 | homeStateVersion = "24.05"; 107 | }; 108 | }; 109 | 110 | }; 111 | 112 | darwinConfigurations = let system = "aarch64-darwin"; in { 113 | default = mkDarwin "CorBook-Darwin" { 114 | inherit user inputs nixpkgs home-manager system darwin; 115 | }; 116 | }; 117 | 118 | } // (flake-utils.lib.eachDefaultSystem (system: 119 | let 120 | pkgs-unstable = import nixpkgs-unstable { inherit system; }; 121 | basePackages = { 122 | formatter = pkgs-unstable.nixpkgs-fmt; 123 | }; 124 | darwinPackages = pkgs-unstable.lib.optionalAttrs (system == "aarch64-darwin") { 125 | move-default = pkgs-unstable.writeShellApplication { 126 | name = "move-default"; 127 | text = '' 128 | echo "moving default macOS config files if they exist" 129 | [ ! -f /etc/zshenv ] || sudo mv /etc/zshenv /etc/zshenv.bak 130 | [ ! -f /etc/zshrc ] || sudo mv /etc/zshrc /etc/zshrc.bak 131 | [ ! -f /etc/bashrc ] || sudo mv /etc/bashrc /etc/bashrc.bak 132 | ''; 133 | }; 134 | switch = pkgs-unstable.writeShellApplication { 135 | name = "switch"; 136 | runtimeInputs = [ 137 | pkgs-unstable.nix 138 | inputs.darwin.packages.${system}.darwin-rebuild 139 | ]; 140 | text = '' 141 | darwin-rebuild switch --flake ".#''${NIXNAME:-$(hostname)}" 142 | ''; 143 | }; 144 | }; 145 | linuxPackages = pkgs-unstable.lib.optionalAttrs (system == "aarch64-linux" || system == "x86_64-linux") rec { 146 | default = switch; 147 | switch = pkgs-unstable.writeShellApplication { 148 | name = "switch"; 149 | runtimeInputs = [ pkgs-unstable.nix ]; 150 | text = '' 151 | sudo NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1 nixos-rebuild switch --flake ".#''${NIXNAME:-$(hostname)}" 152 | ''; 153 | }; 154 | switch-networking = pkgs-unstable.writeShellApplication { 155 | name = "switch"; 156 | runtimeInputs = [ pkgs-unstable.nix ]; 157 | text = '' 158 | sudo NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1 nixos-rebuild switch --flake ".#''${NIXNAME:-$(hostname)}" 159 | sudo systemctl restart NetworkManager 160 | ''; 161 | }; 162 | switch-show-trace = pkgs-unstable.writeShellApplication { 163 | name = "switch-show-trace"; 164 | runtimeInputs = [ pkgs-unstable.nix ]; 165 | text = '' 166 | sudo NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM=1 nixos-rebuild switch --flake ".#''${NIXNAME:-$(hostname)}" --show-trace 167 | ''; 168 | }; 169 | theme-switch = pkgs-unstable.writeShellApplication { 170 | name = "theme-switch"; 171 | runtimeInputs = [ ]; 172 | text = '' 173 | if [ "$#" -ne 1 ]; then 174 | echo "Usage: theme-switch [light|dark]" 175 | exit 1 176 | fi 177 | 178 | MODE="$1" 179 | 180 | if [ "$MODE" = "dark" ]; then 181 | sudo nixos-rebuild switch --flake /home/cor/dev/cor/nixos-config#corwork 182 | systemctl --user restart swaybg.service 183 | systemctl --user restart waybar.service 184 | echo "Switched to dark mode and restarted swaybg and waybar." 185 | echo "To reload Ghostty configuration, press Ctrl+Shift+, in each Ghostty window" 186 | elif [ "$MODE" = "light" ]; then 187 | sudo nixos-rebuild switch --flake /home/cor/dev/cor/nixos-config#corwork --specialisation light 188 | systemctl --user restart swaybg.service 189 | systemctl --user restart waybar.service 190 | echo "Switched to light mode and restarted swaybg and waybar." 191 | echo "To reload Ghostty configuration, press Ctrl+Shift+, in each Ghostty window" 192 | else 193 | echo "Error: Invalid mode. Use 'light' or 'dark'." 194 | exit 1 195 | fi 196 | ''; 197 | }; 198 | 199 | keyboard-brightness = pkgs-unstable.writeShellApplication { 200 | name = "keyboard-brightness"; 201 | runtimeInputs = [ pkgs-unstable.sudo ]; 202 | text = '' 203 | #!/usr/bin/env bash 204 | 205 | KB_BACKLIGHT="/sys/class/leds/chromeos::kbd_backlight/brightness" 206 | MAX_BRIGHTNESS=100 207 | 208 | usage() { 209 | echo "Usage: keyboard-brightness [get|set VALUE|up|down|max|off]" 210 | echo "" 211 | echo "Controls keyboard backlight brightness" 212 | echo "" 213 | echo "Commands:" 214 | echo " get - Display current brightness (0-$MAX_BRIGHTNESS)" 215 | echo " set VALUE - Set brightness to VALUE (0-$MAX_BRIGHTNESS)" 216 | echo " up - Increase brightness by 10" 217 | echo " down - Decrease brightness by 10" 218 | echo " max - Set brightness to maximum" 219 | echo " off - Turn off keyboard backlight" 220 | exit 1 221 | } 222 | 223 | # Check if the kbd backlight sysfs path exists 224 | if [ ! -f "$KB_BACKLIGHT" ]; then 225 | echo "Error: Keyboard backlight control not available at $KB_BACKLIGHT" 226 | exit 1 227 | fi 228 | 229 | # Check if we have sudo access for writing 230 | check_sudo() { 231 | if [ "$EUID" -ne 0 ]; then 232 | echo "This operation requires sudo access" 233 | exit 1 234 | fi 235 | } 236 | 237 | get_brightness() { 238 | cat "$KB_BACKLIGHT" 239 | } 240 | 241 | set_brightness() { 242 | local value=$1 243 | 244 | # Ensure the value is within range 245 | if [ "$value" -lt 0 ]; then 246 | value=0 247 | elif [ "$value" -gt "$MAX_BRIGHTNESS" ]; then 248 | value="$MAX_BRIGHTNESS" 249 | fi 250 | 251 | # Write the new value 252 | echo "$value" | sudo tee "$KB_BACKLIGHT" > /dev/null 253 | echo "Keyboard brightness set to $value" 254 | } 255 | 256 | # Process command line arguments 257 | if [ $# -eq 0 ]; then 258 | usage 259 | fi 260 | 261 | case "$1" in 262 | get) 263 | get_brightness 264 | ;; 265 | set) 266 | if [ $# -ne 2 ] || ! [[ "$2" =~ ^[0-9]+$ ]]; then 267 | echo "Error: 'set' requires a numeric brightness value (0-$MAX_BRIGHTNESS)" 268 | usage 269 | fi 270 | check_sudo 271 | set_brightness "$2" 272 | ;; 273 | up) 274 | current=$(get_brightness) 275 | new=$((current + 10)) 276 | check_sudo 277 | set_brightness "$new" 278 | ;; 279 | down) 280 | current=$(get_brightness) 281 | new=$((current - 10)) 282 | check_sudo 283 | set_brightness "$new" 284 | ;; 285 | max) 286 | check_sudo 287 | set_brightness "$MAX_BRIGHTNESS" 288 | ;; 289 | off) 290 | check_sudo 291 | set_brightness 0 292 | ;; 293 | *) 294 | usage 295 | ;; 296 | esac 297 | 298 | exit 0 299 | ''; 300 | }; 301 | }; 302 | in 303 | { 304 | packages = basePackages // darwinPackages // linuxPackages; 305 | 306 | apps = pkgs-unstable.lib.optionalAttrs (system == "aarch64-linux" || system == "x86_64-linux") { 307 | theme-switch = { 308 | type = "app"; 309 | program = "${self.packages.${system}.theme-switch}/bin/theme-switch"; 310 | }; 311 | }; 312 | 313 | devShells = { 314 | default = pkgs-unstable.mkShell { 315 | buildInputs = with pkgs-unstable; [ 316 | nixd 317 | nil 318 | nixpkgs-fmt 319 | sumneko-lua-language-server 320 | cmake-language-server 321 | self.packages.${system}.switch 322 | self.packages.${system}.switch-show-trace 323 | self.packages.${system}.theme-switch 324 | ]; 325 | }; 326 | }; 327 | } 328 | )); 329 | } 330 | -------------------------------------------------------------------------------- /hardware/corbookair-nixos.nix: -------------------------------------------------------------------------------- 1 | # Generated by OrbStack. 2 | # This WILL be overwritten in the future. Make a copy and update the include 3 | # in configuration.nix if you want to keep your changes. 4 | 5 | { lib, config, ... }: 6 | 7 | { 8 | # Add OrbStack CLI tools to PATH 9 | environment.shellInit = '' 10 | . /opt/orbstack-guest/etc/profile-early 11 | 12 | # add your customizations here 13 | 14 | . /opt/orbstack-guest/etc/profile-late 15 | ''; 16 | 17 | # Enable documentation 18 | documentation.man.enable = true; 19 | documentation.doc.enable = true; 20 | documentation.info.enable = true; 21 | 22 | # Disable systemd-resolved 23 | services.resolved.enable = false; 24 | environment.etc."resolv.conf".source = "/opt/orbstack-guest/etc/resolv.conf"; 25 | 26 | # Faster DHCP - OrbStack uses SLAAC exclusively 27 | networking.dhcpcd.extraConfig = '' 28 | noarp 29 | noipv6 30 | ''; 31 | 32 | # Enable sshd (disabled by default!) 33 | services.openssh.enable = true; 34 | 35 | # systemd 36 | systemd.services."systemd-oomd".serviceConfig.WatchdogSec = 0; 37 | systemd.services."systemd-userdbd".serviceConfig.WatchdogSec = 0; 38 | systemd.services."systemd-udevd".serviceConfig.WatchdogSec = 0; 39 | systemd.services."systemd-timesyncd".serviceConfig.WatchdogSec = 0; 40 | systemd.services."systemd-timedated".serviceConfig.WatchdogSec = 0; 41 | systemd.services."systemd-portabled".serviceConfig.WatchdogSec = 0; 42 | systemd.services."systemd-nspawn@".serviceConfig.WatchdogSec = 0; 43 | systemd.services."systemd-machined".serviceConfig.WatchdogSec = 0; 44 | systemd.services."systemd-localed".serviceConfig.WatchdogSec = 0; 45 | systemd.services."systemd-logind".serviceConfig.WatchdogSec = 0; 46 | systemd.services."systemd-journald@".serviceConfig.WatchdogSec = 0; 47 | systemd.services."systemd-journald".serviceConfig.WatchdogSec = 0; 48 | systemd.services."systemd-journal-remote".serviceConfig.WatchdogSec = 0; 49 | systemd.services."systemd-journal-upload".serviceConfig.WatchdogSec = 0; 50 | systemd.services."systemd-importd".serviceConfig.WatchdogSec = 0; 51 | systemd.services."systemd-hostnamed".serviceConfig.WatchdogSec = 0; 52 | systemd.services."systemd-homed".serviceConfig.WatchdogSec = 0; 53 | systemd.services."systemd-networkd".serviceConfig.WatchdogSec = lib.mkIf config.systemd.network.enable 0; 54 | 55 | # ssh config 56 | programs.ssh.extraConfig = '' 57 | Include /opt/orbstack-guest/etc/ssh_config 58 | ''; 59 | 60 | # indicate builder support for emulated architectures 61 | nix.settings.extra-platforms = [ 62 | "x86_64-linux" 63 | "i686-linux" 64 | ]; 65 | } 66 | 67 | -------------------------------------------------------------------------------- /hardware/corbookpro-nixos.nix: -------------------------------------------------------------------------------- 1 | # Generated by OrbStack. 2 | # This WILL be overwritten in the future. Make a copy and update the include 3 | # in configuration.nix if you want to keep your changes. 4 | 5 | { lib, config, ... }: 6 | 7 | { 8 | # Add OrbStack CLI tools to PATH 9 | environment.shellInit = '' 10 | . /opt/orbstack-guest/etc/profile-early 11 | 12 | # add your customizations here 13 | 14 | . /opt/orbstack-guest/etc/profile-late 15 | ''; 16 | 17 | # Enable documentation 18 | documentation.man.enable = true; 19 | documentation.doc.enable = true; 20 | documentation.info.enable = true; 21 | 22 | # Disable systemd-resolved 23 | services.resolved.enable = false; 24 | environment.etc."resolv.conf".source = "/opt/orbstack-guest/etc/resolv.conf"; 25 | 26 | # Faster DHCP - OrbStack uses SLAAC exclusively 27 | networking.dhcpcd.extraConfig = '' 28 | noarp 29 | noipv6 30 | ''; 31 | 32 | # Enable sshd (disabled by default!) 33 | services.openssh.enable = true; 34 | 35 | # systemd 36 | systemd.services."systemd-oomd".serviceConfig.WatchdogSec = 0; 37 | systemd.services."systemd-userdbd".serviceConfig.WatchdogSec = 0; 38 | systemd.services."systemd-udevd".serviceConfig.WatchdogSec = 0; 39 | systemd.services."systemd-timesyncd".serviceConfig.WatchdogSec = 0; 40 | systemd.services."systemd-timedated".serviceConfig.WatchdogSec = 0; 41 | systemd.services."systemd-portabled".serviceConfig.WatchdogSec = 0; 42 | systemd.services."systemd-nspawn@".serviceConfig.WatchdogSec = 0; 43 | systemd.services."systemd-machined".serviceConfig.WatchdogSec = 0; 44 | systemd.services."systemd-localed".serviceConfig.WatchdogSec = 0; 45 | systemd.services."systemd-logind".serviceConfig.WatchdogSec = 0; 46 | systemd.services."systemd-journald@".serviceConfig.WatchdogSec = 0; 47 | systemd.services."systemd-journald".serviceConfig.WatchdogSec = 0; 48 | systemd.services."systemd-journal-remote".serviceConfig.WatchdogSec = 0; 49 | systemd.services."systemd-journal-upload".serviceConfig.WatchdogSec = 0; 50 | systemd.services."systemd-importd".serviceConfig.WatchdogSec = 0; 51 | systemd.services."systemd-hostnamed".serviceConfig.WatchdogSec = 0; 52 | systemd.services."systemd-homed".serviceConfig.WatchdogSec = 0; 53 | systemd.services."systemd-networkd".serviceConfig.WatchdogSec = lib.mkIf config.systemd.network.enable 0; 54 | 55 | # ssh config 56 | programs.ssh.extraConfig = '' 57 | Include /opt/orbstack-guest/etc/ssh_config 58 | ''; 59 | 60 | # indicate builder support for emulated architectures 61 | nix.settings.extra-platforms = [ 62 | "x86_64-linux" 63 | "i686-linux" 64 | ]; 65 | } 66 | 67 | -------------------------------------------------------------------------------- /hardware/corwork.nix: -------------------------------------------------------------------------------- 1 | # Do not modify this file! It was generated by ‘nixos-generate-config’ 2 | # and may be overwritten by future invocations. Please make changes 3 | # to /etc/nixos/configuration.nix instead. 4 | { config, lib, pkgs, modulesPath, ... }: 5 | 6 | { 7 | imports = [ 8 | (modulesPath + "/installer/scan/not-detected.nix") 9 | ]; 10 | 11 | boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usb_storage" "usbhid" "sd_mod" ]; 12 | boot.initrd.kernelModules = [ ]; 13 | boot.kernelModules = [ "kvm-amd" ]; 14 | boot.extraModulePackages = [ ]; 15 | 16 | fileSystems."/" = 17 | { 18 | device = "/dev/disk/by-uuid/20c24e40-f4c5-47fc-b446-0ba9c730369b"; 19 | fsType = "btrfs"; 20 | options = [ "subvol=@" ]; 21 | }; 22 | 23 | boot.initrd.luks.devices."luks-8bbe8f98-7f16-4bc4-91f4-f2cac8a16462".device = "/dev/disk/by-uuid/8bbe8f98-7f16-4bc4-91f4-f2cac8a16462"; 24 | 25 | fileSystems."/boot" = 26 | { 27 | device = "/dev/disk/by-uuid/C473-A8F1"; 28 | fsType = "vfat"; 29 | options = [ "fmask=0077" "dmask=0077" ]; 30 | }; 31 | 32 | swapDevices = 33 | [{ device = "/dev/mapper/luks-2369b304-611c-4725-9626-c8d57dac9611"; }]; 34 | 35 | # Enables DHCP on each ethernet and wireless interface. In case of scripted networking 36 | # (the default) this is the recommended approach. When using systemd-networkd it's 37 | # still possible to use this option, but it's recommended to use it in conjunction 38 | # with explicit per-interface declarations with `networking.interfaces..useDHCP`. 39 | networking.useDHCP = lib.mkDefault true; 40 | # networking.interfaces.enp195s0f0u2.useDHCP = lib.mkDefault true; 41 | 42 | nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; 43 | hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; 44 | 45 | # custom by cor 46 | hardware.graphics = { 47 | enable = true; 48 | # driSupport = true; 49 | # driSupport32Bit = true; 50 | }; 51 | 52 | ## sleep support maybe 53 | # https://discourse.nixos.org/t/hibernate-doesnt-work-anymore/24673/13 54 | security.protectKernelImage = false; 55 | 56 | } 57 | -------------------------------------------------------------------------------- /hardware/raspberry-pi.nix: -------------------------------------------------------------------------------- 1 | { ... }: { 2 | # not required for raspberry-pi 3 | } 4 | -------------------------------------------------------------------------------- /hardware/vm-aarch64-parallels.nix: -------------------------------------------------------------------------------- 1 | # Do not modify this file! It was generated by ‘nixos-generate-config’ 2 | # and may be overwritten by future invocations. Please make changes 3 | # to /etc/nixos/configuration.nix instead. 4 | { config, lib, pkgs, ... }: 5 | 6 | { 7 | imports = [ ]; 8 | 9 | boot.initrd.availableKernelModules = [ "xhci_pci" "usbhid" "sr_mod" ]; 10 | boot.initrd.kernelModules = [ ]; 11 | boot.kernelModules = [ ]; 12 | boot.extraModulePackages = [ ]; 13 | 14 | fileSystems."/" = 15 | { 16 | device = "/dev/disk/by-label/nixos"; 17 | fsType = "ext4"; 18 | }; 19 | 20 | fileSystems."/boot" = 21 | { 22 | device = "/dev/disk/by-label/boot"; 23 | fsType = "vfat"; 24 | }; 25 | 26 | swapDevices = [ ]; 27 | 28 | hardware.parallels = { 29 | enable = true; 30 | package = with pkgs; (config.boot.kernelPackages.prl-tools.overrideAttrs (old: 31 | let 32 | version = "19.0.0-54570"; 33 | src = fetchurl { 34 | url = "https://download.parallels.com/desktop/v${lib.versions.major version}/${version}/ParallelsDesktop-${version}.dmg"; 35 | sha256 = "sha256-y7UC+E5i2cxkOJ9nVI6aQAFJ5kTXv9uaZoMO4/SCS6k="; 36 | }; 37 | patches = lib.optionals (lib.versionAtLeast config.boot.kernelPackages.kernel.version "6.0") [ 38 | # ./prl-tools-6.0.patch 39 | ]; 40 | in 41 | { inherit version src patches; } 42 | )); 43 | }; 44 | } 45 | -------------------------------------------------------------------------------- /hardware/vm-aarch64-utm.nix: -------------------------------------------------------------------------------- 1 | # Do not modify this file! It was generated by ‘nixos-generate-config’ 2 | # and may be overwritten by future invocations. Please make changes 3 | # to /etc/nixos/configuration.nix instead. 4 | { config, lib, pkgs, modulesPath, ... }: 5 | 6 | { 7 | imports = [ ]; 8 | 9 | boot.initrd.availableKernelModules = [ "virtio_pci" "xhci_pci" "usbhid" "usb_storage" ]; 10 | boot.initrd.kernelModules = [ ]; 11 | boot.kernelModules = [ ]; 12 | boot.extraModulePackages = [ ]; 13 | 14 | fileSystems."/" = 15 | { 16 | device = "/dev/disk/by-label/nixos"; 17 | fsType = "ext4"; 18 | }; 19 | 20 | fileSystems."/boot" = 21 | { 22 | device = "/dev/disk/by-label/boot"; 23 | fsType = "vfat"; 24 | }; 25 | 26 | swapDevices = [ ]; 27 | 28 | networking.useDHCP = true; 29 | nixpkgs.hostPlatform = lib.mkDefault "aarch64-linux"; 30 | } 31 | -------------------------------------------------------------------------------- /hardware/vm-aarch64-vmware.nix: -------------------------------------------------------------------------------- 1 | # Do not modify this file! It was generated by ‘nixos-generate-config’ 2 | # and may be overwritten by future invocations. Please make changes 3 | # to /etc/nixos/configuration.nix instead. 4 | { config, lib, pkgs, modulesPath, ... }: 5 | 6 | { 7 | imports = [ ]; 8 | 9 | boot.initrd.availableKernelModules = [ "uhci_hcd" "ahci" "xhci_pci" "nvme" "usbhid" "sr_mod" ]; 10 | boot.initrd.kernelModules = [ ]; 11 | boot.kernelModules = [ ]; 12 | boot.extraModulePackages = [ ]; 13 | 14 | fileSystems."/" = 15 | { 16 | device = "/dev/disk/by-label/nixos"; 17 | fsType = "ext4"; 18 | }; 19 | 20 | fileSystems."/boot" = 21 | { 22 | device = "/dev/disk/by-label/boot"; 23 | fsType = "vfat"; 24 | }; 25 | 26 | swapDevices = [ ]; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /home-modules/aerospace.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | xdg.configFile."aerospace/aerospace.toml".source = ./aerospace.toml; 4 | } 5 | -------------------------------------------------------------------------------- /home-modules/aerospace.toml: -------------------------------------------------------------------------------- 1 | # Place a copy of this config to ~/.aerospace.toml 2 | # After that, you can edit ~/.aerospace.toml to your liking 3 | 4 | # It's not necessary to copy all keys to your config. 5 | # If the key is missing in your config, "default-config.toml" will serve as a fallback 6 | 7 | # You can use it to add commands that run after login to macOS user session. 8 | # 'start-at-login' needs to be 'true' for 'after-login-command' to work 9 | # Available commands: https://nikitabobko.github.io/AeroSpace/commands 10 | after-login-command = [] 11 | 12 | # You can use it to add commands that run after AeroSpace startup. 13 | # 'after-startup-command' is run after 'after-login-command' 14 | # Available commands : https://nikitabobko.github.io/AeroSpace/commands 15 | after-startup-command = [] 16 | 17 | # Start AeroSpace at login 18 | start-at-login = true 19 | 20 | # Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization 21 | enable-normalization-flatten-containers = true 22 | enable-normalization-opposite-orientation-for-nested-containers = true 23 | 24 | # See: https://nikitabobko.github.io/AeroSpace/guide#layouts 25 | # The 'accordion-padding' specifies the size of accordion padding 26 | # You can set 0 to disable the padding feature 27 | accordion-padding = 30 28 | 29 | # Possible values: tiles|accordion 30 | default-root-container-layout = 'tiles' 31 | 32 | # Possible values: horizontal|vertical|auto 33 | # 'auto' means: wide monitor (anything wider than high) gets horizontal orientation, 34 | # tall monitor (anything higher than wide) gets vertical orientation 35 | default-root-container-orientation = 'auto' 36 | 37 | # Possible values: (qwerty|dvorak) 38 | # See https://nikitabobko.github.io/AeroSpace/guide#key-mapping 39 | key-mapping.preset = 'qwerty' 40 | 41 | # Mouse follows focus when focused monitor changes 42 | # Drop it from your config, if you don't like this behavior 43 | # See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks 44 | # See https://nikitabobko.github.io/AeroSpace/commands#move-mouse 45 | on-focused-monitor-changed = ['move-mouse monitor-lazy-center'] 46 | 47 | # Gaps between windows (inner-*) and between monitor edges (outer-*). 48 | # Possible values: 49 | # - Constant: gaps.outer.top = 8 50 | # - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24] 51 | # In this example, 24 is a default value when there is no match. 52 | # Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'. 53 | # See: https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors 54 | [gaps] 55 | inner.horizontal = 8 56 | inner.vertical = 8 57 | outer.left = 8 58 | outer.bottom = 8 59 | outer.top = 8 60 | outer.right = 8 61 | 62 | # 'main' binding mode declaration 63 | # See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes 64 | # 'main' binding mode must be always presented 65 | [mode.main.binding] 66 | 67 | # All possible keys: 68 | # - Letters. a, b, c, ..., z 69 | # - Numbers. 0, 1, 2, ..., 9 70 | # - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9 71 | # - F-keys. f1, f2, ..., f20 72 | # - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon, backtick, 73 | # leftSquareBracket, rightSquareBracket, space, enter, esc, backspace, tab 74 | # - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual, 75 | # keypadMinus, keypadMultiply, keypadPlus 76 | # - Arrows. left, down, up, right 77 | 78 | # All possible modifiers: cmd, alt, ctrl, shift 79 | 80 | # All possible commands: https://nikitabobko.github.io/AeroSpace/commands 81 | 82 | # See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget 83 | # You can uncomment the following lines to open up terminal with alt + enter shortcut (like in i3) 84 | # alt-enter = '''exec-and-forget osascript -e ' 85 | # tell application "Terminal" 86 | # do script 87 | # activate 88 | # end tell' 89 | # ''' 90 | 91 | # See: https://nikitabobko.github.io/AeroSpace/commands#layout 92 | alt-slash = 'layout tiles horizontal vertical' 93 | alt-comma = 'layout accordion horizontal vertical' 94 | 95 | # See: https://nikitabobko.github.io/AeroSpace/commands#focus 96 | alt-h = 'focus left' 97 | alt-j = 'focus down' 98 | alt-k = 'focus up' 99 | alt-l = 'focus right' 100 | 101 | # See: https://nikitabobko.github.io/AeroSpace/commands#move 102 | alt-shift-h = 'move left' 103 | alt-shift-j = 'move down' 104 | alt-shift-k = 'move up' 105 | alt-shift-l = 'move right' 106 | 107 | # See: https://nikitabobko.github.io/AeroSpace/commands#resize 108 | alt-shift-minus = 'resize smart -50' 109 | alt-shift-equal = 'resize smart +50' 110 | 111 | # See: https://nikitabobko.github.io/AeroSpace/commands#workspace 112 | alt-1 = 'workspace 1' 113 | alt-2 = 'workspace 2' 114 | alt-3 = 'workspace 3' 115 | alt-4 = 'workspace 4' 116 | alt-5 = 'workspace 5' 117 | alt-6 = 'workspace 6' 118 | alt-7 = 'workspace 7' 119 | alt-8 = 'workspace 8' 120 | alt-9 = 'workspace 9' 121 | alt-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need 122 | alt-b = 'workspace B' 123 | alt-c = 'workspace C' 124 | alt-d = 'workspace D' 125 | alt-e = 'workspace E' 126 | alt-f = 'workspace F' 127 | alt-g = 'workspace G' 128 | alt-i = 'workspace I' 129 | alt-m = 'workspace M' 130 | alt-n = 'workspace N' 131 | alt-o = 'workspace O' 132 | alt-p = 'workspace P' 133 | alt-q = 'workspace Q' 134 | alt-r = 'workspace R' 135 | alt-s = 'workspace S' 136 | alt-t = 'workspace T' 137 | alt-u = 'workspace U' 138 | alt-v = 'workspace V' 139 | alt-w = 'workspace W' 140 | alt-x = 'workspace X' 141 | alt-y = 'workspace Y' 142 | alt-z = 'workspace Z' 143 | 144 | # See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace 145 | alt-shift-1 = 'move-node-to-workspace 1' 146 | alt-shift-2 = 'move-node-to-workspace 2' 147 | alt-shift-3 = 'move-node-to-workspace 3' 148 | alt-shift-4 = 'move-node-to-workspace 4' 149 | alt-shift-5 = 'move-node-to-workspace 5' 150 | alt-shift-6 = 'move-node-to-workspace 6' 151 | alt-shift-7 = 'move-node-to-workspace 7' 152 | alt-shift-8 = 'move-node-to-workspace 8' 153 | alt-shift-9 = 'move-node-to-workspace 9' 154 | alt-shift-a = 'move-node-to-workspace A' 155 | alt-shift-b = 'move-node-to-workspace B' 156 | alt-shift-c = 'move-node-to-workspace C' 157 | alt-shift-d = 'move-node-to-workspace D' 158 | alt-shift-e = 'move-node-to-workspace E' 159 | alt-shift-f = 'move-node-to-workspace F' 160 | alt-shift-g = 'move-node-to-workspace G' 161 | alt-shift-i = 'move-node-to-workspace I' 162 | alt-shift-m = 'move-node-to-workspace M' 163 | alt-shift-n = 'move-node-to-workspace N' 164 | alt-shift-o = 'move-node-to-workspace O' 165 | alt-shift-p = 'move-node-to-workspace P' 166 | alt-shift-q = 'move-node-to-workspace Q' 167 | alt-shift-r = 'move-node-to-workspace R' 168 | alt-shift-s = 'move-node-to-workspace S' 169 | alt-shift-t = 'move-node-to-workspace T' 170 | alt-shift-u = 'move-node-to-workspace U' 171 | alt-shift-v = 'move-node-to-workspace V' 172 | alt-shift-w = 'move-node-to-workspace W' 173 | alt-shift-x = 'move-node-to-workspace X' 174 | alt-shift-y = 'move-node-to-workspace Y' 175 | alt-shift-z = 'move-node-to-workspace Z' 176 | 177 | # See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth 178 | alt-tab = 'workspace-back-and-forth' 179 | # See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor 180 | alt-shift-tab = 'move-workspace-to-monitor --wrap-around next' 181 | 182 | # See: https://nikitabobko.github.io/AeroSpace/commands#mode 183 | alt-shift-semicolon = 'mode service' 184 | 185 | # 'service' binding mode declaration. 186 | # See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes 187 | [mode.service.binding] 188 | esc = ['reload-config', 'mode main'] 189 | r = ['flatten-workspace-tree', 'mode main'] # reset layout 190 | #s = ['layout sticky tiling', 'mode main'] # sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2 191 | f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout 192 | backspace = ['close-all-windows-but-current', 'mode main'] 193 | 194 | alt-shift-h = ['join-with left', 'mode main'] 195 | alt-shift-j = ['join-with down', 'mode main'] 196 | alt-shift-k = ['join-with up', 'mode main'] 197 | alt-shift-l = ['join-with right', 'mode main'] 198 | 199 | # M = Messages 200 | [[on-window-detected]] 201 | if.app-id = 'com.tinyspeck.slackmacgap' 202 | run = ['move-node-to-workspace M'] 203 | 204 | [[on-window-detected]] 205 | if.app-id = 'com.apple.MobileSMS' 206 | run = ['move-node-to-workspace M'] 207 | 208 | [[on-window-detected]] 209 | if.app-id = 'net.whatsapp.WhatsApp' 210 | run = ['move-node-to-workspace M'] 211 | 212 | [[on-window-detected]] 213 | if.app-id = 'im.riot.app' 214 | run = ['move-node-to-workspace M'] 215 | 216 | [[on-window-detected]] 217 | if.app-id = 'ru.keepcoder.Telegram' 218 | run = ['move-node-to-workspace M'] 219 | 220 | [[on-window-detected]] 221 | if.app-id = 'org.whispersystems.signal-desktop' 222 | run = ['move-node-to-workspace M'] 223 | 224 | [[on-window-detected]] 225 | if.app-id = 'com.apple.mail' 226 | run = ['move-node-to-workspace M'] 227 | 228 | [[on-window-detected]] 229 | if.app-id = 'com.hnc.Discord' 230 | run = ['move-node-to-workspace M'] 231 | 232 | # G = Gather 233 | [[on-window-detected]] 234 | if.app-id = 'com.gather.Gather' 235 | run = ['move-node-to-workspace G'] 236 | 237 | # P = Planning 238 | [[on-window-detected]] 239 | if.app-id = 'md.obsidian' 240 | run = ['move-node-to-workspace P'] 241 | 242 | [[on-window-detected]] 243 | if.app-id = 'com.apple.iCal' 244 | run = ['move-node-to-workspace P'] 245 | 246 | [[on-window-detected]] 247 | if.app-id = 'com.apple.reminders' 248 | run = ['move-node-to-workspace P'] 249 | 250 | # N = Nedia (media) 251 | [[on-window-detected]] 252 | if.app-id = 'com.apple.Music' 253 | run = ['move-node-to-workspace N'] 254 | 255 | [[on-window-detected]] 256 | if.app-id = 'app.portal.ios.v1' 257 | run = ['move-node-to-workspace N'] 258 | 259 | # U = Union 260 | [[on-window-detected]] 261 | if.app-id = 'org.mozilla.firefoxdeveloperedition' 262 | run = ['move-node-to-workspace U'] 263 | 264 | [[on-window-detected]] 265 | if.app-id = 'com.microsoft.VSCode' 266 | run = ['move-node-to-workspace U'] 267 | 268 | # A = Arc / Chrome 269 | [[on-window-detected]] 270 | if.app-id = 'company.thebrowser.Browser' 271 | run = ['move-node-to-workspace A'] 272 | 273 | [[on-window-detected]] 274 | if.app-id = 'com.google.Chrome' 275 | run = ['move-node-to-workspace A'] 276 | 277 | # S = Safari 278 | [[on-window-detected]] 279 | if.app-id = 'com.apple.Safari' 280 | run = ['move-node-to-workspace S'] 281 | 282 | 283 | [workspace-to-monitor-force-assignment] 284 | M = 'built-in' 285 | N = 'built-in' 286 | P = 'built-in' 287 | C = 'built-in' 288 | U = 'XDR' 289 | I = 'XDR' 290 | O = 'XDR' 291 | -------------------------------------------------------------------------------- /home-modules/awesome.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | xsession.windowManager.awesome.enable = true; 4 | 5 | home.file.".config/awesome".source = ./awesome; 6 | } 7 | -------------------------------------------------------------------------------- /home-modules/awesome/theme.lua: -------------------------------------------------------------------------------- 1 | --------------------------- 2 | -- Default awesome theme -- 3 | --------------------------- 4 | 5 | local theme_assets = require("beautiful.theme_assets") 6 | local xresources = require("beautiful.xresources") 7 | local dpi = xresources.apply_dpi 8 | 9 | local gfs = require("gears.filesystem") 10 | local themes_path = gfs.get_themes_dir() 11 | 12 | local theme = {} 13 | 14 | local bg_color = "#111111" 15 | local focus_color = "#85a8ff" 16 | 17 | theme.font = "JetBrains Mono 10" 18 | 19 | theme.bg_normal = bg_color 20 | theme.bg_focus = focus_color 21 | theme.bg_urgent = "#ff0000" 22 | theme.bg_minimize = "#444444" 23 | theme.bg_systray = theme.bg_normal 24 | 25 | theme.fg_normal = "#aaaaaa" 26 | theme.fg_focus = "#ffffff" 27 | theme.fg_urgent = "#ffffff" 28 | theme.fg_minimize = "#ffffff" 29 | 30 | theme.useless_gap = dpi(8) 31 | theme.border_width = dpi(2) 32 | theme.border_normal = "#222222" 33 | theme.border_focus = focus_color 34 | theme.border_marked = "#91231c" 35 | 36 | theme.systray_icon_spacing = dpi(4) 37 | 38 | -- There are other variable sets 39 | -- overriding the default one when 40 | -- defined, the sets are: 41 | -- taglist_[bg|fg]_[focus|urgent|occupied|empty|volatile] 42 | -- tasklist_[bg|fg]_[focus|urgent] 43 | -- titlebar_[bg|fg]_[normal|focus] 44 | -- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] 45 | -- mouse_finder_[color|timeout|animate_timeout|radius|factor] 46 | -- prompt_[fg|bg|fg_cursor|bg_cursor|font] 47 | -- hotkeys_[bg|fg|border_width|border_color|shape|opacity|modifiers_fg|label_bg|label_fg|group_margin|font|description_font] 48 | -- Example: 49 | --theme.taglist_bg_focus = "#ff0000" 50 | 51 | -- Generate taglist squares: 52 | local taglist_square_size = dpi(4) 53 | theme.taglist_squares_sel = theme_assets.taglist_squares_sel( 54 | taglist_square_size, theme.fg_normal 55 | ) 56 | theme.taglist_squares_unsel = theme_assets.taglist_squares_unsel( 57 | taglist_square_size, theme.fg_normal 58 | ) 59 | 60 | -- Variables set for theming notifications: 61 | -- notification_font 62 | -- notification_[bg|fg] 63 | -- notification_[width|height|margin] 64 | -- notification_[border_color|border_width|shape|opacity] 65 | 66 | -- Variables set for theming the menu: 67 | -- menu_[bg|fg]_[normal|focus] 68 | -- menu_[border_color|border_width] 69 | theme.menu_submenu_icon = themes_path.."default/submenu.png" 70 | theme.menu_height = dpi(20) 71 | theme.menu_width = dpi(200) 72 | 73 | -- You can add as many variables as 74 | -- you wish and access them by using 75 | -- beautiful.variable in your rc.lua 76 | --theme.bg_widget = "#cc0000" 77 | 78 | -- Define the image to load 79 | theme.titlebar_close_button_normal = themes_path.."default/titlebar/close_normal.png" 80 | theme.titlebar_close_button_focus = themes_path.."default/titlebar/close_focus.png" 81 | 82 | theme.titlebar_minimize_button_normal = themes_path.."default/titlebar/minimize_normal.png" 83 | theme.titlebar_minimize_button_focus = themes_path.."default/titlebar/minimize_focus.png" 84 | 85 | theme.titlebar_ontop_button_normal_inactive = themes_path.."default/titlebar/ontop_normal_inactive.png" 86 | theme.titlebar_ontop_button_focus_inactive = themes_path.."default/titlebar/ontop_focus_inactive.png" 87 | theme.titlebar_ontop_button_normal_active = themes_path.."default/titlebar/ontop_normal_active.png" 88 | theme.titlebar_ontop_button_focus_active = themes_path.."default/titlebar/ontop_focus_active.png" 89 | 90 | theme.titlebar_sticky_button_normal_inactive = themes_path.."default/titlebar/sticky_normal_inactive.png" 91 | theme.titlebar_sticky_button_focus_inactive = themes_path.."default/titlebar/sticky_focus_inactive.png" 92 | theme.titlebar_sticky_button_normal_active = themes_path.."default/titlebar/sticky_normal_active.png" 93 | theme.titlebar_sticky_button_focus_active = themes_path.."default/titlebar/sticky_focus_active.png" 94 | 95 | theme.titlebar_floating_button_normal_inactive = themes_path.."default/titlebar/floating_normal_inactive.png" 96 | theme.titlebar_floating_button_focus_inactive = themes_path.."default/titlebar/floating_focus_inactive.png" 97 | theme.titlebar_floating_button_normal_active = themes_path.."default/titlebar/floating_normal_active.png" 98 | theme.titlebar_floating_button_focus_active = themes_path.."default/titlebar/floating_focus_active.png" 99 | 100 | theme.titlebar_maximized_button_normal_inactive = themes_path.."default/titlebar/maximized_normal_inactive.png" 101 | theme.titlebar_maximized_button_focus_inactive = themes_path.."default/titlebar/maximized_focus_inactive.png" 102 | theme.titlebar_maximized_button_normal_active = themes_path.."default/titlebar/maximized_normal_active.png" 103 | theme.titlebar_maximized_button_focus_active = themes_path.."default/titlebar/maximized_focus_active.png" 104 | 105 | theme.wallpaper = "/home/cor/nixos-config/wallpapers/waves.png" 106 | 107 | -- You can use your own layout icons like this: 108 | theme.layout_fairh = themes_path.."default/layouts/fairhw.png" 109 | theme.layout_fairv = themes_path.."default/layouts/fairvw.png" 110 | theme.layout_floating = themes_path.."default/layouts/floatingw.png" 111 | theme.layout_magnifier = themes_path.."default/layouts/magnifierw.png" 112 | theme.layout_max = themes_path.."default/layouts/maxw.png" 113 | theme.layout_fullscreen = themes_path.."default/layouts/fullscreenw.png" 114 | theme.layout_tilebottom = themes_path.."default/layouts/tilebottomw.png" 115 | theme.layout_tileleft = themes_path.."default/layouts/tileleftw.png" 116 | theme.layout_tile = themes_path.."default/layouts/tilew.png" 117 | theme.layout_tiletop = themes_path.."default/layouts/tiletopw.png" 118 | theme.layout_spiral = themes_path.."default/layouts/spiralw.png" 119 | theme.layout_dwindle = themes_path.."default/layouts/dwindlew.png" 120 | theme.layout_cornernw = themes_path.."default/layouts/cornernww.png" 121 | theme.layout_cornerne = themes_path.."default/layouts/cornernew.png" 122 | theme.layout_cornersw = themes_path.."default/layouts/cornersww.png" 123 | theme.layout_cornerse = themes_path.."default/layouts/cornersew.png" 124 | 125 | -- Generate Awesome icon: 126 | theme.awesome_icon = theme_assets.awesome_icon( 127 | theme.menu_height, theme.bg_focus, theme.fg_focus 128 | ) 129 | 130 | -- Define the icon theme for application icons. If not set then the icons 131 | -- from /usr/share/icons and /usr/share/icons/hicolor will be used. 132 | theme.icon_theme = nil 133 | 134 | return theme 135 | 136 | -- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 137 | -------------------------------------------------------------------------------- /home-modules/bat.nix: -------------------------------------------------------------------------------- 1 | { config, lib, theme, pkgs, pkgs-unstable, inputs, ... }: 2 | { 3 | programs.bat = { 4 | enable = true; 5 | config = { 6 | theme = if theme == "light" then "OneHalfLight" else "OneHalfDark"; 7 | }; 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /home-modules/chromium.nix: -------------------------------------------------------------------------------- 1 | { pkgs, pkgs-unstable, lib, theme, ... }: 2 | let 3 | package = 4 | if theme == "dark" then 5 | pkgs-unstable.chromium.override { commandLineArgs = "--force-dark-mode --enable-features=WebUIDarkMode"; } 6 | else pkgs-unstable.chromium; 7 | 8 | mkChromiumApp = { name, genericName, url }: 9 | pkgs.makeDesktopItem rec { 10 | inherit name; 11 | inherit genericName; 12 | desktopName = name; 13 | icon = name; 14 | exec = "${package}/bin/chromium --app=\"${url}\""; 15 | type = "Application"; 16 | terminal = false; 17 | }; 18 | 19 | createChromiumExtensionFor = browserVersion: { id, sha256, version }: 20 | { 21 | inherit id; 22 | crxPath = builtins.fetchurl { 23 | url = "https://clients2.google.com/service/update2/crx?response=redirect&acceptformat=crx2,crx3&prodversion=${browserVersion}&x=id%3D${id}%26installsource%3Dondemand%26uc"; 24 | name = "${id}.crx"; 25 | inherit sha256; 26 | }; 27 | inherit version; 28 | }; 29 | createChromiumExtension = createChromiumExtensionFor (lib.versions.major package.version); 30 | 31 | in 32 | { 33 | programs.chromium = { 34 | enable = true; 35 | inherit package; 36 | }; 37 | 38 | home.packages = map mkChromiumApp [ 39 | { 40 | name = "Discord"; 41 | genericName = "All-in-one cross-platform voice and text chat for gamers"; 42 | url = "https://discord.com/channels/@me"; 43 | } 44 | { 45 | name = "WhatsApp"; 46 | genericName = "Chat app built by Meta"; 47 | url = "https://web.whatsapp.com"; 48 | } 49 | ]; 50 | } 51 | -------------------------------------------------------------------------------- /home-modules/darwin.nix: -------------------------------------------------------------------------------- 1 | { config, pkgs, pkgs-unstable, lib, inputs, ... }: 2 | { 3 | home.stateVersion = "22.05"; 4 | 5 | home.packages = (with pkgs; [ 6 | fzf 7 | git 8 | jq 9 | tree 10 | bottom 11 | fd 12 | ]) ++ (with pkgs-unstable; [ zellij ]); 13 | 14 | 15 | # Hide "last login" message on new terminal. 16 | home.file.".hushlogin".text = ""; 17 | 18 | # programs.ssh doesn't work well for darwin. 19 | home.file.".ssh/config".text = '' 20 | Host * 21 | AddKeysToAgent yes 22 | Include ~/.orbstack/ssh/config 23 | ''; 24 | } 25 | -------------------------------------------------------------------------------- /home-modules/direnv.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | programs.direnv = { 4 | enable = true; 5 | nix-direnv.enable = true; 6 | }; 7 | } 8 | -------------------------------------------------------------------------------- /home-modules/emacs.nix: -------------------------------------------------------------------------------- 1 | { user, inputs, pkgs, pkgs-unstable, config, theme, ... }: 2 | { 3 | # start the emacs daemon 4 | services.emacs = 5 | let 6 | # Define a wrapped version of Emacs with the environment variable set 7 | # to fix the SSH_AUTH_SOCK issue. See home-modules/zsh.nix line 37 8 | emacsWithEnv = pkgs.writeShellScriptBin "emacs" '' 9 | #!/bin/sh 10 | export SSH_AUTH_SOCK=/home/${user.name}/.ssh/ssh_auth_sock 11 | exec ${config.programs.emacs.finalPackage}/bin/emacs "$@" 12 | ''; 13 | in 14 | { 15 | enable = true; 16 | package = emacsWithEnv; 17 | }; 18 | 19 | # the emacs package that will be used by the emacs daemon 20 | programs.emacs = { 21 | enable = true; 22 | package = inputs.emacs-overlay.packages.${pkgs.system}.emacs-unstable; 23 | extraPackages = epkgs: [ epkgs.vterm ]; 24 | }; 25 | } 26 | -------------------------------------------------------------------------------- /home-modules/flameshot.nix: -------------------------------------------------------------------------------- 1 | { pkgs-unstable, ... }: 2 | { 3 | # Ensure that the `Screenshots/` directory exists 4 | home.file."Screenshots/.keep".text = ""; 5 | 6 | services.flameshot = { 7 | enable = true; 8 | package = pkgs-unstable.flameshot; 9 | settings = { 10 | General = { 11 | savePath = "/home/cor/Screenshots"; 12 | showStartupLaunchMessage = false; 13 | disabledTrayIcon = true; 14 | filenamePattern = "%F-%H%M%S"; 15 | startupLaunch = true; 16 | saveAfterCopy = true; 17 | }; 18 | }; 19 | }; 20 | } 21 | 22 | -------------------------------------------------------------------------------- /home-modules/fuzzel.nix: -------------------------------------------------------------------------------- 1 | { pkgs, inputs, machine, lib, ... }: 2 | let 3 | accent = "A670DBFF"; # "rgb(166, 112, 219)"; 4 | in 5 | { 6 | programs.fuzzel = { 7 | enable = true; 8 | settings = { 9 | main = { 10 | terminal = "${lib.getExe inputs.ghostty.packages.${machine.system}.ghostty} -e"; 11 | inner-pad = 16; 12 | vertical-pad = 16; 13 | horizontal-pad = 16; 14 | dpi-aware = "yes"; 15 | }; 16 | # colors = { 17 | # background = "24283BFF"; 18 | # text = "C0CAF5FF"; 19 | # match = "FF9E64FF"; 20 | # placeholder = "9ECE6AFF"; 21 | # selection = accent; 22 | # selection-text = "1A1B26FF"; 23 | # selection-match = "1A1B26FF"; 24 | # border = accent; 25 | # }; 26 | 27 | border = { 28 | width = 6; 29 | radius = 20; 30 | }; 31 | }; 32 | }; 33 | } 34 | -------------------------------------------------------------------------------- /home-modules/ghostty.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | # xdg.configFile."ghostty/config".text = '' 4 | # macos-option-as-alt = true 5 | # theme = catppuccin-frappe 6 | # ''; 7 | programs.ghostty = { 8 | enable = true; 9 | settings = { 10 | window-decoration = "none"; 11 | window-padding-color = "extend-always"; 12 | gtk-single-instance = true; # faster window opening 13 | font-size = 12; 14 | }; 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /home-modules/git.nix: -------------------------------------------------------------------------------- 1 | { pkgs, pkgs-unstable, lib, machine, user, ... }: 2 | { 3 | programs.git = 4 | let 5 | sshSigningKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAN0JRbnTsz4eEUeL6My/ew+rX3Qojawn+Y1B3buPuyC"; 6 | in 7 | { 8 | enable = true; 9 | userName = user.githubName; 10 | userEmail = user.email; 11 | delta.enable = true; 12 | lfs.enable = true; 13 | extraConfig = { 14 | color.ui = true; 15 | github.user = user.githubName; 16 | gpg.format = "ssh"; 17 | init.defaultBranch = "main"; 18 | core.excludesFile = toString (pkgs.writeText "global-gitignore" '' 19 | .aider* 20 | .DS_Store 21 | ''); 22 | 23 | # Fix go private dependency fetching by using SSH instead of HTTPS 24 | "url \"ssh://git@github.com/\"".insteadOf = "https://github.com/"; 25 | commit.gpgsign = true; 26 | } // (if machine.darwin then { 27 | user.signingkey = sshSigningKey; 28 | gpg."ssh".program = "/Applications/1Password.app/Contents/MacOS/op-ssh-sign"; 29 | gpg.format = "ssh"; 30 | } else if machine.headless then { 31 | user.signingkey = sshSigningKey; 32 | signing = { 33 | signByDefault = true; 34 | key = sshSigningKey; 35 | }; 36 | } else { 37 | user.signingkey = sshSigningKey; 38 | gpg."ssh".program = "${lib.getExe' pkgs-unstable._1password-gui "op-ssh-sign"}"; 39 | gpg.format = "ssh"; 40 | }); 41 | }; 42 | } 43 | -------------------------------------------------------------------------------- /home-modules/gpg.nix: -------------------------------------------------------------------------------- 1 | { isDarwin, ... }: 2 | { 3 | programs.gpg = { 4 | enable = true; 5 | settings = { 6 | default-key = "06A6337C2BDD1365883C0668DB347466107E589F"; 7 | }; 8 | }; 9 | 10 | } // (if isDarwin then { } else { 11 | services.gpg-agent = { 12 | enable = true; 13 | pinentryFlavor = "gnome3"; 14 | enableSshSupport = true; 15 | 16 | # cache the keys forever so we don't get asked for a password 17 | defaultCacheTtl = 31536000; 18 | maxCacheTtl = 31536000; 19 | }; 20 | }) 21 | -------------------------------------------------------------------------------- /home-modules/gtk.nix: -------------------------------------------------------------------------------- 1 | { pkgs, theme, ... }: 2 | { 3 | gtk = { 4 | enable = true; 5 | 6 | theme = { 7 | package = pkgs.arc-theme; 8 | name = if theme == "dark" then "Arc-Dark" else "Arc"; 9 | }; 10 | 11 | iconTheme = { 12 | package = pkgs.paper-icon-theme; 13 | name = "Paper"; 14 | }; 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /home-modules/helix.nix: -------------------------------------------------------------------------------- 1 | { inputs, pkgs, config, ... }: 2 | { 3 | programs.helix = { 4 | enable = true; 5 | package = inputs.helix.packages.${pkgs.system}.default; 6 | 7 | settings = { 8 | theme = if config.stylix.polarity == "dark" then "yo" else "yo_light"; 9 | editor = { 10 | auto-format = true; 11 | completion-trigger-len = 0; 12 | scroll-lines = 1; 13 | scrolloff = 5; 14 | cursorline = false; 15 | color-modes = true; 16 | indent-guides.render = true; 17 | file-picker.hidden = false; 18 | auto-pairs = false; 19 | inline-diagnostics = { 20 | cursor-line = "hint"; 21 | }; 22 | lsp = { 23 | enable = true; 24 | display-messages = true; 25 | display-progress-messages = true; 26 | display-inlay-hints = true; 27 | }; 28 | bufferline = "always"; 29 | statusline = { 30 | left = [ "mode" "spinner" "file-name" ]; 31 | right = [ "diagnostics" "position" "total-line-numbers" "file-encoding" ]; 32 | center = [ "version-control" ]; 33 | }; 34 | soft-wrap = { 35 | enable = true; 36 | }; 37 | }; 38 | 39 | keys.normal = { 40 | space = { 41 | "h" = ":toggle-option lsp.display-inlay-hints"; 42 | "c" = [ ":write-all" ]; 43 | # f and F are swapped, as picking in cwd is much more common for me. 44 | "f" = "file_picker_in_current_directory"; 45 | "F" = "file_picker"; 46 | # https://github.com/sxyazi/yazi/pull/2461#issuecomment-2849445737 47 | "e" = [ 48 | '':sh rm -f /tmp/unique-file'' 49 | '':insert-output yazi "%{buffer_name}" --chooser-file=/tmp/unique-file'' 50 | '':insert-output echo "\x1b[?1049h\x1b[?2004h" > /dev/tty'' 51 | '':open %sh{cat /tmp/unique-file}'' 52 | '':redraw'' 53 | # https://github.com/helix-editor/helix/wiki/Recipes#advanced-file-explorer-with-yazi 54 | '':set mouse false'' 55 | '':set mouse true'' 56 | ]; 57 | "E" = "file_explorer"; 58 | }; 59 | ret = "goto_word"; 60 | }; 61 | keys.normal.space."0" = { 62 | "8" = [ ":rla" ":lsp-restart" ]; 63 | "9" = [ 64 | ":sh zellij action focus-next-pane" 65 | ":sh sleep 0.1 && zellij action write-chars \"/read %{buffer_name}\"" 66 | ":sh sleep 0.4 && zellij action write 9" 67 | ":sh sleep 0.5 && zellij action write 13" 68 | ]; 69 | "0" = [ 70 | ":sh zellij action focus-next-pane" 71 | ":sh sleep 0.1 && zellij action write-chars \"/add %{buffer_name}\"" 72 | ":sh sleep 0.4 && zellij action write 9" 73 | ":sh sleep 0.5 && zellij action write 13" 74 | ]; 75 | }; 76 | keys.normal.space."4" = { 77 | "b" = ":sh git blame %{buffer_name}"; 78 | "y" = ":pipe-to gh-permalink %{buffer_name} %{cursor_line} | pbcopy"; 79 | }; 80 | keys.select.space."4" = { 81 | "y" = ":pipe-to gh-permalink %{buffer_name} %{cursor_line} | pbcopy"; 82 | }; 83 | }; 84 | 85 | themes = { 86 | transparent_catppuccin_frappe = { 87 | inherits = "catppuccin_frappe"; 88 | "ui.background" = { 89 | fg = "foreground"; 90 | }; 91 | }; 92 | }; 93 | 94 | languages = { 95 | language = [ 96 | { 97 | name = "svelte"; 98 | formatter = { command = "prettier"; args = [ "--parser" "svelte" ]; }; 99 | auto-format = true; 100 | } 101 | { 102 | name = "typescript"; 103 | formatter = { command = "prettier"; args = [ "--parser" "typescript" ]; }; 104 | auto-format = true; 105 | } 106 | { 107 | name = "json"; 108 | formatter = { command = "prettier"; args = [ "--parser" "json" ]; }; 109 | auto-format = true; 110 | } 111 | { 112 | name = "nix"; 113 | formatter = { command = "nixpkgs-fmt"; }; 114 | auto-format = true; 115 | language-servers = [ "nil" ]; 116 | # language-servers = [ "nixd" "nil" ]; 117 | } 118 | { 119 | name = "xml"; 120 | formatter = { 121 | command = "xmllint"; 122 | auto-format = true; 123 | args = [ "--format" "-" ]; 124 | }; 125 | } 126 | ]; 127 | 128 | language-server = { 129 | # nixd = { 130 | # command = "nixd"; 131 | # }; 132 | rust-analyzer = { 133 | config = { 134 | checkOnSave.command = "clippy"; 135 | # Careful! If you enable this, then a lot of errors 136 | # will no longer show up in Helix. Do not enable it. 137 | # cargo.allFeatures = true; <- do NOT enable me 138 | }; 139 | }; 140 | }; 141 | }; 142 | }; 143 | } 144 | 145 | -------------------------------------------------------------------------------- /home-modules/kanshi.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | services.kanshi = { 4 | enable = true; 5 | profiles = { 6 | xreal = { 7 | outputs = [ 8 | { criteria = "BOE NE135A1M-NY1 Unknown"; status = "disable"; } 9 | { criteria = "Nreal XREAL One Pro Unknown"; status = "enable"; } 10 | ]; 11 | }; 12 | 13 | default = { 14 | outputs = [ 15 | { criteria = "BOE NE135A1M-NY1 Unknown"; status = "enable"; } 16 | ]; 17 | }; 18 | }; 19 | }; 20 | } 21 | -------------------------------------------------------------------------------- /home-modules/lazygit.nix: -------------------------------------------------------------------------------- 1 | { machine, ... }: 2 | { 3 | programs.lazygit = { 4 | enable = true; 5 | # package = pkgs-unstable.lazygit; 6 | settings = { 7 | gui.showBottomLine = false; 8 | git.autoFetch = false; 9 | # git.paging = { 10 | # colorArg = "always"; 11 | # pager = "delta --dark --paging=never"; 12 | # }; 13 | } // (if machine.headless then { 14 | os.copyToClipboardCmd = "printf {{text}} | pbcopy"; 15 | } else { }); 16 | }; 17 | } 18 | -------------------------------------------------------------------------------- /home-modules/niri.nix: -------------------------------------------------------------------------------- 1 | { config, pkgs, lib, ... }: 2 | let 3 | makeCommand = command: { 4 | command = [ command ]; 5 | }; 6 | in 7 | { 8 | programs.niri.settings = { 9 | 10 | 11 | workspaces = { 12 | "01-system" = { 13 | name = "system"; 14 | }; 15 | "02-audio" = { 16 | name = "audio"; 17 | }; 18 | "03-chat" = { 19 | name = "chat"; 20 | }; 21 | "04-notes" = { 22 | name = "notes"; 23 | }; 24 | }; 25 | 26 | window-rules = 27 | let 28 | gather = "brave-pbjccpkpjiopbageefcniicfbjibmmaj-Default"; 29 | element = "Element"; 30 | telegram = "org.telegram.desktop"; 31 | mail = "geary"; 32 | discord = "brave-magkoliahgffibhgfkmoealggombgknl-Default"; 33 | linear = "brave-bgdbmehlmdmddlgneophbcddadgknlpm-Default"; 34 | slack = "brave-polomiencpcgedklffamlbmdolindfpb-Default"; 35 | x-twitter = "brave-lodlkdfmihgonocnmddehnfgiljnadcf-Default"; 36 | signal = "signal"; 37 | 38 | apple-music = "brave-blgdilankhbcpipclgpdndahbehalgkh-Default"; 39 | spotify = "brave-pjibgclleladliembfgfagdaldikeohf-Default"; 40 | 41 | _1pw = "1Password"; 42 | volume-control = "org.pulseaudio.pavucontrol"; 43 | audio-effects = "com.github.wwmm.easyeffects"; 44 | 45 | camera-preview = "guvcview"; 46 | camera-preview-preview = ".guvcview-wrapped"; 47 | 48 | epiphany = "org.gnome.Epiphany"; 49 | obsidian = "obsidian"; 50 | 51 | 52 | matchApp = app: { app-id = app; }; 53 | matchApps = builtins.map matchApp; 54 | 55 | chatApps = [ 56 | gather 57 | element 58 | telegram 59 | mail 60 | discord 61 | slack 62 | signal 63 | x-twitter 64 | ]; 65 | in 66 | [ 67 | { 68 | block-out-from = "screen-capture"; 69 | matches = matchApps ([ 70 | _1pw 71 | spotify 72 | apple-music 73 | epiphany 74 | obsidian 75 | ] ++ chatApps); 76 | } 77 | { 78 | geometry-corner-radius = let radius = 10.0; in { 79 | bottom-left = radius; 80 | bottom-right = radius; 81 | top-left = radius; 82 | top-right = radius; 83 | }; 84 | clip-to-geometry = true; 85 | border.width = lib.mkForce 2; 86 | } 87 | { 88 | open-on-workspace = "chat"; 89 | matches = matchApps chatApps; 90 | } 91 | { 92 | open-on-workspace = "system"; 93 | matches = matchApps [ 94 | _1pw 95 | camera-preview 96 | camera-preview-preview 97 | ]; 98 | } 99 | { 100 | open-on-workspace = "audio"; 101 | matches = matchApps [ 102 | volume-control 103 | audio-effects 104 | spotify 105 | apple-music 106 | ]; 107 | } 108 | { 109 | open-on-workspace = "notes"; 110 | matches = matchApps [ 111 | linear 112 | obsidian 113 | epiphany 114 | ]; 115 | } 116 | ]; 117 | 118 | input = { 119 | touchpad = { 120 | natural-scroll = true; 121 | accel-speed = 0.02; 122 | scroll-factor = 0.3; 123 | tap = false; 124 | }; 125 | keyboard = { 126 | xkb = { 127 | options = "ctrl:nocaps"; 128 | }; 129 | repeat-rate = 40; 130 | repeat-delay = 250; 131 | }; 132 | }; 133 | 134 | outputs = { 135 | "Apple Computer Inc ProDisplayXDR 0x2E121A08" = { 136 | position = { 137 | x = 1440; 138 | y = 0; 139 | }; 140 | }; 141 | "Nreal XREAL One Pro Unknown" = { 142 | scale = 1.25; 143 | position = { 144 | x = -560; 145 | y = -354; 146 | }; 147 | }; 148 | # Framework built in display 149 | "BOE NE135A1M-NY1 Unknown" = { 150 | position = { 151 | x = 0; 152 | y = 366; 153 | }; 154 | }; 155 | }; 156 | 157 | overview = { 158 | zoom = 0.3; 159 | }; 160 | 161 | spawn-at-startup = [ 162 | (makeCommand "xwayland-satellite") 163 | (makeCommand "${pkgs.xdg-desktop-portal-gnome}/libexec/xdg-desktop-portal-gnome") 164 | ]; 165 | 166 | environment = { 167 | DISPLAY = ":0"; 168 | NIXOS_OZONE_WL = "1"; 169 | }; 170 | 171 | layout = { 172 | gaps = 16; 173 | focus-ring = { 174 | # active = { color = "rgb(166, 112, 219)"; }; 175 | width = lib.mkForce 1; 176 | }; 177 | preset-column-widths = [ 178 | { proportion = 1. / 4.; } 179 | { proportion = 1. / 3.; } 180 | { proportion = 1. / 2.; } 181 | { proportion = 2. / 3.; } 182 | ]; 183 | }; 184 | 185 | outputs."eDP-1".scale = 2.0; 186 | 187 | switch-events.lid-close.action.spawn = "swaylock"; 188 | screenshot-path = "~/Pictures/Screenshots/screenshot-%Y-%m-%dT%H:%M:%S.png"; 189 | 190 | binds = with config.lib.niri.actions; { 191 | "Mod+T" = { action = toggle-column-tabbed-display; }; 192 | "Mod+Return" = { action.spawn = "ghostty"; }; 193 | "Mod+Space" = { action.spawn = "fuzzel"; }; 194 | "Mod+Tab" = { action = toggle-overview; }; 195 | 196 | # change focus -- window 197 | "Mod+H" = { action = focus-column-left; }; 198 | "Mod+J" = { action = focus-window-down; }; 199 | "Mod+K" = { action = focus-window-up; }; 200 | "Mod+L" = { action = focus-column-right; }; 201 | 202 | # change focus -- workspace 203 | "Mod+U" = { action = focus-workspace-down; }; 204 | "Mod+I" = { action = focus-workspace-up; }; 205 | 206 | # change focus -- monitor 207 | "Mod+Alt+H" = { action = focus-monitor-left; }; 208 | "Mod+Alt+L" = { action = focus-monitor-right; }; 209 | 210 | # move windows 211 | "Mod+Ctrl+H" = { action = move-column-left; }; 212 | "Mod+Ctrl+J" = { action = move-window-down; }; 213 | "Mod+Ctrl+K" = { action = move-window-up; }; 214 | "Mod+Ctrl+L" = { action = move-column-right; }; 215 | 216 | # move columns -- workspace 217 | "Mod+Ctrl+U" = { action = move-column-to-workspace-down; }; 218 | "Mod+Ctrl+I" = { action = move-column-to-workspace-up; }; 219 | 220 | # move workspaces 221 | "Mod+Shift+U" = { action = move-workspace-down; }; 222 | "Mod+Shift+I" = { action = move-workspace-up; }; 223 | "Mod+Shift+H" = { action = move-workspace-to-monitor-left; }; 224 | "Mod+Shift+J" = { action = move-workspace-to-monitor-down; }; 225 | "Mod+Shift+K" = { action = move-workspace-to-monitor-up; }; 226 | "Mod+Shift+L" = { action = move-workspace-to-monitor-right; }; 227 | 228 | 229 | "Mod+R" = { action = switch-preset-column-width; }; 230 | 231 | 232 | "Mod+F" = { action = maximize-column; }; 233 | "Mod+Shift+F" = { action = fullscreen-window; }; 234 | 235 | "Mod+V" = { action = toggle-window-floating; }; 236 | 237 | "Mod+Q" = { action = close-window; }; 238 | 239 | "Mod+Alt+P".action.spawn = "swaylock"; 240 | 241 | "Mod+C" = { action = center-column; }; 242 | 243 | "Mod+Shift+4" = { action = screenshot; }; 244 | # "Mod+Shift+4" = { action.spawn = "cor-screenshot"; }; 245 | 246 | 247 | # volume control 248 | "XF86AudioRaiseVolume" = { allow-when-locked = true; action.spawn = [ "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.05+" ]; }; 249 | "XF86AudioLowerVolume" = { allow-when-locked = true; action.spawn = [ "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.05-" ]; }; 250 | "XF86AudioMute" = { allow-when-locked = true; action.spawn = [ "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle" ]; }; 251 | "XF86AudioMicMute" = { allow-when-locked = true; action.spawn = [ "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle" ]; }; 252 | 253 | # brithness control 254 | "XF86MonBrightnessUp" = { 255 | allow-when-locked = true; 256 | action.spawn = [ "brightnessctl" "set" "+5%" ]; 257 | }; 258 | 259 | "XF86MonBrightnessDown" = { 260 | allow-when-locked = true; 261 | action.spawn = [ "brightnessctl" "set" "5%-" ]; 262 | }; 263 | 264 | # media controls 265 | "XF86AudioPlay" = { 266 | allow-when-locked = true; 267 | action.spawn = [ "playerctl" "play-pause" ]; 268 | }; 269 | 270 | "XF86AudioNext" = { 271 | allow-when-locked = true; 272 | action.spawn = [ "playerctl" "next" ]; 273 | }; 274 | 275 | "XF86AudioPrev" = { 276 | allow-when-locked = true; 277 | action.spawn = [ "playerctl" "previous" ]; 278 | }; 279 | }; 280 | }; 281 | 282 | home.packages = [ pkgs.wl-clipboard ]; 283 | 284 | systemd.user.services."swaybg" = { 285 | Unit = { 286 | Description = "wallpapers! brought to you by stylix!"; 287 | PartOf = [ "graphical-session.target" ]; 288 | After = [ "graphical-session.target" ]; 289 | }; 290 | Install.WantedBy = [ "graphical-session.target" ]; 291 | Service = { 292 | ExecStart = "${lib.getExe pkgs.swaybg} -m fill -i ${config.stylix.image}"; 293 | Restart = "on-failure"; 294 | }; 295 | }; 296 | 297 | } 298 | -------------------------------------------------------------------------------- /home-modules/nushell/config.nu: -------------------------------------------------------------------------------- 1 | # Nushell Config File 2 | # 3 | # version = "0.88.1" 4 | 5 | # For more information on defining custom themes, see 6 | # https://www.nushell.sh/book/coloring_and_theming.html 7 | # And here is the theme collection 8 | # https://github.com/nushell/nu_scripts/tree/main/themes 9 | let dark_theme = { 10 | # color for nushell primitives 11 | separator: white 12 | leading_trailing_space_bg: { attr: n } # no fg, no bg, attr none effectively turns this off 13 | header: green_bold 14 | empty: blue 15 | # Closures can be used to choose colors for specific values. 16 | # The value (in this case, a bool) is piped into the closure. 17 | # eg) {|| if $in { 'light_cyan' } else { 'light_gray' } } 18 | bool: light_cyan 19 | int: white 20 | filesize: cyan 21 | duration: white 22 | date: purple 23 | range: white 24 | float: white 25 | string: white 26 | nothing: white 27 | binary: white 28 | cell-path: white 29 | row_index: green_bold 30 | record: white 31 | list: white 32 | block: white 33 | hints: dark_gray 34 | search_result: {bg: red fg: white} 35 | shape_and: purple_bold 36 | shape_binary: purple_bold 37 | shape_block: blue_bold 38 | shape_bool: light_cyan 39 | shape_closure: green_bold 40 | shape_custom: green 41 | shape_datetime: cyan_bold 42 | shape_directory: cyan 43 | shape_external: cyan 44 | shape_externalarg: green_bold 45 | shape_external_resolved: light_yellow_bold 46 | shape_filepath: cyan 47 | shape_flag: blue_bold 48 | shape_float: purple_bold 49 | # shapes are used to change the cli syntax highlighting 50 | shape_garbage: { fg: white bg: red attr: b} 51 | shape_globpattern: cyan_bold 52 | shape_int: purple_bold 53 | shape_internalcall: cyan_bold 54 | shape_keyword: cyan_bold 55 | shape_list: cyan_bold 56 | shape_literal: blue 57 | shape_match_pattern: green 58 | shape_matching_brackets: { attr: u } 59 | shape_nothing: light_cyan 60 | shape_operator: yellow 61 | shape_or: purple_bold 62 | shape_pipe: purple_bold 63 | shape_range: yellow_bold 64 | shape_record: cyan_bold 65 | shape_redirection: purple_bold 66 | shape_signature: green_bold 67 | shape_string: green 68 | shape_string_interpolation: cyan_bold 69 | shape_table: blue_bold 70 | shape_variable: purple 71 | shape_vardecl: purple 72 | } 73 | 74 | let light_theme = { 75 | # color for nushell primitives 76 | separator: dark_gray 77 | leading_trailing_space_bg: { attr: n } # no fg, no bg, attr none effectively turns this off 78 | header: green_bold 79 | empty: blue 80 | # Closures can be used to choose colors for specific values. 81 | # The value (in this case, a bool) is piped into the closure. 82 | # eg) {|| if $in { 'dark_cyan' } else { 'dark_gray' } } 83 | bool: dark_cyan 84 | int: dark_gray 85 | filesize: cyan_bold 86 | duration: dark_gray 87 | date: purple 88 | range: dark_gray 89 | float: dark_gray 90 | string: dark_gray 91 | nothing: dark_gray 92 | binary: dark_gray 93 | cell-path: dark_gray 94 | row_index: green_bold 95 | record: dark_gray 96 | list: dark_gray 97 | block: dark_gray 98 | hints: dark_gray 99 | search_result: {fg: white bg: red} 100 | shape_and: purple_bold 101 | shape_binary: purple_bold 102 | shape_block: blue_bold 103 | shape_bool: light_cyan 104 | shape_closure: green_bold 105 | shape_custom: green 106 | shape_datetime: cyan_bold 107 | shape_directory: cyan 108 | shape_external: cyan 109 | shape_externalarg: green_bold 110 | shape_external_resolved: light_purple_bold 111 | shape_filepath: cyan 112 | shape_flag: blue_bold 113 | shape_float: purple_bold 114 | # shapes are used to change the cli syntax highlighting 115 | shape_garbage: { fg: white bg: red attr: b} 116 | shape_globpattern: cyan_bold 117 | shape_int: purple_bold 118 | shape_internalcall: cyan_bold 119 | shape_keyword: cyan_bold 120 | shape_list: cyan_bold 121 | shape_literal: blue 122 | shape_match_pattern: green 123 | shape_matching_brackets: { attr: u } 124 | shape_nothing: light_cyan 125 | shape_operator: yellow 126 | shape_or: purple_bold 127 | shape_pipe: purple_bold 128 | shape_range: yellow_bold 129 | shape_record: cyan_bold 130 | shape_redirection: purple_bold 131 | shape_signature: green_bold 132 | shape_string: green 133 | shape_string_interpolation: cyan_bold 134 | shape_table: blue_bold 135 | shape_variable: purple 136 | shape_vardecl: purple 137 | } 138 | 139 | # External completer example 140 | # let carapace_completer = {|spans| 141 | # carapace $spans.0 nushell $spans | from json 142 | # } 143 | 144 | # The default config record. This is where much of your global configuration is setup. 145 | $env.config = { 146 | show_banner: true # true or false to enable or disable the welcome banner at startup 147 | 148 | ls: { 149 | use_ls_colors: true # use the LS_COLORS environment variable to colorize output 150 | clickable_links: true # enable or disable clickable links. Your terminal has to support links. 151 | } 152 | 153 | rm: { 154 | always_trash: false # always act as if -t was given. Can be overridden with -p 155 | } 156 | 157 | table: { 158 | mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other 159 | index_mode: always # "always" show indexes, "never" show indexes, "auto" = show indexes when a table has "index" column 160 | show_empty: true # show 'empty list' and 'empty record' placeholders for command output 161 | padding: { left: 1, right: 1 } # a left right padding of each column in a table 162 | trim: { 163 | methodology: wrapping # wrapping or truncating 164 | wrapping_try_keep_words: true # A strategy used by the 'wrapping' methodology 165 | truncating_suffix: "..." # A suffix used by the 'truncating' methodology 166 | } 167 | header_on_separator: false # show header text on separator/border line 168 | # abbreviated_row_count: 10 # limit data rows from top and bottom after reaching a set point 169 | } 170 | 171 | error_style: "fancy" # "fancy" or "plain" for screen reader-friendly error messages 172 | 173 | # datetime_format determines what a datetime rendered in the shell would look like. 174 | # Behavior without this configuration point will be to "humanize" the datetime display, 175 | # showing something like "a day ago." 176 | datetime_format: { 177 | # normal: '%a, %d %b %Y %H:%M:%S %z' # shows up in displays of variables or other datetime's outside of tables 178 | # table: '%m/%d/%y %I:%M:%S%p' # generally shows up in tabular outputs such as ls. commenting this out will change it to the default human readable datetime format 179 | } 180 | 181 | explore: { 182 | status_bar_background: {fg: "#1D1F21", bg: "#C4C9C6"}, 183 | command_bar_text: {fg: "#C4C9C6"}, 184 | highlight: {fg: "black", bg: "yellow"}, 185 | status: { 186 | error: {fg: "white", bg: "red"}, 187 | warn: {} 188 | info: {} 189 | }, 190 | table: { 191 | split_line: {fg: "#404040"}, 192 | selected_cell: {bg: light_blue}, 193 | selected_row: {}, 194 | selected_column: {}, 195 | }, 196 | } 197 | 198 | history: { 199 | max_size: 100_000 # Session has to be reloaded for this to take effect 200 | sync_on_enter: true # Enable to share history between multiple sessions, else you have to close the session to write history to file 201 | file_format: "plaintext" # "sqlite" or "plaintext" 202 | isolation: false # only available with sqlite file_format. true enables history isolation, false disables it. true will allow the history to be isolated to the current session using up/down arrows. false will allow the history to be shared across all sessions. 203 | } 204 | 205 | completions: { 206 | case_sensitive: false # set to true to enable case-sensitive completions 207 | quick: true # set this to false to prevent auto-selecting completions when only one remains 208 | partial: true # set this to false to prevent partial filling of the prompt 209 | algorithm: "prefix" # prefix or fuzzy 210 | external: { 211 | enable: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up may be very slow 212 | max_results: 100 # setting it lower can improve completion performance at the cost of omitting some options 213 | completer: null # check 'carapace_completer' above as an example 214 | } 215 | } 216 | 217 | filesize: { 218 | metric: false # true => KB, MB, GB (ISO standard), false => KiB, MiB, GiB (Windows standard) 219 | format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, auto 220 | } 221 | 222 | cursor_shape: { 223 | emacs: line # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (line is the default) 224 | vi_insert: block # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (block is the default) 225 | vi_normal: underscore # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (underscore is the default) 226 | } 227 | 228 | color_config: $dark_theme # if you want a more interesting theme, you can replace the empty record with `$dark_theme`, `$light_theme` or another custom record 229 | use_grid_icons: true 230 | footer_mode: "25" # always, never, number_of_rows, auto 231 | float_precision: 2 # the precision for displaying floats in tables 232 | buffer_editor: "" # command that will be used to edit the current line buffer with ctrl+o, if unset fallback to $env.EDITOR and $env.VISUAL 233 | use_ansi_coloring: true 234 | bracketed_paste: true # enable bracketed paste, currently useless on windows 235 | edit_mode: emacs # emacs, vi 236 | shell_integration: false # enables terminal shell integration. Off by default, as some terminals have issues with this. 237 | render_right_prompt_on_last_line: false # true or false to enable or disable right prompt to be rendered on last line of the prompt. 238 | use_kitty_protocol: false # enables keyboard enhancement protocol implemented by kitty console, only if your terminal support this. 239 | highlight_resolved_externals: false # true enables highlighting of external commands in the repl resolved by which. 240 | 241 | hooks: { 242 | pre_prompt: [{ null }] # run before the prompt is shown 243 | pre_execution: [{ null }] # run before the repl input is run 244 | env_change: { 245 | PWD: [{|before, after| null }] # run if the PWD environment is different since the last repl input 246 | } 247 | display_output: "if (term size).columns >= 100 { table -e } else { table }" # run to display the output of a pipeline 248 | command_not_found: { null } # return an error message when a command is not found 249 | } 250 | 251 | menus: [ 252 | # Configuration for default nushell menus 253 | # Note the lack of source parameter 254 | { 255 | name: completion_menu 256 | only_buffer_difference: false 257 | marker: "| " 258 | type: { 259 | layout: columnar 260 | columns: 4 261 | col_width: 20 # Optional value. If missing all the screen width is used to calculate column width 262 | col_padding: 2 263 | } 264 | style: { 265 | text: green 266 | selected_text: green_reverse 267 | description_text: yellow 268 | } 269 | } 270 | { 271 | name: history_menu 272 | only_buffer_difference: true 273 | marker: "? " 274 | type: { 275 | layout: list 276 | page_size: 10 277 | } 278 | style: { 279 | text: green 280 | selected_text: green_reverse 281 | description_text: yellow 282 | } 283 | } 284 | { 285 | name: help_menu 286 | only_buffer_difference: true 287 | marker: "? " 288 | type: { 289 | layout: description 290 | columns: 4 291 | col_width: 20 # Optional value. If missing all the screen width is used to calculate column width 292 | col_padding: 2 293 | selection_rows: 4 294 | description_rows: 10 295 | } 296 | style: { 297 | text: green 298 | selected_text: green_reverse 299 | description_text: yellow 300 | } 301 | } 302 | ] 303 | 304 | keybindings: [ 305 | { 306 | name: completion_menu 307 | modifier: none 308 | keycode: tab 309 | mode: [emacs vi_normal vi_insert] 310 | event: { 311 | until: [ 312 | { send: menu name: completion_menu } 313 | { send: menunext } 314 | { edit: complete } 315 | ] 316 | } 317 | } 318 | { 319 | name: history_menu 320 | modifier: control 321 | keycode: char_r 322 | mode: [emacs, vi_insert, vi_normal] 323 | event: { send: menu name: history_menu } 324 | } 325 | { 326 | name: help_menu 327 | modifier: none 328 | keycode: f1 329 | mode: [emacs, vi_insert, vi_normal] 330 | event: { send: menu name: help_menu } 331 | } 332 | { 333 | name: completion_previous_menu 334 | modifier: shift 335 | keycode: backtab 336 | mode: [emacs, vi_normal, vi_insert] 337 | event: { send: menuprevious } 338 | } 339 | { 340 | name: next_page_menu 341 | modifier: control 342 | keycode: char_x 343 | mode: emacs 344 | event: { send: menupagenext } 345 | } 346 | { 347 | name: undo_or_previous_page_menu 348 | modifier: control 349 | keycode: char_z 350 | mode: emacs 351 | event: { 352 | until: [ 353 | { send: menupageprevious } 354 | { edit: undo } 355 | ] 356 | } 357 | } 358 | { 359 | name: escape 360 | modifier: none 361 | keycode: escape 362 | mode: [emacs, vi_normal, vi_insert] 363 | event: { send: esc } # NOTE: does not appear to work 364 | } 365 | { 366 | name: cancel_command 367 | modifier: control 368 | keycode: char_c 369 | mode: [emacs, vi_normal, vi_insert] 370 | event: { send: ctrlc } 371 | } 372 | { 373 | name: quit_shell 374 | modifier: control 375 | keycode: char_d 376 | mode: [emacs, vi_normal, vi_insert] 377 | event: { send: ctrld } 378 | } 379 | { 380 | name: clear_screen 381 | modifier: control 382 | keycode: char_l 383 | mode: [emacs, vi_normal, vi_insert] 384 | event: { send: clearscreen } 385 | } 386 | { 387 | name: search_history 388 | modifier: control 389 | keycode: char_q 390 | mode: [emacs, vi_normal, vi_insert] 391 | event: { send: searchhistory } 392 | } 393 | { 394 | name: open_command_editor 395 | modifier: control 396 | keycode: char_o 397 | mode: [emacs, vi_normal, vi_insert] 398 | event: { send: openeditor } 399 | } 400 | { 401 | name: move_up 402 | modifier: none 403 | keycode: up 404 | mode: [emacs, vi_normal, vi_insert] 405 | event: { 406 | until: [ 407 | {send: menuup} 408 | {send: up} 409 | ] 410 | } 411 | } 412 | { 413 | name: move_down 414 | modifier: none 415 | keycode: down 416 | mode: [emacs, vi_normal, vi_insert] 417 | event: { 418 | until: [ 419 | {send: menudown} 420 | {send: down} 421 | ] 422 | } 423 | } 424 | { 425 | name: move_left 426 | modifier: none 427 | keycode: left 428 | mode: [emacs, vi_normal, vi_insert] 429 | event: { 430 | until: [ 431 | {send: menuleft} 432 | {send: left} 433 | ] 434 | } 435 | } 436 | { 437 | name: move_right_or_take_history_hint 438 | modifier: none 439 | keycode: right 440 | mode: [emacs, vi_normal, vi_insert] 441 | event: { 442 | until: [ 443 | {send: historyhintcomplete} 444 | {send: menuright} 445 | {send: right} 446 | ] 447 | } 448 | } 449 | { 450 | name: move_one_word_left 451 | modifier: control 452 | keycode: left 453 | mode: [emacs, vi_normal, vi_insert] 454 | event: {edit: movewordleft} 455 | } 456 | { 457 | name: move_one_word_right_or_take_history_hint 458 | modifier: control 459 | keycode: right 460 | mode: [emacs, vi_normal, vi_insert] 461 | event: { 462 | until: [ 463 | {send: historyhintwordcomplete} 464 | {edit: movewordright} 465 | ] 466 | } 467 | } 468 | { 469 | name: move_to_line_start 470 | modifier: none 471 | keycode: home 472 | mode: [emacs, vi_normal, vi_insert] 473 | event: {edit: movetolinestart} 474 | } 475 | { 476 | name: move_to_line_start 477 | modifier: control 478 | keycode: char_a 479 | mode: [emacs, vi_normal, vi_insert] 480 | event: {edit: movetolinestart} 481 | } 482 | { 483 | name: move_to_line_end_or_take_history_hint 484 | modifier: none 485 | keycode: end 486 | mode: [emacs, vi_normal, vi_insert] 487 | event: { 488 | until: [ 489 | {send: historyhintcomplete} 490 | {edit: movetolineend} 491 | ] 492 | } 493 | } 494 | { 495 | name: move_to_line_end_or_take_history_hint 496 | modifier: control 497 | keycode: char_e 498 | mode: [emacs, vi_normal, vi_insert] 499 | event: { 500 | until: [ 501 | {send: historyhintcomplete} 502 | {edit: movetolineend} 503 | ] 504 | } 505 | } 506 | { 507 | name: move_to_line_start 508 | modifier: control 509 | keycode: home 510 | mode: [emacs, vi_normal, vi_insert] 511 | event: {edit: movetolinestart} 512 | } 513 | { 514 | name: move_to_line_end 515 | modifier: control 516 | keycode: end 517 | mode: [emacs, vi_normal, vi_insert] 518 | event: {edit: movetolineend} 519 | } 520 | { 521 | name: move_up 522 | modifier: control 523 | keycode: char_p 524 | mode: [emacs, vi_normal, vi_insert] 525 | event: { 526 | until: [ 527 | {send: menuup} 528 | {send: up} 529 | ] 530 | } 531 | } 532 | { 533 | name: move_down 534 | modifier: control 535 | keycode: char_t 536 | mode: [emacs, vi_normal, vi_insert] 537 | event: { 538 | until: [ 539 | {send: menudown} 540 | {send: down} 541 | ] 542 | } 543 | } 544 | { 545 | name: delete_one_character_backward 546 | modifier: none 547 | keycode: backspace 548 | mode: [emacs, vi_insert] 549 | event: {edit: backspace} 550 | } 551 | { 552 | name: delete_one_word_backward 553 | modifier: control 554 | keycode: backspace 555 | mode: [emacs, vi_insert] 556 | event: {edit: backspaceword} 557 | } 558 | { 559 | name: delete_one_character_forward 560 | modifier: none 561 | keycode: delete 562 | mode: [emacs, vi_insert] 563 | event: {edit: delete} 564 | } 565 | { 566 | name: delete_one_character_forward 567 | modifier: control 568 | keycode: delete 569 | mode: [emacs, vi_insert] 570 | event: {edit: delete} 571 | } 572 | { 573 | name: delete_one_character_forward 574 | modifier: control 575 | keycode: char_h 576 | mode: [emacs, vi_insert] 577 | event: {edit: backspace} 578 | } 579 | { 580 | name: delete_one_word_backward 581 | modifier: control 582 | keycode: char_w 583 | mode: [emacs, vi_insert] 584 | event: {edit: backspaceword} 585 | } 586 | { 587 | name: move_left 588 | modifier: none 589 | keycode: backspace 590 | mode: vi_normal 591 | event: {edit: moveleft} 592 | } 593 | { 594 | name: newline_or_run_command 595 | modifier: none 596 | keycode: enter 597 | mode: emacs 598 | event: {send: enter} 599 | } 600 | { 601 | name: move_left 602 | modifier: control 603 | keycode: char_b 604 | mode: emacs 605 | event: { 606 | until: [ 607 | {send: menuleft} 608 | {send: left} 609 | ] 610 | } 611 | } 612 | { 613 | name: move_right_or_take_history_hint 614 | modifier: control 615 | keycode: char_f 616 | mode: emacs 617 | event: { 618 | until: [ 619 | {send: historyhintcomplete} 620 | {send: menuright} 621 | {send: right} 622 | ] 623 | } 624 | } 625 | { 626 | name: redo_change 627 | modifier: control 628 | keycode: char_g 629 | mode: emacs 630 | event: {edit: redo} 631 | } 632 | { 633 | name: undo_change 634 | modifier: control 635 | keycode: char_z 636 | mode: emacs 637 | event: {edit: undo} 638 | } 639 | { 640 | name: paste_before 641 | modifier: control 642 | keycode: char_y 643 | mode: emacs 644 | event: {edit: pastecutbufferbefore} 645 | } 646 | { 647 | name: cut_word_left 648 | modifier: control 649 | keycode: char_w 650 | mode: emacs 651 | event: {edit: cutwordleft} 652 | } 653 | { 654 | name: cut_line_to_end 655 | modifier: control 656 | keycode: char_k 657 | mode: emacs 658 | event: {edit: cuttoend} 659 | } 660 | { 661 | name: cut_line_from_start 662 | modifier: control 663 | keycode: char_u 664 | mode: emacs 665 | event: {edit: cutfromstart} 666 | } 667 | { 668 | name: swap_graphemes 669 | modifier: control 670 | keycode: char_t 671 | mode: emacs 672 | event: {edit: swapgraphemes} 673 | } 674 | { 675 | name: move_one_word_left 676 | modifier: alt 677 | keycode: left 678 | mode: emacs 679 | event: {edit: movewordleft} 680 | } 681 | { 682 | name: move_one_word_right_or_take_history_hint 683 | modifier: alt 684 | keycode: right 685 | mode: emacs 686 | event: { 687 | until: [ 688 | {send: historyhintwordcomplete} 689 | {edit: movewordright} 690 | ] 691 | } 692 | } 693 | { 694 | name: move_one_word_left 695 | modifier: alt 696 | keycode: char_b 697 | mode: emacs 698 | event: {edit: movewordleft} 699 | } 700 | { 701 | name: move_one_word_right_or_take_history_hint 702 | modifier: alt 703 | keycode: char_f 704 | mode: emacs 705 | event: { 706 | until: [ 707 | {send: historyhintwordcomplete} 708 | {edit: movewordright} 709 | ] 710 | } 711 | } 712 | { 713 | name: delete_one_word_forward 714 | modifier: alt 715 | keycode: delete 716 | mode: emacs 717 | event: {edit: deleteword} 718 | } 719 | { 720 | name: delete_one_word_backward 721 | modifier: alt 722 | keycode: backspace 723 | mode: emacs 724 | event: {edit: backspaceword} 725 | } 726 | { 727 | name: delete_one_word_backward 728 | modifier: alt 729 | keycode: char_m 730 | mode: emacs 731 | event: {edit: backspaceword} 732 | } 733 | { 734 | name: cut_word_to_right 735 | modifier: alt 736 | keycode: char_d 737 | mode: emacs 738 | event: {edit: cutwordright} 739 | } 740 | { 741 | name: upper_case_word 742 | modifier: alt 743 | keycode: char_u 744 | mode: emacs 745 | event: {edit: uppercaseword} 746 | } 747 | { 748 | name: lower_case_word 749 | modifier: alt 750 | keycode: char_l 751 | mode: emacs 752 | event: {edit: lowercaseword} 753 | } 754 | { 755 | name: capitalize_char 756 | modifier: alt 757 | keycode: char_c 758 | mode: emacs 759 | event: {edit: capitalizechar} 760 | } 761 | ] 762 | } 763 | -------------------------------------------------------------------------------- /home-modules/nushell/env.nu: -------------------------------------------------------------------------------- 1 | # Nushell Environment Config File 2 | # 3 | # version = "0.88.1" 4 | 5 | def create_left_prompt [] { 6 | let home = $nu.home-path 7 | 8 | # Perform tilde substitution on dir 9 | # To determine if the prefix of the path matches the home dir, we split the current path into 10 | # segments, and compare those with the segments of the home dir. In cases where the current dir 11 | # is a parent of the home dir (e.g. `/home`, homedir is `/home/user`), this comparison will 12 | # also evaluate to true. Inside the condition, we attempt to str replace `$home` with `~`. 13 | # Inside the condition, either: 14 | # 1. The home prefix will be replaced 15 | # 2. The current dir is a parent of the home dir, so it will be uneffected by the str replace 16 | let dir = ( 17 | if ($env.PWD | path split | zip ($home | path split) | all { $in.0 == $in.1 }) { 18 | ($env.PWD | str replace $home "~") 19 | } else { 20 | $env.PWD 21 | } 22 | ) 23 | 24 | let path_color = (if (is-admin) { ansi red_bold } else { ansi green_bold }) 25 | let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi light_green_bold }) 26 | let path_segment = $"($path_color)($dir)" 27 | 28 | $path_segment | str replace --all (char path_sep) $"($separator_color)(char path_sep)($path_color)" 29 | } 30 | 31 | def create_right_prompt [] { 32 | # create a right prompt in magenta with green separators and am/pm underlined 33 | let time_segment = ([ 34 | (ansi reset) 35 | (ansi magenta) 36 | (date now | format date '%x %X %p') # try to respect user's locale 37 | ] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" | 38 | str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}") 39 | 40 | let last_exit_code = if ($env.LAST_EXIT_CODE != 0) {([ 41 | (ansi rb) 42 | ($env.LAST_EXIT_CODE) 43 | ] | str join) 44 | } else { "" } 45 | 46 | ([$last_exit_code, (char space), $time_segment] | str join) 47 | } 48 | 49 | # Use nushell functions to define your right and left prompt 50 | $env.PROMPT_COMMAND = {|| create_left_prompt } 51 | # FIXME: This default is not implemented in rust code as of 2023-09-08. 52 | $env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt } 53 | 54 | # The prompt indicators are environmental variables that represent 55 | # the state of the prompt 56 | $env.PROMPT_INDICATOR = {|| "> " } 57 | $env.PROMPT_INDICATOR_VI_INSERT = {|| ": " } 58 | $env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " } 59 | $env.PROMPT_MULTILINE_INDICATOR = {|| "::: " } 60 | 61 | # If you want previously entered commands to have a different prompt from the usual one, 62 | # you can uncomment one or more of the following lines. 63 | # This can be useful if you have a 2-line prompt and it's taking up a lot of space 64 | # because every command entered takes up 2 lines instead of 1. You can then uncomment 65 | # the line below so that previously entered commands show with a single `🚀`. 66 | # $env.TRANSIENT_PROMPT_COMMAND = {|| "🚀 " } 67 | # $env.TRANSIENT_PROMPT_INDICATOR = {|| "" } 68 | # $env.TRANSIENT_PROMPT_INDICATOR_VI_INSERT = {|| "" } 69 | # $env.TRANSIENT_PROMPT_INDICATOR_VI_NORMAL = {|| "" } 70 | # $env.TRANSIENT_PROMPT_MULTILINE_INDICATOR = {|| "" } 71 | # $env.TRANSIENT_PROMPT_COMMAND_RIGHT = {|| "" } 72 | 73 | # Specifies how environment variables are: 74 | # - converted from a string to a value on Nushell startup (from_string) 75 | # - converted from a value back to a string when running external commands (to_string) 76 | # Note: The conversions happen *after* config.nu is loaded 77 | $env.ENV_CONVERSIONS = { 78 | "PATH": { 79 | from_string: { |s| $s | split row (char esep) | path expand --no-symlink } 80 | to_string: { |v| $v | path expand --no-symlink | str join (char esep) } 81 | } 82 | "Path": { 83 | from_string: { |s| $s | split row (char esep) | path expand --no-symlink } 84 | to_string: { |v| $v | path expand --no-symlink | str join (char esep) } 85 | } 86 | } 87 | 88 | # Directories to search for scripts when calling source or use 89 | # The default for this is $nu.default-config-dir/scripts 90 | $env.NU_LIB_DIRS = [ 91 | ($nu.default-config-dir | path join 'scripts') # add /scripts 92 | ] 93 | 94 | # Directories to search for plugin binaries when calling register 95 | # The default for this is $nu.default-config-dir/plugins 96 | $env.NU_PLUGIN_DIRS = [ 97 | ($nu.default-config-dir | path join 'plugins') # add /plugins 98 | ] 99 | 100 | # To add entries to PATH (on Windows you might use Path), you can use the following pattern: 101 | # $env.PATH = ($env.PATH | split row (char esep) | prepend '/some/path') 102 | -------------------------------------------------------------------------------- /home-modules/nushell/nushell.nix: -------------------------------------------------------------------------------- 1 | { pkgs-unstable, ... }: 2 | { 3 | programs.nushell = { 4 | package = pkgs-unstable.nushell; 5 | enable = true; 6 | configFile.source = ./config.nu; 7 | envFile.source = ./env.nu; 8 | }; 9 | } 10 | -------------------------------------------------------------------------------- /home-modules/packages.nix: -------------------------------------------------------------------------------- 1 | { config, lib, pkgs, pkgs-unstable, inputs, ... }: 2 | { 3 | home.packages = with pkgs; [ 4 | bat # cat replacement 5 | binutils 6 | coreutils-full 7 | curl 8 | delta 9 | # du-dust 10 | fd 11 | fzf 12 | # gnome3.gnome-control-center 13 | gping # ping with graph 14 | gtkmm3 # needed for the vmware user tools clipboard 15 | # htop 16 | krita 17 | nnn 18 | pamixer 19 | pick-colour-picker 20 | pinentry 21 | pinentry-curses 22 | ripgrep 23 | tree 24 | watch 25 | wget 26 | xclip 27 | zip 28 | ] ++ 29 | (with pkgs-unstable; [ 30 | openssh 31 | gh 32 | jq 33 | bottom 34 | # marksman 35 | # neofetch 36 | # obsidian 37 | # vscode 38 | ]); 39 | } 40 | -------------------------------------------------------------------------------- /home-modules/ranger.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | home.file.".config/ranger/rc.conf".text = '' 4 | set preview_images true 5 | set preview_images_method kitty 6 | ''; 7 | } 8 | -------------------------------------------------------------------------------- /home-modules/rofi.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: 2 | { 3 | programs.rofi = { 4 | enable = true; 5 | 6 | terminal = "kitty"; 7 | theme = "sidebar"; 8 | 9 | plugins = with pkgs; [ rofi-emoji rofi-calc ]; 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /home-modules/stylix.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | stylix.targets.helix.enable = false; 4 | } 5 | -------------------------------------------------------------------------------- /home-modules/swaylock.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | programs.swaylock = { 4 | enable = true; 5 | settings = { 6 | # color = "080808"; 7 | show-failed-attempts = true; 8 | ignore-empty-password = false; 9 | }; 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /home-modules/tmux.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: 2 | { 3 | programs.tmux = { 4 | enable = true; 5 | terminal = "xterm-256color"; 6 | secureSocket = false; 7 | clock24 = true; 8 | escapeTime = 0; 9 | historyLimit = 1000000; 10 | baseIndex = 1; 11 | newSession = true; 12 | 13 | shortcut = "a"; 14 | # aggressiveResize = true; -- Disabled to be iTerm-friendly 15 | 16 | plugins = with pkgs; [ 17 | tmuxPlugins.better-mouse-mode 18 | ]; 19 | 20 | extraConfig = '' 21 | # https://old.reddit.com/r/tmux/comments/mesrci/tmux_2_doesnt_seem_to_use_256_colors/ 22 | set -g default-terminal "xterm-256color" 23 | set -ga terminal-overrides ",*256col*:Tc" 24 | set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q' 25 | set-environment -g COLORTERM "truecolor" 26 | 27 | # Mouse works as expected 28 | set-option -g mouse on 29 | 30 | # easy-to-remember split pane commands 31 | bind | split-window -h -c "#{pane_current_path}" 32 | bind - split-window -v -c "#{pane_current_path}" 33 | bind c new-window -c "#{pane_current_path}" 34 | ''; 35 | }; 36 | 37 | home.packages = [ 38 | # Open tmux for current project. 39 | (pkgs.writeShellApplication { 40 | name = "pux"; 41 | runtimeInputs = [ pkgs.tmux ]; 42 | text = '' 43 | PRJ="''$(zoxide query -i)" 44 | echo "Launching tmux for ''$PRJ" 45 | set -x 46 | cd "''$PRJ" && \ 47 | exec tmux -S "''$PRJ".tmux attach 48 | ''; 49 | }) 50 | ]; 51 | 52 | } 53 | -------------------------------------------------------------------------------- /home-modules/waybar.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | # xdg.configFile."ghostty/config".text = '' 4 | # macos-option-as-alt = true 5 | # theme = catppuccin-frappe 6 | # ''; 7 | programs.waybar = { 8 | enable = true; 9 | settings = { 10 | mainBar = { 11 | layer = "top"; 12 | modules-left = [ "niri/workspaces" ]; 13 | modules-right = [ "network" "power-profiles-daemon" "battery" "backlight" "wireplumber" "clock" ]; 14 | battery.format = "{capacity}"; 15 | backlight.format = "{percent}"; 16 | wireplumber.format = "{volume}"; 17 | clock = { 18 | format-alt = "{:%a, %d. %b %H:%M}"; 19 | }; 20 | network = { 21 | "format" = "{ifname}"; 22 | "format-wifi" = "{icon} "; 23 | "format-ethernet" = "󰌘 "; 24 | "format-disconnected" = "󰌙 "; 25 | "tooltip-format" = "{ipaddr}  {bandwidthUpBits}  {bandwidthDownBits}"; 26 | "format-linked" = "󰈁 {ifname} (No IP)"; 27 | "tooltip-format-wifi" = "{essid} {icon} {signalStrength}%"; 28 | "tooltip-format-ethernet" = "{ifname} 󰌘"; 29 | "tooltip-format-disconnected" = "󰌙 Disconnected"; 30 | "max-length" = 30; 31 | "format-icons" = [ 32 | "󰤯" 33 | "󰤟" 34 | "󰤢" 35 | "󰤥" 36 | "󰤨" 37 | ]; 38 | "on-click-right" = "ghostty -e nmtui"; 39 | }; 40 | 41 | "power-profiles-daemon" = { 42 | "format" = "{icon} "; 43 | "tooltip-format" = "Power profile: {profile}\nDriver: {driver}"; 44 | "tooltip" = true; 45 | "format-icons" = { 46 | "default" = ""; 47 | "performance" = ""; 48 | "balanced" = ""; 49 | "power-saver" = ""; 50 | }; 51 | }; 52 | }; 53 | # style = '' 54 | # ${builtins.readFile "${pkgs.waybar}/etc/xdg/waybar/style.css"} 55 | 56 | # * { 57 | # font-family: "JetBrainsMono Nerd Font"; 58 | # } 59 | 60 | # window#waybar { 61 | # border-bottom: none; 62 | # } 63 | # ''; 64 | }; 65 | 66 | systemd = { 67 | enable = true; 68 | target = "niri.service"; 69 | }; 70 | 71 | # Override default stylix styling for waybar 72 | style = 73 | # css 74 | '' 75 | .modules-left { 76 | padding-left: 8px; 77 | } 78 | .modules-right { 79 | padding-right: 8px; 80 | } 81 | 82 | /* Use stylix colors but override specific element styles */ 83 | #workspaces button { 84 | border-radius: 0; 85 | padding: 1px 9px; 86 | font-weight: 600; 87 | } 88 | 89 | #workspaces button.focused { 90 | border-radius: 0; 91 | } 92 | 93 | #workspaces button.active { 94 | border-radius: 0; 95 | } 96 | 97 | #workspaces button.urgent { 98 | border-radius: 0; 99 | } 100 | 101 | #workspaces button:hover { 102 | border-radius: 0; 103 | } 104 | 105 | #clock { 106 | font-weight: 600; 107 | } 108 | ''; 109 | }; 110 | } 111 | 112 | -------------------------------------------------------------------------------- /home-modules/yazi.nix: -------------------------------------------------------------------------------- 1 | { inputs, pkgs-unstable, theme, machine, ... }: 2 | { 3 | programs.yazi = { 4 | enable = true; 5 | package = if machine.darwin then pkgs-unstable.yazi else inputs.yazi.packages.${pkgs-unstable.system}.default; 6 | enableZshIntegration = true; 7 | 8 | settings = { 9 | log = { 10 | enabled = false; 11 | }; 12 | # manager = { 13 | # ratio = [ 2 8 0 ]; 14 | # show_hidden = true; 15 | # sort_dir_first = true; 16 | # }; 17 | }; 18 | # keymap = { 19 | # manager.prepend_keymap = [{ 20 | # on = [ "l" ]; 21 | # run = "plugin --sync smart-enter"; 22 | # desc = "Enter the child directory, or open the file"; 23 | # }]; 24 | # }; 25 | }; 26 | 27 | xdg.configFile."yazi/plugins".source = ./yazi/plugins; 28 | } 29 | 30 | -------------------------------------------------------------------------------- /home-modules/yazi/plugins/smart-enter.yazi/init.lua: -------------------------------------------------------------------------------- 1 | return { 2 | entry = function() 3 | local h = cx.active.current.hovered 4 | if h.cha.is_dir then 5 | ya.manager_emit("enter" or "open", { hovered = true }) 6 | else 7 | local hx_command = ':o ' .. tostring(h.url) 8 | local command = 'zellij ac focus-next-pane && zellij ac write 27 && zellij ac write-chars "' .. hx_command .. '" && zellij ac write 13 ' 9 | -- zellij ac focus-next-pane && zellij ac write 27 && zellij ac write-chars ":o flake.nix" && zellij ac write 13 10 | os.execute(command) 11 | end 12 | end, 13 | } 14 | -------------------------------------------------------------------------------- /home-modules/zed.nix: -------------------------------------------------------------------------------- 1 | { pkgs-unstable, ... }: 2 | { 3 | programs.zed-editor = { 4 | enable = true; 5 | package = pkgs-unstable.zed-editor; 6 | }; 7 | } 8 | 9 | -------------------------------------------------------------------------------- /home-modules/zellij-config.kdl: -------------------------------------------------------------------------------- 1 | pane_frames false 2 | theme "gruvbox-dark" 3 | simplified_ui true 4 | show_startup_tips false 5 | 6 | session_serialization false 7 | 8 | default_mode "locked" 9 | keybinds clear-defaults=true { 10 | normal { 11 | } 12 | locked { 13 | bind "Ctrl g" { SwitchToMode "Normal"; } 14 | } 15 | resize { 16 | bind "r" { SwitchToMode "Normal"; } 17 | bind "h" "Left" { Resize "Increase Left"; } 18 | bind "j" "Down" { Resize "Increase Down"; } 19 | bind "k" "Up" { Resize "Increase Up"; } 20 | bind "l" "Right" { Resize "Increase Right"; } 21 | bind "H" { Resize "Decrease Left"; } 22 | bind "J" { Resize "Decrease Down"; } 23 | bind "K" { Resize "Decrease Up"; } 24 | bind "L" { Resize "Decrease Right"; } 25 | bind "=" "+" { Resize "Increase"; } 26 | bind "-" { Resize "Decrease"; } 27 | } 28 | pane { 29 | bind "p" { SwitchToMode "Normal"; } 30 | bind "h" "Left" { MoveFocus "Left"; } 31 | bind "l" "Right" { MoveFocus "Right"; } 32 | bind "j" "Down" { MoveFocus "Down"; } 33 | bind "k" "Up" { MoveFocus "Up"; } 34 | bind "Tab" { SwitchFocus; } 35 | bind "n" { NewPane; SwitchToMode "Locked"; } 36 | bind "d" { NewPane "Down"; SwitchToMode "Locked"; } 37 | bind "r" { NewPane "Right"; SwitchToMode "Locked"; } 38 | bind "x" { CloseFocus; SwitchToMode "Locked"; } 39 | bind "f" { ToggleFocusFullscreen; SwitchToMode "Locked"; } 40 | bind "z" { TogglePaneFrames; SwitchToMode "Locked"; } 41 | bind "w" { ToggleFloatingPanes; SwitchToMode "Locked"; } 42 | bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "Locked"; } 43 | bind "c" { SwitchToMode "RenamePane"; PaneNameInput 0;} 44 | // uncomment when zellij is updated 45 | // bind "i" { TogglePanePinned; SwitchToMode "Locked"; } 46 | } 47 | move { 48 | bind "m" { SwitchToMode "Normal"; } 49 | bind "n" "Tab" { MovePane; } 50 | bind "p" { MovePaneBackwards; } 51 | bind "h" "Left" { MovePane "Left"; } 52 | bind "j" "Down" { MovePane "Down"; } 53 | bind "k" "Up" { MovePane "Up"; } 54 | bind "l" "Right" { MovePane "Right"; } 55 | } 56 | tab { 57 | bind "t" { SwitchToMode "Normal"; } 58 | bind "r" { SwitchToMode "RenameTab"; TabNameInput 0; } 59 | bind "h" "Left" "Up" "k" { GoToPreviousTab; } 60 | bind "l" "Right" "Down" "j" { GoToNextTab; } 61 | bind "n" { NewTab; SwitchToMode "Locked"; } 62 | bind "x" { CloseTab; SwitchToMode "Locked"; } 63 | bind "s" { ToggleActiveSyncTab; SwitchToMode "Locked"; } 64 | bind "b" { BreakPane; SwitchToMode "Locked"; } 65 | bind "]" { BreakPaneRight; SwitchToMode "Locked"; } 66 | bind "[" { BreakPaneLeft; SwitchToMode "Locked"; } 67 | bind "1" { GoToTab 1; SwitchToMode "Locked"; } 68 | bind "2" { GoToTab 2; SwitchToMode "Locked"; } 69 | bind "3" { GoToTab 3; SwitchToMode "Locked"; } 70 | bind "4" { GoToTab 4; SwitchToMode "Locked"; } 71 | bind "5" { GoToTab 5; SwitchToMode "Locked"; } 72 | bind "6" { GoToTab 6; SwitchToMode "Locked"; } 73 | bind "7" { GoToTab 7; SwitchToMode "Locked"; } 74 | bind "8" { GoToTab 8; SwitchToMode "Locked"; } 75 | bind "9" { GoToTab 9; SwitchToMode "Locked"; } 76 | bind "Tab" { ToggleTab; } 77 | } 78 | scroll { 79 | bind "s" { SwitchToMode "Normal"; } 80 | bind "e" { EditScrollback; SwitchToMode "Locked"; } 81 | bind "f" { SwitchToMode "EnterSearch"; SearchInput 0; } 82 | bind "Ctrl c" { ScrollToBottom; SwitchToMode "Locked"; } 83 | bind "j" "Down" { ScrollDown; } 84 | bind "k" "Up" { ScrollUp; } 85 | bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; } 86 | bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; } 87 | bind "d" { HalfPageScrollDown; } 88 | bind "u" { HalfPageScrollUp; } 89 | bind "Alt left" { MoveFocusOrTab "left"; SwitchToMode "locked"; } 90 | bind "Alt down" { MoveFocus "down"; SwitchToMode "locked"; } 91 | bind "Alt up" { MoveFocus "up"; SwitchToMode "locked"; } 92 | bind "Alt right" { MoveFocusOrTab "right"; SwitchToMode "locked"; } 93 | bind "Alt h" { MoveFocusOrTab "left"; SwitchToMode "locked"; } 94 | bind "Alt j" { MoveFocus "down"; SwitchToMode "locked"; } 95 | bind "Alt k" { MoveFocus "up"; SwitchToMode "locked"; } 96 | bind "Alt l" { MoveFocusOrTab "right"; SwitchToMode "locked"; } 97 | } 98 | search { 99 | bind "Ctrl c" { ScrollToBottom; SwitchToMode "Locked"; } 100 | bind "j" "Down" { ScrollDown; } 101 | bind "k" "Up" { ScrollUp; } 102 | bind "Ctrl f" "PageDown" "Right" "l" { PageScrollDown; } 103 | bind "Ctrl b" "PageUp" "Left" "h" { PageScrollUp; } 104 | bind "d" { HalfPageScrollDown; } 105 | bind "u" { HalfPageScrollUp; } 106 | bind "n" { Search "down"; } 107 | bind "p" { Search "up"; } 108 | bind "c" { SearchToggleOption "CaseSensitivity"; } 109 | bind "w" { SearchToggleOption "Wrap"; } 110 | bind "o" { SearchToggleOption "WholeWord"; } 111 | } 112 | entersearch { 113 | bind "Ctrl c" "Esc" { SwitchToMode "Scroll"; } 114 | bind "Enter" { SwitchToMode "Search"; } 115 | } 116 | renametab { 117 | bind "Ctrl c" "Enter" { SwitchToMode "Locked"; } 118 | bind "Esc" { UndoRenameTab; SwitchToMode "Tab"; } 119 | } 120 | renamepane { 121 | bind "Ctrl c" "Enter" { SwitchToMode "Locked"; } 122 | bind "Esc" { UndoRenamePane; SwitchToMode "Pane"; } 123 | } 124 | session { 125 | bind "o" { SwitchToMode "Normal"; } 126 | bind "d" { Detach; } 127 | bind "w" { 128 | LaunchOrFocusPlugin "session-manager" { 129 | floating true 130 | move_to_focused_tab true 131 | }; 132 | SwitchToMode "Locked" 133 | } 134 | bind "c" { 135 | LaunchOrFocusPlugin "configuration" { 136 | floating true 137 | move_to_focused_tab true 138 | }; 139 | SwitchToMode "Locked" 140 | } 141 | bind "p" { 142 | LaunchOrFocusPlugin "plugin-manager" { 143 | floating true 144 | move_to_focused_tab true 145 | }; 146 | SwitchToMode "Locked" 147 | } 148 | } 149 | shared_except "locked" "renametab" "renamepane" { 150 | bind "Ctrl g" { SwitchToMode "Locked"; } 151 | bind "Ctrl q" { Quit; } 152 | } 153 | shared_except "renamepane" "renametab" "entersearch" "locked" { 154 | bind "esc" { SwitchToMode "locked"; } 155 | } 156 | shared_among "normal" "locked" { 157 | bind "Alt n" { NewPane; } 158 | bind "Alt f" { ToggleFloatingPanes; } 159 | bind "Alt i" { MoveTab "Left"; } 160 | bind "Alt o" { MoveTab "Right"; } 161 | bind "Alt h" "Alt Left" { MoveFocusOrTab "Left"; } 162 | bind "Alt l" "Alt Right" { MoveFocusOrTab "Right"; } 163 | bind "Alt j" "Alt Down" { MoveFocus "Down"; } 164 | bind "Alt k" "Alt Up" { MoveFocus "Up"; } 165 | bind "Alt =" "Alt +" { Resize "Increase"; } 166 | bind "Alt -" { Resize "Decrease"; } 167 | bind "Alt [" { PreviousSwapLayout; } 168 | bind "Alt ]" { NextSwapLayout; } 169 | } 170 | shared_except "locked" "renametab" "renamepane" { 171 | bind "Enter" { SwitchToMode "Locked"; } 172 | } 173 | shared_except "pane" "locked" "renametab" "renamepane" "entersearch" { 174 | bind "p" { SwitchToMode "Pane"; } 175 | } 176 | shared_except "resize" "locked" "renametab" "renamepane" "entersearch" { 177 | bind "r" { SwitchToMode "Resize"; } 178 | } 179 | shared_except "scroll" "locked" "renametab" "renamepane" "entersearch" { 180 | bind "s" { SwitchToMode "Scroll"; } 181 | } 182 | shared_except "session" "locked" "renametab" "renamepane" "entersearch" { 183 | bind "o" { SwitchToMode "Session"; } 184 | } 185 | shared_except "tab" "locked" "renametab" "renamepane" "entersearch" { 186 | bind "t" { SwitchToMode "Tab"; } 187 | } 188 | shared_except "move" "locked" "renametab" "renamepane" "entersearch" { 189 | bind "m" { SwitchToMode "Move"; } 190 | } 191 | } 192 | -------------------------------------------------------------------------------- /home-modules/zellij-layout-combined.kdl: -------------------------------------------------------------------------------- 1 | layout { 2 | default_tab_template { 3 | // pane size=1 borderless=true { 4 | // plugin location="zellij:tab-bar" 5 | // } 6 | children 7 | // pane size=2 borderless=true { 8 | // plugin location="zellij:status-bar" 9 | // } 10 | pane size=1 borderless=true { 11 | plugin location="zellij:compact-bar" 12 | } 13 | } 14 | tab name="IDE" focus=true { 15 | pane split_direction="horizontal" { 16 | pane size="80%" split_direction="vertical" { 17 | pane size="20%" command="yazi" name="Yazi" 18 | pane size="80%" name="Helix" 19 | } 20 | pane size="20%" split_direction="vertical" { 21 | pane size="50%" 22 | pane size="50%" 23 | } 24 | } 25 | 26 | floating_panes { 27 | pane command="lazygit" name="LazyGit" 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /home-modules/zellij-layout.kdl: -------------------------------------------------------------------------------- 1 | layout { 2 | default_tab_template { 3 | pane size=1 borderless=true { 4 | plugin location="zellij:tab-bar" 5 | } 6 | children 7 | pane size=2 borderless=true { 8 | plugin location="zellij:status-bar" 9 | } 10 | } 11 | tab name="Console" 12 | tab name="Editor" focus=true { 13 | pane split_direction="vertical" { 14 | pane size="20%" command="yazi" 15 | pane size="80%" command="nix" { 16 | args "develop" "-c" "hx" 17 | } 18 | } 19 | } 20 | tab name="Server" 21 | tab name="Git" { 22 | pane command="lazygit" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /home-modules/zellij.nix: -------------------------------------------------------------------------------- 1 | { pkgs, pkgs-unstable, ... }: 2 | { 3 | programs.zellij = { 4 | enable = true; 5 | package = pkgs-unstable.zellij; 6 | }; 7 | 8 | # Nix does not translate nicely to KDL so we use a KDL file instead. 9 | xdg.configFile."zellij/config.kdl".source = ./zellij-config.kdl; 10 | # xdg.configFile."zellij/layouts/split.kdl".source = ./zellij-layout.kdl; 11 | # xdg.configFile."zellij/layouts/default.kdl".source = ./zellij-layout-combined.kdl; 12 | 13 | 14 | # Needed to let Zellij find SSH_AUTH_SOCK after re-attaching to session 15 | # cfr: https://github.com/zellij-org/zellij/issues/862#issuecomment-973881560 16 | # --------------------------------------------------- 17 | # programs.zsh.initExtra = (if isDarwin then "" else '' 18 | # export SSH_AUTH_SOCK="$HOME/.ssh/ssh_auth_sock" 19 | # ''); 20 | 21 | # home.file.".ssh/rc".text = '' 22 | # if test "$SSH_AUTH_SOCK"; then 23 | # ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock 24 | # fi 25 | # ''; 26 | # --------------------------------------------------- 27 | 28 | home.packages = [ 29 | # Open tmux for current project. 30 | (pkgs.writeShellApplication { 31 | name = "pij"; 32 | runtimeInputs = [ pkgs-unstable.zellij ]; 33 | text = '' 34 | PRJ="''$(zoxide query -i)" 35 | echo "Launching zellij for ''$PRJ" 36 | set -x 37 | cd "''$PRJ" && \ 38 | exec zellij -s "$(basename "''$PRJ")" 39 | ''; 40 | }) 41 | ]; 42 | 43 | } 44 | -------------------------------------------------------------------------------- /home-modules/zoxide.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | programs.zoxide = { 4 | enable = true; 5 | enableZshIntegration = true; 6 | }; 7 | } 8 | 9 | -------------------------------------------------------------------------------- /home-modules/zsh.nix: -------------------------------------------------------------------------------- 1 | { machine, ... }: 2 | { 3 | programs.zsh = { 4 | enable = true; 5 | enableCompletion = true; 6 | syntaxHighlighting.enable = true; 7 | history = { 8 | save = 10000000; 9 | size = 10000000; 10 | }; 11 | shellAliases = { 12 | fzf-nix = "nix-env -qa | fzf"; 13 | lg = "lazygit"; 14 | pbcopyy = "xclip -selection c"; # macOS' pbcopy equivalent 15 | hxc = "CARGO_TARGET_DIR=target/rust-analyzer /etc/profiles/per-user/cor/bin/hx"; # speed increase for rust-analyzer 16 | hxt = "CARGO_TARGET_DIR=target/rust-analyzer nix run github:pinelang/helix-tree-explorer/tree_explore"; # Helix PR with tree explorer 17 | nd = "nix develop --command zsh"; 18 | gs = "git status"; 19 | update-time = "sudo date -s \"$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z\""; 20 | nixbuild-shell = "ssh eu.nixbuild.net shell"; 21 | s = "kitty +kitten ssh -A"; 22 | }; 23 | initContent = 24 | let 25 | darwinInit = '' 26 | # Check if SSH_AUTH_SOCK is set and points to the default macOS agent 27 | if [[ -z "$SSH_AUTH_SOCK" || "$SSH_AUTH_SOCK" == /private/tmp/com.apple.launchd.* ]]; then 28 | # No forwarded agent, use 1Password agent 29 | export SSH_AUTH_SOCK="$HOME/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock" 30 | fi 31 | ''; 32 | linuxInit = '' 33 | # set the symlink that code-server/emacs uses to the most recently logged in $SSH_AUTH_SOCK 34 | # if [ ! -h "$SSH_AUTH_SOCK" ]; then 35 | # ln -sfv "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock; 36 | # fi 37 | ''; 38 | sharedInit = '' 39 | # Edit command line widget 40 | edit-command-line() { 41 | local tmpfile="$(mktemp)" 42 | echo "$BUFFER" > "$tmpfile" 43 | ${"$"}EDITOR "$tmpfile" 44 | BUFFER="$(<$tmpfile)" 45 | rm -f "$tmpfile" 46 | zle redisplay 47 | } 48 | zle -N edit-command-line 49 | bindkey '\ee' edit-command-line 50 | ''; 51 | in 52 | if machine.darwin then 53 | darwinInit + sharedInit 54 | else 55 | linuxInit + sharedInit; 56 | }; 57 | } 58 | 59 | -------------------------------------------------------------------------------- /machines/corbookair-nixos.nix: -------------------------------------------------------------------------------- 1 | # Edit this configuration file to define what should be installed on 2 | # your system. Help is available in the configuration.nix(5) man page 3 | # and in the NixOS manual (accessible by running ‘nixos-help’). 4 | 5 | { machine, modulesPath, ... }: 6 | { 7 | imports = 8 | [ 9 | # Include the default lxd configuration. 10 | "${modulesPath}/virtualisation/lxc-container.nix" 11 | # Include the container-specific autogenerated configuration. 12 | 13 | ]; 14 | 15 | # contents of lxd.nix 16 | networking.hostName = machine.name; 17 | 18 | # networking.hostName = mkForce "nixos"; # Overwrite the hostname. 19 | # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. 20 | 21 | # Set your time zone. 22 | # time.timeZone = "Europe/Amsterdam"; 23 | 24 | # The global useDHCP flag is deprecated, therefore explicitly set to false here. 25 | # Per-interface useDHCP will be mandatory in the future, so this generated config 26 | # replicates the default behaviour. 27 | 28 | # This being `true` leads to a few nasty bugs, change at your own risk! 29 | users.mutableUsers = false; 30 | 31 | networking = { 32 | dhcpcd.enable = false; 33 | useDHCP = false; 34 | useHostResolvConf = false; 35 | }; 36 | 37 | systemd.network = { 38 | enable = true; 39 | networks."50-eth0" = { 40 | matchConfig.Name = "eth0"; 41 | networkConfig = { 42 | DHCP = "ipv4"; 43 | IPv6AcceptRA = true; 44 | }; 45 | linkConfig.RequiredForOnline = "routable"; 46 | }; 47 | }; 48 | 49 | # This value determines the NixOS release from which the default 50 | # settings for stateful data, like file locations and database versions 51 | # on your system were taken. It‘s perfectly fine and recommended to leave 52 | # this value at the release version of the first install of this system. 53 | # Before changing this value read the documentation for this option 54 | # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). 55 | system.stateVersion = machine.stateVersion; # Did you read the comment? 56 | 57 | # As this is intended as a stadalone image, undo some of the minimal profile stuff 58 | documentation.enable = true; 59 | documentation.nixos.enable = true; 60 | environment.noXlibs = false; 61 | } 62 | -------------------------------------------------------------------------------- /machines/corbookpro-nixos.nix: -------------------------------------------------------------------------------- 1 | # Edit this configuration file to define what should be installed on 2 | # your system. Help is available in the configuration.nix(5) man page 3 | # and in the NixOS manual (accessible by running ‘nixos-help’). 4 | 5 | { machine, modulesPath, ... }: 6 | { 7 | imports = 8 | [ 9 | # Include the default lxd configuration. 10 | "${modulesPath}/virtualisation/lxc-container.nix" 11 | # Include the container-specific autogenerated configuration. 12 | 13 | ]; 14 | 15 | # contents of lxd.nix 16 | networking.hostName = machine.name; 17 | 18 | # networking.hostName = mkForce "nixos"; # Overwrite the hostname. 19 | # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. 20 | 21 | # Set your time zone. 22 | # time.timeZone = "Europe/Amsterdam"; 23 | 24 | # The global useDHCP flag is deprecated, therefore explicitly set to false here. 25 | # Per-interface useDHCP will be mandatory in the future, so this generated config 26 | # replicates the default behaviour. 27 | 28 | # This being `true` leads to a few nasty bugs, change at your own risk! 29 | users.mutableUsers = false; 30 | 31 | networking = { 32 | dhcpcd.enable = false; 33 | useDHCP = false; 34 | useHostResolvConf = false; 35 | }; 36 | 37 | systemd.network = { 38 | enable = true; 39 | networks."50-eth0" = { 40 | matchConfig.Name = "eth0"; 41 | networkConfig = { 42 | DHCP = "ipv4"; 43 | IPv6AcceptRA = true; 44 | }; 45 | linkConfig.RequiredForOnline = "routable"; 46 | }; 47 | }; 48 | 49 | # This value determines the NixOS release from which the default 50 | # settings for stateful data, like file locations and database versions 51 | # on your system were taken. It‘s perfectly fine and recommended to leave 52 | # this value at the release version of the first install of this system. 53 | # Before changing this value read the documentation for this option 54 | # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). 55 | system.stateVersion = machine.stateVersion; # Did you read the comment? 56 | 57 | # As this is intended as a stadalone image, undo some of the minimal profile stuff 58 | documentation.enable = true; 59 | documentation.nixos.enable = true; 60 | environment.noXlibs = false; 61 | } 62 | -------------------------------------------------------------------------------- /machines/corwork.nix: -------------------------------------------------------------------------------- 1 | # Edit this configuration file to define what should be installed on 2 | # your system. Help is available in the configuration.nix(5) man page 3 | # and in the NixOS manual (accessible by running ‘nixos-help’). 4 | 5 | { config, pkgs, lib, machine, inputs, ... }: 6 | # let 7 | # pkgs-kernel = import inputs.nixpkgs-unstable { system = machine.system; config.allowUnfree = true; }; 8 | # in 9 | { 10 | # Bootloader. 11 | boot.loader.systemd-boot.enable = true; 12 | boot.loader.efi.canTouchEfiVariables = true; 13 | 14 | # use newer kernel for framework 13 drivers 15 | # not needed anymore after 25.05. now do NOT go to latest or hibernate wont work 16 | # override to pin, as per docs: https://nixos.wiki/wiki/Linux_kernel 17 | boot.kernelPackages = pkgs.linuxPackagesFor (pkgs.linux_6_14.override { 18 | argsOverride = rec { 19 | src = pkgs.fetchurl { 20 | url = "mirror://kernel/linux/kernel/v6.x/linux-${version}.tar.xz"; 21 | sha256 = "sha256-IYF/GZjiIw+B9+T2Bfpv3LBA4U+ifZnCfdsWznSXl6k="; 22 | }; 23 | version = "6.14.6"; 24 | modDirVersion = "6.14.6"; 25 | }; 26 | }); 27 | 28 | 29 | # suspend-then-hibernate 30 | systemd.sleep.extraConfig = '' 31 | HibernateDelaySec=60min 32 | ''; 33 | 34 | services.logind = { 35 | lidSwitch = "suspend-then-hibernate"; 36 | lidSwitchDocked = "ignore"; 37 | }; 38 | 39 | 40 | # Enable fingerprint reader support 41 | services.fprintd.enable = true; 42 | 43 | # Enable firmware updates 44 | services.fwupd.enable = true; 45 | 46 | # Enable iOS USB connection 47 | services.usbmuxd = { 48 | enable = true; 49 | package = pkgs.usbmuxd2; 50 | }; 51 | 52 | boot.initrd.luks.devices = { 53 | "luks-2369b304-611c-4725-9626-c8d57dac9611" = { 54 | device = "/dev/disk/by-uuid/2369b304-611c-4725-9626-c8d57dac9611"; 55 | preLVM = true; 56 | }; 57 | }; 58 | 59 | # configure resume from hibernation 60 | boot.resumeDevice = "/dev/mapper/luks-2369b304-611c-4725-9626-c8d57dac9611"; 61 | boot.kernelParams = [ "resume=/dev/mapper/luks-2369b304-611c-4725-9626-c8d57dac9611" ]; 62 | 63 | 64 | 65 | networking.hostName = machine.name; # Define your hostname. 66 | # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. 67 | 68 | # Configure network proxy if necessary 69 | # networking.proxy.default = "http://user:password@proxy:port/"; 70 | # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; 71 | 72 | # Enable networking 73 | networking.networkmanager.enable = true; 74 | 75 | # Set your time zone. 76 | time.timeZone = "Europe/Amsterdam"; 77 | 78 | # Select internationalisation properties. 79 | i18n.defaultLocale = "en_US.UTF-8"; 80 | 81 | i18n.extraLocaleSettings = { 82 | LC_ADDRESS = "nl_NL.UTF-8"; 83 | LC_IDENTIFICATION = "nl_NL.UTF-8"; 84 | LC_MEASUREMENT = "nl_NL.UTF-8"; 85 | LC_MONETARY = "nl_NL.UTF-8"; 86 | LC_NAME = "nl_NL.UTF-8"; 87 | LC_NUMERIC = "nl_NL.UTF-8"; 88 | LC_PAPER = "nl_NL.UTF-8"; 89 | LC_TELEPHONE = "nl_NL.UTF-8"; 90 | LC_TIME = "nl_NL.UTF-8"; 91 | }; 92 | 93 | # Enable the X11 windowing system. 94 | services.xserver.enable = true; 95 | 96 | # Enable the GNOME Desktop Environment. 97 | services.xserver.displayManager.gdm.enable = true; 98 | services.xserver.desktopManager.gnome.enable = true; 99 | 100 | # Configure keymap in X11 101 | services.xserver.xkb = { 102 | layout = "us"; 103 | variant = ""; 104 | }; 105 | 106 | # Enable CUPS to print documents. 107 | services.printing.enable = true; 108 | 109 | # Enable sound with pipewire. 110 | services.pulseaudio.enable = false; 111 | 112 | hardware.bluetooth.enable = true; 113 | services.blueman.enable = true; 114 | 115 | security.rtkit.enable = true; 116 | services.pipewire = { 117 | enable = true; 118 | alsa.enable = true; 119 | alsa.support32Bit = true; 120 | pulse.enable = true; 121 | # If you want to use JACK applications, uncomment this 122 | #jack.enable = true; 123 | 124 | # use the example session manager (no others are packaged yet so this is enabled by default, 125 | # no need to redefine it in your config for now) 126 | #media-session.enable = true; 127 | }; 128 | 129 | # Enable touchpad support (enabled default in most desktopManager). 130 | # services.xserver.libinput.enable = true; 131 | # 132 | 133 | # enables power profile toggling in waybar 134 | services.power-profiles-daemon.enable = true; 135 | 136 | # Define a user account. Don't forget to set a password with ‘passwd’. 137 | users.users.cor = { 138 | isNormalUser = true; 139 | description = "cor"; 140 | extraGroups = [ "networkmanager" "wheel" ]; 141 | packages = with pkgs; [ 142 | # thunderbird 143 | ]; 144 | }; 145 | 146 | # Install firefox. 147 | # programs.firefox.enable = true; 148 | 149 | # Allow unfree packages 150 | nixpkgs.config.allowUnfree = true; 151 | 152 | # List packages installed in system profile. To search, run: 153 | # $ nix search wget 154 | environment.systemPackages = with pkgs; [ 155 | # vim # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. 156 | # wget 157 | ]; 158 | 159 | # Some programs need SUID wrappers, can be configured further or are 160 | # started in user sessions. 161 | # programs.mtr.enable = true; 162 | # programs.gnupg.agent = { 163 | # enable = true; 164 | # enableSSHSupport = true; 165 | # }; 166 | 167 | # List services that you want to enable: 168 | 169 | # Enable the OpenSSH daemon. 170 | # services.openssh.enable = true; 171 | 172 | # Open ports in the firewall. 173 | # networking.firewall.allowedTCPPorts = [ ... ]; 174 | # networking.firewall.allowedUDPPorts = [ ... ]; 175 | # Or disable the firewall altogether. 176 | # networking.firewall.enable = false; 177 | 178 | # This value determines the NixOS release from which the default 179 | # settings for stateful data, like file locations and database versions 180 | # on your system were taken. It‘s perfectly fine and recommended to leave 181 | # this value at the release version of the first install of this system. 182 | # Before changing this value read the documentation for this option 183 | # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). 184 | system.stateVersion = "24.11"; # Did you read the comment? 185 | 186 | 187 | 188 | 189 | } 190 | -------------------------------------------------------------------------------- /machines/raspberry-pi.nix: -------------------------------------------------------------------------------- 1 | { pkgs, inputs, machine, ... }: { 2 | 3 | networking = { 4 | hostName = machine.name; 5 | useDHCP = false; 6 | interfaces = { eth0.useDHCP = true; }; 7 | nameservers = [ "1.1.1.1" "1.0.0.1" ]; 8 | firewall = { 9 | allowedTCPPorts = [ 443 80 26656 22 ]; 10 | allowPing = true; 11 | }; 12 | }; 13 | 14 | # You cannot enter the pi without openssh enabled! 15 | services.openssh.enable = true; 16 | 17 | environment.systemPackages = with pkgs; [ bluez bluez-tools ]; 18 | 19 | raspberry-pi-nix.board = "bcm2712"; # pi5, cfr: https://www.raspberrypi.com/documentation/computers/linux_kernel.html#native-build-configuration 20 | 21 | hardware = { 22 | bluetooth.enable = true; 23 | raspberry-pi.config.all = { 24 | # as per exaple: https://github.com/nix-community/raspberry-pi-nix/blob/aaec735faf81ff05356d65c7408136d2c1522d34/example/default.nix#L17C11-L32C13 25 | base-dt-params = { 26 | BOOT_UART = { 27 | value = 1; 28 | enable = true; 29 | }; 30 | uart_2ndstage = { 31 | value = 1; 32 | enable = true; 33 | }; 34 | }; 35 | dt-overlays = { 36 | disable-bt = { 37 | enable = true; 38 | params = { }; 39 | }; 40 | }; 41 | }; 42 | }; 43 | 44 | # This value determines the NixOS release from which the default 45 | # settings for stateful data, like file locations and database versions 46 | # on your system were taken. It‘s perfectly fine and recommended to leave 47 | # this value at the release version of the first install of this system. 48 | # Before changing this value read the documentation for this option 49 | # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). 50 | system.stateVersion = machine.stateVersion; # Did you read the comment? 51 | 52 | # As this is intended as a stadalone image, undo some of the minimal profile stuff 53 | documentation.enable = true; 54 | documentation.nixos.enable = true; 55 | } 56 | -------------------------------------------------------------------------------- /machines/symbols/mac-backtick-fix: -------------------------------------------------------------------------------- 1 | xkb_symbols "mac-backtick-fix" 2 | { 3 | include "us(mac)" 4 | 5 | 6 | // LSGT and TLDE are swapped when compared to the original version (see comment bellow) 7 | 8 | key { [ section, plusminus, section, plusminus ] }; 9 | key { [ grave, asciitilde, dead_grave, dead_horn ] }; 10 | 11 | // key { [ section, plusminus, section, plusminus ] }; 12 | // key { [ grave, asciitilde, dead_grave, dead_horn ] }; 13 | // source: us(mac) section from here: 14 | // less $(nix-build --no-out-link '' -A xorg.xkeyboardconfig)/etc/X11/xkb/symbols/us 15 | }; 16 | -------------------------------------------------------------------------------- /modules/caddy.nix: -------------------------------------------------------------------------------- 1 | { user, machine, pkgs, pkgs-caddy, ... }: 2 | let 3 | # TODO: sops 4 | CF_API_KEY = builtins.readFile ./CF_API_KEY; 5 | in 6 | { 7 | services.caddy = { 8 | enable = false; 9 | package = pkgs-caddy.caddy.override { 10 | externalPlugins = [ 11 | { 12 | name = "cloudflare"; 13 | repo = "github.com/caddy-dns/cloudflare"; 14 | version = "master"; 15 | } 16 | ]; 17 | vendorHash = "sha256-YRsPu+rTu9HEQQlj4dK2BH8DNGHo//VL5zhoU0hz7DI="; 18 | }; 19 | email = user.email; 20 | configFile = pkgs.writeText "caddy_config" '' 21 | (cloudflare) { 22 | tls { 23 | dns cloudflare ${CF_API_KEY} 24 | } 25 | } 26 | 27 | code.${machine.domain} { 28 | reverse_proxy http://0.0.0.0:42042 29 | import cloudflare 30 | } 31 | ''; 32 | }; 33 | } 34 | -------------------------------------------------------------------------------- /modules/code-server.nix: -------------------------------------------------------------------------------- 1 | { user, pkgs, ... }: 2 | { 3 | services.code-server = let baseDir = "/home/${user.name}/.code-server-nix/"; in { 4 | enable = false; 5 | port = 42042; 6 | host = "0.0.0.0"; 7 | disableTelemetry = true; 8 | user = user.name; 9 | extraEnvironment = { 10 | SSH_AUTH_SOCK = "/home/${user.name}/.ssh/ssh_auth_sock"; 11 | }; 12 | extensionsDir = "${baseDir}extensions"; 13 | userDataDir = "${baseDir}user-data"; 14 | hashedPassword = user.codeHashedPassword; 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /modules/darwin.nix: -------------------------------------------------------------------------------- 1 | { config, pkgs, machine, ... }: 2 | 3 | { 4 | services.nix-daemon.enable = true; 5 | 6 | environment = { 7 | systemPackages = with pkgs; [ 8 | gnumake 9 | coreutils 10 | cmake 11 | gh 12 | ]; 13 | 14 | variables = { 15 | PS1 = "%m %d $ "; 16 | PROMPT = "%m %d $ "; 17 | RPROMPT = ""; 18 | EDITOR = "hx"; 19 | VISUAL = "hx"; 20 | NNN_TRASH = "1"; # let nnn trash instead of rm 21 | }; 22 | 23 | shells = [ pkgs.zsh ]; 24 | }; 25 | 26 | 27 | networking = let name = "CorBook"; in { 28 | computerName = name; 29 | hostName = name; 30 | localHostName = name; 31 | }; 32 | 33 | # Used for backwards compatibility, please read the changelog before changing. 34 | # $ darwin-rebuild changelog 35 | system.stateVersion = 4; 36 | } 37 | -------------------------------------------------------------------------------- /modules/docker.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | virtualisation.docker.enable = true; 4 | } 5 | -------------------------------------------------------------------------------- /modules/environment.nix: -------------------------------------------------------------------------------- 1 | { machine, inputs, pkgs, lib, ... }: 2 | { 3 | environment = { 4 | systemPackages = with pkgs; [ 5 | git 6 | git-lfs 7 | file 8 | gnumake 9 | killall 10 | unzip 11 | # rxvt_unicode 12 | # xclip 13 | docker-client 14 | # arc-theme 15 | # nnn 16 | trash-cli 17 | (writeShellScriptBin "docker-stop-all" '' 18 | docker stop $(docker ps -q) 19 | docker system prune -f 20 | '') 21 | (writeShellScriptBin "docker-prune-all" '' 22 | docker-stop-all 23 | docker rmi -f $(docker images -a -q) 24 | docker volume prune -f 25 | '') 26 | ]; 27 | 28 | variables = { 29 | PS1 = "%m %d $ "; 30 | PROMPT = "%m %d $ "; 31 | RPROMPT = ""; 32 | EDITOR = "hx"; 33 | VISUAL = "hx"; 34 | NNN_TRASH = "1"; # let nnn trash instead of rm 35 | 36 | # # 2x ("retina"') scaling on Linux 37 | } // (if machine.headless then { } else { 38 | # wayland for chromium apps 39 | NIXOS_OZONE_WL = "1"; 40 | 41 | # GDK_SCALE = "2"; 42 | # GDK_DPI_SCALE = "0.5"; 43 | # QT_AUTO_SCREEN_SCALE_FACTOR = "1"; 44 | # QT_SCALE_FACTOR = "2"; 45 | # _JAVA_OPTIONS = "-Dsun.java2d.uiScale=2"; 46 | # NIXOS_OZONE_WL = "1"; 47 | # ELECTRON_OZONE_PLATFORM_HINT = "auto"; # let electron programs use Wayland. suggested in the niri matrix 48 | }); 49 | 50 | # required for zsh autocomplete 51 | pathsToLink = [ "/share/zsh" ]; 52 | }; 53 | } 54 | -------------------------------------------------------------------------------- /modules/fonts.nix: -------------------------------------------------------------------------------- 1 | { pkgs-unstable, ... }: 2 | { 3 | fonts.packages = with pkgs-unstable; [ 4 | font-awesome 5 | noto-fonts 6 | noto-fonts-cjk-sans 7 | noto-fonts-emoji 8 | ibm-plex 9 | fira-code 10 | fira-code-symbols 11 | nerd-fonts.jetbrains-mono 12 | ]; 13 | } 14 | -------------------------------------------------------------------------------- /modules/networking.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | networking = { 4 | networkmanager.enable = true; 5 | networkmanager.dns = "none"; 6 | resolvconf.enable = true; 7 | nameservers = [ "1.1.1.1" "1.0.0.1" "9.9.9.9" ]; 8 | 9 | # Fix for iPhone hotspot 10 | # https://discourse.nixos.org/t/networking-problem-in-new-nixos-install/12041 11 | # use `ip link` to confirm. 12 | # 13 | # interfaces.eth0.mtu = 1400; 14 | # 15 | # commented out because it made startup slow if eth0 is not connected. 16 | 17 | # block trackers, annoyances, AI-generated content, and distractions. 18 | extraHosts = 19 | let 20 | blacklist = [ 21 | "9to5mac.com" 22 | "ad.nl" 23 | "engadget.com" 24 | "facebook.com" 25 | "instagram.com" 26 | "lobste.rs" 27 | "macrumors.com" 28 | "medium.com" 29 | "netflix.com" 30 | "news.ycombinator.com" 31 | "nintendolife.com" 32 | "nos.nl" 33 | "nrc.nl" 34 | "nu.nl" 35 | "old.reddit.com" 36 | "polygon.com" 37 | "reddit.com" 38 | "rtl.nl" 39 | "theverge.com" 40 | "tiktok.com" 41 | "tweakers.net" 42 | "twitter.com" 43 | "vice.com" 44 | "x.com" 45 | "youtube.com" 46 | ]; 47 | in 48 | builtins.concatStringsSep "\n" (builtins.concatMap 49 | (domain: 50 | [ "127.0.0.1 ${domain}" "127.0.0.1 www.${domain}" ] 51 | ) 52 | blacklist); 53 | }; 54 | 55 | services.resolved.enable = false; 56 | } 57 | -------------------------------------------------------------------------------- /modules/niri.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: 2 | { 3 | programs.niri = { 4 | enable = true; 5 | package = pkgs.niri-unstable; 6 | }; 7 | # programs.gnome-keyring.enable = true; 8 | services.dbus.enable = true; 9 | xdg.portal = { 10 | enable = true; 11 | configPackages = [ pkgs.gnome-session ]; 12 | extraPortals = [ pkgs.xdg-desktop-portal-gnome pkgs.xdg-desktop-portal-gtk pkgs.gnome-keyring ]; 13 | config.niri = { 14 | default = "gnome;gtk;"; 15 | "org.freedesktop.impl.portal.Access" = "gtk"; 16 | "org.freedesktop.impl.portal.Notification" = "gtk"; 17 | "org.freedesktop.impl.portal.OpenURI" = "gtk"; 18 | "org.freedesktop.impl.portal.FileChooser" = "gtk"; 19 | "org.freedesktop.impl.portal.Secret" = "gnome-keyring"; 20 | }; 21 | xdgOpenUsePortal = true; 22 | }; 23 | services.gnome.gnome-keyring.enable = true; 24 | } 25 | -------------------------------------------------------------------------------- /modules/nix.nix: -------------------------------------------------------------------------------- 1 | { pkgs-unstable, ... }: 2 | { 3 | nix = { 4 | package = pkgs-unstable.nix; 5 | settings = { 6 | trusted-users = [ "root" "cor" ]; 7 | sandbox = "relaxed"; 8 | substituters = [ 9 | "https://cache.garnix.io" 10 | # "https://union.cachix.org/" 11 | "https://nix-community.cachix.org/" 12 | "https://helix.cachix.org/" 13 | ]; 14 | trusted-public-keys = [ 15 | "cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g=" 16 | # "union.cachix.org-1:TV9o8jexzNVbM1VNBOq9fu8NK+hL6ZhOyOh0quATy+M=" 17 | "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" 18 | "helix.cachix.org-1:ejp9KQpR1FBI2onstMQ34yogDm4OgU2ru6lIwPvuCVs=" 19 | ]; 20 | }; 21 | extraOptions = '' 22 | experimental-features = nix-command flakes 23 | keep-outputs = true 24 | keep-derivations = true 25 | ''; 26 | }; 27 | } 28 | -------------------------------------------------------------------------------- /modules/nixpkgs.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | # Lots of stuff that uses aarch64 that claims doesn't work, but actually works. 4 | nixpkgs.config = { 5 | allowUnfree = true; 6 | allowUnsupportedSystem = true; 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /modules/openssh.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | services.openssh = { 4 | enable = true; 5 | settings = { 6 | PasswordAuthentication = true; 7 | PermitRootLogin = "no"; 8 | }; 9 | }; 10 | } 11 | -------------------------------------------------------------------------------- /modules/stylix.nix: -------------------------------------------------------------------------------- 1 | { pkgs, lib, pkgs-unstable, ... }: 2 | { 3 | stylix = { 4 | enable = true; 5 | autoEnable = true; 6 | polarity = "dark"; 7 | image = ../wallpapers/leaves.jpg; 8 | base16Scheme = "${pkgs.base16-schemes}/share/themes/danqing.yaml"; 9 | fonts = { 10 | sansSerif = { 11 | package = pkgs-unstable.inter; 12 | name = "Inter"; 13 | }; 14 | monospace = { 15 | package = pkgs-unstable.nerd-fonts.jetbrains-mono; 16 | name = "JetBrainsMonoNerdFont"; 17 | }; 18 | }; 19 | cursor = { 20 | package = pkgs.bibata-cursors; 21 | name = "Bibata-Modern-Classic"; 22 | size = 20; 23 | }; 24 | }; 25 | 26 | # idk man 27 | # https://github.com/TheColorman/nixcfg/blob/1ab6dea79266123713d0d59ab332c9683472c85d/utils/stylix/default.nix#L52 28 | system.activationScripts.fix_stylix.text = '' 29 | rm /home/color/.gtkrc-2.0 -f 30 | ''; 31 | 32 | # Fix for inconsistent cursor size and theme in X11/Xwayland apps 33 | environment.variables = { 34 | XCURSOR_SIZE = "20"; 35 | XCURSOR_THEME = "Bibata-Modern-Classic"; 36 | }; 37 | 38 | specialisation.light.configuration = { 39 | stylix = { 40 | image = lib.mkForce ../wallpapers/tiger.jpg; 41 | polarity = lib.mkForce "light"; 42 | # base16Scheme = lib.mkForce "${pkgs.base16-schemes}/share/themes/default-light.yaml"; 43 | # better than cupertino ^ 44 | # base16Scheme = lib.mkForce "${pkgs.base16-schemes}/share/themes/da-one-white.yaml"; 45 | base16Scheme = lib.mkForce "${pkgs.base16-schemes}/share/themes/one-light.yaml"; 46 | # base16Scheme = lib.mkForce "${pkgs.base16-schemes}/share/themes/tomorrow.yaml"; 47 | }; 48 | }; 49 | } 50 | -------------------------------------------------------------------------------- /modules/system-packages.nix: -------------------------------------------------------------------------------- 1 | { inputs, machine, pkgs, pkgs-unstable, ... }: 2 | { 3 | environment.systemPackages = 4 | 5 | let 6 | common = with pkgs; [ 7 | tree 8 | curl 9 | zsh 10 | fzf 11 | wget 12 | zellij 13 | gnumake 14 | git 15 | gh 16 | bottom 17 | neofetch 18 | libxml2 19 | ripgrep 20 | fd 21 | wakeonlan 22 | nix-output-monitor 23 | ] 24 | ++ (with pkgs-unstable; [ 25 | aider-chat 26 | claude-code 27 | ]) 28 | ++ (with inputs.self.packages.${machine.system}; [ 29 | theme-switch 30 | keyboard-brightness 31 | ]) 32 | ++ [ 33 | inputs.open-project.packages.${machine.system}.default 34 | inputs.gh-permalink.packages.${machine.system}.default 35 | ] ++ (pkgs.lib.optionals (machine.name != "raspberry-pi") [ 36 | inputs.ghostty.packages.${machine.system}.ghostty 37 | ]); 38 | gui = (with pkgs; [ 39 | wl-clipboard 40 | wayland-utils 41 | libsecret 42 | brave 43 | signal-desktop 44 | element-desktop 45 | telegram-desktop 46 | fuzzel 47 | xwayland-satellite 48 | guvcview 49 | easyeffects 50 | pavucontrol 51 | nvtopPackages.amd 52 | brightnessctl 53 | playerctl 54 | blanket 55 | dig 56 | 57 | # Enable iOS USB connection 58 | libimobiledevice 59 | 60 | # screenshotting, see niri keybind 61 | (pkgs.writeShellApplication { 62 | name = "cor-screenshot"; 63 | runtimeInputs = [ 64 | grim 65 | satty 66 | slurp 67 | ]; 68 | text = '' 69 | grim -g "$(slurp -c '#ff0000ff')" -t ppm - | satty --filename - --fullscreen --output-filename "$HOME/Pictures/Screenshots/screenshot-$(date '+%Y-%m-%dT%H:%M:%S').png" --save-after-copy --copy-command wl-copy --early-exit 70 | ''; 71 | }) 72 | 73 | ]) ++ (with pkgs-unstable; [ 74 | # jetbrains.datagrip 75 | _1password-gui 76 | obsidian 77 | ]); 78 | in 79 | if machine.headless then common else common ++ gui; 80 | } 81 | -------------------------------------------------------------------------------- /modules/tailscale.nix: -------------------------------------------------------------------------------- 1 | { ... }: 2 | { 3 | services.tailscale = { 4 | enable = true; 5 | useRoutingFeatures = "both"; 6 | extraUpFlags = [ "--advertise-exit-node" ]; 7 | }; 8 | } 9 | -------------------------------------------------------------------------------- /modules/thunar.nix: -------------------------------------------------------------------------------- 1 | { inputs, pkgs, ... }: 2 | { 3 | programs.thunar.plugins = with pkgs.xfce; [ 4 | thunar-archive-plugin 5 | thunar-volman 6 | ]; 7 | } 8 | -------------------------------------------------------------------------------- /modules/users.nix: -------------------------------------------------------------------------------- 1 | { user, pkgs-unstable, ... }: 2 | { 3 | users = { 4 | mutableUsers = false; 5 | users.${user.name} = { 6 | isNormalUser = true; 7 | description = user.name; 8 | home = "/home/${user.name}"; 9 | extraGroups = [ "networkmanager" "docker" "wheel" ]; 10 | shell = pkgs-unstable.zsh; 11 | hashedPassword = user.hashedPassword; 12 | openssh.authorizedKeys.keys = [ 13 | user.sshKey 14 | ]; 15 | }; 16 | }; 17 | } 18 | -------------------------------------------------------------------------------- /modules/vmware-guest.nix: -------------------------------------------------------------------------------- 1 | # This is based on the official vmware-guest module, but modified 2 | # for aarch64 to disable certain features and add support. I'm unsure 3 | # how to upstream this because I just don't use certain features... maybe 4 | # making them toggle-able? I'm not sure. 5 | 6 | { config, lib, pkgs, ... }: 7 | 8 | with lib; 9 | 10 | let 11 | cfg = config.virtualisation.vmware.guest; 12 | open-vm-tools = if cfg.headless then pkgs.open-vm-tools-headless else pkgs.open-vm-tools; 13 | xf86inputvmmouse = pkgs.xorg.xf86inputvmmouse; 14 | in 15 | { 16 | imports = [ 17 | (mkRenamedOptionModule [ "services" "vmwareGuest" ] [ "virtualisation" "vmware" "guest" ]) 18 | ]; 19 | 20 | options.virtualisation.vmware.guest = { 21 | enable = mkEnableOption "VMWare Guest Support"; 22 | headless = mkOption { 23 | type = types.bool; 24 | default = false; 25 | description = "Whether to disable X11-related features."; 26 | }; 27 | }; 28 | 29 | config = mkIf cfg.enable { 30 | assertions = [{ 31 | assertion = pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64 || pkgs.stdenv.isAarch64; 32 | message = "VMWare guest is not currently supported on ${pkgs.stdenv.hostPlatform.system}"; 33 | }]; 34 | 35 | boot.initrd.availableKernelModules = [ "mptspi" ]; 36 | # boot.initrd.kernelModules = [ "vmw_pvscsi" ]; 37 | 38 | environment.systemPackages = [ open-vm-tools ]; 39 | 40 | systemd.services.vmware = 41 | { 42 | description = "VMWare Guest Service"; 43 | wantedBy = [ "multi-user.target" ]; 44 | after = [ "display-manager.service" ]; 45 | unitConfig.ConditionVirtualization = "vmware"; 46 | serviceConfig.ExecStart = "${open-vm-tools}/bin/vmtoolsd"; 47 | }; 48 | 49 | # Mount the vmblock for drag-and-drop and copy-and-paste. 50 | systemd.mounts = [ 51 | { 52 | description = "VMware vmblock fuse mount"; 53 | documentation = [ "https://github.com/vmware/open-vm-tools/blob/master/open-vm-tools/vmblock-fuse/design.txt" ]; 54 | unitConfig.ConditionVirtualization = "vmware"; 55 | what = "${open-vm-tools}/bin/vmware-vmblock-fuse"; 56 | where = "/run/vmblock-fuse"; 57 | type = "fuse"; 58 | options = "subtype=vmware-vmblock,default_permissions,allow_other"; 59 | wantedBy = [ "multi-user.target" ]; 60 | } 61 | ]; 62 | 63 | security.wrappers.vmware-user-suid-wrapper = 64 | { 65 | setuid = true; 66 | owner = "root"; 67 | group = "root"; 68 | source = "${open-vm-tools}/bin/vmware-user-suid-wrapper"; 69 | }; 70 | 71 | environment.etc.vmware-tools.source = "${open-vm-tools}/etc/vmware-tools/*"; 72 | 73 | services.xserver = mkIf (!cfg.headless) { 74 | # TODO: does not build on aarch64 75 | # modules = [ xf86inputvmmouse ]; 76 | 77 | config = '' 78 | Section "InputClass" 79 | Identifier "VMMouse" 80 | MatchDevicePath "/dev/input/event*" 81 | MatchProduct "ImPS/2 Generic Wheel Mouse" 82 | Driver "vmmouse" 83 | EndSection 84 | ''; 85 | 86 | displayManager.sessionCommands = '' 87 | ${open-vm-tools}/bin/vmware-user-suid-wrapper 88 | ''; 89 | }; 90 | 91 | services.udev.packages = [ open-vm-tools ]; 92 | }; 93 | } 94 | -------------------------------------------------------------------------------- /modules/wireplumber.nix: -------------------------------------------------------------------------------- 1 | { 2 | environment.etc."wireplumber/bluetooth.lua.d/50-bluez-config.lua".text = 3 | # lua 4 | '' 5 | bluez_monitor.properties = { 6 | ["bluez5.enable-hsp"] = false, 7 | ["bluez5.enable-hfp"] = false, 8 | ["bluez5.enable-sbc-xq"] = true, 9 | ["bluez5.enable-msbc"] = false, 10 | ["bluez5.enable-hw-volume"] = true, 11 | ["bluez5.auto-connect"] = {"audio-sink"}, 12 | } 13 | ''; 14 | } 15 | -------------------------------------------------------------------------------- /modules/xrandr.nix: -------------------------------------------------------------------------------- 1 | { pkgs, lib, ... }: 2 | let 3 | mkXr = { name ? "", w, h, r }: 4 | let 5 | modeName = "${toString w}x${toString h}_${toString r}.00"; 6 | scriptName = if lib.stringLength name == 0 then modeName else name; 7 | in 8 | pkgs.writeShellScriptBin "xr-${scriptName}" '' 9 | # xrandr doesn't parse the output correctly when you use $() 10 | # therefore we use eval instead 11 | MODELINE=$(cvt ${toString w} ${toString h} ${toString r} | tail -n 1 | cut -d " " -f2-) 12 | eval "xrandr --newmode $MODELINE" 13 | xrandr --addmode Virtual-1 ${modeName} 14 | xrandr -s ${modeName} 15 | xrandr --dpi 192 16 | ''; 17 | in 18 | { 19 | environment.systemPackages = [ 20 | (pkgs.writeShellScriptBin "xr-auto" '' 21 | xrandr --output Virtual-1 --auto 22 | '') 23 | ] ++ map mkXr [ 24 | { name = "mbp"; w = 3024; h = 1890; r = 60; } 25 | { name = "mbp-120hz"; w = 3024; h = 1890; r = 120; } 26 | { name = "mbp-1.5"; w = 4536; h = 2835; r = 60; } 27 | { name = "mbp-16"; w = 3456; h = 2160; r = 60; } 28 | { name = "4k"; w = 3840; h = 2160; r = 60; } 29 | { name = "5k"; w = 5120; h = 2880; r = 60; } 30 | { name = "5k-30hz"; w = 5120; h = 2880; r = 30; } 31 | { name = "5.5k"; w = 5760; h = 3240; r = 60; } 32 | { name = "6k"; w = 6400; h = 3600; r = 60; } 33 | { name = "square"; w = 2880; h = 2880; r = 60; } 34 | { name = "vertical-studio-display"; w = 2880; h = 5120; r = 60; } 35 | { name = "things-sidebar"; w = 4296; h = 2880; r = 60; } 36 | { name = "4-3"; w = 3840; h = 2880; r = 60; } 37 | ]; 38 | } 39 | -------------------------------------------------------------------------------- /modules/xserver.nix: -------------------------------------------------------------------------------- 1 | { pkgs, ... }: 2 | { 3 | services.xserver = { 4 | dpi = 192; 5 | autorun = true; 6 | enable = true; 7 | desktopManager = { 8 | xfce.enable = true; 9 | }; 10 | displayManager = { 11 | xserverArgs = [ "-dpi 192" ]; 12 | defaultSession = "none+awesome"; 13 | lightdm = { 14 | enable = true; 15 | }; 16 | 17 | sessionCommands = '' 18 | eval $(/run/wrappers/bin/gnome-keyring-daemon --start --daemonize) 19 | export SSH_AUTH_SOCK 20 | xset-r-slow 21 | pamixer --set-volume 100 22 | pamixer --unmute 23 | ''; 24 | }; 25 | 26 | windowManager = { 27 | awesome = { 28 | enable = true; 29 | luaModules = with pkgs.luaPackages; [ 30 | luarocks # is the package manager for Lua modules 31 | luadbi-mysql # Database abstraction layer 32 | ]; 33 | }; 34 | }; 35 | 36 | libinput = { 37 | enable = true; 38 | 39 | # disabling mouse acceleration 40 | mouse = { 41 | accelProfile = "flat"; 42 | }; 43 | 44 | # enable touchpad acceleration 45 | touchpad = { 46 | accelProfile = "adaptive"; 47 | }; 48 | }; 49 | }; 50 | } 51 | -------------------------------------------------------------------------------- /modules/zsh.nix: -------------------------------------------------------------------------------- 1 | { machine, ... }: 2 | { 3 | programs.zsh = { 4 | enable = true; # default shell on catalina 5 | 6 | promptInit = '' 7 | if [ -n "''${commands[fzf-share]}" ]; then 8 | source "''$(fzf-share)/key-bindings.zsh" 9 | source "''$(fzf-share)/completion.zsh" 10 | fi 11 | 12 | '' 13 | + 14 | (if machine.darwin then "" else ''compinit''); 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /nixos.nix: -------------------------------------------------------------------------------- 1 | # This function creates a NixOS system based on our VM setup for a 2 | # particular architecture. 3 | { inputs, nixpkgs, home-manager, user, machine }: 4 | let 5 | pkgs-unstable = import inputs.nixpkgs-unstable { system = machine.system; config.allowUnfree = true; }; 6 | pkgs-caddy = import inputs.nixpkgs-caddy { system = machine.system; }; 7 | in 8 | nixpkgs.lib.nixosSystem rec { 9 | system = machine.system; 10 | 11 | # NixOS level modules 12 | modules = 13 | (if machine.headless then [ 14 | ] else [ 15 | { 16 | nixpkgs.overlays = [ inputs.niri.overlays.niri ]; 17 | imports = [ 18 | inputs.niri.nixosModules.niri 19 | inputs.stylix.nixosModules.stylix 20 | ]; 21 | } 22 | ./modules/niri.nix 23 | ./modules/fonts.nix 24 | ./modules/stylix.nix 25 | ./modules/networking.nix 26 | ./modules/wireplumber.nix 27 | 28 | # todo: make generic over hardware 29 | # inputs.nixos-hardware.nixosModules.framework-amd-ai-300-series 30 | ]) ++ 31 | [ 32 | ./hardware/${machine.name}.nix 33 | ./machines/${machine.name}.nix 34 | ./modules/users.nix 35 | ./modules/zsh.nix 36 | ./modules/nix.nix 37 | ./modules/environment.nix 38 | ./modules/system-packages.nix 39 | ./modules/docker.nix 40 | ./modules/tailscale.nix 41 | # ./modules/code-server.nix 42 | # ./modules/caddy.nix 43 | 44 | home-manager.nixosModules.home-manager 45 | { 46 | home-manager = { 47 | useGlobalPkgs = true; 48 | useUserPackages = true; 49 | backupFileExtension = "backup"; 50 | users.${user.name} = { 51 | # Home-manager level modules 52 | imports = [ 53 | { home.stateVersion = machine.homeStateVersion; } 54 | ./home-modules/direnv.nix 55 | ./home-modules/git.nix 56 | ./home-modules/helix.nix 57 | ./home-modules/lazygit.nix 58 | ./home-modules/tmux.nix 59 | ./home-modules/yazi.nix 60 | ./home-modules/zellij.nix 61 | ./home-modules/zoxide.nix 62 | ./home-modules/zsh.nix 63 | ./home-modules/ghostty.nix 64 | # ./home-modules/emacs.nix 65 | # ./home-modules/nushell/nushell.nix 66 | ] ++ (if machine.headless then [ 67 | ] else [ 68 | ./home-modules/waybar.nix 69 | ./home-modules/niri.nix 70 | ./home-modules/fuzzel.nix 71 | ./home-modules/swaylock.nix 72 | ./home-modules/zed.nix 73 | ./home-modules/stylix.nix 74 | ./home-modules/kanshi.nix 75 | ]); 76 | }; 77 | # Arguments that are exposed to every `home-module`. 78 | extraSpecialArgs = { 79 | theme = builtins.readFile ./THEME.txt; # "dark" or "light" 80 | inherit inputs pkgs-unstable user machine; 81 | }; 82 | }; 83 | } 84 | { 85 | config._module.args = { 86 | inherit inputs pkgs-unstable user machine pkgs-caddy; 87 | }; 88 | } 89 | ] ++ nixpkgs.lib.optionals (machine.name == "raspberry-pi") [ 90 | inputs.raspberry-pi-nix.nixosModules.raspberry-pi 91 | ]; 92 | } 93 | -------------------------------------------------------------------------------- /wallpapers/eclipse.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ceb3024c1d6713d58e5b98268b5914403bd68584a82ba171b649b75d3343d9f8 3 | size 1035468 4 | -------------------------------------------------------------------------------- /wallpapers/lake.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:714f9e668eee962a4bfea704398fab9d0a74fbfe3437f53d3a08ed7bb8bb84b4 3 | size 2188529 4 | -------------------------------------------------------------------------------- /wallpapers/leapoard-server.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:922e7bc02792b2c8da0a10293e5703c29d804f272318bca486b0e146821101f5 3 | size 6514569 4 | -------------------------------------------------------------------------------- /wallpapers/leaves.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5de42d5c179f27de60067871be7b58e0bc2046b454d9d74fd89d98768ab4fafc 3 | size 3079077 4 | -------------------------------------------------------------------------------- /wallpapers/mountains.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9ff5ba27870342f28d496bb41dcdfae0c5043709d616a9098f5aee657654e113 3 | size 1034971 4 | -------------------------------------------------------------------------------- /wallpapers/nix-space.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c82ceb380f0cfd6c941f46d617b1b68921fdb7ef29935046988161d7dca06176 3 | size 12586038 4 | -------------------------------------------------------------------------------- /wallpapers/purple.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3b3bc7cd003703af4b44a63b19d0e553b0866c9b19beaf1249793c8d0463d16f 3 | size 4014 4 | -------------------------------------------------------------------------------- /wallpapers/rose_pine.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1d59a32d71e8cd05a624d3efcdf0188512c8dc94c2826b88451b21493832e8d2 3 | size 300400 4 | -------------------------------------------------------------------------------- /wallpapers/rose_pine_blockwavemoon.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:55e9cd3f6689e79854f007ea678287cd3922abef46bde1ea2faf6f8129913e51 3 | size 1048573 4 | -------------------------------------------------------------------------------- /wallpapers/tiger.jpg: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:606ffba5e9284703266b9ba3377226631756b7b193c48d3ab57bdd4b5b938cfe 3 | size 5652416 4 | -------------------------------------------------------------------------------- /wallpapers/waves.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:eda210dcbc0bd413e1db5594fbd57c2f81eb25d3a175f2cae9aa0d66ecb1242f 3 | size 352335 4 | --------------------------------------------------------------------------------