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:
| A | config.h | | | 169 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | hosts/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?
+}