infrastructure

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 7723d6647684fa1af930a709b5f646ccb04069ab
parent 334b4f3660b8bf8110de222c9661c887fcb688ca
Author: Silas Brack <silasbrack@gmail.com>
Date:   Tue, 19 May 2026 18:56:32 +0200

Merge branch 'main' into use-dwl

Diffstat:
Aconfig.h | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ahosts/isis.nix | 320+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 489 insertions(+), 0 deletions(-)

diff --git a/config.h b/config.h @@ -0,0 +1,169 @@ +/* Taken from https://github.com/djpohly/dwl/issues/466 */ +#define COLOR(hex) { ((hex >> 24) & 0xFF) / 255.0f, \ + ((hex >> 16) & 0xFF) / 255.0f, \ + ((hex >> 8) & 0xFF) / 255.0f, \ + (hex & 0xFF) / 255.0f } +/* appearance */ +static const int sloppyfocus = 1; /* focus follows mouse */ +static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ +static const unsigned int borderpx = 1; /* border pixel of windows */ +static const float rootcolor[] = COLOR(0x222222ff); +static const float bordercolor[] = COLOR(0x444444ff); +static const float focuscolor[] = COLOR(0x005577ff); +static const float urgentcolor[] = COLOR(0xff0000ff); +/* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */ +static const float fullscreen_bg[] = {0.0f, 0.0f, 0.0f, 1.0f}; /* You can also use glsl colors */ + +/* tagging - TAGCOUNT must be no greater than 31 */ +#define TAGCOUNT (9) + +/* logging */ +static int log_level = WLR_ERROR; + +static const Rule rules[] = { + /* app_id title tags mask isfloating monitor */ + { "Gimp_EXAMPLE", NULL, 0, 1, -1 }, /* Start on currently visible tags floating, not tiled */ + { "firefox_EXAMPLE", NULL, 1 << 8, 0, -1 }, /* Start on ONLY tag "9" */ + /* default/example rule: can be changed but cannot be eliminated; at least one rule must exist */ +}; + +/* layout(s) */ +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, +}; + +/* monitors */ +/* (x=-1, y=-1) is reserved as an "autoconfigure" monitor position indicator + * WARNING: negative values other than (-1, -1) cause problems with Xwayland clients due to + * https://gitlab.freedesktop.org/xorg/xserver/-/issues/899 */ +static const MonitorRule monrules[] = { + /* name mfact nmaster scale layout rotate/reflect x y */ + { "eDP-1", 0.5f, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, -1, -1 }, +}; + +/* keyboard */ +static const struct xkb_rule_names xkb_rules = { + /* can specify fields: rules, model, layout, variant, options */ + /* example: + .options = "ctrl:nocaps", + */ + .options = NULL, +}; + +static const int repeat_rate = 25; +static const int repeat_delay = 600; + +/* Trackpad */ +static const int tap_to_click = 1; +static const int tap_and_drag = 1; +static const int drag_lock = 1; +static const int natural_scrolling = 0; +static const int disable_while_typing = 1; +static const int left_handed = 0; +static const int middle_button_emulation = 0; +/* You can choose between: +LIBINPUT_CONFIG_SCROLL_NO_SCROLL +LIBINPUT_CONFIG_SCROLL_2FG +LIBINPUT_CONFIG_SCROLL_EDGE +LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN +*/ +static const enum libinput_config_scroll_method scroll_method = LIBINPUT_CONFIG_SCROLL_2FG; + +/* You can choose between: +LIBINPUT_CONFIG_CLICK_METHOD_NONE +LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS +LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER +*/ +static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS; + +/* You can choose between: +LIBINPUT_CONFIG_SEND_EVENTS_ENABLED +LIBINPUT_CONFIG_SEND_EVENTS_DISABLED +LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE +*/ +static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED; + +/* You can choose between: +LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT +LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE +*/ +static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE; +static const double accel_speed = 0.0; + +/* You can choose between: +LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle +LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right +*/ +static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM; + +/* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */ +#define MODKEY WLR_MODIFIER_LOGO + +#define TAGKEYS(KEY,SKEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} } + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static const char *termcmd[] = { "foot", NULL }; +static const char *menucmd[] = { "wmenu-run", NULL }; + +static const Key keys[] = { + /* Note that Shift changes certain key codes: 2 -> at, etc. */ + /* modifier key function argument */ + { MODKEY, XKB_KEY_p, spawn, {.v = menucmd} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, + { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, + { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, + { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, + { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, + { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, + { MODKEY, XKB_KEY_l, setmfact, {.f = +0.05f} }, + { MODKEY, XKB_KEY_Return, zoom, {0} }, + { MODKEY, XKB_KEY_Tab, view, {0} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_c, killclient, {0} }, + { MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XKB_KEY_space, setlayout, {0} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, + { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, + { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} }, + { MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} }, + { MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} }, + TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0), + TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1), + TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2), + TAGKEYS( XKB_KEY_4, XKB_KEY_dollar, 3), + TAGKEYS( XKB_KEY_5, XKB_KEY_percent, 4), + TAGKEYS( XKB_KEY_6, XKB_KEY_asciicircum, 5), + TAGKEYS( XKB_KEY_7, XKB_KEY_ampersand, 6), + TAGKEYS( XKB_KEY_8, XKB_KEY_asterisk, 7), + TAGKEYS( XKB_KEY_9, XKB_KEY_parenleft, 8), + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_q, quit, {0} }, + + /* Ctrl-Alt-Backspace and Ctrl-Alt-Fx used to be handled by X server */ + { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_Terminate_Server, quit, {0} }, + /* Ctrl-Alt-Fx is used to switch to another VT, if you don't know what a VT is + * do not remove them. + */ +#define CHVT(n) { WLR_MODIFIER_CTRL|WLR_MODIFIER_ALT,XKB_KEY_XF86Switch_VT_##n, chvt, {.ui = (n)} } + CHVT(1), CHVT(2), CHVT(3), CHVT(4), CHVT(5), CHVT(6), + CHVT(7), CHVT(8), CHVT(9), CHVT(10), CHVT(11), CHVT(12), +}; + +static const Button buttons[] = { + { MODKEY, BTN_LEFT, moveresize, {.ui = CurMove} }, + { MODKEY, BTN_MIDDLE, togglefloating, {0} }, + { MODKEY, BTN_RIGHT, moveresize, {.ui = CurResize} }, +}; diff --git a/hosts/isis.nix b/hosts/isis.nix @@ -0,0 +1,320 @@ +{ config, pkgs, lib, ... }: + +{ + imports = [ + ./hardware-configuration.nix + ]; + + nix.settings.experimental-features = [ + "nix-command" + "flakes" + ]; + nix.gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 30d"; + }; + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + networking.hostName = "isis"; + networking.networkmanager.enable = true; + + time.timeZone = "Europe/Copenhagen"; + i18n.defaultLocale = "en_GB.UTF-8"; + i18n.extraLocaleSettings = { + LC_ADDRESS = "da_DK.UTF-8"; + LC_IDENTIFICATION = "da_DK.UTF-8"; + LC_MEASUREMENT = "da_DK.UTF-8"; + LC_MONETARY = "da_DK.UTF-8"; + LC_NAME = "da_DK.UTF-8"; + LC_NUMERIC = "da_DK.UTF-8"; + LC_PAPER = "da_DK.UTF-8"; + LC_TELEPHONE = "da_DK.UTF-8"; + LC_TIME = "da_DK.UTF-8"; + }; + + services.displayManager.ly.enable = true; + programs.dwl = { + enable = true; + package = (pkgs.dwl.override { + configH = ./dwl/config.h; + }); + }; + + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + + nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ + "claude-code" + ]; + + fonts = { + enableDefaultPackages = true; + packages = with pkgs; [ + jetbrains-mono + nerd-fonts.jetbrains-mono + nerd-fonts.iosevka + ibm-plex + merriweather + libertinus + paratype-pt-sans + ]; + fontconfig = { + enable = true; + hinting.style = "slight"; + subpixel.rgba = "rgb"; + defaultFonts = { + sansSerif = [ "IBM Plex Sans" ]; + serif = [ "Merriweather" ]; + monospace = [ "JetBrains Mono" ]; + }; + confPackages = [ + (pkgs.writeTextDir "etc/fonts/conf.d/99-math.conf" '' + <?xml version="1.0"?> + <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> + <fontconfig> + <alias> + <family>math</family> + <prefer> + <family>Libertinus</family> + </prefer> + </alias> + </fontconfig> + '') + ]; + }; + }; + + users.users.silas = { + isNormalUser = true; + description = "Silas"; + extraGroups = [ + "networkmanager" + "wheel" + "audio" + ]; + packages = with pkgs; [ + rbw + claude-code + (emacs.pkgs.withPackages (ep: [ + ep.magit + ep.expand-region + (ep.treesit-grammars.with-grammars (g: [ g.tree-sitter-nix ])) + ])) + fd + feh + foot + fzf + mpv + pinentry-tty + ripgrep + zathura + ]; + }; + + programs.firefox = { + enable = true; + package = (pkgs.wrapFirefox (pkgs.firefox-unwrapped.override { pipewireSupport = true;}) {}); + preferences = { + # "browser.startup.homepage" = "https://example.com"; + "privacy.resistFingerprinting" = true; + "browser.urlbar.quicksuggest.online.enabled" = false; + "browser.urlbar.suggest.quicksuggest.sponsored" = false; + "browser.ml.chat.enabled" = false; + "browser.newtabpage.activity-stream.showSponsored" = false; + "browser.newtabpage.activity-stream.showSponsoredCheckboxes" = false; + "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; + + # Don't let websites override my font choices + "browser.display.use_document_fonts" = 0; + }; + policies = { + SearchEngines = { + Default = "Kagi"; + + # Remove built-ins you don't want + Remove = [ "Google" "Bing" "eBay" "DuckDuckGo" "Perplexity" ]; + + # Add custom engines + Add = [ + { + Name = "Kagi"; + URLTemplate = "https://kagi.com/search?q={searchTerms}"; + IconURL = "https://kagi.com/asset/de8b73c/kagi_assets/logos/search.svg"; + Alias = "k"; + } + ]; + }; + DisableTelemetry = true; + SearchSuggestEnabled = false; + DontCheckDefaultBrowser = true; + }; + }; + + programs.dconf.enable = true; + + programs.bash = { + enable = true; + interactiveShellInit = '' + bws() { + rbw list | fzf | xargs -I _ rbw get -c _ + } + + loadenv() { + set -a; + source "''\${1:-.env}"; + set +a; + } + ''; + }; + + programs.git = { + enable = true; + config = { + user = { + name = "Silas Brack"; + email = "silasbrack@gmail.com"; + }; + }; + }; + + programs.vim = { + enable = true; + defaultEditor = true; + package = (pkgs.vim.override { }).customize { + name = "vim"; + vimrcConfig.customRC = '' + set backspace=indent,eol,start + + set showmatch + set incsearch + set hlsearch + set ignorecase + set smartcase + + set wildmenu + set wildoptions=pum + + set hidden + + set autoindent + + set number + set relativenumber + + set tabstop=4 + set shiftwidth=4 + + set expandtab + set showmatch + + filetype plugin indent on + syntax on + + set shell=/run/current-system/sw/bin/bash + set tags=./tags,tags + + nnoremap gb :ls<CR>:b<Space> + nnoremap gs :vimgrep /\%1l/ `fd -t=f `<left> + nnoremap gS :vimgrep // `fd -t=f`<C-left><C-left><C-left><right> + + nnoremap <nowait><silent> <C-l> :noh<CR> + + nnoremap [q :cprev<CR> + nnoremap ]q :cnext<CR> + nnoremap [Q :cfirst<CR> + nnoremap ]Q :clast<CR> + ''; + }; + }; + + environment.systemPackages = with pkgs; [ + cliphist + grim + slurp + wmenu + ]; + environment.sessionVariables = { + XKB_DEFAULT_OPTIONS = "ctrl:nocaps"; + }; + environment.variables = { + EDITOR = "vim"; + BROWSER = "firefox"; + TERMINAL = "foot"; + HISTIGNORE = "&:ls:ls *:exit:pwd:clear:tmux:tmux attach:bash:vim:vim *:open *:reboot:history:loadenv:rm *:nix-shell:nix develop:git *:man *:* --help:bg:fg"; + HISTCONTROL = "ignoreboth"; + }; + + services.openssh.enable = true; + + services.syncthing = { + enable = true; + user = "silas"; + dataDir = "/home/silas/.syncthing"; + configDir = "/home/silas/.config/syncthing"; + settings = { + devices = { + "Lolo's Macbook Pro" = { + id = "AODRMP6-CEUBLIG-QFOJBXH-2S5DZ43-F2OSK7I-DDLXY3A-OSGZZEY-GKG4EQF"; + }; + "Pixel 6a" = { + id = "W3J66VB-KZYFQXI-UKL5XNO-D6W4KSA-2YAB7AZ-2BJ2BXA-T5ID4YA-NR22FQD"; + }; + }; + folders = { + "Notes" = { + id = "7mruq-r5ufp"; + path = "/home/silas/notes"; + devices = [ + "Lolo's Macbook Pro" + "Pixel 6a" + ]; + }; + }; + }; + }; + + networking.firewall.allowedUDPPorts = [ 10232 ]; + networking.extraHosts = '' + 10.100.0.1 poseidon + 10.100.0.2 thinkpad + 10.100.0.3 pixel + 10.100.0.4 gaia + 10.100.0.5 ipad + 10.100.0.6 macbook + 10.100.0.7 helios + 10.100.0.8 isis + ''; + networking.wg-quick.interfaces = { + wg0 = { + address = [ "10.100.0.8/24" ]; + dns = [ "10.100.0.1" ]; + listenPort = 10232; + autostart = true; + privateKeyFile = "/home/silas/privatekey"; + peers = [ + { + publicKey = "2jWfr5UmACvuS+0HOfSNgEUYqoqVNnfVDoaatmgEykw="; + allowedIPs = [ "0.0.0.0/0" ]; + endpoint = "188.166.127.72:51820"; + persistentKeepalive = 25; + } + ]; + }; + }; + + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "25.11"; # Did you read the comment? +}