.dir-locals.el
.dir-locals.el
This is a binary file and will not be displayed.
+63
-2
README.md
+63
-2
README.md
···+My personal Nix and NixOS configuration for reproducible, declarative systems and environments across multiple hosts.+This is a personal configuration with limited applicability to others, though some patterns may be useful for reference.+Common self-hosting services have been extracted to a separate project, [Eilean](https://github.com/RyanGibb/eilean-nix).+See the [NixOS manual](https://nixos.org/manual/nixos/stable/#ch-installation) for how to install NixOS.+[`deploy-rs`](https://github.com/serokell/deploy-rs) can be used to update remote hosts via SSH with `deploy .#hostname`.+1. Install [Nix](https://nixos.org/download/) and [enable flakes](https://nixos.wiki/wiki/flakes#Other_Distros.2C_without_Home-Manager).+2. Clone this repository and follow the [Home Manager manual](https://nix-community.github.io/home-manager/index.xhtml#sec-install-standalone).+- [`flake.nix`](./flake.nix) - Entry point where inputs, outputs, and [overlays](https://nixos.org/manual/nixpkgs/stable/#chap-overlays) are defined.+- [`hosts/`](./hosts/) - Host-specific configurations where each subdirectory represents a separate machine.+- Servers are even-toed ungulates ([Artiodactyls](https://en.wikipedia.org/wiki/Artiodactyl)), e.g. the [Network-Attached Storage (NAS) server](https://ryan.freumh.org/nas.html) [`elephant`](./hosts/elephant).+- SBCs are small mammals ([Eulipotyphla](https://en.wikipedia.org/wiki/Eulipotyphla)), e.g. the [Home Assistant](https://www.home-assistant.io/) server and [Zigbee](https://en.wikipedia.org/wiki/Zigbee) bridge [`shrew`](./hosts/shrew).+- Desktops are carnivores ([Carnivora](https://en.wikipedia.org/wiki/Carnivora)), e.g. the tower PC [`vulpine`](./hosts/vulpine).+- Work-associated hosts are aquatic, e.g. the VPSs for [Eon](https://github.com/RyanGibb/eon) experiments [`duck`](./hosts/duck), and running the [EEG](https://www.cst.cam.ac.uk/research/eeg) infrastructure including using the federated [Shibboleth](https://www.shibboleth.net/) identity server to provision [Matrix](https://matrix.org/) accounts [`swan`](./hosts/swan).+- [`barnacle`](./hosts/barnacle/default.nix) builds an ISO image that can be written to media like a USB flash drive to create a read-only live USB that can be booted to provide the custom environment on all my other hosts and used to, for example, install an operating system, with the [`install.sh`](./hosts/barnacle/install.sh) script.+- `hardware-configuration.nix` - Hardware-specific configuration generated by `nixos-generate-config`.+- `minimal.nix` - A minimal configuration that can be useful when updating with insufficient disk space.+The minimal configuration can be build, the `default.nix` system garbage collected, and then the updated configuration built.+- [`modules/`](./modules/) - NixOS modules of common functionality extracted into modular components which can be enabled by host configurations.+- [`pkgs/`](./pkgs/) - Custom package definitions for packages not available in nixpkgs or requiring modifications.+To add a new secret, update [secrets.nix](./secrets/secrets.nix) and run `cd secrets && agenix -e <secret-name>.age`.
+227
-134
flake.lock
+227
-134
flake.lock
····················································································
··········································+"url": "https://github.com/lucide-icons/lucide/releases/download/0.483.0/lucide-icons-0.483.0.zip"+"url": "https://github.com/lucide-icons/lucide/releases/download/0.483.0/lucide-icons-0.483.0.zip"··········································
+48
-48
flake.nix
+48
-48
flake.nix
·······································
·······································+legacyPackages = inputs.nixpkgs.lib.genAttrs inputs.nixpkgs.lib.systems.flakeExposed (system: {
+4
-62
home/calendar.nix
+4
-62
home/calendar.nix
···
···
+63
-71
home/default.nix
+63
-71
home/default.nix
············# https://stackoverflow.com/questions/62182401/neovim-screen-lagging-when-switching-mode-from-insert-to-normal···-bind-key K run-shell 'tmux ls | grep -v attached | cut -d: -f1 | xargs -I {} tmux kill-window -t {}'
············# https://stackoverflow.com/questions/62182401/neovim-screen-lagging-when-switching-mode-from-insert-to-normal···
+2
-6
home/emacs/default.nix
+2
-6
home/emacs/default.nix
······
······
+33
-2
home/gui/default.nix
+33
-2
home/gui/default.nix
···············
···············+"${pkgs.coreutils}/bin/ln -fs %f ~/.cache/timewall/last_image && ${pkgs.swaybg}/bin/swaybg -i %f -c 282828 -m fill"
-1
home/gui/i3.nix
-1
home/gui/i3.nix
+1
-3
home/gui/sway.nix
+1
-3
home/gui/sway.nix
······
······
+18
-18
home/gui/wm/config.d/bindings
+18
-18
home/gui/wm/config.d/bindings
···-bindsym $mod+Escape exec st date workspace mail idle disk temperature load_average memory backlight player batterybindsym $mod+grave workspace back_and_forth ; exec dunstify -C `cat ~/.cache/st_id` && st workspace -t 500······bindsym $mod+bracketleft focus output left ; exec dunstify -C `cat ~/.cache/st_id` && st workspace -t 500bindsym $mod+bracketright focus output right ; exec dunstify -C `cat ~/.cache/st_id` && st workspace -t 500
···+bindsym $mod+Shift+Escape exec st date workspace mail idle disk temperature load_average memory backlight player batterybindsym $mod+grave workspace back_and_forth ; exec dunstify -C `cat ~/.cache/st_id` && st workspace -t 500······bindsym $mod+bracketleft focus output left ; exec dunstify -C `cat ~/.cache/st_id` && st workspace -t 500bindsym $mod+bracketright focus output right ; exec dunstify -C `cat ~/.cache/st_id` && st workspace -t 500
-1
home/gui/wm/i3/bindings
-1
home/gui/wm/i3/bindings
+7
home/gui/wm/scripts/dunst_restart.sh
+7
home/gui/wm/scripts/dunst_restart.sh
+1
-1
home/gui/wm/scripts/swayidle_dpms.sh
+1
-1
home/gui/wm/scripts/swayidle_dpms.sh
+1
-1
home/gui/wm/scripts/swayidle_inhibit.sh
+1
-1
home/gui/wm/scripts/swayidle_inhibit.sh
+1
-1
home/gui/wm/scripts/swayidle_lock.sh
+1
-1
home/gui/wm/scripts/swayidle_lock.sh
+1
-1
home/gui/wm/scripts/swayidle_lock_no_dpms.sh
+1
-1
home/gui/wm/scripts/swayidle_lock_no_dpms.sh
+2
-2
home/gui/wm/scripts/swayidle_suspend.sh
+2
-2
home/gui/wm/scripts/swayidle_suspend.sh
······
+1
-2
home/gui/wm/sway/bindings
+1
-2
home/gui/wm/sway/bindings
+6
-1
home/gui/wm/sway/exec
+6
-1
home/gui/wm/sway/exec
···
···
+19
-19
home/mail.nix
+19
-19
home/mail.nix
···${pkgs.ugrep}/bin/ugrep -jPh -m 100 --color=never "$1" cat ${config.accounts.email.maildirBasePath}/addressbook/cam-ldap)······macro index,pager <F1> '"<change-folder> ${config.accounts.email.maildirBasePath}/ryan@freumh.org/Inbox<enter>"'····································
···${pkgs.ugrep}/bin/ugrep -jPh -m 100 --color=never "$1" cat ${config.accounts.email.maildirBasePath}/addressbook/cam-ldap)······macro index,pager <F1> '"<change-folder> ${config.accounts.email.maildirBasePath}/ryan@freumh.org/Inbox<enter>"'·····················+onNotify = "${sync-mail}/bin/sync-mail ryan.gibb@cl.cam.ac.uk:INBOX ryan.gibb@cl.cam.ac.uk:Sidebox";·········+onNotify = "${sync-mail}/bin/sync-mail ryangibb321@gmail.com:INBOX ryangibb321@gmail.com:Sidebox";······
+314
-373
home/nvim/default.nix
+314
-373
home/nvim/default.nix
·········-vim.keymap.set('n', '<leader>xx', function() require('trouble').toggle() end, { desc = 'Trouble toggle' })-vim.keymap.set('n', '<leader>xw', function() require('trouble').toggle('workspace_diagnostics') end, { desc = 'Trouble workspace' })-vim.keymap.set('n', '<leader>xd', function() require('trouble').toggle('document_diagnostics') end, { desc = 'Trouble document' })-vim.keymap.set('n', '<leader>xq', function() require('trouble').toggle('quickfix') end, { desc = 'Trouble quickfix' })-vim.keymap.set('n', '<leader>xl', function() require('trouble').toggle('loclist') end, { desc = 'Trouble loclist' })-vim.keymap.set('n', '<leader>xr', function() require('trouble').toggle('lsp_references') end, { desc = 'Trouble LSP references' })-map('v', '<leader>gs', function() gitsigns.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end, { desc = 'Git stage hunk' })-map('v', '<leader>gr', function() gitsigns.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end, { desc = 'Git reset hunk' })-map('n', '<leader>gtb', gitsigns.toggle_current_line_blame, { desc = 'Git toggle line blame' })-vim.keymap.set({'n', 'x', 'o'}, 'gs', '<Plug>(leap-from-window)', { desc = "Leap from window"} )
·········+map('v', '<leader>gs', function() gitsigns.stage_hunk {vim.fn.line('.'), vim.fn.line('v')} end, { desc = 'Git stage hunk' })+map('v', '<leader>gr', function() gitsigns.reset_hunk {vim.fn.line('.'), vim.fn.line('v')} end, { desc = 'Git reset hunk' })+map('n', '<leader>gtb', gitsigns.toggle_current_line_blame, { desc = 'Git toggle line blame' })+vim.keymap.set({'n', 'x', 'o'}, 'gs', '<Plug>(leap-from-window)', { desc = "Leap from window"} )
+9
-8
home/nvim/init.lua
+9
-8
home/nvim/init.lua
·········vim.api.nvim_create_user_command('SaveSession', save_session, { nargs = '?', complete = session_completion })vim.api.nvim_create_user_command('LoadSession', load_session, { nargs = '?', complete = session_completion })
·········vim.api.nvim_create_user_command('SaveSession', save_session, { nargs = '?', complete = session_completion })vim.api.nvim_create_user_command('LoadSession', load_session, { nargs = '?', complete = session_completion })
+8
-8
home/nvim/lsp.lua
+8
-8
home/nvim/lsp.lua
···-vim.keymap.set('n', '<leader>li', vim.lsp.buf.implementation, { desc = 'Goto implementation' })-vim.keymap.set('n', '<leader>lt', vim.lsp.buf.type_definition, { desc = 'Goto type definition' })-vim.keymap.set('n', '<leader>lf', function() vim.lsp.buf.format { async = true } end, { desc = 'Format' })···-local servers = { 'nixd', 'ocamllsp', 'clangd', 'rust_analyzer', 'pyright', 'gopls', 'typst_lsp' }
···+vim.keymap.set('n', '<leader>ci', vim.lsp.buf.implementation, { desc = 'Goto implementation' })+vim.keymap.set('n', '<leader>ct', vim.lsp.buf.type_definition, { desc = 'Goto type definition' })+vim.keymap.set('n', '<leader>cf', function() vim.lsp.buf.format { async = true } end, { desc = 'Format' })···+local servers = { 'nixd', 'ocamllsp', 'clangd', 'rust_analyzer', 'pyright', 'gopls', 'typst_lsp', 'hls' }
+4
-7
home/nvim/nvim-cmp.lua
+4
-7
home/nvim/nvim-cmp.lua
·········
·········
-57
home/nvim/obsidian.lua
-57
home/nvim/obsidian.lua
···
···
+12
-10
home/nvim/telescope-nvim.lua
+12
-10
home/nvim/telescope-nvim.lua
···vim.keymap.set('n', '<leader>ff', require('telescope.builtin').find_files, { desc = 'Find files' })-vim.keymap.set('n', '<leader>fg', require('telescope.builtin').live_grep, { desc = 'Find grep' })vim.keymap.set('n', '<leader>fv', require('telescope.builtin').git_files, { desc = 'Find version control' })-vim.keymap.set('n', '<leader>fb', function() require('telescope.builtin').buffers({ sort_mru = true }) end, { desc = 'Find buffer' })-vim.keymap.set('n', '<leader>fh', require('telescope.builtin').help_tags, { desc = 'Find help' })-vim.keymap.set('n', '<leader>fq', require('telescope.builtin').command_history, { desc = 'Find command' })-vim.keymap.set('n', '<leader>fs', require('telescope.builtin').search_history, { desc = 'Find search' })vim.keymap.set('n', '<leader>fj', require('telescope.builtin').jumplist, { desc = 'Find jumplist' })vim.keymap.set('n', '<leader>fx', require('telescope.builtin').diagnostics, { desc = 'Find diagnostics' })vim.keymap.set('n', '<leader>fy', require('telescope.builtin').registers, { desc = 'Find registers' })vim.keymap.set('v', '<leader>fy', require('telescope.builtin').registers, { desc = 'Find registers' })-vim.keymap.set('n', '<leader>fr', require('telescope.builtin').lsp_references, { desc = 'Find references' })-vim.keymap.set('n', '<leader>fS', require('telescope.builtin').lsp_document_symbols, { desc = 'Find LSP symbols' })-vim.keymap.set('n', '<leader>fc', require('telescope.builtin').lsp_incoming_calls, { desc = 'Find LSP incoming calls' })-vim.keymap.set('n', '<leader>fo', require('telescope.builtin').lsp_outgoing_calls, { desc = 'Find LSP outgoing calls' })-vim.keymap.set('n', '<leader>fi', require('telescope.builtin').lsp_implementations, { desc = 'Find LSP implementations' })vim.keymap.set('n', '<leader>fu', require('telescope').extensions.undo.undo, { desc = 'Find undo' })vim.keymap.set('n', '<leader>fd', function() require('telescope').extensions.file_browser.file_browser({ path = '%:p:h', select_buffer = true }) end, { desc = 'Find directory' })
···vim.keymap.set('n', '<leader>ff', require('telescope.builtin').find_files, { desc = 'Find files' })+vim.keymap.set('n', '<leader><leader>', require('telescope.builtin').find_files, { desc = 'Find files' })+vim.keymap.set('n', '<leader>sd', require('telescope.builtin').live_grep, { desc = 'Search directory' })vim.keymap.set('n', '<leader>fv', require('telescope.builtin').git_files, { desc = 'Find version control' })+vim.keymap.set('n', '<leader>bb', function() require('telescope.builtin').buffers({ sort_mru = true }) end, { desc = 'Find buffer' })+vim.keymap.set('n', '<leader>h', require('telescope.builtin').help_tags, { desc = 'Find help' })+vim.keymap.set('n', '<leader>fq', require('telescope.builtin').commands, { desc = 'Find command' })+vim.keymap.set('n', '<leader>fQ', require('telescope.builtin').command_history, { desc = 'Find command history' })+vim.keymap.set('n', '<leader>f/', require('telescope.builtin').search_history, { desc = 'Find search' })vim.keymap.set('n', '<leader>fj', require('telescope.builtin').jumplist, { desc = 'Find jumplist' })vim.keymap.set('n', '<leader>fx', require('telescope.builtin').diagnostics, { desc = 'Find diagnostics' })vim.keymap.set('n', '<leader>fy', require('telescope.builtin').registers, { desc = 'Find registers' })vim.keymap.set('v', '<leader>fy', require('telescope.builtin').registers, { desc = 'Find registers' })+vim.keymap.set('n', '<leader>cD', require('telescope.builtin').lsp_references, { desc = 'Find references' })+vim.keymap.set('n', '<leader>cS', require('telescope.builtin').lsp_document_symbols, { desc = 'Find LSP symbols' })+vim.keymap.set('n', '<leader>cc', require('telescope.builtin').lsp_incoming_calls, { desc = 'Find LSP incoming calls' })+vim.keymap.set('n', '<leader>co', require('telescope.builtin').lsp_outgoing_calls, { desc = 'Find LSP outgoing calls' })+vim.keymap.set('n', '<leader>cfi', require('telescope.builtin').lsp_implementations, { desc = 'Find LSP implementations' })vim.keymap.set('n', '<leader>fu', require('telescope').extensions.undo.undo, { desc = 'Find undo' })vim.keymap.set('n', '<leader>fd', function() require('telescope').extensions.file_browser.file_browser({ path = '%:p:h', select_buffer = true }) end, { desc = 'Find directory' })
+4
home/zsh.cfg
+4
home/zsh.cfg
······
+3
-5
hosts/elephant/default.nix
+3
-5
hosts/elephant/default.nix
······
······
+97
-2
hosts/elephant/services.nix
+97
-2
hosts/elephant/services.nix
························failregex = ^.*\[warn\]\[Auth\]: Failed login attempt from user with incorrect Jellyfin credentials {"account":{"ip":"<HOST>","email":
························failregex = ^.*\[warn\]\[Auth\]: Failed login attempt from user with incorrect Jellyfin credentials {"account":{"ip":"<HOST>","email":+failregex = ^(?:\[\])?\s*WARN \{[^\}]*\} Login failed for user "<F-USER>[^"]*</F-USER>" IP-address: <ADDR>
+52
-6
hosts/gecko/default.nix
+52
-6
hosts/gecko/default.nix
·····················
·····················
+31
hosts/hippo/default.nix
+31
hosts/hippo/default.nix
···
···
+33
hosts/hippo/disk-config.nix
+33
hosts/hippo/disk-config.nix
···
···
+40
hosts/hippo/hardware-configuration.nix
+40
hosts/hippo/hardware-configuration.nix
···
···+hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
+6
-468
hosts/owl/default.nix
+6
-468
hosts/owl/default.nix
···-# sudo openssl x509 -in /var/lib/acme/mail.freumh.org/fullchain.pem -pubkey -noout | openssl pkey -pubin -outform der | sha256sum | awk '{print "3 1 1", $1}'-# openssl x509 -in ~/downloads/lets-encrypt-$i.pem -pubkey -noout | openssl pkey -pubin -outform der | sha256sum | awk '{print "2 1 1", $1}'-add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval' blob:; base-uri 'self'; frame-src 'self'; frame-ancestors 'self'; form-action 'self';" always;···
······
-3
hosts/owl/minimal.nix
-3
hosts/owl/minimal.nix
+518
hosts/owl/services.nix
+518
hosts/owl/services.nix
···
···+add_header Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval' blob:; base-uri 'self'; frame-src 'self'; frame-ancestors 'self'; form-action 'self';" always;+# sudo openssl x509 -in /var/lib/acme/mail.freumh.org/fullchain.pem -pubkey -noout | openssl pkey -pubin -outform der | sha256sum | awk '{print "3 1 1", $1}'+# openssl x509 -in ~/downloads/lets-encrypt-$i.pem -pubkey -noout | openssl pkey -pubin -outform der | sha256sum | awk '{print "2 1 1", $1}'
+2
-15
hosts/vulpine/default.nix
+2
-15
hosts/vulpine/default.nix
·········
·········
-57
modules/colour-guesser.nix
-57
modules/colour-guesser.nix
···
···
-1
modules/default.nix
-1
modules/default.nix
+9
-2
modules/gui/default.nix
+9
-2
modules/gui/default.nix
·········
·········
+4
modules/gui/sway.nix
+4
modules/gui/sway.nix
+1
modules/home-manager.nix
+1
modules/home-manager.nix
-2
modules/ocaml.nix
-2
modules/ocaml.nix
+2
-2
modules/ryan-website.nix
+2
-2
modules/ryan-website.nix
······
+4
-1
modules/workstation.nix
+4
-1
modules/workstation.nix
+10
-2
nix-on-droid/default.nix
+10
-2
nix-on-droid/default.nix
············
············
-3
scripts/backup.sh
-3
scripts/backup.sh
-7
scripts/obsidian_sync.sh
-7
scripts/obsidian_sync.sh
+1
secrets/secrets.nix
+1
secrets/secrets.nix
+7
secrets/tangled.age
+7
secrets/tangled.age
···
···+G๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ}w๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ{๏ฟฝ n๏ฟฝod&i,V๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝU๏ฟฝ๏ฟฝ%๏ฟฝ'!R46๏ฟฝ{>๏ฟฝ )>to๏ฟฝ]Hh๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ2F๏ฟฝ๏ฟฝA๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝTv๏ฟฝ!๏ฟฝ;๏ฟฝ๏ฟฝ๏ฟฝ)R๏ฟฝlM%U=|W"?*๏ฟฝ๏ฟฝe๏ฟฝ๏ฟฝ"๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝi๏ฟฝKB๏ฟฝF
-44
templates/host/default.nix
-44
templates/host/default.nix
···
···