Skip to content

Just dotfiles. Managing most of my systems with Nix ❄️ and now with home-manager too. Parts of the configuration are literate πŸ“œ, others are just a hot mess of spaghetti 🍝. Here be dragons. 🐲

Notifications You must be signed in to change notification settings

vidbina/dotfiles

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

vidbina’s dotfiles

These dotfiles make my life slightly more convenient. Not promising they’ll do the same for yours though. πŸ˜‰

Usage

My configuration is currently managed with home-manager for the better DX or UX. Before using home-manager, I manually managed symlinks from my config directory to this dotfiles repo. The use of GNU Stow was considered for a brief moment until I realized that Stow was written in Perl and I came to terms with my unwillingness to have a critical part of my stack based on tooling that brings me no joy πŸ™Š (on account of my troubled personal history with Perl).

The easy way with home-manager

Common Configuration

# Tangled from README.org
{ config, lib, pkgs, ... }:

# TODO: Config mutt
let
  inherit (pkgs) stdenv;
  pathIfExists = (p: if (builtins.pathExists p) then [ p ] else [ ]);

  sources = import ./nix/sources.nix;
  <<common-packages-let>>
in
{
  imports = [
    <<common-imports>>
  ]
  ++ (pathIfExists ./personal.nix);

  home.packages = [
    <<common-packages>>
    <<desktop-packages>>
  ];

  home.file = {
    <<common-home-files>>
  };

  #home.file.".profile".text = ''
  #  PATH=${toString ./bin}:$HOME/.nix-profile/bin:$PATH
  #  export PATH
  #'';

  home.sessionPath = [
    (toString ./bin)
  ];

  nix = {
    extraOptions = ''
      experimental-features = nix-command flakes
    '';
  };

  nixpkgs = {
    overlays = [
      (self: super: {
        <<common-overlays>>
      })
    ];

    config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
      <<nixpkgs-unfree>>
    ];
  };

  <<common-programs>>
}
".config/ranger".source = config.lib.file.mkOutOfStoreSymlink ./ranger;

# TODO: Remove, likely not necessary
".direnvrc".source = config.lib.file.mkOutOfStoreSymlink ./direnv/direnvrc;

Common Programs

programs.bat = {
  enable = true;
  config = {
    theme = "base16";
  };
};

# Let Home Manager install and manage itself.
programs.home-manager.enable = true;

programs.direnv = {
  enable = true;
  nix-direnv = {
    enable = true;
  };
};

programs.tmux = {
  enable = true;
  extraConfig = builtins.readFile (./. + "/tmux.conf");
};

Manual

Disabled because of validation errors.

error: builder for '/nix/store/1f5lhdhsj2lf090pbxbvpmp3nijmzpy6-manual-combined.drv' failed with exit code 3;
       last 10 log lines:
       > /nix/store/vlpr4h1k43rbr5gpb3zrphq8gn6l4n4l-manual-combined/manual-combined.xml:1336: element variablelist: Relax-NG validity error : Did not expect element variablelist there
       >   1332        </section>
       >   1333      </chapter>
       >   1334       <appendix xml:id="ch-options">
       >   1335   <title>Configuration Options</title>
       >   1336    <variablelist xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="home-manager-options" xml:base="nmd-result/home-manager-options.xml"><varlistentry><term xlink:href="#opt-_module.args" xml:id="opt-_module.args"><option>_module.args</option></term><listitem><para/><para><emphasis>Type:</emphasis> lazy attribute set of raw value</para><para><emphasis>Declared by:</emphasis></para><simplelist><member><filename xlink:href="https://github.com/nix-community/home-manager/blob/master/lib/modules.nix#blob-path">
       >   1337                        &lt;home-manager/lib/modules.nix&gt;
       >   1338                        </filename></member></simplelist></listitem></varlistentry><varlistentry><term xlink:href="#opt-accounts.email.accounts" xml:id="opt-accounts.email.accounts"><option>accounts.email.accounts</option></term><listitem><para>List of email accounts.</para><para><emphasis>Type:</emphasis> attribute set of (submodule)</para><para><emphasis>Default:</emphasis> <literal>
       >
       > /nix/store/vlpr4h1k43rbr5gpb3zrphq8gn6l4n4l-manual-combined/manual-combined.xml fails to validate
manual = {
  # Use `home-manager-help`
  html.enable = false;

  # Use `man home-configuration.nix`
  manpages.enable = false;
};

Zsh

programs.zsh = {
  enable = true;
  enableAutosuggestions = false;
  enableSyntaxHighlighting = true;

  defaultKeymap = "viins";

  initExtraBeforeCompInit = ''
    <<zsh-init-before-compinit>>
  '';

  initExtra = ''
    <<zsh-init-extra>>
  '';
};
setopt histignorespace # keeps lines preceded with SPACE out of history

setopt INTERACTIVE_COMMENTS  # allow inline comments like this one
Emacs-related Settings
Vterm Configuration

Define helper functions to allow us to jump between prompts in vterm in Emacs.

Shell function: vterm_printf

See https://github.com/akermu/emacs-libvterm#shell-side-configuration

# https://github.com/akermu/emacs-libvterm#directory-tracking-and-prompt-tracking
vterm_printf(){
    if [ -n "$TMUX" ] && ([ "''${TERM%%-*}" = "tmux" ] || [ "''${TERM%%-*}" = "screen" ] ); then
        # Tell tmux to pass the escape sequences through
        printf "\ePtmux;\e\e]%s\007\e\\" "$1"
    elif [ "''${TERM%%-*}" = "screen" ]; then
        # GNU screen (screen, screen-256color, screen-256color-bce)
        printf "\eP\e]%s\007\e\\" "$1"
    else
        printf "\e]%s\e\\" "$1"
    fi
}
Alter noweb-ref to something more general

For bash and zsh.

Prep for Elisp: vterm-clear-scrollback

See https://github.com/akermu/emacs-libvterm#vterm-clear-scrollback

if [[ "$INSIDE_EMACS" = 'vterm' ]]; then
    alias clear='vterm_printf "51;Evterm-clear-scrollback";tput clear'
fi
Prep for Elisp: vterm-buffer-name-string

See https://github.com/akermu/emacs-libvterm#vterm-buffer-name-string

autoload -U add-zsh-hook
add-zsh-hook -Uz chpwd (){ print -Pn "\e]2;%m:%2~\a" }
Prompt Tracking

See https://github.com/akermu/emacs-libvterm#directory-tracking-and-prompt-tracking

vterm_prompt_end() {
    vterm_printf "51;A";
}
setopt PROMPT_SUBST
PROMPT="β†ͺ %(?.%F{green}√.%F{red}%?)%f" # error state
PROMPT="$PROMPT β†’ %F{yellow}%~%f" # pwd
PROMPT="$PROMPT @ %F{magenta}%D{%Y.%m.%d} %B%F{blue}%T%f%b" # date/time
PROMPT="$PROMPT"$'\n'
PROMPT="$PROMPT%F{green}>%f " # prompt
PROMPT=$PROMPT'%{$(vterm_prompt_end)%}'
Message Passing

See https://github.com/akermu/emacs-libvterm#message-passing

vterm_cmd() {
    local vterm_elisp
    vterm_elisp=""
    while [ $# -gt 0 ]; do
        vterm_elisp="$vterm_elisp""$(printf '"%s" ' "$(printf "%s" "$1" | sed -e 's|\\|\\\\|g' -e 's|"|\\"|g')")"
        shift
    done
    vterm_printf "51;E$vterm_elisp"
}
Completions
Read up on completions for ideas

Read https://scriptingosx.com/2019/07/moving-to-zsh-part-5-completions/

Bash completions
# enable bash completion
autoload -U +X bashcompinit && \
bashcompinit
Color

The complist module allows completion lists to be color-coded.

zmodload -i zsh/complist
#source ${./zsh/zstyle.zsh}
Fzf completions

The fzf (GitHub) fuzzy finder utility, is reported to be blazingly fast. It was commented out of the configuration a while back because of some memory-allocation issue way back but it is hard to live without any form of reverse search help in bash.

source ${pkgs.fzf}/share/fzf/completion.zsh
source ${pkgs.fzf}/share/fzf/key-bindings.zsh
fatal error: mallocgc called without a P or outside bootstrapping
runtime: panic before malloc heap initialized
gh completions
# enable gh completion
eval "$(gh completion -s zsh)"

Pywal: 🎨 Generate and change color-schemes on the fly

For Linux, we install pywal through the programs attribute:

programs.pywal = {
  enable = true;
};

For Darwin, we currently install Pywal with home-manager:

pywal

Configuring macOS with home-manager using nix-darwin

  1. Ensure Nix is installed as outlined in https://github.com/NixOS/nix#installation
    curl -L https://nixos.org/nix/install | sh
        
  2. Optionally install homebrew as outlined on https://brew.sh in case you want to manage some of your brew packages with Nix as well. Note that you may not need to manually add homebrew to your path if you use nix-darwin as the homebrew activationScript will take care of it.
  3. Optionally install Rosetta 2 for the case where it may be necessary since tools like Docker may rely on for some of their capability.
    softwareupdate --install-rosetta
        
  4. Setup nix-darwin and apply the configuration as outlined in https://github.com/LnL7/nix-darwin/#step-2-installing-nix-darwin
    nix run nix-darwin -- switch --flake . --show-trace
        

    On systems, where darwin-rebuild has already been installed, run the following command instead:

    darwin-rebuild switch --flake .
        

    In case of error: experimental Nix feature 'nix-command' is disabled; use '--extra-experimental-features nix-command' to override errors, try to run:

    nix --extra-experimental-features nix-command --extra-experimental-features flakes run nix-darwin -- switch --flake . --show-trace
        
  5. Update the nix flakes using
    nix flake update
        

    and if you just want to upgrade packages managed by brew, run:

    brew upgrade
        
  1. In order to debug the config enter a Nix REPL and inspect the inputs and outputs by using tab-completion on the variables inputs and outputs after loading the Flake.

    Enter the REPL with the following command:

    nix repl
        

    Bring the input and output variables into the REPL scope by loading the Flake as follows:

    :lf .
        

    See relevant help information by running:

    :?
        

See the nix-darwin configuration section for configuration/implementation details.

WIP Remove latent packages

On my old MacBook Pro, I started by installing and using home-manager first before deciding to use nix-darwin. This has created some nix-related configuration on my machine that nix-darwin did not fully overwrite when I applied that change. Because of this imperative change nonesense, I had latent QEMU and Emacs packages in my nix path (observeable through running tree -L 2 ~/.nix-profile).

I attempted to resolve this by removing the home-manager package from my profile:

> nix profile list
0 - - /nix/store/8s1b5c5w06yxxqba1zkv8yvlcyjhr6y6-password-store-1.7.4
1 flake:nixpkgs#legacyPackages.x86_64-darwin.cachix github:NixOS/nixpkgs/1697b7d480449b01111e352021f46e5879e47643#legacyPackages.x86_64-darwin.cachix /nix/store/7hmy1x2ca3gdfkvm029qg5074xby10pi-cachix-1.6
2 flake:nixpkgs#legacyPackages.x86_64-darwin.cachix github:NixOS/nixpkgs/1697b7d480449b01111e352021f46e5879e47643#legacyPackages.x86_64-darwin.cachix /nix/store/7hmy1x2ca3gdfkvm029qg5074xby10pi-cachix-1.6
3 - - /nix/store/7z9x0izk35yzggjhlnvsmv3y4sahijmh-home-manager-path

and then rebuilding the config.

With this, I believe I messed up my config even more, so I had to uninstall nix-darwin altogether https://github.com/LnL7/nix-darwin#uninstalling and then remove all nix-related folders as outlined in https://nixos.org/manual/nix/stable/installation/uninstall#macos.

Pay attention to trigger the correct disk identifier (note that the numbers in the first column and the IDENTIFIER column may not be similar in terms of numbers.

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         1.0 TB     disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +1.0 TB     disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD - Data     354.1 GB   disk1s1
   2:                APFS Volume Preboot                 1.9 GB     disk1s2
   3:                APFS Volume Recovery                1.2 GB     disk1s3
   4:                APFS Volume VM                      20.5 KB    disk1s4
   5:                APFS Volume Macintosh HD            9.2 GB     disk1s5
   6:              APFS Snapshot com.apple.os.update-... 9.2 GB     disk1s5s1
   7:                APFS Volume Nix Store               11.0 GB    disk1s6
sudo rm -rf /etc/nix /var/root/.nix-profile /var/root/.nix-defexpr /var/root/.nix-channels ~/.nix-profile ~/.nix-defexpr ~/.nix-channels

After this, I restart the installation process.

Reading a comment on jmatsushita’s config led me to believe that the removal of ~/.nix-profile may have broken my system further but then it seems that nix-darwin uses global profiles instead of user-based profiles, which suggests that the existence of ~/.nix-profile may have been a remnant of my pre-nix-darwin use of home-manager. For now it seems that enabling the emacs service in nix-darwin does not immediately expose a CLI-accessible command. I’ve resorted to enabling the service along with installing emacs as a systemPackage but I have to first confirm if the emacs service alone yields a system that exposes the emacs command in a standard shell.

Handling ls: .: Operation not permitted errors

On a completely fresh macOS machine you may encounter ls: .: Operation not permitted errors if Terminal has not been granted prior access to the full disk.

Navigate to the β€œFull Disk Access” setting and enable access for the Terminal.

doc/macOS.settings.EnableFullDiskAccess.png

Darwin

# Tangled from README.org
{ config, pkgs, lib, ... }:

{
  imports = [
    <<common-imports-darwin>>
  ];

  <<home-darwin>>
}
Darwin Home-manager Config
  • State β€œTODO” from [2023-10-04 Wed 14:20]
    Refactor to reuse the shared hm and programs configurations that we’ve used for the Linux config earlier. We want to DRY the overal config up.
home.stateVersion = "23.05";

home.packages = with pkgs; [
  <<darwin-home-packages>>
];

# NOTE: Copied from dev.nix
# TODO: Figure out how to re-use dev.nix config for Darwin and Linux
home.file = {
  <<home-darwin-files>>
};

# No corresponding option in nix-darwin, so we config this with hm
programs.git = {
  enable = true;
  <<nix-devtools-git>>
};

# NOTE: Copied from common.nix
programs.direnv = {
  enable = true;
  nix-direnv = {
    enable = true;
  };
};

# NOTE: Enabling zsh also in hm in order to bring direnv bootstrap into scope
# See https://gist.github.com/jmatsushita/5c50ef14b4b96cb24ae5268dab613050?permalink_comment_id=4205285#gistcomment-4205285
programs.zsh.enable = true;

<<home-darwin-config>>
Imports
Import vim into Darwin config
./vim.nix

Configuring Linux with home-manager

The use of home-manager is pretty straightforward especially with the convenient nix shell and the Makefile that make usage even easier. The general idea is as follows:

  • shell.nix defines a shell environment that contains all packages needed to install or apply a configuration. The packages include niv which helps us manage versions of our packages, home-manager which actually manages our home environments (hence the name) and and some utils.
  • Makefile contains some rules to simplify how we call home-manager inside of the nix-shell since it effectively reduces the UX down to make or make test calls as opposed to home-manager -f ./home.nix -v -n build and home-manager -f ./home.nix switch respectively (which you don’t want to have to remember πŸ€·πŸΏβ€β™‚οΈ).

Typical use will be as follows:

  1. Enter the nix-shell using nix-shell --pure
  2. Configure your personal.nix to specify home.username, home.homeDirectory and home.stateVersion for your system
  3. Optionally, update niv-managed packages by running niv update to update the sources files (nix/sources.json and nix/sources.nix), as demonstrated below:
    niv update home-manager
    niv update nixpkgs
        
  4. Run make test to test the home-manager configuration or make to install the configuration
  5. Optionally, if package update step was completed (step 2 above), commit the changes made to the niv sources files
  6. Profit πŸ’°

πŸ’‘ Note that home-manager generated configuration files will be written somewhere to ~~/.config~, e.g.: ~~/.config/git/config~ for git.

Core packages

We use niv to manage our dependencies and manage this throught the pkgs-bleeding which we set up in let blocks of shell.nix and common.nix:

nixpkgs-bleeding-src = sources."nixpkgs-bleeding";
pkgs-bleeding = import nixpkgs-bleeding-src { };

Shell

For home-manager to work, we define a nix-shell that we creates a controlled environment for our Makefile to work.

# Tangled from README.org
# From https://github.com/ryantm/home-manager-template

let
  sources = import ./nix/sources.nix;

  nixpkgs-src = sources."nixpkgs";
  pkgs = import nixpkgs-src { };

  hm-src = sources."home-manager";
  nur-src = sources."NUR";

  <<common-packages-let>>

in
pkgs.mkShell rec {
  name = "home-manager-shell";

  buildInputs = with pkgs; [
    <<shell-build-inputs>>
  ];

  <<shell-hook>>
}

The build inputs for our shell are:

<<common-packages>>
(import hm-src { inherit pkgs; }).home-manager
cacert # to resolve CA cert issue
hello
git
ncurses # to resolve tput issue
which

For the shell environment to be portable enough to run on both Linux and Darwin (macOS) systems, we define a shell hook that will export a few environment variables into existence depending on the system.

export NIX_PATH="nixpkgs=${nixpkgs-src}:home-manager=${hm-src}:NUR=${nur-src}"
export HOME_MANAGER_CONFIG=${system}

The above snippet is a bit of a cheat because we’ve formatted it as bash but some of the variable expansion work is being done by Nix and not Bash. πŸ˜… We wrap the shell expressions into the following Nix statement to set system (see the cheat in the snippet above) and we basically pull in the sources through our niv sources file which is defined at the start of our shell.nix file.

shellHook = with pkgs; let
  system = (
    if stdenv.isLinux
    then "./home-linux.nix"
    else
      (if stdenv.isDarwin
      then "./home-darwin.nix"
      else "./home.nix")
  );
in
''
  <<shell-hook-src>>
'';

With all of this out of the way, running make should just drop us into a Nix shell with everything preconfigured and then run some incantation of home-manager switch in order to switch our home-manager-managed, pun intended, environment.

REPL

Enter a REPL by entering the nix-shell first (to set up the env var NIX_PATH) and then run the following statement to obtain a reference to the home-manager configuration:

hm = import <home-manager/modules> { inherit pkgs; configuration = ./home-linux.nix; }

Linux

# Tangled from README.org
{ lib, pkgs, ... }:

{
  imports = [
    ./common.nix
    ./doc.nix
    ./browser.nix
    ./x.nix
    ./multimedia.nix

    ./emacs
  ];

  fonts.fontconfig.enable = true;

  home.packages = with pkgs; [
    vokoscreen
    montserrat
    <<home-linux-packages>>
  ];

  <<home-linux-services>>
}
X
# Tangled from README.org
{ config, pkgs, lib, options, ... }:

{
  imports = [
    <<x-imports>>
  ];

  home.packages = with pkgs; [
    <<x-packages>>
  ];

  xdg.mimeApps.defaultApplications = {
    "text/html" = [ "xsel-copy-url.desktop" ];
    "x-scheme-handler/about" = [ "xsel-copy-url.desktop" ];
    "x-scheme-handler/ftp" = [ "xsel-copy-url.desktop" ];
    "x-scheme-handler/http" = [ "xsel-copy-url.desktop" ];
    "x-scheme-handler/https" = [ "xsel-copy-url.desktop" ];
    "x-scheme-handler/unknown" = [ "xsel-copy-url.desktop" ];
  };

  nixpkgs.overlays = [
    (self: super: {
      <<linux-overlays>>
    })
  ];

  xdg.mimeApps = {
    enable = true;
  };

  xsession = {
    enable = true;
    initExtra = ''
      setxkbmap -option -model dell -layout us -variant intl -option lv3:caps_switch
    '';
    profileExtra = ''
      hsetroot -solid '#ff9800'
    '';
  };

  home.pointerCursor = {
    name = "Vanilla-DMZ";
    package = pkgs.vanilla-dmz;
    size = 64;
    x11 = {
      enable = true;
      defaultCursor = "tcross";
    };
  };

  <<x-programs>>

  services = {
    <<x-services>>
  };
}
brightnessctl
neofetch
peek
screenkey
xdotool
btop
colors
(writeScriptBin "colors" ''
  # https://askubuntu.com/questions/27314/script-to-display-all-terminal-colors

  for x in {0..8}; do
    for i in {30..37}; do
      for a in {40..47}; do
        echo -ne "\e[$x;$i;$a""m\\\e[$x;$i;$a""m\e[0;37;40m "
      done
      echo
    done
  done
  echo ""
'')
xsel-copy-url

We define an overlay in which we build an env that contains a script and the desktop item that our mimehandler can resolve to for the appropriate mimetypes.

xsel-copy-url = pkgs.buildEnv (
  let
    script = pkgs.writeScriptBin "xsel-copy-url" ''
      url=$1
      echo "$url" | ${pkgs.xsel}/bin/xsel -ib
      ${pkgs.libnotify}/bin/notify-send \
        --category=url \
        --urgency=low \
        "🌍 Link Copied" "Paste to enter $url"
    '';
  in
  {
    name = "xsel-copy-url";
    paths = [
      script

      (pkgs.makeDesktopItem {
        name = "xsel-copy-url";
        exec = "${script}/bin/xsel-copy-url %U";
        comment = "Open link by copying it into the clipboard with xsel";
        desktopName = "xsel-copy-url";
        type = "Application";
        categories = [
          "Network"
          "WebBrowser"
        ];
        mimeTypes = [
          "text/html"
          "x-scheme-handler/http"
          "x-scheme-handler/https"
          "x-scheme-handler/ftp"
        ];
      })
    ];
  }
);

We add our previously added xsel-copy-url β€œpackage” to our configuration:

xsel-copy-url
URxvt
programs.urxvt = {
  enable = true;
  package = pkgs.rxvt-unicode;
  <<urxvt-config>>

  extraConfig = {
    <<urxvt-extra>>
  };
  fonts = [
    <<urxvt-fonts>>
  ];
  keybindings = {
    <<urxvt-keybindings>>
  };
  scroll = {
    <<urxvt-scroll>>
  };
};
Fonts
"xft:DejaVu Sans Mono:pixelsize=28:antialias=true"
"xft:Fira Code:size=28:antialias=true"
"xft:Iosevka:size=28:antialias=true"
ISO14755
iso14755 = false;
Keybindings
"C-minus" = "perl:font-size:decrease";
"C-plus" = "perl:font-size:increase";
"C-=" = "perl:font-size:reset";
"M-u" = "perl:url-select:select_next";
"M-C-n" = "perl:color-themes:next";
"M-C-p" = "perl:color-themes:prev";
"M-C-l" = "perl:color-themes:load-state";
"M-C-s" = "perl:color-themes:save-state";
Scrollbars
bar.enable = false;
Misc
"geometry" = "128x32";
"perl-lib" = "${pkgs.rxvt-unicode}/lib/urxvt/perl";
"perl-ext-common" = builtins.concatStringsSep "," [
  "default"
  "font-size"
  "url-select"
  "color-themes"
];
"url-select.autocopy" = true;
"url-select.launcher" = "${pkgs.xsel-copy-url}/bin/xsel-copy-url";
"url-select.underline" = true;

"color-themes.themedir" = "${pkgs.vidbina-urxvt-themes}/share";
"color-themes.state-file" = "${config.home.homeDirectory}/.urxvt-theme";
"color-themes.autosave" = 1;
Themes
vidbina-urxvt-themes =
  let
    readTheme = x:
      let
        text = builtins.readFile (./. + "/Xresources.d/themes/${x}");
      in
      pkgs.writeTextDir "share/${x}" text;
  in
  pkgs.symlinkJoin {
    name = "vidbina-urxvt-themes";
    paths = map readTheme [
      "vidbina-dark.Xresources"
      "vidbina-light.Xresources"
    ];
  };
autorandr

In order to simplify screen management, we can use the autorandr utility.

For the first time using a configuration, we use the arandr utility to graphically align the screens in the formation that we want after which we can save and name the configuration using the following command (where CONFIGNAME is the name that we want to save the configuration as):

autorandr --save CONFIGNAME

A configuration can be autoloaded by running the following command:

autorandr --change

⚠️ With the autorandr tool, we have to plug screens into the same ports as we used when configuring the setup. In the case of my newer laptop where I have a bunch of USB C ports with the risk of pluggin monitors in different configurations between docking attempts, I just connect the monitor in every likely configuration, configure my setup with arandr and then save it with autorandr --save to ensure that autorandr will have seen that configuration before. πŸ˜‰

programs.autorandr = {
  enable = true;
};
slock

The slock package is a simple X screen locker by the suckless.org team.

Installing slock through systemPackages causes the unable to disable the OOM killer. Make sure to suid or sgid slock, see https://nixos.wiki/wiki/Slock.

We therefore install slock in the nixos-configuration.

Autolock
screen-locker = {
  enable = true;
  lockCmd = "/run/wrappers/bin/slock";
};
darkman

Use darkman to manage dark/light theme switching for GTK and Qt.

darkman

Run darkman set light or darkman set dark or just run darkman toggle.

rofi
  • State β€œTODO” from [2023-10-03 Tue 17:30]
    Update config to work for Linux. common.nix is no used between darwin and linux and rofi is no relevant for darwin systems.

We import the previous rofi configuration and have removed the programs.rofi.theme option because Pywal is currently managing this.

./rofi/default.nix
Fix the buggy theme setup

When producing the Rofi modals/prompts, we have some readability issues are some bits are not legible (dark text on dark bg).

Applets
services.blueman-applet.enable = true;
services.network-manager-applet.enable = true;
Gammastep

The next thing after redshift.

services.gammastep = {
  enable = true;
  <<home-linux-services-gammastep>>

  temperature = {
    # https://www.eizo.com/library/basics/color_temperature_on_an_LCD_monitor/
    day = 6500;
    night = 2500;
  };

  tray = true;
};
Berlin
dawnTime = "5:00-6:00";
duskTime = "17:35-19:00";
latitude = 52.5;
longitude = 13.4;
GPG Agent
services.gpg-agent = {
  enable = true;
  enableSshSupport = true;
};
Trayer
services.trayer = {
  enable = true;
  settings = {
    align = "right";
    alpha = 0;
    edge = "top";
    height = 20;
    monitor = "primary";
    tint = "0x00000000";
    transparent = true;
    width = 250;
    widthtype = "pixel";
  };
};

The more tedious and manual way: without home-manager

The tedious way basically requires one to make symlinks from the needed locations into this dotfiles repository. There are a number of ways how one can simplify this experience ranging from manually symlinking everything that you would need all the way up to using a home-manager alternative like GNU Stow to manage these symlinks for you (and minimize the toil on your end).

This is a listing of the symlinks that I could track in my home directory right before moving over to home-manager. I may have missed some, but largely this covers much of what I have packaged in this repository so it should be relatively complete.

~/.Xmodmap -> ~/dotfiles/xmodmap
~/.coloritrc -> ~/dotfiles/colorit/coloritrc
~/.conkyrc -> ~/dotfiles/conky.conf
~/.emacs.d -> ~/dotfiles/emacs
~/.lein -> ~/dotfiles/lein
~/.octaverc -> ~/dotfiles/octave/.octaverc
~/.tmux.conf -> ~/dotfiles/tmux.conf
~/.xsession -> ~/dotfiles/xsession
~/.config/asciinema -> ~/dotfiles/asciinema
~/.config/ghorg -> ~/dotfiles/ghorg
~/.config/redshift.conf -> ~/dotfiles/redshift.conf
~/.config/rofi -> ~/dotfiles/rofi
~/.config/starship.toml -> ~/dotfiles/starship.toml
~/.config/termite -> ~/dotfiles/termite
~/.direnvrc -> ~/dotfiles/direnv/direnvrc

direnv

ln -s ${PATH_TO_DOTFILES}/direnv ${HOME}/.direnv

.xsession

ln -s ${PATH_TO_DOTFILES}/xsession ${HOME}/.xsession
  • sets the background (I just set a background color, but use feh to set a wallpaper)
  • loads .Xmodmap to load custom keyboard bindings
  • start WM

.Xresources.d

⚠️ managed with nix home-manager?

ln -s ${PATH_TO_DOTFILES}/Xresources.d ${HOME}/.Xresources.d

.Xmodmap

ln -s ${PATH_TO_DOTFILES}/Xmodmap ${HOME}/.Xmodmap
  • disables caps lock
  • remaps tilde and grave to capslock+[shift]+z in an effort to minimise finger travel (the macbook has a narrower left shift and places the tilde/grave button between the left shift and the Z key)

Tmux

ln -s ${PATH_TO_DOTFILE}/tmux.conf ${HOME}/.config/tmux.conf
  • sets up vi key bindings in tmux
  • remaps colors

Neovim

⚠️ I haven’t relied on init.nvim for a while since I broke my configuration a little while ago in my attempts to pull vim-plug with Nix and then manage all my other plugins through the init.nvim file. As a lazyperson’s way out, I have simply given up and started managing my entire nvim configuration in nix.

[2024-02-19 Mon]: Tangling init.vim from the same snippets that I use in nix. Only difference is that init.vim contains the packages that are being installed through Pathogen, while the nix config handles package management for vim itself.

ln -s ${PATH_TO_DOTFILE}/nvim ${HOME}/.config/nvim
  • [X] set tabbing behavior (expand tabs to 2 spaces)
    set tabstop=2    " tab stop to 2 spaces
    set shiftwidth=2 " shift width by 2 spaces
    set expandtab    " expand tabs to spaces
        
  • [X] enable mouse in all modes
    set mouse=a
    set number
    ":map <ScrollWheelUp> <C-Y>
    ":map <ScrollWheelDown> <C-E>
        
  • [X] define Plug extensions
    call plug#begin("~/.local/share/nvim/plugged")
      Plug 'neovim/nvim-lspconfig'
      Plug 'airblade/vim-gitgutter'
      Plug 'aklt/plantuml-syntax'
      Plug 'dense-analysis/ale'
      Plug 'derekwyatt/vim-scala'
      Plug 'ElmCast/elm-vim'
      Plug 'godlygeek/tabular'
      Plug 'hashicorp/sentinel.vim'
      Plug 'hashivim/vim-terraform'
      "Plug 'https://github.com/hrother/offlineimaprc.vim.git'
      Plug 'https://github.com/junegunn/goyo.vim.git'
      Plug 'https://github.com/plasticboy/vim-markdown.git'
      Plug 'isRuslan/vim-es6'
      Plug 'jparise/vim-graphql'
      Plug 'leafgarland/typescript-vim', { 'for': 'typescript' }
      Plug 'LnL7/vim-nix'
      Plug 'majutsushi/tagbar'
      "https://github.com/neoclide/coc.nvim
      "Load VSCode extensions and host language servers
      "Plug 'neoclide/coc.nvim', { 'branch': 'release' }
      Plug 'preservim/nerdtree'
      Plug 'prettier/vim-prettier'
      Plug 'purescript-contrib/purescript-vim'
      Plug 'saltstack/salt-vim'
      "Plug 'sbdchd/neoformat'
      Plug 'sigmike/vim-taskjuggler'
      Plug 'tomlion/vim-solidity'
      Plug 'tpope/vim-fugitive'
      Plug 'vim-airline/vim-airline'
      Plug 'vim-scripts/openvpn'
      Plug 'wannesm/wmgraphviz.vim'
      Plug 'jeffkreeftmeijer/vim-dim', { 'branch': 'main' }
    call plug#end()
        
  • [X] Set remaining vim settings
    colorscheme dim
    " https://vi.stackexchange.com/a/45130
    set notermguicolors
    set t_Co=16
    
    
    let g:vim_markdown_frontmatter = 1
    let g:vim_markdown_math = 1
    let g:vim_markdown_fenced_languages = ['nix=nix', 'Dockerfile=dockerfile']
    let g:vim_markdown_new_list_item_indent = 2
    let g:vim_markdown_auto_insert_bullets = 0
    
    set wrap
    set ignorecase
    set nofoldenable
        

We compose the different settings into init.vim and tangle the non-Pathogen-related stuff into our nix config (where we define vim packages through nix and therefore won’t need Pathogen).

" Tangled from README.org
<<neovim-plugged>>
<<neovim-config>>

Termite

ln -s ${PATH_TO_DOTFILE}/termite ${HOME}/.config/termite

Starship

ln -s ${PATH_TO_DOTFILE}/starship.toml ${HOME}/.config/starship.toml

Rofi

ln -s ${PATH_TO_DOTFILE}/rofi ${HOME}/.config/rofi

Redshift

ln -s ${PATH_TO_DOTFILE}/redshift ${HOME}/.config/redshift

Ghorg

ln -s ${PATH_TO_DOTFILE}/ghorg ${HOME}/.config/ghorg

Asciinema

ln -s ${PATH_TO_DOTFILE}/asciinema ${HOME}/.config/asciinema

Compton

ln -s ${PATH_TO_DOTFILE}/compton/compton.conf ${HOME}/.config/compton.conf

Octave

ln -s ${PATH_TO_DOTFILE}/octave/.octaverc ${HOME}/.config/.octaverc

TODO: Rename hidden file to more visible file

Lein

Package manager and build tool for Clojure. The .lein dotfile lists convenience plugins for development.

ln -s ${PATH_TO_DOTFILE}/lein ${HOME}/.lein

Colorit

https://linux.die.net/man/1/colorit

Colorit is a script for markup-ing text input which is used in my setup by dict.

ln -s ${PATH_TO_DOTFILE}/colorit/coloritrc ${HOME}/.coloritrc

Conky

https://github.com/brndnmtthws/conky

Conky is a system monitoring tool which allows the presentation of system metrics in a GUI.

ln -s ${PATH_TO_DOTFILE}/conky.conf ${HOME}/.conkyrc

Emacs

ln -s ${PATH_TO_DOTFILE}/emacs ${HOME}/.emacs.d

Configuration

Personal Details

For developer tooling, we define our userName and userEmail which we will rely on in configuring git, for example.

userName = "David Asabina";
userEmail = "[email protected]";

We all have parts of our configs that are for our eyes only and the personal.nix file can be populated to contain sensitive and private parts of your configuration. This home-configuration will load a personal.nix file if found so the use of this file is optional (your configuration should work without it).

Observe the snippet below for an example of a valid personal.nix file.

{ config, pkgs, lib, options, ... }:

{
  # Home Manager needs a bit of information about you and the
  # paths it should manage.
  home.username = "vidbina";
  home.homeDirectory = "/home/vidbina";

  # This value determines the Home Manager release that your
  # configuration is compatible with. This helps avoid breakage
  # when a new Home Manager release introduces backwards
  # incompatible changes.

  # You can update Home Manager without changing this value. See
  # the Home Manager release notes for a list of state version
  # changes in each release.
  home.stateVersion = "21.05";

  home.packages = [ ];
}

Note that the same configuration above is adapted for macOS by setting home.homeDirectory to a valid macOS home path like /Users/vidbina.

nix-darwin

On macOS, nix-darwin provides the most batteries included nix experience. We can manage services (through launchd), home-manager and homebrew all through a nix configuration.

# This is a nix-darwin config
{ pkgs, lib, inputs, config, username, ... }: {
  imports = [
    # import modules into our nix-darwin config
    <<nix-darwin-imports>>
    ./emacs/nix-darwin.nix
    ./system/darwin
  ];

  # List packages installed in system profile. To search by name, run:
  # $ nix-env -qaP | grep wget
  environment.systemPackages = with pkgs; [
    <<nix-darwin-packages-common>>
  ] ++ (if system == "aarch64-darwin" then [
    # ARM-only packages
    <<nix-darwin-packages-arm>>
  ] else [
    # Intel-only packages
    <<nix-darwin-packages-intel>>
  ]);

  environment.interactiveShellInit = lib.strings.concatStrings [
    <<nix-darwin-interactive-shellinit>>
  ];

  # General nix-darwin settings
  <<nix-darwin>>
}

Launchd

Read the Apple Daemons and Service Programming Guide for some basic information on how to work with launchd. Keep in mind that launchd isn’t systemd and sucks in the sense that starting/stopping services doesn’t seem to do the obvious things that their names imply and as one has grown familiar to with systemd.

Furthermore read https://www.launchd.info/ for more information on the launchd system. I have for a long time misunderstood it as an init system hut it is more of a job manager.

Packages

All packages that are architecture agnostic are installed in all of our macOS machines.

# common Darwin packages
asciinema
bat
checkmake
exercism
gh
gleam
gnumake
gnupg
gotop
hexyl
html-tidy
htop
httpie
httplab
jq
kakoune
nodePackages.typescript-language-server
nodejs
pass
pqrs
nixpkgs-fmt
redis
shell-gpt
shellcheck
shfmt
sqlite-interactive
tree
tree-sitter
vim
xxd
yq
inputs.devenv.packages.${system}.default
# Darwin packages for home-manager (i.e.: nix-darwin)
alacritty

Intel-only packages are listed separately such that we can use them on the macOS machine that still has a x86-based Intel chip but avoid trying to install them on ARM-based Apple machines.

# Darwin packages for Intel-only
gdb
ghidra-bin

It follows that the amount of Intel-only packages will decrease as developers make their applications more readily available (also for Apple Silicon).

Split up config into tooling section

  • [X] Make the first snippets comment snippets (for explanation)
  • [ ] move the code out to the tool-specific section.

Setup homebrew

''
  eval "''$(${config.homebrew.brewPrefix}/brew shellenv)";
''

Setup nix

# Auto upgrade nix package and the daemon service.
services.nix-daemon.enable = true;
nix.package = pkgs.nix;

# Necessary for using flakes on this system.
nix.settings.experimental-features = "nix-command flakes";

Trusted users

# Adding trusted users for devenv to use Cachix
nix.settings.trusted-users = [
  "root"
  "vidbina"
];

Use gpg-agent

# NOTE: Copied from home-linux.nix
programs.gnupg.agent = {
  enable = true;
  enableSSHSupport = true;
};

Setup zsh

# Create /etc/zshrc that loads the nix-darwin environment.
# NOTE: Copied from common.nix
programs.zsh = {
  enable = true; # default shell on catalina
  enableSyntaxHighlighting = true;
  # Used to be initExtraBeforeCompInit
  # in nix-darwin, interactiveShellInit is called before compinit
  # see https://github.com/LnL7/nix-darwin/blob/80bb201f4925cdda5a7a3c7b1900fb26bb2af2e8/modules/programs/zsh/default.nix#L168-L176

  promptInit = ''
    setopt histignorespace # keeps lines preceded with SPACE out of history

    setopt INTERACTIVE_COMMENTS  # allow inline comments like this one
    # https://github.com/akermu/emacs-libvterm#directory-tracking-and-prompt-tracking
    vterm_printf(){
        if [ -n "$TMUX" ] && ([ "''${TERM%%-*}" = "tmux" ] || [ "''${TERM%%-*}" = "screen" ] ); then
            # Tell tmux to pass the escape sequences through
            printf "\ePtmux;\e\e]%s\007\e\\" "$1"
        elif [ "''${TERM%%-*}" = "screen" ]; then
            # GNU screen (screen, screen-256color, screen-256color-bce)
            printf "\eP\e]%s\007\e\\" "$1"
        else
            printf "\e]%s\e\\" "$1"
        fi
    }
    if [[ "$INSIDE_EMACS" = 'vterm' ]]; then
        alias clear='vterm_printf "51;Evterm-clear-scrollback";tput clear'
    fi
    vterm_prompt_end() {
        vterm_printf "51;A";
    }
    setopt PROMPT_SUBST
    PROMPT="β†ͺ %(?.%F{green}√.%F{red}%?)%f" # error state
    PROMPT="$PROMPT β†’ %F{yellow}%~%f" # pwd
    PROMPT="$PROMPT @ %F{magenta}%D{%Y.%m.%d} %B%F{blue}%T%f%b" # date/time
    PROMPT="$PROMPT"$'\n'
    PROMPT="$PROMPT%F{green}>%f " # prompt
    PROMPT=$PROMPT'%{$(vterm_prompt_end)%}'
    vterm_cmd() {
        local vterm_elisp
        vterm_elisp=""
        while [ $# -gt 0 ]; do
            vterm_elisp="$vterm_elisp""$(printf '"%s" ' "$(printf "%s" "$1" | sed -e 's|\\|\\\\|g' -e 's|"|\\"|g')")"
            shift
        done
        vterm_printf "51;E$vterm_elisp"
    }

    # Workaround to open new tab at pwd
    # See https://apple.stackexchange.com/a/340778
    # http://superuser.com/a/315029/4952
    # Set Apple Terminal.app to resume directory... still necessary 2018-10-26
    if [[ $TERM_PROGRAM == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]] {
      function chpwd {
        local SEARCH=' '
        local REPLACE='%20'
        local PWD_URL="file://$HOSTNAME''${PWD//$SEARCH/$REPLACE}"
        printf '\e]7;%s\a' "$PWD_URL"
      }
      chpwd
    }

    # Use vim bindings in zsh
    bindkey -v
    # https://unix.stackexchange.com/a/30169
    bindkey '^R' history-incremental-search-backward
  '';
};

Configure system

# Set Git commit hash for darwin-version.
system.configurationRevision = inputs.self.rev or inputs.self.dirtyRev or null;

system.keyboard.enableKeyMapping = true;
system.keyboard.remapCapsLockToControl = true;

# Used for backwards compatibility, please read the changelog before changing.
# $ darwin-rebuild changelog
system.stateVersion = 4;

system = {
  <<darwin-system>>
};

Configure user

users.users.vidbina = {
  home = "/Users/vidbina";
};

Setup homebrew

homebrew = {
  enable = true;
  global = {
    autoUpdate = false;
  };
  onActivation = {
    autoUpdate = false;
    cleanup = "uninstall";
    extraFlags = [
      "--verbose"
    ];
  };
  brews = [
    <<homebrew-brews>>
  ];
  casks = [
    <<homebrew-casks>>
  ];
  masApps = {
    <<homebrew-masapps>>
  };
};

As outlined in this StackExchange answer, brew prefers pre-compiled binaries (so called bottles). CLI tools are typically installed through the standard homebrews **brews** facility.

"smudge/smudge/nightlight"
"pidof"

Graphical tools which are typically installed through the drag icon to Applications mess, can be installed in a more automated fashion through the use of the homebrew casks extension.

# Software Development
"iterm2"
"kitty"

# Design
"figma"
"drawio"

# Containerization & Virtualization
"docker"
"utm"

# Productivity
"anytype" # in beta, not very feature-complete imo
"google-drive"
"linear-linear"
"logseq" # FLOSS (compared to Obsidian) but no mobile app
"microsoft-teams"
"notion"
"obsidian" # best-in-class with mobile app support
"raycast"
"zoom"

# Android
"android-file-transfer"

# Devtools
# Go to top-right Settings gear > VSCode Import > Start Import
"cursor"
"warp"

# Entertainment
"steam"
"tidal"

# Social
"discord"
"signal"
"slack"
"telegram"
"whatsapp"

Install apps from the Apple App Store through the mas CLI tool for which the nix-darwin homebrew config provides the =masApps= attribute.

πŸ’‘ Remember to go through the list of all masApps in your file:configuration-darwin.nix and make sure to at least manually install them into your Apple account once to avoid the this β€œRedownload Unavailable with this Apple ID” issue.

Resolve: Redownload Unavailable with This Apple ID: This redownload is not available for this Apple ID either because it was bought by a different user or the item was refunded or cancelled.

Apps need to already be in a user’s Purchased list before mas can install them. For any new tools, just make sure that you install it on one machine at least manually in order to add it to your Purchased list as documented in GH mas-cli issue 85. In my case, I didn’t even complete the installation, I just started it to add it to the list and then prematurely stopped it in order to continue the installation through nix-darwin.

Keep in mind to authorize your device as documented in https://support.apple.com/en-us/HT201251 and which can be done through the following steps:

  • Open Apple Music
  • Navigate to Account > Authorisations > Authorise this computer
  • provide credentials to Apple account.

You can review your current computer’s authorisation status by opening the App Store app and opening the Account Settings modal.

Computer authorisation status did not have any bearing on this issue but it seems a good practice to ocassionally verify that all the authorised devices in an account are still in your possession.

nix-darwin nixpkgs

Allow some unfree packages

nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
  <<darwin-unfree>>
];

Allow some nixpkgs overlays

nixpkgs.overlays = [
  (self: super: {
    # nix-darwin overlays
    <<darwin-overlays>>
  })
];

Hammerspoon

I use Hammerspoon for some OSX-specific automations which can be scripted through Lua. Like mapping keybindings to open specific locations in Finder, opening specific apps within a workstation or rendering notification or alerts with some useful information and more.

We link the hammerspoon directory into our homedir in order to set up the necessary Spoons and the init.lua:

home.file.".hammerspoon".source = config.lib.file.mkOutOfStoreSymlink ./hammerspoon;

We load the Spoons and define our own bindings and more in the init.lua file that we symlinked into our homedir previously:

-- Tangled from README.org

hsBaseBinding = {"alt", "cmd", "ctrl"}
strBaseBinding = "βŒƒβŒ₯⌘"

cheatsheet = "πŸ’‘"

-- A dummy binding for Hammerspoon
hs.hotkey.bind(
   hsBaseBinding,
   "H",
   function()
      hs.alert.show(cheatsheet)
      hs.notify.new({title="Hammerspoon", informativeText=cheatsheet}):send()
   end
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " H = help"

-- https://www.hammerspoon.org/go/#simple-configuration-reloading
hs.hotkey.bind(
   hsBaseBinding,
   "R",
   function()
      hs.alert.show("Reloading Hammerspoon config")
      hs.reload()
   end
)
cheatsheet = cheatsheet .."\n" .. strBaseBinding .. " R = reload"

-- https://www.hammerspoon.org/go/#drawing-on-the-screen
mouseCircle = nil
mouseCircleTimer = nil

function mouseHighlight()
   -- Delete an existing highlight if it exists
   if mouseCircle then
      mouseCircle:delete()
      if mouseCircleTimer then
         mouseCircleTimer:stop()
      end
   end
   -- Get the current co-ordinates of the mouse pointer
   mousepoint = hs.mouse.absolutePosition()
   -- Prepare a big red circle around the mouse pointer
   mouseCircle = hs.drawing.circle(hs.geometry.rect(mousepoint.x-40, mousepoint.y-40, 80, 80))
   mouseCircle:setStrokeColor({["red"]=1,["blue"]=0,["green"]=0,["alpha"]=1})
   mouseCircle:setFill(false)
   mouseCircle:setStrokeWidth(5)
   mouseCircle:show()

   -- Set a timer to delete the circle after 3 seconds
   mouseCircleTimer = hs.timer.doAfter(
      1,
      function()
         mouseCircle:delete()
         mouseCircle = nil
      end
   )
end
hs.hotkey.bind(hsBaseBinding, "D", mouseHighlight)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " D = mouse highlight"

hs.loadSpoon("Caffeine")
isCaffeinated = false
hs.hotkey.bind(
   hsBaseBinding,
   "Z",
   function()
      if not isCaffeinated then
         hs.alert.show("Buzzed! Flattie mode! β˜•")
         spoon.Caffeine:start()
      else
         hs.alert.show("Letting that buzz wear off. πŸ₯±")
         spoon.Caffeine:stop()
      end
      isCaffeinated = not isCaffeinated
   end
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " Z = β˜•"

hs.loadSpoon("KSheet")
spoon.KSheet:bindHotkeys(
   {
      toggle = {hsBaseBinding, "K"}
   }
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " K = KSheet"

hs.loadSpoon("HSKeybindings")
isShowingHSKeybindings = false
hs.hotkey.bind(
   hsBaseBinding,
   "/",
   function()
      if not isShowingHSKeybindings then
         hs.alert.show("Showing HSKeybindings")
         spoon.HSKeybindings:show()
      else
         hs.alert.show("Hiding HSKeybindings")
         spoon.HSKeybindings:hide()
      end
      isShowingHSKeybindings = not isShowingHSKeybindings
   end
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " K = HSKeybindings"

hs.hotkey.bind(
   hsBaseBinding,
   ".",
   function()
      hs.alert.show("Inspecting Hammerspoon")
      hs.alert.show("displayIdle: " .. (hs.caffeinate.get("displayIdle") and "On" or "Off"))
      hs.alert.show("systemIdle: " .. (hs.caffeinate.get("systemIdle") and "On" or "Off"))
      hs.alert.show("system: " .. (hs.caffeinate.get("system") and "On" or "Off"))
   end
)

hs.hotkey.bind(
   hsBaseBinding,
   "return",
   function()
      if hs.application.find("iTerm") then
         hs.osascript.applescript([[
            <<applescript-open-iterm>>
         ]])
      else
         hs.application.open("iTerm")
      end
   end
)
cheatsheet = cheatsheet .. "\n" .. strBaseBinding .. " ⏎ = iTerm2 πŸ‘¨πŸΏβ€πŸ’»"

For our iTerm2 function, we define the AppleScript separately:

tell application "iTerm"
create window with default profile
end tell

See zzamboni’s config for inspiration.

Developer Tooling

We will be tangling this literate configuration into the needed dev.nix file.

./dev.nix

For starters, we stub the general structure of the nix file and define the <<nix-devtools>> reference for us to direct our tool-specific configs into.

# Tangled from README.org
# Please modify by editing README.org and re-tangling to generate this nix file.
{ config, lib, pkgs, options, ... }:

{
  <<nix-devtools>>

  home.packages = [
    <<dev-packages>>
  ] ++ (if pkgs.stdenv.isLinux then [
    <<dev-packages-linux>>
  ] else [ ]);
}

As an example, you can observe how we direct some comments into the previously defined reference. In the following sections, we will use this mechanism to tangle (basically β€œwrite”) into parts of the dev.nix file.

# Tangling individual dev tools through nix-devtools noweb reference

Git

We tangle the git-related configuration into dev.nix but if you want to manually set things up, check out the manual git instructions.

<<manual-git>> Configure your gitconfig by symlinking the gitconfig file in this repository into the home directory.
ln -s ./git/gitconfig ~/gitconfig

The global excludes file defaults to ./config/git/ignore so we’re linking our ignore go-to into this path for convenience.

ln -s ./git/ignore ~/.config/git/ignore
programs.git = {
  enable = true;
  <<nix-devtools-git>>
};
".config/git/ignore".source = ./git/ignore;
".wezterm.lua".source = ./wezterm/wezterm.lua;

Global Gitignore

For convenience we define git/ignore which we want to automatically want to honor in every repo. Based on the instructions in man gitignore we stub the XDG_HOME_CONFIG/.config/git/ignore and the ~/.gitignore files to reflect the content of git/ignore.

# Set global gitignore
home.file = {
  ".config/git/ignore".source = config.lib.file.mkOutOfStoreSymlink ./git/ignore;
};

Git LFS

We want LFS enabled.

lfs.enable = true;

Git Aliases

aliases = {
  wdiff = "diff --word-diff --word-diff-regex='\\w+'";
  glog = "log --oneline --graph --all --decorate";
};

Git Extra Configuration

Let’s opt for naming our default branch β€œmain”, using nvim as our editor, using gpg2 are our GPG tool and setting git up to send patches by mail.

extraConfig = {
  init = {
    defaultBranch = "main";
  };

  core = {
    editor = "nvim";
  };

  gpg = {
    program = "gpg2";
  };

  sendemail = {
    annotate = true;
    smtpServer = "msmtp";
    smtpServerOption = "-a vidbina";
  };

  <<nix-devtools-git-conf>>
};
Colors in Git

For readability’s sake, we set the colors that we display git diffs, greps and status payloads in.

color = {
  ui = true;
  diff = {
    meta = "yellow bold";
    frag = "magenta bold";
     old = "red";
     new = "green";
  };
  grep = {
    match = "yellow";
    filename = "blue";
    linenumber = "brightblack";
  };
  status = {
    added = "yellow";
    changed = "green";
    untracked = "brightblack";
  };
};

Since we are using pywal to sync terminal themes with Emacs, we set some baseline colors in git to harmonise these.

GitHub

pkgs.gh

Utils

Coreutils

Sometimes we need GNU CLI utils, such as for dired in Emacs which expects the GNU ls variant which offers the --dired option. Install coreutils coreutils for this capability and note that for all utils that already have MacOS-native equivalents the GNU-equivalent will be prefixed with g such that the GNU ls tool is now accessed through gls:

"coreutils"

Development Environments

Devbox

Use Devbox for isolated dev envs without having to write Nix. πŸ™Š

We install it by listing it in the nix-darwin config file:

devbox
Devenv

Find out if the devenv install is moveable. The env.nix file does not have the inputs variable as an input so we’ll either have to pass it along or find a different way to bring these packages into scope within dev.nix.

See Packages for the current installation of devenv.

Terminals

WezTerm

WezTerm is a terminal emulator and multiplexer written in Rust, with hyperlink support, emoji support and since it’s written in Rust… probably as blazingly fast as it gets.

"wezterm"

AI

Ollama

Ollama is a convenient CLI tool to spin up LLMs locally for inference anad and to spawn local APIs that can be used with locally running tools. This should come in handy for offline LLM access and the general development of LLM-powered builds… even when the internet is down or when flying.

On MacOS, we install Ollama using the brew:

"ollama"
LM Studio

With LM Studio, one can easily inference against LLMs, spin up an API to allow other tools to access locally-served LLMs and compute embeddings locally… all through a convenient GUI.

On MacOS, we install LM Studio using the cask:

"lm-studio"

Networking

Install Wireguard tools https://github.com/WireGuard/wireguard-tools on your MacOS.

"wireguard-tools"

Hex editors/viewers

pkgs.xxd
pkgs.hexyl

Reverse engineering

pkgs.ghidra-bin

Editors

pkgs.kakoune

Shell

pkgs.shellcheck
pkgs.shfmt
Asciinema
pkgs.asciinema

Study

Exercism
pkgs.exercism

HTML, Web

pkgs.html-tidy
Web Servers
pkgs.httpie
pkgs.httplab

GCC

  • State β€œTODO” from [2023-10-03 Tue 18:17]
    Verify that glibc is not available for Darwin and merge the separated configs or provide explanation.
pkgs.gdb
pkgs.checkmake
#pkgs.cmakeCurses
pkgs.gnumake

For now, isolate the Linux-specific dev packages from the more general dev packages but we should be able to install glibc on macOS.

pkgs.glibc

Gleam

pkgs.gleam

LSP

Typescript Language Server
pkgs.nodePackages.typescript-language-server

Tree-sitter

pkgs.tree-sitter

DSL

jq, yq
pkgs.jq
pkgs.yq

DB

SQLite
pkgs.sqlite-interactive
Redis
pkgs.redis

Linux Hacking

I have issues with my touchpad often enough and also have issues with Chromium hanging here and there. It’s time that I learned to dig into some of the Linux innards and do some good kernel watching.

Linux Input Debugging/Kernel Watching

See https://lwn.net/Articles/658948/

xinput
  1. List xinputs
    xinput --list
        
  2. Show properties for device
    xinput show-props ID
        
evemu

https://www.freedesktop.org/wiki/Evemu/ https://wiki.ubuntu.com/Multitouch/Testing/Evemu

pkgs.evemu
  • evemu-describe
  • evemu-device
  • evemu-event
  • evemu-play
  • evemu-record
    evemu-record /dev/input/event13 touchpad-debug.evemu
        
Debug laggy/choppy touchpad

Recorded some data while I was observing the choppy behavior

evemu-record /dev/input/event13 touchpad-debug.evemu

Then replayed the recording to confirm choppiness in the recorded output

evemu-play touchpad-debug.evemu

According to ChatGPT:

If the recording from evemu-record is already choppy, the problem is likely at a lower level than libinput. Libinput processes the events given by the kernel, so if the kernel events are choppy, libinput will also see choppy data.

Here are some steps you can take to debug the issue:

  • Check the Kernel Version: As mentioned before, the issue may lie within the kernel. If you’re using an old version of the kernel, consider updating it.
  • Check for Hardware Issues: If possible, test the trackpad in a different operating system (like Windows or a different Linux distribution) to rule out hardware issues.
  • Check for Dropped Events: The evemu-record tool records events as they come from the kernel. If events are being dropped, that might cause choppy input. Use the evtest tool to check if any events are being dropped.
  • Check for Firmware Issues: It might be possible that your laptop’s firmware is causing issues. Check the manufacturer’s website for any firmware updates.
  • Check dmesg for Errors: Run dmesg | grep -i error to check for any hardware errors related to the touchpad.
  • Contact the libinput Community: If you’re unable to resolve the issue yourself, consider reaching out to the libinput community for help. They might be able to provide more specific guidance.
  • Remember, always be careful when upgrading the kernel or firmware, or changing system settings. Always backup your data before making significant changes to your system.

Reading https://www.dell.com/support/kbdoc/de-de/000150104/precision-xps-allgemeine-problemloesung-f-uuml-er-touchpad-maus-in-ubuntu and concluding that dmesg needs to be monitored for kernel events

dmesg -H --follow
[May24 10:26] systemd-gpt-auto-generator[83303]: EFI loader partition unknown, exiting.
[  +0.000006] systemd-gpt-auto-generator[83303]: (The boot loader did not set EFI variable LoaderDevicePartUUID.)
[May24 11:04] input: DLL0945:00 04F3:311C Touchpad as /devices/virtual/input/input70
[May24 11:07] input: DLL0945:00 04F3:311C Touchpad as /devices/virtual/input/input71

Is the touchpad being reconnected over different ports?

> xinput --list
⎑ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ ELAN2D24:00 04F3:2D24                     id=11   [slave  pointer  (2)]
⎜   ↳ DLL0945:00 04F3:311C Mouse                id=12   [slave  pointer  (2)]
⎜   ↳ PS/2 Generic Mouse                        id=18   [slave  pointer  (2)]
⎜   ↳ DLL0945:00 04F3:311C Touchpad             id=13   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Video Bus                                 id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Integrated_Webcam_HD: Integrate           id=9    [slave  keyboard (3)]
    ↳ Integrated_Webcam_HD: Integrate           id=10   [slave  keyboard (3)]
    ↳ Intel HID events                          id=14   [slave  keyboard (3)]
    ↳ Intel HID 5 button array                  id=15   [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                          id=16   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=17   [slave  keyboard (3)]

Searching for DLL0945:00 04F3:311C on Google yields https://www.dell.com/community/XPS/XPS-15-9510-Touchpad-Intermittent-touchpad-lag/td-p/8012567/page/4 where the following comment is posted:

I can also reproduce that this is related to the palm rejection on the side of the touchpad. Usually the cursor does not move when I move the finger on the very right side of the touchpad. Every time the cursor is laggy, the palm rejection does not work and I can move the cursor by touching the pad on the very right side.

I also tried out the mtouch drivers instead of libinput but the problem persists. so I suppose that the problem is related to the firmware of the touchpad.

mtdiag-qt

https://github.com/bentiss/mtdiag-qt

mtview

https://github.com/whot/mtview

Calculators

pcalc

The pcalc util can come in handy when one needs to conduct conversions between bases (Like octal to binary, hex to binary, etc) and calculate operations (ADD, MOD, XOR, etc.) between different operands. I initially set out to install the PCalc calculation util https://pcalc.com/ to calculate logs and work with other advanced math functions, but somehow I hit a name collision here and ended up realising that the other pcalc may be useful to me too… someday, so, we’re keeping it.

For MacOS, we just install pcalc using the brew:

"pcalc"

VsCode

Visual Studio Code is unfree software and needs to be added to the list of unfree packages that we want to tolerate:

"vscode"

Our vscode configuration declaratively manages soem extensions, keybindings and user settings:

programs.vscode = {
  enable = true;
  extensions = with pkgs.my-vscode-extensions.vscode-marketplace; [
    <<vscode-extensions>>
  ];
  keybindings = [
    <<vscode-keybindings>>
  ];
  userSettings = {
    <<vscode-settings>>
  };
};

VsCode Extensions

We get our vscode extensions from the nix-community nix-vscode-extensions package which we alias to the reference my-vscode-extensions for internal use:

my-vscode-extensions = inputs.vscode-extensions.extensions.${pkgs.system};

The extensions that we are interested in are the following:

bbenoist.nix
be5invis.toml
elmtooling.elm-ls-vscode # depends on hbenl.vscode-test-explorer
github.copilot
github.copilot-chat
hbenl.vscode-test-explorer
hediet.vscode-drawio
mkhl.direnv
ms-azuretools.vscode-docker
ms-playwright.playwright
ms-python.python
ms-vscode-remote.remote-containers
tomoki1207.pdf
vscode-org-mode.org-mode
vscodevim.vim
Show tree of TODO and FIXME comment

Outline comment tags like TODO and FIXME in a todo tree for quick access.

gruntfuggly.todo-tree

VsCode Keybindings

The keybindings that we want are as follows:

{
  "key" = "ctrl+tab";
  "command" = "workbench.action.nextEditorInGroup";
}
{
  "key" = "ctrl+shift+tab";
  "command" = "workbench.action.previousEditorInGroup";
}

Settings

In order to enable long-presses to register multiple entries we need the ApplePressAndHoldEnabled OSX setting, otherwise, we have to manually depress a key multiple times in order to have multiple entries.

defaults.CustomUserPreferences = {
  "com.microsoft.VSCode" = {
    "ApplePressAndHoldEnabled" = false;
  };
};

Define parts of the VsCode-specific fields are defined in the JSON format as follows:

"editor.cursorSurroundingLines" = 8;

# https://code.visualstudio.com/docs/editor/extension-marketplace#_can-i-stop-vs-code-from-providing-extension-recommendations
"extensions.ignoreRecommendations" = true;
"extensions.showRecommendationsOnlyOnDemand" = true;

# https://code.visualstudio.com/docs/editor/extension-marketplace#_can-i-stop-vs-code-from-providing-extension-recommendations
"telemetry.telemetryLevel" = "off";

"vim.highlightedyank.enable" = true;

"window.autoDetectColorScheme" = true;
Colored guides in VSCode
# https://www.roboleary.net/2021/11/06/vscode-you-dont-need-that-extension2.html#3-indentation-guides-colorization
"editor.guides.bracketPairs" = true;
"editor.guides.highlightActiveIndentation" = true;
Theme configuration in VSCode
"workbench.colorTheme" = "Default High Contrast Light";
"workbench.preferredDarkColorTheme" = "Default High Contrast";
"workbench.preferredLightColorTheme" = "Default High Contrast Light";

Neovim

For Neovim, remember that CoC completions basically work through use of the C-n and C-p binding to cycle through next and previous items in the completion listing.

./vim.nix

https://developpaper.com/complete-guide-to-getting-started-with-coc-nvim/

# Tangled from  README.org
{ config, pkgs, ... }:

{
  home.sessionVariables.EDITOR = "nvim";

  programs.neovim = {
    enable = true;

    plugins = with pkgs.vimPlugins; [
      <<nvim-packages>>
    ];
    vimdiffAlias = true;
    withRuby = true;
    extraConfig = ''
      <<neovim-config>>
    '';
    extraLuaConfig = ''
      <<neovim-lua-config>>
    '';
  };
}

Neovim packages

# deoplete-notmuch
goyo-vim
neoformat
nerdtree
tabular
tagbar
vim-airline
vim-dim
vim-fugitive
vim-gitgutter

Neovim LSP Config

Install the nvim-lspconfig package for the LSP client configurations for various languages:

nvim-lspconfig

Configure lspconfig for the languages we have an interest in:

require'lspconfig'.gleam.setup{}

We map backslack + i (for info) to float the diagnostics window:

-- Float diagnostics window through custom mapping
vim.keymap.set('n', '<Leader>i', function() vim.diagnostic.open_float(nil, {focus=false, scope='cursor'}) end)

See :h mapleader for info on the leader key which is set to backslack (\) by default. When different, try to run :echo mapleader from inside of vim to find out.

Neovim Treesitter

nvim-treesitter.withAllGrammars

See https://github.com/nvim-treesitter/nvim-treesitter?tab=readme-ov-file#highlight

require'nvim-treesitter.configs'.setup{
  highlight = {
    enable = true,
    -- Setting this to true will run `:h syntax` and tree-sitter at the same time.
    -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
    -- Using this option may slow down your editor, and you may see some duplicate highlights.
    -- Instead of true it can also be a list of languages
    additional_vim_regex_highlighting = false,
  },
}

Make Neovim default editor

Emacs

Link .emacs.d from dotfiles into home directory

# home.file.".emacs.d".source = config.lib.file.mkOutOfStoreSymlink ./emacs;
# TODO: Fix hack of hardcoded dotfiles path
# NOTE: This repo must be checked out to ~/Code/vidbina/dotfiles
# A hardcoded .emacs.d source is used because mkOutOfStoreSymlink ./emacs
# does not seem to work on macOS.
# See https://discourse.nixos.org/t/accessing-home-manager-config-in-flakes/19864/8
# See https://github.com/nix-community/home-manager/issues/2085#issuecomment-861427318
home.file.".emacs.d".source = config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/Code/vidbina/dotfiles/emacs";

Tangle nix import of emacs/*.nix

At the moment we import our nix configs for Emacs into our configuration-darwin.nix file and for Linux we haven’t really considered how to do this since we don’t actively use Linux atm. We’ll have to fix this at some point.

Bring in XMonad configuration

For now, I symlink ~/.xmonad to ~/src/vidbina/xmonad-config and run xmonad --recompile to produce the Xmonad binary.

Bars

Hidden Bar

On MacOS, we use hidden Bar to work around the issue that MacOS doesn’t natively provide mechanisms for seeing the menubar items that are hidden when the icon count gets too large or when the focused application menu entries are too many (like with Emacs which has menu entries crossing the camera notch).

"Hidden Bar" = 1452453066;

Syncthing

Navigate to Syncthing portal to configure your setup. As per [2022-05-05 Thu 12:08], the syncthing service in home-manager is only declarative to the extend of turning it on and providing extra CLI options to start the service with.

Consult the Getting Started guide to learn how to set it up β€œimperatively” (i.e.: setting up peers and generating their IDs and copying the needed information over to the other syncthing peers to establish connections) through the portal.

Syncthing Daemon on Darwin

services.syncthing = {
  enable = true;
};

Issue: Syncthing not automatically started on macOS

[2024-02-07 Wed] On macOS, the syncthing service isn’t running which was confirmed by running:

launchctl list org.nix-community.home.syncthing

where the output is

{
	"LimitLoadToSessionType" = "Aqua";
	"Label" = "org.nix-community.home.syncthing";
	"OnDemand" = true;
	"LastExitStatus" = 19968;
	"Program" = "/nix/store/rnigg5xf6n2jxda3ivscrn0yzw474dq4-syncthing-1.26.1/bin/syncthing";
	"ProgramArguments" = (
		"/nix/store/rnigg5xf6n2jxda3ivscrn0yzw474dq4-syncthing-1.26.1/bin/syncthing";
		"-no-browser";
		"-no-restart";
		"-logflags=0";
	);
};

which seems at odds with the nix definition for syncthing

launchd.agents.syncthing = {
  enable = true;
  config = {
    ProgramArguments = syncthingArgs;
    KeepAlive = {
      Crashed = true;
      SuccessfulExit = false;
    };
    ProcessType = "Background";
  };
};

as KeepAlive is defined in the nix config, but missing in the observed launch output, furthermore OnDemand isn’t mentioned at all in the nix config. 🀷🏿

It seems that the OnDemand option is a pre macOS 10.5 key which has been superceded by KeepAlive.

Just to confirm, Syncthing really isn’t running, I have checked the process list for a corresponding entry:

ps aux | grep syncthing

Trying to start syncthing through

launchctl start org.nix-community.home.syncthing

yields status 134 (SIGABRT) and 139 (SIGSEGV). Retrying with sudo fails with status 3.

Attempts to kickstart with

launchctl kickstart gui/501/org.nix-community.home.syncthing

also fail with 139: Service cannot presently execute but of course I don’t have any freaking logs.

πŸ˜• I just ran the launchctl list and ps commands on my personal MacBook and found that syncthing is running as a daemon there. Perhaps I need a system restart. I recall that starting/stopping logic with launchd is quite different in terms of UX to systemd and likely the start/stop commands just don’t do the same thing.

As a fallback, just start syncthing through a terminal with the temporary added benefit of having a log/trace of Syncthing’s actions. This needs further exploration.

A deeper dive, leads me through https://www.launchd.info/ which outlines where the different files for job definitions are stored. For me ~/Library/LaunchAgents/org.nix-community.home.syncthing.plist seems to match the definition in the home-manager codebase, unlike the output I was seeing from launchctl list earlier.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>KeepAlive</key>
	<dict>
		<key>Crashed</key>
		<true/>
		<key>SuccessfulExit</key>
		<false/>
	</dict>
	<key>Label</key>
	<string>org.nix-community.home.syncthing</string>
	<key>ProcessType</key>
	<string>Background</string>
	<key>ProgramArguments</key>
	<array>
		<string>/nix/store/rnigg5xf6n2jxda3ivscrn0yzw474dq4-syncthing-1.26.1/bin/syncthing</string>
		<string>-no-browser</string>
		<string>-no-restart</string>
		<string>-logflags=0</string>
	</array>
</dict>
</plist>

Perhaps the new job definition has simply not been loaded, which would be a failing of the darwin-rebuild switch run we did earlier. So, for next time, I should remember to try the following:

sudo launchctl load ~/Library/LaunchAgents/org.nix-community.home.syncthing.plist
sudo launchctl enable gui/501/org.nix-community.home.syncthing

but for now, I just try a restart and see what happens. 🀞🏿

Set ignore file for Syncthing or move some sensitive stuff out of synced folders

Especially for things link mail indices and Org-roam databases, I may need to do this.

Multimedia

# Tangled from README.org
{ config, pkgs, lib, options, ... }:

{
  home.packages = with pkgs; [
    <<multimedia-packages>>
  ];
}

OBS

On MacOS, we just install OBS with homebrew:

"obs" # for streaming

GTK+ UVC Viewer (GUVCView)

https://guvcview.sourceforge.net/

guvcview

V4l utils

https://linuxtv.org/projects.php

v4l-utils

Browsers

# Tangled from README.org
{ config, pkgs, lib, options, ... }:

let
  # TODO: Find a cleaner implementation, like an pkgs overlay at shell.nix?!?
  nur = import <NUR> { inherit pkgs; };

  sources = import ./nix/sources.nix;
  nixpkgs-bleeding-src = sources."nixpkgs-bleeding";
  pkgs-bleeding = import nixpkgs-bleeding-src { };
in
{
  home.packages = with pkgs; [
    <<browser-packages>>
  ];

  <<browser-chromium>>

  <<browser-firefox>>
}

Debug Chrome freeze-ups (possibly accelleration-related)

Output of starting chromium on [2023-03-04 Sat 16:51]

libva error: /run/opengl-driver/lib/dri/iHD_drv_video.so has no function __vaDriverInit_1_0
libva error: /run/opengl-driver/lib/dri/i965_drv_video.so has no function __vaDriverInit_1_0
[5045:5178:0304/164722.289526:ERROR:object_proxy.cc(623)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[5045:5178:0304/164722.289875:ERROR:object_proxy.cc(623)] Failed to call method: org.freedesktop.UPower.GetDisplayDevice: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[5045:5178:0304/164722.290266:ERROR:object_proxy.cc(623)] Failed to call method: org.freedesktop.UPower.EnumerateDevices: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
pFontconfig error: Cannot load default config file: No such file: (null)

Note that the content of the object file has a different init func:

nm -gD /run/opengl-driver/lib/dri/iHD_drv_video.so | grep __vaDriverInit

Searching through the other files object files in file:/run/opengl-driver/lib/dri, I noticed that a few do list a v1.0 init function.

nm -gD /run/opengl-driver/lib/dri/nvidia_drv_video.so | grep __vaDriverInit

So, we need to clean up some of the drivers if Chromium is trying to resolve which init function to calld dynamically.

Also vainfo communicates the version to be beyond 1.0, 1.17 to be precise.

Output of chrome://gpu on [2023-02-11 Sat 23:55]

Graphics Feature Status
Canvas: Hardware accelerated
Canvas out-of-process rasterization: Disabled
Direct Rendering Display Compositor: Disabled
Compositing: Hardware accelerated
Multiple Raster Threads: Enabled
OpenGL: Enabled
Rasterization: Hardware accelerated
Raw Draw: Disabled
Video Decode: Hardware accelerated
Video Encode: Software only. Hardware acceleration disabled
Vulkan: Disabled
WebGL: Hardware accelerated
WebGL2: Hardware accelerated
WebGPU: Disabled
Driver Bug Workarounds
clear_uniforms_before_first_program_use
count_all_in_varyings_packing
disable_post_sub_buffers_for_onscreen_surfaces
enable_webgl_timer_query_extensions
exit_on_context_lost
rely_on_implicit_sync_for_swap_buffers
disabled_extension_GL_KHR_blend_equation_advanced
disabled_extension_GL_KHR_blend_equation_advanced_coherent
disabled_extension_GL_MESA_framebuffer_flip_y
Problems Detected
WebGPU has been disabled via blocklist or the command line.
Disabled Features: webgpu
Accelerated video encode has been disabled, either via blocklist, about:flags or the command line.
Disabled Features: video_encode
Clear uniforms before first program use on all platforms: 124764, 349137
Applied Workarounds: clear_uniforms_before_first_program_use
Mesa drivers in Linux handle varyings without static use incorrectly: 333885
Applied Workarounds: count_all_in_varyings_packing
Disable partial swaps on Mesa drivers (detected with GL_RENDERER): 339493
Applied Workarounds: disable_post_sub_buffers_for_onscreen_surfaces
Disable partial swaps on Mesa drivers (detected with GL_VERSION): 339493
Applied Workarounds: disable_post_sub_buffers_for_onscreen_surfaces
Disable KHR_blend_equation_advanced until cc shaders are updated: 661715
Applied Workarounds: disable(GL_KHR_blend_equation_advanced), disable(GL_KHR_blend_equation_advanced_coherent)
Expose WebGL's disjoint_timer_query extensions on platforms with site isolation: 808744, 870491
Applied Workarounds: enable_webgl_timer_query_extensions
Some drivers can't recover after OUT_OF_MEM and context lost: 893177
Applied Workarounds: exit_on_context_lost
Avoid waiting on a egl fence before swapping buffers and rely on implicit sync on Intel GPUs: 938286
Applied Workarounds: rely_on_implicit_sync_for_swap_buffers
Disable GL_MESA_framebuffer_flip_y for desktop GL: 964010
Applied Workarounds: disable(GL_MESA_framebuffer_flip_y)
ANGLE Features
allowCompressedFormats (Frontend workarounds): Enabled: true
Allow compressed formats
cacheCompiledShader (Frontend features) anglebug:7036: Disabled
Enable to cache compiled shaders
disableAnisotropicFiltering (Frontend workarounds): Disabled
Disable support for anisotropic filtering
disableDrawBuffersIndexed (Frontend features) anglebug:7724: Disabled
Disable support for OES_draw_buffers_indexed and EXT_draw_buffers_indexed
disableProgramBinary (Frontend features) anglebug:5007: Disabled: IsPowerVrRogue(functions)
Disable support for GL_OES_get_program_binary
disableProgramCachingForTransformFeedback (Frontend workarounds): Disabled: IsAndroid() && isQualcomm
On some GPUs, program binaries don't contain transform feedback varyings
emulatePixelLocalStorage (Frontend features) anglebug:7279: Disabled: false
Emulate ANGLE_shader_pixel_local_storage using shader images
enableCaptureLimits (Frontend features) anglebug:5750: Disabled
Set the context limits like frame capturing was enabled
enableCompressingPipelineCacheInThreadPool (Frontend workarounds) anglebug:4722: Disabled: false
Enable compressing pipeline cache in thread pool.
enableProgramBinaryForCapture (Frontend features) anglebug:5658: Disabled
Even if FrameCapture is enabled, enable GL_OES_get_program_binary
forceDepthAttachmentInitOnClear (Frontend workarounds) anglebug:7246: Disabled
Force depth attachment initialization on clear ops
forceGlErrorChecking (Frontend features) https://issuetracker.google.com/220069903: Disabled
Force GL error checking (i.e. prevent applications from disabling error checking
forceInitShaderVariables (Frontend features): Disabled
Force-enable shader variable initialization
forceRobustResourceInit (Frontend features) anglebug:6041: Disabled
Force-enable robust resource init
loseContextOnOutOfMemory (Frontend workarounds): Enabled: true
Some users rely on a lost context notification if a GL_OUT_OF_MEMORY error occurs
scalarizeVecAndMatConstructorArgs (Frontend workarounds) 1165751: Disabled: false
Always rewrite vec/mat constructors to be consistent
RGBA4IsNotSupportedForColorRendering (OpenGL workarounds): Enabled: functions->standard == STANDARD_GL_DESKTOP && isIntel
GL_RGBA4 is not color renderable
RGBDXT1TexturesSampleZeroAlpha (OpenGL workarounds) anglebug:3729: Disabled: IsApple()
Sampling BLACK texels from RGB DXT1 textures returns transparent black on Mac.
addAndTrueToLoopCondition (OpenGL workarounds): Disabled: IsApple() && isIntel
Calculation of loop conditions in for and while loop has bug
adjustSrcDstRegionForBlitFramebuffer (OpenGL workarounds) 830046: Enabled: IsLinux() || (IsAndroid() && isNvidia) || (IsWindows() && isNvidia) || (IsApple() && functions->standard == STANDARD_GL_ES)
Many platforms have issues with blitFramebuffer when the parameters are large.
allowAstcFormats (OpenGL workarounds): Disabled: !isMesa || isIntel && (Is9thGenIntel(device) || IsGeminiLake(device) || IsCoffeeLake(device) || Is11thGenIntel(device) || Is12thGenIntel(device))
Enable ASTC on desktop OpenGL
allowClearForRobustResourceInit (OpenGL workarounds) 848952: Disabled: IsApple()
Using glClear for robust resource initialization is buggy on some drivers and leads to texture corruption. Default to data uploads except on MacOS where it is very slow.
allowETCFormats (OpenGL workarounds): Enabled: isIntel && !IsSandyBridge(device) && !IsIvyBridge(device) && !IsHaswell(device)
Enable ETC2/EAC on desktop OpenGL
alwaysCallUseProgramAfterLink (OpenGL workarounds) 110263: Enabled: true
Always call useProgram after a successful link to avoid a driver bug
alwaysUnbindFramebufferTexture2D (OpenGL workarounds) anglebug:5536: Disabled: isNvidia && (IsWindows() || IsLinux())
Force unbind framebufferTexture2D before binding renderbuffer to work around driver bug.
avoid1BitAlphaTextureFormats (OpenGL workarounds): Disabled: functions->standard == STANDARD_GL_DESKTOP && isAMD
Issue with 1-bit alpha framebuffer formats
bindTransformFeedbackBufferBeforeBindBufferRange (OpenGL workarounds) anglebug:5140: Disabled: IsApple()
Bind transform feedback buffers to the generic binding point before calling glBindBufferBase or glBindBufferRange.
clampArrayAccess (OpenGL workarounds) anglebug:2978: Disabled: IsAndroid() || isAMD || !functions->hasExtension("GL_KHR_robust_buffer_access_behavior")
Clamp uniform array access to avoid reading invalid memory.
clampFragDepth (OpenGL workarounds): Disabled: isNvidia
gl_FragDepth is not clamped correctly when rendering to a floating point depth buffer
clampMscRate (OpenGL workarounds) 1042393: Disabled: IsLinux() && IsWayland()
Some drivers return bogus values for GetMscRate, so we clamp it to 30Hz
clampPointSize (OpenGL workarounds): Disabled: IsAndroid() || isNvidia
The point size range reported from the API is inconsistent with the actual behavior
clearToZeroOrOneBroken (OpenGL workarounds) 710443: Disabled: IsApple() && isIntel && GetMacOSVersion() < OSVersion(10, 12, 6)
Clears when the clear color is all zeros or ones do not work.
clipSrcRegionForBlitFramebuffer (OpenGL workarounds) 830046: Disabled: IsApple() || (IsLinux() && isAMD)
Issues with blitFramebuffer when the parameters don't match the framebuffer size.
decodeEncodeSRGBForGenerateMipmap (OpenGL workarounds) anglebug:4646: Disabled: IsApple()
Decode and encode before generateMipmap for srgb format textures.
disableBlendFuncExtended (OpenGL workarounds) anglebug:1085: Enabled: isAMD || isIntel
ARB_blend_func_extended does not pass the tests
disableDrawBuffersIndexed (OpenGL workarounds): Disabled: IsWindows() && isAMD
Disable OES_draw_buffers_indexed extension.
disableGPUSwitchingSupport (OpenGL workarounds) 1091824: Disabled: isDualGPUMacWithNVIDIA
Disable GPU switching support (use only the low-power GPU) on older MacBook Pros.
disableMultisampledRenderToTexture (OpenGL workarounds) anglebug:2894: Disabled: isAdreno4xxOnAndroidLessThan51 || isAdreno4xxOnAndroid70 || isAdreno5xxOnAndroidLessThan70 || isAdreno5xxOnAndroid71 || isLinuxVivante
Many drivers have bugs when using GL_EXT_multisampled_render_to_texture
disableNativeParallelCompile (OpenGL workarounds) 1094869: Disabled: isTSANBuild && IsLinux() && isNvidia
Do not use native KHR_parallel_shader_compile even when available.
disableSemaphoreFd (OpenGL workarounds) 1046462: Disabled: IsLinux() && isAMD && isMesa && mesaVersion < (std::array<int, 3>{19, 3, 5})
Disable GL_EXT_semaphore_fd extension
disableSyncControlSupport (OpenGL workarounds) 1137851: Disabled: IsLinux() && isIntel && isMesa && mesaVersion[0] == 20
Speculative fix for issues on Linux/Wayland where exposing GLX_OML_sync_control renders Chrome unusable
disableTextureClampToBorder (OpenGL workarounds) anglebug:7405: Disabled: isImagination
Imagination devices generate INVALID_ENUM when setting the texture border color.
disableTimestampQueries (OpenGL workarounds) 811661: Disabled: (IsLinux() && isVMWare) || (IsAndroid() && isNvidia) || (IsAndroid() && GetAndroidSdkLevel() < 27 && IsAdreno5xxOrOlder(functions)) || (IsAndroid() && IsMaliT8xxOrOlder(functions)) || (IsAndroid() && IsMaliG31OrOlder(functions))
Disable GL_EXT_disjoint_timer_query extension
disableWorkerContexts (OpenGL workarounds) 849576: Disabled: (IsWindows() && (isIntel || isAMD)) || (IsLinux() && isNvidia) || IsIOS() || IsAndroid() || IsAndroidEmulator(functions)
Some tests have been seen to fail using worker contexts
doWhileGLSLCausesGPUHang (OpenGL workarounds) 644669: Disabled: IsApple() && functions->standard == STANDARD_GL_DESKTOP && GetMacOSVersion() < OSVersion(10, 11, 0)
Some GLSL constructs involving do-while loops cause GPU hangs
doesSRGBClearsOnLinearFramebufferAttachments (OpenGL workarounds): Enabled: isIntel || isAMD
Issue clearing framebuffers with linear attachments when GL_FRAMEBUFFER_SRGB is enabled
dontInitializeUninitializedLocals (OpenGL workarounds) anglebug:2046: Disabled: IsAndroid() && isQualcomm
Initializing uninitialized locals caused odd behavior in a few WebGL 2 tests
dontRelinkProgramsInParallel (OpenGL workarounds) anglebug:3045: Disabled: IsAndroid() || (IsWindows() && isIntel)
Relinking a program in parallel is buggy
dontUseLoopsToInitializeVariables (OpenGL workarounds) 809422: Disabled: (IsAndroid() && isQualcomm) || (isIntel && IsApple())
For loops used to initialize variables hit native GLSL compiler bugs
emulateAbsIntFunction (OpenGL workarounds) 642227: Disabled: IsApple() && isIntel
abs(i) where i is an integer returns unexpected result
emulateAtan2Float (OpenGL workarounds) 672380: Disabled: isNvidia
atan(y, x) may return a wrong answer
emulateCopyTexImage2D (OpenGL workarounds): Disabled: isApple
Replace CopyTexImage2D with TexImage2D + CopyTexSubImage2D.
emulateCopyTexImage2DFromRenderbuffers (OpenGL workarounds) anglebug:4674: Disabled: IsApple() && functions->standard == STANDARD_GL_ES && !(isAMD && IsWindows())
CopyTexImage2D spuriously returns errors on iOS when copying from renderbuffers.
emulateImmutableCompressedTexture3D (OpenGL workarounds) 1060012: Disabled: isQualcomm
Use non-immutable texture allocation to work around a driver bug.
emulateIsnanFloat (OpenGL workarounds) 650547: Disabled: isIntel && IsApple() && IsSkylake(device) && GetMacOSVersion() < OSVersion(10, 13, 2)
Using isnan() on highp float will get wrong answer
emulateMaxVertexAttribStride (OpenGL workarounds) anglebug:1936: Disabled: IsLinux() && functions->standard == STANDARD_GL_DESKTOP && isAMD
Some drivers return 0 when MAX_VERTEX_ATTRIB_STRIED queried
emulatePackSkipRowsAndPackSkipPixels (OpenGL workarounds) anglebug:4849: Disabled: IsApple()
GL_PACK_SKIP_ROWS and GL_PACK_SKIP_PIXELS are ignored in Apple's OpenGL driver.
emulatePrimitiveRestartFixedIndex (OpenGL workarounds) anglebug:3997: Disabled: functions->standard == STANDARD_GL_DESKTOP && functions->isAtLeastGL(gl::Version(3, 1)) && !functions->isAtLeastGL(gl::Version(4, 3))
When GL_PRIMITIVE_RESTART_FIXED_INDEX is not available, emulate it with GL_PRIMITIVE_RESTART and glPrimitiveRestartIndex.
emulateRGB10 (OpenGL workarounds) 1300575: Enabled: functions->standard == STANDARD_GL_DESKTOP
Emulate RGB10 support using RGB10_A2.
finishDoesNotCauseQueriesToBeAvailable (OpenGL workarounds): Disabled: functions->standard == STANDARD_GL_DESKTOP && isNvidia
glFinish doesn't cause all queries to report available result
flushBeforeDeleteTextureIfCopiedTo (OpenGL workarounds) anglebug:4267: Disabled: IsApple() && isIntel
Some drivers track CopyTex{Sub}Image texture dependencies incorrectly. Flush before glDeleteTextures in this case
flushOnFramebufferChange (OpenGL workarounds) 1181068: Disabled: IsApple() && Has9thGenIntelGPU(systemInfo)
Switching framebuffers without a flush can lead to crashes on Intel 9th Generation GPU Macs.
initFragmentOutputVariables (OpenGL workarounds) 1171371: Disabled: IsAdreno42xOr3xx(functions)
No init gl_FragColor causes context lost
initializeCurrentVertexAttributes (OpenGL workarounds): Disabled: isNvidia
During initialization, assign the current vertex attributes to the spec-mandated defaults
keepBufferShadowCopy (OpenGL workarounds): Disabled: !CanMapBufferForRead(functions)
Maintain a shadow copy of buffer data when the GL API does not permit reading data back.
limitMax3dArrayTextureSizeTo1024 (OpenGL workarounds) 927470: Disabled: limitMaxTextureSize
Limit max 3d texture size and max array texture layers to 1024 to avoid system hang
limitMaxMSAASamplesTo4 (OpenGL workarounds) 797243: Disabled: IsAndroid() || (IsApple() && (isIntel || isAMD || isNvidia))
Various rendering bugs have been observed when using higher MSAA counts
limitWebglMaxTextureSizeTo4096 (OpenGL workarounds) 927470: Disabled: IsAndroid() || limitMaxTextureSize
Limit webgl max texture size to 4096 to avoid frequent out-of-memory errors
packLastRowSeparatelyForPaddingInclusion (OpenGL workarounds) anglebug:1512: Disabled: IsApple() || isNvidia
When uploading textures from an pack buffer, some drivers count an extra row padding
packOverlappingRowsSeparatelyPackBuffer (OpenGL workarounds): Disabled: isNvidia
In the case of packing to a pixel pack buffer, pack overlapping rows row by row
passHighpToPackUnormSnormBuiltins (OpenGL workarounds) anglebug:7527: Disabled: isQualcomm
packUnorm4x8 fails on Pixel 4 if it is not passed a highp vec4.
preAddTexelFetchOffsets (OpenGL workarounds) 642605: Disabled: IsApple() && isIntel
Intel Mac drivers mistakenly consider the parameter position of nagative vaule as invalid even if the sum of position and offset is in range, so we need to add workarounds by rewriting texelFetchOffset(sampler, position, lod, offset) into texelFetch(sampler, position + offset, lod).
promotePackedFormatsTo8BitPerChannel (OpenGL workarounds) anglebug:5469: Disabled: IsApple() && hasAMD
Packed color formats are buggy on Macs with AMD GPUs
queryCounterBitsGeneratesErrors (OpenGL workarounds) anglebug:3027: Disabled: IsNexus5X(vendor, device)
Drivers generate errors when querying the number of bits in timer queries
readPixelsUsingImplementationColorReadFormatForNorm16 (OpenGL workarounds) anglebug:4214: Disabled: !isIntel && functions->standard == STANDARD_GL_ES && functions->isAtLeastGLES(gl::Version(3, 1)) && functions->hasGLESExtension("GL_EXT_texture_norm16")
Quite some OpenGL ES drivers don't implement readPixels for RGBA/UNSIGNED_SHORT from EXT_texture_norm16 correctly
reapplyUBOBindingsAfterUsingBinaryProgram (OpenGL workarounds) anglebug:1637: Disabled: isAMD || IsAndroid()
Some drivers forget about UBO bindings when using program binaries
regenerateStructNames (OpenGL workarounds) 403957: Disabled: IsApple()
All Mac drivers do not handle struct scopes correctly. This workaround overwrites a structname with a unique prefix.
removeDynamicIndexingOfSwizzledVector (OpenGL workarounds) 709351: Disabled: IsApple() || IsAndroid() || IsWindows()
Dynamic indexing of swizzled l-values doesn't work correctly on various platforms.
removeInvariantAndCentroidForESSL3 (OpenGL workarounds): Disabled: functions->isAtMostGL(gl::Version(4, 1)) || (functions->standard == STANDARD_GL_DESKTOP && isAMD)
Fix spec difference between GLSL 4.1 or lower and ESSL3
resetTexImage2DBaseLevel (OpenGL workarounds) 705865: Disabled: IsApple() && isIntel && GetMacOSVersion() >= OSVersion(10, 12, 4)
Reset texture base level before calling glTexImage2D to work around pixel comparison failure.
rewriteFloatUnaryMinusOperator (OpenGL workarounds) 308366: Disabled: IsApple() && isIntel && GetMacOSVersion() < OSVersion(10, 12, 0)
Using '-<float>' will get wrong answer
rewriteRepeatedAssignToSwizzled (OpenGL workarounds): Disabled: isNvidia
Repeated assignment to swizzled values inside a GLSL user-defined function have incorrect results
rewriteRowMajorMatrices (OpenGL workarounds) anglebug:2273: Disabled: false
Rewrite row major matrices in shaders as column major as a driver bug workaround
sanitizeAMDGPURendererString (OpenGL workarounds) 1181193: Disabled: IsLinux() && hasAMD
Strip precise kernel and DRM version information from amdgpu renderer strings.
setPrimitiveRestartFixedIndexForDrawArrays (OpenGL workarounds) anglebug:3997: Disabled: features->emulatePrimitiveRestartFixedIndex.enabled && IsApple() && isIntel
Some drivers discard vertex data in DrawArrays calls when the fixed primitive restart index is within the number of primitives being drawn.
setZeroLevelBeforeGenerateMipmap (OpenGL workarounds): Disabled: IsApple()
glGenerateMipmap fails if the zero texture level is not set on some Mac drivers.
shiftInstancedArrayDataWithOffset (OpenGL workarounds) 1144207: Disabled: IsApple() && IsIntel(vendor) && !IsHaswell(device)
glDrawArraysInstanced is buggy on certain new Mac Intel GPUs
supportsFragmentShaderInterlockARB (OpenGL features) anglebug:7279: Enabled: functions->isAtLeastGL(gl::Version(4, 5)) && functions->hasGLExtension("GL_ARB_fragment_shader_interlock")
Backend GL context supports ARB_fragment_shader_interlock extension
supportsFragmentShaderInterlockNV (OpenGL features) anglebug:7279: Enabled: functions->isAtLeastGL(gl::Version(4, 3)) && functions->hasGLExtension("GL_NV_fragment_shader_interlock")
Backend GL context supports NV_fragment_shader_interlock extension
supportsFragmentShaderOrderingINTEL (OpenGL features) anglebug:7279: Disabled: functions->isAtLeastGL(gl::Version(4, 4)) && functions->hasGLExtension("GL_INTEL_fragment_shader_ordering")
Backend GL context supports GL_INTEL_fragment_shader_ordering extension
supportsShaderFramebufferFetchEXT (OpenGL features) anglebug:7279: Disabled: functions->hasGLESExtension("GL_EXT_shader_framebuffer_fetch")
Backend GL context supports EXT_shader_framebuffer_fetch extension
supportsShaderFramebufferFetchNonCoherentEXT (OpenGL features) anglebug:7279: Disabled: functions->hasGLESExtension("EXT_shader_framebuffer_fetch_non_coherent")
Backend GL context supports EXT_shader_framebuffer_fetch_non_coherent extension
syncVertexArraysToDefault (OpenGL workarounds) anglebug:5577: Disabled: !nativegl::SupportsVertexArrayObjects(functions)
Only use the default VAO because of missing support or driver bugs
unbindFBOBeforeSwitchingContext (OpenGL workarounds) 1181193: Disabled: IsPowerVR(vendor)
Imagination GL drivers are buggy with context switching.
unfoldShortCircuits (OpenGL workarounds) anglebug:482: Disabled: IsApple()
Mac incorrectly executes both sides of && and || expressions when they should short-circuit.
unpackLastRowSeparatelyForPaddingInclusion (OpenGL workarounds) anglebug:1512: Disabled: IsApple() || isNvidia
When uploading textures from an unpack buffer, some drivers count an extra row padding
unpackOverlappingRowsSeparatelyUnpackBuffer (OpenGL workarounds): Disabled: isNvidia
In the case of unpacking from a pixel unpack buffer, unpack overlapping rows row by row
unsizedSRGBReadPixelsDoesntTransform (OpenGL workarounds) 550292: Disabled: IsAndroid() && isQualcomm
Drivers returning raw sRGB values instead of linearized values when calling glReadPixels on unsized sRGB texture formats
uploadTextureDataInChunks (OpenGL workarounds) 1181068: Disabled: IsApple()
Upload texture data in <120kb chunks to work around Mac driver hangs and crashes.
useUnusedBlocksWithStandardOrSharedLayout (OpenGL workarounds): Disabled: (IsApple() && functions->standard == STANDARD_GL_DESKTOP) || (IsLinux() && isAMD)
Unused std140 or shared uniform blocks will be treated as inactive
vertexIDDoesNotIncludeBaseVertex (OpenGL workarounds): Disabled: IsApple() && isAMD
gl_VertexID in GLSL vertex shader doesn't include base vertex value
DAWN Info

<CPU> Vulkan backend - SwiftShader Device (Subzero)
[Default Toggle Names]
lazy_clear_resource_on_first_use: https://crbug.com/dawn/145: Clears resource to zero on first usage. This initializes the resource so that no dirty bits from recycled memory is present in the new resource.
use_temporary_buffer_in_texture_to_texture_copy: https://crbug.com/dawn/42: Split texture-to-texture copy into two copies: copy from source texture into a temporary buffer, and copy from the temporary buffer into the destination texture when copying between compressed textures that don't have block-aligned sizes. This workaround is enabled by default on all Vulkan drivers to solve an issue in the Vulkan SPEC about the texture-to-texture copies with compressed formats. See #1005 (https://github.com/KhronosGroup/Vulkan-Docs/issues/1005) for more details.
vulkan_use_d32s8: https://crbug.com/dawn/286: Vulkan mandates support of either D32_FLOAT_S8 or D24_UNORM_S8. When available the backend will use D32S8 (toggle to on) but setting the toggle to off will make it use the D24S8 format when possible.
vulkan_use_s8: https://crbug.com/dawn/666: Vulkan has a pure stencil8 format but it is not universally available. When this toggle is on, the backend will use S8 for the stencil8 format, otherwise it will fallback to D32S8 or D24S8.
disallow_unsafe_apis: http://crbug.com/1138528: Produces validation errors on API entry points or parameter combinations that aren't considered secure yet.
use_vulkan_zero_initialize_workgroup_memory_extension: https://crbug.com/dawn/1302: Initialize workgroup memory with OpConstantNull on Vulkan when the Vulkan extension VK_KHR_zero_initialize_workgroup_memory is supported.
[WebGPU Forced Toggles - enabled]
disallow_spirv: https://crbug.com/1214923: Disallow usage of SPIR-V completely so that only WGSL is used for shader modules. This is useful to prevent a Chromium renderer process from successfully sending SPIR-V code to be compiled in the GPU process.
[Supported Features]
texture-compression-bc
texture-compression-etc2
texture-compression-astc
timestamp-query
depth-clip-control
depth32float-stencil8
indirect-first-instance
rg11b10ufloat-renderable
dawn-internal-usages
dawn-native
Version Information
Data exported
2023-02-11T23:53:25.967Z
Chrome version
Chrome/108.0.5359.98
Operating system
Linux 5.15.81
Software rendering list URL
https://chromium.googlesource.com/chromium/src/+/aa99c50ebc03bd334a4a8f11e99ab6fb5e0adf78/gpu/config/software_rendering_list.json
Driver bug list URL
https://chromium.googlesource.com/chromium/src/+/aa99c50ebc03bd334a4a8f11e99ab6fb5e0adf78/gpu/config/gpu_driver_bug_list.json
ANGLE commit id
unknown hash
2D graphics backend
Skia/108 7c55be996a81ff9c5c66984c9d4ef85d12a44c8c
Command Line
/nix/store/nq2g91pahhdvyw99kb18s9dh3csqg9my-chromium-unwrapped-108.0.5359.98/libexec/chromium/chromium --flag-switches-begin --flag-switches-end
Driver Information
Initialization time
235
In-process GPU
false
Passthrough Command Decoder
true
Sandboxed
false
GPU0
VENDOR= 0x0000 [Google Inc. (Intel)], DEVICE=0x0000 [ANGLE (Intel, Mesa Intel(R) UHD Graphics (TGL GT1), OpenGL 4.6 (Core Profile) Mesa 22.2.4)], DRIVER_VENDOR=Mesa, DRIVER_VERSION=22.2.4 *ACTIVE*
Optimus
false
AMD switchable
false
GPU CUDA compute capability major version
0
Pixel shader version
1.00
Vertex shader version
1.00
Max. MSAA samples
16
Machine model name
Machine model version
GL_VENDOR
Google Inc. (Intel)
GL_RENDERER
ANGLE (Intel, Mesa Intel(R) UHD Graphics (TGL GT1), OpenGL 4.6 (Core Profile) Mesa 22.2.4)
GL_VERSION
OpenGL ES 2.0.0 (ANGLE 2.1.0 git hash: unknown hash)
GL_EXTENSIONS
GL_AMD_performance_monitor GL_ANGLE_base_vertex_base_instance GL_ANGLE_base_vertex_base_instance_shader_builtin GL_ANGLE_client_arrays GL_ANGLE_compressed_texture_etc GL_ANGLE_depth_texture GL_ANGLE_framebuffer_blit GL_ANGLE_framebuffer_multisample GL_ANGLE_get_serialized_context_string GL_ANGLE_get_tex_level_parameter GL_ANGLE_instanced_arrays GL_ANGLE_logic_op GL_ANGLE_memory_size GL_ANGLE_multi_draw GL_ANGLE_program_cache_control GL_ANGLE_provoking_vertex GL_ANGLE_request_extension GL_ANGLE_robust_client_memory GL_ANGLE_texture_compression_dxt3 GL_ANGLE_texture_compression_dxt5 GL_ANGLE_texture_external_update GL_ANGLE_texture_rectangle GL_ANGLE_translated_shader_source GL_APPLE_clip_distance GL_ARB_sync GL_CHROMIUM_bind_generates_resource GL_CHROMIUM_bind_uniform_location GL_CHROMIUM_color_buffer_float_rgb GL_CHROMIUM_color_buffer_float_rgba GL_CHROMIUM_copy_texture GL_CHROMIUM_lose_context GL_CHROMIUM_sync_query GL_EXT_base_instance GL_EXT_blend_minmax GL_EXT_color_buffer_half_float GL_EXT_compressed_ETC1_RGB8_sub_texture GL_EXT_debug_label GL_EXT_debug_marker GL_EXT_discard_framebuffer GL_EXT_disjoint_timer_query GL_EXT_draw_buffers GL_EXT_draw_elements_base_vertex GL_EXT_float_blend GL_EXT_frag_depth GL_EXT_instanced_arrays GL_EXT_map_buffer_range GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_multi_draw_indirect GL_EXT_multisample_compatibility GL_EXT_occlusion_query_boolean GL_EXT_read_format_bgra GL_EXT_robustness GL_EXT_sRGB GL_EXT_sRGB_write_control GL_EXT_semaphore GL_EXT_semaphore_fd GL_EXT_shader_texture_lod GL_EXT_shadow_samplers GL_EXT_texture_compression_bptc GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc_srgb GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_EXT_texture_norm16 GL_EXT_texture_rg GL_EXT_texture_sRGB_decode GL_EXT_texture_storage GL_EXT_texture_type_2_10_10_10_REV GL_EXT_unpack_subimage GL_KHR_debug GL_KHR_parallel_shader_compile GL_MESA_framebuffer_flip_y GL_NV_depth_buffer_float2 GL_NV_fence GL_NV_framebuffer_blit GL_NV_pack_subimage GL_NV_pixel_buffer_object GL_NV_read_depth GL_NV_read_stencil GL_OES_compressed_EAC_R11_signed_texture GL_OES_compressed_EAC_R11_unsigned_texture GL_OES_compressed_EAC_RG11_signed_texture GL_OES_compressed_EAC_RG11_unsigned_texture GL_OES_compressed_ETC1_RGB8_texture GL_OES_compressed_ETC2_RGB8_texture GL_OES_compressed_ETC2_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture GL_OES_compressed_ETC2_sRGB8_alpha8_texture GL_OES_compressed_ETC2_sRGB8_texture GL_OES_depth24 GL_OES_depth32 GL_OES_depth_texture GL_OES_draw_elements_base_vertex GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_get_program_binary GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_surfaceless_context GL_OES_texture_3D GL_OES_texture_border_clamp GL_OES_texture_float GL_OES_texture_float_linear GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_texture_stencil8 GL_OES_vertex_array_object GL_WEBGL_video_texture
Disabled Extensions
GL_KHR_blend_equation_advanced GL_KHR_blend_equation_advanced_coherent GL_MESA_framebuffer_flip_y
Disabled WebGL Extensions
Window system binding vendor
Google Inc. (Intel)
Window system binding version
1.5 (ANGLE 2.1.0 git hash: unknown hash)
Window system binding extensions
EGL_KHR_create_context EGL_KHR_get_all_proc_addresses EGL_ANGLE_create_context_webgl_compatibility EGL_CHROMIUM_create_context_bind_generates_resource EGL_CHROMIUM_sync_control EGL_ANGLE_sync_control_rate EGL_EXT_pixel_format_float EGL_KHR_surfaceless_context EGL_ANGLE_display_texture_share_group EGL_ANGLE_display_semaphore_share_group EGL_ANGLE_create_context_client_arrays EGL_ANGLE_program_cache_control EGL_ANGLE_robust_resource_initialization EGL_ANGLE_create_context_extensions_enabled EGL_ANDROID_blob_cache EGL_ANDROID_recordable EGL_ANGLE_create_context_backwards_compatible EGL_KHR_create_context_no_error EGL_NOK_texture_from_pixmap EGL_KHR_reusable_sync
XDG_CURRENT_DESKTOP
none+xmonad
XDG_SESSION_TYPE
x11
GDMSESSION
none+xmonad
Ozone platform
x11
Direct rendering version
unknown
Reset notification strategy
0x8261
GPU process crash count
0
gfx::BufferFormats supported for allocation and texturing
R_8: not supported, R_16: not supported, RG_88: not supported, RG_1616: not supported, BGR_565: not supported, RGBA_4444: not supported, RGBX_8888: not supported, RGBA_8888: not supported, BGRX_8888: not supported, BGRA_1010102: not supported, RGBA_1010102: not supported, BGRA_8888: not supported, RGBA_F16: not supported, YVU_420: not supported, YUV_420_BIPLANAR: not supported, P010: not supported
Compositor Information
Tile Update Mode
One-copy
Partial Raster
Enabled
GpuMemoryBuffers Status
R_8
Software only
R_16
Software only
RG_88
Software only
RG_1616
Software only
BGR_565
Software only
RGBA_4444
Software only
RGBX_8888
Software only
RGBA_8888
Software only
BGRX_8888
Software only
BGRA_1010102
Software only
RGBA_1010102
Software only
BGRA_8888
Software only
RGBA_F16
Software only
YVU_420
Software only
YUV_420_BIPLANAR
Software only
P010
Software only
Display(s) Information
Info
Display[21691165392764996] bounds=[0,0 3840x2400], workarea=[0,0 3840x2400], scale=1, rotation=0, panel_rotation=0 internal.
Color space (all)
{primaries:BT709, transfer:SRGB, matrix:RGB, range:FULL}
Buffer format (all)
BGRA_8888
Color volume
{name:'srgb', r:[0.6400, 0.3300], g:[0.3000, 0.6000], b:[0.1500, 0.3300], w:[0.3127, 0.3290]}
SDR white level in nits
203
HDR relative maximum luminance
1
Bits per color component
8
Bits per pixel
24
Refresh Rate in Hz
59
Video Acceleration Information
Decoding
Decode h264 baseline
16x16 to 4096x4096 pixels
Decode h264 main
16x16 to 4096x4096 pixels
Decode h264 high
16x16 to 4096x4096 pixels
Decode vp8
16x16 to 4096x4096 pixels
Decode vp9 profile0
16x16 to 16384x16384 pixels
Decode vp9 profile2
16x16 to 16384x16384 pixels
Decode hevc main
16x16 to 16384x16384 pixels
Decode hevc main 10
16x16 to 16384x16384 pixels
Decode hevc main still-picture
16x16 to 16384x16384 pixels
Decode av1 profile main
16x16 to 16384x16384 pixels
Encoding
Vulkan Information
Device Performance Information
Log Messages
[1858585:1858585:0211/232104.502857:WARNING:sandbox_linux.cc(380)] : InitializeSandbox() called with multiple threads in process gpu-process.
[1858585:1858585:0211/234145.374942:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234145.375064:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234145.472058:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.472574:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.472770:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.472972:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.473111:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.473964:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474153:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474295:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474451:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474599:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474739:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.474874:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.475011:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.475147:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.475869:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.476784:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.476967:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477109:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477248:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477397:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477564:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477712:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.477858:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.478010:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.478149:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479018:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479208:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479354:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479524:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479681:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479829:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.479983:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.480136:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.480280:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.480443:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481307:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481504:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481657:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481805:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.481998:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482229:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482413:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482587:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482722:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.482859:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.483817:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484022:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484169:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484315:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484488:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484623:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484775:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.484887:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.485001:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.485104:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486015:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486163:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486267:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486377:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486519:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486642:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486747:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486840:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.486941:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.487083:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.487998:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488196:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488343:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488500:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488637:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.488785:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.489265:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.489548:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.489796:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.490028:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.491453:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.491695:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.491918:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.492140:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.492362:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.492624:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.492927:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.493165:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.493355:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.493516:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.494795:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495075:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495280:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495463:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495620:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.495771:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.497542:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.497807:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.498098:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.498257:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234145.631943:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234145.632070:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234146.170252:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234146.170355:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234146.523490:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234146.523599:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234146.560416:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234150.723272:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234150.723417:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234150.737067:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234207.688807:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234207.688946:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234213.092461:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234213.092595:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234213.123400:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234218.292369:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234218.292525:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234218.305831:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/234222.073241:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234222.073365:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234223.812997:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234223.813131:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/234240.669524:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/234240.669723:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235218.585448:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235218.585586:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235222.337372:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235222.337522:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235222.339168:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.350324:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.367798:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.385180:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.402502:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.419584:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.421363:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.422162:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.422436:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235222.422755:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235226.230783:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235226.230894:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235307.724218:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235307.724384:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image
[1858585:1858585:0211/235307.752809:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.754053:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.754875:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.755625:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.756357:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.757201:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235307.757925:ERROR:shared_image_manager.cc(202)] : SharedImageManager::ProduceSkia: Trying to Produce a Skia representation from a non-existent mailbox.
[1858585:1858585:0211/235308.645226:ERROR:shared_image_factory.cc(575)] : Could not find SharedImageBackingFactory with params: usage: DisplayRead|Scanout, format: YUV_420_BIPLANAR, share_between_threads: 0, gmb_type: platform
[1858585:1858585:0211/235308.645332:ERROR:shared_image_stub.cc(147)] : SharedImageStub: Unable to create shared image

https://www.lifewire.com/hardware-acceleration-in-chrome-4125122

Somehow resolved after disabling offloading. Also running chrome as DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1 chromium.

Debug Chrome

See NixOS/nixpkgs#216361

libGL error: MESA-LOADER: failed to open iris: /nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6: version `GLIBC_2.36' not found (required by /nix/store/hvi95rrzrnqqhwvfn5b10l5c3f2lhr0h-llvm-15.0.7-lib/lib/libLLVM-15.so) (search paths /run/opengl-driver/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open iris: /nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6: version `GLIBC_2.36' not found (required by /nix/store/hvi95rrzrnqqhwvfn5b10l5c3f2lhr0h-llvm-15.0.7-lib/lib/libLLVM-15.so) (search paths /run/opengl-driver/lib/dri, suffix _dri)
libGL error: failed to load driver: iris
libGL error: MESA-LOADER: failed to open swrast: /nix/store/lqz6hmd86viw83f9qll2ip87jhb7p1ah-glibc-2.35-224/lib/libc.so.6: version `GLIBC_2.36' not found (required by /nix/store/hvi95rrzrnqqhwvfn5b10l5c3f2lhr0h-llvm-15.0.7-lib/lib/libLLVM-15.so) (search paths /run/opengl-driver/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast
[3436:3436:0622/194103.267052:ERROR:angle_platform_impl.cc(43)] Display.cpp:1014 (initialize): ANGLE Display::initialize error 12289: Could not create a backing OpenGL context.
ERR: Display.cpp:1014 (initialize): ANGLE Display::initialize error 12289: Could not create a backing OpenGL context.
[3436:3436:0622/194103.268458:ERROR:gl_display.cc(504)] EGL Driver message (Critical) eglInitialize: Could not create a backing OpenGL context.
[3436:3436:0622/194103.268557:ERROR:gl_display.cc(917)] eglInitialize OpenGL failed with error EGL_NOT_INITIALIZED, trying next display type
[3436:3436:0622/194103.271814:ERROR:angle_platform_impl.cc(43)] Display.cpp:1014 (initialize): ANGLE Display::initialize error 12289: Could not create a backing OpenGL context.
ERR: Display.cpp:1014 (initialize): ANGLE Display::initialize error 12289: Could not create a backing OpenGL context.
[3436:3436:0622/194103.271908:ERROR:gl_display.cc(504)] EGL Driver message (Critical) eglInitialize: Could not create a backing OpenGL context.

Resolved by disabling offloading.

Chromium

programs.chromium = {
  enable = true;
  package = pkgs-bleeding.chromium;
  commandLineArgs = [
    # https://www.linuxuprising.com/2018/08/how-to-enable-hardware-accelerated.html
    "--enable-accelerated-video-decode"
    "--enable-logging=stderr"
    "--ignore-gpu-blocklist"
    "--use-gl=desktop"
    "--enable-features=VaapiVideoEncoder,VaapiVideoDecoder"
    "--disable-features=UseChromeOSDirectVideoDecoder"

    # https://github.com/NixOS/nixpkgs/issues/209101
    "--disable-gpu-vsync"
    "--disable-frame-rate-limit"

    # https://wiki.archlinux.org/title/chromium
    "--ignore-gpu-blocklist"
    "--enable-gpu-rasterization"
    "--enable-zero-copy"
  ];

  extensions = [
    <<browser-chromium-extensions>>
  ];
};

See https://chromium.googlesource.com/chromium/src/+/refs/heads/main/chrome/common/chrome_switches.cc and https://source.chromium.org/search?q=file:switches.cc&amp;ss=chromium%2Fchromium%2Fsrc for some switches that we can use according to the commandLineArgs option in programs/chromium.nix.

Setting environment variable to disable switching

Note how NixOS/nixpkgs#211408 outlines a fix regarding graphics switching/offloading:

DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1

We set this through the home.sessionVariables option, so we can just run chromium to keep things simple:

home.sessionVariables.DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1 = 1;

Debugging

https://www.chromium.org/developers/how-tos/run-chromium-with-flags/

chrome://version chrome://flags chrome://gpu

Extensions

Vimium

vi-like navigation of the browser

{
  # Vimium
  # https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb
  id = "dbepggeogbaibhgnhhndojpepiihcmeb";
}
c
enter caret mode from either of the visual modes (v visual mode, V visual line mode)
Wasavi

vi-editor for input controls

  • enter with C-RET, exit with :q (typical vi exit command)
{
  # wasavi
  # https://chrome.google.com/webstore/detail/wasavi/dgogifpkoilgiofhhhodbodcfgomelhe
  # see https://github.com/philc/vimium/issues/2564
  id = "dgogifpkoilgiofhhhodbodcfgomelhe";
}

Firefox

⚠️ In order to get the extensions in Firefox to work, you may have to first manually enable the extensions.

programs.firefox = {
  enable = true;

  <<browser-firefox-profiles>>
};

Extensions

# NOTE: Extensions need firefox.profiles to be defined
profiles.personal.extensions =
  # https://nur.nix-community.org/repos/rycee/
  with nur.repos.rycee.firefox-addons; [
    <<browser-firefox-extensions>>
  ];
Tridactyl

Tridactyl is the extension introducing the vim bindings into Firefox. It will hijack the body of your new tabs which can bit a bit disruptive to your workflow as it will present a Tridactyl start page which is visually quite busy therefore running :set newtab about:blank to clear the body of the new tab can improve the UX and run :set theme dark to switch to a dark theme if new tabs are blasting you with white light.

multi-account-containers # needed by tridactyl
tridactyl
Escape Hatch

Remember that <C-,> (as described in the Tridactyl documentation which would be C-, in Emacs bindings notation or more simply but Ctrl + ,​) is the Tridactyl escape hatch that gets you into a part within the page view of the browser where you can use the vi-like bindings to navigate or do this.

πŸ’‘ This is convenient because loading some pages will leave the focus on the URL bar or the search bar and tabbing through may be a tedious way to get to the page view.

Ignore mode

Remember that Shift + Insert (or Ctrl + Alt + Escape but I’m refusing to learn that one because it is quite a dragon of a maneuver to efficiently pull of) will toggle to ignore mode in which all keypresses are passed-through to the web application.

πŸ’‘ This is convenient for applications that have their own bindings that may conflict with Tridactyl.

Search

Use / to enter a search query and use Ctrl + g or Ctrl + G to cycle through search results.

πŸ’‘ The search cycling binding is a bit differnet to what vi-bindings users may expect so just pay attention to keep C-g and C-G (expressed in Emacs notation) within (muscle) memory.

Shared Extensions

WIP GhostText

Use GhostText to edit text in the browser through a text editor.

just trying this out to edit text in browser in Emacs

https://chrome.google.com/webstore/detail/ghosttext/godiecgffnchndlihlpaajjcplehddca/related

{
  # GhostText
  # https://chrome.google.com/webstore/detail/ghosttext/godiecgffnchndlihlpaajjcplehddca
  # see https://ghosttext.fregante.com/
  id = "godiecgffnchndlihlpaajjcplehddca";
}

Darkreader

{
  # Darkreader
  # https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh
  id = "eimadpbcbfnmbkopoojfekhnkhdbieeh";
}
darkreader
Override for mermaid on GitHub

/html/body/div[1]/div/div/svg/g[2]/rect #entity-Document-5b2ba057-c937-56df-837d-8bac67f835ce > rect

GitHub wraps mermaid diagrams in a div with the .mermaid class:

div.mermaid svg#diagram rect.er.entityBox {
  fill: transparent !important;
}

More generally and for the Mermaid Live editor the following applies added up top:

<<darkreader-mermaid>>

We fix the navigation controls for embedded mermaid diagrams by setting the fill and background clors on the control-panel buttons:

div.mermaid-viewer-control-panel .btn {
  fill: var(--darkreader-neutral-text);
  background-color: var(--darkreader-neutral-background);
}

For the ER diagrams:

svg g rect.er {
  fill: var(--darkreader-neutral-background) !important;
}
svg g rect.er.entityBox {
  fill: var(--darkreader-neutral-background) !important;
}
svg g rect.er.attributeBoxOdd {
  fill: var(--darkreader-neutral-background) !important;
}
svg g rect.er.attributeBoxEven {
  fill-opacity: 0.8 !important;
  fill: var(--darkreader-selection-background);
}
svg rect.er.relationshipLabelBox {
  fill: var(--darkreader-neutral-background) !important;
}

For the Flow diagrams:

svg g g.nodes rect, svg g g.nodes polygon {
  fill: var(--darkreader-neutral-background) !important;
}

For Gantt diagrams:

svg g rect.task {
  fill: var(--darkreader-selection-background) !important;
}

For Sequence diagrams:

svg line.messageLine0, svg line.messageLine1 {
  stroke: var(--darkreader-neutral-text) !important;
}
div.mermaid .actor {
  fill: var(--darkreader-neutral-background) !important;
}
div.mermaid .sequenceNumber {
  color: var(--darkreader-selection-text) !important;
}

Filed into darkreader/darkreader#11108

DXOS Overides
.sidebar {
  background: var(--darkreader-neutral-background) !important;
}

Chat

Slack

Using Slack from the browser is a shitty experience because one has to keep so many tabs open for the different workspaces. I’m finally budging and installing the official client.

pkgs.slack
"slack"

Discord

pkgs.discord
"discord"
"discord-ptb"
"discord-canary"

Docs

# Tangled from README.org
{ config, pkgs, ... }:
let
  <<doc-let-bindings>>
in
{
  home.packages = with pkgs; [
    <<doc-packages>>
  ];
}

$LaTeX$

texlive-asabina = with pkgs; (texlive.combine {
  inherit (texlive)
    scheme-medium
    luatex

    atenddvi
    background
    bashful
    capt-of
    collection-basic
    collection-fontsrecommended
    collection-langeuropean
    collection-langgerman
    collection-latexrecommended
    datetime
    draftwatermark
    enumitem
    eso-pic
    etoolbox
    everypage
    fmtcount
    koma-script
    lastpage
    latexdiff
    mdframed
    needspace
    numprint
    paracol
    pdfcrop
    pgfgantt
    soul
    svg
    tableof
    titlepic
    tocloft
    transparent
    trimspaces
    ulem
    wrapfig
    xargs
    xetex
    xstring
    xtab
    ;
});
biber
bibtex2html
texlive-asabina

PDF

Utilities

pdftk

We install pdftk into our common config.

pdftk

And relist it for the Darwin config

pdftk

until I’ve had some time to properly abstract this mess of a config. I have my Linux machine back, so high-time to test that tux config again.

pandoc
pandoc

Readers

Evince
evince
Okular
okular
Xournal
xournal
Zathura
zathura

Dictionaries

Aspell

aspell
aspellDicts.de
aspellDicts.en
aspellDicts.nl

Spreadsheets

sc-im
visidata

Misc

QR

qrencode

Office

libreoffice

Remarkable

We previously installed the reMarkable app for OSX through homebrew casks but are now following the recommendation from the app itself to install it from the App Store.

https://apps.apple.com/us/app/remarkable-desktop/id1276493162

"Remarkable Desktop" = 1276493162;

[3/22] Convert home-manager config to literate config

Refer to emacs/README.org for an example of a literate config that tangles into multiple output files.

  • [-] configuration-darwin.nix
  • [ ] emacs/home.nix
  • [ ] system/darwin.nix
  • [ ] direnv
  • [ ] .xsession
  • [ ] .Xresources.d
  • [ ] .Xmodmap
  • [ ] tmux
  • [ ] Neovim
  • [ ] Termite
  • [ ] Starship
  • [X] Rofi (handled through Pywal since [2023-07-03 Mon])
  • [ ] Redshift (or Gammastep)
  • [ ] Ghorg
  • [ ] Asciinema
  • [ ] Compton
  • [ ] Octave
  • [ ] Lein
  • [ ] Colorit
  • [ ] Conky
  • [X] Emacs
  • [X] Git

Add MIME types

application/pdf=org.pwmt.zathura-pdf-mupdf.desktop;okularApplication_pdf.desktop; application/octet-stream=emacsclient.desktop;

Local Variables

For convenience, we call delete-trailing-whitespace as outlined in an emacs-orgmode mailing thread to automatically clean up trailing whitespaces that may be artifact from tangling noweb refs that

  1. contain line-breaks and are being indented or
  2. have no noweb-ref writes

;;; Local Variables: ;;; eval: (add-hook β€˜org-babel-post-tangle-hook #’delete-trailing-whitespace) ;;; eval: (add-hook β€˜org-babel-post-tangle-hook #’save-buffer :append) ;;; End:

About

Just dotfiles. Managing most of my systems with Nix ❄️ and now with home-manager too. Parts of the configuration are literate πŸ“œ, others are just a hot mess of spaghetti 🍝. Here be dragons. 🐲

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published