(mirror) personal dotfiles github.com/crescentrose/dotfiles

refactor: prepare to merge with macOS

+1098 -1029
+10 -11
README.md
··· 1 1 # crescentrose's dotfiles 2 2 3 - > [!WARNING] 4 - > This is a highly experimental NixOS branch. Here be dragons! 5 3 6 - ![screenshot](./screenshot-clean.png) 4 + ![screenshot](./resources/screenshot-clean.png) 7 5 8 - ![screenshot](./screenshot-dirty.png) 6 + ![screenshot](./resources/screenshot-dirty.png) 9 7 10 8 ## Setup 11 9 12 - This is a standard Nix flake. so on a NixOS system, running `sudo nixos-rebuild --flake 13 - ./nixos#streaming-heart switch` should do the trick. Note that you will need a handful of 14 - _secrets_ - refer to the flake files for details. Also, the wallpaper directory is not distributed 15 - as a part of this repo as that would be rude to the artists - find your own wallpapers! Improving 16 - the setup experience is on my to-do list, but it's not yet ready. 10 + This is a standard Nix flake. so on a NixOS system, running `sudo nixos-rebuild 11 + --flake ./nixos#starlight switch` should do the trick. Note that you will need a 12 + handful of _secrets_ - refer to the flake files for details. Also, the wallpaper 13 + directory is not distributed as a part of this repo as that would be rude to 14 + the artists - find your own wallpapers! Improving the setup experience is on my 15 + to-do list, but it's not yet ready. 17 16 18 - Note that this set-up is tweaked for my desktop PC and is currently not very modular or 19 - extensible. Improving this is also on my to-do list. 17 + Note that this set-up is tweaked for my desktop PC and is currently not very 18 + modular or extensible. Improving this is also on my to-do list.
-88
bin/change-wallpaper
··· 1 - #!/usr/bin/env nu 2 - 3 - use vlog.nu * 4 - 5 - let WALLPAPER_LOCATION = $"($env.HOME)/.cache/current_wallpaper" 6 - let LOCK_WALLPAPER_LOCATION = $"($env.HOME)/.cache/hyprlock_wallpaper.jpg" 7 - let BLUR_WALLPAPER_LOCATION = $"($env.HOME)/.cache/blurred_wallpaper.jpg" 8 - let WALLPAPER_FOLDER = $"($env.HOME)/Wallpapers" 9 - 10 - # Links the new wallpaper to the wallpaper cache, converts it to JPG for the lock screen if 11 - # necessary, and cleans up previous wallpaper if needed. 12 - def prepare-wallpaper [path: string] { 13 - # Clean up existing links/caches 14 - if ($LOCK_WALLPAPER_LOCATION | path exists) { 15 - vlog debug $"󰒜 Removing lock-screen wallpaper from ($LOCK_WALLPAPER_LOCATION)..." 16 - rm $LOCK_WALLPAPER_LOCATION 17 - } 18 - 19 - if ($BLUR_WALLPAPER_LOCATION | path exists) { 20 - vlog debug $"󰒜 Removing blurred wallpaper from ($BLUR_WALLPAPER_LOCATION)..." 21 - rm $BLUR_WALLPAPER_LOCATION 22 - } 23 - 24 - if ($WALLPAPER_LOCATION | path exists) { 25 - vlog debug $"󰒜 Removing wallpaper link from ($WALLPAPER_LOCATION)..." 26 - rm $WALLPAPER_LOCATION 27 - } 28 - 29 - # Determine if we have to use the "first frame" when converting to JPEG or not 30 - let wallpaperFileType = file --brief --dereference --mime $path 31 - if ($wallpaperFileType | str index-of 'image/gif') != -1 { 32 - # "index into" first frame of the GIF 33 - vlog debug $"🎥 Converting GIF to JPG..." 34 - magick $"($path)[0]" $LOCK_WALLPAPER_LOCATION 35 - } else { 36 - vlog debug $"👨‍🎨 Converting image to JPG..." 37 - magick $"($path)" $LOCK_WALLPAPER_LOCATION 38 - } 39 - 40 - # Link to new location 41 - vlog debug $"🔗 Linking new wallpaper..." 42 - ln -fs $path $WALLPAPER_LOCATION 43 - } 44 - 45 - # Switches the wallpaper to the prepared wallpaper. 46 - def switch-wallpaper [--transition-type (-t): string = "random", --filter (-f): string = "Nearest"] { 47 - vlog info "🌆 Transitioning wallpaper..." 48 - let params = [ 49 - "img", 50 - $"--transition-type=($transition_type)", 51 - $"--filter=($filter)", 52 - $WALLPAPER_LOCATION 53 - ] 54 - vlog debug $"Params: ($params | to json -r)" 55 - swww ...$params 56 - } 57 - 58 - # Returns a random file from the directory. 59 - def random-file [dir: string] { 60 - vlog info "🎲 Selecting random wallpaper..." 61 - let files = ls $dir 62 - let idx = random int 0..(($files | length) - 1) 63 - 64 - $files | get $idx 65 - } 66 - 67 - def set-wallpaper [path: string, --filter (-f): string = "Nearest"] { 68 - prepare-wallpaper $path 69 - switch-wallpaper --filter=($filter) 70 - } 71 - 72 - def "main set" [path: string, --filter (-f): string = "Nearest"] { 73 - vlog timed "Wallpaper change" { 74 - set-wallpaper $path 75 - } 76 - } 77 - 78 - def "main random" [] { 79 - vlog timed "Random wallpaper" { 80 - let wallpaper = random-file $WALLPAPER_FOLDER 81 - vlog debug $"Selected ($wallpaper.name) for new wallpaper." 82 - set-wallpaper $wallpaper.name 83 - } 84 - } 85 - 86 - def main [] { 87 - help main 88 - }
bin/color-scheme resources/scripts/bin/color-scheme
-48
bin/manage-system
··· 1 - #!/usr/bin/env nu 2 - 3 - use vlog.nu * 4 - 5 - let FLAKE_DIR = $"($env.HOME)/Code/dotfiles" 6 - let SYSTEM_NAME = "starlight" 7 - let FLAKE_NAME = $"($FLAKE_DIR)#($SYSTEM_NAME)" 8 - 9 - # Update the Nix flake version. 10 - def "main update" [] { 11 - vlog info $"🚚 Updating flake ($FLAKE_NAME)..." 12 - vlog timed "Update" { 13 - nix flake update --flake $FLAKE_DIR 14 - } 15 - } 16 - 17 - # Build a new derivation and switch to it. 18 - def "main rebuild" [] { 19 - vlog timed "Rebuild" { 20 - vlog info $"🏠 Building flake ($FLAKE_NAME)..." 21 - sudo nixos-rebuild --flake $FLAKE_NAME --impure switch 22 - } 23 - } 24 - 25 - # Clean up garbage and optimise Nix store. (Most of the time this should happen automatically, 26 - # though.) 27 - def "main clean-up" [] { 28 - vlog timed "Clean-up" { 29 - vlog info "♻ Running garbage collection..." 30 - sudo nix-collect-garbage --delete-old 31 - } 32 - } 33 - 34 - # Show the latest logs for a (root) systemd unit in reverse chronological order. 35 - def "main inspect" [service: string, --root (-r)] { 36 - vlog info $"🤨 Inspecting ($service)..." 37 - vlog timed "Service inspection" { 38 - if $root { 39 - sudo journalctl -u $service --reverse --since="15m ago" 40 - } else { 41 - journalctl --user -u $service --reverse --since="15m ago" 42 - } 43 - } 44 - } 45 - 46 - def main [] { 47 - help main 48 - }
bin/nix-diff resources/scripts/bin/nix-diff
-35
bin/screen-lock
··· 1 - #!/usr/bin/env nu 2 - 3 - use vlog.nu * 4 - 5 - def lock [] { 6 - if (pidof hyprlock | complete).exit_code == 0 { 7 - vlog warn "🔒 Screen already locked; exiting." 8 - return # we are already running hyprlock 9 - } 10 - $env.LC_TIME = "en_GB.UTF8" # don't localize date names... 11 - makoctl mode -a locked 12 - 13 - hyprlock # Block until we unlock 14 - 15 - after-unlock 16 - } 17 - 18 - def after-unlock [] { 19 - makoctl mode -r locked 20 - vlog info "🔓 After-unlock triggered." 21 - } 22 - 23 - # Lock the screen, if it is not already locked. 24 - def "main lock" [] { 25 - lock 26 - } 27 - 28 - # Send a signal to unlock the screen. 29 - def "main unlock" [] { 30 - pkill -SIGUSR1 "hyprlock" 31 - } 32 - 33 - def main [] { 34 - help main 35 - }
-4
config/ghostty/config
··· 1 - theme = dark:Catppuccin Macchiato,light:Catppuccin Latte 2 - font-family = Iosevka 3 - font-size = 12 4 - command = /usr/bin/env nu
-36
config/gitconfig
··· 1 - [core] 2 - excludesfile = ~/.config/.gitignore_global 3 - editor = hx 4 - 5 - [alias] 6 - dt = "!git difftool --no-symlinks --dir-diff" 7 - continue = "!git add . && git rebase --continue" 8 - 9 - # https://blog.gitbutler.com/git-tips-1-theres-a-git-config-for-that/ 10 - b = "!git blame -w -C -C -C" 11 - d = "!git diff --word-diff" 12 - 13 - [branch] 14 - sort = -committerdate 15 - 16 - [column] 17 - ui = auto 18 - 19 - [pull] 20 - ff = only 21 - 22 - [push] 23 - autoSetupRemote = true 24 - 25 - [commit] 26 - gpgsign = true 27 - 28 - [gpg] 29 - format = ssh 30 - 31 - [rerere] 32 - enabled = true 33 - autoUpdate = true 34 - 35 - [include] 36 - path = ~/.config/gitconfig.local
-1
config/gitconfig.local
··· 1 - ../../../.config/gitconfig.local
-12
config/gitconfig.local.example
··· 1 - [gpg "ssh"] 2 - program = "/Applications/1Password.app/Contents/MacOS/op-ssh-sign" 3 - allowedSignersFile = ... 4 - 5 - # Support insane Go packaga manager behaviour for private repos 6 - [url "git@github.com:..."] 7 - insteadOf = https://github.com/... 8 - 9 - [user] 10 - name = 11 - email = 12 - signingkey = <your public SSH signing key>
-11
config/gitignore_global
··· 1 - .vscode 2 - tags 3 - .DS_Store 4 - .solargraph.yml 5 - .netrwhist 6 - .vimspector.json 7 - vendor/bundle 8 - .tool-versions 9 - .direnv 10 - shell.nix 11 - .envrc
-14
config/helix/config.toml
··· 1 - theme = "catppuccin_macchiato" 2 - 3 - [editor] 4 - shell = ["nu", "-c"] 5 - line-number = "relative" 6 - 7 - [keys.normal] 8 - "^" = "goto_first_nonwhitespace" 9 - "$" = "goto_line_end" 10 - "D" = ["extend_to_line_end", "delete_selection"] 11 - 12 - [keys.select] 13 - "^" = "goto_first_nonwhitespace" 14 - "$" = "goto_line_end"
-7
config/helix/languages.toml
··· 1 - [language-server.rust-analyzer.config.check] 2 - command = "clippy" 3 - 4 - [[language]] 5 - name = "nix" 6 - formatter = { command = "nixfmt" } 7 - auto-format = true
-16
config/hypr/hypridle.conf
··· 1 - general { 2 - lock_cmd = ~/bin/screen-lock lock 3 - unlock_cmd = ~/bin/screen-lock unlock 4 - 5 - before_sleep_cmd = ~/bin/screen-lock lock 6 - } 7 - 8 - listener { 9 - timeout = 300 10 - on-timeout = loginctl lock-session 11 - } 12 - 13 - listener { 14 - timeout = 900 15 - on-timeout = systemctl suspend 16 - }
-125
config/hypr/hyprlock.conf
··· 1 - $primaryMonitor = DP-1 2 - $inputColor = rgb(1e2030) 3 - $fallbackColor = rgb(24273a) 4 - $borderColor = rgb(1e2030) 5 - $textColor = rgb(cad3f5) 6 - $fontFamily = Departure Mono 7 - $checkColor = rgb(91d7e3) 8 - $failColor = rgb(f0c6c6) 9 - $shadowColor = rgb(363a4f) 10 - $shadow = 0.8 11 - 12 - $fontSizeSmall = 10 13 - $fontSizeNormal = 12 14 - $fontSizeLarge = 18 15 - 16 - general { 17 - grace = 5 18 - } 19 - 20 - background { 21 - path = ~/.cache/hyprlock_wallpaper.jpg 22 - blur_size = 5 23 - blur_passes = 2 24 - noise = 0.05 25 - brightness = 0.65 26 - vibrancy = 0.5 27 - color = $fallbackColor 28 - } 29 - 30 - # Date 31 - label { 32 - monitor = $primaryMonitor 33 - text = cmd[update:18000000] echo "$(date +'%A, %-d %B %Y')" 34 - color = $textColor 35 - font_size = $fontSizeNormal 36 - font_family = $fontFamily 37 - 38 - position = 0, 250 39 - halign = center 40 - valign = center 41 - 42 - shadow_passes = 1 43 - shadow_color = $shadowColor 44 - shadow_boost = $shadow 45 - } 46 - 47 - # Time 48 - label { 49 - monitor = $primaryMonitor 50 - text = cmd[update:1000] echo "$(date +'%H:%M')" # 24H 51 - color = $textColor 52 - font_size = $fontSizeLarge 53 - font_family = $fontFamily 54 - 55 - position = 0, 200 56 - halign = center 57 - valign = center 58 - 59 - shadow_passes = 1 60 - shadow_color = $shadowColor 61 - shadow_boost = $shadow 62 - } 63 - 64 - 65 - # Greeting label 66 - label { 67 - monitor = $primaryMonitor 68 - text = Enter password 69 - color = $textColor 70 - font_size = $fontSizeNormal 71 - font_family = $fontFamily 72 - 73 - position = 0, 260 74 - halign = center 75 - valign = bottom 76 - shadow_passes = 1 77 - shadow_color = $shadowColor 78 - shadow_boost = $shadow 79 - } 80 - 81 - # Password field 82 - input-field { 83 - monitor = $primaryMonitor 84 - size = 400, 35 85 - rounding = 15 86 - position = 0, 200 87 - halign = center 88 - valign = bottom 89 - 90 - outline_thickness = 1 91 - inner_color = $inputColor 92 - font_family = $fontFamily 93 - font_color = $textColor 94 - outer_color = $borderColor 95 - fail_color = $failColor 96 - check_color = $checkColor 97 - placeholder_text = 98 - fail_text = nope! 99 - dots_rounding = 0 100 - dots_spacing = 0 101 - dots_text_format = ░░ 102 - #dots_text_format = ▒░▓█ 103 - 104 - fade_on_empty = false 105 - shadow_passes = 1 106 - shadow_color = $shadowColor 107 - shadow_boost = $shadow 108 - } 109 - 110 - # Notification count 111 - label { 112 - monitor = $primaryMonitor 113 - text = cmd[update:4000] ~/bin/lockscreen-status 114 - color = $textColor 115 - font_size = $fontSizeSmall 116 - font_family = $fontFamily 117 - text_align = center 118 - 119 - position = 0, 40 120 - halign = center 121 - valign = bottom 122 - shadow_passes = 1 123 - shadow_color = $shadowColor 124 - shadow_boost = $shadow 125 - }
-43
config/mako/config
··· 1 - # Show notifications on primary display 2 - output=HDMI-A-1 3 - 4 - # Basic styling settings 5 - font=Departure Mono 11px 6 - max-icon-size=32 7 - 8 - # By default, show just the summary 9 - format=%s 10 - 11 - # Catppuccin theme colours 12 - background-color=#24273a 13 - text-color=#cad3f5 14 - border-color=#1e2030 15 - 16 - # Show notifications above any other window, even full-screen ones 17 - layer=overlay 18 - 19 - # Only show one notification per app 20 - group-by=app-name 21 - 22 - # Kill a notification after 7.5s if not otherwise specified 23 - default-timeout=7500 24 - 25 - # Keep the last 20 notifications in the buffer so we can look back at them 26 - history=1 27 - max-history=20 28 - 29 - # If the notification has a body, separate the body and the summary with a line. 30 - [body~=.+] 31 - format=%s\n──\n%b 32 - 33 - # If `do-not-disturb` mode is enabled, hide all notifications 34 - [mode=do-not-disturb] 35 - invisible=1 36 - 37 - # If `locked` mode is enabled, do not expire notifications. Keep them all in "limbo". 38 - [mode=locked] 39 - ignore-timeout=1 40 - default-timeout=0 41 - invisible=1 42 - 43 - # vim: ft=config
config/niri/config.kdl resources/niri/config.kdl
-3
config/nushell/env.nu
··· 39 39 $env.EDITOR = "hx" 40 40 41 41 $env.BAT_THEME = "ansi" # basic bitch... 42 - 43 - # Other configuration files 44 - $env.RIPGREP_CONFIG_PATH = ($env.HOME | path join ".config/.ripgreprc")
+7 -7
config/nushell/load-secrets.nu resources/scripts/lib/secrets/mod.nu
··· 1 - export def get-secrets [] { 1 + export def --env to-env [] { 2 + let secrets = (from-op) 3 + load-env $secrets 4 + $env.SECRETS_LOADED = ($secrets | columns | length) 5 + } 6 + 7 + export def from-op [] { 2 8 op signin --account my.1password.com 3 9 op item get "Shell Environment" --vault "Development" --format json 4 10 | jq '.fields | map(select(.section.label == "Environment")) | map({(.label): .value}) | add' 5 11 | from json 6 12 } 7 - 8 - export def --env from-1password [] { 9 - let secrets = (get-secrets) 10 - load-env $secrets 11 - $env.SECRETS_LOADED = ($secrets | columns | length) 12 - }
+7 -7
config/nushell/scripts/vlog.nu resources/scripts/lib/vlog/mod.nu
··· 1 - export def "vlog info" [message: string] { 1 + export def "info" [message: string] { 2 2 log info $message 3 3 } 4 4 5 - export def "vlog done" [message: string] { 5 + export def "done" [message: string] { 6 6 log done $message 7 7 } 8 8 9 - export def "vlog debug" [message: string] { 9 + export def "debug" [message: string] { 10 10 log debug $message 11 11 } 12 12 13 - export def "vlog warn" [message: string] { 13 + export def "warn" [message: string] { 14 14 log warn $message 15 15 } 16 16 17 - export def "vlog error" [message: string] { 17 + export def "error" [message: string] { 18 18 log error $message 19 19 } 20 20 21 - export def "vlog fatal" [message: string, exitValue: int = 1] { 21 + export def "fatal" [message: string, exitValue: int = 1] { 22 22 log error $message 23 23 log error "💔 Previous error was fatal; terminating!" 24 24 exit $exitValue 25 25 } 26 26 27 - export def "vlog timed" [name: string, block: closure] { 27 + export def "timed" [name: string, block: closure] { 28 28 let start = date now 29 29 30 30 try {
-26
config/nushell/utils.nu
··· 1 - # A place to put all the extra commands and aliases that I might need. 2 - 3 - # Switch the Kubernetes context with the magic of FZF. 4 - def kctx [] { 5 - kubectl config use-context (kubectl config get-contexts -o=name | fzf --height=30% --reverse) 6 - } 7 - 8 - # Pass to nushell's open command. 9 - def nuopen [arg, --raw (-r)] { 10 - if $raw { open -r $arg } else { open $arg } 11 - } 12 - alias open = ^open 13 - 14 - # List all projects (directories under ~/Code) 15 - def list-projects [] { ls -s $"($env.HOME)/Code" | sort-by -r modified | get name } 16 - 17 - # Change to a project directory (directory under ~/Code). 18 - def --env view-project [dir: string@list-projects] { 19 - cd $"($env.HOME)/Code/($dir)" 20 - } 21 - 22 - # Open the project in VS Code 23 - def open-project [dir: string@list-projects] { 24 - code $"($env.HOME)/Code/($dir)" 25 - } 26 - alias ccd = view-project
-14
config/ripgreprc
··· 1 - # limit line length 2 - --max-columns=150 3 - --max-columns-preview 4 - 5 - # also show hidden directories and files 6 - --hidden 7 - 8 - # ignore Git data 9 - --glob=!.git/* 10 - 11 - --smart-case 12 - 13 - # allow clicking on file names to open them 14 - --hyperlink-format=kitty
-46
config/starship.toml
··· 1 - # Get editor completions based on the config schema 2 - "$schema" = 'https://starship.rs/config-schema.json' 3 - 4 - # Inserts a blank line between shell prompts 5 - add_newline = true 6 - 7 - [character] 8 - success_symbol = '[\$](bold green)' 9 - error_symbol = '[!](bold red)' 10 - 11 - [directory] 12 - before_repo_root_style = 'bold cyan' 13 - repo_root_style = 'bold cyan' 14 - repo_root_format = '[$before_root_path]($before_repo_root_style)[ $repo_root]($repo_root_style)[$path]($style)[$read_only]($read_only_style) ' 15 - 16 - [gcloud] 17 - disabled = true 18 - 19 - [git_branch] 20 - symbol = '🌱 ' 21 - truncation_length = 10 22 - truncation_symbol = '~' 23 - ignore_branches = ['master', 'main'] 24 - 25 - [git_metrics] 26 - added_style = 'bold blue' 27 - format = ' ([+$added]($added_style)/[-$deleted]($deleted_style)) ' 28 - disabled = true 29 - 30 - [git_status] 31 - style = 'blue' 32 - conflicted = '[!$count ](bold red)' 33 - untracked = '[+$count ](red)' 34 - stashed = '[󰆓$count ](yellow)' 35 - modified = '[✴$count ](red)' 36 - deleted = '[-$count ](red)' 37 - renamed = '[→$count ](red)' 38 - staged = '[•$count ](bold yellow)' 39 - ahead = '⇡ $count ' 40 - diverged = '⇡ $ahead_count ⇣ $behind_count ' 41 - behind = '⇣ $count ' 42 - format = '[$all_status$ahead_behind]($style)' 43 - 44 - [env_var.SECRETS_LOADED] 45 - format = "with 🔑 [$env_value secrets]($style) " 46 - style = "bold dimmed"
+4 -8
config/waybar/base.css resources/waybar/base.css
··· 1 1 window#waybar { 2 2 color: @text; 3 3 background-color: transparent; 4 - font-family: "Departure Mono", "Symbols Nerd Font Mono", FontAwesome; 5 - font-size: 11px; 4 + font-family: "Inter", "Symbols Nerd Font Mono", FontAwesome; 5 + font-size: 12px; 6 + font-weight: 500; 6 7 } 7 8 8 9 window#waybar.empty #window { ··· 57 58 color: @red; 58 59 } 59 60 60 - #tray {} 61 - 62 61 #custom-power { 63 62 padding: 0 10px; 64 63 } ··· 73 72 color: @flamingo; 74 73 } 75 74 76 - #mpris.stopped, 77 - #mpris.disconnected {} 78 - 79 75 tooltip { 80 76 background: @mantle; 81 77 border: 1px solid @teal; ··· 83 79 84 80 tooltip label { 85 81 color: @text; 86 - } 82 + }
config/waybar/config.jsonc resources/waybar/config.jsonc
+2
config/waybar/latte.css resources/waybar/style-light.css
··· 24 24 @define-color base #eff1f5; 25 25 @define-color mantle #e6e9ef; 26 26 @define-color crust #dce0e8; 27 + 28 + @import "base.css";
+2
config/waybar/macchiato.css resources/waybar/style-dark.css
··· 24 24 @define-color base #24273a; 25 25 @define-color mantle #1e2030; 26 26 @define-color crust #181926; 27 + 28 + @import "base.css";
config/waybar/power_menu.xml resources/waybar/power_menu.xml
-2
config/waybar/style-dark.css
··· 1 - @import "macchiato.css"; 2 - @import "base.css";
-2
config/waybar/style-light.css
··· 1 - @import "latte.css"; 2 - @import "base.css";
+2 -2
flake.nix
··· 44 44 starlight = nixpkgs.lib.nixosSystem { 45 45 inherit system; 46 46 modules = [ 47 - ./system.nix 47 + ./machines/starlight 48 48 nixos-hardware.nixosModules.common-pc 49 49 nixos-hardware.nixosModules.common-pc-ssd 50 50 nixos-hardware.nixosModules.common-gpu-amd ··· 54 54 home-manager.nixosModules.home-manager 55 55 { 56 56 home-manager = { 57 - users.ivan = import ./home.nix; 57 + users.ivan = import ./home/_home.nix; 58 58 extraSpecialArgs = inputs; 59 59 }; 60 60 }
hardware-configuration.nix machines/starlight/hardware-configuration.nix
-451
home.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - walker, 6 - zen-browser, 7 - ragenix, 8 - ... 9 - }: 10 - { 11 - # Disable Richard Stallman 12 - nixpkgs.config.allowUnfree = true; 13 - 14 - imports = [ 15 - walker.homeManagerModules.default 16 - ragenix.homeManagerModules.default 17 - ./modules/services/mprisence.nix 18 - ]; 19 - 20 - age.secrets.mpdscribble.file = ./secrets/mpdscribble.age; 21 - 22 - programs = { 23 - # Home Manager manages itself 24 - home-manager.enable = true; 25 - 26 - # use 1password to authenticate with SSH 27 - ssh = { 28 - enable = true; 29 - extraConfig = '' 30 - Host * 31 - IdentityAgent ~/.1password/agent.sock 32 - ''; 33 - }; 34 - 35 - # keep per-project shell configs 36 - direnv = { 37 - enable = true; 38 - nix-direnv.enable = true; 39 - }; 40 - 41 - walker = { 42 - enable = true; 43 - runAsService = true; 44 - config = { 45 - providers = { 46 - default = [ 47 - "desktopapplications" 48 - "calc" 49 - "websearch" 50 - "bookmarks" 51 - "todo" 52 - ]; 53 - 54 - prefixes = [ 55 - { 56 - prefix = ";"; 57 - provider = "providerlist"; 58 - } 59 - { 60 - prefix = ">"; 61 - provider = "runner"; 62 - } 63 - { 64 - prefix = "."; 65 - provider = "symbols"; 66 - } 67 - { 68 - prefix = "!"; 69 - provider = "todo"; 70 - } 71 - { 72 - prefix = "%"; 73 - provider = "bookmarks"; 74 - } 75 - { 76 - prefix = "@"; 77 - provider = "websearch"; 78 - } 79 - { 80 - prefix = ":"; 81 - provider = "clipboard"; 82 - } 83 - { 84 - prefix = "$"; 85 - provider = "windows"; 86 - } 87 - { 88 - prefix = "'"; 89 - provider = "nirisessions"; 90 - } 91 - ]; 92 - }; 93 - }; 94 - }; 95 - }; 96 - 97 - home = { 98 - packages = 99 - with pkgs; 100 - [ 101 - # desktop environment 102 - glib # gtk config 103 - niri # window manager 2: window manageraloo 104 - hyprlock # lock screen 2: lock... yeah whatever 105 - hypridle # idle management daemon 106 - swww # dynamic wallpaper 107 - thunderbird # mail 108 - mako # notifications 109 - waybar # status bar 110 - wl-clipboard # copy and paste 111 - wtype # automate writing (for inserting emojis) 112 - xwayland-satellite # xwayland outside wayland 113 - blueberry # bluetooth settings 114 - 115 - # apps 116 - discord # keep up with the egirls 117 - ghostty # terminal 118 - mpd # radiohead 119 - obsidian # notes 120 - prismlauncher # the children yearn for the mines 121 - slack # work, work 122 - qbittorrent # yarr 123 - euphonica # music 124 - foliate # ebook 125 - mangohud # FPS, temp monitor 126 - 127 - # Fine, I Will Use Gnome Apps 128 - celluloid # video player 129 - decibels # audio player 130 - evince # document viewr 131 - gnome-calculator 132 - gnome-calendar 133 - gnome-maps 134 - gnome-weather 135 - gnome-text-editor 136 - loupe # image viewer 137 - nautilus # file browser 138 - newsflash # rss 139 - video-trimmer # if only all apps were named this consistently 140 - 141 - # cli apps 142 - bat # nicer cat 143 - broot # trees 144 - dig # it's always DNS 145 - fastfetch # r/unixporn bait 146 - fortune # wisdom 147 - gh # github client 148 - helix # "post-modern" text editor 149 - imagemagick # magic of the image variety 150 - libnotify # for notify-send 151 - nushell # a nicer shell 152 - starship # terminal prompt 153 - v4l-utils # webcam settings 154 - difftastic # syntax-aware diff 155 - jujutsu # fine, i will try it... 156 - 157 - # developer tools 158 - gcc # the GNU Compiler Collection 159 - lldb # debugger 160 - rustup # rust installer 161 - strace # peek under the hood 162 - terraform # the CLOUD 163 - agebox # secret 164 - age # more secret 165 - uv # snek 166 - lefthook # git hooks 167 - nmap # hacks 168 - nixfmt-rfc-style # nix formatter 169 - kanidm_1_7 # auth 170 - 171 - # language servers 172 - gopls # golang 173 - lua-language-server # lua 174 - nixd # nix 175 - taplo # toml 176 - terraform-ls # terraform 177 - typescript-language-server # javascript, typescript 178 - vscode-langservers-extracted # html, css, json, eslint 179 - 180 - # fonts 181 - cascadia-code 182 - inter 183 - departure-mono 184 - iosevka 185 - liberation_ttf # replacements for common MS fonts 186 - noto-fonts 187 - noto-fonts-cjk-sans 188 - twitter-color-emoji # 🤓 189 - 190 - # icons 191 - adwaita-icon-theme 192 - adwaita-icon-theme-legacy 193 - morewaita-icon-theme 194 - font-awesome 195 - nerd-fonts.symbols-only 196 - ] 197 - ++ [ 198 - zen-browser.packages."x86_64-linux".default # firefoxn't 199 - ragenix.packages."x86_64-linux".default 200 - ]; 201 - 202 - username = "ivan"; 203 - homeDirectory = "/home/ivan"; 204 - 205 - stateVersion = "25.11"; 206 - 207 - pointerCursor = { 208 - gtk.enable = true; 209 - x11.enable = true; 210 - name = "Bibata-Modern-Classic"; 211 - package = pkgs.bibata-cursors; 212 - }; 213 - }; 214 - 215 - # screen recording 216 - programs.obs-studio = { 217 - enable = true; 218 - }; 219 - 220 - # GTK theming settings 221 - gtk = { 222 - enable = true; 223 - # Certain GNOME apps break without this because they are impeccably coded 224 - iconTheme = { 225 - package = pkgs.morewaita-icon-theme; 226 - name = "MoreWaita"; 227 - }; 228 - }; 229 - 230 - fonts.fontconfig.defaultFonts.emoji = [ "Twitter Color Emoji" ]; 231 - 232 - services = { 233 - mpd = { 234 - enable = true; 235 - musicDirectory = "/mnt/media/Music"; 236 - extraConfig = '' 237 - auto_update "yes" 238 - 239 - audio_output { 240 - type "pipewire" 241 - name "PipeWire Sound Server" 242 - } 243 - 244 - audio_output { 245 - type "fifo" 246 - name "visualizer" 247 - path "~/.local/share/mpd/mpd.fifo" 248 - format "44100:16:2" 249 - } 250 - ''; 251 - }; 252 - 253 - # control mpd through the MPRIS protocol 254 - mpd-mpris.enable = true; 255 - 256 - # daemon that tracks media player activity 257 - playerctld.enable = true; 258 - 259 - # Make Bluetooth headset buttons usable with media players 260 - mpris-proxy.enable = true; 261 - 262 - # Enable system authentication for unprivileged apps 263 - polkit-gnome.enable = true; 264 - 265 - # Enable Discord rich presence 266 - mprisence = { 267 - enable = true; 268 - settings = { 269 - player = { 270 - default = { 271 - ignore = true; 272 - }; 273 - "io.github.htkhiem.euphonica" = { 274 - ignore = true; 275 - }; 276 - "*mpd*" = { 277 - ignore = false; 278 - }; 279 - zen = { 280 - ignore = true; 281 - }; 282 - }; 283 - }; 284 - }; 285 - 286 - mpdscribble = { 287 - enable = true; 288 - endpoints."last.fm" = { 289 - passwordFile = "/run/user/1000/agenix/mpdscribble"; # TODO: super hacky 290 - username = "crescentr0se"; 291 - }; 292 - }; 293 - 294 - }; 295 - 296 - xdg.dataFile."mpd/.keep".text = ""; 297 - 298 - # Allow inter-app communication 299 - # The GTK portal can handle most interfaces, while the WLR portal handles screenshots and screen 300 - # casting for Niri. 301 - # Notably, neither handle clipboard - seems like only the GNOME portal does that. 😕 302 - # more info: https://wiki.archlinux.org/title/XDG_Desktop_Portal 303 - xdg.portal.enable = true; 304 - xdg.portal.extraPortals = [ 305 - pkgs.xdg-desktop-portal-gnome 306 - pkgs.xdg-desktop-portal-gtk 307 - pkgs.gnome-keyring 308 - ]; 309 - xdg.portal.config = { 310 - niri = { 311 - default = [ 312 - "gnome" 313 - "gtk" 314 - ]; 315 - "org.freedesktop.impl.portal.Access" = "gtk"; 316 - "org.freedesktop.impl.portal.Notification" = "gtk"; 317 - "org.freedesktop.impl.portal.Secret" = "gnome-keyring"; 318 - }; 319 - 320 - preferred = { 321 - default = [ 322 - "gnome" 323 - "gtk" 324 - ]; 325 - }; 326 - }; 327 - 328 - # Fix crackle in certain apps that use Pipewire/Pulseaudio combo 329 - xdg.configFile."pipewire/pipewire-pulse.conf.d/20-pulse-properties.conf".text = '' 330 - pulse.properties = { 331 - pulse.min.req = 256/48000 332 - pulse.min.frag = 256/48000 333 - pulse.min.quantum = 256/48000 334 - } 335 - ''; 336 - 337 - # Set up systemd units for various supporting DE services. 338 - systemd.user.services = { 339 - # Bar 340 - waybar = { 341 - Unit = { 342 - Description = "Waybar"; 343 - PartOf = "graphical-session.target"; 344 - After = "graphical-session.target"; 345 - Requisite = "graphical-session.target"; 346 - }; 347 - Install = { 348 - WantedBy = [ "graphical-session.target" ]; 349 - }; 350 - Service = { 351 - Environment = "$PATH:${lib.makeBinPath [ pkgs.imagemagick ]}"; 352 - ExecStart = "${pkgs.waybar}/bin/waybar"; 353 - ExecReload = "${pkgs.coreutils}/bin/kill -SIGUSR2 $MAINPID"; 354 - Restart = "on-failure"; 355 - }; 356 - }; 357 - 358 - # Notification daemon 359 - mako = { 360 - Unit = { 361 - Description = "Mako - Notification daemon"; 362 - PartOf = "graphical-session.target"; 363 - After = "graphical-session.target"; 364 - }; 365 - Install = { 366 - WantedBy = [ "graphical-session.target" ]; 367 - }; 368 - Service = { 369 - ExecStart = "${pkgs.mako}/bin/mako"; 370 - ExecReload = "${pkgs.mako}/bin/makoctl reload"; 371 - Restart = "on-failure"; 372 - }; 373 - }; 374 - 375 - # Wallpaper manager 376 - swww = { 377 - Unit = { 378 - Description = "Solution to Wayland Wallpaper Woes"; 379 - PartOf = "graphical-session.target"; 380 - After = "graphical-session.target"; 381 - }; 382 - Install = { 383 - WantedBy = [ "niri.service" ]; 384 - }; 385 - Service = { 386 - ExecStart = "${pkgs.swww}/bin/swww-daemon"; 387 - Restart = "on-failure"; 388 - }; 389 - }; 390 - 391 - # Idle manager 392 - hypridle = { 393 - Unit = { 394 - Description = "Idle management daemon"; 395 - PartOf = "graphical-session.target"; 396 - After = "graphical-session.target"; 397 - }; 398 - Install = { 399 - WantedBy = [ "niri.service" ]; 400 - }; 401 - Service = { 402 - ExecStart = "${pkgs.hypridle}/bin/hypridle"; 403 - Restart = "on-failure"; 404 - }; 405 - }; 406 - }; 407 - 408 - # Dotfiles 409 - # I do not really want to store all of my dotfiles in the Nix language because it makes it more 410 - # difficult to iterate upon them and share with others who might not use NixOS. So they get 411 - # symlinked here. 412 - 413 - # TODO: Looks like only absolute paths are supported currently. Need to figure out a better way to 414 - # handle this. 415 - home.file = { 416 - ".gitconfig".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/gitconfig; 417 - "bin".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/bin; 418 - }; 419 - 420 - xdg.configFile = { 421 - ".gitignore_global".source = 422 - config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/gitignore_global; 423 - "kitty".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/kitty; 424 - "nushell".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/nushell; 425 - "helix".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/helix; 426 - "starship.toml".source = 427 - config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/starship.toml; 428 - ".ripgreprc".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/ripgreprc; 429 - "waybar".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/waybar; 430 - "mako".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/mako; 431 - "niri".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/niri; 432 - "hypr".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/hypr; 433 - "ghostty".source = config.lib.file.mkOutOfStoreSymlink /home/ivan/Code/dotfiles/config/ghostty; 434 - }; 435 - 436 - # Enable hardware acceleration in Discord, which is disabled by default because of reasons only 437 - # known to Mr. John Discord himself 438 - xdg.desktopEntries.discord = { 439 - categories = [ 440 - "Network" 441 - "InstantMessaging" 442 - ]; 443 - exec = "discord --ignore-gpu-blocklist --disable-features=UseOzonePlatform --enable-features=VaapiVideoDecoder --use-gl=desktop --enable-gpu-rasterization --enable-zero-copy"; 444 - genericName = "All-in-one cross-platform voice and text chat for gamers"; 445 - icon = "discord"; 446 - mimeType = [ "x-scheme-handler/discord" ]; 447 - name = "Discord"; 448 - type = "Application"; 449 - terminal = false; 450 - }; 451 - }
+26
home/_home.nix
··· 1 + { ragenix, ... }: 2 + { 3 + imports = [ 4 + ragenix.homeManagerModules.default 5 + ./base.nix 6 + ./programs/git.nix 7 + ./programs/ssh.nix 8 + ./programs/walker.nix 9 + ./programs/mpd.nix 10 + ./programs/discord.nix 11 + ./programs/ghostty.nix 12 + ./programs/helix.nix 13 + ./desktop 14 + ./shell 15 + ]; 16 + 17 + # keep up with the French 18 + programs.discordAccel.enable = true; 19 + 20 + home = { 21 + packages = [ ragenix.packages."x86_64-linux".default ]; 22 + 23 + username = "ivan"; 24 + homeDirectory = "/home/ivan"; 25 + }; 26 + }
+19
home/_work.nix
··· 1 + { pkgs, ... }: 2 + { 3 + # only import the subset supported by macOS 4 + imports = [ 5 + ./base.nix 6 + ./programs/git.nix 7 + ./programs/ssh.nix 8 + ./programs/ghostty.nix 9 + ./programs/helix.nix 10 + ./shell 11 + ]; 12 + 13 + # corporate mandated 14 + home.username = "ivan.ostric"; 15 + home.directory = "/Users/ivan.ostric"; 16 + 17 + # :squints: 18 + programs.ghostty.settings.font-size = pkgs.mkForce 12; 19 + }
+20
home/base.nix
··· 1 + { 2 + # Only options supported by both macOS and Linux should go here. 3 + # Others should go in the respective `_work` or `_home` files. 4 + 5 + # Disable Richard Stallman 6 + nixpkgs.config.allowUnfree = true; 7 + 8 + programs = { 9 + # Home Manager manages itself 10 + home-manager.enable = true; 11 + 12 + # keep per-project shell configs 13 + direnv = { 14 + enable = true; 15 + nix-direnv.enable = true; 16 + }; 17 + }; 18 + 19 + home.stateVersion = "25.11"; 20 + }
+16
home/desktop/apps.nix
··· 1 + { pkgs, zen-browser, ... }: 2 + { 3 + # Desktop applications 4 + home.packages = [ 5 + pkgs.thunderbird # email 6 + pkgs.ghostty # terminal 7 + pkgs.obsidian # notes 8 + pkgs.prismlauncher # the children yearn for the mines 9 + pkgs.slack # work, work 10 + pkgs.qbittorrent # yarr 11 + pkgs.euphonica # music 12 + pkgs.foliate # ebook 13 + pkgs.mangohud # FPS, temp monitor 14 + zen-browser.packages."x86_64-linux".default # firefoxn't 15 + ]; 16 + }
+10
home/desktop/audio.nix
··· 1 + { 2 + # Fix crackle in certain apps that use Pipewire/Pulseaudio combo 3 + xdg.configFile."pipewire/pipewire-pulse.conf.d/20-pulse-properties.conf".text = '' 4 + pulse.properties = { 5 + pulse.min.req = 256/48000 6 + pulse.min.frag = 256/48000 7 + pulse.min.quantum = 256/48000 8 + } 9 + ''; 10 + }
+22
home/desktop/bar.nix
··· 1 + { lib, pkgs, ... }: 2 + { 3 + xdg.configFile."waybar".source = ../../resources/waybar; 4 + 5 + systemd.user.services.waybar = { 6 + Unit = { 7 + Description = "Waybar"; 8 + PartOf = "graphical-session.target"; 9 + After = "graphical-session.target"; 10 + Requisite = "graphical-session.target"; 11 + }; 12 + Install = { 13 + WantedBy = [ "graphical-session.target" ]; 14 + }; 15 + Service = { 16 + Environment = "$PATH:${lib.makeBinPath [ pkgs.imagemagick ]}"; 17 + ExecStart = "${pkgs.waybar}/bin/waybar"; 18 + ExecReload = "${pkgs.coreutils}/bin/kill -SIGUSR2 $MAINPID"; 19 + Restart = "on-failure"; 20 + }; 21 + }; 22 + }
+63
home/desktop/default.nix
··· 1 + { pkgs, ... }: 2 + { 3 + # Contains stuff pertaining to the Year of the Linux Desktop 4 + imports = [ 5 + ./audio.nix 6 + ./apps.nix 7 + ./bar.nix 8 + ./idle.nix 9 + ./gtk.nix 10 + ./notifications.nix 11 + ./portal.nix 12 + ./wallpaper.nix 13 + ./window-manager.nix 14 + ]; 15 + 16 + # Enable system authentication for unprivileged apps 17 + services.polkit-gnome.enable = true; 18 + 19 + # Include basic packages 20 + home.packages = with pkgs; [ 21 + glib # gtk config 22 + waybar # status bar 23 + wl-clipboard # copy and paste 24 + wtype # automate writing (for inserting emojis) 25 + xwayland-satellite # xwayland outside wayland 26 + blueberry # bluetooth settings 27 + v4l-utils # webcam settings 28 + libnotify # for notify-send 29 + 30 + # Fine, I Will Use Gnome Apps 31 + celluloid # video player 32 + decibels # audio player 33 + evince # document viewr 34 + gnome-calculator 35 + gnome-calendar 36 + gnome-maps 37 + gnome-weather 38 + gnome-text-editor 39 + loupe # image viewer 40 + nautilus # file browser 41 + newsflash # rss 42 + video-trimmer # if only all apps were named this consistently 43 + 44 + # fonts 45 + cascadia-code 46 + inter 47 + departure-mono 48 + iosevka 49 + liberation_ttf # replacements for common MS fonts 50 + noto-fonts 51 + noto-fonts-cjk-sans 52 + twitter-color-emoji # 🤓 53 + 54 + # icons 55 + adwaita-icon-theme 56 + adwaita-icon-theme-legacy 57 + morewaita-icon-theme 58 + font-awesome 59 + nerd-fonts.symbols-only 60 + ]; 61 + 62 + fonts.fontconfig.defaultFonts.emoji = [ "Twitter Color Emoji" ]; 63 + }
+19
home/desktop/gtk.nix
··· 1 + { pkgs, ... }: 2 + { 3 + home.pointerCursor = { 4 + gtk.enable = true; 5 + x11.enable = true; 6 + name = "Bibata-Modern-Classic"; 7 + package = pkgs.bibata-cursors; 8 + }; 9 + 10 + # GTK theming settings 11 + gtk = { 12 + enable = true; 13 + # Certain GNOME apps break without this because they are impeccably coded 14 + iconTheme = { 15 + package = pkgs.morewaita-icon-theme; 16 + name = "MoreWaita"; 17 + }; 18 + }; 19 + }
+162
home/desktop/idle.nix
··· 1 + { 2 + # TODO: replace this 3 + programs.hyprlock = { 4 + enable = true; 5 + 6 + settings = { 7 + "$primaryMonitor" = "DP-1"; 8 + "$inputColor" = "rgb(1e2030)"; 9 + "$fallbackColor" = "rgb(24273a)"; 10 + "$borderColor" = "rgb(1e2030)"; 11 + "$textColor" = "rgb(cad3f5)"; 12 + "$fontFamily" = "Departure Mono"; 13 + "$checkColor" = "rgb(91d7e3)"; 14 + "$failColor" = "rgb(f0c6c6)"; 15 + "$shadowColor" = "rgb(363a4f)"; 16 + "$shadow" = "0.8"; 17 + 18 + "$fontSizeSmall" = 10; 19 + "$fontSizeNormal" = 12; 20 + "$fontSizeLarge" = 18; 21 + 22 + general = { 23 + grace = 5; 24 + }; 25 + 26 + background = { 27 + path = "~/.cache/hyprlock_wallpaper.jpg"; 28 + blur_size = 5; 29 + blur_passes = 2; 30 + noise = 0.05; 31 + brightness = 0.65; 32 + vibrancy = 0.5; 33 + color = "$fallbackColor"; 34 + }; 35 + 36 + label = [ 37 + # Date 38 + { 39 + monitor = "$primaryMonitor"; 40 + text = ''cmd[update:18000000] echo "$(date +'%A, %-d %B %Y')"''; 41 + color = "$textColor"; 42 + font_size = "$fontSizeNormal"; 43 + font_family = "$fontFamily"; 44 + 45 + position = "0, 250"; 46 + halign = "center"; 47 + valign = "center"; 48 + 49 + shadow_passes = 1; 50 + shadow_color = "$shadowColor"; 51 + shadow_boost = "$shadow"; 52 + } 53 + 54 + # Time 55 + { 56 + monitor = "$primaryMonitor"; 57 + text = ''cmd[update:1000] echo "$(date +'%H:%M')"''; # 24H 58 + color = "$textColor"; 59 + font_size = "$fontSizeLarge"; 60 + font_family = "$fontFamily"; 61 + 62 + position = "0, 200"; 63 + halign = "center"; 64 + valign = "center"; 65 + 66 + shadow_passes = 1; 67 + shadow_color = "$shadowColor"; 68 + shadow_boost = "$shadow"; 69 + } 70 + 71 + # Greeting 72 + { 73 + monitor = "$primaryMonitor"; 74 + text = "Enter password"; 75 + color = "$textColor"; 76 + font_size = "$fontSizeNormal"; 77 + font_family = "$fontFamily"; 78 + 79 + position = "0, 260"; 80 + halign = "center"; 81 + valign = "bottom"; 82 + shadow_passes = 1; 83 + shadow_color = "$shadowColor"; 84 + shadow_boost = "$shadow"; 85 + } 86 + # Notification count 87 + # { 88 + # monitor = "$primaryMonitor"; 89 + # text = "cmd[update:4000] ~/bin/lockscreen-status"; 90 + # text_align = "center"; 91 + # color = "$textColor"; 92 + # font_size = "$fontSizeNormal"; 93 + # font_family = "$fontFamily"; 94 + 95 + # position = "0, 40"; 96 + # halign = "center"; 97 + # valign = "bottom"; 98 + # shadow_passes = 1; 99 + # shadow_color = "$shadowColor"; 100 + # shadow_boost = "$shadow"; 101 + # } 102 + ]; 103 + 104 + # Password field 105 + input-field = [ 106 + { 107 + monitor = "$primaryMonitor"; 108 + size = "400, 35"; 109 + rounding = 15; 110 + position = "0, 200"; 111 + halign = "center"; 112 + valign = "bottom"; 113 + 114 + outline_thickness = 1; 115 + inner_color = "$inputColor"; 116 + font_family = "$fontFamily"; 117 + font_color = "$textColor"; 118 + outer_color = "$borderColor"; 119 + fail_color = "$failColor"; 120 + check_color = "$checkColor"; 121 + placeholder_text = ""; 122 + fail_text = "nope!"; 123 + dots_rounding = 0; 124 + dots_spacing = 0; 125 + dots_text_format = "░░"; 126 + #dots_text_format = ▒░▓█ 127 + 128 + fade_on_empty = false; 129 + shadow_passes = 1; 130 + shadow_color = "$shadowColor"; 131 + shadow_boost = "$shadow"; 132 + } 133 + ]; 134 + }; 135 + }; 136 + 137 + services.hypridle = { 138 + enable = true; 139 + settings = { 140 + general = { 141 + lock_cmd = "~/bin/screen-lock lock"; 142 + unlock_cmd = "~/bin/screen-lock unlock"; 143 + 144 + before_sleep_cmd = "~/bin/screen-lock lock"; 145 + }; 146 + 147 + listener = [ 148 + { 149 + timeout = 300; 150 + on-timeout = "loginctl lock-session"; 151 + } 152 + 153 + { 154 + timeout = 900; 155 + on-timeout = "systemctl suspend"; 156 + } 157 + ]; 158 + 159 + }; 160 + systemdTarget = "graphical-session.target"; 161 + }; 162 + }
+40
home/desktop/notifications.nix
··· 1 + { 2 + services.mako = { 3 + enable = true; 4 + 5 + settings = { 6 + font = "Iosevka 12px"; 7 + max-icon-size = 32; 8 + 9 + format = "%s"; 10 + background-color = "#24273a"; 11 + text-color = "#cad3f5"; 12 + border-color = "#1e2030"; 13 + 14 + layer = "overlay"; 15 + group-by = "app-name"; 16 + 17 + default-timeout = 5000; 18 + 19 + history = 1; 20 + max-history = 20; 21 + 22 + # If the notification has a body, separate the body and the summary with a line. 23 + "body~=.+" = { 24 + format = "%s\n──\n%b"; 25 + }; 26 + 27 + # If `do-not-disturb` mode is enabled, hide all notifications 28 + "mode=do-not-disturb" = { 29 + invisible = 1; 30 + }; 31 + 32 + # If `locked` mode is enabled, do not expire notifications. Keep them all in "limbo". 33 + "[mode=locked]" = { 34 + ignore-timeout = 1; 35 + default-timeout = 0; 36 + invisible = 1; 37 + }; 38 + }; 39 + }; 40 + }
+33
home/desktop/portal.nix
··· 1 + { pkgs, ... }: 2 + { 3 + # Allow inter-app communication 4 + # The GTK portal can handle most interfaces, while the WLR portal handles screenshots and screen 5 + # casting for Niri. 6 + # Notably, neither handle clipboard - seems like only the GNOME portal does that. 😕 7 + # more info: https://wiki.archlinux.org/title/XDG_Desktop_Portal 8 + xdg.portal.enable = true; 9 + xdg.portal.extraPortals = [ 10 + pkgs.xdg-desktop-portal-gnome 11 + pkgs.xdg-desktop-portal-gtk 12 + pkgs.gnome-keyring 13 + ]; 14 + 15 + xdg.portal.config = { 16 + niri = { 17 + default = [ 18 + "gnome" 19 + "gtk" 20 + ]; 21 + "org.freedesktop.impl.portal.Access" = "gtk"; 22 + "org.freedesktop.impl.portal.Notification" = "gtk"; 23 + "org.freedesktop.impl.portal.Secret" = "gnome-keyring"; 24 + }; 25 + 26 + preferred = { 27 + default = [ 28 + "gnome" 29 + "gtk" 30 + ]; 31 + }; 32 + }; 33 + }
+3
home/desktop/wallpaper.nix
··· 1 + { 2 + services.swww.enable = true; 3 + }
+6
home/desktop/window-manager.nix
··· 1 + { pkgs, ... }: 2 + { 3 + home.packages = [ pkgs.niri ]; 4 + 5 + xdg.configFile.niri.source = ../../resources/niri; 6 + }
+35
home/programs/discord.nix
··· 1 + { 2 + config, 3 + lib, 4 + pkgs, 5 + ... 6 + }: 7 + let 8 + cfg = config.programs.discordAccel; 9 + in 10 + { 11 + options.programs.discordAccel = { 12 + enable = lib.mkEnableOption "The cursed online chat app."; 13 + package = lib.mkPackageOption pkgs "discord" { nullable = true; }; 14 + }; 15 + 16 + config = lib.mkIf cfg.enable { 17 + home.packages = [ cfg.package ]; 18 + 19 + # Enable hardware acceleration in Discord, which is disabled by default because of reasons only 20 + # known to Mr. John Discord himself 21 + xdg.desktopEntries.discord = { 22 + categories = [ 23 + "Network" 24 + "InstantMessaging" 25 + ]; 26 + exec = "discord --ignore-gpu-blocklist --disable-features=UseOzonePlatform --enable-features=VaapiVideoDecoder --use-gl=desktop --enable-gpu-rasterization --enable-zero-copy"; 27 + genericName = "All-in-one cross-platform voice and text chat for gamers"; 28 + icon = "discord"; 29 + mimeType = [ "x-scheme-handler/discord" ]; 30 + name = "Discord"; 31 + type = "Application"; 32 + terminal = false; 33 + }; 34 + }; 35 + }
+13
home/programs/ghostty.nix
··· 1 + { 2 + programs.ghostty = { 3 + enable = true; 4 + enableZshIntegration = true; 5 + 6 + settings = { 7 + theme = "dark:Catppuccin Macchiato,light:Catppuccin Latte"; 8 + font-family = "Iosevka"; 9 + font-size = 12; 10 + command = "/usr/bin/env nu"; 11 + }; 12 + }; 13 + }
+33
home/programs/git.nix
··· 1 + let 2 + onePasswordSigner = "/run/current-system/sw/bin/op-ssh-sign"; # TODO: make dynamic 3 + userName = "Ivan"; 4 + userEmail = "hi@crescentro.se"; 5 + signingKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKJdAes80dpMrc99B68/1Kx2bbfoh6IrkbFF+60cMQti"; 6 + in 7 + { 8 + programs.git = { 9 + enable = true; 10 + 11 + settings = { 12 + user.name = userName; 13 + user.email = userEmail; 14 + 15 + core.editor = "hx"; 16 + branch.sort = "-committerdate"; 17 + column.ui = "auto"; 18 + pull.ff = "only"; 19 + push.autoSetupRemote = true; 20 + 21 + # Support insane Go packaga manager behaviour for private repos 22 + # This fucks up Xcode/Swift, though. Pick your battles. 23 + "url \"git@github.com:...\"".insteadOf = "https://github.com/..."; 24 + }; 25 + 26 + signing = { 27 + format = "ssh"; 28 + key = signingKey; 29 + signByDefault = true; 30 + signer = onePasswordSigner; 31 + }; 32 + }; 33 + }
+46
home/programs/helix.nix
··· 1 + { 2 + programs.helix = { 3 + enable = true; 4 + 5 + settings = { 6 + theme = "catppuccin_macchiato"; 7 + editor = { 8 + shell = [ 9 + "nu" 10 + "-c" 11 + ]; 12 + line-number = "relative"; 13 + rulers = [ 80 ]; 14 + }; 15 + 16 + keys.normal = { 17 + "^" = "goto_first_nonwhitespace"; 18 + "$" = "goto_line_end"; 19 + "D" = [ 20 + "extend_to_line_end" 21 + "delete_selection" 22 + ]; 23 + }; 24 + 25 + keys.select = { 26 + "^" = "goto_first_nonwhitespace"; 27 + "$" = "goto_line_end"; 28 + }; 29 + 30 + }; 31 + 32 + languages = { 33 + # Use Clippy for rust-analyzer checks 34 + language-server.rust-analyzer.config.check.command = "clippy"; 35 + 36 + # Format Nix files with nixfmt 37 + language = [ 38 + { 39 + name = "nix"; 40 + formatter.command = "nixfmt"; 41 + auto-format = true; 42 + } 43 + ]; 44 + }; 45 + }; 46 + }
+71
home/programs/mpd.nix
··· 1 + { 2 + imports = [ 3 + ../../modules/services/mprisence.nix 4 + ]; 5 + 6 + age.secrets.mpdscribble.file = ../../secrets/mpdscribble.age; 7 + 8 + services = { 9 + mpd = { 10 + enable = true; 11 + musicDirectory = "/mnt/media/Music"; 12 + extraConfig = '' 13 + auto_update "yes" 14 + 15 + audio_output { 16 + type "pipewire" 17 + name "PipeWire Sound Server" 18 + } 19 + 20 + audio_output { 21 + type "fifo" 22 + name "visualizer" 23 + path "~/.local/share/mpd/mpd.fifo" 24 + format "44100:16:2" 25 + } 26 + ''; 27 + }; 28 + 29 + # control mpd through the MPRIS protocol 30 + mpd-mpris.enable = true; 31 + 32 + # daemon that tracks media player activity 33 + playerctld.enable = true; 34 + 35 + # Make Bluetooth headset buttons usable with media players 36 + mpris-proxy.enable = true; 37 + 38 + # Enable Discord rich presence 39 + mprisence = { 40 + enable = true; 41 + settings = { 42 + player = { 43 + default = { 44 + ignore = true; 45 + }; 46 + "io.github.htkhiem.Euphonica" = { 47 + ignore = true; 48 + }; 49 + "*mpd*" = { 50 + ignore = false; 51 + }; 52 + zen = { 53 + ignore = true; 54 + }; 55 + }; 56 + }; 57 + }; 58 + 59 + # Enable scrobbling 60 + mpdscribble = { 61 + enable = true; 62 + endpoints."last.fm" = { 63 + passwordFile = "/run/user/1000/agenix/mpdscribble"; # TODO: super hacky 64 + username = "crescentr0se"; 65 + }; 66 + }; 67 + }; 68 + 69 + # Ensure that the mpd state directory exists for the FIFO to be created 70 + xdg.dataFile."mpd/.keep".text = ""; 71 + }
+10
home/programs/ssh.nix
··· 1 + { 2 + # use 1password to authenticate with SSH 3 + programs.ssh = { 4 + enable = true; 5 + extraConfig = '' 6 + Host * 7 + IdentityAgent ~/.1password/agent.sock 8 + ''; 9 + }; 10 + }
+61
home/programs/walker.nix
··· 1 + { walker, ... }: 2 + { 3 + imports = [ 4 + walker.homeManagerModules.default 5 + ]; 6 + 7 + programs.walker = { 8 + enable = true; 9 + runAsService = true; 10 + config = { 11 + providers = { 12 + default = [ 13 + "desktopapplications" 14 + "calc" 15 + "websearch" 16 + "bookmarks" 17 + "todo" 18 + ]; 19 + 20 + prefixes = [ 21 + { 22 + prefix = ";"; 23 + provider = "providerlist"; 24 + } 25 + { 26 + prefix = ">"; 27 + provider = "runner"; 28 + } 29 + { 30 + prefix = "."; 31 + provider = "symbols"; 32 + } 33 + { 34 + prefix = "!"; 35 + provider = "todo"; 36 + } 37 + { 38 + prefix = "%"; 39 + provider = "bookmarks"; 40 + } 41 + { 42 + prefix = "@"; 43 + provider = "websearch"; 44 + } 45 + { 46 + prefix = ":"; 47 + provider = "clipboard"; 48 + } 49 + { 50 + prefix = "$"; 51 + provider = "windows"; 52 + } 53 + { 54 + prefix = "'"; 55 + provider = "nirisessions"; 56 + } 57 + ]; 58 + }; 59 + }; 60 + }; 61 + }
+42
home/shell/default.nix
··· 1 + { pkgs, ... }: 2 + { 3 + imports = [ 4 + ./nu.nix 5 + ./ripgrep.nix 6 + ./starship.nix 7 + ]; 8 + 9 + home.packages = with pkgs; [ 10 + # cli apps 11 + bat # nicer cat 12 + broot # trees 13 + dig # it's always DNS 14 + fastfetch # r/unixporn bait 15 + fortune # wisdom 16 + gh # github client 17 + imagemagick # magic of the image variety 18 + difftastic # syntax-aware diff 19 + jujutsu # fine, i will try it... 20 + 21 + # developer tools 22 + gcc # the GNU Compiler Collection 23 + rustup # rust installer 24 + terraform # the CLOUD 25 + agebox # secret 26 + age # more secret 27 + uv # snek 28 + lefthook # git hooks 29 + 30 + # language servers 31 + gopls # golang 32 + lua-language-server # lua 33 + nixd # nix 34 + nixfmt-rfc-style # nix formatter 35 + taplo # toml 36 + terraform-ls # terraform 37 + typescript-language-server # javascript, typescript 38 + vscode-langservers-extracted # html, css, json, eslint 39 + ]; 40 + 41 + xdg.dataFile."scripts".source = ../../resources/scripts; 42 + }
+31
home/shell/nu.nix
··· 1 + { config, ... }: 2 + { 3 + programs.nushell = { 4 + enable = true; 5 + 6 + settings = { 7 + show_banner = false; 8 + completions.external = { 9 + enable = true; 10 + max_results = 200; 11 + }; 12 + 13 + cursor_shape.emacs = "line"; 14 + 15 + history.file_format = "sqlite"; 16 + history.isolation = true; 17 + 18 + use_kitty_protocol = true; 19 + }; 20 + 21 + environmentVariables = { 22 + EDITOR = "hx"; 23 + BAT_THEME = "ansi"; 24 + }; 25 + 26 + extraEnv = '' 27 + $env.NU_LIB_DIRS ++= ["${config.xdg.dataHome}/scripts/lib"] 28 + $env.PATH ++= ["${config.xdg.dataHome}/scripts/bin"] 29 + ''; 30 + }; 31 + }
+21
home/shell/ripgrep.nix
··· 1 + { 2 + programs.ripgrep = { 3 + enable = true; 4 + arguments = [ 5 + # limit line length 6 + "--max-columns=150" 7 + "--max-columns-preview" 8 + 9 + # also show hidden directories and files 10 + "--hidden" 11 + 12 + # ignore Git data 13 + "--glob=!.git/*" 14 + 15 + "--smart-case" 16 + 17 + # allow clicking on file names to open them 18 + "--hyperlink-format=kitty" 19 + ]; 20 + }; 21 + }
+54
home/shell/starship.nix
··· 1 + { 2 + programs.starship = { 3 + enable = true; 4 + enableNushellIntegration = true; 5 + settings = { 6 + 7 + # Inserts a blank line between shell prompts 8 + add_newline = true; 9 + 10 + character.success_symbol = ''[\$](bold green)''; 11 + character.error_symbol = ''[!](bold red)''; 12 + 13 + directory = { 14 + before_repo_root_style = ''bold cyan''; 15 + repo_root_style = ''bold cyan''; 16 + repo_root_format = ''[$before_root_path]($before_repo_root_style)[ $repo_root]($repo_root_style)[$path]($style)[$read_only]($read_only_style) ''; 17 + }; 18 + 19 + gcloud.disabled = true; 20 + 21 + git_branch = { 22 + symbol = "🌱 "; 23 + truncation_length = 10; 24 + truncation_symbol = "~"; 25 + ignore_branches = [ 26 + "master" 27 + "main" 28 + ]; 29 + }; 30 + 31 + git_status = { 32 + style = ''blue''; 33 + conflicted = ''[!$count ](bold red)''; 34 + untracked = ''[+$count ](red)''; 35 + stashed = ''[󰆓$count ](yellow)''; 36 + modified = ''[✴$count ](red)''; 37 + deleted = ''[-$count ](red)''; 38 + renamed = ''[→$count ](red)''; 39 + staged = ''[•$count ](bold yellow)''; 40 + ahead = ''⇡ $count ''; 41 + diverged = ''⇡ $ahead_count ⇣ $behind_count ''; 42 + behind = ''⇣ $count ''; 43 + format = ''[$all_status$ahead_behind]($style)''; 44 + }; 45 + 46 + git_metrics.disabled = true; 47 + 48 + env_var.SECRETS_LOADED = { 49 + format = "with 🔑 [$env_value secrets]($style) "; 50 + style = "bold dimmed"; 51 + }; 52 + }; 53 + }; 54 + }
keychron_k8_pro_ansi_rgb.layout.json resources/keychron_k8_pro_ansi_rgb.layout.json
plymouth-cat/package.nix packages/plymouth-cat/package.nix
+88
resources/scripts/bin/change-wallpaper
··· 1 + #!/usr/bin/env nu 2 + 3 + use vlog 4 + 5 + let WALLPAPER_LOCATION = $"($env.HOME)/.cache/current_wallpaper" 6 + let LOCK_WALLPAPER_LOCATION = $"($env.HOME)/.cache/hyprlock_wallpaper.jpg" 7 + let BLUR_WALLPAPER_LOCATION = $"($env.HOME)/.cache/blurred_wallpaper.jpg" 8 + let WALLPAPER_FOLDER = $"($env.HOME)/Wallpapers" 9 + 10 + # Links the new wallpaper to the wallpaper cache, converts it to JPG for the lock screen if 11 + # necessary, and cleans up previous wallpaper if needed. 12 + def prepare-wallpaper [path: string] { 13 + # Clean up existing links/caches 14 + if ($LOCK_WALLPAPER_LOCATION | path exists) { 15 + vlog debug $"󰒜 Removing lock-screen wallpaper from ($LOCK_WALLPAPER_LOCATION)..." 16 + rm $LOCK_WALLPAPER_LOCATION 17 + } 18 + 19 + if ($BLUR_WALLPAPER_LOCATION | path exists) { 20 + vlog debug $"󰒜 Removing blurred wallpaper from ($BLUR_WALLPAPER_LOCATION)..." 21 + rm $BLUR_WALLPAPER_LOCATION 22 + } 23 + 24 + if ($WALLPAPER_LOCATION | path exists) { 25 + vlog debug $"󰒜 Removing wallpaper link from ($WALLPAPER_LOCATION)..." 26 + rm $WALLPAPER_LOCATION 27 + } 28 + 29 + # Determine if we have to use the "first frame" when converting to JPEG or not 30 + let wallpaperFileType = file --brief --dereference --mime $path 31 + if ($wallpaperFileType | str index-of 'image/gif') != -1 { 32 + # "index into" first frame of the GIF 33 + vlog debug $"🎥 Converting GIF to JPG..." 34 + magick $"($path)[0]" $LOCK_WALLPAPER_LOCATION 35 + } else { 36 + vlog debug $"👨‍🎨 Converting image to JPG..." 37 + magick $"($path)" $LOCK_WALLPAPER_LOCATION 38 + } 39 + 40 + # Link to new location 41 + vlog debug $"🔗 Linking new wallpaper..." 42 + ln -fs $path $WALLPAPER_LOCATION 43 + } 44 + 45 + # Switches the wallpaper to the prepared wallpaper. 46 + def switch-wallpaper [--transition-type (-t): string = "random", --filter (-f): string = "Nearest"] { 47 + vlog info "🌆 Transitioning wallpaper..." 48 + let params = [ 49 + "img", 50 + $"--transition-type=($transition_type)", 51 + $"--filter=($filter)", 52 + $WALLPAPER_LOCATION 53 + ] 54 + vlog debug $"Params: ($params | to json -r)" 55 + swww ...$params 56 + } 57 + 58 + # Returns a random file from the directory. 59 + def random-file [dir: string] { 60 + vlog info "🎲 Selecting random wallpaper..." 61 + let files = ls $dir 62 + let idx = random int 0..(($files | length) - 1) 63 + 64 + $files | get $idx 65 + } 66 + 67 + def set-wallpaper [path: string, --filter (-f): string = "Nearest"] { 68 + prepare-wallpaper $path 69 + switch-wallpaper --filter=($filter) 70 + } 71 + 72 + def "main set" [path: string, --filter (-f): string = "Nearest"] { 73 + vlog timed "Wallpaper change" { 74 + set-wallpaper $path 75 + } 76 + } 77 + 78 + def "main random" [] { 79 + vlog timed "Random wallpaper" { 80 + let wallpaper = random-file $WALLPAPER_FOLDER 81 + vlog debug $"Selected ($wallpaper.name) for new wallpaper." 82 + set-wallpaper $wallpaper.name 83 + } 84 + } 85 + 86 + def main [] { 87 + help main 88 + }
+4
resources/scripts/bin/kctx
··· 1 + #!/usr/bin/env nu 2 + 3 + # Switch the Kubernetes context with the magic of FZF. 4 + kubectl config use-context (kubectl config get-contexts -o=name | fzf --height=30% --reverse)
+48
resources/scripts/bin/manage-system
··· 1 + #!/usr/bin/env nu 2 + 3 + use vlog 4 + 5 + let FLAKE_DIR = $"($env.HOME)/Code/dotfiles" 6 + let SYSTEM_NAME = "starlight" 7 + let FLAKE_NAME = $"($FLAKE_DIR)#($SYSTEM_NAME)" 8 + 9 + # Update the Nix flake version. 10 + def "main update" [] { 11 + vlog info $"🚚 Updating flake ($FLAKE_NAME)..." 12 + vlog timed "Update" { 13 + nix flake update --flake $FLAKE_DIR 14 + } 15 + } 16 + 17 + # Build a new derivation and switch to it. 18 + def "main rebuild" [] { 19 + vlog timed "Rebuild" { 20 + vlog info $"🏠 Building flake ($FLAKE_NAME)..." 21 + sudo nixos-rebuild --flake $FLAKE_NAME --impure switch 22 + } 23 + } 24 + 25 + # Clean up garbage and optimise Nix store. (Most of the time this should happen automatically, 26 + # though.) 27 + def "main clean-up" [] { 28 + vlog timed "Clean-up" { 29 + vlog info "♻ Running garbage collection..." 30 + sudo nix-collect-garbage --delete-old 31 + } 32 + } 33 + 34 + # Show the latest logs for a (root) systemd unit in reverse chronological order. 35 + def "main inspect" [service: string, --root (-r)] { 36 + vlog info $"🤨 Inspecting ($service)..." 37 + vlog timed "Service inspection" { 38 + if $root { 39 + sudo journalctl -u $service --reverse --since="15m ago" 40 + } else { 41 + journalctl --user -u $service --reverse --since="15m ago" 42 + } 43 + } 44 + } 45 + 46 + def main [] { 47 + help main 48 + }
+35
resources/scripts/bin/screen-lock
··· 1 + #!/usr/bin/env nu 2 + 3 + use vlog 4 + 5 + def lock [] { 6 + if (pidof hyprlock | complete).exit_code == 0 { 7 + vlog warn "🔒 Screen already locked; exiting." 8 + return # we are already running hyprlock 9 + } 10 + $env.LC_TIME = "en_GB.UTF8" # don't localize date names... 11 + makoctl mode -a locked 12 + 13 + hyprlock # Block until we unlock 14 + 15 + after-unlock 16 + } 17 + 18 + def after-unlock [] { 19 + makoctl mode -r locked 20 + vlog info "🔓 After-unlock triggered." 21 + } 22 + 23 + # Lock the screen, if it is not already locked. 24 + def "main lock" [] { 25 + lock 26 + } 27 + 28 + # Send a signal to unlock the screen. 29 + def "main unlock" [] { 30 + pkill -SIGUSR1 "hyprlock" 31 + } 32 + 33 + def main [] { 34 + help main 35 + }
+21
resources/scripts/lib/pm/mod.nu
··· 1 + # "Project manager" 2 + 3 + # List all projects (directories under ~/Code) 4 + export def list [] { 5 + ls -s $"($env.HOME)/Code" | sort-by -r modified | get name 6 + } 7 + 8 + # Change to a project directory (directory under ~/Code). 9 + export def --env go [dir: string@list] { 10 + cd $"($env.HOME)/Code/($dir)" 11 + } 12 + 13 + # Open the project in $EDITOR 14 + export def edit [dir: string@list] { 15 + run-external $env.EDITOR $"($env.HOME)/Code/($dir)" 16 + } 17 + 18 + # Load the project's .env file as env variables 19 + export def --env dotenv [] { 20 + nuopen .env | from toml | load-env 21 + }
screenshot-clean.png resources/screenshot-clean.png
screenshot-dirty.png resources/screenshot-dirty.png
+12 -10
system.nix machines/starlight/default.nix
··· 9 9 -b 'Poweroff' 'systemctl poweroff' \ 10 10 -b 'Reboot' 'systemctl reboot' 11 11 ''; 12 - plymouthCat = pkgs.callPackage ./plymouth-cat/package.nix { }; 12 + plymouthCat = pkgs.callPackage ../../packages/plymouth-cat/package.nix { }; 13 13 in 14 14 { 15 15 imports = [ ··· 349 349 "ivan" 350 350 ]; 351 351 352 - # Additional binary caches 353 - extra-substituters = [ 354 - "https://walker.cachix.org" 355 - "https://walker-git.cachix.org" 356 - ]; 357 - extra-trusted-public-keys = [ 358 - "walker.cachix.org-1:fG8q+uAaMqhsMxWjwvk0IMb4mFPFLqHjuvfwQxE4oJM=" 359 - "walker-git.cachix.org-1:vmC0ocfPWh0S/vRAQGtChuiZBTAe4wiKDeyyXM0/7pM=" 360 - ]; 352 + # # Additional binary caches 353 + # # Disabled temporarily because it gets queried for everything which is 354 + # # not necessarily what I want 355 + # extra-substituters = [ 356 + # "https://walker.cachix.org" 357 + # "https://walker-git.cachix.org" 358 + # ]; 359 + # extra-trusted-public-keys = [ 360 + # "walker.cachix.org-1:fG8q+uAaMqhsMxWjwvk0IMb4mFPFLqHjuvfwQxE4oJM=" 361 + # "walker-git.cachix.org-1:vmC0ocfPWh0S/vRAQGtChuiZBTAe4wiKDeyyXM0/7pM=" 362 + # ]; 361 363 }; 362 364 363 365 # Maybe?