about summary refs log tree commit diff stats
path: root/sys/nixpkgs/pkgs
diff options
context:
space:
mode:
Diffstat (limited to 'sys/nixpkgs/pkgs')
-rw-r--r--sys/nixpkgs/pkgs/default.nix18
-rw-r--r--sys/nixpkgs/pkgs/scripts/default.nix350
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/apps/aumo.sh25
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/apps/con2pdf.sh234
-rw-r--r--sys/nixpkgs/pkgs/scripts/source/apps/fupdate.1.md70
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/apps/fupdate.sh167
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/apps/git-edit-index.sh95
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/small_functions/nato.py106
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/small_functions/screenshot_persistent.sh22
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/small_functions/screenshot_temporary.sh8
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/small_functions/update-sys.sh77
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/neorg_id_function.sh12
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/add.nu3
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/dmenu.nu5
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstart.nu5
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstop.nu2
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/list.nu2
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/neorg.nu74
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/project.nu5
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/task.nu7
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/workspace.nu25
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/add.sh23
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/context.sh43
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/dmenu.sh12
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_start.sh7
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_stop.sh7
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/list.sh8
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/project.sh41
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/utils.sh40
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/workspace.sh9
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/main.sh155
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/specific/ytcc/description.sh8
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/battery.sh11
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/hibernate.sh15
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/ll.sh14
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/lock.sh18
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/lyrics.sh11
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/mpc-fav.sh14
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/mpc-rm.sh10
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/mpc.sh20
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/show.sh9
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/sort_song.sh34
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/spodi.sh55
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/virsh-del.sh10
-rwxr-xr-xsys/nixpkgs/pkgs/scripts/source/wrappers/yti.sh33
45 files changed, 1913 insertions, 6 deletions
diff --git a/sys/nixpkgs/pkgs/default.nix b/sys/nixpkgs/pkgs/default.nix
index 25bb746a..c5959bb4 100644
--- a/sys/nixpkgs/pkgs/default.nix
+++ b/sys/nixpkgs/pkgs/default.nix
@@ -1,16 +1,22 @@
-{sysLib}: let
-  snap-sync-forked = (import ./snap-sync-forked) {inherit sysLib;};
+{
+  config,
+  sysLib,
+}: let
+  comments = import ./comments;
   nvim_plugs = import ./plgs-pkgs;
+  scripts = import ./scripts {inherit sysLib config;};
+  snap-sync-forked = (import ./snap-sync-forked) {inherit sysLib;};
   update_vim_plugins = import ./update_vim_plugins;
   yt = import ./yt;
-  comments = import ./comments;
   yts-grammar = import ./tree-sitter-yts;
+
   overlays =
-    snap-sync-forked
+    comments
     ++ nvim_plugs
+    ++ scripts
+    ++ snap-sync-forked
     ++ update_vim_plugins
     ++ yt
-    ++ yts-grammar
-    ++ comments;
+    ++ yts-grammar;
 in
   overlays
diff --git a/sys/nixpkgs/pkgs/scripts/default.nix b/sys/nixpkgs/pkgs/scripts/default.nix
new file mode 100644
index 00000000..faa546c7
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/default.nix
@@ -0,0 +1,350 @@
+{
+  sysLib,
+  config,
+}: [
+  (
+    final: prev: let
+      inherit (prev) lib;
+
+      write_shell = {
+        name,
+        path,
+        dependencies ? [],
+        keepPath ? false,
+        completions ? false,
+      }:
+        sysLib.writeShellScript {
+          inherit name keepPath;
+          src = ./source/${path}/${name}.sh;
+          dependencies = dependencies ++ [prev.dash];
+          generateCompletions = completions;
+        };
+      write_python = {
+        name,
+        path,
+        dependencies_system ? [],
+        dependencies_python ? _: [],
+        keepPath ? false,
+      }: let
+        src = ./source/${path}/${name}.py;
+        dependencies =
+          [(prev.python3.withPackages dependencies_python)]
+          ++ dependencies_system;
+        path_setting =
+          if keepPath
+          then "--prefix PATH :"
+          else "--set PATH";
+      in
+        prev.runCommandLocal name {
+          nativeBuildInputs = [prev.makeWrapper] ++ dependencies;
+        }
+        ''
+          install -m755 ${src} -D "$out/bin/${name}"
+          patchShebangs "$out/bin/${name}"
+          wrapProgram "$out/bin/${name}" ${path_setting} ${prev.lib.makeBinPath dependencies};
+        '';
+
+      ## Begin of shell scripts
+
+      aumo-scr = write_shell {
+        name = "aumo";
+        path = "apps";
+        dependencies = builtins.attrValues {inherit (prev) udisks gawk gnused gnugrep sudo;};
+      };
+
+      battery-scr = write_shell {
+        name = "battery";
+        path = "wrappers";
+        dependencies = [];
+      };
+
+      con2pdf-scr = sysLib.writeShellScript {
+        name = "con2pdf";
+        src = ./source/apps/con2pdf.sh;
+        dependencies = builtins.attrValues {inherit (prev) sane-backends imagemagick coreutils fd;};
+        generateCompletions = true;
+        replacementStrings = {
+          DEVICE_FUNCTION =
+            # This is here, because escaping the whole function, to use it in the shell script
+            # directly just isn't possible
+            prev.writeText "DEVICE_FUNCTION"
+            /*
+            bash
+            */
+            ''
+              scanimage -L | awk 'BEGIN { FS = "`" } { gsub(/'.*/, "", $2); print $2 }'
+            '';
+        };
+      };
+
+      description-scr = write_shell {
+        name = "description";
+        path = "specific/ytcc";
+        dependencies = builtins.attrValues {
+          inherit (prev) jq fmt less locale;
+        };
+      };
+
+      fupdate-scr = write_shell {
+        name = "fupdate";
+        path = "apps";
+        keepPath = true;
+        dependencies = builtins.attrValues {
+          inherit
+            (prev)
+            dash
+            nix
+            gnugrep
+            fd
+            coreutils
+            bat # used by batgrep
+            gnused # required by batgrep
+            git # needed to fetch through git
+            git-crypt # needed to unlock git-crypted repos
+            ;
+          inherit (prev.bat-extras) batgrep;
+        };
+      };
+
+      git-edit-index-scr = write_shell {
+        name = "git-edit-index";
+        path = "apps";
+        completions = true;
+        # This starts neovim, wich might want to shell out
+        keepPath = true;
+        dependencies = builtins.attrValues {
+          inherit
+            (prev)
+            git
+            gnused
+            # $EDITOR
+            
+            ;
+        };
+      };
+
+      hibernate-scr = write_shell {
+        name = "hibernate";
+        path = "wrappers";
+        dependencies = builtins.attrValues {
+          inherit
+            (prev)
+            systemd
+            taskwarrior
+            ;
+        };
+      };
+
+      ll-scr = sysLib.writeShellScript {
+        name = "ll";
+        src = ./source/wrappers/ll.sh;
+        wrap = false;
+      };
+
+      # TODO: this need to be replaced with a wayland alternative
+      #  llp-scr = write_shell {
+      #     name = "llp";
+      #     path = "wrappers";
+      #     dependencies = builtins.attrValues {inherit (prev) lf ueberzug;};
+      #   };
+
+      lock-scr = write_shell {
+        name = "lock";
+        path = "wrappers";
+        dependencies = builtins.attrValues {
+          inherit
+            (prev)
+            taskwarrior
+            swaylock
+            ;
+        };
+      };
+
+      lyrics-scr = write_shell {
+        name = "lyrics";
+        path = "wrappers";
+        dependencies = builtins.attrValues {
+          inherit
+            (prev)
+            exiftool
+            mpc-cli
+            jq
+            less
+            locale # dependency of less
+            ;
+        };
+      };
+
+      mpc-fav-scr = write_shell {
+        name = "mpc-fav";
+        path = "wrappers";
+        dependencies = builtins.attrValues {
+          inherit
+            (prev)
+            mpc-cli
+            ;
+        };
+      };
+
+      mpc-rm-scr = write_shell {
+        name = "mpc-rm";
+        path = "wrappers";
+        dependencies = builtins.attrValues {
+          inherit
+            (prev)
+            mpc-cli
+            trash-cli
+            ;
+        };
+      };
+
+      mpc-scr = write_shell {
+        name = "mpc";
+        path = "wrappers";
+        dependencies = [
+          mpc-fav-scr
+          mpc-rm-scr
+          prev.mpc-cli
+        ];
+      };
+
+      nato-scr = write_python {
+        name = "nato";
+        path = "small_functions";
+        dependencies_python = ps: [];
+      };
+
+      neorg-scr = sysLib.writeShellScriptMultiPart {
+        name = "neorg";
+        keepPath = true;
+        src = ./source/specific/neorg/sh;
+        baseName = "main.sh";
+        cmdPrefix = "functions";
+        cmdNames = [
+          "add.sh"
+          "context.sh"
+          "dmenu.sh"
+          "f_start.sh"
+          "f_stop.sh"
+          "list.sh"
+          "project.sh"
+          "utils.sh"
+          "workspace.sh"
+        ];
+        dependencies = with prev; [
+          cocogitto
+          git-crypt
+          rofi
+          libnotify
+        ];
+        generateCompletions = true;
+        replacementStrings = {
+          DEFAULT_NEORG_PROJECT_DIR =
+            config.programs.nixvim.plugins.neorg.modules."core.dirman".config.workspaces.projects;
+          HOME_TASKRC = "${config.xdg.configHome}/task/home-manager-taskrc";
+          ALL_PROJECTS_NEWLINE = "${config.soispha.taskwarrior.projects.projects_newline}";
+          ALL_PROJECTS_COMMA = "${config.soispha.taskwarrior.projects.projects_comma}";
+          ALL_PROJECTS_PIPE = "${config.soispha.taskwarrior.projects.projects_pipe}";
+          ALL_WORKSPACES = "${lib.strings.concatStringsSep "|" (builtins.attrNames config.programs.nixvim.plugins.neorg.modules."core.dirman".config.workspaces)}";
+          ID_GENERATION_FUNCTION = "${sysLib.writeShellScript {
+            name = "neorg_id_function";
+            src = ./source/specific/neorg/neorg_id_function.sh;
+            dependencies = with prev; [
+              taskwarrior
+              gawk
+              findutils # xargs
+            ];
+          }}/bin/neorg_id_function";
+
+          # TODO: Replace the hard-coded path here with some reference <2023-10-20>
+          TASK_PROJECT_FILE = "/home/soispha/repos/nix/nixos-config/hm/soispha/conf/taskwarrior/projects/default.nix";
+        };
+      };
+
+      screenshot_persistent-scr = write_shell {
+        name = "screenshot_persistent";
+        path = "small_functions";
+        keepPath = true;
+        dependencies = builtins.attrValues {
+          inherit
+            (prev)
+            grim
+            slurp
+            alacritty
+            rofi
+            libnotify
+            lf # TODO: add llp
+            ;
+        };
+      };
+
+      screenshot_temporary-scr = write_shell {
+        name = "screenshot_temporary";
+        path = "small_functions";
+        dependencies = builtins.attrValues {inherit (prev) grim slurp wl-clipboard;};
+      };
+
+      show-scr = write_shell {
+        name = "show";
+        path = "wrappers";
+        keepPath = true; # I might want to use nvim in less (and shell escapes)
+        dependencies = builtins.attrValues {inherit (prev) less locale;};
+      };
+
+      sort_song-scr = write_shell {
+        name = "sort_song";
+        path = "wrappers";
+        dependencies = builtins.attrValues {inherit (prev) mediainfo jq gawk;};
+      };
+
+      spodi-scr = write_shell {
+        name = "spodi";
+        path = "wrappers";
+        dependencies = builtins.attrValues {inherit (prev) gawk expect spotdl fd coreutils;};
+      };
+
+      update-sys-scr = write_shell {
+        name = "update-sys";
+        path = "small_functions";
+        dependencies = builtins.attrValues {inherit (prev) git git-crypt nixos-rebuild sudo openssh coreutils mktemp gnugrep gnused;};
+      };
+
+      virsh-del-scr = write_shell {
+        name = "virsh-del";
+        path = "wrappers";
+        dependencies = builtins.attrValues {inherit (prev) libvirt;};
+      };
+
+      yti-scr = write_shell {
+        name = "yti";
+        path = "wrappers";
+        dependencies = builtins.attrValues {inherit (prev) gawk expect yt-dlp;};
+      };
+    in {
+      # llp = llp-scr; # TODO: see above
+      aumo = aumo-scr;
+      battery = battery-scr;
+      con2pdf = con2pdf-scr;
+      description = description-scr;
+      fupdate = fupdate-scr;
+      git-edit-index = git-edit-index-scr;
+      hibernate = hibernate-scr;
+      ll = ll-scr;
+      lock = lock-scr;
+      lyrics = lyrics-scr;
+      mpc-fav = mpc-fav-scr;
+      mpc-rm = mpc-rm-scr;
+      mpc = mpc-scr;
+      nato = nato-scr;
+      neorg = neorg-scr;
+      screenshot_persistent = screenshot_persistent-scr;
+      screenshot_temporary = screenshot_temporary-scr;
+      show = show-scr;
+      sort_song = sort_song-scr;
+      spodi = spodi-scr;
+      update-sys = update-sys-scr;
+      virsh-del = virsh-del-scr;
+      yti = yti-scr;
+    }
+  )
+]
diff --git a/sys/nixpkgs/pkgs/scripts/source/apps/aumo.sh b/sys/nixpkgs/pkgs/scripts/source/apps/aumo.sh
new file mode 100755
index 00000000..7426115a
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/apps/aumo.sh
@@ -0,0 +1,25 @@
+#! /usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+unmounting() {
+    disk_name="$(find /dev/disk/by-label -type l -printf "%P|" | rofi -sep "|" -dmenu -p "Select disk to mount")"
+
+    udisksctl unmount --block-device "/dev/disk/by-label/$disk_name"
+}
+
+mounting() {
+    disk_name="$(find /dev/disk/by-label -type l -printf "%P|" | rofi -sep "|" -dmenu -p "Select disk to mount")"
+
+    udisksctl mount --block-device "/dev/disk/by-label/$disk_name"
+}
+
+case "$1" in
+"mount")
+    mounting
+    ;;
+"unmount" | "umount")
+    unmounting
+    ;;
+esac
diff --git a/sys/nixpkgs/pkgs/scripts/source/apps/con2pdf.sh b/sys/nixpkgs/pkgs/scripts/source/apps/con2pdf.sh
new file mode 100755
index 00000000..620a299a
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/apps/con2pdf.sh
@@ -0,0 +1,234 @@
+#! /usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+# needed for help() and version
+# shellcheck disable=2034
+AUTHORS="Soispha"
+# shellcheck disable=2034
+YEARS="2023"
+# shellcheck disable=2034
+VERSION="1.0.0"
+
+# NAME is from the wrapper
+# shellcheck disable=SC2269
+NAME="$NAME"
+help() {
+    cat <<EOF
+Scan images and turn them into a pdf.
+
+Usage:
+    $NAME [OPTIONS] --name --device
+
+OPTIONS:
+    --out-dir | -o [FILE]
+                            Path to place the generated pdf files (default: ./pdf).
+
+    --name | -n NAME
+                            Name for the pdf files (e.g. <NAME>_1.pdf).
+
+    --num-pages | -p NUM
+                            Number of pages to merge into one pdf (default: 1).
+
+    --device | -d DEVICE
+                            Device used for scanning.
+
+    --method | -m METHOD
+                            Method to use for scanning (default: ADF).
+
+    --help | -h
+                            Display this help and exit.
+
+    --version | -v
+                            Display version and copyright information and exit.
+ARGUMENTS:
+    FILE := [[fd . --max-depth 3]]
+                            A name of a file to store, default is: ./pdf
+
+    NAME | * := [[fd . --max-depth 3]]
+                            The basename of the generated files
+
+    NUM | *([0-9]) := 0 | 1 | 2 | 3 | 4
+                            Possible numbers of pages, can be more than 4
+
+    DEVICE := [[$(cat %DEVICE_FUNCTION)]]
+                            Possible scanner names
+
+    METHOD := ADF | Flatbed
+                            The scanning method to use, not all scanners support both of
+                            these. The default is ADF
+EOF
+}
+
+scan_adf() {
+    device="$1"
+    sides_per_page="$2"
+    method="ADF"
+    for i in $(seq "$sides_per_page"); do
+        do_until_success \
+            "scanimage --format=tiff --progress --source='$method' --device='$device' --batch=%d.tif --batch-increment='$sides_per_page' --batch-start='$i'" \
+            "warn 'Retrying scan, as we assume a network error!'"
+
+        if [ "$sides_per_page" -ne 1 ]; then
+            msg "Finished turn, please change side!"
+            readp "Press enter to continue" noop
+        fi
+    done
+}
+process_images_adf() {
+    tiff_temp_path="$1"
+    output_directory="$2"
+    name="$3"
+
+    counter=0
+    pdf_counter=0
+    image_cache="$(mktmp)"
+    while read -r scanned_image; do
+        dbg "$scanned_image (scanned_image) at $counter (counter)"
+        echo "$scanned_image" >>"$image_cache"
+        : $((counter += 1))
+        if [ "$counter" = "$number_of_pages" ]; then
+            dbg "$counter == $number_of_pages"
+            counter=0
+            convert_images "$image_cache" "${name}_$pdf_counter" "$output_directory"
+            : $((pdf_counter += 1))
+            printf "" >"$image_cache"
+        fi
+    done <"$(tmp_pipe fd . "$tiff_temp_path" "|" sort -V)"
+}
+
+scan_flatbed() {
+    device="$1"
+    number_of_pages"$2"
+    method="Flatbed"
+    for i in $(seq "$number_of_pages"); do
+        do_until_success \
+            "scanimage --format=tiff --progress --source='$method' --device='$device' --output-file=$i.tiff" \
+            "warn 'Retrying scan, as we assume a network error!'"
+        if [ "$number_of_pages" -ne 1 ]; then
+            msg "Finished turn, please change side!"
+            readp "Press enter to continue" noop
+        fi
+    done
+}
+process_images_flatbed() {
+    tiff_temp_path="$1"
+    output_directory="$2"
+    name="$3"
+
+    counter=0
+    image_cache="$(mktmp)"
+    while read -r scanned_image; do
+        echo "$scanned_image" >>"$image_cache"
+        : $((counter += 1))
+        if [ "$counter" = "$number_of_pages" ]; then
+            counter=0
+            convert_images "$image_cache" "$name" "$output_directory"
+            printf "" >"$image_cache"
+        fi
+    done <"$(tmp_pipe fd . "$tiff_temp_path" "|" sort -V)"
+}
+convert_images() {
+    image_cache="$1"
+    pdf_name="$2"
+    output_dir="$3"
+
+    set --
+    while read -r image; do
+        dbg "setting image: $image"
+        set -- "$@" "$image"
+    done <"$image_cache"
+
+    while [ -e "$output_dir/${pdf_name}.pdf" ]; do
+        pdf_name="${pdf_name}_$(tr -dc 'A-Za-z0-9' </dev/urandom | head -c 25)"
+    done
+    dbg "using pdf_name: $pdf_name"
+    convert "$@" -compress jpeg -quality 100 "$output_dir/${pdf_name}.pdf"
+}
+
+scan() {
+    number_of_pages="$1"
+    device="$2"
+    output_directory="$(readlink -f "$3")"
+    name="$4"
+    method="$5"
+
+    [ -z "$number_of_pages" ] && die "Parameter 'number_of_pages' is not set!"
+    [ -z "$device" ] && die "Parameter 'device' is not set!"
+    [ -z "$output_directory" ] && die "Parameter 'output_directory' is not set!"
+    [ -z "$name" ] && die "Parameter 'name' is not set!"
+    [ -z "$method" ] && die "Parameter 'method' is not set!"
+
+    tiff_temp_path="$(mktmp -d)"
+    cd "$tiff_temp_path" || die "Bug"
+
+    msg "Started scanning..."
+    if [ "$method" = "Flatbed" ]; then
+        scan_flatbed "$device" "$number_of_pages"
+    else
+        scan_adf "$device" "$number_of_pages"
+    fi
+
+    msg "Creating output directory..."
+    mkdir "$output_directory"
+    cd "$output_directory" || die "Bug"
+
+    msg "Converting images to pdfs..."
+    if [ "$method" = "Flatbed" ]; then
+        process_images_flatbed "$tiff_temp_path" "$output_directory" "$name"
+    else
+        process_images_adf "$tiff_temp_path" "$output_directory" "$name"
+    fi
+}
+
+for input in "$@"; do
+    case "$input" in
+    "--help" | "-h")
+        help
+        exit 0
+        ;;
+    "--version" | "-v")
+        version
+        exit 0
+        ;;
+    esac
+done
+
+number_of_pages="1"
+unset device
+output_directory="$(pwd)/pdf"
+unset name
+method="ADF"
+
+while [ "$#" -ne 0 ]; do
+    case "$1" in
+    "--help" | "-h") ;;
+    "--version" | "-v") ;;
+    "--out-dir" | "-o")
+        shift 1
+        output_directory="$1"
+        ;;
+    "--name" | "-n")
+        shift 1
+        name="$1"
+        ;;
+    "--num-pages" | "-p")
+        shift 1
+        number_of_pages="$1"
+        ;;
+    "--device" | "-d")
+        shift 1
+        device="$1"
+        ;;
+    "--method" | "-m")
+        shift 1
+        method="$1"
+        ;;
+    *)
+        die "Command line arg $1 does not exist. See --help for a list."
+        ;;
+    esac
+    shift 1
+done
+scan "$number_of_pages" "$device" "$output_directory" "$name" "$method"
diff --git a/sys/nixpkgs/pkgs/scripts/source/apps/fupdate.1.md b/sys/nixpkgs/pkgs/scripts/source/apps/fupdate.1.md
new file mode 100644
index 00000000..710e8fb7
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/apps/fupdate.1.md
@@ -0,0 +1,70 @@
+% FUPDATE(1) fupdate 1.0.0
+% Soispha
+% May 2023
+
+# NAME
+
+fupdate - updates your flake, while checking for common mistakes
+
+# SYNOPSIS
+
+**fupdate** list of \[*flake*|*\<some word>*|*--help*|*-h*\]
+
+# DESCRIPTION
+
+Argument can be stacked, this makes it possible to specify multiple targets to be updated in succession. See the Examples section for further details.
+
+No argument or *flake*
+: **fupdate**, when executed without arguments or with *flake*, will update your *flake.lock*, check for duplicate flake inputs, i.e., an input has an input declared, which you have also declared as input, and will run a script called *update.sh*, if you allow it.
+The allowance for the script is asked, when you run **fupdate** and the found script is not yet allowed. Furthermore, the allowance is based on the concrete sha256 hash of the script, so any changes will require another allowance.
+
+**\<some word>** as argument
+: If the executable **update-\<some word>** is reachable thought the PATH variable, than this is run. Otherwise, the program will exit.
+
+# OPTIONS
+
+**--help**, **-h**
+: Displays a help message and exit.
+
+**--version**, **-v**
+: Displays the software version and exit.
+
+# EXAMPLES
+
+**fupdate** or **fupdate flake**
+: Updates your *flake.lock*. See the Description section for further details.
+
+**fupdate sys**
+: Run the executable **update-sys**, if it exists. See the Description section for further details.
+
+**fupdate flake sys docs**
+: First updates your flake, then, if the command succeeded, runs **update-sys**, afterweich **update-docs** is run.
+
+# FILES
+
+*update.sh*
+: This is supposed to be a shell script located in your flake base directory, i.e., the directory which contains both a *flake.nix* and a *flake.lock* file.
+
+*~/.local/share/flake-update/*
+: **fupdate** will store the hashes to the allowed *update.sh* files here.
+
+# BUGS
+
+Report bugs to <https://codeberg.org/soispha/flake_update/issues>.
+
+# COPYRIGHT
+
+Copyright (C) 2023  Soispha
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <https://www.gnu.org/licenses/>.
diff --git a/sys/nixpkgs/pkgs/scripts/source/apps/fupdate.sh b/sys/nixpkgs/pkgs/scripts/source/apps/fupdate.sh
new file mode 100755
index 00000000..0032be4b
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/apps/fupdate.sh
@@ -0,0 +1,167 @@
+#! /usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+UPDATE_SCRIPT_NAME="update.sh"
+CONFIG_DIRECTORY_PATH="$HOME/.local/share/flake-update"
+
+# Both are used in version()
+# shellcheck disable=SC2034
+AUTHORS="Soispha"
+# shellcheck disable=SC2034
+YEARS="2023"
+
+# Searches upward for a `UPDATE_SCRIPT_NAME` script
+# Returns a path to the script if it exists, otherwise nothing is returned
+check_for_update_script() {
+    dirname="$(search_upward_files "$UPDATE_SCRIPT_NAME")"
+    if [ "$dirname" ]; then
+        printf "%s/%s" "$dirname" "$UPDATE_SCRIPT_NAME"
+    fi
+}
+
+# Checks if a given path to the update script is allowed.
+# Takes the path as input
+# Return 0, if allowed, 1 if not.
+check_for_allowed_update_script() {
+    update_script="$1"
+    config_path="${CONFIG_DIRECTORY_PATH}${update_script}"
+    update_script_hash="$(sha256sum "$update_script")"
+    if [ -f "$config_path" ]; then
+        if [ "$(cat "$config_path")" = "$update_script_hash" ]; then
+            dbg "Recorded hash matches"
+            return 0
+        else
+            dbg "Recorded hash \'$(cat "$config_path")\' does not match real hash \'$update_script_hash\', assuming not allowed"
+            return 1
+        fi
+    else
+        dbg "Path \'$config_path\' does not exist, assuming not allowed"
+        return 1
+    fi
+}
+
+# Asks the user if they want to allow a given script.
+# Takes the path as input
+ask_to_allow_update_script() {
+    update_script="$1"
+    config_path="${CONFIG_DIRECTORY_PATH}${update_script}"
+    update_script_hash="$(sha256sum "$update_script")"
+    println "\033[2J" # clear the screen
+    cat "$update_script"
+    readp "Do you want to allow this script?[N/y]: " allow
+    # shellcheck disable=SC2154
+    dbg "allow is: $allow"
+    case "$allow" in
+    [yY])
+        dbg "allowed script"
+        dbg "storing contents in: $config_path"
+        mkdir --parents "$(dirname "$config_path")"
+        print "$update_script_hash" >"$config_path"
+        ;;
+    *)
+        UPDATE_SCRIPT_NOT_ALLOWED=true
+        ;;
+    esac
+}
+
+# Runs the provided script and continues to update the nix flake
+# Takes the path to the script and the directory to the flake as arguments
+# If the path to the update script is empty, it will be ignored
+update() {
+    update_script="$1"
+    flake_base_dir="$2"
+    shift 2;
+
+    dbg "Provided following args to update script: '$*'"
+    dbg "changed directory to: $flake_base_dir"
+    cd "$flake_base_dir" || die "Provided dir \'$flake_base_dir\' can not be accessed"
+
+    nix flake update
+
+    [ "$update_script" = "" ] || "$update_script" "$@"
+
+    if grep '[^0-9]_[0-9]' flake.lock >/dev/null; then
+        batgrep '[^0-9]_[0-9]' flake.lock
+        die "Your flake.nix contains duplicate inputs!"
+    fi
+}
+
+help() {
+    cat <<EOF
+This is a Nix flake update manager.
+
+Usage:
+    $NAME [--help]
+
+Options:
+    --help   | -h
+                            Display this help and exit.
+    --version   | -v
+                            Display version and copyright information and exit.
+
+Commands:
+    flake
+                            update the flake project
+    <some other command>
+                            runs a executable called "update-<some other command>", if it exists
+EOF
+}
+
+main() {
+    if ! [ "$UPDATE_SCRIPT_NOT_ALLOWED" = true ]; then
+        update_script="$(check_for_update_script)"
+        flake_base_dir="$(search_flake_base_dir)" # Assume, that the update script is in the base dir
+        dbg "update_script is: $update_script"
+        dbg "flake_base_dir is: $flake_base_dir"
+
+        if [ "$update_script" = "" ]; then
+            update "" "$flake_base_dir" "$@"
+        elif check_for_allowed_update_script "$update_script" && ! [ "$update_script" = "" ]; then
+            update "$update_script" "$flake_base_dir" "$@"
+        else
+            ask_to_allow_update_script "$update_script"
+            main "$@"
+        fi
+    fi
+}
+
+if [ "$#" -eq 0 ]; then
+    main
+fi
+
+for input in "$@"; do
+    case "$input" in
+    "--help" | "-h")
+        help
+        exit 0
+        ;;
+    "--version" | "-v")
+        version
+        exit 0
+        ;;
+    "--")
+        end_of_cli_options=true
+        ;;
+    esac
+    [ "$end_of_cli_options" = "true" ] && break
+done
+
+case "$1" in
+"flake")
+    shift 1
+    [ "$1" = "--" ] && shift 1;
+    main "$@"
+    ;;
+*)
+    command="$1"
+    shift 1
+    [ "$1" = "--" ] && shift 1;
+    if which update-"$command" >/dev/null 2>&1; then
+            update-"$command" "$@"
+    else
+        die "command \"update-$command\" is not executable, or does not exist"
+    fi
+    ;;
+esac
diff --git a/sys/nixpkgs/pkgs/scripts/source/apps/git-edit-index.sh b/sys/nixpkgs/pkgs/scripts/source/apps/git-edit-index.sh
new file mode 100755
index 00000000..0010718b
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/apps/git-edit-index.sh
@@ -0,0 +1,95 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+# needed for help() and version
+# shellcheck disable=2034
+AUTHORS="Soispha"
+# shellcheck disable=2034
+YEARS="2024"
+# shellcheck disable=2034
+VERSION="1.0.0"
+
+# NAME is from the wrapper
+# shellcheck disable=SC2269
+NAME="$NAME"
+
+help() {
+    cat <<EOF
+Edit a file from the index. This script does not touch the unstaged variant of the file.
+
+Usage:
+    $NAME [OPTIONS] [--] FILES
+
+OPTIONS:
+    --help | -h
+                            Display this help and exit.
+
+    --version | -v
+                            Display version and copyright information and exit.
+ARGUMENTS:
+    FILES := [[ git diff --name-only --cached --diff-filter=AM ]]
+                            The files to edit.
+
+EOF
+}
+
+GIT_DIR="$(git rev-parse --show-toplevel)"
+materialize_file() {
+    git diff --cached "$1" >"$GIT_DIR/.git/EDIT_INDEX_PATCH"
+
+    git add "$1"
+    git restore --staged "$1"
+    cat "$1" >"$GIT_DIR/.git/EDIT_INDEX_FILE"
+    git restore "$1"
+
+    git apply "$GIT_DIR/.git/EDIT_INDEX_PATCH"
+    "$EDITOR" "$1"
+
+    git add "$1"
+    mv "$GIT_DIR/.git/EDIT_INDEX_FILE" "$1"
+}
+
+edit() {
+    files_to_add="$(mktmp)"
+    realpath --relative-to=. "$@" >"$files_to_add"
+
+    index_files="$(mktmp)"
+    git diff --name-only --cached --diff-filter=AM >"$index_files"
+
+    while read -r file; do
+        if grep -q "$file" "$files_to_add"; then
+            sed -i "s|$file||" "$files_to_add"
+            materialize_file "$file"
+        fi
+    done <"$index_files"
+
+    files_to_check="$(mktmp)"
+    clean "$files_to_add" >"$files_to_check"
+    if [ "$(wc -l <"$files_to_check")" -gt 0 ]; then
+        warn "Could not edit every file:"
+        cat "$files_to_add"
+    fi
+}
+
+for arg in "$@"; do
+    case "$arg" in
+    "--help" | "-h")
+        help
+        exit 0
+        ;;
+    "--version" | "-v")
+        version
+        exit 0
+        ;;
+    "--")
+        end_of_cli_options=true
+        ;;
+    esac
+    [ "$end_of_cli_options" = "true" ] && break
+done
+
+edit "$@"
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/small_functions/nato.py b/sys/nixpkgs/pkgs/scripts/source/small_functions/nato.py
new file mode 100755
index 00000000..e9d15f56
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/small_functions/nato.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python3
+# originally from here: https://cgit.pacien.net/desktop-utilities/
+
+import sys
+
+alphabet = {
+    "nato": {
+        "A": "Alfa",  # No idea why this is not just 'Alpha' ..
+        "B": "Bravo",
+        "C": "Charlie",
+        "D": "Delta",
+        "E": "Echo",
+        "F": "Foxtrot",
+        "G": "Golf",
+        "H": "Hotel",
+        "I": "India",
+        "J": "Juliett",
+        "K": "Kilo",
+        "L": "Lima",
+        "M": "Mike",
+        "N": "November",
+        "O": "Oscar",
+        "P": "Papa",
+        "Q": "Quebec",
+        "R": "Romeo",
+        "S": "Sierra",
+        "T": "Tango",
+        "U": "Uniform",
+        "V": "Victor",
+        "W": "Whiskey",
+        "X": "X-ray",
+        "Y": "Yankee",
+        "Z": "Zulu",
+        "0": "Nadazero",
+        "1": "Unaone",
+        "2": "Bissotwo",
+        "3": "Terrathree",
+        "4": "Kartefour",
+        "5": "Pantafive",
+        "6": "Soxisix",
+        "7": "Setteseven",
+        "8": "Oktoeight",
+        "9": "Novenine",
+        ",": "Comma",
+        "/": "Forward slash",
+        ".": "Stop/Decimal",
+    },
+    "german": {
+        "A": "Aachen",
+        "Ä": "Umlaut Aachen",
+        "B": "Berlin",
+        "C": "Chemnitz",
+        "D": "Düsseldorf",
+        "E": "Essen",
+        "F": "Frankfurt",
+        "G": "Goslar",
+        "H": "Hamburg",
+        "I": "Ingelheim",
+        "J": "Jena",
+        "K": "Köln",
+        "L": "Leipzig",
+        "M": "München",
+        "N": "Nürnberg",
+        "O": "Offenbach",
+        "Ö": "Umlaut Offenbach",
+        "P": "Potsdam",
+        "Q": "Quickborn",
+        "R": "Rostock",
+        "S": "Salzwedel",
+        "ẞ": "Eszett",
+        "T": "Tübingen",
+        "U": "Unna",
+        "Ü": "Umlaut Unna",
+        "V": "Völklingen",
+        "W": "Wuppertal",
+        "X": "Xanten",
+        "Y": "Ypsilon",
+        "Z": "Zwickau",
+    },
+}
+
+
+def str_to_telephony(phrase, language):
+    language_alphabet = alphabet[language]
+
+    return [
+        language_alphabet[c] if c in language_alphabet else c for c in phrase.upper()
+    ]
+
+
+language = sys.argv[1]
+if language not in ["nato", "german"]:
+    print(
+        f"Langugae '{language}' is not a valid language, only 'nato' and 'german' are!",
+        file=sys.stderr,
+    )
+    exit(1)
+
+print(
+    "\n".join(
+        str_to_telephony(
+            " ".join(sys.argv[2:]),
+            language,
+        )
+    )
+)
diff --git a/sys/nixpkgs/pkgs/scripts/source/small_functions/screenshot_persistent.sh b/sys/nixpkgs/pkgs/scripts/source/small_functions/screenshot_persistent.sh
new file mode 100755
index 00000000..5992e02f
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/small_functions/screenshot_persistent.sh
@@ -0,0 +1,22 @@
+#! /usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+# only generate a path (this could lead to a time-of-check/time-of-use bug)
+tmp="$(mktmp --dry-run)"
+
+if grim -g "$(slurp)" "$tmp"; then
+    name="$(rofi -dmenu -p "Name of screenshot: " -l 0)"
+    screen_shot_path="$HOME/media/pictures/screenshots/$name.png"
+    while [ -f "$screen_shot_path" ]; do
+        notify-send "Warning" 'Screenshot name already in use!'
+        name="$(rofi -dmenu -p "New name of screenshot: " -l 0)"
+        screen_shot_path="$HOME/media/pictures/screenshots/$name.png"
+    done
+
+    mv "$tmp" "$screen_shot_path"
+    alacritty -e lf -command ":{{ set sortby atime; set reverse!; }}"
+fi
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/small_functions/screenshot_temporary.sh b/sys/nixpkgs/pkgs/scripts/source/small_functions/screenshot_temporary.sh
new file mode 100755
index 00000000..e411340d
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/small_functions/screenshot_temporary.sh
@@ -0,0 +1,8 @@
+#! /usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+grim -g "$(slurp)" | wl-copy
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/small_functions/update-sys.sh b/sys/nixpkgs/pkgs/scripts/source/small_functions/update-sys.sh
new file mode 100755
index 00000000..68fb342d
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/small_functions/update-sys.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+help() {
+    cat <<EOF
+This is a NixOS System flake update manager.
+
+Usage:
+    $NAME [--branch <branchname>] [--help]
+
+Options:
+    --branch | -b  BRANCHNAME
+                                select a branch to update from.
+    --mode | -m  MODE
+                                select a mode to update with
+    --help   | -h
+                                output this help.
+EOF
+    exit "$1"
+}
+default_branch=$(mktmp)
+BRANCH=""
+
+while [ "$#" -gt 0 ]; do
+    case "$1" in
+    "--help" | "-h")
+        help 0
+        ;;
+    "--branch" | "-b")
+        if [ -n "$2" ]; then
+            BRANCH="$2"
+        else
+            error "$1 requires an argument"
+            help 1
+        fi
+        shift 2
+        ;;
+    "--mode" | "-m")
+        if [ -n "$2" ]; then
+            MODE="$2"
+        else
+            error "$1 requires an argument"
+            help 1
+        fi
+        shift 2
+        ;;
+    *)
+        error "the option $1 does not exist!"
+        help 1
+        ;;
+    esac
+done
+
+cd /etc/nixos || die "No /etc/nixos"
+msg "Starting system update..."
+git remote update origin --prune >/dev/null 2>&1
+if ! [ "$BRANCH" = "" ]; then
+    git switch "$BRANCH" >/dev/null 2>&1 && msg2 "Switched to branch '$BRANCH'"
+fi
+msg2 "Updating git repository..."
+git pull --rebase
+
+git remote show origin | grep 'HEAD' | cut -d':' -f2 | sed -e 's/^ *//g' -e 's/ *$//g' >"$default_branch" &
+
+msg2 "Updating system..."
+if [ -n "$MODE" ]; then
+    nixos-rebuild "$MODE"
+else
+    nixos-rebuild switch
+fi
+
+git switch "$(cat "$default_branch")" >/dev/null 2>&1 && msg2 "Switched to branch '$(cat "$default_branch")'"
+msg "Finished Update!"
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/neorg_id_function.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/neorg_id_function.sh
new file mode 100755
index 00000000..7c3fb2a3
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/neorg_id_function.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+context="$(task _get rc.context)"
+if [ "$context" ]; then
+    filter="project:$context"
+else
+    filter="0-10000"
+fi
+tasks="$(task "$filter" _ids)"
+
+if [ "$tasks" ]; then
+    echo "$tasks" | xargs task _zshids | awk -F: -v q="'" '{gsub(/'\''/, q "\\" q q ); print $1 ":" q $2 q}'
+fi
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/add.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/add.nu
new file mode 100755
index 00000000..8cf9666c
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/add.nu
@@ -0,0 +1,3 @@
+export def "main" [] {
+    "hi!"
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/dmenu.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/dmenu.nu
new file mode 100755
index 00000000..177e7483
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/dmenu.nu
@@ -0,0 +1,5 @@
+# Select a project in dmenu mode
+#
+# This will give you all projects
+# and exectute the selected one as in 'neorg projects <selected>'
+def "main" [] {}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstart.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstart.nu
new file mode 100755
index 00000000..f77cd3f6
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstart.nu
@@ -0,0 +1,5 @@
+# Starts the task
+#
+# This only happens after it stooped
+# the previous active task, if it existed.
+def "main" [id: int] {}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstop.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstop.nu
new file mode 100755
index 00000000..bcaac944
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/fstop.nu
@@ -0,0 +1,2 @@
+# Stops the current active task
+def "main" [] {}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/list.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/list.nu
new file mode 100755
index 00000000..68a130f9
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/list.nu
@@ -0,0 +1,2 @@
+# Lists all available contexts
+def "main" [] {}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/neorg.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/neorg.nu
new file mode 100755
index 00000000..92af49cc
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/neorg.nu
@@ -0,0 +1,74 @@
+#!/usr/bin/env nu
+
+use add.nu main
+use dmenu.nu
+use fstart.nu
+use fstop.nu
+use list.nu
+use project.nu
+use task.nu
+use workspace.nu [main workspaces]
+
+# The core of the system-integrated task handling and management
+def main [] {
+    add
+}
+
+# Allows you to quickly add projects
+def "main add" [] {
+    add
+}
+
+# Select a project in dmenu mode
+#
+# This will give you all projects
+# and exectute the selected one as in 'neorg projects <selected>'
+def "main dmenu" [] {
+    dmenu
+}
+
+# Starts the task
+#
+# This only happens after it stooped
+# the previous active task, if it existed.
+def "main fstart" [id: int] {
+    fstart
+}
+
+# Stops the current active task
+def "main fstop" [] {
+    fstop
+}
+
+# Lists all available contexts
+def "main list" [] {
+    list
+}
+
+# Opens the project in the webbrowser
+#
+# Opens the webbrowser with either the context (P) or
+# the current active context as argument if no context is supplied
+def "main project" [project?: string] {
+    project
+}
+
+# Open the context of a task
+#
+# Open the neorg context associated with the current context and
+# the uuid of the task with id ID. Without ID, it'll open the
+# current context's norg file.
+# If no context is set, drops you to the selection prompt
+def "main task" [id?: int] {
+    task
+}
+
+# Open a neorg workspace
+#
+# The neorg workspace to open at startup, an empty value drops
+# you at a prompt to enter the workspace yourself.
+def "main workspace" [
+    workspace?: string@workspaces # The workspace to open
+] {
+    workspace $workspace
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/project.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/project.nu
new file mode 100755
index 00000000..530eab9b
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/project.nu
@@ -0,0 +1,5 @@
+# Opens the project in the webbrowser
+#
+# Opens the webbrowser with either the context (P) or
+# the current active context as argument if no context is supplied
+def "main" [project?: string] {}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/task.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/task.nu
new file mode 100755
index 00000000..41d1d6e5
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/task.nu
@@ -0,0 +1,7 @@
+# Open the context of a task
+#
+# Open the neorg context associated with the current context and
+# the uuid of the task with id ID. Without ID, it'll open the
+# current context's norg file.
+# If no context is set, drops you to the selection prompt
+def "main" [id?: int] {}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/workspace.nu b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/workspace.nu
new file mode 100755
index 00000000..dfa79f29
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/nu/workspace.nu
@@ -0,0 +1,25 @@
+export def workspaces [] {
+    # echo "%ALL_WORKSPACES" | split row '|'
+    ["a", "b"]
+}
+
+
+export def "main" [ workspace?: string ] {
+    if $workspace != null {
+        let pred = workspaces | where $it == $workspace | is-empty
+        if $pred == false  {
+            true
+        } else {
+           error make {
+                msg: $"Your Workspace \(($workspace)) is not one of the defined ones: (workspaces)",
+            }
+        }
+   } else {
+        let tmp = mktemp
+        printf ":Neorg workspace " | save --append $tmp
+
+        nvim -c "NeorgStart" -s $tmp
+
+        rm $tmp
+   }
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/add.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/add.sh
new file mode 100755
index 00000000..5a830a10
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/add.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env dash
+
+add0open_taskwarrior_project_file() {
+    task_project_file="%TASK_PROJECT_FILE"
+
+    cd "$(dirname $task_project_file)" || die "BUG: task_project_file ('$task_project_file') can't be accessed"
+
+    git_dir="$(search_flake_base_dir)"
+    [ "$git_dir" ] || die "(BUG): No git directory?"
+    cd "$git_dir" || die "Unreachable, this MUST exists"
+
+    nvim "$task_project_file"
+    git add "$task_project_file"
+
+    base_task_project_file_path="$(awk "{ gsub(\"$git_dir/\", \"\", \$0); print }" "$(ptmp "$task_project_file")")"
+    git add $task_project_file
+
+    # Check that only the project file has been added (and that our file is actually
+    # modified)
+    if git status --porcelain=v2 | awk -v path="$base_task_project_file_path" 'BEGIN { hit = 0 } { if ($2 ~ /A./ || $2 ~ /M./) { if ($NF ~ path) { hit = 1 } else { hit = 0; exit 1 } } } END { if (hit == 1) { exit 0 } else { exit 1 } }'; then
+        git commit --verbose --message="chore($(dirname "$base_task_project_file_path")): Update"
+    fi
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/context.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/context.sh
new file mode 100755
index 00000000..7095847d
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/context.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env dash
+
+context0open_current_task_context() {
+    current_context="$(utils0get_current_context)"
+
+    if [ "$current_context" ]; then
+        context_path="$(utils0get_current_context_path "$current_context")"
+
+        extended_neorg_project_dir="$(utils0get_neorg_project_dir)"
+        cd "$extended_neorg_project_dir" || die "(BUG?): Can not access the project dir: $extended_neorg_project_dir"
+
+        nvim "$extended_neorg_project_dir/$context_path"
+
+        git add .
+        git commit --message="chore($(dirname "$context_path")): Update" --no-gpg-sign
+    else
+        warn "No context active"
+    fi
+}
+
+context0open_current_task_context_at_task_id() {
+    task_id="$1"
+    current_context="$(utils0get_current_context)"
+
+    if [ "$current_context" ]; then
+        context_path="$(utils0get_current_context_path "$current_context")"
+        extended_neorg_project_dir="$(utils0get_neorg_project_dir)"
+        task_uuid="$(task "$task_id" uuids)"
+
+        cd "$extended_neorg_project_dir" || die "(BUG?): Can not access the project dir: $extended_neorg_project_dir"
+
+        if ! grep -q "% $task_uuid" "$extended_neorg_project_dir/$context_path"; then
+            echo "* TITLE (% $task_uuid)" >>"$extended_neorg_project_dir/$context_path"
+        fi
+
+        nvim "$extended_neorg_project_dir/$context_path" -c "/% $task_uuid"
+
+        git add .
+        git commit --message="chore($(dirname "$context_path")): Update" --no-gpg-sign
+    else
+        warn "No context active"
+    fi
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/dmenu.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/dmenu.sh
new file mode 100755
index 00000000..73e9460a
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/dmenu.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env dash
+
+dmenu0open_context_in_browser() {
+    project="$(echo "%ALL_PROJECTS_PIPE" | rofi -sep "|" -dmenu)"
+
+    if [ "$project" ]; then
+        project0open_project_in_browser "$project"
+    else
+        notify-send "(neorg/dmenu) No project selected"
+        exit 1
+    fi
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_start.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_start.sh
new file mode 100755
index 00000000..2423dd44
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_start.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env dash
+
+fstart0start_new_task() {
+    task_id="$1"
+    fstop0stop_current_task
+    task start "$task_id"
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_stop.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_stop.sh
new file mode 100755
index 00000000..e4ff0b94
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/f_stop.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env dash
+
+fstop0stop_current_task() {
+    # we ensured that only one task may be active
+    active="$(task +ACTIVE _ids)"
+    [ "$active" ] && task stop "$active"
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/list.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/list.sh
new file mode 100755
index 00000000..10659457
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/list.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env dash
+
+list0list_all_contexts_newline() {
+    print "%ALL_PROJECTS_NEWLINE"
+}
+list0list_all_contexts_comma() {
+    print "%ALL_PROJECTS_COMMA"
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/project.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/project.sh
new file mode 100755
index 00000000..64591850
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/project.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env dash
+
+project0open_current_context_in_browser() {
+    current_context="$(utils0get_current_context)"
+    [ "$current_context" ] || die "No current context to use"
+    project0open_context_in_browser "$(utils0context2project "$current_context")"
+}
+
+project0open_project_in_browser() {
+    project="$1"
+    [ "$project" ] || die "BUG: No context supplied to project0open_context_in_browser"
+
+    old_context="$(utils0get_current_context)"
+    # We have ensured that only one task may be active
+    old_started_task="$(task +ACTIVE _ids)"
+
+    tracking="$(mktmp)"
+    task "project:$project" _ids | xargs --no-run-if-empty task _zshids >"$tracking"
+    task context "$(utils0project2context "$project")"
+
+    while read -r description; do
+        desc="$(echo "$description" | awk -F: '{print $2}')"
+        if [ "$desc" = "tracking" ]; then
+            task_id="$(echo "$description" | awk -F: '{print $1}')"
+            notify-send "(Neorg)" "Starting task $project -> $desc"
+            task start "$task_id"
+            break
+        fi
+    done <"$tracking"
+
+    firefox -P "$project"
+
+    task stop "$task_id"
+    [ "$old_started_task" ] && task start "$old_started_task"
+
+    if [ "$old_context" ]; then
+        task context "$old_context"
+    else
+        task context none
+    fi
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/utils.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/utils.sh
new file mode 100755
index 00000000..c3843e8e
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/utils.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env dash
+
+# Runs it's first argument and then the second, regardless if the first failed or
+# succeeded
+utils0chain() {
+    eval "$1"
+    eval "$2"
+}
+
+utils0get_current_context() {
+    current_context="$(task _get rc.context)"
+    printf "%s\n" "$current_context"
+}
+
+utils0get_current_context_path() {
+    current_context="$1"
+    context_path="$(task _get rc.context."$current_context".rc.neorg_path 2>/dev/null)"
+    if ! [ "$context_path" ]; then
+        context_path="$(grep "context.$current_context.rc.neorg_path" "%HOME_TASKRC" | awk 'BEGIN {FS="="} {print $2}')"
+        [ "$context_path" ] || die "All contexts should have a 'neorg_path' set!"
+    fi
+    printf "%s\n" "$context_path"
+}
+
+utils0get_neorg_project_dir() {
+    # Perform shell expansion of Tilde
+    neorg_project_dir="$(sed "s|^~|$HOME|" "$(ptmp "%DEFAULT_NEORG_PROJECT_DIR")")"
+    printf "%s\n" "$neorg_project_dir"
+}
+
+utils0project2context() {
+    project="$1"
+    context="$(sed 's|\.|_|g' "$(ptmp "$project")")"
+    printf "%s\n" "$context"
+}
+utils0context2project() {
+    context="$1"
+    project="$(sed 's|_|\.|g' "$(ptmp "$context")")"
+    printf "%s\n" "$project"
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/workspace.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/workspace.sh
new file mode 100755
index 00000000..d5eb2fca
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/functions/workspace.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env dash
+
+workspace0open_neorg_workspace() {
+    workspace="$1"
+    nvim -c "NeorgStart" -s "$(ptmp ":Neorg workspace $workspace\n")"
+}
+workspace0open_neorg_workspace_prompt() {
+    nvim -c "NeorgStart" -s "$(ptmp ":Neorg workspace ")"
+}
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/main.sh b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/main.sh
new file mode 100755
index 00000000..5087c391
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/neorg/sh/main.sh
@@ -0,0 +1,155 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+# load dependencies
+. ./functions/add.sh
+. ./functions/context.sh
+. ./functions/dmenu.sh
+. ./functions/f_start.sh
+. ./functions/f_stop.sh
+. ./functions/list.sh
+. ./functions/project.sh
+. ./functions/utils.sh
+. ./functions/workspace.sh
+
+# these are used in version()
+# shellcheck disable=2034
+AUTHORS="Soispha"
+# shellcheck disable=2034
+YEARS="2023"
+
+NAME="neorg"
+
+help() {
+    cat <<EOF
+This is the core interface to the system-integrated task management
+
+USAGE:
+    $NAME [OPTIONS] [COMMAND]
+
+OPTIONS:
+    --help      | -h
+                            Display this help and exit.
+
+    --version   | -v
+                            Display version and copyright information and exit.
+COMMANDS:
+    task [ID]
+                            Open the neorg context associated with the current context and
+                            the uuid of the task with id ID. Without ID, it'll open the
+                            current context's norg file.
+                            If no context is set, drops you to the selection prompt
+
+    dmenu
+                            Select a project in dmenu mode. This will give you all projects
+                            and exectute the selected one as in 'neorg projects <selected>'
+
+    workspace [WS]
+                            The neorg workspace (WS) to open at startup, an empty value drops
+                            you at a prompt to enter the workspace yourself.
+
+    project [P]
+                            Opens the webbrowser with either the context (P) or
+                            the current active context as argument if no context is supplied
+
+    list
+                            Lists all available contexts
+
+    add
+                            Allows you to quickly add projects
+
+    fstart ID
+                            Starts the task (ID) but only after it stooped
+                            the previous active task, if it existed.
+
+    fstop
+                            Stops the current active task
+ARGUMENTS:
+    ID | *([0-9]) := [[%ID_GENERATION_FUNCTION]]
+                            The function displays all possible IDs of the eligable tasks.
+
+    WS := %ALL_WORKSPACES
+                            All possible workspaces
+
+    P := %ALL_PROJECTS_PIPE
+                            The possible project
+
+EOF
+}
+
+for arg in "$@"; do
+    case "$arg" in
+    "--help" | "-h")
+        help
+        exit 0
+        ;;
+    "--version" | "-v")
+        version
+        exit 0
+        ;;
+    esac
+done
+
+while [ "$#" -ne 0 ]; do
+    case "$1" in
+    "t"*) # task
+        shift 1
+        task_id="$1"
+        [ "$task_id" ] || utils0chain context0open_current_task_context "exit 0"
+        context0open_current_task_context_at_task_id "$task_id"
+        exit 0
+        ;;
+    "w"*) # workspace
+        shift 1
+        workspace_to_open="$1"
+        # TODO: Exit with 1 on error, instead of the 0 <2023-10-20>
+        [ "$workspace_to_open" ] || utils0chain workspace0open_neorg_workspace_prompt "exit 0"
+        workspace0open_neorg_workspace "$workspace_to_open"
+        exit 0
+        ;;
+    "p"*) # project
+        shift 1
+        project_to_open="$1"
+        # TODO: Exit with 1 on error, instead of the 0 <2023-10-20>
+        [ "$project_to_open" ] || utils0chain project0open_current_context_in_browser "exit 0"
+        if ! grep -q "$project_to_open" "$(ptmp "%ALL_PROJECTS_NEWLINE")"; then
+            die "Your project ('$project_to_open') is not in the list of available projects:
+%ALL_PROJECTS_COMMA"
+        fi
+        project0open_project_in_browser "$project_to_open"
+        exit 0
+        ;;
+    "l"*) # list
+        list0list_all_contexts_newline
+        exit 0
+        ;;
+    "a"*) # add-project
+        add0open_taskwarrior_project_file
+        exit 0
+        ;;
+    "d"*) # dmenu
+        dmenu0open_context_in_browser
+        exit 0
+        ;;
+    "fsta"*) # fstart
+        shift 1
+        task_id="$1"
+        [ "$task_id" ] || die "No task id provided to fstart"
+        fstart0start_new_task "$task_id"
+        exit 0
+        ;;
+    "fsto"*) # fstop
+        fstop0stop_current_task
+        exit 0
+        ;;
+    *)
+        die "Command '$1' does not exist! Please look at:\n $NAME --help"
+        exit 0
+        ;;
+    esac
+done
+
+context0open_current_task_context
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/specific/ytcc/description.sh b/sys/nixpkgs/pkgs/scripts/source/specific/ytcc/description.sh
new file mode 100755
index 00000000..e2a1afaa
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/specific/ytcc/description.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+jq --raw-output '.description' "$XDG_RUNTIME_DIR/ytcc/running" | fmt -u -s | less
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/battery.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/battery.sh
new file mode 100755
index 00000000..65485dff
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/battery.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+capacity="$(cat /sys/class/power_supply/BAT0/capacity)"
+status="$(cat /sys/class/power_supply/BAT0/status)"
+
+printf "%s%% (%s)\n" "$capacity" "$status"
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/hibernate.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/hibernate.sh
new file mode 100755
index 00000000..f3e74732
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/hibernate.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+context="$(task _get rc.context)"
+[ "$context" ] && task context none
+
+# We have ensured that only one task is active
+active="$(task +ACTIVE _ids)"
+[ "$active" ] && task stop "$active"
+
+systemctl hibernate "$@"
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/ll.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/ll.sh
new file mode 100755
index 00000000..2a65d0a6
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/ll.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+last_directory="$(mktemp)"
+
+command lf -last-dir-path="$last_directory" "$@"
+
+dir="$(cat "$last_directory")"
+cd "$dir" || die "$dir does not exist!"
+rm "$last_directory"
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/lock.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/lock.sh
new file mode 100755
index 00000000..f1c5c711
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/lock.sh
@@ -0,0 +1,18 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+context="$(task _get rc.context)"
+[ "$context" ] && task context none
+
+# We have ensured that only one task is active
+active="$(task +ACTIVE _ids)"
+[ "$active" ] && task stop "$active"
+
+swaylock
+
+[ "$active" ] && task start "$active"
+
+[ "$context" ] && task context "$context"
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/lyrics.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/lyrics.sh
new file mode 100755
index 00000000..83a01083
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/lyrics.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+(
+    cd "$XDG_MUSIC_DIR" || die "No music dir!"
+    exiftool "$(mpc --format '%file%' current)" -json | jq '.[0].Lyrics' -r | less
+)
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/mpc-fav.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/mpc-fav.sh
new file mode 100755
index 00000000..7385ce43
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/mpc-fav.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+FAV_DIR="$XDG_MUSIC_DIR/playlists/favourites"
+
+cd "$XDG_MUSIC_DIR" || die "No music dir!"
+
+[ -d "$FAV_DIR" ] || mkdir --parents "$FAV_DIR"
+
+ln -sr "$(mpc --format '%file%' current)" "$FAV_DIR/" || die "Link failed!"
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/mpc-rm.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/mpc-rm.sh
new file mode 100755
index 00000000..03673dbe
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/mpc-rm.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+cd "$XDG_MUSIC_DIR" || die "No music dir!"
+trash-put "$(mpc --format '%file%' current)"
+mpc del 0
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/mpc.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/mpc.sh
new file mode 100755
index 00000000..b870150b
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/mpc.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+case "$1" in
+"rm")
+    shift 1
+    mpc-rm "$@"
+    ;;
+"fav")
+    shift 1
+    mpc-fav "$@"
+    ;;
+*)
+    mpc "$@"
+    ;;
+esac
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/show.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/show.sh
new file mode 100755
index 00000000..95afb16c
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/show.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+# Maybe add `--quit-if-one-screen`
+less --redraw-on-quit "$@"
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/sort_song.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/sort_song.sh
new file mode 100755
index 00000000..8195cfcf
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/sort_song.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+case "$("$1" | tr '[:upper:]' '[:lower:]')" in
+"lyrics")
+    filter="LYRICS"
+    directory="lyrics"
+    ;;
+"instrumental")
+    filter="INSTRUMENTAL"
+    directory="instrumental"
+    ;;
+*)
+    die "Expected 'instrumental|lyrics' but got '$1'"
+    ;;
+esac
+
+process() {
+    mediainfo --Output=JSON "$1" | jq '.media.track | map(.Lyrics) | join("")'
+}
+
+mkdir "../$directory"
+
+fd . --extension=opus | while read -r file; do
+    if [ "$(process "$file")" = '""' ] || [ "$(process "$file")" = '"Instrumental"' ] || [ "$(process "$file")" = '"instrumental"' ]; then
+        echo "INSTRUMENTAL::$file"
+    else
+        echo "LYRICS::$file"
+    fi
+done | grep "$filter" | awk 'BEGIN {FS="::"}{print $2}' | while read -r file; do ln -s "../all/$file" "../$directory/$file"; done
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/spodi.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/spodi.sh
new file mode 100755
index 00000000..8b4188b0
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/spodi.sh
@@ -0,0 +1,55 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+# This path must not contain spaces
+DOWN_DIR="/home/soispha/media/music/down/spotify"
+
+download_url="$1"
+
+already_downloaded_files="$(mktmp)"
+fd . "$DOWN_DIR" --exclude spotdl.log --exclude spotdl-errors.log >"$already_downloaded_files"
+
+config="$(mktmp)"
+cat <<EOF | clean >"$config"
+# Main options
+--audio slider-kz bandcamp youtube-music piped youtube soundcloud
+--lyrics genius musixmatch azlyrics synced
+
+# FFmpeg options
+--ffmpeg ffmpeg
+--threads 16
+--bitrate 256k
+
+# Spotify options
+--cache-path /home/soispha/.cache/spotdl/.spotipy
+
+# Output options
+--preload
+--format opus
+--output {artists}_-_{title}
+--print-errors
+--save-errors $DOWN_DIR/spotdl-errors.log
+# TODO: Reactive whence spotdl support for these has improved <2023-12-19>
+# --generate-lrc
+--overwrite skip
+
+# Misc options
+--log-level INFO
+EOF
+
+if [ -z "$NO_CHECK" ] && [ "$(wc -l <"$already_downloaded_files")" -ne 0 ]; then
+    die "something is already downloaded"
+fi
+
+rm "$DOWN_DIR/spotdl.log"
+cd "$DOWN_DIR" || die "BUG: no $DOWN_DIR"
+touch "$DOWN_DIR/spotdl-errors.log"
+
+# The sub shell needs to be unquoted, as the arguments may not be treated as one.
+# shellcheck disable=2046
+unbuffer spotdl $(cat "$config") download "$download_url" | tee "$DOWN_DIR/spotdl.log"
+
+[ -d ~/.spotdl ] && rm -r ~/.spotdl
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/virsh-del.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/virsh-del.sh
new file mode 100755
index 00000000..96a9404d
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/virsh-del.sh
@@ -0,0 +1,10 @@
+#! /usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+virsh destroy "$1"
+virsh undefine "$1" --nvram
+virsh vol-delete --pool default "$1".qcow2
+
+# vim: ft=sh
diff --git a/sys/nixpkgs/pkgs/scripts/source/wrappers/yti.sh b/sys/nixpkgs/pkgs/scripts/source/wrappers/yti.sh
new file mode 100755
index 00000000..caa5f443
--- /dev/null
+++ b/sys/nixpkgs/pkgs/scripts/source/wrappers/yti.sh
@@ -0,0 +1,33 @@
+#! /usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.0.13" . %SHELL_LIBRARY_PATH
+
+DOWN_DIR=/home/soispha/media/music/down/youtube
+
+tmp=$(mktmp)
+config=$(mktmp)
+
+for e in "$DOWN_DIR"/*.opus; do echo "$e" >>"$tmp"; done
+[ "$(wc -l "$tmp" | awk '{print $1}')" -gt 2 ] && die "something is already downloaded"
+
+cat <<EO >"$config"
+--paths home:"$DOWN_DIR"
+#--output %(fulltitle)
+--restrict-filenames
+--no-overwrites
+--no-write-info-json
+--clean-info-json
+--prefer-free-formats
+#--format mp3
+--extract-audio
+--audio-quality 0
+--audio-format best
+EO
+
+rm "$DOWN_DIR/yt-dlp.log"
+cd "$DOWN_DIR" || die "BUG: no $DOWN_DIR"
+
+unbuffer yt-dlp --config-location "$config" "$1" | tee "$DOWN_DIR/yt-dlp.log"
+
+# vim: ft=sh