#+title: Useful Nix bits This pages houses a few configuration snippets that might be useful if you are new to the nix ecosystem. It will be infrequently updated as I come across things that I deem to be interesting to such a reader. * Importing a NixOS module that is not in nixpkgs This requires changes in multiple locations. As an example we will use an early version of the mautrix-signal module by Niklas Korz. 1) Add the module source to flake.nix: #+begin_src nix flake.nix { inputs = { [...] # provides expressions for mautrix-signal nixpkgs-mautrix-signal ={ url = github:niklaskorz/nixpkgs/nixos-23.11-mautrix-signal; }; [...] }; outputs = inputs@{ self, [...] nixpkgs-mautrix-signal, [...] }: let [...] pkgsmautrix = import nixpkgs-mautrix-signal { inherit system; config.allowUnfree = true; }; [...] in { nixosConfigurations = { matrix = nixpkgs.lib.nixosSystem { pkgs = pkgsmautrix; # this is to import a service module that is not on nixpkgs # this way avoids infinite recursion errors specialArgs.unstable = nixpkgs-mautrix-signal; modules = [ [...] ]; }; }; } } #+end_src 2) Import the module in the configuration: #+begin_src nix configuration.nix [...] imports = [ [...] (unstable + "/nixos/modules/services/matrix/mautrix-signal.nix") ]; [...] #+end_src * Build a firefox addon #+begin_src nix configuration.nix programs.firefox = { [...] profiles.default = { [...] extensions = with pkgs.nur.repos.rycee.firefox-addons; [ [...] (buildFirefoxXpiAddon { pname = ":emoji:"; version = "0.1.3"; addonId = "gonelf@gmail.com"; url = "https://addons.mozilla.org/firefox/downloads/file/3365324/emojidots-0.1.3.xpi"; sha256 = "4f7cc25c478fe52eb82f37c9ff4978dcaa3f95020398c5b184e517f6efa2c201"; meta = with lib; { description = "emoji autocomplete anywhere on the internet"; mozPermissions = [ "https://gist.githubusercontent.com/gonelf/d8ae3ccb7902b501c4a5dd625d4089da/raw/5eeda197ba92f8c8139e846a1225d5640077e06f/emoji_pretty.json" "tabs" "storage"]; platforms = platforms.all; }; }) [...] #+end_src * Define shell utility as package #+begin_src nix configuration.nix home.packages = with pkgs; [ # or for NixOS environment.systemPackages = with pkgs; [ [...] (pkgs.writeShellApplication { name = "pass-fuzzel"; runtimeInputs = [ pkgs.pass pkgs.fuzzel ]; text = '' shopt -s nullglob globstar typeit=0 if [[ $# -ge 1 && $1 == "--type" ]]; then typeit=1 shift fi export PASSWORD_STORE_DIR=~/.local/share/password-store prefix=''${PASSWORD_STORE_DIR-~/.local/share/password-store} password_files=( "$prefix"/**/*.gpg ) password_files=( "''${password_files[@]#"$prefix"/}" ) password_files=( "''${password_files[@]%.gpg}" ) password=$(printf '%s\n' "''${password_files[@]}" | fuzzel --dmenu "$@") [[ -n $password ]] || exit if [[ $typeit -eq 0 ]]; then pass show -c "$password" &>/tmp/pass-fuzzel else pass show "$password" | { IFS= read -r pass; printf %s "$pass"; } | wtype - fi notify-send -u critical -a pass -t 1000 "Copied/Typed Password" ''; }) [...] #+end_src * Add program with prebuild binaries to nix store #+begin_src nix configuration.nix home.packages = with pkgs; [ # or for NixOS environment.systemPackages = with pkgs; [ [...] (stdenv.mkDerivation { name = "oama"; src = pkgs.fetchurl { name = "oama"; url = "https://github.com/pdobsan/oama/releases/download/0.13.1/oama-0.13.1-Linux-x86_64-static.tgz"; sha256 = "sha256-OTdCObVfnMPhgZxVtZqehgUXtKT1iyqozdkPIV+i3Gc="; }; phases = [ "unpackPhase" ]; unpackPhase = '' mkdir -p $out/bin tar xvf $src -C $out/ mv $out/oama-0.13.1-Linux-x86_64-static/oama $out/bin/ ''; }) [...] #+end_src * Patch a utilty for nix paths: See https://drakerossman.com/blog/how-to-patch-a-package-source-on-nixos