my over complex system configurations dotfiles.isabelroses.com/
nixos nix flake dotfiles linux
9
fork

Configure Feed

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

refactor!: remove robin

isabel 70bec368 3d4357cd

-4377
-5
.github/CODEOWNERS
··· 1 1 # make me own it allllll 2 2 * @isabelroses 3 - 4 - # give comfysage all the things she wants 5 - /home/robin/* @comfysage 6 - /systems/cottage/* @comfysage 7 - /systems/wisp/* @comfysage
-6
.sops.yaml
··· 1 1 keys: 2 2 - &isabel ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMQDiHbMSinj8twL9cTgPOfI6OMexrTZyHX27T8gnMj2 3 - - &robin age15sejxcynw44vgsee5znxvq7vtuust686wn4f3u0upp42zay6ugqqp5lvv8 4 3 5 4 - &minerva ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAomF8O3ZqZBpLRlAkS1+FwRllSMrREHtndw07trrfcA 6 5 - &skadi ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKV3N2r1cX3kZMHxuJYaFsjWJRtik/2b/KZ5ru38IqAT ··· 12 11 key_groups: 13 12 - age: 14 13 - *isabel 15 - 16 - - path_regex: secrets/robin\.yaml 17 - key_groups: 18 - - age: 19 - - *robin 20 14 21 15 - path_regex: secrets/services/[^/]+\.(yaml|json|env|ini)$ 22 16 key_groups:
-2
docs/src/design/layout.md
··· 4 4 | --------- | --------- | ------- | ----- | ------------- | 5 5 | amaterasu | isabel | Desktop | NixOS | A powerful desktop dual booting windows 11 | 6 6 | athena | isabel | Hybrid | NixOS | My oldest laptop, altogh this flake still supports it, its barely in use | 7 - | bmo | robin | Laptop | NixOS | Robin's laptop | 8 7 | aphrodite | isabel | Sever | NixOS | The host of most tgirl.cloud services | 9 8 | lilith | n/a | Iso | NixOS | An iso image of my NixOS configuration, used to install NixOS on new systems | 10 9 | minerva | isabel | Server | NixOS | This is the orginal server, hosting most of my personal services | 11 10 | skadi | isabel | Server | NixOS | Oracle free server, mostly used for the pds and aarch64 builds | 12 11 | tatsumaki | isabel | Laptop | macOS | A macbook air, given to me by uni, almost exclusively used at uni | 13 12 | valkyrie | isabel | WSL2 | NixOS | This is my WSL2 instance, installed on amaterasu | 14 - | wisp | robin | WSL2 | NixOS | Robin's WSL2 instance, installed on her desktop | 15 13 16 14 17 15 ### 🧩 Modules
-17
home/robin/cli/atuin.nix
··· 1 - { config, ... }: 2 - { 3 - programs.atuin = { 4 - inherit (config.garden.profiles.workstation) enable; 5 - 6 - flags = [ "--disable-up-arrow" ]; 7 - settings = { 8 - dialect = "uk"; 9 - show_preview = true; 10 - inline_height = 30; 11 - style = "compact"; 12 - update_check = false; 13 - sync_address = "https://atuin.isabelroses.com"; 14 - sync_frequency = "5m"; 15 - }; 16 - }; 17 - }
-14
home/robin/cli/bat.nix
··· 1 - { config, ... }: 2 - let 3 - inherit (config.garden.programs) defaults; 4 - in 5 - { 6 - programs.bat = { 7 - inherit (config.garden.profiles.workstation) enable; 8 - 9 - config = { 10 - inherit (defaults) pager; 11 - style = "plain"; 12 - }; 13 - }; 14 - }
-20
home/robin/cli/default.nix
··· 1 - { 2 - imports = [ 3 - ./shell 4 - ./atuin.nix 5 - ./bat.nix 6 - ./eza.nix 7 - ./fd.nix 8 - ./fzf.nix 9 - ./gh.nix 10 - ./git.nix 11 - ./goc.nix 12 - ./jj.nix 13 - ./nix-your-shell.nix 14 - ./ripgrep.nix 15 - ./starship.nix 16 - ./typst.nix 17 - ./zk.nix 18 - ./zoxide.nix 19 - ]; 20 - }
-20
home/robin/cli/eza.nix
··· 1 - { config, ... }: 2 - { 3 - programs.eza = { 4 - inherit (config.garden.profiles.workstation) enable; 5 - icons = "auto"; 6 - 7 - enableNushellIntegration = false; 8 - 9 - extraOptions = [ 10 - "-l" 11 - "-a" 12 - "--group" 13 - "--group-directories-first" 14 - "--no-user" 15 - "--no-time" 16 - "--no-permissions" 17 - "--octal-permissions" 18 - ]; 19 - }; 20 - }
-12
home/robin/cli/fd.nix
··· 1 - { config, ... }: 2 - { 3 - programs.fd = { 4 - inherit (config.garden.profiles.workstation) enable; 5 - 6 - hidden = true; 7 - ignores = [ 8 - ".git/" 9 - "*.bak" 10 - ]; 11 - }; 12 - }
-42
home/robin/cli/fzf.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) getExe mapAttrsToList; 9 - 10 - find = "${getExe pkgs.fd} --type=f --hidden --exclude=.git"; 11 - in 12 - { 13 - programs.fzf = { 14 - inherit (config.garden.profiles.workstation) enable; 15 - 16 - defaultCommand = find; 17 - defaultOptions = 18 - (mapAttrsToList (n: v: "--${n}='${v}'") { 19 - margin = "0"; 20 - padding = "0"; 21 - height = "14"; 22 - layout = "reverse-list"; 23 - info = "inline-right"; 24 - preview-window = "border-rounded"; 25 - prompt = " "; 26 - pointer = ""; 27 - marker = "│"; 28 - separator = "─"; 29 - scrollbar = "│"; 30 - }) 31 - ++ [ "--no-separator" ]; 32 - 33 - fileWidgetCommand = find; 34 - fileWidgetOptions = [ "--preview 'head {}'" ]; 35 - 36 - changeDirWidgetCommand = "${getExe pkgs.fd} --type=d --hidden --exclude=.git"; 37 - 38 - changeDirWidgetOptions = [ 39 - "--preview 'tree -C {} | head -200'" 40 - ]; 41 - }; 42 - }
-13
home/robin/cli/gh.nix
··· 1 - { config, ... }: 2 - { 3 - config = { 4 - programs.gh = { 5 - enable = config.programs.git.enable && config.garden.profiles.workstation.enable; 6 - 7 - settings = { 8 - git_protocol = "ssh"; 9 - prompt = "enabled"; 10 - }; 11 - }; 12 - }; 13 - }
-175
home/robin/cli/git.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - self, 5 - config, 6 - ... 7 - }: 8 - let 9 - inherit (lib) mkIf mkMerge map; 10 - inherit (self.lib) giturl; 11 - inherit (lib.hm.dag) entryBefore; 12 - 13 - cfg = config.programs.git; 14 - in 15 - { 16 - config = mkIf cfg.enable (mkMerge [ 17 - (mkIf config.garden.profiles.workstation.enable { 18 - garden.packages = { 19 - inherit (pkgs) 20 - gist # manage github gists 21 - # act # local github actions - littrally does not work 22 - gitflow # Extend git with the Gitflow branching model 23 - ; 24 - }; 25 - }) 26 - 27 - # `programs.git` will generate the config file: ~/.config/git/config 28 - # to make git use this config file, `~/.gitconfig` should not exist! 29 - (mkIf pkgs.stdenv.hostPlatform.isDarwin { 30 - home.activation = { 31 - removeExistingGitconfig = entryBefore [ "checkLinkTargets" ] '' 32 - rm -f ~/.gitconfig 33 - ''; 34 - }; 35 - }) 36 - 37 - { 38 - programs.git = { 39 - package = pkgs.gitMinimal; 40 - userName = "robin"; 41 - userEmail = "comfysage" + "@" + "isabelroses" + "." + "com"; 42 - 43 - signing = { 44 - format = "ssh"; 45 - signByDefault = true; 46 - }; 47 - 48 - delta = { 49 - enable = true; 50 - 51 - options = { 52 - navigate = true; 53 - side-by-side = true; 54 - line-numbers = true; 55 - }; 56 - }; 57 - 58 - aliases = { 59 - index = "status -s"; 60 - graph = "log --oneline --graph"; 61 - ahead = "!git log --oneline @{u}..HEAD | grep -cE '.*'"; 62 - 63 - changelog = "-c pager.show=false show --format=' - %C(yellow)%h%C(reset) %<(80,trunc)%s' -q @@{1}..@@{0}"; 64 - amend = "commit --amend"; 65 - 66 - fpush = "push --force-with-lease"; 67 - 68 - # stash 69 - spush = "stash push -a"; 70 - spop = "stash pop -q"; 71 - }; 72 - 73 - ignores = [ 74 - # system residue 75 - ".cache/" 76 - ".DS_Store" 77 - ".Trashes" 78 - ".Trash-*" 79 - "*.bak" 80 - "*.swp" 81 - "*.swo" 82 - "*.elc" 83 - ".~lock*" 84 - 85 - # build residue 86 - "tmp/" 87 - "target/" 88 - "result" 89 - "result-*" 90 - "*.exe" 91 - "*.exe~" 92 - "*.dll" 93 - "*.so" 94 - "*.dylib" 95 - 96 - # ide residue 97 - ".idea/" 98 - ".vscode/" 99 - 100 - # dependencies 101 - ".direnv/" 102 - "node_modules" 103 - "vendor" 104 - ]; 105 - 106 - extraConfig = { 107 - core.editor = config.garden.programs.defaults.editor; 108 - 109 - # Qol 110 - color.ui = "auto"; 111 - 112 - diff = { 113 - algorithm = "histogram"; # a much better diff 114 - colorMoved = "plain"; # show moved lines in a different color 115 - }; 116 - 117 - safe.directory = "*"; 118 - # add some must-use flags 119 - pull.rebase = true; 120 - rebase = { 121 - autoSquash = true; 122 - autoStash = true; 123 - }; 124 - merge.ff = "only"; 125 - push.autoSetupRemote = true; 126 - 127 - gpg.format = "ssh"; 128 - user.signingkey = "~/.ssh/keys.github.id_ed25519"; 129 - # personal preference 130 - init.defaultBranch = "main"; 131 - # prevent data corruption 132 - transfer.fsckObjects = true; 133 - fetch.fsckObjects = true; 134 - receive.fsckObjects = true; 135 - 136 - url = mkMerge ( 137 - map giturl [ 138 - { 139 - domain = "github.com"; 140 - alias = "github"; 141 - } 142 - { 143 - domain = "gitlab.com"; 144 - alias = "gitlab"; 145 - } 146 - { 147 - domain = "aur.archlinux.org"; 148 - alias = "aur"; 149 - user = "aur"; 150 - } 151 - { 152 - domain = "git.sr.ht"; 153 - alias = "srht"; 154 - } 155 - { 156 - domain = "codeberg.org"; 157 - alias = "codeberg"; 158 - } 159 - { 160 - domain = "git.isabelroses.com"; 161 - alias = "izzy"; 162 - port = 2222; 163 - } 164 - { 165 - domain = "git.auxolotl.org"; 166 - alias = "aux"; 167 - user = "forgejo"; 168 - } 169 - ] 170 - ); 171 - }; 172 - }; 173 - } 174 - ]); 175 - }
-16
home/robin/cli/goc.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - in 10 - { 11 - config = mkIf config.programs.git.enable { 12 - garden.packages = { 13 - inherit (pkgs) cocogitto; 14 - }; 15 - }; 16 - }
-163
home/robin/cli/jj.nix
··· 1 - { 2 - inputs, 3 - config, 4 - ... 5 - }: 6 - { 7 - programs.jujutsu = { 8 - enable = config.programs.git.enable && config.garden.profiles.workstation.enable; 9 - 10 - settings = { 11 - user = { 12 - name = config.programs.git.userName; 13 - email = config.programs.git.userEmail; 14 - }; 15 - 16 - signing = { 17 - behavior = "own"; 18 - backend = "ssh"; 19 - key = "~/.ssh/keys.github.id_ed25519"; 20 - }; 21 - 22 - aliases = { 23 - # initialize an empty git repo 24 - init = [ 25 - "git" 26 - "init" 27 - "--colocate" 28 - ]; 29 - 30 - # create named bookmark at HEAD 31 - name = [ 32 - "bookmark" 33 - "create" 34 - "-r" 35 - "head" 36 - ]; 37 - # update bookmark <arg> to point to HEAD 38 - update = [ 39 - "bookmark" 40 - "move" 41 - "--to" 42 - "head" 43 - ]; 44 - # pull up the nearest bookmarks to the last described commit 45 - tug = [ 46 - "bookmark" 47 - "move" 48 - "--from" 49 - "curbranch" 50 - "--to" 51 - "latest" 52 - ]; 53 - 54 - # push the nearest bookmark 55 - push = [ 56 - "git" 57 - "push" 58 - "-r" 59 - "curbranch" 60 - ]; 61 - 62 - # pull incoming changes onto working branch 63 - pull = [ 64 - "rebase" 65 - "-d" 66 - "trunk()" 67 - "--skip-emptied" 68 - ]; 69 - }; 70 - 71 - "revset-aliases" = { 72 - "head" = "git_head()"; 73 - "latest" = "latest(curbranch:: ~ bases:: ~ empty())"; 74 - 75 - "bases" = "bookmarks() & empty()"; 76 - "downstream(x,y)" = "(x::y) & y"; 77 - "branches" = "downstream(trunk(), bookmarks() ~ empty())"; 78 - "heads" = "heads(trunk()::)"; 79 - "leafs" = "branches | heads"; 80 - "curbranch" = "latest(branches::@- & branches)"; 81 - "nextbranch" = "roots(@:: & branchesandheads)"; 82 - }; 83 - 84 - ui = { 85 - default-command = "status"; 86 - diff-editor = "nvim-hunk"; 87 - merge-editor = "nvim-hunk"; 88 - }; 89 - 90 - templates = { 91 - log = "custom_log_compact"; 92 - }; 93 - 94 - template-aliases = { 95 - # custom components 96 - "format_short_signature(signature)" = "signature.email().local()"; 97 - "format_timestamp(timestamp)" = "timestamp.local().format('%Y%m%d %I:%M %P')"; 98 - "format_custom_commit_header(commit)" = '' 99 - separate(" ", 100 - format_short_change_id_with_hidden_and_divergent_info(commit), 101 - format_short_commit_id(commit.commit_id()), 102 - commit.bookmarks(), 103 - commit.tags(), 104 - commit.working_copies(), 105 - if(commit.git_head(), label("git_head", "git_head()")), 106 - label("separator", "|"), 107 - if(commit.conflict(), label("conflict", "conflict")), 108 - format_short_signature(commit.author()), 109 - if(config("ui.show-cryptographic-signatures").as_boolean(), 110 - format_short_cryptographic_signature(commit.signature())), 111 - ) 112 - ''; 113 - 114 - # custom templates 115 - "custom_log_compact" = '' 116 - if(root, 117 - format_root_commit(self), 118 - label(if(current_working_copy, "working_copy"), 119 - concat( 120 - format_custom_commit_header(self) ++ "\n", 121 - separate(" ", 122 - if(empty, label("empty", "(empty)")), 123 - if(description, 124 - description.first_line(), 125 - label(if(empty, "empty"), description_placeholder), 126 - ), 127 - ) ++ "\n", 128 - ), 129 - ) 130 - ) 131 - ''; 132 - }; 133 - 134 - merge-tools.nvim = { 135 - edit-args = [ 136 - "-d" 137 - "$left" 138 - "$right" 139 - ]; 140 - }; 141 - merge-tools.nvim-hunk = { 142 - program = "nvim"; 143 - edit-args = [ 144 - "-d" 145 - "$left" 146 - "$right" 147 - "$output" 148 - ]; 149 - }; 150 - 151 - colors = 152 - let 153 - inherit (config.evergarden) variant; 154 - palette = inputs.evergarden.lib.palette.${variant}; 155 - in 156 - { 157 - "working_copy commit_id" = "#${palette.overlay1}"; 158 - "working_copy empty" = "#${palette.overlay2}"; 159 - "working_copy empty description placeholder" = "#${palette.overlay2}"; 160 - }; 161 - }; 162 - }; 163 - }
-6
home/robin/cli/nix-your-shell.nix
··· 1 - { config, ... }: 2 - { 3 - programs.nix-your-shell = { 4 - inherit (config.garden.profiles.workstation) enable; 5 - }; 6 - }
-14
home/robin/cli/ripgrep.nix
··· 1 - { config, ... }: 2 - { 3 - programs.ripgrep = { 4 - inherit (config.garden.profiles.workstation) enable; 5 - 6 - # https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md#configuration-file 7 - arguments = [ 8 - "--max-columns=150" 9 - "--max-columns-preview" 10 - "--glob=!.git/*" 11 - "--smart-case" 12 - ]; 13 - }; 14 - }
-20
home/robin/cli/shell/bash.nix
··· 1 - { config, ... }: 2 - { 3 - programs.bash = { 4 - enable = true; 5 - enableCompletion = true; 6 - 7 - historyFile = "${config.xdg.stateHome}/bash/history"; 8 - historyFileSize = 1000; 9 - historySize = 100; 10 - shellOptions = [ 11 - "cdspell" 12 - "checkjobs" 13 - "checkwinsize" 14 - "dirspell" 15 - "globstar" 16 - "histappend" 17 - "no_empty_cmd_completion" 18 - ]; 19 - }; 20 - }
-8
home/robin/cli/shell/default.nix
··· 1 - { 2 - imports = [ 3 - ./bash.nix # bash configurations 4 - ./fish.nix # fish configurations 5 - ./shellAlias.nix # shell alias 6 - ./zsh.nix # zsh configurations 7 - ]; 8 - }
-127
home/robin/cli/shell/fish.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) 9 - getExe 10 - optionalString 11 - mapAttrs 12 - ; 13 - 14 - buildColors = 15 - opts: 16 - builtins.concatStringsSep "\n" ( 17 - builtins.attrValues (mapAttrs (name: value: "set fish_color_${name} ${value}") opts) 18 - ); 19 - in 20 - { 21 - programs.fish = { 22 - plugins = [ ]; 23 - 24 - functions = { 25 - bj = "nohup $argv </dev/null &>/dev/null &"; 26 - "." = '' 27 - set -l input $argv[1] 28 - if echo $input | grep -q '^[1-9][0-9]*$' 29 - set -l levels $input 30 - for i in (seq $levels) 31 - cd .. 32 - end 33 - else 34 - echo "Invalid input format. Please use '<number>' to go back a specific number of directories." 35 - end 36 - ''; 37 - }; 38 - 39 - loginShellInit = optionalString pkgs.stdenv.hostPlatform.isDarwin '' 40 - fish_add_path --move --prepend --path $HOME/.nix-profile/bin /run/wrappers/bin /etc/profiles/per-user/$USER/bin /run/current-system/sw/bin /nix/var/nix/profiles/default/bin 41 - ''; 42 - 43 - shellInit = '' 44 - # themeing 45 - set fish_greeting 46 - export "MICRO_TRUECOLOR=1" 47 - set -g theme_display_date no 48 - set -g theme_nerd_fonts yes 49 - set -g theme_newline_cursor yes 50 - 51 - set SHELL ${getExe config.programs.fish.package} 52 - '' 53 - + (buildColors { 54 - # default color 55 - normal = "brwhite"; 56 - 57 - # commands like echo 58 - command = "yellow"; 59 - 60 - # keywords like if - this falls back on the command color if unset 61 - keyword = "red"; 62 - 63 - # quoted text like "abc" 64 - quote = "green"; 65 - 66 - # IO redirections like >/dev/null 67 - redirection = "magenta"; 68 - 69 - # process separators like ; and & 70 - end = "brwhite"; 71 - 72 - # syntax errors 73 - error = "red"; 74 - 75 - # ordinary command parameters 76 - param = "teal"; 77 - 78 - # parameters that are filenames (if the file exists) 79 - valid_path = "brred"; 80 - 81 - # options starting with “-”, up to the first “--” parameter 82 - option = "teal"; 83 - 84 - # comments like ‘# important’ 85 - comment = "brwhite"; 86 - 87 - # selected text in vi visual mode 88 - # selection = ""; 89 - 90 - # parameter expansion operators like * and ~ 91 - operator = "brwhite"; 92 - 93 - # character escapes like \n and \x70 94 - escape = "teal"; 95 - 96 - # autosuggestions (the proposed rest of a command) 97 - autosuggestion = "brblack"; 98 - 99 - # the current working directory in the default prompt 100 - cwd = "yellow"; 101 - 102 - # the current working directory in the default prompt for the root user 103 - cwd_root = "blue"; 104 - 105 - # the username in the default prompt 106 - user = "green"; 107 - 108 - # the hostname in the default prompt 109 - host = "magenta"; 110 - 111 - # the hostname in the default prompt for remote sessions (like ssh) 112 - host_remote = "teal"; 113 - 114 - # the last command’s nonzero exit code in the default prompt 115 - status = "red"; 116 - 117 - # the ‘^C’ indicator on a canceled command 118 - cancel = "brblack"; 119 - 120 - # history search matches and selected pager items (background only) 121 - search_match = "brred"; 122 - 123 - # the current position in the history 124 - history_current = "brred"; 125 - }); 126 - }; 127 - }
-16
home/robin/cli/shell/shellAlias.nix
··· 1 - { 2 - # This configuration creates the shell aliases across: bash, zsh and fish 3 - home.shellAliases = { 4 - mkdir = "mkdir -pv"; # always create pearent directory 5 - df = "df -h"; # human readblity 6 - reboot = "systemctl reboot"; 7 - sysctl = "sudo systemctl"; 8 - jctl = "journalctl -p 3 -xb"; # get error messages from journalctl 9 - lg = "lazygit"; 10 - 11 - zzzpl = "cd ~/.local/share/zzz ; git pull ; git push ; cd -"; 12 - zzzbk = "cd ~/.local/share/zzz ; git add . ; git commit -m 'chore: sync changes' ; git push ; cd -"; 13 - 14 - vi = "$EDITOR"; 15 - }; 16 - }
-47
home/robin/cli/shell/zsh.nix
··· 1 - { lib, config, ... }: 2 - let 3 - inherit (lib) mkDefault mkOrder; 4 - in 5 - { 6 - programs.zsh = { 7 - enable = mkDefault (config.garden.programs.defaults.shell == "zsh"); 8 - autosuggestion.enable = true; 9 - enableCompletion = true; 10 - syntaxHighlighting.enable = true; 11 - 12 - dotDir = "${config.xdg.configHome}/zsh"; 13 - 14 - history = { 15 - path = config.xdg.stateHome + "/zsh/history"; 16 - }; 17 - 18 - initContent = mkOrder 1000 ( 19 - '' 20 - function title_precmd_hook() { 21 - print -Pn "\e]0;$(pwd)\a" 22 - } 23 - precmd_functions+=title_precmd_hook 24 - '' 25 - + '' 26 - cd-rotate(){ 27 - () { 28 - builtin emulate -L zsh 29 - while (( $#dirstack )) && ! builtin pushd -q $1 &>/dev/null; do 30 - builtin popd -q $1 31 - done 32 - (( $#dirstack )) 33 - } "$@" && builtin zle reset-prompt; 34 - } 35 - cd-back(){ cd-rotate -0; } 36 - cd-forward(){ cd-rotate +1; } 37 - builtin zle -N cd-back 38 - builtin zle -N cd-forward 39 - bindkey "^[[1;3D" cd-forward 40 - bindkey "^[[1;3C" cd-back 41 - '' 42 - + '' 43 - setopt autopushd 44 - '' 45 - ); 46 - }; 47 - }
-142
home/robin/cli/starship.nix
··· 1 - { config, ... }: 2 - let 3 - ss = symbol: style: { 4 - inherit symbol; 5 - format = "[$symbol ](${style})"; 6 - }; 7 - in 8 - { 9 - programs.starship = { 10 - inherit (config.garden.profiles.workstation) enable; 11 - 12 - settings = { 13 - add_newline = true; 14 - format = "$all$character"; 15 - 16 - character = { 17 - success_symbol = "[󰧟](green)"; 18 - error_symbol = "[󰧟](red)"; 19 - vimcmd_symbol = "[󰝦](bright-black)"; 20 - vimcmd_replace_one_symbol = "[r](bright-black)"; 21 - vimcmd_replace_symbol = "[R](bright-black)"; 22 - vimcmd_visual_symbol = "[󰝦](purple)"; 23 - }; 24 - 25 - username = { 26 - style_user = "bright-white"; 27 - style_root = "black"; 28 - format = "[$user]($style) "; 29 - show_always = true; 30 - }; 31 - 32 - directory = { 33 - truncation_length = 3; 34 - truncation_symbol = "…/"; 35 - home_symbol = "󰋞 "; 36 - read_only_style = "197"; 37 - read_only = "  "; 38 - style = "cyan"; 39 - format = "[$path]($style)[$read_only]($read_only_style) "; 40 - truncate_to_repo = true; 41 - before_repo_root_style = ""; 42 - repo_root_style = "cyan"; 43 - repo_root_format = "[\\[$repo_root\\]]($repo_root_style) [$path]($style)[$read_only]($read_only_style) "; 44 - 45 - substitutions = { 46 - "󰋞 /Documents" = "󰈙 "; 47 - "󰋞 /documents" = "󰈙 "; 48 - 49 - "󰋞 /Downloads" = " "; 50 - "󰋞 /downloads" = " "; 51 - 52 - "󰋞 /media/music" = " "; 53 - "󰋞 /media/pictures" = " "; 54 - "󰋞 /media/videos" = " "; 55 - "󰋞 /Music" = " "; 56 - "󰋞 /Pictures" = " "; 57 - "󰋞 /Videos" = " "; 58 - 59 - "󰋞 /dev" = "󱌢 "; 60 - "󰋞 /Dev" = "󱌢 "; 61 - 62 - "󰋞 /skl" = "󰑴 "; 63 - "󰋞 /.config" = " "; 64 - }; 65 - }; 66 - 67 - os = { 68 - style = "bold white"; 69 - format = "[$symbol]($style)"; 70 - 71 - symbols = { 72 - Arch = ""; 73 - Artix = ""; 74 - Debian = ""; 75 - # Kali = "󰠥"; 76 - EndeavourOS = ""; 77 - Fedora = ""; 78 - NixOS = ""; 79 - openSUSE = ""; 80 - SUSE = ""; 81 - Ubuntu = ""; 82 - Raspbian = ""; 83 - #elementary = ""; 84 - #Coreos = ""; 85 - Gentoo = ""; 86 - #mageia = "" 87 - CentOS = ""; 88 - #sabayon = ""; 89 - #slackware = ""; 90 - Mint = ""; 91 - Alpine = ""; 92 - #aosc = ""; 93 - #devuan = ""; 94 - Manjaro = ""; 95 - #rhel = ""; 96 - Macos = "󰀵"; 97 - Linux = ""; 98 - Windows = ""; 99 - }; 100 - }; 101 - 102 - container = ss " 󰏖" "yellow dimmed"; 103 - python = ss "" "yellow"; 104 - nodejs = ss " " "yellow"; 105 - lua = ss "󰢱 " "blue"; 106 - rust = ss "" "red"; 107 - java = ss " " "red"; 108 - c = ss " " "blue"; 109 - golang = ss "" "blue"; 110 - docker_context = ss " " "blue"; 111 - 112 - nix_shell = ss "@devshell" "blue"; 113 - 114 - git_branch = { 115 - symbol = "󰘬 "; 116 - format = "[$symbol $branch]($style) "; 117 - truncation_length = 4; 118 - truncation_symbol = "…/"; 119 - style = "purple"; 120 - }; 121 - git_status = { 122 - format = "[$all_status$ahead_behind]($style) "; 123 - style = "bold green"; 124 - conflicted = "="; 125 - up_to_date = "󰄬 "; 126 - untracked = "? "; 127 - ahead = "⇡\${count}"; 128 - diverged = "⇕⇡\${ahead_count}⇣\${behind_count}"; 129 - behind = "⇣\${count}"; 130 - stashed = "󰏗 "; 131 - modified = "M "; 132 - staged = "[++\\($count\\)](green)"; 133 - renamed = " "; 134 - deleted = " "; 135 - disabled = true; 136 - }; 137 - 138 - battery.disabled = true; 139 - cmd_duration.disabled = true; 140 - }; 141 - }; 142 - }
-16
home/robin/cli/typst.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - in 10 - { 11 - config = mkIf config.garden.profiles.workstation.enable { 12 - garden.packages = { 13 - inherit (pkgs) typst; 14 - }; 15 - }; 16 - }
-73
home/robin/cli/zk.nix
··· 1 - { 2 - lib, 3 - config, 4 - ... 5 - }: 6 - let 7 - inherit (lib) mkIf; 8 - 9 - inherit (config.garden.programs) defaults; 10 - in 11 - { 12 - config = mkIf config.garden.profiles.workstation.enable { 13 - programs = { 14 - bat.enable = lib.mkDefault true; 15 - 16 - zk = { 17 - enable = true; 18 - settings = { 19 - note = { 20 - # The default title used for new note, if no `--title` flag is provided. 21 - default-title = "untitled"; 22 - 23 - # The charset used for random IDs. You can use: 24 - # * letters: only letters from a to z. 25 - # * numbers: 0 to 9 26 - # * alphanum: letters + numbers 27 - # * hex: hexadecimal, from a to f and 0 to 9 28 - # * custom string: will use any character from the provided value 29 - id-charset = "hex"; 30 - 31 - # Length of the generated IDs. 32 - id-length = 8; 33 - }; 34 - 35 - tool = { 36 - inherit (defaults) editor pager; 37 - 38 - # Command used to preview a note during interactive fzf mode. 39 - # Set it to an empty string "" to disable preview. 40 - fzf-preview = "bat -p --color always {-1}"; 41 - }; 42 - 43 - alias = { 44 - list = "zk list --quiet -f oneline $@"; 45 - ls = "zk list $@"; 46 - wc = "zk list --sort word-count $@"; 47 - 48 - search = "zk list -i $@"; 49 - 50 - # Edit the last modified note. 51 - editlast = "zk edit --limit 1 --sort modified- $@"; 52 - 53 - # Edit the notes selected interactively among the notes created the last two weeks. 54 - # This alias doesn't take any argument, so we don't use $@. 55 - recent = "zk edit --sort created- --created-after 'last two weeks' --interactive"; 56 - 57 - # Print paths separated with colons for the notes found with the given 58 - # arguments. This can be useful to expand a complex search query into a flag 59 - # taking only paths. For example: 60 - # zk list --link-to "`zk path -m potato`" 61 - path = "zk list --quiet --format {{path}} --delimiter , $@"; 62 - 63 - # Returns the Git history for the notes found with the given arguments. 64 - # Note the use of a pipe and the location of $@. 65 - hist = "zk list --format path --delimiter0 --quiet $@ | xargs -t -0 git log --patch --"; 66 - 67 - tags = "zk tag list $@"; 68 - }; 69 - }; 70 - }; 71 - }; 72 - }; 73 - }
-8
home/robin/cli/zoxide.nix
··· 1 - { config, ... }: 2 - { 3 - programs.zoxide = { 4 - inherit (config.garden.profiles.workstation) enable; 5 - 6 - options = [ "--cmd cd" ]; 7 - }; 8 - }
-11
home/robin/default.nix
··· 1 - { 2 - imports = [ 3 - ./cli # command line interface app confurations 4 - ./gui # graphical interface app confurations 5 - ./system # important system environment config 6 - ./services # system services, organized by display protocol 7 - ./themes # Application themeing 8 - ./tui # terminal interface app confurations 9 - ./packages.nix # system packages 10 - ]; 11 - }
-18
home/robin/gui/aseprite.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - in 10 - { 11 - config = 12 - mkIf (config.garden.profiles.graphical.enable && config.garden.profiles.workstation.enable) 13 - { 14 - garden.packages = { 15 - inherit (pkgs) aseprite; 16 - }; 17 - }; 18 - }
-36
home/robin/gui/cava.nix
··· 1 - { 2 - lib, 3 - config, 4 - inputs, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - inherit (config.evergarden) variant; 10 - palette = inputs.evergarden.lib.palette.${variant}; 11 - in 12 - { 13 - config = mkIf config.garden.profiles.graphical.enable { 14 - programs.cava = { 15 - enable = true; 16 - settings = { 17 - 18 - general = { 19 - bar_width = 2; 20 - bar_spacing = 0; 21 - sensitivity = 80; 22 - }; 23 - color = { 24 - gradient = 1; 25 - gradient_count = 6; 26 - gradient_color_1 = "'#${palette.skye}'"; 27 - gradient_color_2 = "'#${palette.aqua}'"; 28 - gradient_color_3 = "'#${palette.green}'"; 29 - gradient_color_4 = "'#${palette.lime}'"; 30 - gradient_color_5 = "'#${palette.yellow}'"; 31 - gradient_color_6 = "'#${palette.orange}'"; 32 - }; 33 - }; 34 - }; 35 - }; 36 - }
-7
home/robin/gui/chromium.nix
··· 1 - { 2 - programs.chromium = { 3 - extensions = [ 4 - "pihphjfnfjmdbhakhjifipfdgbpenobg" # DocsAfterDark 5 - ]; 6 - }; 7 - }
-23
home/robin/gui/cosmic-files.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - in 10 - { 11 - config = 12 - mkIf 13 - ( 14 - config.garden.profiles.graphical.enable 15 - && config.garden.profiles.workstation.enable 16 - && config.garden.programs.defaults.fileManager == "cosmic-files" 17 - ) 18 - { 19 - garden.packages = { 20 - inherit (pkgs) cosmic-files; 21 - }; 22 - }; 23 - }
-20
home/robin/gui/default.nix
··· 1 - { 2 - imports = [ 3 - ./aseprite.nix 4 - ./hyprland 5 - ./cava.nix 6 - ./chromium.nix 7 - ./cosmic-files.nix 8 - ./discord 9 - ./dunst.nix 10 - ./firefox.nix 11 - ./ghostty.nix 12 - ./obsidian.nix 13 - ./quickshell.nix 14 - ./satty.nix 15 - ./spotify.nix 16 - ./wezterm 17 - ./zed.nix 18 - ./zen-browser.nix 19 - ]; 20 - }
-30
home/robin/gui/discord/default.nix
··· 1 - { 2 - lib, 3 - config, 4 - osConfig, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf mkMerge; 9 - 10 - vencordSettings = "${flakePath}/home/${username}/gui/discord/vencord.json"; 11 - 12 - inherit (osConfig.garden.environment) flakePath; 13 - inherit (config.home) username; 14 - in 15 - { 16 - config = mkIf config.programs.discord.enable (mkMerge [ 17 - { 18 - programs.discord = { 19 - moonlight = { 20 - enable = true; 21 - settings = import ./moonlight.nix { inherit config; }; 22 - }; 23 - vencord = { 24 - settings = vencordSettings; 25 - }; 26 - settings = import ./settings.nix; 27 - }; 28 - } 29 - ]); 30 - }
-179
home/robin/gui/discord/moonlight.nix
··· 1 - { config }: 2 - let 3 - evcfg = config.evergarden; 4 - in 5 - { 6 - extensions = { 7 - moonbase = true; 8 - disableSentry = true; 9 - noTrack = true; 10 - noHideToken = true; 11 - alwaysFocus = { 12 - enabled = false; 13 - }; 14 - betterCodeblocks = { 15 - enabled = true; 16 - }; 17 - betterEmbedsYT = { 18 - enabled = true; 19 - }; 20 - callIdling = { 21 - enabled = true; 22 - }; 23 - callTimer = { 24 - enabled = true; 25 - }; 26 - clearUrls = { 27 - enabled = true; 28 - }; 29 - cloneExpressions = { 30 - enabled = true; 31 - }; 32 - moonlight-css = { 33 - enabled = true; 34 - config = { 35 - cssPath = "/home/robin/.config/moonlight-mod/themes/"; 36 - recurseDirectory = false; 37 - fileSelector = ".*\\.theme\\.css"; 38 - paths = [ 39 - "/home/robin/.config/moonlight-mod/themes/" 40 - "@dark https://everviolet.github.io/discord/themes/evergarden-${evcfg.variant}-${evcfg.accent}.theme.css" 41 - "@light https://everviolet.github.io/discord/themes/evergarden-summer-aqua.theme.css" 42 - ]; 43 - themeAttributes = true; 44 - }; 45 - }; 46 - decor = { 47 - enabled = true; 48 - }; 49 - dmDates = { 50 - enabled = true; 51 - }; 52 - dmFavorites = { 53 - enabled = true; 54 - }; 55 - domOptimizer = { 56 - enabled = true; 57 - }; 58 - freeScreenShare = { 59 - enabled = true; 60 - }; 61 - freeMoji = { 62 - enabled = true; 63 - }; 64 - imgTitle = { 65 - enabled = true; 66 - }; 67 - inAppNotifications = { 68 - enabled = true; 69 - }; 70 - markdown = { 71 - enabled = true; 72 - }; 73 - memberCount = { 74 - enabled = true; 75 - }; 76 - mentionAvatars = { 77 - enabled = true; 78 - }; 79 - nativeFixes = { 80 - enabled = true; 81 - config = { 82 - vulkan = true; 83 - disableRendererBackgrounding = false; 84 - linuxUpdater = true; 85 - }; 86 - }; 87 - neatSettingsContext = { 88 - enabled = true; 89 - }; 90 - nicknameTools = { 91 - enabled = true; 92 - config = { 93 - usernameEqualsDisplayname = "Show Username"; 94 - reply = "Show Both"; 95 - }; 96 - }; 97 - noHelp = { 98 - enabled = true; 99 - }; 100 - noJoinMessageWave = { 101 - enabled = true; 102 - }; 103 - noNotificationSoundExceptDms = { 104 - enabled = true; 105 - }; 106 - platformStyles = { 107 - enabled = true; 108 - config = { 109 - style = "osx"; 110 - }; 111 - }; 112 - pronouns = { 113 - enabled = true; 114 - }; 115 - remind-me = { 116 - enabled = true; 117 - }; 118 - textReplacer = { 119 - enabled = true; 120 - config = { 121 - patterns = { 122 - "://x.com/" = "://fixupx.com/"; 123 - "://reddit.com/" = "://rxddit.com/"; 124 - "://vm.tiktok.com/" = "://vm.vxtiktok.com/"; 125 - "://bsky.app/" = "://fxbsky.app/"; 126 - }; 127 - }; 128 - }; 129 - staffTags = { 130 - enabled = true; 131 - config = { 132 - style = "icon"; 133 - }; 134 - }; 135 - spotifySpoof = { 136 - enabled = true; 137 - }; 138 - showVoiceMemberCount = { 139 - enabled = true; 140 - }; 141 - showReplySelf = { 142 - enabled = true; 143 - }; 144 - showMediaOptions = { 145 - enabled = true; 146 - }; 147 - showAllRoles = { 148 - enabled = true; 149 - }; 150 - sendTimestamps = { 151 - enabled = true; 152 - }; 153 - experiments = { 154 - enabled = true; 155 - config = { 156 - devtools = true; 157 - staffSettings = true; 158 - }; 159 - }; 160 - unminifyReactErrors = { 161 - enabled = true; 162 - }; 163 - ownerCrown = { 164 - enabled = true; 165 - }; 166 - platformIcons = { 167 - enabled = true; 168 - config = { 169 - self = false; 170 - memberList = false; 171 - }; 172 - }; 173 - uwuifier = true; 174 - translateText = true; 175 - }; 176 - repositories = [ 177 - "https://moonlight-mod.github.io/extensions-dist/repo.json" 178 - ]; 179 - }
-15
home/robin/gui/discord/settings.nix
··· 1 - { 2 - SKIP_HOST_UPDATE = true; 3 - DANGEROUS_ENABLE_DEVTOOLS_ONLY_ENABLE_IF_YOU_KNOW_WHAT_YOUR_DOING = true; 4 - MIN_WIDTH = 940; 5 - MIN_HEIGHT = 500; 6 - openasar = { 7 - setup = true; 8 - quickstart = true; 9 - }; 10 - chromiumSwitches = { 11 - }; 12 - IS_MAXIMIZED = true; 13 - IS_MINIMIZED = false; 14 - trayBalloonShown = true; 15 - }
home/robin/gui/discord/vencord.json

This is a binary file and will not be displayed.

-254
home/robin/gui/dunst.nix
··· 1 - { config, ... }: 2 - let 3 - inherit (config.garden.style) fonts; 4 - in 5 - { 6 - services.dunst = { 7 - enable = config.garden.profiles.graphical.enable && !config.programs.quickshell.enable; 8 - settings = { 9 - global = { 10 - follow = "mouse"; 11 - width = "(240, 340)"; 12 - height = "160"; 13 - origin = "top-right"; 14 - offset = "4x4"; 15 - scale = 0; 16 - notification_limit = 3; 17 - 18 - indicate_hidden = "yes"; 19 - 20 - # Turn on the progess bar. It appears when a progress hint is passed with 21 - # for example dunstify -h int:value:12 22 - progress_bar = true; 23 - 24 - # Set the progress bar height. This includes the frame, so make sure 25 - # it's at least twice as big as the frame width. 26 - progress_bar_height = 10; 27 - 28 - # Set the frame width of the progress bar 29 - progress_bar_frame_width = 1; 30 - 31 - # Set the minimum width for the progress bar 32 - progress_bar_min_width = 150; 33 - 34 - # Set the maximum width for the progress bar 35 - progress_bar_max_width = 300; 36 - 37 - transparency = 0; # X11 only 38 - 39 - # Draw a line of "separator_height" pixel height between two 40 - # notifications. 41 - # Set to 0 to disable. 42 - separator_height = 2; 43 - 44 - # Define a color for the separator. 45 - # possible values are: 46 - # * auto: dunst tries to find a color fitting to the background; 47 - # * foreground: use the same color as the foreground; 48 - # * frame: use the same color as the frame; 49 - # * anything else will be interpreted as a X color. 50 - separator_color = "frame"; 51 - 52 - # Padding between text and separator. 53 - padding = 8; 54 - 55 - # Horizontal padding. 56 - horizontal_padding = 12; 57 - 58 - # Padding between text and icon. 59 - text_icon_padding = 17; 60 - 61 - # Defines width in pixels of frame around the notification window. 62 - # Set to 0 to disable. 63 - frame_width = 3; 64 - 65 - # Sort messages by urgency. 66 - sort = "no"; 67 - 68 - # Don't remove messages, if the user is idle (no mouse or keyboard input) 69 - # for longer than idle_threshold seconds. 70 - # Set to 0 to disable. 71 - # A client can set the 'transient' hint to bypass this. See the rules 72 - # section for how to disable this if necessary 73 - idle_threshold = 120; 74 - 75 - font = fonts.name; 76 - 77 - line_height = "1.2"; 78 - 79 - # Possible values are: 80 - # full: Allow a small subset of html markup in notifications: 81 - # <b>bold</b> 82 - # <i>italic</i> 83 - # <s>strikethrough</s> 84 - # <u>underline</u> 85 - # 86 - # For a complete reference see 87 - # <https://docs.gtk.org/Pango/pango_markup.html>. 88 - # 89 - # strip: This setting is provided for compatibility with some broken 90 - # clients that send markup even though it's not enabled on the 91 - # server. Dunst will try to strip the markup but the parsing is 92 - # simplistic so using this option outside of matching rules for 93 - # specific applications *IS GREATLY DISCOURAGED*. 94 - # 95 - # no: Disable markup parsing, incoming notifications will be treated as 96 - # plain text. Dunst will not advertise that it has the body-markup 97 - # capability if this is set as a global setting. 98 - # 99 - # It's important to note that markup inside the format option will be parsed 100 - # regardless of what this is set to. 101 - markup = "full"; 102 - 103 - # The format of the message. Possible variables are: 104 - # %a appname 105 - # %s summary 106 - # %b body 107 - # %i iconname (including its path) 108 - # %I iconname (without its path) 109 - # %p progress value if set ([ 0%] to [100%]) or nothing 110 - # %n progress value if set without any extra characters 111 - # %% Literal % 112 - # Markup is allowed 113 - format = "<b>%s</b>\n%b"; 114 - 115 - # Alignment of message text. 116 - # Possible values are "left", "center" and "right". 117 - alignment = "left"; 118 - 119 - # Vertical alignment of message text and icon. 120 - # Possible values are "top", "center" and "bottom". 121 - vertical_alignment = "center"; 122 - 123 - # Show age of message if message is older than show_age_threshold 124 - # seconds. 125 - # Set to -1 to disable. 126 - show_age_threshold = 60; 127 - 128 - # Specify where to make an ellipsis in long lines. 129 - # Possible values are "start", "middle" and "end". 130 - ellipsize = "middle"; 131 - 132 - # Ignore newlines '\n' in notifications. 133 - ignore_newline = "no"; 134 - 135 - # Stack together notifications with the same content 136 - stack_duplicates = true; 137 - 138 - # Hide the count of stacked notifications with the same content 139 - hide_duplicate_count = false; 140 - 141 - # Display indicators for URLs (U) and actions (A). 142 - show_indicators = "yes"; 143 - 144 - ### Icons ### 145 - 146 - # Align icons left/right/top/off 147 - icon_position = "left"; 148 - 149 - # Scale small icons up to this size, set to 0 to disable. Helpful 150 - # for e.g. small files or high-dpi screens. In case of conflict, 151 - # max_icon_size takes precedence over this. 152 - min_icon_size = 0; 153 - 154 - # Scale larger icons down to this size, set to 0 to disable 155 - max_icon_size = 32; 156 - 157 - ### History ### 158 - 159 - # Should a notification popped up from history be sticky or timeout 160 - # as if it would normally do. 161 - sticky_history = "yes"; 162 - 163 - # Maximum amount of notifications kept in history 164 - history_length = 0; 165 - 166 - ### Misc/Advanced ### 167 - 168 - # dmenu path. 169 - dmenu = "dmenu -p dunst:"; 170 - 171 - # Browser for opening urls in context menu. 172 - browser = "xdg-open"; 173 - 174 - # Always run rule-defined scripts, even if the notification is suppressed 175 - always_run_script = true; 176 - 177 - # Define the title of the windows spawned by dunst 178 - title = "dunst"; 179 - 180 - # Define the class of the windows spawned by dunst 181 - class = "dunst"; 182 - 183 - # Define the corner radius of the notification window 184 - # in pixel size. If the radius is 0, you have no rounded 185 - # corners. 186 - # The radius will be automatically lowered if it exceeds half of the 187 - # notification height to avoid clipping text and/or icons. 188 - corner_radius = 4; 189 - 190 - # Ignore the dbus closeNotification message. 191 - # Useful to enforce the timeout set by dunst configuration. Without this 192 - # parameter, an application may close the notification sent before the 193 - # user defined timeout. 194 - ignore_dbusclose = false; 195 - 196 - ### Wayland ### 197 - # These settings are Wayland-specific. They have no effect when using X11 198 - 199 - # Uncomment this if you want to let notications appear under fullscreen 200 - # applications (default: overlay) 201 - # layer = top 202 - 203 - # Set this to true to use X11 output on Wayland. 204 - force_xwayland = false; 205 - 206 - ### Legacy 207 - 208 - # Use the Xinerama extension instead of RandR for multi-monitor support. 209 - # This setting is provided for compatibility with older nVidia drivers that 210 - # do not support RandR and using it on systems that support RandR is highly 211 - # discouraged. 212 - # 213 - # By enabling this setting dunst will not be able to detect when a monitor 214 - # is connected or disconnected which might break follow mode if the screen 215 - # layout changes. 216 - force_xinerama = false; 217 - 218 - ### mouse 219 - 220 - # Defines list of actions for each mouse event 221 - # Possible values are: 222 - # * none: Don't do anything. 223 - # * do_action: Invoke the action determined by the action_name rule. If there is no 224 - # such action, open the context menu. 225 - # * open_url: If the notification has exactly one url, open it. If there are multiple 226 - # ones, open the context menu. 227 - # * close_current: Close current notification. 228 - # * close_all: Close all notifications. 229 - # * context: Open context menu for the notification. 230 - # * context_all: Open context menu for all notifications. 231 - # These values can be strung together for each mouse event, and 232 - # will be executed in sequence. 233 - mouse_left_click = "close_current"; 234 - mouse_middle_click = "do_action, close_current"; 235 - mouse_right_click = "close_all"; 236 - 237 - # default timeout 238 - timeout = 5; 239 - }; 240 - 241 - urgency_low = { 242 - timeout = 4; 243 - }; 244 - 245 - urgency_normal = { 246 - timeout = 5; 247 - }; 248 - 249 - urgency_critical = { 250 - timeout = 10; 251 - }; 252 - }; 253 - }; 254 - }
-4
home/robin/gui/firefox.nix
··· 1 - { lib, config, ... }: 2 - { 3 - programs.firefox.enable = lib.mkDefault (config.garden.programs.defaults.browser == "firefox"); 4 - }
-60
home/robin/gui/ghostty.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - { 8 - programs.ghostty = { 9 - enable = lib.mkDefault ( 10 - config.garden.profiles.graphical.enable && config.garden.programs.defaults.terminal == "ghostty" 11 - ); 12 - 13 - # FIXME: ghostty is broken on darwin 14 - package = if pkgs.stdenv.hostPlatform.isLinux then pkgs.ghostty else null; 15 - 16 - settings = { 17 - command = "/etc/profiles/per-user/robin/bin/zsh --login"; 18 - 19 - background-opacity = 0.92; 20 - cursor-style = "bar"; 21 - window-padding-x = "4"; 22 - window-padding-y = "0"; 23 - window-padding-balance = true; 24 - window-decoration = toString pkgs.stdenv.hostPlatform.isDarwin; 25 - gtk-titlebar = false; 26 - 27 - window-save-state = "always"; 28 - 29 - font-family = config.garden.style.fonts.name; 30 - font-size = 13; 31 - font-feature = builtins.concatStringsSep "," [ 32 - "zero" 33 - "cv01" # `@ $ & % Q => ->` without gap 34 - 35 - # consistent style 36 - # "cv33" # italic `i` j with left bottom bar and horizen top bar, just like regular style 37 - 38 - # no tails 39 - "cv34" # italic `k` without circle, just like regular style 40 - "cv35" # italic `l` without tail, just like regular style 41 - # "cv36" # italic `x` without tails, just like regular style 42 - # "ss06" # Break connected strokes between italic letters (al, ul, il ...) 43 - 44 - # disable ligatures 45 - "ss01" # Broken equals ligatures (==, ===, !=, !==, =/=) 46 - "ss02" # Broken compare and equal ligatures (<=, >=) 47 - "ss04" # Break multiple underscores (__, #__) 48 - 49 - "ss03" # Enable arbitrary tag (allow to use any case in all tags) 50 - 51 - "ss05" # Thin backslash in escape letters (\w, \n, \r ...) 52 - 53 - "ss07" # Relax the conditions for multiple greaters ligatures (>> or >>>) 54 - # "ss08" # Enable double headed arrows and reverse arrows (>>=, -<<, ->>, >- ...) 55 - ]; 56 - 57 - adjust-cell-height = "20%"; 58 - }; 59 - }; 60 - }
-31
home/robin/gui/hyprland/config/animations.nix
··· 1 - { 2 - wayland.windowManager.hyprland.settings.animations = { 3 - enabled = true; 4 - first_launch_animation = false; 5 - 6 - # █▄▄ █▀▀ ▀█ █ █▀▀ █▀█   █▀▀ █░█ █▀█ █░█ █▀▀ 7 - # █▄█ ██▄ █▄ █ ██▄ █▀▄   █▄▄ █▄█ █▀▄ ▀▄▀ ██▄ 8 - bezier = [ 9 - "wind, 0.05, 0.9, 0.1, 1.05" 10 - "winIn, 0.1, 1.1, 0.1, 1.1" 11 - "winOut, 0.3, -0.3, 0, 1" 12 - "liner, 1, 1, 1, 1" 13 - "overshot, 0.05, 0.9, 0.1, 1.05" 14 - "smoothOut, 0.36, 0, 0.66, -0.56" 15 - "smoothIn, 0.25, 1, 0.5, 1" 16 - ]; 17 - # ▄▀█ █▄░█ █ █▀▄▀█ ▄▀█ ▀█▀ █ █▀█ █▄░█ 18 - # █▀█ █░▀█ █ █░▀░█ █▀█ ░█░ █ █▄█ █░▀█ 19 - animation = [ 20 - "windows, 1, 5, overshot, popin" 21 - "windowsOut, 1, 1, smoothOut, popin" 22 - "windowsMove, 1, 4, default" 23 - "border, 1, 10, default" 24 - "borderangle, 1, 8, default" 25 - "fade, 1, 10, smoothIn" 26 - "fadeDim, 1, 10, smoothIn" 27 - "workspaces, 1, 6, default" 28 - "specialWorkspace, 1, 6, smoothIn, slidevert" 29 - ]; 30 - }; 31 - }
-130
home/robin/gui/hyprland/config/binds.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib.lists) optionals; 9 - inherit (builtins) toString genList concatLists; 10 - 11 - inherit (config.garden.programs) defaults; 12 - 13 - mod = "SUPER"; 14 - 15 - evswitch = pkgs.writeShellApplication { 16 - name = "ev-switch"; 17 - runtimeInputs = [ 18 - pkgs.just 19 - pkgs.lutgen 20 - pkgs.rhash 21 - ]; 22 - text = '' 23 - exec ~/wallpapers/ev-switch.sh 24 - ''; 25 - }; 26 - in 27 - { 28 - wayland.windowManager.hyprland.settings = { 29 - bind = [ 30 - # launchers 31 - "${mod}, B, exec, ${defaults.browser}" 32 - "${mod}, E, exec, ${defaults.fileManager}" 33 - "${mod}, C, exec, ${defaults.editor}" 34 - "${mod}, Return, exec, ${defaults.terminal}" 35 - "${mod}, L, exec, systemctl suspend" 36 - "${mod}, O, exec, obsidian" 37 - 38 - "${mod} SHIFT, W, exec, haikei r $(dirname $(haikei current))" 39 - "${mod} CTRL, W, exec, ${lib.getExe evswitch}" 40 - 41 - # window management 42 - "${mod}, Q, killactive," 43 - # "${mod} SHIFT, Q, exit," 44 - "${mod}, F, fullscreen," 45 - "${mod}, Z, fullscreen, 1" # toggle maximize 46 - "${mod} SHIFT, F, fullscreenstate, -1 2" # toggle fullscreenstate in client 47 - "${mod}, Space, togglefloating," 48 - "${mod}, D, pseudo," # dwindle 49 - "${mod}, J, togglesplit," # dwindle 50 - 51 - # grouping 52 - "${mod}, g, togglegroup" 53 - "${mod} ALT, tab, changegroupactive" 54 - 55 - "${mod}, Tab, cyclenext," 56 - "${mod}, Tab, bringactivetotop," 57 - 58 - # special workspace stuff 59 - "${mod}, grave, togglespecialworkspace" 60 - "${mod}, grave, exec, $notifycmd 'Toggled Special Workspace'" 61 - "${mod} SHIFT, grave, movetoworkspace, special" 62 - 63 - # screen shot 64 - ", Print, exec, moonblast copysave output" 65 - "${mod} SHIFT, S, exec, moonblast -f copysave area" 66 - "ALT, Print, exec, moonblast copysave active" 67 - 68 - "${mod} CTRL, right, workspace, r+1" 69 - "${mod} CTRL, left, workspace, r-1" 70 - # scroll wheel binds 71 - "${mod}, mouse_down, workspace, r+1" 72 - "${mod}, mouse_up, workspace, r-1" 73 - 74 - # global mute 75 - ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" 76 - ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle" 77 - 78 - # playerctl 79 - ",XF86AudioPlay, exec, playercontrol toggle" 80 - ",XF86AudioNext, exec, playercontrol next" 81 - ",XF86AudioPrev, exec, playercontrol prev" 82 - ] 83 - ++ optionals (defaults.bar == "waybar") [ 84 - "ALT, space, exec, pkill rofi || rofi -show drun" 85 - "${mod} SHIFT, B, exec, pkill --signal SIGUSR2 waybar" # reload waybar 86 - "${mod}, escape, exec, wlogout" 87 - "${mod}, period, exec, killall rofi || rofi -show emoji -emoji-format '{emoji}' -modi emoji" 88 - ] 89 - ++ optionals (defaults.bar == "ags") [ 90 - "${mod}, D, exec, ags -t launcher" 91 - "${mod}, escape, exec, ags -t powermenu" 92 - "${mod} SHIFT, R, exec, systemctl --user restart ags.service" 93 - ] 94 - ++ optionals (defaults.bar == "quickshell") [ 95 - "ALT, space, exec, qs ipc call drawers toggle launcher" 96 - "${mod} SHIFT, B, exec, pkill quickshell || quickshell &disown" 97 - "${mod}, escape, exec, qs ipc call drawers toggle session" 98 - ] 99 - ++ (concatLists ( 100 - genList ( 101 - x: 102 - let 103 - ws = 104 - let 105 - c = (x + 1) / 10; 106 - in 107 - toString (x + 1 - (c * 10)); 108 - in 109 - [ 110 - "${mod}, ${ws}, workspace, ${toString (x + 1)}" 111 - "${mod} SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}" 112 - ] 113 - ) 10 114 - )); 115 - 116 - # mouse binds 117 - bindm = [ 118 - "${mod}, mouse:272, movewindow" 119 - "${mod}, mouse:273, resizewindow" 120 - ]; 121 - 122 - # hold to repeat action buttons 123 - binde = [ 124 - ", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" 125 - ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" 126 - ", XF86MonBrightnessUp, exec, brightnessctl set 5%+ -q" 127 - ", XF86MonBrightnessDown, exec, brightnessctl set 5%- -q" 128 - ]; 129 - }; 130 - }
-31
home/robin/gui/hyprland/config/decorations.nix
··· 1 - { 2 - wayland.windowManager.hyprland.settings.decoration = { 3 - rounding = 8; 4 - rounding_power = 4; 5 - 6 - # 0.8 is nice if we opacity 7 - active_opacity = 1.0; 8 - inactive_opacity = 1.0; 9 - fullscreen_opacity = 1.0; 10 - 11 - shadow = { 12 - enabled = true; 13 - color = "0x33000000"; 14 - color_inactive = "0x33000000"; 15 - }; 16 - 17 - blur = { 18 - enabled = true; 19 - passes = 2; 20 - size = 8; 21 - 22 - brightness = 0.81; 23 - contrast = 1.3; 24 - noise = 1.17e-2; 25 - ignore_opacity = true; 26 - 27 - xray = true; 28 - special = true; 29 - }; 30 - }; 31 - }
-16
home/robin/gui/hyprland/config/default.nix
··· 1 - { 2 - imports = [ 3 - ./animations.nix 4 - ./binds.nix 5 - ./decorations.nix 6 - ./exec.nix 7 - ./extra.nix 8 - ./general.nix 9 - ./group.nix 10 - ./inputs.nix 11 - ./layout.nix 12 - ./misc.nix 13 - ./variables.nix 14 - ./windowrules.nix 15 - ]; 16 - }
-22
home/robin/gui/hyprland/config/exec.nix
··· 1 - { 2 - lib, 3 - config, 4 - ... 5 - }: 6 - let 7 - inherit (lib.lists) optionals; 8 - 9 - pointer = config.home.pointerCursor; 10 - inherit (config.garden.programs) defaults; 11 - in 12 - { 13 - wayland.windowManager.hyprland.settings = { 14 - exec-once = [ 15 - "wl-paste --type text --watch cliphist store" # Stores only text data 16 - "wl-paste --type image --watch cliphist store" # Stores only image data 17 - "hyprctl setcursor ${pointer.name} ${toString pointer.size}" 18 - "swww-daemon" 19 - ] 20 - ++ optionals (defaults.bar == "waybar") [ "waybar" ]; 21 - }; 22 - }
-93
home/robin/gui/hyprland/config/extra.nix
··· 1 - { lib, osConfig, ... }: 2 - let 3 - inherit (lib.lists) imap0; 4 - inherit (lib.strings) optionalString concatLines; 5 - inherit (builtins) 6 - genList 7 - elemAt 8 - length 9 - ; 10 - 11 - inherit (osConfig.garden.device) monitors; 12 - in 13 - { 14 - wayland.windowManager.hyprland.extraConfig = 15 - let 16 - mapMonitors = concatLines ( 17 - imap0 ( 18 - i: monitor: 19 - ''monitor=${monitor},${ 20 - if monitor == "eDP-1" then "1920x1080@60" else "preferred" 21 - },${toString (i * 1920)}x0,1'' 22 - ) monitors 23 - ); 24 - 25 - mapMonitorsToWs = concatLines ( 26 - genList (x: '' 27 - workspace = ${toString (x + 1)}, monitor:${ 28 - if (x + 1) <= 5 then 29 - "${elemAt monitors 0} ${if (x + 1) == 1 then ", default:true" else ""}" 30 - else 31 - "${elemAt monitors 1}" 32 - } 33 - '') 10 34 - ); 35 - in 36 - '' 37 - ${mapMonitors} 38 - ${optionalString (length monitors != 1) "${mapMonitorsToWs}"} 39 - 40 - # █▀▀ █▀█ █▀▀ █░█ █▀ 41 - # █▀░ █▄█ █▄▄ █▄█ ▄█ 42 - bind = SUPER, left, movefocus, l 43 - bind = SUPER, right, movefocus, r 44 - bind = SUPER, up, movefocus, u 45 - bind = SUPER, down, movefocus, d 46 - 47 - # █▀▄▀█ █▀█ █░█ █▀▀ 48 - # █░▀░█ █▄█ ▀▄▀ ██▄ 49 - 50 - bind = SUPER SHIFT, left, movewindow, l 51 - bind = SUPER SHIFT, right, movewindow, r 52 - bind = SUPER SHIFT, up, movewindow, u 53 - bind = SUPER SHIFT, down, movewindow, d 54 - bind = SUPER SHIFT, h, movewindow, l 55 - bind = SUPER SHIFT, j, movewindow, d 56 - bind = SUPER SHIFT, k, movewindow, u 57 - bind = SUPER SHIFT, l, movewindow, r 58 - 59 - # █▀▄▀█ █▀█ █░█ █▀▀ 60 - # █░▀░█ █▄█ ▀▄▀ ██▄ 61 - bind=SUPER SHIFT, M, submap, move-monitor 62 - submap=move-monitor 63 - 64 - bind = , left, movecurrentworkspacetomonitor, l 65 - bind = , right, movecurrentworkspacetomonitor, r 66 - bind = , up, movecurrentworkspacetomonitor, u 67 - bind = , down, movecurrentworkspacetomonitor, d 68 - bind = , h, movecurrentworkspacetomonitor, l 69 - bind = , j, movecurrentworkspacetomonitor, d 70 - bind = , k, movecurrentworkspacetomonitor, u 71 - bind = , l, movecurrentworkspacetomonitor, r 72 - 73 - bind=,escape,submap,reset 74 - submap=reset 75 - 76 - # █▀█ █▀▀ █▀ █ ▀█ █▀▀ 77 - # █▀▄ ██▄ ▄█ █ █▄ ██▄ 78 - bind=SUPER, R, submap, resize 79 - submap=resize 80 - 81 - binde = , left, resizeactive, -20 0 82 - binde = , right, resizeactive, 20 0 83 - binde = , up, resizeactive, 0 -20 84 - binde = , down, resizeactive, 0 20 85 - binde = , h, resizeactive, -20 0 86 - binde = , j, resizeactive, 20 0 87 - binde = , i, resizeactive, 0 -20 88 - binde = , k, resizeactive, 0 20 89 - 90 - bind=,escape,submap,reset 91 - submap=reset 92 - ''; 93 - }
-14
home/robin/gui/hyprland/config/general.nix
··· 1 - { 2 - wayland.windowManager.hyprland.settings.general = { 3 - layout = "master"; 4 - 5 - gaps_in = 8; 6 - gaps_out = 8; 7 - gaps_workspaces = 0; 8 - border_size = 6; 9 - no_border_on_floating = false; 10 - 11 - "col.active_border" = "$skye"; 12 - "col.inactive_border" = "$surface1"; 13 - }; 14 - }
-18
home/robin/gui/hyprland/config/group.nix
··· 1 - { 2 - wayland.windowManager.hyprland.settings.group = { 3 - insert_after_current = true; 4 - # focus on the window that has just been moved out of the group 5 - focus_removed_window = true; 6 - 7 - "col.border_active" = "$cherry"; 8 - "col.border_inactive" = "$surface1"; 9 - 10 - groupbar = { 11 - gradients = false; 12 - font_size = 12; 13 - 14 - render_titles = false; 15 - scrolling = true; # change focused window with scroll 16 - }; 17 - }; 18 - }
-34
home/robin/gui/hyprland/config/inputs.nix
··· 1 - { config, osConfig, ... }: 2 - let 3 - dev = osConfig.garden.device; 4 - in 5 - { 6 - wayland.windowManager.hyprland.settings = { 7 - input = { 8 - kb_layout = dev.keyboard; 9 - follow_mouse = 0; 10 - sensitivity = 1; 11 - force_no_accel = 1; 12 - numlock_by_default = true; # numlock enable 13 - repeat_rate = 50; 14 - repeat_delay = 250; 15 - 16 - # caps lock as an additional esc 17 - # but shift + capslock is the regular capslock 18 - kb_options = "caps:escape_shifted_capslock"; 19 - 20 - touchpad = { 21 - tap-to-click = true; 22 - natural_scroll = true; 23 - disable_while_typing = false; # this is annoying 24 - scroll_factor = 0.2; 25 - }; 26 - }; 27 - 28 - gestures.workspace_swipe = config.garden.profiles.laptop.enable; 29 - 30 - cursor = { 31 - no_hardware_cursors = true; 32 - }; 33 - }; 34 - }
-12
home/robin/gui/hyprland/config/layout.nix
··· 1 - { 2 - wayland.windowManager.hyprland.settings = { 3 - master = { 4 - # new_is_master = true; 5 - }; 6 - 7 - dwindle = { 8 - pseudotile = true; 9 - preserve_split = true; 10 - }; 11 - }; 12 - }
-16
home/robin/gui/hyprland/config/misc.nix
··· 1 - { 2 - wayland.windowManager.hyprland.settings.misc = { 3 - disable_hyprland_logo = true; 4 - disable_splash_rendering = true; 5 - force_default_wallpaper = 0; 6 - 7 - # window swallowing 8 - enable_swallow = true; # hide windows that spawn other windows 9 - swallow_regex = "wezterm|foot|cosmic-files|nemo"; 10 - 11 - # dpms 12 - mouse_move_enables_dpms = true; # enable dpms on mouse/touchpad action 13 - key_press_enables_dpms = true; # enable dpms on keyboard action 14 - disable_autoreload = true; # autoreload is unnecessary on nixos, because the config is readonly anyway 15 - }; 16 - }
-40
home/robin/gui/hyprland/config/variables.nix
··· 1 - { 2 - config, 3 - inputs, 4 - ... 5 - }: 6 - let 7 - inherit (config.evergarden) variant; 8 - palette = inputs.evergarden.lib.palette.${variant}; 9 - in 10 - { 11 - wayland.windowManager.hyprland.settings = { 12 - "$notifycmd" = 13 - "notify-send -e -a hyprland -h string:x-canonical-private-synchronous:hypr-cfg -u low"; 14 - 15 - "$red" = "0xff${palette.red}"; 16 - "$orange" = "0xff${palette.orange}"; 17 - "$yellow" = "0xff${palette.yellow}"; 18 - "$lime" = "0xff${palette.lime}"; 19 - "$green" = "0xff${palette.green}"; 20 - "$aqua" = "0xff${palette.aqua}"; 21 - "$skye" = "0xff${palette.skye}"; 22 - "$snow" = "0xff${palette.snow}"; 23 - "$blue" = "0xff${palette.blue}"; 24 - "$purple" = "0xff${palette.purple}"; 25 - "$pink" = "0xff${palette.pink}"; 26 - "$cherry" = "0xff${palette.cherry}"; 27 - "$text" = "0xff${palette.text}"; 28 - "$subtext1" = "0xff${palette.subtext1}"; 29 - "$subtext0" = "0xff${palette.subtext0}"; 30 - "$overlay2" = "0xff${palette.overlay2}"; 31 - "$overlay1" = "0xff${palette.overlay1}"; 32 - "$overlay0" = "0xff${palette.overlay0}"; 33 - "$surface2" = "0xff${palette.surface2}"; 34 - "$surface1" = "0xff${palette.surface1}"; 35 - "$surface0" = "0xff${palette.surface0}"; 36 - "$base" = "0xff${palette.base}"; 37 - "$mantle" = "0xff${palette.mantle}"; 38 - "$crust" = "0xff${palette.crust}"; 39 - }; 40 - }
-35
home/robin/gui/hyprland/config/windowrules.nix
··· 1 - { 2 - wayland.windowManager.hyprland.settings = { 3 - windowrule = [ 4 - "tag bitwarden, title:( - Bitwarden)" 5 - "tag terminal, class:^(com.mitchellh.ghostty)$" 6 - 7 - "float, tag:bitwarden" 8 - "float, title:^(rofi)$" 9 - "float, title:^(pwvucontrol)$" 10 - "float, title:^(nm-connection-editor)$" 11 - "float, title:^(blueberry.py)$" 12 - "float, title:^(Color Picker)$" 13 - "float, title:^(Network)$" 14 - "float, title:^(com.github.Aylur.ags)$" 15 - "float, title:^(xdg-desktop-portal)$" 16 - "float, title:^(xdg-desktop-portal-gnome)$" 17 - "float, title:^(transmission-gtk)$" 18 - "size 800 600,tag:bitwarden" 19 - 20 - "norounding, tag:terminal" 21 - ]; 22 - 23 - windowrulev2 = [ 24 - "float, title:^(Picture-in-Picture)$" 25 - "float, class:^(feh)$" 26 - "float, class:^(download)$" 27 - 28 - "workspace 6, title:^(.*(Disc|WebC)ord.*)$" 29 - 30 - # throw sharing indicators away 31 - "workspace special silent, title:^(Firefox — Sharing Indicator)$" 32 - "workspace special silent, title:^(.*is sharing (your screen|a window)\.)$" 33 - ]; 34 - }; 35 - }
-49
home/robin/gui/hyprland/default.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - inputs', 5 - config, 6 - ... 7 - }: 8 - let 9 - cfg = config.programs.hyprland; 10 - in 11 - { 12 - imports = [ ./config ]; 13 - 14 - options = { 15 - programs.hyprland = { 16 - enable = lib.mkEnableOption "Hyprland window manager"; 17 - }; 18 - }; 19 - 20 - config = lib.mkIf cfg.enable { 21 - garden.packages = { 22 - inherit (pkgs) swww hyprpicker hyprprop; 23 - inherit (inputs'.tgirlpkgs.packages) 24 - haikei 25 - moonblast 26 - hyprflare-playercontrol 27 - hyprflare-wallselect 28 - ; 29 - }; 30 - 31 - home.sessionVariables = { 32 - MOONBLAST_EDITOR = "satty --filename"; 33 - }; 34 - 35 - wayland.windowManager.hyprland = { 36 - enable = true; 37 - xwayland.enable = true; 38 - 39 - systemd = { 40 - enable = true; 41 - variables = [ "--all" ]; 42 - extraCommands = [ 43 - "systemctl --user stop graphical-session.target" 44 - "systemctl --user start hyprland-session.target" 45 - ]; 46 - }; 47 - }; 48 - }; 49 - }
-23
home/robin/gui/obsidian.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) attrValues mkIf; 9 - in 10 - { 11 - garden.packages = mkIf config.garden.profiles.workstation.enable { 12 - obsidian = pkgs.symlinkJoin { 13 - name = "obsidian-wrapped"; 14 - paths = attrValues { 15 - inherit (pkgs) 16 - # for the pandoc plugin 17 - pandoc 18 - ; 19 - }; 20 - meta.mainProgram = pkgs.obsidian.meta.mainProgram; 21 - }; 22 - }; 23 - }
-25
home/robin/gui/quickshell.nix
··· 1 - { lib, config, ... }: 2 - let 3 - inherit (lib) mkIf mkDefault; 4 - cfg = config.programs.quickshell; 5 - in 6 - { 7 - config = 8 - mkIf 9 - (config.garden.profiles.graphical.enable && config.garden.programs.defaults.bar == "quickshell") 10 - { 11 - programs.quickshell = { 12 - enable = mkDefault true; 13 - systemd.enable = mkDefault true; 14 - }; 15 - 16 - systemd.user.services.quickshell-lock = mkIf cfg.enable { 17 - Unit = { 18 - Description = "launch quickshell lock"; 19 - Before = "lock.target"; 20 - }; 21 - Install.WantedBy = [ "lock.target" ]; 22 - Service.ExecStart = "${lib.getExe cfg.package} ipc call lock lock"; 23 - }; 24 - }; 25 - }
-32
home/robin/gui/satty.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - inputs, 6 - ... 7 - }: 8 - let 9 - inherit (lib) mkIf; 10 - inherit (pkgs.stdenv.hostPlatform) isLinux; 11 - 12 - palette = inputs.evergarden.lib.util.mkPalette config.evergarden; 13 - in 14 - { 15 - # screenshot annotation tool 16 - programs.satty = mkIf (config.garden.profiles.graphical.enable && isLinux) { 17 - enable = true; 18 - 19 - settings = { 20 - color-palette = { 21 - palette = [ 22 - "#${palette.red}" 23 - "#${palette.orange}" 24 - "#${palette.yellow}" 25 - "#${palette.green}" 26 - "#${palette.skye}" 27 - "#${palette.pink}" 28 - ]; 29 - }; 30 - }; 31 - }; 32 - }
-20
home/robin/gui/spotify.nix
··· 1 - { 2 - lib, 3 - inputs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - 10 - inherit (config.garden.profiles.graphical) enable; 11 - in 12 - { 13 - imports = [ 14 - inputs.spicetify-nix.homeManagerModules.default 15 - ]; 16 - 17 - config.programs.spicetify = mkIf enable { 18 - enable = true; 19 - }; 20 - }
-366
home/robin/gui/wezterm/cfg/bar.lua
··· 1 - -- https://github.com/nekowinston/wezterm-bar 2 - local wezterm = require("wezterm") 3 - 4 - local M = {} 5 - 6 - -- default configuration 7 - local config = { 8 - position = "top", -- or "bottom" 9 - max_width = 32, 10 - dividers = "slant_right", -- "slant_right" or "slant_left", "arrows", "rounded", false 11 - indicator = { 12 - leader = { 13 - enabled = true, 14 - off = " ", 15 - on = " ", 16 - }, 17 - mode = { 18 - enabled = true, 19 - names = { 20 - resize_mode = "RESIZE", 21 - copy_mode = "VISUAL", 22 - search_mode = "SEARCH", 23 - }, 24 - }, 25 - }, 26 - tabs = { 27 - numerals = "arabic", -- or "roman" 28 - pane_count = "superscript", -- or "subscript", false 29 - brackets = { 30 - active = { "", ":" }, 31 - inactive = { "", ":" }, 32 - }, 33 - }, 34 - clock = { 35 - enabled = false, 36 - format = "%I:%M %P", -- https://docs.rs/chrono/latest/chrono/format/strftime/index.html 37 - }, 38 - } 39 - 40 - -- parsed config 41 - local C = {} 42 - 43 - local function tableMerge(t1, t2) 44 - for k, v in pairs(t2) do 45 - if type(v) == "table" then 46 - if type(t1[k] or false) == "table" then 47 - tableMerge(t1[k] or {}, t2[k] or {}) 48 - else 49 - t1[k] = v 50 - end 51 - else 52 - t1[k] = v 53 - end 54 - end 55 - return t1 56 - end 57 - 58 - local dividers = { 59 - slant_right = { 60 - left = utf8.char(0xe0be), 61 - right = utf8.char(0xe0bc), 62 - }, 63 - slant_left = { 64 - left = utf8.char(0xe0bb), 65 - right = utf8.char(0xe0b8), 66 - }, 67 - arrows = { 68 - left = utf8.char(0xe0b2), 69 - right = utf8.char(0xe0b0), 70 - }, 71 - rounded = { 72 - left = utf8.char(0xe0b6), 73 - right = utf8.char(0xe0b4), 74 - }, 75 - } 76 - 77 - -- conforming to https://github.com/wez/wezterm/commit/e4ae8a844d8feaa43e1de34c5cc8b4f07ce525dd 78 - -- exporting an apply_to_config function, even though we don't change the users config 79 - M.apply_to_config = function(c, opts) 80 - -- make the opts arg optional 81 - if not opts then 82 - opts = {} 83 - end 84 - 85 - -- combine user config with defaults 86 - config = tableMerge(config, opts) 87 - C.div = { 88 - l = "", 89 - r = "", 90 - } 91 - 92 - if config.dividers then 93 - C.div.l = dividers[config.dividers].left 94 - C.div.r = dividers[config.dividers].right 95 - end 96 - 97 - C.leader = { 98 - enabled = config.indicator.leader.enabled and true, 99 - off = config.indicator.leader.off, 100 - on = config.indicator.leader.on, 101 - } 102 - 103 - C.mode = { 104 - enabled = config.indicator.mode.enabled, 105 - names = config.indicator.mode.names, 106 - } 107 - 108 - C.tabs = { 109 - numerals = config.tabs.numerals, 110 - pane_count_style = config.tabs.pane_count, 111 - brackets = { 112 - active = config.tabs.brackets.active, 113 - inactive = config.tabs.brackets.inactive, 114 - }, 115 - } 116 - 117 - C.clock = { 118 - enabled = config.clock.enabled, 119 - format = config.clock.format, 120 - } 121 - 122 - -- set the right-hand padding to 0 spaces, if the rounded style is active 123 - C.p = (config.dividers == "rounded") and "" or " " 124 - 125 - -- set wezterm config options according to the parsed config 126 - c.use_fancy_tab_bar = false 127 - c.tab_bar_at_bottom = config.position == "bottom" 128 - c.tab_max_width = config.max_width 129 - end 130 - 131 - -- superscript/subscript 132 - local function numberStyle(number, script) 133 - local scripts = { 134 - superscript = { 135 - "⁰", 136 - "¹", 137 - "²", 138 - "³", 139 - "⁴", 140 - "⁵", 141 - "⁶", 142 - "⁷", 143 - "⁸", 144 - "⁹", 145 - }, 146 - subscript = { 147 - "₀", 148 - "₁", 149 - "₂", 150 - "₃", 151 - "₄", 152 - "₅", 153 - "₆", 154 - "₇", 155 - "₈", 156 - "₉", 157 - }, 158 - } 159 - local numbers = scripts[script] 160 - local number_string = tostring(number) 161 - local result = "" 162 - for i = 1, #number_string do 163 - local char = number_string:sub(i, i) 164 - local num = tonumber(char) 165 - if num then 166 - result = result .. numbers[num + 1] 167 - else 168 - result = result .. char 169 - end 170 - end 171 - return result 172 - end 173 - 174 - local roman_numerals = { 175 - "Ⅰ", 176 - "Ⅱ", 177 - "Ⅲ", 178 - "Ⅳ", 179 - "Ⅴ", 180 - "Ⅵ", 181 - "Ⅶ", 182 - "Ⅷ", 183 - "Ⅸ", 184 - "Ⅹ", 185 - "Ⅺ", 186 - "Ⅻ", 187 - } 188 - 189 - local get_rainbow = function(conf) 190 - return { 191 - conf.resolved_palette.ansi[2], 192 - conf.resolved_palette.ansi[4], 193 - conf.resolved_palette.ansi[3], 194 - conf.resolved_palette.ansi[7], 195 - conf.resolved_palette.ansi[5], 196 - conf.resolved_palette.ansi[6], 197 - } 198 - end 199 - 200 - -- custom tab bar 201 - wezterm.on("format-tab-title", function(tab, tabs, _panes, conf, _hover, _max_width) 202 - local colours = conf.resolved_palette.tab_bar 203 - 204 - local active_tab_index = 0 205 - for _, t in ipairs(tabs) do 206 - if t.is_active == true then 207 - active_tab_index = t.tab_index 208 - end 209 - end 210 - 211 - local rainbow = get_rainbow(conf) 212 - 213 - local i = tab.tab_index % 6 214 - local active_bg = rainbow[i + 1] 215 - local active_fg = colours.background 216 - local inactive_bg = colours.inactive_tab.bg_color 217 - local inactive_fg = colours.inactive_tab.fg_color 218 - local new_tab_bg = colours.new_tab.bg_color 219 - 220 - local s_bg, s_fg, e_bg, e_fg 221 - 222 - -- the last tab 223 - if tab.tab_index == #tabs - 1 then 224 - if tab.is_active then 225 - s_bg = active_bg 226 - s_fg = active_fg 227 - e_bg = new_tab_bg 228 - e_fg = active_bg 229 - else 230 - s_bg = inactive_bg 231 - s_fg = inactive_fg 232 - e_bg = new_tab_bg 233 - e_fg = inactive_bg 234 - end 235 - elseif tab.tab_index == active_tab_index - 1 then 236 - s_bg = inactive_bg 237 - s_fg = inactive_fg 238 - e_bg = rainbow[(i + 1) % 6 + 1] 239 - e_fg = inactive_bg 240 - elseif tab.is_active then 241 - s_bg = active_bg 242 - s_fg = active_fg 243 - e_bg = inactive_bg 244 - e_fg = active_bg 245 - else 246 - s_bg = inactive_bg 247 - s_fg = inactive_fg 248 - e_bg = inactive_bg 249 - e_fg = inactive_bg 250 - end 251 - 252 - local pane_count = "" 253 - if C.tabs.pane_count_style then 254 - local tabi = wezterm.mux.get_tab(tab.tab_id) 255 - local muxpanes = tabi:panes() 256 - local count = #muxpanes == 1 and "" or tostring(#muxpanes) 257 - pane_count = numberStyle(count, C.tabs.pane_count_style) 258 - end 259 - 260 - local index_i 261 - if C.tabs.numerals == "roman" then 262 - index_i = roman_numerals[tab.tab_index + 1] 263 - else 264 - index_i = tab.tab_index + 1 265 - end 266 - 267 - local index 268 - if tab.is_active then 269 - index = string.format("%s%s%s ", C.tabs.brackets.active[1], index_i, C.tabs.brackets.active[2]) 270 - else 271 - index = string.format("%s%s%s ", C.tabs.brackets.inactive[1], index_i, C.tabs.brackets.inactive[2]) 272 - end 273 - 274 - -- start and end hardcoded numbers are the Powerline + " " padding 275 - local fillerwidth = 2 + string.len(index) + string.len(pane_count) + 2 276 - 277 - -- prefer renamed table titles to the default title 278 - local tabtitle = tab.tab_title 279 - if #tabtitle <= 0 then 280 - tabtitle = tab.active_pane.title 281 - end 282 - 283 - local width = conf.tab_max_width - fillerwidth - 1 284 - if (#tabtitle + fillerwidth) > conf.tab_max_width then 285 - tabtitle = wezterm.truncate_right(tabtitle, width) .. "…" 286 - end 287 - 288 - local title = string.format(" %s%s%s%s", index, tabtitle, pane_count, C.p) 289 - 290 - return { 291 - { Background = { Color = s_bg } }, 292 - { Foreground = { Color = s_fg } }, 293 - { Text = title }, 294 - { Background = { Color = e_bg } }, 295 - { Foreground = { Color = e_fg } }, 296 - { Text = C.div.r }, 297 - } 298 - end) 299 - 300 - wezterm.on("update-status", function(window, _pane) 301 - local active_kt = window:active_key_table() ~= nil 302 - local show = C.leader.enabled or (active_kt and C.mode.enabled) 303 - if not show then 304 - window:set_left_status("") 305 - return 306 - end 307 - 308 - local present, conf = pcall(window.effective_config, window) 309 - if not present then 310 - return 311 - end 312 - 313 - local palette = conf.resolved_palette 314 - local rainbow = get_rainbow(conf) 315 - 316 - local leader = "" 317 - if C.leader.enabled then 318 - local leader_text = C.leader.off 319 - if window:leader_is_active() then 320 - leader_text = C.leader.on 321 - end 322 - leader = wezterm.format({ 323 - { Foreground = { Color = palette.background } }, 324 - { Background = { Color = rainbow[1] } }, 325 - { Text = " " .. leader_text .. C.p }, 326 - }) 327 - end 328 - 329 - local mode = "" 330 - if C.mode.enabled then 331 - local mode_text = "" 332 - local active = window:active_key_table() 333 - if C.mode.names[active] ~= nil then 334 - mode_text = C.mode.names[active] .. "" 335 - end 336 - mode = wezterm.format({ 337 - { Foreground = { Color = palette.background } }, 338 - { Background = { Color = palette.ansi[5] } }, 339 - { Attribute = { Intensity = "Bold" } }, 340 - { Text = mode_text }, 341 - "ResetAttributes", 342 - }) 343 - end 344 - 345 - local first_tab_active = window:mux_window():tabs_with_info()[1].is_active 346 - local divider_bg = first_tab_active and rainbow[1] or palette.tab_bar.inactive_tab.bg_color 347 - 348 - local divider = wezterm.format({ 349 - { Background = { Color = divider_bg } }, 350 - { Foreground = { Color = rainbow[1] } }, 351 - { Text = C.div.r }, 352 - }) 353 - 354 - window:set_left_status(leader .. mode .. divider) 355 - 356 - if C.clock.enabled then 357 - local time = wezterm.time.now():format(C.clock.format) 358 - window:set_right_status(wezterm.format({ 359 - { Background = { Color = palette.tab_bar.background } }, 360 - { Foreground = { Color = palette.ansi[6] } }, 361 - { Text = time }, 362 - })) 363 - end 364 - end) 365 - 366 - return M
-71
home/robin/gui/wezterm/cfg/keybinds.lua
··· 1 - local wezterm = require("wezterm") 2 - local act = wezterm.action 3 - 4 - local utils = require("utils") 5 - 6 - local M = {} 7 - 8 - local openUrl = act.QuickSelectArgs({ 9 - label = "open url", 10 - patterns = { "https?://\\S+" }, 11 - action = wezterm.action_callback(function(window, pane) 12 - local url = window:get_selection_text_for_pane(pane) 13 - wezterm.open_with(url) 14 - end), 15 - }) 16 - 17 - local palettes = {} 18 - for id, name in require("palette").get_palettes() do 19 - palettes[#palettes + 1] = { label = name, id = id } 20 - end 21 - 22 - local changePalette = act.InputSelector({ 23 - title = "Change palette", 24 - choices = { { label = "Evergarden Winter" } }, 25 - fuzzy = true, 26 - action = wezterm.action_callback(function(window, _, id, label) 27 - if not label then 28 - return 29 - end 30 - window:set_config_overrides({ color_scheme = label }) 31 - end), 32 - }) 33 - 34 - local getNewName = act.PromptInputLine({ 35 - description = "Enter new name for tab", 36 - action = wezterm.action_callback(function(window, pane, line) 37 - if not line then 38 - return 39 - end 40 - window:active_tab():set_title(line) 41 - end), 42 - }) 43 - 44 - local keys = {} 45 - local map = function(key, mods, action) 46 - if type(mods) == "string" then 47 - table.insert(keys, { key = key, mods = mods, action = action }) 48 - elseif type(mods) == "table" then 49 - for _, mod in pairs(mods) do 50 - table.insert(keys, { key = key, mods = mod, action = action }) 51 - end 52 - end 53 - end 54 - 55 - map("Enter", "ALT", act.ToggleFullScreen) 56 - 57 - map("e", "CTRL|SHIFT", getNewName) 58 - map("o", { "LEADER", "SUPER" }, openUrl) 59 - map("t", "ALT", changePalette) 60 - 61 - M.apply = function(c) 62 - c.leader = { 63 - key = "m", 64 - mods = "ALT", 65 - timeout_milliseconds = 300, 66 - } 67 - c.keys = keys 68 - -- c.disable_default_key_bindings = true 69 - end 70 - 71 - return M
-284
home/robin/gui/wezterm/cfg/palette.lua
··· 1 - local wezterm = require("wezterm") 2 - 3 - local M = {} 4 - 5 - local colors = { 6 - winter = { 7 - red = "#F57F82", 8 - orange = "#F7A182", 9 - yellow = "#F5D098", 10 - lime = "#DBE6AF", 11 - green = "#CBE3B3", 12 - aqua = "#B3E3CA", 13 - skye = "#B3E6DB", 14 - snow = "#AFD9E6", 15 - blue = "#B2CAED", 16 - purple = "#D2BDF3", 17 - pink = "#F3C0E5", 18 - cherry = "#F6CEE5", 19 - text = "#F8F9E8", 20 - subtext1 = "#ADC9BC", 21 - subtext0 = "#96B4AA", 22 - overlay2 = "#839E9A", 23 - overlay1 = "#6F8788", 24 - overlay0 = "#58686D", 25 - surface2 = "#4A585C", 26 - surface1 = "#374145", 27 - surface0 = "#262F33", 28 - base = "#1E2528", 29 - mantle = "#191E21", 30 - crust = "#171C1F", 31 - }, 32 - fall = { 33 - red = "#F57F82", 34 - orange = "#F7A182", 35 - yellow = "#F5D098", 36 - lime = "#DBE6AF", 37 - green = "#CBE3B3", 38 - aqua = "#B3E3CA", 39 - skye = "#B3E6DB", 40 - snow = "#AFD9E6", 41 - blue = "#B2CAED", 42 - purple = "#D2BDF3", 43 - pink = "#F3C0E5", 44 - cherry = "#F6CEE5", 45 - text = "#F8F9E8", 46 - subtext1 = "#ADC9BC", 47 - subtext0 = "#96B4AA", 48 - overlay2 = "#839E9A", 49 - overlay1 = "#6F8788", 50 - overlay0 = "#58686D", 51 - surface2 = "#4A585C", 52 - surface1 = "#374145", 53 - surface0 = "#2B3337", 54 - base = "#232A2E", 55 - mantle = "#1C2225", 56 - crust = "#171C1F", 57 - }, 58 - spring = { 59 - red = "#F57F82", 60 - orange = "#F7A182", 61 - yellow = "#F5D098", 62 - lime = "#DBE6AF", 63 - green = "#CBE3B3", 64 - aqua = "#B3E3CA", 65 - skye = "#B3E6DB", 66 - snow = "#AFD9E6", 67 - blue = "#B2CAED", 68 - purple = "#D2BDF3", 69 - pink = "#F3C0E5", 70 - cherry = "#F6CEE5", 71 - text = "#F8F9E8", 72 - subtext1 = "#ADC9BC", 73 - subtext0 = "#96B4AA", 74 - overlay2 = "#839E9A", 75 - overlay1 = "#6F8788", 76 - overlay0 = "#58686D", 77 - surface2 = "#4A585C", 78 - surface1 = "#3E4A4F", 79 - surface0 = "#343E43", 80 - base = "#2B3438", 81 - mantle = "#232A2E", 82 - crust = "#1C2225", 83 - }, 84 - summer = { 85 - red = "#C0696B", 86 - orange = "#C1866B", 87 - yellow = "#BC9C6B", 88 - lime = "#A7AF70", 89 - green = "#91AC75", 90 - aqua = "#7BAA92", 91 - skye = "#79A39B", 92 - snow = "#7FA0AA", 93 - blue = "#8CA0BB", 94 - purple = "#AB9AC6", 95 - pink = "#CA9EBD", 96 - cherry = "#CEABBF", 97 - text = "#171C1F", 98 - subtext1 = "#415055", 99 - subtext0 = "#526469", 100 - overlay2 = "#63787D", 101 - overlay1 = "#758A90", 102 - overlay0 = "#879DA4", 103 - surface2 = "#9CB2B8", 104 - surface1 = "#B4C6CC", 105 - surface0 = "#CED9E0", 106 - base = "#D7E1EB", 107 - mantle = "#C8D5E1", 108 - crust = "#BDCBDB", 109 - }, 110 - } 111 - 112 - local mappings = { 113 - winter = "Evergarden Winter", 114 - fall = "Evergarden Fall", 115 - spring = "Evergarden Spring", 116 - summer = "Evergarden Summer", 117 - } 118 - 119 - function M.get_palettes() 120 - return pairs(mappings) 121 - end 122 - 123 - function M.select(palette, flavor, accent) 124 - local c = palette[flavor] 125 - -- shorthand to check for the Latte flavor 126 - local isLight = palette == "latte" 127 - 128 - local cursor = c.pink 129 - return { 130 - foreground = c.text, 131 - background = c.base, 132 - 133 - cursor_fg = isLight and c.base or c.crust, 134 - cursor_bg = cursor, 135 - cursor_border = cursor, 136 - 137 - selection_fg = c.text, 138 - selection_bg = c.surface2, 139 - 140 - scrollbar_thumb = c.surface2, 141 - 142 - split = c.overlay0, 143 - 144 - ansi = { 145 - c.base, 146 - c.red, 147 - c.green, 148 - c.yellow, 149 - c.blue, 150 - c.pink, 151 - c.aqua, 152 - c.text, 153 - }, 154 - 155 - brights = { 156 - c.overlay1, 157 - c.red, 158 - c.green, 159 - c.yellow, 160 - c.blue, 161 - c.pink, 162 - c.aqua, 163 - c.subtext0, 164 - }, 165 - 166 - indexed = { [16] = c.peach, [17] = c.rosewater }, 167 - 168 - -- nightbuild only 169 - compose_cursor = c.text, 170 - 171 - tab_bar = { 172 - background = c.mantle, 173 - active_tab = { 174 - bg_color = c[accent], 175 - fg_color = c.crust, 176 - }, 177 - inactive_tab = { 178 - bg_color = c.surface0, 179 - fg_color = c.overlay1, 180 - }, 181 - inactive_tab_hover = { 182 - bg_color = c.surface1, 183 - fg_color = c.overlay1, 184 - }, 185 - new_tab = { 186 - bg_color = c.base, 187 - fg_color = c.overlay2, 188 - }, 189 - new_tab_hover = { 190 - bg_color = c.surface0, 191 - fg_color = c.subtext0, 192 - }, 193 - -- fancy tab bar 194 - inactive_tab_edge = c.surface0, 195 - }, 196 - 197 - visual_bell = c.surface0, 198 - } 199 - end 200 - 201 - local function select_for_appearance(appearance, options) 202 - if appearance:find("Dark") then 203 - return options.dark 204 - else 205 - return options.light 206 - end 207 - end 208 - 209 - local function tableMerge(t1, t2) 210 - for k, v in pairs(t2) do 211 - if type(v) == "table" then 212 - if type(t1[k] or false) == "table" then 213 - tableMerge(t1[k] or {}, t2[k] or {}) 214 - else 215 - t1[k] = v 216 - end 217 - else 218 - t1[k] = v 219 - end 220 - end 221 - return t1 222 - end 223 - 224 - function M.apply_to_config(c, opts) 225 - opts = opts or {} 226 - 227 - -- default options 228 - local defaults = { 229 - flavor = "fall", 230 - accent = "green", 231 - sync = false, 232 - sync_flavors = { light = "summer", dark = "fall" }, 233 - color_overrides = { 234 - fall = {}, 235 - }, 236 - token_overrides = { 237 - fall = {}, 238 - }, 239 - } 240 - 241 - local o = tableMerge(defaults, opts) 242 - 243 - -- insert all flavors 244 - local color_schemes = {} 245 - local palette = tableMerge(colors, o.color_overrides) 246 - for flavor, name in pairs(mappings) do 247 - local spec = M.select(palette, flavor, o.accent) 248 - local overrides = o.token_overrides[flavor] or {} 249 - color_schemes[name] = tableMerge(spec, overrides) 250 - end 251 - c.color_schemes = tableMerge(c.color_schemes or {}, color_schemes) 252 - 253 - if opts.sync then 254 - c.color_scheme = select_for_appearance(wezterm.gui.get_appearance(), { 255 - dark = mappings[o.sync_flavors.dark], 256 - light = mappings[o.sync_flavors.light], 257 - }) 258 - c.command_palette_bg_color = select_for_appearance(wezterm.gui.get_appearance(), { 259 - dark = colors[o.sync_flavors.dark].crust, 260 - light = colors[o.sync_flavors.light].crust, 261 - }) 262 - c.command_palette_fg_color = select_for_appearance(wezterm.gui.get_appearance(), { 263 - dark = colors[o.sync_flavors.dark].text, 264 - light = colors[o.sync_flavors.light].text, 265 - }) 266 - else 267 - c.color_scheme = mappings[o.flavor] 268 - c.command_palette_bg_color = colors[o.flavor].crust 269 - c.command_palette_fg_color = colors[o.flavor].text 270 - end 271 - 272 - local window_frame = { 273 - active_titlebar_bg = colors[o.flavor].crust, 274 - active_titlebar_fg = colors[o.flavor].text, 275 - inactive_titlebar_bg = colors[o.flavor].crust, 276 - inactive_titlebar_fg = colors[o.flavor].text, 277 - button_fg = colors[o.flavor].text, 278 - button_bg = colors[o.flavor].base, 279 - } 280 - 281 - c.window_frame = tableMerge(c.window_frame or {}, window_frame) 282 - end 283 - 284 - return M
-18
home/robin/gui/wezterm/cfg/utils.lua
··· 1 - local wezterm = require("wezterm") 2 - local M = {} 3 - 4 - M.is_windows = function() 5 - return wezterm.target_triple:find("windows") ~= nil 6 - end 7 - 8 - ---@return boolean 9 - M.is_linux = function() 10 - return wezterm.target_triple:find("linux") ~= nil 11 - end 12 - 13 - ---@return boolean 14 - M.is_darwin = function() 15 - return wezterm.target_triple:find("darwin") ~= nil 16 - end 17 - 18 - return M
-138
home/robin/gui/wezterm/cfg/wezterm.lua
··· 1 - local utils = require("utils") 2 - local wezterm = require("wezterm") 3 - 4 - local c = {} 5 - if wezterm.c_builder then 6 - c = wezterm.config_builder() 7 - end 8 - 9 - c.enable_wayland = true 10 - 11 - -- theme 12 - require("palette").apply_to_config(c, { 13 - flavor = "winter", 14 - accent = "skye", 15 - }) 16 - require("bar").apply_to_config(c, { 17 - dividers = "rounded", 18 - }) 19 - 20 - if utils.is_linux() then 21 - c.window_background_opacity = 0.92 22 - elseif utils.is_darwin() then 23 - c.window_background_opacity = 0.92 24 - c.macos_window_background_blur = 15 25 - elseif utils.is_windows() then 26 - -- c.window_background_image = "" 27 - -- c.window_background_image_hsb = { 28 - -- brightness = 0.03, -- make the bg darker so we can see what we are doing 29 - -- } 30 - -- c.win32_system_backdrop = "Tabbed" 31 - -- c.window_background_opacity = 0.95 32 - -- c.background = { 33 - -- { 34 - -- source = { 35 - -- File = "D:\\pictures\\wallpapers\\frieren\\wallhaven-l87gvr.jpg", 36 - -- }, 37 - -- hsb = { 38 - -- brightness = 0.05, 39 - -- saturation = 1.02, 40 - -- }, 41 - -- } 42 - -- } 43 - c.window_background_opacity = 0.92 44 - c.win32_system_backdrop = "Mica" 45 - end 46 - 47 - -- load my keybinds 48 - require("keybinds").apply(c) 49 - 50 - -- default shell 51 - if utils.is_linux() or utils.is_darwin() then 52 - c.default_prog = { "/etc/profiles/per-user/robin/bin/zsh", "--login" } 53 - elseif utils.is_windows() then 54 - c.default_prog = { "wsl.exe" } 55 - c.default_domain = "WSL:NixOS" 56 - c.launch_menu = { 57 - { 58 - label = "PowerShell", 59 - args = { "pwsh.exe", "-NoLogo" }, 60 - domain = { DomainName = "local" }, 61 - }, 62 - { 63 - label = "WSL", 64 - args = { "wsl.exe" }, 65 - domain = { DomainName = "WSL:NixOS" }, 66 - }, 67 - } 68 - end 69 - 70 - if utils.is_linux() then 71 - c.window_decorations = "TITLE | RESIZE" 72 - else 73 - c.window_decorations = "RESIZE" 74 - end 75 - 76 - c.window_padding = { left = 0, right = 0, top = 0, bottom = 0 } 77 - 78 - -- fonts 79 - local font = wezterm.font_with_fallback({ 80 - { 81 - family = "Maple Mono", 82 - harfbuzz_features = { 83 - "zero", 84 - "cv01", -- `@ $ & % Q => ->` without gap 85 - 86 - -- consistent style 87 - -- "cv33", -- italic `i` j with left bottom bar and horizen top bar, just like regular style 88 - 89 - -- no tails 90 - "cv34", -- italic `k` without circle, just like regular style 91 - "cv35", -- italic `l` without tail, just like regular style 92 - -- "cv36", -- italic `x` without tails, just like regular style 93 - -- "ss06", -- Break connected strokes between italic letters (al, ul, il ...) 94 - 95 - -- disable ligatures 96 - "ss01", -- Broken equals ligatures (==, ===, !=, !==, =/=) 97 - "ss02", -- Broken compare and equal ligatures (<=, >=) 98 - "ss04", -- Break multiple underscores (__, #__) 99 - 100 - "ss03", -- Enable arbitrary tag (allow to use any case in all tags) 101 - 102 - "ss05", -- Thin backslash in escape letters (\w, \n, \r ...) 103 - 104 - "ss07", -- Relax the conditions for multiple greaters ligatures (>> or >>>) 105 - -- "ss08", -- Enable double headed arrows and reverse arrows (>>=, -<<, ->>, >- ...) 106 - }, 107 - }, 108 - { family = "Symbols Nerd Font" }, 109 - }) 110 - c.font = font 111 - c.font_size = 12 112 - c.allow_square_glyphs_to_overflow_width = "WhenFollowedBySpace" 113 - c.freetype_load_target = "Light" 114 - c.freetype_load_flags = "FORCE_AUTOHINT" 115 - c.adjust_window_size_when_changing_font_size = false 116 - c.window_frame = { 117 - font = font, 118 - font_size = c.font_size, 119 - } 120 - c.line_height = 1.1 121 - 122 - -- QOL 123 - c.audible_bell = "Disabled" 124 - c.default_cursor_style = "BlinkingBar" 125 - c.window_close_confirmation = "NeverPrompt" 126 - -- c.prefer_to_spawn_tabs = true 127 - 128 - if utils.is_windows() then 129 - c.front_end = "OpenGL" 130 - else 131 - c.front_end = "WebGpu" 132 - end 133 - 134 - -- this is nix so lets not do it 135 - -- enable this if i ever setup nix to statically link 136 - c.check_for_updates = false 137 - 138 - return c
-13
home/robin/gui/wezterm/default.nix
··· 1 - { lib, config, ... }: 2 - { 3 - config = { 4 - programs.wezterm.enable = lib.mkDefault ( 5 - config.garden.profiles.graphical.enable && config.garden.programs.defaults.terminal == "wezterm" 6 - ); 7 - 8 - xdg.configFile."wezterm" = lib.mkIf config.programs.wezterm.enable { 9 - source = ./cfg; 10 - recursive = true; 11 - }; 12 - }; 13 - }
-11
home/robin/gui/zed.nix
··· 1 - { lib, config, ... }: 2 - let 3 - inherit (lib) mkIf; 4 - in 5 - { 6 - programs.zed-editor = 7 - mkIf (config.garden.profiles.graphical.enable && config.garden.profiles.workstation.enable) 8 - { 9 - enable = true; 10 - }; 11 - }
-83
home/robin/gui/zen-browser.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - inputs, 6 - inputs', 7 - ... 8 - }: 9 - let 10 - inherit (lib) mkIf; 11 - in 12 - { 13 - imports = [ 14 - inputs.zen-browser.homeModules.beta 15 - ]; 16 - 17 - config = 18 - mkIf (config.garden.profiles.graphical.enable && config.garden.programs.defaults.browser == "zen") 19 - { 20 - programs.zen-browser = { 21 - enable = true; 22 - package = lib.mkForce ( 23 - pkgs.wrapFirefox ( 24 - (inputs'.zen-browser.packages.beta-unwrapped.override { 25 - policies = lib.removeAttrs config.programs.zen-browser.policies [ "Preferences" ]; 26 - }).overrideAttrs 27 - (oa: { 28 - installPhase = (oa.installPhase or "") + '' 29 - mkdir -p $out/lib/zen-bin-${oa.version}/defaults/pref/ 30 - chmod 777 $out/lib/zen-bin-${oa.version}/defaults/pref/ 31 - cat > "$out/lib/zen-bin-${oa.version}/defaults/pref/config-prefs.js" << EOF 32 - pref("general.config.obscure_value", 0); 33 - pref("general.config.filename", "config.js"); 34 - // Sandbox needs to be disabled in release and Beta versions 35 - pref("general.config.sandbox_enabled", false); 36 - EOF 37 - cat > "$out/lib/zen-bin-${oa.version}/config.js" << EOF 38 - // skip 1st line 39 - try { 40 - let cmanifest = Cc['@mozilla.org/file/directory_service;1'].getService(Ci.nsIProperties).get('UChrm', Ci.nsIFile); 41 - cmanifest.append('utils'); 42 - cmanifest.append('chrome.manifest'); 43 - if(cmanifest.exists()){ 44 - Components.manager.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(cmanifest); 45 - ChromeUtils.importESModule('chrome://userchromejs/content/boot.sys.mjs'); 46 - } 47 - } catch(ex) {}; 48 - EOF 49 - ''; 50 - }) 51 - ) { } 52 - ); 53 - 54 - policies = { 55 - DisableAppUpdate = true; 56 - DisableFirefoxStudies = true; 57 - DisablePocket = true; 58 - DisableTelemetry = true; 59 - DontCheckDefaultBrowser = true; 60 - NoDefaultBookmarks = true; 61 - OfferToSaveLogins = false; 62 - Preferences = 63 - let 64 - locked = value: { 65 - Value = value; 66 - Status = "locked"; 67 - }; 68 - inherit (config.evergarden) variant accent; 69 - palette = inputs.evergarden.lib.palette.${variant}; 70 - in 71 - builtins.mapAttrs (_: locked) { 72 - "browser.tabs.warnOnClose" = false; 73 - "media.videocontrols.picture-in-picture.video-toggle.enabled" = true; 74 - "browser.tabs.groups.enabled" = true; 75 - "zen.urlbar.behavior" = "float"; 76 - "zen.theme.accent-color" = palette.${accent}; 77 - }; 78 - }; 79 - }; 80 - 81 - programs.zen-browser.nativeMessagingHosts = [ pkgs.firefoxpwa ]; 82 - }; 83 - }
-66
home/robin/packages.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - inputs', 6 - ... 7 - }: 8 - let 9 - inherit (lib) optionalAttrs mergeAttrsList; 10 - inherit (pkgs.stdenv.hostPlatform) isLinux; 11 - 12 - cfg = config.garden.profiles; 13 - in 14 - { 15 - garden.packages = mergeAttrsList [ 16 - (optionalAttrs cfg.workstation.enable { 17 - inherit (pkgs) 18 - unzip 19 - rsync 20 - just # cool build tool 21 - wakatime-cli 22 - nix-output-monitor # much nicer nix build output 23 - # wishlist # fancy ssh 24 - glow # fancy markdown 25 - # fx # fancy jq 26 - # gum # a nicer scripting 27 - jq # json parser 28 - yq # yaml parser 29 - ; 30 - 31 - inherit (inputs'.tgirlpkgs.packages) zzz; # code snippets in the cli 32 - }) 33 - 34 - (optionalAttrs cfg.graphical.enable { 35 - inherit (pkgs) 36 - # bitwarden-desktop # password manager 37 - # jellyfin-media-player 38 - # insomnia # rest client 39 - # inkscape # vector graphics editor 40 - # gimp # image editor 41 - manga-tui # tui manga finder + reader 42 - # bitwarden-cli # bitwarden, my chosen password manager 43 - # vhs # programmatically make gifs 44 - youtube-music 45 - ; 46 - }) 47 - 48 - (optionalAttrs (cfg.graphical.enable && isLinux) { 49 - inherit (pkgs) 50 - wl-gammactl 51 - brightnessctl # brightness managed via cli 52 - libnotify # needed for some notifications 53 - grim 54 - slurp 55 - wl-clipboard 56 - cliphist 57 - pwvucontrol 58 - feh 59 - ; 60 - }) 61 - 62 - (optionalAttrs cfg.workstation.enable { 63 - inherit (pkgs) zig; 64 - }) 65 - ]; 66 - }
-22
home/robin/services/clipboard.nix
··· 1 - { 2 - lib, 3 - self, 4 - pkgs, 5 - config, 6 - ... 7 - }: 8 - let 9 - inherit (lib) getExe mkIf; 10 - inherit (self.lib) mkGraphicalService; 11 - in 12 - { 13 - config = mkIf config.garden.profiles.graphical.enable { 14 - systemd.user.services.cliphist = mkGraphicalService { 15 - Unit.Description = "Clipboard history service"; 16 - Service = { 17 - ExecStart = "${pkgs.wl-clipboard}/bin/wl-paste --watch ${getExe pkgs.cliphist} store"; 18 - Restart = "always"; 19 - }; 20 - }; 21 - }; 22 - }
-7
home/robin/services/default.nix
··· 1 - { 2 - imports = [ 3 - ./clipboard.nix 4 - ./rnnoise.nix 5 - ./tray.nix 6 - ]; 7 - }
-49
home/robin/services/rnnoise.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - in 10 - { 11 - config = mkIf (config.garden.profiles.graphical.enable && pkgs.stdenv.hostPlatform.isLinux) { 12 - xdg.configFile."pipewire/pipewire.conf.d/99-input-denoising.conf".text = builtins.toJSON { 13 - "context.modules" = [ 14 - { 15 - "name" = "libpipewire-module-filter-chain"; 16 - "args" = { 17 - "node.description" = "Noise Canceling source"; 18 - "media.name" = "Noise Canceling source"; 19 - "filter.graph" = { 20 - "nodes" = [ 21 - { 22 - "type" = "ladspa"; 23 - "name" = "rnnoise"; 24 - "plugin" = "${pkgs.rnnoise-plugin}/lib/ladspa/librnnoise_ladspa.so"; 25 - "label" = "noise_suppressor_stereo"; 26 - "control" = { 27 - "VAD Threshold (%)" = 30.0; 28 - }; 29 - } 30 - ]; 31 - }; 32 - "audio.position" = [ 33 - "FL" 34 - "FR" 35 - ]; 36 - "capture.props" = { 37 - "node.name" = "effect_input.rnnoise"; 38 - "node.passive" = true; 39 - }; 40 - "playback.props" = { 41 - "node.name" = "effect_output.rnnoise"; 42 - "media.class" = "Audio/Source"; 43 - }; 44 - }; 45 - } 46 - ]; 47 - }; 48 - }; 49 - }
-17
home/robin/services/tray.nix
··· 1 - { 2 - lib, 3 - config, 4 - ... 5 - }: 6 - let 7 - inherit (lib) mkIf; 8 - in 9 - { 10 - config = mkIf config.garden.profiles.graphical.enable { 11 - # https://github.com/nix-community/home-manager/issues/2064 12 - systemd.user.targets.tray.Unit = { 13 - Description = "Home Manager System Tray"; 14 - Requires = [ "graphical-session-pre.target" ]; 15 - }; 16 - }; 17 - }
-6
home/robin/system/default.nix
··· 1 - { 2 - imports = [ 3 - ./secrets.nix # secrets management 4 - ./ssh.nix # ssh agent settings 5 - ]; 6 - }
-3
home/robin/system/secrets.nix
··· 1 - { 2 - sops.secrets = { }; 3 - }
-45
home/robin/system/ssh.nix
··· 1 - { 2 - programs.ssh = { 3 - enable = true; 4 - enableDefaultConfig = false; 5 - 6 - matchBlocks = { 7 - "*" = { 8 - forwardAgent = false; 9 - addKeysToAgent = "no"; 10 - compression = true; 11 - serverAliveInterval = 0; 12 - serverAliveCountMax = 3; 13 - hashKnownHosts = true; 14 - userKnownHostsFile = "~/.ssh/known_hosts"; 15 - controlMaster = "no"; 16 - controlPath = "~/.ssh/master-%r@%n:%p"; 17 - controlPersist = "no"; 18 - }; 19 - 20 - # git clients 21 - "github.com" = { 22 - user = "git"; 23 - hostname = "github.com"; 24 - identityFile = "~/.ssh/keys.github.id_ed25519"; 25 - }; 26 - 27 - "gitlab.com" = { 28 - user = "git"; 29 - hostname = "gitlab.com"; 30 - }; 31 - 32 - "git.isabelroses.com" = { 33 - user = "git"; 34 - hostname = "git.isabelroses.com"; 35 - port = 2222; 36 - identityFile = "~/.ssh/keys.gitisabel.id_ed25519"; 37 - }; 38 - 39 - "amity" = { 40 - hostname = "143.47.240.116"; 41 - identityFile = "~/.ssh/keys.amity.id_rsa"; 42 - }; 43 - }; 44 - }; 45 - }
-9
home/robin/themes/default.nix
··· 1 - { 2 - imports = [ 3 - ./evergarden.nix 4 - ./fonts.nix 5 - ./global.nix 6 - ./gtk.nix 7 - ./qt.nix 8 - ]; 9 - }
-12
home/robin/themes/evergarden.nix
··· 1 - { inputs, ... }: 2 - { 3 - imports = [ inputs.evergarden.homeManagerModules.default ]; 4 - 5 - config = { 6 - evergarden = { 7 - enable = true; 8 - variant = "winter"; 9 - accent = "pink"; 10 - }; 11 - }; 12 - }
-45
home/robin/themes/fonts.nix
··· 1 - { pkgs, ... }: 2 - let 3 - inherit (pkgs) ibm-plex; 4 - 5 - fnts = [ 6 - "Symbols Nerd Font" 7 - # fallbacks 8 - "Noto Sans Symbols" 9 - "Noto Sans Symbols2" 10 - ]; 11 - in 12 - { 13 - config = { 14 - garden.packages = { 15 - ibm-plex = ibm-plex.override { 16 - families = [ 17 - "serif" 18 - "sans" 19 - "sans-kr" 20 - "sans-jp" 21 - "mono" 22 - "math" 23 - ]; 24 - }; 25 - 26 - inherit (pkgs.tex-gyre) schola; 27 - inherit (pkgs) cozette; 28 - }; 29 - 30 - fonts.fontconfig.defaultFonts = { 31 - serif = [ 32 - "TeX Gyre Schola" 33 - "IBM Plex Serif" 34 - ] 35 - ++ fnts; 36 - 37 - sansSerif = [ 38 - "IBM Plex Sans" 39 - "IBM Plex Sans KR" 40 - "IBM Plex Sans JP" 41 - ] 42 - ++ fnts; 43 - }; 44 - }; 45 - }
-14
home/robin/themes/global.nix
··· 1 - { pkgs, config, ... }: 2 - { 3 - # pointer / cursor theming 4 - config.home.pointerCursor = { 5 - enable = pkgs.stdenv.hostPlatform.isLinux && config.garden.profiles.graphical.enable; 6 - name = "Capitaine Cursors"; 7 - package = pkgs.capitaine-cursors-themed; 8 - size = 24; 9 - dotIcons.enable = false; 10 - gtk.enable = true; 11 - # this adds extra deps, so lets only enable it on wayland 12 - x11.enable = false; 13 - }; 14 - }
-84
home/robin/themes/gtk.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - 10 - schema = pkgs.gsettings-desktop-schemas; 11 - 12 - cfg = config.garden.style; 13 - in 14 - { 15 - config = mkIf (config.garden.profiles.graphical.enable && pkgs.stdenv.hostPlatform.isLinux) { 16 - xdg.systemDirs.data = [ "${schema}/share/gsettings-schemas/${schema.name}" ]; 17 - 18 - garden.packages = { 19 - inherit (pkgs) glib; # gsettings 20 - }; 21 - 22 - home = { 23 - # gtk applications should use xdg specified settings 24 - sessionVariables.GTK_USE_PORTAL = "1"; 25 - }; 26 - 27 - gtk = { 28 - enable = true; 29 - 30 - font = { 31 - inherit (cfg.fonts) name size; 32 - }; 33 - 34 - gtk2 = { 35 - configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; 36 - extraConfig = '' 37 - gtk-xft-antialias=1 38 - gtk-xft-hinting=1 39 - gtk-xft-hintstyle="hintslight" 40 - gtk-xft-rgba="rgb" 41 - ''; 42 - }; 43 - 44 - gtk3.extraConfig = { 45 - # make things look nice 46 - gtk-application-prefer-dark-theme = true; 47 - 48 - gtk-decoration-layout = "appmenu:none"; 49 - 50 - gtk-xft-antialias = 1; 51 - gtk-xft-hinting = 1; 52 - gtk-xft-hintstyle = "hintslight"; 53 - 54 - # stop annoying sounds 55 - gtk-enable-event-sounds = 0; 56 - gtk-enable-input-feedback-sounds = 0; 57 - gtk-error-bell = 0; 58 - 59 - # config that is not the same as gtk4 60 - gtk-toolbar-style = "GTK_TOOLBAR_BOTH"; 61 - gtk-toolbar-icon-size = "GTK_ICON_SIZE_LARGE_TOOLBAR"; 62 - 63 - gtk-button-images = 1; 64 - gtk-menu-images = 1; 65 - }; 66 - 67 - gtk4.extraConfig = { 68 - # make things look nice 69 - gtk-application-prefer-dark-theme = true; 70 - 71 - gtk-decoration-layout = "appmenu:none"; 72 - 73 - gtk-xft-antialias = 1; 74 - gtk-xft-hinting = 1; 75 - gtk-xft-hintstyle = "hintslight"; 76 - 77 - # stop annoying sounds again 78 - gtk-enable-event-sounds = 0; 79 - gtk-enable-input-feedback-sounds = 0; 80 - gtk-error-bell = 0; 81 - }; 82 - }; 83 - }; 84 - }
-35
home/robin/themes/qt.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf; 9 - in 10 - { 11 - config = mkIf (config.garden.profiles.graphical.enable && pkgs.stdenv.hostPlatform.isLinux) { 12 - qt = { 13 - enable = true; 14 - platformTheme.name = "kvantum"; 15 - style.name = "kvantum"; 16 - }; 17 - 18 - home.sessionVariables = { 19 - # scaling - 1 means no scaling 20 - QT_AUTO_SCREEN_SCALE_FACTOR = "1"; 21 - 22 - # use wayland as the default backend, fallback to xcb if wayland is not available 23 - QT_QPA_PLATFORM = "wayland;xcb"; 24 - 25 - # disable window decorations everywhere 26 - QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; 27 - 28 - # remain backwards compatible with qt5 29 - DISABLE_QT5_COMPAT = "0"; 30 - 31 - # tell calibre to use the dark theme 32 - CALIBRE_USE_DARK_PALETTE = "1"; 33 - }; 34 - }; 35 - }
-10
home/robin/tui/default.nix
··· 1 - { 2 - imports = [ 3 - ./hyfetch 4 - ./izrss.nix 5 - ./lazygit.nix 6 - ./neovim.nix 7 - ./tmux.nix 8 - ./yazi.nix 9 - ]; 10 - }
-1
home/robin/tui/gh-dash.nix
··· 1 - { programs.gh-dash.enable = true; }
-41
home/robin/tui/hyfetch/default.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - { 8 - config = lib.mkIf config.garden.profiles.workstation.enable { 9 - garden.packages = { 10 - chaifetch = pkgs.writeShellApplication { 11 - name = "chaifetch"; 12 - text = '' 13 - hyfetch --ascii-file "${./kitty.ascii}" "$@" 14 - ''; 15 - runtimeInputs = [ 16 - pkgs.hyfetch 17 - pkgs.fastfetch 18 - ]; 19 - }; 20 - }; 21 - 22 - xdg.configFile."hyfetch.json" = { 23 - text = '' 24 - { 25 - "preset": "lesbian", 26 - "mode": "rgb", 27 - "auto_detect_light_dark": false, 28 - "light_dark": "dark", 29 - "lightness": 0.65, 30 - "color_align": { 31 - "mode": "horizontal" 32 - }, 33 - "backend": "fastfetch", 34 - "args": null, 35 - "distro": "nixos_small", 36 - "pride_month_disable": false 37 - } 38 - ''; 39 - }; 40 - }; 41 - }
-4
home/robin/tui/hyfetch/kitty.ascii
··· 1 - /l、 2 - (゚、 。 7 3 - l ~ヽ 4 - じしf_,)ノ
-54
home/robin/tui/izrss.nix
··· 1 - { config, ... }: 2 - { 3 - programs.izrss = { 4 - inherit (config.garden.profiles.workstation) enable; 5 - 6 - settings = { 7 - reader.size = "full"; 8 - 9 - urls = [ 10 - "https://isabelroses.com/feed.xml" 11 - "https://robinroses.xyz/feed.xml" 12 - "https://uncenter.dev/feed.xml" 13 - "https://aprl.cat/rss.xml" 14 - 15 - # cool people 16 - # keep-sorted start 17 - "https://aly.codes/index.xml" 18 - "https://antfu.me/feed.xml" 19 - "https://cafkafk.dev/index.xml" 20 - "https://fasterthanli.me/index.xml" 21 - "https://jade.fyi/rss.xml" 22 - "https://mitchellh.com/feed.xml" 23 - "https://mrcjkb.dev/atom.xml" 24 - # keep-sorted end 25 - # cool orgs 26 - # keep-sorted start 27 - "https://100r.co/links/rss.xml" 28 - "https://charm.sh/blog/rss.xml" 29 - # keep-sorted end 30 - 31 - # keep-sorted start 32 - "https://basil.cafe/feeds/posts.xml" 33 - "https://blog.gitbutler.com/rss/" 34 - "https://blog.ihatereality.space/atom.xml" 35 - "https://blog.orhun.dev/rss.xml" 36 - "https://boxesandarrows.com/feed/" 37 - "https://browsercompany.substack.com/feed" 38 - "https://dataswamp.org/~solene/rss-html.xml" 39 - "https://dotfyle.com/this-week-in-neovim/rss.xml" 40 - "https://feeds.feedburner.com/tom-preston-werner" 41 - "https://github.blog/open-source/feed/" 42 - "https://hypr.land/rss.xml" 43 - "https://maia.crimew.gay/feed.xml" 44 - "https://medium.com/feed/better-programming" 45 - "https://namishh.me/rss.xml" 46 - "https://nixpkgs.news/rss.xml" 47 - "https://overreacted.io/rss.xml" 48 - "https://sapphic.moe/rss.xml" 49 - "https://xeiaso.net/blog.rss" 50 - # keep-sorted end 51 - ]; 52 - }; 53 - }; 54 - }
-24
home/robin/tui/lazygit.nix
··· 1 - { config, ... }: 2 - { 3 - config.programs.lazygit = { 4 - inherit (config.garden.profiles.workstation) enable; 5 - 6 - settings = { 7 - update.method = "never"; 8 - 9 - gui = { 10 - nerdFontsVersion = 3; 11 - authorColors = { 12 - comfysage = "#b2c98f"; 13 - robin = "#b2c98f"; 14 - isabel = "#f5c2e7"; 15 - }; 16 - }; 17 - 18 - git.paging = { 19 - colorArg = "always"; 20 - pager = "delta --paging=never"; 21 - }; 22 - }; 23 - }; 24 - }
-12
home/robin/tui/neovim.nix
··· 1 - { inputs, config, ... }: 2 - { 3 - imports = [ 4 - inputs.ivy.homeModules.default 5 - ]; 6 - 7 - programs.ivy = { 8 - enable = true; 9 - includePerLanguageTooling = config.garden.profiles.workstation.enable; 10 - gui.enable = config.garden.profiles.graphical.enable; 11 - }; 12 - }
-150
home/robin/tui/tmux.nix
··· 1 - { 2 - lib, 3 - pkgs, 4 - config, 5 - ... 6 - }: 7 - let 8 - inherit (lib) mkIf mkAfter; 9 - 10 - inherit (config.garden.programs.defaults) shell; 11 - in 12 - { 13 - config = mkIf config.garden.profiles.workstation.enable { 14 - programs.zsh = { 15 - initContent = 16 - mkAfter 17 - # zsh 18 - '' 19 - function _fn_tmux_session() { 20 - name="''${1:-$(basename $PWD)}" 21 - tmux new-session -s ''${name} 22 - } 23 - function _fn_tmux_start() { 24 - spath=''${1:-$PWD} 25 - tmux new-session -s "$(basename $spath)" -c "$(realpath $spath)" 26 - } 27 - function _fn_tmux_attach() { 28 - if [[ -n "$1" ]]; then 29 - tmux attach -t "$1" 30 - else 31 - tmux attach 32 - fi 33 - } 34 - 35 - function _fn_tmux_fzf_sessions() { 36 - name=$(tmux ls -F "#S" | fzf) 37 - [[ -z "$name" ]] || _fn_tmux_attach "$name"; 38 - } 39 - function _fn_tmux_fzf_dev() { 40 - dir="$(realpath ''${1:-''${XDG_DEV_DIR}})" 41 - spath=$(fd --absolute-path --base-directory=$dir --no-ignore '^.git$' | awk -F '.git/' '{print $1}' | fzf) 42 - [[ -z "$spath" ]] || _fn_tmux_start "$spath" 43 - } 44 - function _fn_tmux_zoxide() { 45 - [[ -z "$1" ]] && return 46 - _fn_tmux_start "$(zoxide query "$1")" 47 - } 48 - function _fn_tmux_zoxide_fzf() { 49 - _fn_tmux_start "$(zoxide query -i)" 50 - } 51 - ''; 52 - 53 - shellAliases = { 54 - tms = "_fn_tmux_session"; 55 - tmsa = "_fn_tmux_start"; 56 - tml = "tmux list-sessions"; 57 - tma = "_fn_tmux_attach"; 58 - tmat = "tmux attach -t"; 59 - ts = "tmux split-window -c \"#{pane_current_path}\" -p 20 \"make test; read\""; 60 - 61 - tmla = "_fn_tmux_fzf_sessions"; 62 - tmds = "_fn_tmux_fzf_dev"; 63 - tmza = "_fn_tmux_zoxide"; 64 - tmzs = "_fn_tmux_zoxide_fzf"; 65 - }; 66 - }; 67 - 68 - evergarden.tmux.extraConfig = '' 69 - set -gq @window_left_separator "" 70 - set -gq @window_right_separator "" 71 - ''; 72 - 73 - programs.tmux = { 74 - enable = true; 75 - 76 - prefix = "M-p"; 77 - keyMode = "vi"; 78 - reverseSplit = true; 79 - mouse = true; 80 - shell = "/run/current-system/sw/bin/${shell}"; 81 - 82 - plugins = [ 83 - { 84 - plugin = pkgs.tmuxPlugins.tmux-fzf; 85 - extraConfig = '' 86 - TMUX_FZF_LAUNCH_KEY="space" 87 - ''; 88 - } 89 - ]; 90 - 91 - extraConfig = # tmux 92 - '' 93 - bind-key r source-file ~/.config/tmux/tmux.conf \; \ 94 - display-message "source-file done" 95 - 96 - # vim esc key delay fix 97 - 98 - set -sg escape-time 1 99 - 100 - bind-key a choose-window 101 - 102 - # better session switching 103 - 104 - bind -n M-. switch-client -p 105 - bind -n M-, switch-client -n 106 - 107 - # better window switching 108 - 109 - bind -n S-Left previous-window 110 - bind -n S-Right next-window 111 - 112 - bind-key '"' command-prompt -I "#{session_name}" "rename-session -- '%%'" 113 - 114 - bind-key w display-popup -E -w 80% -h 80% -d "#{pane_current_path}" 115 - 116 - bind-key e split-window -l 16 -c "#{pane_current_path}" 117 - bind-key E split-window -c "#{pane_current_path}" -l 16 "make test; read" 118 - 119 - set -g status-style bg=default 120 - 121 - set -g set-titles on 122 - set -g set-titles-string "#S :: #W │ #{pane_title}" 123 - 124 - set-option -g status-position bottom 125 - set-option -g status-justify left 126 - 127 - set-option -g status-style fg=default,bg=default 128 - 129 - # Left side of status bar 130 - set-option -g status-left-length 100 131 - # set-option -g status-left "" 132 - 133 - # Window status 134 - # set-option -g window-status-format "#[fg=#{@thm_overlay1},bg=#{@thm_surface0}] #I · #W " 135 - # set-option -g window-status-current-format "#[fg=#{@thm_subtext1},bg=#{@thm_surface0}] #I · #W " 136 - # set-option -g window-status-separator "" 137 - 138 - # Right side of status bar 139 - set-option -g status-right-length 100 140 - # # set-option -g status-right "#[bg=default] %a, %d %b #[bg=default] %R " 141 - # set-option -g status-right '#[fg=black,bg=cyan] #S #[fg=default,bg=default]#[fg=colour15]#{?#{!=:#{b:session_path},#{session_name}}, #{b:session_path} ,}#[fg=default]#[fg=magenta] #{s/\$//:#{session_id}} / #{server_sessions} #[fg=black,bg=magenta] %I:%M %P ' 142 - # set-option -g status-right '#[fg=#{@thm_subtext1},bg=#{@thm_surface0}] #S#{?#{!=:#{b:session_path},#{session_name}}, · #{b:session_path},} #[fg=#{@thm_crust},bg=#{@thm_pink}] %I:%M %P ' 143 - 144 - # pane border 145 - set-option -g pane-border-style bg=default,fg=colour8 146 - set-option -g pane-active-border-style bg=default,fg=colour8 147 - ''; 148 - }; 149 - }; 150 - }
-217
home/robin/tui/yazi.nix
··· 1 - { 2 - lib, 3 - config, 4 - ... 5 - }: 6 - { 7 - programs.yazi = lib.mkIf config.garden.profiles.workstation.enable { 8 - enable = true; 9 - 10 - settings = { 11 - mgr = { 12 - sorty_by = "extension"; 13 - show_hidden = true; 14 - show_symlink = true; 15 - sort_sensitive = true; 16 - }; 17 - opener = { 18 - edit = [ 19 - { 20 - run = ''$EDITOR "$@"''; 21 - block = true; 22 - for = "unix"; 23 - } 24 - ]; 25 - open = [ 26 - { 27 - run = ''xdg-open "$@"''; 28 - desc = "Open"; 29 - for = "linux"; 30 - } 31 - { 32 - run = ''open "$@"''; 33 - desc = "Open"; 34 - for = "macos"; 35 - } 36 - ]; 37 - reveal = [ 38 - { 39 - run = ''open -R "$1"''; 40 - desc = "Reveal"; 41 - for = "macos"; 42 - } 43 - { 44 - run = ''exiftool "$1"; echo "Press enter to exit"; read''; 45 - block = true; 46 - desc = "Show EXIF"; 47 - for = "unix"; 48 - } 49 - ]; 50 - extract = [ 51 - { 52 - run = ''unar "$1"''; 53 - desc = "Extract here"; 54 - for = "unix"; 55 - } 56 - ]; 57 - play = [ 58 - { 59 - run = ''mpv "$@"''; 60 - orphan = true; 61 - for = "unix"; 62 - } 63 - { 64 - run = ''mediainfo "$1"; echo "Press enter to exit"; read''; 65 - block = true; 66 - desc = "Show media info"; 67 - for = "unix"; 68 - } 69 - ]; 70 - }; 71 - open = { 72 - rules = [ 73 - { 74 - name = "*/"; 75 - use = [ 76 - "edit" 77 - "open" 78 - "reveal" 79 - ]; 80 - } 81 - 82 - { 83 - mime = "text/*"; 84 - use = [ 85 - "edit" 86 - "reveal" 87 - ]; 88 - } 89 - { 90 - mime = "image/*"; 91 - use = [ 92 - "open" 93 - "reveal" 94 - ]; 95 - } 96 - { 97 - mime = "video/*"; 98 - use = [ 99 - "play" 100 - "reveal" 101 - ]; 102 - } 103 - { 104 - mime = "audio/*"; 105 - use = [ 106 - "play" 107 - "reveal" 108 - ]; 109 - } 110 - { 111 - mime = "inode/x-empty"; 112 - use = [ 113 - "edit" 114 - "reveal" 115 - ]; 116 - } 117 - 118 - { 119 - mime = "application/json"; 120 - use = [ 121 - "edit" 122 - "reveal" 123 - ]; 124 - } 125 - { 126 - mime = "*/javascript"; 127 - use = [ 128 - "edit" 129 - "reveal" 130 - ]; 131 - } 132 - 133 - { 134 - mime = "application/zip"; 135 - use = [ 136 - "extract" 137 - "reveal" 138 - ]; 139 - } 140 - { 141 - mime = "application/gzip"; 142 - use = [ 143 - "extract" 144 - "reveal" 145 - ]; 146 - } 147 - { 148 - mime = "application/x-tar"; 149 - use = [ 150 - "extract" 151 - "reveal" 152 - ]; 153 - } 154 - { 155 - mime = "application/x-bzip"; 156 - use = [ 157 - "extract" 158 - "reveal" 159 - ]; 160 - } 161 - { 162 - mime = "application/x-bzip2"; 163 - use = [ 164 - "extract" 165 - "reveal" 166 - ]; 167 - } 168 - { 169 - mime = "application/x-7z-compressed"; 170 - use = [ 171 - "extract" 172 - "reveal" 173 - ]; 174 - } 175 - { 176 - mime = "application/x-rar"; 177 - use = [ 178 - "extract" 179 - "reveal" 180 - ]; 181 - } 182 - 183 - { 184 - mime = "*"; 185 - use = [ 186 - "open" 187 - "reveal" 188 - ]; 189 - } 190 - ]; 191 - }; 192 - }; 193 - 194 - theme = { 195 - manager = { 196 - tab_width = 1; 197 - border_symbol = " "; 198 - folder_offset = [ 199 - 1 200 - 0 201 - 1 202 - 0 203 - ]; 204 - preview_offset = [ 205 - 1 206 - 1 207 - 1 208 - 1 209 - ]; 210 - }; 211 - status = { 212 - separator_open = ""; 213 - separator_close = ""; 214 - }; 215 - }; 216 - }; 217 - }
-1
modules/nixos/users/default.nix
··· 2 2 imports = [ 3 3 # keep-sorted start 4 4 ./isabel.nix 5 - ./robin.nix 6 5 ./root.nix 7 6 # keep-sorted end 8 7 ];
-11
modules/nixos/users/robin.nix
··· 1 - { lib, config, ... }: 2 - let 3 - inherit (lib) elem mkIf; 4 - in 5 - { 6 - config = mkIf (elem "robin" config.garden.system.users) { 7 - users.users.robin = { 8 - hashedPassword = "$y$j9T$fjikoYmPQxjKqjobJ/vZC/$ULBf6ns9PS8EUHBeRbnd3QQbOSCtAe18JhK3UUy.nv2"; 9 - }; 10 - }; 11 - }
secrets/robin.yaml

This is a binary file and will not be displayed.

-60
systems/bmo/default.nix
··· 1 - { 2 - imports = [ 3 - ./hardware.nix 4 - ./users.nix 5 - ]; 6 - 7 - time.timeZone = "Europe/Amsterdam"; 8 - i18n.defaultLocale = "en_US.UTF-8"; 9 - 10 - catppuccin.enable = false; 11 - 12 - garden = { 13 - profiles = { 14 - laptop.enable = true; 15 - graphical.enable = true; 16 - workstation.enable = true; 17 - }; 18 - 19 - device = { 20 - cpu = "amd"; 21 - gpu = null; 22 - monitors = [ 23 - "eDP-1" 24 - "HDMI-A-1" 25 - ]; 26 - keyboard = "us"; 27 - capabilities = { 28 - tpm = true; 29 - bluetooth = true; 30 - }; 31 - }; 32 - 33 - system = { 34 - boot = { 35 - loader = "systemd-boot"; 36 - secureBoot = false; 37 - enableKernelTweaks = true; 38 - loadRecommendedModules = true; 39 - 40 - initrd = { 41 - enableTweaks = true; 42 - optimizeCompressor = true; 43 - }; 44 - }; 45 - 46 - bluetooth.enable = true; 47 - printing.enable = true; 48 - 49 - security = { 50 - fixWebcam = true; 51 - auditd.enable = true; 52 - }; 53 - 54 - networking = { 55 - optimizeTcp = true; 56 - wirelessBackend = "iwd"; 57 - }; 58 - }; 59 - }; 60 - }
-22
systems/bmo/hardware.nix
··· 1 - { 2 - fileSystems = { 3 - "/" = { 4 - device = "/dev/disk/by-uuid/44796f51-4f0a-471b-827b-e7b5a8050110"; 5 - fsType = "btrfs"; 6 - }; 7 - 8 - "/boot" = { 9 - device = "/dev/disk/by-uuid/8C3F-37AD"; 10 - fsType = "vfat"; 11 - options = [ 12 - "fmask=0022" 13 - "dmask=0022" 14 - ]; 15 - }; 16 - 17 - "/home/robin" = { 18 - device = "/dev/disk/by-uuid/d462c985-8c0c-4be7-98ee-af05dc259ba6"; 19 - fsType = "btrfs"; 20 - }; 21 - }; 22 - }
-25
systems/bmo/users.nix
··· 1 - { 2 - garden.system = { 3 - users = [ "robin" ]; 4 - }; 5 - 6 - home-manager.users.robin = { 7 - programs = { 8 - hyprland.enable = true; 9 - 10 - # programs 11 - firefox.enable = true; 12 - chromium.enable = true; 13 - 14 - discord.enable = true; 15 - }; 16 - 17 - garden.programs.defaults = { 18 - shell = "zsh"; 19 - terminal = "ghostty"; 20 - bar = "quickshell"; 21 - browser = "zen"; 22 - screenLocker = null; 23 - }; 24 - }; 25 - }
-10
systems/default.nix
··· 22 22 # modules = [ ]; 23 23 # specialArgs = { }; 24 24 hosts = { 25 - # isabel's hosts 26 25 # keep-sorted start block=yes newline_separated=yes 27 26 amaterasu = { }; 28 27 ··· 46 45 }; 47 46 48 47 valkyrie = { 49 - class = "wsl"; 50 - }; 51 - # keep-sorted end 52 - 53 - # robin's hosts 54 - # keep-sorted start block=yes newline_separated=yes 55 - bmo = { }; 56 - 57 - wisp = { 58 48 class = "wsl"; 59 49 }; 60 50 # keep-sorted end
-43
systems/wisp/default.nix
··· 1 - { 2 - imports = [ ./users.nix ]; 3 - 4 - garden = { 5 - profiles = { 6 - workstation.enable = true; 7 - headless.enable = true; 8 - }; 9 - 10 - device = { 11 - cpu = null; 12 - gpu = null; 13 - monitors = [ ]; 14 - capabilities = { 15 - tpm = true; 16 - bluetooth = true; 17 - }; 18 - keyboard = "us"; 19 - }; 20 - 21 - system = { 22 - boot = { 23 - loader = "none"; 24 - secureBoot = false; 25 - enableKernelTweaks = true; 26 - loadRecommendedModules = true; 27 - 28 - initrd = { 29 - enableTweaks = true; 30 - optimizeCompressor = true; 31 - }; 32 - }; 33 - 34 - bluetooth.enable = false; 35 - 36 - security = { 37 - auditd.enable = true; 38 - }; 39 - }; 40 - 41 - environment.flakePath = "/mnt/d/dev/dotfiles"; 42 - }; 43 - }
-14
systems/wisp/users.nix
··· 1 - { 2 - garden.system = { 3 - mainUser = "robin"; 4 - users = [ "robin" ]; 5 - }; 6 - 7 - home-manager.users.robin = { 8 - garden.programs.defaults.shell = "zsh"; 9 - 10 - programs = { 11 - zsh.enable = true; 12 - }; 13 - }; 14 - }