about summary refs log tree commit diff
path: root/pkgs/tools
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/tools')
-rw-r--r--pkgs/tools/X11/xbindkeys/default.nix6
-rw-r--r--pkgs/tools/admin/aws-sso-cli/default.nix4
-rw-r--r--pkgs/tools/admin/copilot-cli/default.nix6
-rw-r--r--pkgs/tools/admin/docker-credential-helpers/default.nix6
-rw-r--r--pkgs/tools/admin/fits-cloudctl/default.nix6
-rw-r--r--pkgs/tools/admin/gam/default.nix2
-rw-r--r--pkgs/tools/admin/procs/default.nix1
-rw-r--r--pkgs/tools/admin/qovery-cli/default.nix8
-rw-r--r--pkgs/tools/admin/trivy/default.nix8
-rw-r--r--pkgs/tools/admin/wander/default.nix4
-rw-r--r--pkgs/tools/archivers/ctrtool/default.nix2
-rw-r--r--pkgs/tools/audio/beets/common.nix6
-rw-r--r--pkgs/tools/audio/linuxwave/default.nix52
-rw-r--r--pkgs/tools/audio/picotts/default.nix8
-rw-r--r--pkgs/tools/audio/piper/default.nix39
-rw-r--r--pkgs/tools/audio/piper/fix-compilation-with-newer-onnxruntime.patch18
-rw-r--r--pkgs/tools/audio/piper/train.nix54
-rw-r--r--pkgs/tools/audio/playerctl/default.nix1
-rw-r--r--pkgs/tools/audio/wyoming/faster-whisper-entrypoint.patch17
-rw-r--r--pkgs/tools/audio/wyoming/faster-whisper.nix4
-rw-r--r--pkgs/tools/audio/wyoming/piper-entrypoint.patch20
-rw-r--r--pkgs/tools/audio/wyoming/piper.nix4
-rw-r--r--pkgs/tools/audio/yabridgectl/default.nix2
-rw-r--r--pkgs/tools/backup/hpe-ltfs/default.nix2
-rw-r--r--pkgs/tools/backup/pgbackrest/default.nix1
-rw-r--r--pkgs/tools/backup/restic/0001-Skip-testing-restore-with-permission-failure.patch16
-rw-r--r--pkgs/tools/backup/restic/default.nix8
-rw-r--r--pkgs/tools/backup/tarsnap/default.nix1
-rw-r--r--pkgs/tools/bluetooth/blueman/default.nix4
-rw-r--r--pkgs/tools/cd-dvd/cdrdao/default.nix57
-rw-r--r--pkgs/tools/cd-dvd/srt-to-vtt-cl/default.nix11
-rw-r--r--pkgs/tools/cd-dvd/srt-to-vtt-cl/simplify-macOS-builds.patch31
-rw-r--r--pkgs/tools/compression/flips/default.nix6
-rw-r--r--pkgs/tools/compression/flips/use-system-libdivsufsort.patch8
-rw-r--r--pkgs/tools/compression/xz/default.nix4
-rw-r--r--pkgs/tools/filesystems/blobfuse/default.nix2
-rw-r--r--pkgs/tools/filesystems/cpcfs/default.nix2
-rw-r--r--pkgs/tools/filesystems/dysk/default.nix6
-rw-r--r--pkgs/tools/filesystems/squashfuse/default.nix4
-rw-r--r--pkgs/tools/filesystems/tar2ext4/default.nix2
-rw-r--r--pkgs/tools/games/dualsensectl/default.nix4
-rw-r--r--pkgs/tools/games/steam-rom-manager/default.nix4
-rw-r--r--pkgs/tools/graphics/pdftoipe/default.nix2
-rw-r--r--pkgs/tools/graphics/realesrgan-ncnn-vulkan/default.nix2
-rw-r--r--pkgs/tools/misc/autorandr/default.nix5
-rw-r--r--pkgs/tools/misc/balanceofsatoshis/default.nix45
-rw-r--r--pkgs/tools/misc/barman/default.nix4
-rw-r--r--pkgs/tools/misc/bat/default.nix3
-rw-r--r--pkgs/tools/misc/bdf2psf/default.nix4
-rw-r--r--pkgs/tools/misc/clipbuzz/default.nix38
-rw-r--r--pkgs/tools/misc/coreboot-utils/default.nix1
-rw-r--r--pkgs/tools/misc/direnv/default.nix1
-rw-r--r--pkgs/tools/misc/exa/default.nix1
-rw-r--r--pkgs/tools/misc/eza/default.nix61
-rw-r--r--pkgs/tools/misc/fastfetch/default.nix123
-rw-r--r--pkgs/tools/misc/file/default.nix1
-rw-r--r--pkgs/tools/misc/findup/default.nix45
-rw-r--r--pkgs/tools/misc/fw/default.nix28
-rw-r--r--pkgs/tools/misc/fwup/default.nix4
-rw-r--r--pkgs/tools/misc/goose/default.nix6
-rw-r--r--pkgs/tools/misc/hueadm/default.nix27
-rw-r--r--pkgs/tools/misc/infracost/default.nix6
-rw-r--r--pkgs/tools/misc/lektor/default.nix89
-rw-r--r--pkgs/tools/misc/ncdu/default.nix39
-rw-r--r--pkgs/tools/misc/nurl/default.nix1
-rw-r--r--pkgs/tools/misc/ollama/default.nix35
-rw-r--r--pkgs/tools/misc/opentelemetry-collector/contrib.nix2
-rw-r--r--pkgs/tools/misc/opentelemetry-collector/default.nix2
-rw-r--r--pkgs/tools/misc/rtx/default.nix13
-rw-r--r--pkgs/tools/misc/rtz/Cargo.lock26
-rw-r--r--pkgs/tools/misc/rtz/default.nix4
-rw-r--r--pkgs/tools/misc/star-history/default.nix6
-rw-r--r--pkgs/tools/misc/starship/default.nix1
-rw-r--r--pkgs/tools/misc/trdl-client/default.nix2
-rw-r--r--pkgs/tools/misc/usbimager/default.nix2
-rw-r--r--pkgs/tools/misc/vector/default.nix1
-rw-r--r--pkgs/tools/misc/webcat/default.nix13
-rw-r--r--pkgs/tools/misc/wimboot/default.nix2
-rw-r--r--pkgs/tools/misc/xvfb-run/default.nix1
-rw-r--r--pkgs/tools/misc/yt-dlp/default.nix1
-rw-r--r--pkgs/tools/misc/zf/default.nix61
-rw-r--r--pkgs/tools/misc/zoxide/default.nix6
-rw-r--r--pkgs/tools/networking/airgeddon/default.nix2
-rw-r--r--pkgs/tools/networking/bitmask-vpn/default.nix2
-rw-r--r--pkgs/tools/networking/castnow/default.nix27
-rw-r--r--pkgs/tools/networking/clash-meta/default.nix1
-rw-r--r--pkgs/tools/networking/clash/default.nix1
-rw-r--r--pkgs/tools/networking/curl/default.nix1
-rw-r--r--pkgs/tools/networking/dae/default.nix8
-rw-r--r--pkgs/tools/networking/dd-agent/integrations-core.nix2
-rw-r--r--pkgs/tools/networking/dhcp/default.nix102
-rw-r--r--pkgs/tools/networking/dhcp/set-hostname.patch12
-rw-r--r--pkgs/tools/networking/dnsproxy/default.nix4
-rw-r--r--pkgs/tools/networking/dq/default.nix33
-rw-r--r--pkgs/tools/networking/frp/default.nix6
-rw-r--r--pkgs/tools/networking/gnirehtet/default.nix4
-rw-r--r--pkgs/tools/networking/goimapnotify/default.nix1
-rw-r--r--pkgs/tools/networking/gping/default.nix13
-rw-r--r--pkgs/tools/networking/gupnp-tools/default.nix5
-rw-r--r--pkgs/tools/networking/gvproxy/default.nix4
-rw-r--r--pkgs/tools/networking/haproxy/default.nix41
-rw-r--r--pkgs/tools/networking/junkie/default.nix4
-rw-r--r--pkgs/tools/networking/kea/default.nix2
-rw-r--r--pkgs/tools/networking/mailutils/default.nix4
-rw-r--r--pkgs/tools/networking/minio-client/default.nix6
-rw-r--r--pkgs/tools/networking/mqttmultimeter/default.nix2
-rw-r--r--pkgs/tools/networking/nzbget/default.nix41
-rw-r--r--pkgs/tools/networking/pgrok/default.nix6
-rw-r--r--pkgs/tools/networking/proxify/default.nix6
-rw-r--r--pkgs/tools/networking/pykms/default.nix2
-rw-r--r--pkgs/tools/networking/ratman/default.nix2
-rw-r--r--pkgs/tools/networking/reaver-wps-t6x/default.nix2
-rw-r--r--pkgs/tools/networking/sing-box/default.nix6
-rw-r--r--pkgs/tools/networking/sitespeed-io/default.nix1
-rw-r--r--pkgs/tools/networking/sleep-on-lan/default.nix2
-rw-r--r--pkgs/tools/networking/socat/default.nix1
-rw-r--r--pkgs/tools/networking/vegeta/default.nix6
-rw-r--r--pkgs/tools/networking/wgautomesh/default.nix1
-rw-r--r--pkgs/tools/networking/whois/default.nix4
-rw-r--r--pkgs/tools/networking/wireguard-tools/default.nix2
-rw-r--r--pkgs/tools/nix/alejandra/default.nix1
-rw-r--r--pkgs/tools/nix/nixpkgs-fmt/default.nix1
-rw-r--r--pkgs/tools/nix/statix/default.nix1
-rw-r--r--pkgs/tools/package-management/harmonia/default.nix1
-rw-r--r--pkgs/tools/package-management/home-manager/default.nix8
-rw-r--r--pkgs/tools/package-management/nix-update/default.nix4
-rw-r--r--pkgs/tools/package-management/nix/common.nix1
-rw-r--r--pkgs/tools/security/arti/default.nix6
-rw-r--r--pkgs/tools/security/b2sum/default.nix2
-rw-r--r--pkgs/tools/security/bitwarden/default.nix2
-rw-r--r--pkgs/tools/security/dnsrecon/default.nix10
-rw-r--r--pkgs/tools/security/donkey/default.nix2
-rw-r--r--pkgs/tools/security/exploitdb/default.nix4
-rw-r--r--pkgs/tools/security/fulcio/default.nix6
-rw-r--r--pkgs/tools/security/grype/default.nix4
-rw-r--r--pkgs/tools/security/hashcat-utils/default.nix2
-rw-r--r--pkgs/tools/security/jwx/default.nix2
-rw-r--r--pkgs/tools/security/lesspass-cli/default.nix2
-rw-r--r--pkgs/tools/security/libmodsecurity/default.nix4
-rw-r--r--pkgs/tools/security/metasploit/Gemfile2
-rw-r--r--pkgs/tools/security/metasploit/Gemfile.lock34
-rw-r--r--pkgs/tools/security/metasploit/default.nix4
-rw-r--r--pkgs/tools/security/metasploit/gemset.nix58
-rw-r--r--pkgs/tools/security/osv-scanner/default.nix6
-rw-r--r--pkgs/tools/security/pass/default.nix4
-rw-r--r--pkgs/tools/security/proxmark3/default.nix131
-rw-r--r--pkgs/tools/security/proxmark3/proxmark3-rrg.nix86
-rw-r--r--pkgs/tools/security/rage/default.nix1
-rw-r--r--pkgs/tools/security/rekor/default.nix6
-rw-r--r--pkgs/tools/security/sequoia-sq/default.nix6
-rw-r--r--pkgs/tools/security/spire/default.nix6
-rw-r--r--pkgs/tools/security/ssdeep/default.nix6
-rw-r--r--pkgs/tools/security/terrascan/default.nix6
-rw-r--r--pkgs/tools/security/tor/default.nix4
-rw-r--r--pkgs/tools/security/trufflehog/default.nix6
-rw-r--r--pkgs/tools/security/vaultwarden/default.nix4
-rw-r--r--pkgs/tools/security/yubikey-touch-detector/default.nix1
-rw-r--r--pkgs/tools/security/zeekscript/default.nix5
-rw-r--r--pkgs/tools/system/auto-cpufreq/default.nix1
-rw-r--r--pkgs/tools/system/htop/default.nix1
-rw-r--r--pkgs/tools/system/kanata/default.nix7
-rw-r--r--pkgs/tools/system/osquery/default.nix4
-rw-r--r--pkgs/tools/system/zx/default.nix25
-rw-r--r--pkgs/tools/text/chroma/default.nix4
-rw-r--r--pkgs/tools/text/chroma/src.json8
-rw-r--r--pkgs/tools/text/gawk/default.nix1
-rw-r--r--pkgs/tools/text/markdownlint-cli/default.nix28
-rw-r--r--pkgs/tools/text/mdbook-toc/default.nix6
-rw-r--r--pkgs/tools/text/mrkd/default.nix52
-rw-r--r--pkgs/tools/text/rare-regex/default.nix4
-rw-r--r--pkgs/tools/text/reveal-md/default.nix41
-rw-r--r--pkgs/tools/text/xml/jing-trang/default.nix2
-rw-r--r--pkgs/tools/typesetting/scdoc/default.nix44
-rw-r--r--pkgs/tools/typesetting/sile/default.nix10
-rw-r--r--pkgs/tools/typesetting/skribilo/default.nix6
-rw-r--r--pkgs/tools/typesetting/tex/texlive/UPGRADING.md31
-rw-r--r--pkgs/tools/typesetting/tex/texlive/bin.nix56
-rw-r--r--pkgs/tools/typesetting/tex/texlive/combine.nix171
-rw-r--r--pkgs/tools/typesetting/tex/texlive/default.nix431
-rw-r--r--pkgs/tools/typesetting/tex/texlive/fixed-hashes.nix1
-rw-r--r--pkgs/tools/typesetting/tex/texlive/make-bin-containers.sh62
-rw-r--r--pkgs/tools/typesetting/tex/texlive/patch-scripts.sed57
-rw-r--r--pkgs/tools/typesetting/tex/texlive/tl2nix.sed74
-rw-r--r--pkgs/tools/typesetting/tex/texlive/tlpdb.nix1743
-rw-r--r--pkgs/tools/typesetting/xmlroff/default.nix2
-rw-r--r--pkgs/tools/virtualization/cloud-init/default.nix4
-rw-r--r--pkgs/tools/virtualization/google-guest-agent/default.nix8
-rw-r--r--pkgs/tools/wayland/gtklock/default.nix1
-rw-r--r--pkgs/tools/wayland/swww/default.nix41
-rw-r--r--pkgs/tools/wayland/wlogout/default.nix1
-rw-r--r--pkgs/tools/wayland/wtype/default.nix1
191 files changed, 3857 insertions, 1044 deletions
diff --git a/pkgs/tools/X11/xbindkeys/default.nix b/pkgs/tools/X11/xbindkeys/default.nix
index 17e0ca66e3f3..5b2f5c8a1968 100644
--- a/pkgs/tools/X11/xbindkeys/default.nix
+++ b/pkgs/tools/X11/xbindkeys/default.nix
@@ -1,4 +1,4 @@
-{ lib, stdenv, fetchurl, pkg-config, libX11, guile }:
+{ lib, stdenv, fetchurl, autoreconfHook, pkg-config, libX11, guile }:
 
 stdenv.mkDerivation rec {
   pname = "xbindkeys";
@@ -8,14 +8,14 @@ stdenv.mkDerivation rec {
     sha256 = "1wl2vc5alisiwyk8m07y1ryq8w3ll9ym83j27g4apm4ixjl8d6x2";
   };
 
-  nativeBuildInputs = [ pkg-config ];
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
   buildInputs = [ libX11 guile ];
 
   meta = {
     homepage = "https://www.nongnu.org/xbindkeys/xbindkeys.html";
     description = "Launch shell commands with your keyboard or your mouse under X Window";
     license = lib.licenses.gpl2Plus;
-    maintainers = with lib.maintainers; [viric];
+    maintainers = with lib.maintainers; [ viric ];
     platforms = with lib.platforms; linux;
   };
 }
diff --git a/pkgs/tools/admin/aws-sso-cli/default.nix b/pkgs/tools/admin/aws-sso-cli/default.nix
index 25fd3b311ab5..558891d31656 100644
--- a/pkgs/tools/admin/aws-sso-cli/default.nix
+++ b/pkgs/tools/admin/aws-sso-cli/default.nix
@@ -6,13 +6,13 @@
 }:
 buildGoModule rec {
   pname = "aws-sso-cli";
-  version = "1.9.10";
+  version = "1.10.0";
 
   src = fetchFromGitHub {
     owner = "synfinatic";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-hDXCH5B4bc0SKv/qzk92bPm366LmdYWTuVVn8KI0avo=";
+    hash = "sha256-Kcjg2xzW8l/3RViJri1UpG36YkmbHbXIKkDQnVr/26g=";
   };
   vendorHash = "sha256-myjHRZXTjsLXD8kibcdf1/Nhvx50fDsFtmZd63DpiiI=";
 
diff --git a/pkgs/tools/admin/copilot-cli/default.nix b/pkgs/tools/admin/copilot-cli/default.nix
index b27aa9f59333..bb588a822622 100644
--- a/pkgs/tools/admin/copilot-cli/default.nix
+++ b/pkgs/tools/admin/copilot-cli/default.nix
@@ -2,16 +2,16 @@
 
 buildGoModule rec {
   pname = "copilot-cli";
-  version = "1.28.0";
+  version = "1.29.0";
 
   src = fetchFromGitHub {
     owner = "aws";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-KrgPHdYR0kYwyNhO2EwIO00Xnjy0MmrzHb5LDmbrgB0=";
+    sha256 = "sha256-sXYdP1HvwamKKvCNM5T2vu86y5mQ9MD44SrFgqWfQkE=";
   };
 
-  vendorHash = "sha256-1YOx7tqPJwCZlJSAG9o+STKRAIR72dptvTOpa9rRt3A=";
+  vendorHash = "sha256-TbgxXkLIEu7jSnngVRbp4E22GgOkXSB0b8JzHI/pNGk=";
 
   nativeBuildInputs = [ installShellFiles ];
 
diff --git a/pkgs/tools/admin/docker-credential-helpers/default.nix b/pkgs/tools/admin/docker-credential-helpers/default.nix
index 7859145dfdd1..151da67fe91f 100644
--- a/pkgs/tools/admin/docker-credential-helpers/default.nix
+++ b/pkgs/tools/admin/docker-credential-helpers/default.nix
@@ -2,16 +2,16 @@
 
 buildGoModule rec {
   pname = "docker-credential-helpers";
-  version = "0.7.0";
+  version = "0.8.0";
 
   src = fetchFromGitHub {
     owner = "docker";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-KtDWrtd88s4Al3iWxIYE+YlhZTzf8/YDVYE2AwxH8ho=";
+    sha256 = "sha256-3zWlYW+2LA/JK/lv/OTzMlF2HlQPID0WYks0dQrP3GY=";
   };
 
-  vendorSha256 = null;
+  vendorHash = null;
 
   nativeBuildInputs = lib.optionals stdenv.isLinux [ pkg-config ];
 
diff --git a/pkgs/tools/admin/fits-cloudctl/default.nix b/pkgs/tools/admin/fits-cloudctl/default.nix
index 146a7e241de3..6ec8819e3bc9 100644
--- a/pkgs/tools/admin/fits-cloudctl/default.nix
+++ b/pkgs/tools/admin/fits-cloudctl/default.nix
@@ -5,16 +5,16 @@
 
 buildGoModule rec {
   pname = "fits-cloudctl";
-  version = "0.11.11";
+  version = "0.11.13";
 
   src = fetchFromGitHub {
     owner = "fi-ts";
     repo = "cloudctl";
     rev = "v${version}";
-    sha256 = "sha256-Jf6QiGn8C3pQ/FQSEc+h06514kNXHpnKVyZ1l+S/uHw=";
+    sha256 = "sha256-S4XouqqIBalXqfznrJ8F2TxU9h+gqObnjRXEQnj67LQ=";
   };
 
-  vendorHash = "sha256-3aoj4G3npO/DYjRu55iP9Y79z3da0edClOJlWuQC//A=";
+  vendorHash = "sha256-Y1F+7bJwsUb09xTSRSdfa6bOPMFCkNBaNurrfB9IPCA=";
 
   meta = with lib; {
     description = "Command-line client for FI-TS Finance Cloud Native services";
diff --git a/pkgs/tools/admin/gam/default.nix b/pkgs/tools/admin/gam/default.nix
index 1b90de1d4674..6ea2b6c3da37 100644
--- a/pkgs/tools/admin/gam/default.nix
+++ b/pkgs/tools/admin/gam/default.nix
@@ -15,7 +15,7 @@ python3.pkgs.buildPythonApplication rec {
     sha256 = "sha256-/VmBFMjCkd1xhudlcjYGGv+6tgEsyY/xqQoGdupJvOg=";
   };
 
-  sourceRoot = "source/src";
+  sourceRoot = "${src.name}/src";
 
   patches = [
     # Also disables update check
diff --git a/pkgs/tools/admin/procs/default.nix b/pkgs/tools/admin/procs/default.nix
index 03d26fd64988..b9c2a463909b 100644
--- a/pkgs/tools/admin/procs/default.nix
+++ b/pkgs/tools/admin/procs/default.nix
@@ -31,5 +31,6 @@ rustPlatform.buildRustPackage rec {
     changelog = "https://github.com/dalance/procs/raw/v${version}/CHANGELOG.md";
     license = licenses.mit;
     maintainers = with maintainers; [ Br1ght0ne sciencentistguy ];
+    mainProgram = "procs";
   };
 }
diff --git a/pkgs/tools/admin/qovery-cli/default.nix b/pkgs/tools/admin/qovery-cli/default.nix
index 5b385caae149..9d072d728fe0 100644
--- a/pkgs/tools/admin/qovery-cli/default.nix
+++ b/pkgs/tools/admin/qovery-cli/default.nix
@@ -8,16 +8,16 @@
 
 buildGoModule rec {
   pname = "qovery-cli";
-  version = "0.61.0";
+  version = "0.63.0";
 
   src = fetchFromGitHub {
     owner = "Qovery";
     repo = pname;
-    rev = "v${version}";
-    hash = "sha256-V3tKUIpSO1oGpkHjkFWAtBoe91va6q2HInZsHrjWhQ0=";
+    rev = "refs/tagsv${version}";
+    hash = "sha256-2w8z6/piPXJ4tGdO1IrzjLcCDGF/C8/Mln+XWu4U2+0=";
   };
 
-  vendorHash = "sha256-5ikOmjJ2E+Kk8FAl6/Jm+k5HKlZJ1Ik3uZ/2sD5Eqok=";
+  vendorHash = "sha256-UicCXaKA2xmkcYCz4RNN4kG2Rj0OIrN+IL3UJF97oIo=";
 
   nativeBuildInputs = [ installShellFiles ];
 
diff --git a/pkgs/tools/admin/trivy/default.nix b/pkgs/tools/admin/trivy/default.nix
index 6fb0b2c05cc3..302bed931826 100644
--- a/pkgs/tools/admin/trivy/default.nix
+++ b/pkgs/tools/admin/trivy/default.nix
@@ -5,19 +5,19 @@
 
 buildGoModule rec {
   pname = "trivy";
-  version = "0.43.1";
+  version = "0.44.0";
 
   src = fetchFromGitHub {
     owner = "aquasecurity";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-fpCPYqAuppEffoSVf2c3xMB1MhTBhn6xhbxPZ03PdI0=";
+    sha256 = "sha256-qxtYYFhABrkJlwWBx4ak7xnaqg7x+D1fUF1gcJFK0e4=";
   };
   # hash missmatch on across linux and darwin
   proxyVendor = true;
-  vendorHash = "sha256-9aHekHHnh9WOqelzNbwflg1/2VFl129WIXPWhdPnar4=";
+  vendorHash = "sha256-mE+GpD9vMhjVQsH+mckU6GhNiLMDV5H31Jj1/HLBSEs=";
 
-  excludedPackages = [ "magefiles" "misc" ];
+  subPackages = [ "cmd/trivy" ];
 
   ldflags = [
     "-s"
diff --git a/pkgs/tools/admin/wander/default.nix b/pkgs/tools/admin/wander/default.nix
index ddad76e4132a..f1fd58877ddb 100644
--- a/pkgs/tools/admin/wander/default.nix
+++ b/pkgs/tools/admin/wander/default.nix
@@ -2,13 +2,13 @@
 
 buildGoModule rec {
   pname = "wander";
-  version = "0.10.1";
+  version = "0.11.1";
 
   src = fetchFromGitHub {
     owner = "robinovitch61";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-jg83GHNlzPPzzhrLWw686vrmLlDL5L0+OUYqMoYUiJw=";
+    sha256 = "sha256-EIMHCal4jt8tMEfx2Lol2/7IK8uROaNC1ABB+0d0YTg=";
   };
 
   vendorHash = "sha256-SqDGXV8MpvEQFAkcE1NWvWjdzYsvbO5vA6k+hpY0js0=";
diff --git a/pkgs/tools/archivers/ctrtool/default.nix b/pkgs/tools/archivers/ctrtool/default.nix
index 4743f7ded3e8..2408f3cf6d6a 100644
--- a/pkgs/tools/archivers/ctrtool/default.nix
+++ b/pkgs/tools/archivers/ctrtool/default.nix
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
     sha256 = "07aayck82w5xcp3si35d7ghybmrbqw91fqqvmbpjrjcixc6m42z7";
   };
 
-  sourceRoot = "source/ctrtool";
+  sourceRoot = "${src.name}/ctrtool";
 
   makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" "CXX=${stdenv.cc.targetPrefix}c++"];
   enableParallelBuilding = true;
diff --git a/pkgs/tools/audio/beets/common.nix b/pkgs/tools/audio/beets/common.nix
index 801637320839..4c8f5ae80895 100644
--- a/pkgs/tools/audio/beets/common.nix
+++ b/pkgs/tools/audio/beets/common.nix
@@ -52,6 +52,12 @@ python3Packages.buildPythonApplication {
 
   patches = extraPatches;
 
+  postPatch = ''
+    # https://github.com/beetbox/beets/pull/4868
+    substituteInPlace beets/util/artresizer.py \
+      --replace "Image.ANTIALIAS" "Image.Resampling.LANCZOS"
+  '';
+
   propagatedBuildInputs = with python3Packages; [
     confuse
     gst-python
diff --git a/pkgs/tools/audio/linuxwave/default.nix b/pkgs/tools/audio/linuxwave/default.nix
index 5d0141666151..213a40909886 100644
--- a/pkgs/tools/audio/linuxwave/default.nix
+++ b/pkgs/tools/audio/linuxwave/default.nix
@@ -2,62 +2,36 @@
 , stdenv
 , fetchFromGitHub
 , installShellFiles
-, zig
+, zigHook
 }:
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation (finalAttrs: {
   pname = "linuxwave";
   version = "0.1.5";
 
   src = fetchFromGitHub {
     owner = "orhun";
     repo = "linuxwave";
-    rev = "v${version}";
-    hash = "sha256-5c8h9bAe3Qv7PJ3PPcwMJYKPlWsmnqshe6vLIgtdDiQ=";
+    rev = "v${finalAttrs.version}";
     fetchSubmodules = true;
+    hash = "sha256-5c8h9bAe3Qv7PJ3PPcwMJYKPlWsmnqshe6vLIgtdDiQ=";
   };
 
   nativeBuildInputs = [
     installShellFiles
-    zig
+    zigHook
   ];
 
-  postConfigure = ''
-    export XDG_CACHE_HOME=$(mktemp -d)
-  '';
-
-  buildPhase = ''
-    runHook preBuild
-
-    zig build -Drelease-safe -Dcpu=baseline
-
-    runHook postBuild
-  '';
-
-  checkPhase = ''
-    runHook preCheck
-
-    zig build test
-
-    runHook postCheck
-  '';
-
-  installPhase = ''
-    runHook preInstall
-
-    zig build -Drelease-safe -Dcpu=baseline --prefix $out install
-
+  postInstall = ''
     installManPage man/linuxwave.1
-
-    runHook postInstall
   '';
 
-  meta = with lib; {
-    description = "Generate music from the entropy of Linux";
+  meta = {
     homepage = "https://github.com/orhun/linuxwave";
-    changelog = "https://github.com/orhun/linuxwave/blob/${src.rev}/CHANGELOG.md";
-    license = licenses.mit;
-    maintainers = with maintainers; [ figsoda ];
-    platforms = platforms.all;
+    description = "Generate music from the entropy of Linux";
+    changelog = "https://github.com/orhun/linuxwave/blob/${finalAttrs.src.rev}/CHANGELOG.md";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ figsoda ];
+    inherit (zigHook.meta) platforms;
   };
-}
+})
diff --git a/pkgs/tools/audio/picotts/default.nix b/pkgs/tools/audio/picotts/default.nix
index 5c995f407a7b..137fa838c629 100644
--- a/pkgs/tools/audio/picotts/default.nix
+++ b/pkgs/tools/audio/picotts/default.nix
@@ -1,6 +1,6 @@
 { lib, stdenv, fetchFromGitHub, autoconf, automake, libtool, popt }:
 
-stdenv.mkDerivation {
+stdenv.mkDerivation (finalAttrs: {
   pname = "picotts";
   version = "unstable-2018-10-19";
 
@@ -12,7 +12,7 @@ stdenv.mkDerivation {
   };
   nativeBuildInputs = [ autoconf automake ];
   buildInputs = [ libtool popt ];
-  sourceRoot = "source/pico";
+  sourceRoot = "${finalAttrs.src.name}/pico";
   preConfigure = "./autogen.sh";
   meta = {
     description = "Text to speech voice sinthesizer from SVox";
@@ -21,6 +21,4 @@ stdenv.mkDerivation {
     maintainers = [ lib.maintainers.canndrew ];
     platforms = lib.platforms.linux;
   };
-}
-
-
+})
diff --git a/pkgs/tools/audio/piper/default.nix b/pkgs/tools/audio/piper/default.nix
index df8ed3e969e7..d753d7bb3e1e 100644
--- a/pkgs/tools/audio/piper/default.nix
+++ b/pkgs/tools/audio/piper/default.nix
@@ -1,34 +1,33 @@
 { lib
 , stdenv
 , fetchFromGitHub
+
+# build time
 , cmake
 , pkg-config
-, espeak-ng
+
+# runtime
 , onnxruntime
 , pcaudiolib
+, piper-phonemize
+, spdlog
+
+# tests
 , piper-train
 }:
 
-let
+stdenv.mkDerivation (finalAttrs: {
   pname = "piper";
-  version = "0.0.2";
-in
-stdenv.mkDerivation {
-  inherit pname version;
+  version = "1.2.0";
 
   src = fetchFromGitHub {
     owner = "rhasspy";
     repo = "piper";
-    rev = "70afec58bc131010c8993c154ff02a78d1e7b8b0";
-    hash = "sha256-zTW7RGcV8Hh7G6Braf27F/8s7nNjAqagp7tmrKO10BY=";
+    rev = "refs/tags/v${finalAttrs.version}";
+    hash = "sha256-6WNWqJt0PO86vnf+3iHaRRg2KwBOEj4aicmB+P2phlk=";
   };
 
-  sourceRoot = "source/src/cpp";
-
-  postPatch = ''
-    substituteInPlace CMakeLists.txt \
-      --replace "/usr/local/include/onnxruntime" "${onnxruntime}"
-  '';
+  sourceRoot = "${finalAttrs.src.name}/src/cpp";
 
   nativeBuildInputs = [
     cmake
@@ -36,9 +35,15 @@ stdenv.mkDerivation {
   ];
 
   buildInputs = [
-    espeak-ng
     onnxruntime
     pcaudiolib
+    piper-phonemize
+    piper-phonemize.espeak-ng
+    spdlog
+  ];
+
+  env.NIX_CFLAGS_COMPILE = builtins.toString [
+    "-isystem ${lib.getDev piper-phonemize}/include/piper-phonemize"
   ];
 
   installPhase = ''
@@ -55,10 +60,10 @@ stdenv.mkDerivation {
   };
 
   meta = with lib; {
-    changelog = "https://github.com/rhasspy/piper/releases/tag/v${version}";
+    changelog = "https://github.com/rhasspy/piper/releases/tag/v${finalAttrs.version}";
     description = "A fast, local neural text to speech system";
     homepage = "https://github.com/rhasspy/piper";
     license = licenses.mit;
     maintainers = with maintainers; [ hexa ];
   };
-}
+})
diff --git a/pkgs/tools/audio/piper/fix-compilation-with-newer-onnxruntime.patch b/pkgs/tools/audio/piper/fix-compilation-with-newer-onnxruntime.patch
new file mode 100644
index 000000000000..9d2e46bb4e91
--- /dev/null
+++ b/pkgs/tools/audio/piper/fix-compilation-with-newer-onnxruntime.patch
@@ -0,0 +1,18 @@
+diff --git a/src/cpp/synthesize.hpp b/src/cpp/synthesize.hpp
+index ef61aef..4c7db7a 100644
+--- a/synthesize.hpp
++++ b/synthesize.hpp
+@@ -119,11 +119,11 @@ void synthesize(SynthesisConfig &synthesisConfig, ModelSession &session,
+ 
+   // Clean up
+   for (size_t i = 0; i < outputTensors.size(); i++) {
+-    Ort::OrtRelease(outputTensors[i].release());
++    Ort::detail::OrtRelease(outputTensors[i].release());
+   }
+ 
+   for (size_t i = 0; i < inputTensors.size(); i++) {
+-    Ort::OrtRelease(inputTensors[i].release());
++    Ort::detail::OrtRelease(inputTensors[i].release());
+   }
+ }
+ } // namespace larynx
diff --git a/pkgs/tools/audio/piper/train.nix b/pkgs/tools/audio/piper/train.nix
new file mode 100644
index 000000000000..2cab1ba4ba04
--- /dev/null
+++ b/pkgs/tools/audio/piper/train.nix
@@ -0,0 +1,54 @@
+{ piper-tts
+, python3
+}:
+
+let
+  python = python3.override {
+    packageOverrides = self: super: {
+    };
+  };
+in
+
+python.pkgs.buildPythonPackage {
+  inherit (piper-tts) version src;
+
+  pname = "piper-train";
+  format = "setuptools";
+
+  sourceRoot = "${piper-tts.src.name}/src/python";
+
+  nativeBuildInputs = with python.pkgs; [
+    cython
+  ];
+
+  postBuild = ''
+    make -C piper_train/vits/monotonic_align
+  '';
+
+  postInstall = ''
+    export MONOTONIC_ALIGN=$out/${python.sitePackages}/piper_train/vits/monotonic_align/monotonic_align
+    mkdir -p $MONOTONIC_ALIGN
+    cp -v ./piper_train/vits/monotonic_align/piper_train/vits/monotonic_align/core.*.so $MONOTONIC_ALIGN/
+  '';
+
+  propagatedBuildInputs = with python.pkgs; [
+    espeak-phonemizer
+    librosa
+    numpy
+    onnxruntime
+    piper-phonemize
+    pytorch-lightning
+    torch
+  ];
+
+  pythonImportsCheck = [
+    "piper_train"
+  ];
+
+  doCheck = false; # no tests
+
+  meta = piper-tts.meta // {
+    # requires torch<2, pytorch-lightning~=1.7
+    broken = true;
+  };
+}
diff --git a/pkgs/tools/audio/playerctl/default.nix b/pkgs/tools/audio/playerctl/default.nix
index d9f408bf9eda..b28ab390e01c 100644
--- a/pkgs/tools/audio/playerctl/default.nix
+++ b/pkgs/tools/audio/playerctl/default.nix
@@ -23,5 +23,6 @@ stdenv.mkDerivation rec {
     platforms = platforms.unix;
     maintainers = with maintainers; [ puffnfresh ];
     broken = stdenv.hostPlatform.isDarwin;
+    mainProgram = "playerctl";
   };
 }
diff --git a/pkgs/tools/audio/wyoming/faster-whisper-entrypoint.patch b/pkgs/tools/audio/wyoming/faster-whisper-entrypoint.patch
index 1af62cb1fe22..27a6bd082495 100644
--- a/pkgs/tools/audio/wyoming/faster-whisper-entrypoint.patch
+++ b/pkgs/tools/audio/wyoming/faster-whisper-entrypoint.patch
@@ -1,5 +1,5 @@
 diff --git a/setup.py b/setup.py
-index 1c0b2d2..bbff1d1 100644
+index 04eedbc..ee0b495 100644
 --- a/setup.py
 +++ b/setup.py
 @@ -35,4 +35,9 @@ setup(
@@ -13,17 +13,20 @@ index 1c0b2d2..bbff1d1 100644
 +    }
  )
 diff --git a/wyoming_faster_whisper/__main__.py b/wyoming_faster_whisper/__main__.py
-index 5557cc5..bb9d69f 100755
+index 8a5039f..bd1e7b6 100755
 --- a/wyoming_faster_whisper/__main__.py
 +++ b/wyoming_faster_whisper/__main__.py
-@@ -131,5 +131,9 @@ async def main() -> None:
+@@ -131,8 +131,12 @@ async def main() -> None:
  
  # -----------------------------------------------------------------------------
  
--if __name__ == "__main__":
 +def run():
-     asyncio.run(main())
++    asyncio.run(main())
 +
 +
-+if __name__ == "__main__":
-+    run()
+ if __name__ == "__main__":
+     try:
+-        asyncio.run(main())
++        run()
+     except KeyboardInterrupt:
+         pass
diff --git a/pkgs/tools/audio/wyoming/faster-whisper.nix b/pkgs/tools/audio/wyoming/faster-whisper.nix
index 747947322345..50ec99f6deee 100644
--- a/pkgs/tools/audio/wyoming/faster-whisper.nix
+++ b/pkgs/tools/audio/wyoming/faster-whisper.nix
@@ -5,13 +5,13 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "wyoming-faster-whisper";
-  version = "0.0.3";
+  version = "1.0.1";
   format = "setuptools";
 
   src = fetchPypi {
     pname = "wyoming_faster_whisper";
     inherit version;
-    hash = "sha256-uqepa70lprzV3DJK2wrNAAyZkMMJ5S86RKK716zxYU4=";
+    hash = "sha256-wo62m8gIP9hXihkd8j2haVvz3TlJv3m5WWthTPFwesk=";
   };
 
   patches = [
diff --git a/pkgs/tools/audio/wyoming/piper-entrypoint.patch b/pkgs/tools/audio/wyoming/piper-entrypoint.patch
index c2e4245e5b25..4f7d09fd40ce 100644
--- a/pkgs/tools/audio/wyoming/piper-entrypoint.patch
+++ b/pkgs/tools/audio/wyoming/piper-entrypoint.patch
@@ -1,8 +1,8 @@
 diff --git a/setup.py b/setup.py
-index 1355313..3b144c1 100644
+index 05e42c1..8347acb 100644
 --- a/setup.py
 +++ b/setup.py
-@@ -35,4 +35,9 @@ setup(
+@@ -41,4 +41,9 @@ setup(
          "Programming Language :: Python :: 3.10",
      ],
      keywords="rhasspy wyoming piper",
@@ -13,18 +13,20 @@ index 1355313..3b144c1 100644
 +    }
  )
 diff --git a/wyoming_piper/__main__.py b/wyoming_piper/__main__.py
-index f60cf13..a0a15f7 100755
+index ab1580b..4c0a143 100755
 --- a/wyoming_piper/__main__.py
 +++ b/wyoming_piper/__main__.py
-@@ -143,5 +143,9 @@ async def main() -> None:
+@@ -143,8 +143,12 @@ def get_description(voice_info: Dict[str, Any]):
  
  # -----------------------------------------------------------------------------
  
--if __name__ == "__main__":
 +def run():
-     asyncio.run(main())
++    asyncio.run(main())
 +
 +
-+if __name__ == "__main__":
-+    run()
-\ No newline at end of file
+ if __name__ == "__main__":
+     try:
+-        asyncio.run(main())
++        run()
+     except KeyboardInterrupt:
+         pass
diff --git a/pkgs/tools/audio/wyoming/piper.nix b/pkgs/tools/audio/wyoming/piper.nix
index 830f72059653..c5ce6f99005b 100644
--- a/pkgs/tools/audio/wyoming/piper.nix
+++ b/pkgs/tools/audio/wyoming/piper.nix
@@ -5,13 +5,13 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "wyoming-piper";
-  version = "0.0.3";
+  version = "1.2.0";
   format = "setuptools";
 
   src = fetchPypi {
     pname = "wyoming_piper";
     inherit version;
-    hash = "sha256-vl7LjW/2HBx6o/+vpap+wSG3XXzDwFacNmcbeU/8bOs=";
+    hash = "sha256-cdCWpejHNCjyYtIxGms9yaEerRmFnGllUN7+3uQy4mQ=";
   };
 
   patches = [
diff --git a/pkgs/tools/audio/yabridgectl/default.nix b/pkgs/tools/audio/yabridgectl/default.nix
index c57a5dbd0495..06bca00fc5b0 100644
--- a/pkgs/tools/audio/yabridgectl/default.nix
+++ b/pkgs/tools/audio/yabridgectl/default.nix
@@ -10,7 +10,7 @@ rustPlatform.buildRustPackage {
   version = yabridge.version;
 
   src = yabridge.src;
-  sourceRoot = "source/tools/yabridgectl";
+  sourceRoot = "${yabridge.src.name}/tools/yabridgectl";
   cargoLock = {
     lockFile = ./Cargo.lock;
     outputHashes = {
diff --git a/pkgs/tools/backup/hpe-ltfs/default.nix b/pkgs/tools/backup/hpe-ltfs/default.nix
index 5ce6b287e932..017df9a80073 100644
--- a/pkgs/tools/backup/hpe-ltfs/default.nix
+++ b/pkgs/tools/backup/hpe-ltfs/default.nix
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
     sha256 = "193593hsc8nf5dn1fkxhzs1z4fpjh64hdkc8q6n9fgplrpxdlr4s";
   };
 
-  sourceRoot = "source/ltfs";
+  sourceRoot = "${src.name}/ltfs";
 
   # include sys/sysctl.h is deprecated in glibc. The sysctl calls are only used
   # for Apple to determine the kernel version. Because this build only targets
diff --git a/pkgs/tools/backup/pgbackrest/default.nix b/pkgs/tools/backup/pgbackrest/default.nix
index fc86d5922eb7..3cf9ebecfff0 100644
--- a/pkgs/tools/backup/pgbackrest/default.nix
+++ b/pkgs/tools/backup/pgbackrest/default.nix
@@ -34,6 +34,7 @@ stdenv.mkDerivation rec {
     homepage = "https://pgbackrest.org/";
     changelog = "https://github.com/pgbackrest/pgbackrest/releases";
     license = licenses.mit;
+    mainProgram = "pgbackrest";
     maintainers = with maintainers; [ zaninime ];
   };
 }
diff --git a/pkgs/tools/backup/restic/0001-Skip-testing-restore-with-permission-failure.patch b/pkgs/tools/backup/restic/0001-Skip-testing-restore-with-permission-failure.patch
index 148b9a1a9579..10664b57254c 100644
--- a/pkgs/tools/backup/restic/0001-Skip-testing-restore-with-permission-failure.patch
+++ b/pkgs/tools/backup/restic/0001-Skip-testing-restore-with-permission-failure.patch
@@ -1,18 +1,18 @@
-From 8e6186be04e2819b6e3586e5d1aeb8a824e1979f Mon Sep 17 00:00:00 2001
+From 72f7d8abee34107b815e49540f2fad7f1ab0b2cc Mon Sep 17 00:00:00 2001
 From: Simon Bruder <simon@sbruder.de>
 Date: Thu, 25 Feb 2021 09:20:51 +0100
 Subject: [PATCH] Skip testing restore with permission failure
 
 The test fails in sandboxed builds.
 ---
- cmd/restic/integration_test.go | 1 +
+ cmd/restic/cmd_restore_integration_test.go | 1 +
  1 file changed, 1 insertion(+)
 
-diff --git a/cmd/restic/integration_test.go b/cmd/restic/integration_test.go
-index 7d198d33..1588ccb1 100644
---- a/cmd/restic/integration_test.go
-+++ b/cmd/restic/integration_test.go
-@@ -1170,6 +1170,7 @@ func TestRestoreLatest(t *testing.T) {
+diff --git a/cmd/restic/cmd_restore_integration_test.go b/cmd/restic/cmd_restore_integration_test.go
+index 2c7cbe1fb..f25f13754 100644
+--- a/cmd/restic/cmd_restore_integration_test.go
++++ b/cmd/restic/cmd_restore_integration_test.go
+@@ -200,6 +200,7 @@ func TestRestoreLatest(t *testing.T) {
  }
  
  func TestRestoreWithPermissionFailure(t *testing.T) {
@@ -21,5 +21,5 @@ index 7d198d33..1588ccb1 100644
  	defer cleanup()
  
 -- 
-2.29.2
+2.41.0
 
diff --git a/pkgs/tools/backup/restic/default.nix b/pkgs/tools/backup/restic/default.nix
index 28379107ada7..9a7e4d676a18 100644
--- a/pkgs/tools/backup/restic/default.nix
+++ b/pkgs/tools/backup/restic/default.nix
@@ -3,13 +3,13 @@
 
 buildGoModule rec {
   pname = "restic";
-  version = "0.15.2";
+  version = "0.16.0";
 
   src = fetchFromGitHub {
     owner = "restic";
     repo = "restic";
     rev = "v${version}";
-    hash = "sha256-YJBHk/B8+q5f0k5i5hpucsJK4T/cRu9Jv7+O6vlT64Q=";
+    hash = "sha256-kxxQlU3bKBjCb1aEtcLBmcnPg4KFgFlbFhs9MmbAgk8=";
   };
 
   patches = [
@@ -17,7 +17,7 @@ buildGoModule rec {
     ./0001-Skip-testing-restore-with-permission-failure.patch
   ];
 
-  vendorHash = "sha256-GWFaCfiE8Ph2uBTBI0E47pH+EJsMsMr1NDuaIGvyXRM=";
+  vendorHash = "sha256-m5smEyAt9RxgvUf1pZqIhgja2h8MWfEgjJ4jUgrPMPY=";
 
   subPackages = [ "cmd/restic" ];
 
@@ -26,7 +26,7 @@ buildGoModule rec {
   passthru.tests.restic = nixosTests.restic;
 
   postPatch = ''
-    rm cmd/restic/integration_fuse_test.go
+    rm cmd/restic/cmd_mount_integration_test.go
   '';
 
   postInstall = ''
diff --git a/pkgs/tools/backup/tarsnap/default.nix b/pkgs/tools/backup/tarsnap/default.nix
index 8a0e43b60085..ad7fc761d843 100644
--- a/pkgs/tools/backup/tarsnap/default.nix
+++ b/pkgs/tools/backup/tarsnap/default.nix
@@ -40,5 +40,6 @@ stdenv.mkDerivation rec {
     license     = lib.licenses.unfree;
     platforms   = lib.platforms.unix;
     maintainers = with lib.maintainers; [ thoughtpolice roconnor ];
+    mainProgram = "tarsnap";
   };
 }
diff --git a/pkgs/tools/bluetooth/blueman/default.nix b/pkgs/tools/bluetooth/blueman/default.nix
index cc4f15d1bea8..1fa18703459f 100644
--- a/pkgs/tools/bluetooth/blueman/default.nix
+++ b/pkgs/tools/bluetooth/blueman/default.nix
@@ -1,5 +1,5 @@
 { config, stdenv, lib, fetchurl, intltool, pkg-config, python3Packages, bluez, gtk3
-, obex_data_server, xdg-utils, dnsmasq, dhcp, iproute2
+, obex_data_server, xdg-utils, dnsmasq, dhcpcd, iproute2
 , gnome, librsvg, wrapGAppsHook, gobject-introspection
 , networkmanager, withPulseAudio ? config.pulseaudio or stdenv.isLinux, libpulseaudio }:
 
@@ -40,7 +40,7 @@ in stdenv.mkDerivation rec {
   ];
 
   makeWrapperArgs = [
-    "--prefix PATH ':' ${lib.makeBinPath [ dnsmasq dhcp iproute2 ]}"
+    "--prefix PATH ':' ${lib.makeBinPath [ dnsmasq dhcpcd iproute2 ]}"
     "--suffix PATH ':' ${lib.makeBinPath [ xdg-utils ]}"
   ];
 
diff --git a/pkgs/tools/cd-dvd/cdrdao/default.nix b/pkgs/tools/cd-dvd/cdrdao/default.nix
index 527d70e7a90d..959899d3b3f3 100644
--- a/pkgs/tools/cd-dvd/cdrdao/default.nix
+++ b/pkgs/tools/cd-dvd/cdrdao/default.nix
@@ -1,21 +1,60 @@
-{lib, stdenv, fetchurl, libvorbis, libmad, pkg-config, libao}:
+{
+  lib,
+  stdenv,
+  fetchurl,
+  fetchpatch,
+  pkg-config,
+  libiconv,
+  libvorbis,
+  libmad,
+  libao,
+  CoreServices,
+  IOKit,
+}:
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation (finalAttrs: {
   pname = "cdrdao";
   version = "1.2.5";
 
   src = fetchurl {
-    url = "mirror://sourceforge/cdrdao/cdrdao-${version}.tar.bz2";
+    url = "mirror://sourceforge/cdrdao/cdrdao-${finalAttrs.version}.tar.bz2";
     hash = "sha256-0ZtnyFPF26JAavqrbNeI53817r5jTKxGeVKEd8e+AbY=";
   };
 
   makeFlags = [ "RM=rm" "LN=ln" "MV=mv" ];
 
-  nativeBuildInputs = [ pkg-config ];
-  buildInputs = [ libvorbis libmad libao ];
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    libiconv
+    libvorbis
+    libmad
+    libao
+  ] ++ lib.optionals stdenv.isDarwin [
+    CoreServices
+    IOKit
+  ];
 
   hardeningDisable = [ "format" ];
 
+  patches = [
+    # Fix build on macOS SDK < 12
+    # https://github.com/cdrdao/cdrdao/pull/19
+    (fetchpatch {
+      url = "https://github.com/cdrdao/cdrdao/commit/105d72a61f510e3c47626476f9bbc9516f824ede.patch";
+      hash = "sha256-NVIw59CSrc/HcslhfbYQNK/qSmD4QbfuV8hWYhWelX4=";
+    })
+
+    # Fix undefined behaviour caused by uninitialized variable
+    # https://github.com/cdrdao/cdrdao/pull/21
+    (fetchpatch {
+      url = "https://github.com/cdrdao/cdrdao/commit/251a40ab42305c412674c7c2d391374d91e91c95.patch";
+      hash = "sha256-+nGlWw5rgc5Ns2l+6fQ4Hp2LbhO4R/I95h9WGIh/Ebw=";
+    })
+  ];
+
   # we have glibc/include/linux as a symlink to the kernel headers,
   # and the magic '..' points to kernelheaders, and not back to the glibc/include
   postPatch = ''
@@ -25,10 +64,10 @@ stdenv.mkDerivation rec {
   # Needed on gcc >= 6.
   env.NIX_CFLAGS_COMPILE = "-Wno-narrowing";
 
-  meta = with lib; {
+  meta = {
     description = "A tool for recording audio or data CD-Rs in disk-at-once (DAO) mode";
     homepage = "https://cdrdao.sourceforge.net/";
-    platforms = platforms.linux;
-    license = licenses.gpl2;
+    platforms = lib.platforms.unix;
+    license = lib.licenses.gpl2;
   };
-}
+})
diff --git a/pkgs/tools/cd-dvd/srt-to-vtt-cl/default.nix b/pkgs/tools/cd-dvd/srt-to-vtt-cl/default.nix
index 70fcedde858a..80e456d072ce 100644
--- a/pkgs/tools/cd-dvd/srt-to-vtt-cl/default.nix
+++ b/pkgs/tools/cd-dvd/srt-to-vtt-cl/default.nix
@@ -1,4 +1,4 @@
-{ lib, stdenv, fetchFromGitHub, substituteAll }:
+{ lib, stdenv, fetchFromGitHub }:
 
 stdenv.mkDerivation rec {
   pname = "srt-to-vtt-cl";
@@ -12,14 +12,13 @@ stdenv.mkDerivation rec {
   };
 
   patches = [
-    (substituteAll {
-      src = ./fix-validation.patch;
-    })
+    ./fix-validation.patch
+    ./simplify-macOS-builds.patch
   ];
 
   installPhase = ''
     mkdir -p $out/bin
-    cp bin/$(uname -s)/$(uname -m)/srt-vtt $out/bin
+    cp bin/srt-vtt $out/bin
   '';
 
   meta = with lib; {
@@ -27,6 +26,6 @@ stdenv.mkDerivation rec {
     license = licenses.mit;
     maintainers = with maintainers; [ ericdallo ];
     homepage = "https://github.com/nwoltman/srt-to-vtt-cl";
-    platforms = platforms.linux;
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/tools/cd-dvd/srt-to-vtt-cl/simplify-macOS-builds.patch b/pkgs/tools/cd-dvd/srt-to-vtt-cl/simplify-macOS-builds.patch
new file mode 100644
index 000000000000..71497f23beef
--- /dev/null
+++ b/pkgs/tools/cd-dvd/srt-to-vtt-cl/simplify-macOS-builds.patch
@@ -0,0 +1,31 @@
+From be08356f421825d3d2dd7ab687f86d9981a31f9a Mon Sep 17 00:00:00 2001
+From: "Travis A. Everett" <travis.a.everett@gmail.com>
+Date: Thu, 3 Aug 2023 20:15:40 -0500
+Subject: [PATCH] simplify macOS builds
+
+---
+ Makefile | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 6dfd829..19c3ae3 100644
+--- a/Makefile
++++ b/Makefile
+@@ -8,13 +8,7 @@ CXXFLAGS = -std=c++11 -O2 -MMD -I ./deps
+ OBJECTS := src/text_encoding_detect.o src/Utils.o src/Converter.o src/main.o
+ DEPENDS := $(OBJECTS:.o=.d)
+ EXEC = srt-vtt
+-UNAME_S := $(shell uname -s)
+-ifeq ($(UNAME_S), Darwin)
+-	BIN_DIR = bin/Mac-OSX
+-else
+-	UNAME_M := $(shell uname -m)
+-	BIN_DIR = bin/$(UNAME_S)/$(UNAME_M)
+-endif
++BIN_DIR = bin
+ EXEC_PATH = $(BIN_DIR)/$(EXEC)
+ 
+ .PHONY: test
+-- 
+2.39.0
+
diff --git a/pkgs/tools/compression/flips/default.nix b/pkgs/tools/compression/flips/default.nix
index 024ff5fbe9f1..4ba618556a70 100644
--- a/pkgs/tools/compression/flips/default.nix
+++ b/pkgs/tools/compression/flips/default.nix
@@ -2,13 +2,13 @@
 
 stdenv.mkDerivation {
   pname = "flips";
-  version = "unstable-2021-10-28";
+  version = "unstable-2023-03-15";
 
   src = fetchFromGitHub {
     owner = "Alcaro";
     repo = "Flips";
-    rev = "3a8733e74c9bdbb6b89da2b45913a0be3d0e1866";
-    sha256 = "1jik580mz2spik5mgh60h93ryaj5x8dffncnr1lwija0v803xld7";
+    rev = "fdd5c6e34285beef5b9be759c9b91390df486c66";
+    hash = "sha256-uuHgpt7aWqiMTUILm5tAEGGeZrls3g/DdylYQgsfpTw=";
   };
 
   nativeBuildInputs = [ pkg-config wrapGAppsHook ];
diff --git a/pkgs/tools/compression/flips/use-system-libdivsufsort.patch b/pkgs/tools/compression/flips/use-system-libdivsufsort.patch
index aa741decb019..d621fe3a9f40 100644
--- a/pkgs/tools/compression/flips/use-system-libdivsufsort.patch
+++ b/pkgs/tools/compression/flips/use-system-libdivsufsort.patch
@@ -1,12 +1,12 @@
 diff --git a/Makefile b/Makefile
-index c9d8b6d..9d66b0b 100644
+index b3d5aeb..a5acc08 100644
 --- a/Makefile
 +++ b/Makefile
-@@ -79,9 +79,7 @@ endif
- MOREFLAGS := $(CFLAGS_$(TARGET))
+@@ -83,9 +83,7 @@ endif
  
+ MOREFLAGS := $(CFLAGS_$(TARGET))
  
--DIVSUF := libdivsufsort-2.0.1
+-DIVSUF := $(SRCDIR)/libdivsufsort-2.0.1
 -SOURCES += $(DIVSUF)/lib/divsufsort.c $(DIVSUF)/lib/sssort.c $(DIVSUF)/lib/trsort.c
 -MOREFLAGS += -I$(DIVSUF)/include -DHAVE_CONFIG_H -D__STDC_FORMAT_MACROS
 +MOREFLAGS += -ldivsufsort
diff --git a/pkgs/tools/compression/xz/default.nix b/pkgs/tools/compression/xz/default.nix
index 44bee00d0842..adc73d926c90 100644
--- a/pkgs/tools/compression/xz/default.nix
+++ b/pkgs/tools/compression/xz/default.nix
@@ -10,11 +10,11 @@
 
 stdenv.mkDerivation rec {
   pname = "xz";
-  version = "5.4.3";
+  version = "5.4.4";
 
   src = fetchurl {
     url = "https://tukaani.org/xz/xz-${version}.tar.bz2";
-    sha256 = "sha256-kkOgRZjXpwwfVnoBQ6JVWBrFxksUD9Vf1cvB4AsOb5A=";
+    sha256 = "sha256-C2/N4aw46QQzolVvUAwGWVC5vNLWAgBu/DNHgr3+YpY=";
   };
 
   strictDeps = true;
diff --git a/pkgs/tools/filesystems/blobfuse/default.nix b/pkgs/tools/filesystems/blobfuse/default.nix
index a74d182fb356..64edc17a89f6 100644
--- a/pkgs/tools/filesystems/blobfuse/default.nix
+++ b/pkgs/tools/filesystems/blobfuse/default.nix
@@ -12,7 +12,7 @@ let
     pname = "cpplite";
     inherit version src;
 
-    sourceRoot = "source/cpplite";
+    sourceRoot = "${src.name}/cpplite";
     patches = [ ./install-adls.patch ];
 
     cmakeFlags = [ "-DBUILD_ADLS=ON" "-DUSE_OPENSSL=OFF" ];
diff --git a/pkgs/tools/filesystems/cpcfs/default.nix b/pkgs/tools/filesystems/cpcfs/default.nix
index a439e29358f7..93bfdd8d23fa 100644
--- a/pkgs/tools/filesystems/cpcfs/default.nix
+++ b/pkgs/tools/filesystems/cpcfs/default.nix
@@ -12,7 +12,7 @@ stdenv.mkDerivation rec {
     sha256 = "0rfbry0qy8mv746mzk9zdfffkdgq4w7invgb5cszjma2cp83q3i2";
   };
 
-  sourceRoot = "source/src";
+  sourceRoot = "${src.name}/src";
 
   nativeBuildInputs = [ makeWrapper ncurses readline ronn ];
 
diff --git a/pkgs/tools/filesystems/dysk/default.nix b/pkgs/tools/filesystems/dysk/default.nix
index c1e7f5b2332d..fe4e61014a63 100644
--- a/pkgs/tools/filesystems/dysk/default.nix
+++ b/pkgs/tools/filesystems/dysk/default.nix
@@ -6,16 +6,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "dysk";
-  version = "2.7.1";
+  version = "2.7.2";
 
   src = fetchFromGitHub {
     owner = "Canop";
     repo = "dysk";
     rev = "v${version}";
-    hash = "sha256-5KUTb2mSYQdkT3K5BrBCQqq45q0MzFYG1UmE+5eBnuc=";
+    hash = "sha256-3uukeuxB1GjmJ59bkgDEzgG9RMZhmB5TSv3uiXV8GNg=";
   };
 
-  cargoHash = "sha256-YmA1Qx3oKHXlXs3FWoLMRAnFdIQaFdLJaNwj/FxIS5Q=";
+  cargoHash = "sha256-td4B9/DAmASqLGO3PVLLWeO3GeDbLHI7wNcOT1qk20k=";
 
   nativeBuildInputs = [
     installShellFiles
diff --git a/pkgs/tools/filesystems/squashfuse/default.nix b/pkgs/tools/filesystems/squashfuse/default.nix
index 71243dff5de8..7f08c9f71625 100644
--- a/pkgs/tools/filesystems/squashfuse/default.nix
+++ b/pkgs/tools/filesystems/squashfuse/default.nix
@@ -4,13 +4,13 @@
 stdenv.mkDerivation rec {
 
   pname = "squashfuse";
-  version = "0.2.0";
+  version = "0.4.0";
 
   src = fetchFromGitHub {
     owner = "vasi";
     repo = pname;
     rev = version;
-    sha256 = "sha256-agapkSl4KEK+7MA2+gcfaXv6+rpG0MQAhAG5At9rXqk=";
+    sha256 = "sha256-gK1k1Ooue3HLtBmPFMZdW4h2Ee1Uy4T26EOBeQICQpM=";
   };
 
   nativeBuildInputs = [ autoreconfHook libtool pkg-config ];
diff --git a/pkgs/tools/filesystems/tar2ext4/default.nix b/pkgs/tools/filesystems/tar2ext4/default.nix
index b41d5b2c6994..6f33735f58f2 100644
--- a/pkgs/tools/filesystems/tar2ext4/default.nix
+++ b/pkgs/tools/filesystems/tar2ext4/default.nix
@@ -11,7 +11,7 @@ buildGoModule rec {
     sha256 = "sha256-+GhYeQ27uwg9JOv1qbf1+UbMd+vPXJ05nsXZD9OakzI=";
   };
 
-  sourceRoot = "source/cmd/tar2ext4";
+  sourceRoot = "${src.name}/cmd/tar2ext4";
   vendorHash = null;
 
   meta = with lib; {
diff --git a/pkgs/tools/games/dualsensectl/default.nix b/pkgs/tools/games/dualsensectl/default.nix
index f08622aa3a73..cb17ba25d7f8 100644
--- a/pkgs/tools/games/dualsensectl/default.nix
+++ b/pkgs/tools/games/dualsensectl/default.nix
@@ -9,13 +9,13 @@
 
 stdenv.mkDerivation rec {
   pname = "dualsensectl";
-  version = "0.3";
+  version = "0.4";
 
   src = fetchFromGitHub {
     owner = "nowrep";
     repo = "dualsensectl";
     rev = "v${version}";
-    hash = "sha256-OZmZ+ENBBKzRZ9jLIn9Bz7oGYrSAjZ5XlOR9fpN0cZs=";
+    hash = "sha256-DrPVzbaLO2NgjNcEFyCs2W+dlbdpBeRX1ZfFenqz7IY=";
   };
 
   postPatch = ''
diff --git a/pkgs/tools/games/steam-rom-manager/default.nix b/pkgs/tools/games/steam-rom-manager/default.nix
index b39e87fbe906..b9744015fea0 100644
--- a/pkgs/tools/games/steam-rom-manager/default.nix
+++ b/pkgs/tools/games/steam-rom-manager/default.nix
@@ -2,11 +2,11 @@
 
 appimageTools.wrapType2 rec {
   name = "steam-rom-manager";
-  version = "2.3.40";
+  version = "2.4.17";
 
   src = fetchurl {
     url = "https://github.com/SteamGridDB/steam-rom-manager/releases/download/v${version}/Steam-ROM-Manager-${version}.AppImage";
-    sha256 = "sha256-qm7F1/+3iVtsxSAptbhiI5sEHR0B9vo7AdEPy1/PANU=";
+    sha256 = "sha256-NRqryY9v6s51/eoCdqqID6m5Osx5PPChKGxjmLhh7ac=";
   };
 
   extraInstallCommands = let
diff --git a/pkgs/tools/graphics/pdftoipe/default.nix b/pkgs/tools/graphics/pdftoipe/default.nix
index fc4e0d964fdc..d7e757e679bf 100644
--- a/pkgs/tools/graphics/pdftoipe/default.nix
+++ b/pkgs/tools/graphics/pdftoipe/default.nix
@@ -35,7 +35,7 @@ stdenv.mkDerivation rec {
     })
   ];
 
-  sourceRoot = "source/pdftoipe";
+  sourceRoot = "${src.name}/pdftoipe";
 
   nativeBuildInputs = [ pkg-config ];
   buildInputs = [ poppler ];
diff --git a/pkgs/tools/graphics/realesrgan-ncnn-vulkan/default.nix b/pkgs/tools/graphics/realesrgan-ncnn-vulkan/default.nix
index 20401cd092c6..05cb130467a7 100644
--- a/pkgs/tools/graphics/realesrgan-ncnn-vulkan/default.nix
+++ b/pkgs/tools/graphics/realesrgan-ncnn-vulkan/default.nix
@@ -20,7 +20,7 @@ stdenv.mkDerivation rec {
     rev = "v${version}";
     sha256 = "sha256-eLAIlOl1sUxijeVPFG+NscZGxDdtrQqVkMuxhegESHk=";
   };
-  sourceRoot = "source/src";
+  sourceRoot = "${src.name}/src";
 
   models = fetchzip {
     # Choose the newst release from https://github.com/xinntao/Real-ESRGAN/releases to update
diff --git a/pkgs/tools/misc/autorandr/default.nix b/pkgs/tools/misc/autorandr/default.nix
index 53bc534e11e0..40a22836f77f 100644
--- a/pkgs/tools/misc/autorandr/default.nix
+++ b/pkgs/tools/misc/autorandr/default.nix
@@ -41,7 +41,10 @@ python3.pkgs.buildPythonApplication rec {
     # see https://github.com/phillipberndt/autorandr/issues/197
     installShellCompletion --cmd autorandr \
         --bash contrib/bash_completion/autorandr \
-        --zsh contrib/zsh_completion/_autorandr
+        --zsh contrib/zsh_completion/_autorandr \
+        --fish contrib/fish_copletion/autorandr.fish
+    # In the line above there's a typo that needs to be fixed in the next
+    # release
 
     make install TARGETS='autostart_config' PREFIX=$out DESTDIR=$out
 
diff --git a/pkgs/tools/misc/balanceofsatoshis/default.nix b/pkgs/tools/misc/balanceofsatoshis/default.nix
new file mode 100644
index 000000000000..b1b17e02366b
--- /dev/null
+++ b/pkgs/tools/misc/balanceofsatoshis/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+, installShellFiles
+, python3
+}:
+
+buildNpmPackage rec {
+  pname = "balanceofsatoshis";
+  version = "15.8.15";
+
+  src = fetchFromGitHub {
+    owner = "alexbosworth";
+    repo = "balanceofsatoshis";
+    rev = "v${version}";
+    hash = "sha256-8GWITeFn7ELUH7bxcNlmQvgperQutBwVUhp2yjeEWrM=";
+  };
+
+  npmDepsHash = "sha256-lTXv4pEjrzcOK68RO1K007r7dCbAyc45G8Oy8V3XLts=";
+
+  nativeBuildInputs = [
+    installShellFiles
+    python3
+  ];
+
+  dontNpmBuild = true;
+
+  npmFlags = [ "--ignore-scripts" ];
+
+  postInstall = ''
+    installShellCompletion --cmd bos \
+        --bash <($out/bin/bos completion bash) \
+        --zsh <($out/bin/bos completion zsh) \
+        --fish <($out/bin/bos completion fish)
+  '';
+
+  meta = {
+    changelog = "https://github.com/alexbosworth/balanceofsatoshis/blob/${src.rev}/CHANGELOG.md";
+    description = "Tool for working with the balance of your satoshis on LND";
+    homepage = "https://github.com/alexbosworth/balanceofsatoshis";
+    license = lib.licenses.mit;
+    mainProgram = "bos";
+    maintainers = with lib.maintainers; [ mmilata ];
+  };
+}
diff --git a/pkgs/tools/misc/barman/default.nix b/pkgs/tools/misc/barman/default.nix
index bed377663328..f310b99f811f 100644
--- a/pkgs/tools/misc/barman/default.nix
+++ b/pkgs/tools/misc/barman/default.nix
@@ -6,13 +6,13 @@
 
 python3Packages.buildPythonApplication rec {
   pname = "barman";
-  version = "3.4.0";
+  version = "3.7.0";
 
   src = fetchFromGitHub {
     owner = "EnterpriseDB";
     repo = pname;
     rev = "refs/tags/release/${version}";
-    hash = "sha256-K5y5C+K/fMhgOcSsCMaIgY6ce9UUPszoyumsfNHKjBo=";
+    hash = "sha256-5mecCg5c+fu6WUgmNEL4BR+JCild02YAuYgLwO1MGnI=";
   };
 
   patches = [
diff --git a/pkgs/tools/misc/bat/default.nix b/pkgs/tools/misc/bat/default.nix
index 31f86098a0b3..400aec1cd7f4 100644
--- a/pkgs/tools/misc/bat/default.nix
+++ b/pkgs/tools/misc/bat/default.nix
@@ -16,7 +16,7 @@ rustPlatform.buildRustPackage rec {
 
   src = fetchFromGitHub {
     owner = "sharkdp";
-    repo = pname;
+    repo = "bat";
     rev = "v${version}";
     hash = "sha256-cGHxB3Wp8yEcJBMtSOec6l7iBsMLhUtJ7nh5fijnWZs=";
   };
@@ -58,6 +58,7 @@ rustPlatform.buildRustPackage rec {
     homepage = "https://github.com/sharkdp/bat";
     changelog = "https://github.com/sharkdp/bat/raw/v${version}/CHANGELOG.md";
     license = with licenses; [ asl20 /* or */ mit ];
+    mainProgram = "bat";
     maintainers = with maintainers; [ dywedir lilyball zowoq SuperSandro2000 ];
   };
 }
diff --git a/pkgs/tools/misc/bdf2psf/default.nix b/pkgs/tools/misc/bdf2psf/default.nix
index 1a75c2ff0af0..fdcdde0c0401 100644
--- a/pkgs/tools/misc/bdf2psf/default.nix
+++ b/pkgs/tools/misc/bdf2psf/default.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "bdf2psf";
-  version = "1.221";
+  version = "1.222";
 
   src = fetchurl {
     url = "mirror://debian/pool/main/c/console-setup/bdf2psf_${version}_all.deb";
-    sha256 = "XaNAF5+TM1F0qyX/PEwRoiEvO8qmPuMWs+mkWSaHNGg=";
+    sha256 = "sha256-zGd2t2Qtec8Up1SHAizZp8l/fhFpa0Y1UJbB8XanX6Q=";
   };
 
   nativeBuildInputs = [ dpkg ];
diff --git a/pkgs/tools/misc/clipbuzz/default.nix b/pkgs/tools/misc/clipbuzz/default.nix
index aaa37ad7c18f..9d901f90a205 100644
--- a/pkgs/tools/misc/clipbuzz/default.nix
+++ b/pkgs/tools/misc/clipbuzz/default.nix
@@ -1,31 +1,33 @@
-{ stdenv, lib, fetchFromSourcehut, zig, libX11, libXfixes }:
+{ lib
+, stdenv
+, fetchFromSourcehut
+, libX11
+, libXfixes
+, zigHook
+}:
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation (finalAttrs: {
   pname = "clipbuzz";
   version = "2.0.0";
 
   src = fetchFromSourcehut {
     owner = "~cnx";
-    repo = pname;
-    rev = version;
-    sha256 = "1qn98bwp7v7blw4v0g4pckgxrky5ggvq9m0kck2kqw8jg9jc15jp";
+    repo = "clipbuzz";
+    rev = finalAttrs.version;
+    hash = "sha256-V5bAZHoScTzFZBPUhPd7xc/c32SXPLAJp+vsc/lCyeI=";
   };
 
-  nativeBuildInputs = [ zig ];
-  buildInputs = [ libX11 libXfixes ];
+  nativeBuildInputs = [ zigHook ];
 
-  preBuild = ''
-    export HOME=$TMPDIR
-  '';
+  buildInputs = [
+    libX11
+    libXfixes
+  ];
 
-  installPhase = ''
-    zig build -Drelease-safe -Dcpu=baseline --prefix $out install
-  '';
-
-  meta = with lib; {
+  meta =  {
     description = "Buzz on new X11 clipboard events";
     homepage = "https://git.sr.ht/~cnx/clipbuzz";
-    license = licenses.unlicense;
-    maintainers = [ maintainers.McSinyx ];
+    license = lib.licenses.unlicense;
+    maintainers = [ lib.maintainers.McSinyx ];
   };
-}
+})
diff --git a/pkgs/tools/misc/coreboot-utils/default.nix b/pkgs/tools/misc/coreboot-utils/default.nix
index 1ba4c0aee9eb..b96ccfd6fe7a 100644
--- a/pkgs/tools/misc/coreboot-utils/default.nix
+++ b/pkgs/tools/misc/coreboot-utils/default.nix
@@ -65,6 +65,7 @@ let
     nvramtool = generic {
       pname = "nvramtool";
       meta.description = "Read and write coreboot parameters and display information from the coreboot table in CMOS/NVRAM";
+      meta.mainProgram = "nvramtool";
     };
     superiotool = generic {
       pname = "superiotool";
diff --git a/pkgs/tools/misc/direnv/default.nix b/pkgs/tools/misc/direnv/default.nix
index 88a07cd07af9..179e719528a4 100644
--- a/pkgs/tools/misc/direnv/default.nix
+++ b/pkgs/tools/misc/direnv/default.nix
@@ -50,5 +50,6 @@ buildGoModule rec {
     homepage = "https://direnv.net";
     license = licenses.mit;
     maintainers = teams.numtide.members;
+    mainProgram = "direnv";
   };
 }
diff --git a/pkgs/tools/misc/exa/default.nix b/pkgs/tools/misc/exa/default.nix
index 91d0b1c49d09..d22303e150c9 100644
--- a/pkgs/tools/misc/exa/default.nix
+++ b/pkgs/tools/misc/exa/default.nix
@@ -58,5 +58,6 @@ rustPlatform.buildRustPackage {
     homepage = "https://the.exa.website";
     license = licenses.mit;
     maintainers = with maintainers; [ ehegnes lilyball globin fortuneteller2k ];
+    mainProgram = "exa";
   };
 }
diff --git a/pkgs/tools/misc/eza/default.nix b/pkgs/tools/misc/eza/default.nix
new file mode 100644
index 000000000000..f3b2fa0e52b8
--- /dev/null
+++ b/pkgs/tools/misc/eza/default.nix
@@ -0,0 +1,61 @@
+{ lib
+, gitSupport ? true
+, stdenv
+, fetchFromGitHub
+, rustPlatform
+, cmake
+, pandoc
+, pkg-config
+, zlib
+, Security
+, libiconv
+, installShellFiles
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "eza";
+  version = "0.10.4";
+
+  src = fetchFromGitHub {
+    owner = "cafkafk";
+    repo = "eza";
+    rev = "v${version}";
+    hash = "sha256-9Pw7DQ/QTRHNsCPen+Nn5HdvjX1ju08q+KyitPF9+xQ=";
+  };
+
+  cargoHash = "sha256-KveRmlgyree77ZDOB4hQA35F/u/ARKiAHRgHpjCXOow=";
+
+  nativeBuildInputs = [ cmake pkg-config installShellFiles pandoc ];
+  buildInputs = [ zlib ]
+    ++ lib.optionals stdenv.isDarwin [ libiconv Security ];
+
+  buildNoDefaultFeatures = true;
+  buildFeatures = lib.optional gitSupport "git";
+
+  outputs = [ "out" "man" ];
+
+  postInstall = ''
+    pandoc --standalone -f markdown -t man man/eza.1.md > man/eza.1
+    pandoc --standalone -f markdown -t man man/eza_colors.5.md > man/eza_colors.5
+    installManPage man/eza.1 man/eza_colors.5
+    installShellCompletion \
+      --bash completions/bash/eza \
+      --fish completions/fish/eza.fish \
+      --zsh completions/zsh/_eza
+  '';
+
+  meta = with lib; {
+    description = "A modern, maintained replacement for ls";
+    longDescription = ''
+      eza is a modern replacement for ls. It uses colours for information by
+      default, helping you distinguish between many types of files, such as
+      whether you are the owner, or in the owning group. It also has extra
+      features not present in the original ls, such as viewing the Git status
+      for a directory, or recursing into directories with a tree view. eza is
+      written in Rust, so it’s small, fast, and portable.
+    '';
+    homepage = "https://github.com/cafkafk/eza";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cafkafk ];
+  };
+}
diff --git a/pkgs/tools/misc/fastfetch/default.nix b/pkgs/tools/misc/fastfetch/default.nix
new file mode 100644
index 000000000000..39250dfca49b
--- /dev/null
+++ b/pkgs/tools/misc/fastfetch/default.nix
@@ -0,0 +1,123 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, chafa
+, cmake
+, dbus
+, dconf
+, glib
+, imagemagick_light
+, libglvnd
+, libpulseaudio
+, libxcb
+, libXrandr
+, makeBinaryWrapper
+, networkmanager
+, nix-update-script
+, ocl-icd
+, opencl-headers
+, pciutils
+, pkg-config
+, rpm
+, sqlite
+, testers
+, vulkan-loader
+, wayland
+, xfce
+, zlib
+, AppKit
+, Cocoa
+, CoreDisplay
+, CoreVideo
+, CoreWLAN
+, DisplayServices
+, Foundation
+, IOBluetooth
+, MediaRemote
+, OpenCL
+, moltenvk
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "fastfetch";
+  version = "1.12.2";
+
+  src = fetchFromGitHub {
+    owner = "fastfetch-cli";
+    repo = "fastfetch";
+    rev = finalAttrs.version;
+    hash = "sha256-l9fIm7+dBsOqGoFUYtpYESAjDy3496rDTUDQjbNU4U0=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    makeBinaryWrapper
+    pkg-config
+  ];
+
+  buildInputs = [
+    chafa
+    imagemagick_light
+    sqlite
+  ]
+  ++ lib.optionals stdenv.isLinux [
+    dbus
+    dconf
+    glib
+    libglvnd
+    libpulseaudio
+    libxcb
+    libXrandr
+    networkmanager
+    ocl-icd
+    opencl-headers
+    pciutils
+    rpm
+    vulkan-loader
+    wayland
+    xfce.xfconf
+    zlib
+  ]
+  ++ lib.optionals stdenv.isDarwin [
+    AppKit
+    Cocoa
+    CoreDisplay
+    CoreVideo
+    CoreWLAN
+    DisplayServices
+    Foundation
+    IOBluetooth
+    MediaRemote
+    OpenCL
+    moltenvk
+  ];
+
+  cmakeFlags = [
+    "-DCMAKE_INSTALL_SYSCONFDIR=${placeholder "out"}/etc"
+  ];
+
+  postInstall = ''
+    wrapProgram $out/bin/fastfetch \
+      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath finalAttrs.buildInputs}"
+    wrapProgram $out/bin/flashfetch \
+      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath finalAttrs.buildInputs}"
+  '';
+
+  passthru = {
+    updateScript = nix-update-script { };
+    tests.version = testers.testVersion {
+      package = finalAttrs.finalPackage;
+      command = "fastfetch -v | cut -d '(' -f 1";
+      version = "fastfetch ${finalAttrs.version}";
+    };
+  };
+
+  meta = {
+    description = "Like neofetch, but much faster because written in C";
+    inherit (finalAttrs.src.meta) homepage;
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ gerg-l khaneliman ];
+    platforms = lib.platforms.all;
+    mainProgram = "fastfetch";
+  };
+})
diff --git a/pkgs/tools/misc/file/default.nix b/pkgs/tools/misc/file/default.nix
index 45f5ed90577f..7fad2c381c3f 100644
--- a/pkgs/tools/misc/file/default.nix
+++ b/pkgs/tools/misc/file/default.nix
@@ -50,5 +50,6 @@ stdenv.mkDerivation rec {
     maintainers = with maintainers; [ doronbehar ];
     license = licenses.bsd2;
     platforms = platforms.all;
+    mainProgram = "file";
   };
 }
diff --git a/pkgs/tools/misc/findup/default.nix b/pkgs/tools/misc/findup/default.nix
index 358f4a30f3b9..11bf1918574d 100644
--- a/pkgs/tools/misc/findup/default.nix
+++ b/pkgs/tools/misc/findup/default.nix
@@ -1,39 +1,30 @@
-{ lib, stdenv, fetchFromGitHub, zig, testers, findup }:
-
-stdenv.mkDerivation rec {
+{ lib
+, stdenv
+, fetchFromGitHub
+, findup
+, testers
+, zigHook
+}:
+
+stdenv.mkDerivation (finalAttrs: {
   pname = "findup";
   version = "1.1.1";
 
   src = fetchFromGitHub {
     owner = "booniepepper";
-    repo = pname;
-    rev = "v${version}";
-    sha256 = "sha256-Tpyiy5oJQ04lqVEOFshFC0+90VoNILQ+N6Dd7lbuH/Q=";
+    repo = "findup";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-Tpyiy5oJQ04lqVEOFshFC0+90VoNILQ+N6Dd7lbuH/Q=";
   };
 
-  nativeBuildInputs = [ zig ];
-
-  # Builds and installs (at the same time) with Zig.
-  dontConfigure = true;
-  dontBuild = true;
-
-  # Give Zig a directory for intermediate work.
-  preInstall = ''
-    export HOME=$TMPDIR
-  '';
-
-  installPhase = ''
-    runHook preInstall
-    zig build -Drelease-safe -Dcpu=baseline --prefix $out
-    runHook postInstall
-  '';
+  nativeBuildInputs = [ zigHook ];
 
-  passthru.tests.version = testers.testVersion { package = findup; };
+  passthru.tests.version = testers.testVersion { package = finalAttrs.findup; };
 
-  meta = with lib; {
+  meta = {
     homepage = "https://github.com/booniepepper/findup";
     description = "Search parent directories for sentinel files";
-    license = licenses.mit;
-    maintainers = with maintainers; [ booniepepper ];
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ booniepepper ];
   };
-}
+})
diff --git a/pkgs/tools/misc/fw/default.nix b/pkgs/tools/misc/fw/default.nix
index c3cdc8289965..7cb9be3ccb55 100644
--- a/pkgs/tools/misc/fw/default.nix
+++ b/pkgs/tools/misc/fw/default.nix
@@ -4,31 +4,39 @@
 , pkg-config
 , libgit2
 , openssl
+, zlib
 , stdenv
-, Security
+, darwin
 }:
 
 rustPlatform.buildRustPackage rec {
   pname = "fw";
-  version = "2.16.1";
+  version = "2.17.1";
 
   src = fetchFromGitHub {
     owner = "brocode";
-    repo = pname;
+    repo = "fw";
     rev = "v${version}";
-    sha256 = "1nhkirjq2q9sxg4k2scy8vxlqa9ikvr5lid0f22vws07vif4kkfs";
+    hash = "sha256-8Jq7VjTKwq8n9lrwTzazkkrq8/mNacFTwz/M+eAwBWM=";
   };
 
-  cargoSha256 = "sha256-iD3SBSny0mYpmVEInYaylHn0AbtIqTOwJHdFeq3UBaM=";
+  cargoHash = "sha256-tIrACx4KRjfxLyxTiP32PpdN8NegaHBIkINsPGgygVQ=";
 
-  nativeBuildInputs = [ pkg-config ];
+  nativeBuildInputs = [
+    pkg-config
+  ];
 
-  buildInputs = [ libgit2 openssl ] ++ lib.optionals stdenv.isDarwin [
-    Security
+  buildInputs = [
+    libgit2
+    openssl
+    zlib
+  ] ++ lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.Security
   ];
 
-  OPENSSL_NO_VENDOR = 1;
-  USER = "nixbld";
+  env = {
+    OPENSSL_NO_VENDOR = true;
+  };
 
   meta = with lib; {
     description = "A workspace productivity booster";
diff --git a/pkgs/tools/misc/fwup/default.nix b/pkgs/tools/misc/fwup/default.nix
index 586e4033b034..d43914685d2c 100644
--- a/pkgs/tools/misc/fwup/default.nix
+++ b/pkgs/tools/misc/fwup/default.nix
@@ -21,13 +21,13 @@
 
 stdenv.mkDerivation rec {
   pname = "fwup";
-  version = "1.10.0";
+  version = "1.10.1";
 
   src = fetchFromGitHub {
     owner = "fhunleth";
     repo = "fwup";
     rev = "v${version}";
-    sha256 = "sha256-oFGgQa52NPNOouNHvyZoen7jDIqxckpjLFfzfbbcT/c=";
+    sha256 = "sha256-s2TlxksxGYvRqDwRA7eLlXAyT5uPK2DiL8ma1nNVz5Q=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/tools/misc/goose/default.nix b/pkgs/tools/misc/goose/default.nix
index 90eea2800880..e4e34f86d212 100644
--- a/pkgs/tools/misc/goose/default.nix
+++ b/pkgs/tools/misc/goose/default.nix
@@ -6,17 +6,17 @@
 
 buildGoModule rec {
   pname = "goose";
-  version = "3.13.4";
+  version = "3.14.0";
 
   src = fetchFromGitHub {
     owner = "pressly";
     repo = pname;
     rev = "v${version}";
-    hash = "sha256-mz7kB8ygDm23bsuQy9mYnWSGF6DDGqBtvj82s2PLDR0=";
+    hash = "sha256-4WBYfxEmEuFZM+Qt2miw6GxuV5B2nc4XXeyDQi1IISg=";
   };
 
   proxyVendor = true;
-  vendorHash = "sha256-lWlv6+Auj9YGxyJXr5WGbe4AWqJSpHE9RTY+9ZXyPVQ=";
+  vendorHash = "sha256-zsqulNAPcGVp6+ClYtRwM5U6YwRak4ttSLbgPWDxtbI=";
 
   # end-to-end tests require a docker daemon
   postPatch = ''
diff --git a/pkgs/tools/misc/hueadm/default.nix b/pkgs/tools/misc/hueadm/default.nix
new file mode 100644
index 000000000000..393f4baa955b
--- /dev/null
+++ b/pkgs/tools/misc/hueadm/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "hueadm";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "bahamas10";
+    repo = "hueadm";
+    rev = "v${version}";
+    hash = "sha256-QNjkfE8V/lUkYP8NAf11liKXILBk3wSNm3NSrgaH+nc=";
+  };
+
+  npmDepsHash = "sha256-EbwHbPe8QvT6ekH20q+ihGmwpAHykwkwoJ6vwAf0FlA=";
+
+  dontNpmBuild = true;
+
+  meta = {
+    description = "Command line management interface to Philips Hue";
+    homepage = "https://github.com/bahamas10/hueadm";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ infinisil ];
+  };
+}
diff --git a/pkgs/tools/misc/infracost/default.nix b/pkgs/tools/misc/infracost/default.nix
index babda6edacea..990cef6f6b44 100644
--- a/pkgs/tools/misc/infracost/default.nix
+++ b/pkgs/tools/misc/infracost/default.nix
@@ -2,15 +2,15 @@
 
 buildGoModule rec {
   pname = "infracost";
-  version = "0.10.26";
+  version = "0.10.27";
 
   src = fetchFromGitHub {
     owner = "infracost";
     rev = "v${version}";
     repo = "infracost";
-    sha256 = "sha256-Tw+peSlcnSge4xOXslsFT6UTz7NQsy1Sy89vP2YjI90=";
+    sha256 = "sha256-oxN1Ylrny/f72duLQQSt+Rz1h5s0BC3eUNXqh1sEL8Y=";
   };
-  vendorHash = "sha256-nObY/79e6I5PYso917rZxwVt6pwwI5BY0nguP/1yirc=";
+  vendorHash = "sha256-CGweNNOqgOiyyvVF20paO4LtvFiImQhu/kuLbXcYwwA=";
 
   ldflags = [ "-s" "-w" "-X github.com/infracost/infracost/internal/version.Version=v${version}" ];
 
diff --git a/pkgs/tools/misc/lektor/default.nix b/pkgs/tools/misc/lektor/default.nix
new file mode 100644
index 000000000000..b9c6cd4a69de
--- /dev/null
+++ b/pkgs/tools/misc/lektor/default.nix
@@ -0,0 +1,89 @@
+{ lib
+, fetchFromGitHub
+, fetchNpmDeps
+, nodejs
+, npmHooks
+, python3
+}:
+
+let
+  python = python3;
+in python.pkgs.buildPythonApplication rec {
+  pname = "lektor";
+  version = "3.4.0b8";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "lektor";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-FtmRW4AS11zAX2jvGY8XTsPrN3mhHkIWoFY7sXmqG/U=";
+  };
+
+  npmDeps = fetchNpmDeps {
+    src = "${src}/frontend";
+    hash = "sha256-Z7LP9rrVSzKoLITUarsnRbrhIw7W7TZSZUgV/OT+m0M=";
+  };
+
+  npmRoot = "frontend";
+
+  nativeBuildInputs = [
+    python.pkgs.hatch-vcs
+    python.pkgs.hatchling
+    nodejs
+    npmHooks.npmConfigHook
+  ];
+
+  env.SETUPTOOLS_SCM_PRETEND_VERSION = version;
+
+  propagatedBuildInputs = with python.pkgs; [
+    babel
+    click
+    exifread
+    filetype
+    flask
+    inifile
+    jinja2
+    markupsafe
+    marshmallow
+    marshmallow-dataclass
+    mistune
+    pillow
+    pip
+    python-slugify
+    requests
+    watchfiles
+    werkzeug
+  ];
+
+  nativeCheckInputs = with python.pkgs; [
+    pytest-click
+    pytest-mock
+    pytestCheckHook
+  ];
+
+  postInstall = ''
+    cp -r lektor/translations "$out/${python.sitePackages}/lektor/"
+  '';
+
+  pythonImportsCheck = [
+    "lektor"
+  ];
+
+  disabledTests = [
+    # Tests require network access
+    "test_path_installed_plugin_is_none"
+    "test_VirtualEnv_run_pip_install"
+    # expects FHS paths
+    "test_VirtualEnv_executable"
+  ];
+
+  meta = with lib; {
+    description = "A static content management system";
+    homepage = "https://www.getlektor.com/";
+    changelog = "https://github.com/lektor/lektor/blob/v${version}/CHANGES.md";
+    license = licenses.bsd0;
+    mainProgram = "lektor";
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/pkgs/tools/misc/ncdu/default.nix b/pkgs/tools/misc/ncdu/default.nix
index 10a80d32cd28..3cb407756f67 100644
--- a/pkgs/tools/misc/ncdu/default.nix
+++ b/pkgs/tools/misc/ncdu/default.nix
@@ -1,32 +1,33 @@
-{ lib, stdenv, fetchurl, zig, ncurses }:
-
-stdenv.mkDerivation rec {
+{ lib
+, stdenv
+, fetchurl
+, ncurses
+, zigHook
+}:
+
+stdenv.mkDerivation (finalAttrs: {
   pname = "ncdu";
   version = "2.2.2";
 
   src = fetchurl {
-    url = "https://dev.yorhel.nl/download/${pname}-${version}.tar.gz";
+    url = "https://dev.yorhel.nl/download/ncdu-${finalAttrs.version}.tar.gz";
     hash = "sha256-kNkgAk51Ixi0aXds5X4Ds8cC1JMprZglruqzbDur+ZM=";
   };
 
-  XDG_CACHE_HOME="Cache"; # FIXME This should be set in stdenv
-
   nativeBuildInputs = [
-    zig
+    zigHook
   ];
 
-  buildInputs = [ ncurses ];
-
-  PREFIX = placeholder "out";
-
-  # Avoid CPU feature impurity, see https://github.com/NixOS/nixpkgs/issues/169461
-  ZIG_FLAGS = "-Drelease-safe -Dcpu=baseline";
+  buildInputs = [
+    ncurses
+  ];
 
-  meta = with lib; {
-    description = "Disk usage analyzer with an ncurses interface";
+  meta = {
     homepage = "https://dev.yorhel.nl/ncdu";
-    license = licenses.mit;
-    platforms = platforms.all;
-    maintainers = with maintainers; [ pSub rodrgz ];
+    description = "Disk usage analyzer with an ncurses interface";
+    changelog = "https://dev.yorhel.nl/ncdu/changes2";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ pSub rodrgz ];
+    inherit (zigHook.meta) platforms;
   };
-}
+})
diff --git a/pkgs/tools/misc/nurl/default.nix b/pkgs/tools/misc/nurl/default.nix
index 00b9e990a8d5..16fec1445a57 100644
--- a/pkgs/tools/misc/nurl/default.nix
+++ b/pkgs/tools/misc/nurl/default.nix
@@ -57,5 +57,6 @@ rustPlatform.buildRustPackage rec {
     changelog = "https://github.com/nix-community/nurl/blob/v${version}/CHANGELOG.md";
     license = licenses.mpl20;
     maintainers = with maintainers; [ figsoda ];
+    mainProgram = "nurl";
   };
 }
diff --git a/pkgs/tools/misc/ollama/default.nix b/pkgs/tools/misc/ollama/default.nix
new file mode 100644
index 000000000000..784c30875953
--- /dev/null
+++ b/pkgs/tools/misc/ollama/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, stdenv
+, darwin
+}:
+
+buildGoModule rec {
+  pname = "ollama";
+  version = "0.0.12";
+
+  src = fetchFromGitHub {
+    owner = "jmorganca";
+    repo = "ollama";
+    rev = "v${version}";
+    hash = "sha256-TEifqWVgZjrQcq9eDjfRgUff9vdsO3Fx2hZZJVJZLsU=";
+  };
+
+  buildInputs = lib.optionals stdenv.isDarwin (with darwin.apple_sdk_11_0.frameworks; [
+    Accelerate
+    MetalPerformanceShaders
+    MetalKit
+  ]);
+
+  vendorHash = "sha256-KtpEqGXLpwH0NXFjb0F/SUBxP7BLEiEg3NouC0ZQOPs=";
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "Get up and running with large language models locally";
+    homepage = "https://github.com/jmorganca/ollama";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dit7ya ];
+  };
+}
diff --git a/pkgs/tools/misc/opentelemetry-collector/contrib.nix b/pkgs/tools/misc/opentelemetry-collector/contrib.nix
index 66967b9213c7..d5cddeb6e245 100644
--- a/pkgs/tools/misc/opentelemetry-collector/contrib.nix
+++ b/pkgs/tools/misc/opentelemetry-collector/contrib.nix
@@ -21,7 +21,7 @@ buildGoModule rec {
   vendorHash = "sha256-ABaRedZXPr2q2AmslVNIJUvONZa4tv7OkxBLR9GuBRE=";
 
   # there is a nested go.mod
-  sourceRoot = "source/cmd/otelcontribcol";
+  sourceRoot = "${src.name}/cmd/otelcontribcol";
 
   # upstream strongly recommends disabling CGO
   # additionally dependencies have had issues when GCO was enabled that weren't caught upstream
diff --git a/pkgs/tools/misc/opentelemetry-collector/default.nix b/pkgs/tools/misc/opentelemetry-collector/default.nix
index 76f43acf138d..1c387462a609 100644
--- a/pkgs/tools/misc/opentelemetry-collector/default.nix
+++ b/pkgs/tools/misc/opentelemetry-collector/default.nix
@@ -14,7 +14,7 @@ buildGoModule rec {
     hash = "sha256-yywmnJUTigDYeiAuK0f2511vh6sS4oD4hJLPozAlWz4=";
   };
   # there is a nested go.mod
-  sourceRoot = "source/cmd/otelcorecol";
+  sourceRoot = "${src.name}/cmd/otelcorecol";
   vendorHash = "sha256-BNIQ0pTHGgwWw1cy7au6hUeECC8oGsSkxaX5BUCRG9Y=";
 
   # upstream strongly recommends disabling CGO
diff --git a/pkgs/tools/misc/rtx/default.nix b/pkgs/tools/misc/rtx/default.nix
index f4bda68fdaa0..3aa751e28d5e 100644
--- a/pkgs/tools/misc/rtx/default.nix
+++ b/pkgs/tools/misc/rtx/default.nix
@@ -6,25 +6,27 @@
 , stdenv
 , coreutils
 , bash
+, pkg-config
+, openssl
 , direnv
 , Security
 }:
 
 rustPlatform.buildRustPackage rec {
   pname = "rtx";
-  version = "1.34.1";
+  version = "1.35.8";
 
   src = fetchFromGitHub {
     owner = "jdxcode";
     repo = "rtx";
     rev = "v${version}";
-    sha256 = "sha256-yzfiYhWZsoqqWhVBXgV0QQOe8Xcfp71e0t81+UBqiQI=";
+    hash = "sha256-oofbnZAB1a/Het5fqwDVx8Fl2aZcOhtb2/sKIF3KDFA=";
   };
 
-  cargoSha256 = "sha256-4Ac5NUADyI24TkLH5AwlGxEWHjYP8ye+D89QF1ToU4A=";
+  cargoHash = "sha256-hcDHFA20jQgUnrdvqKSNCE17yVsH7B/WUKAVZN4Ck2o=";
 
-  nativeBuildInputs = [ installShellFiles ];
-  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+  nativeBuildInputs = [ installShellFiles pkg-config ];
+  buildInputs = [ openssl  ] ++ lib.optionals stdenv.isDarwin [ Security ];
 
   postPatch = ''
     patchShebangs --build ./test/data/plugins/**/bin/* ./src/fake_asdf.rs ./src/cli/reshim.rs
@@ -64,5 +66,6 @@ rustPlatform.buildRustPackage rec {
     changelog = "https://github.com/jdxcode/rtx/releases/tag/v${version}";
     license = lib.licenses.mit;
     maintainers = with lib.maintainers; [ konradmalik ];
+    mainProgram = "rtx";
   };
 }
diff --git a/pkgs/tools/misc/rtz/Cargo.lock b/pkgs/tools/misc/rtz/Cargo.lock
index d754478f9871..80d76ab214d0 100644
--- a/pkgs/tools/misc/rtz/Cargo.lock
+++ b/pkgs/tools/misc/rtz/Cargo.lock
@@ -252,10 +252,19 @@ name = "bincode"
 version = "2.0.0-rc.3"
 source = "git+https://github.com/bincode-org/bincode.git#224e41274b089e3833a3533459f5c5758c43ab2c"
 dependencies = [
+ "bincode_derive",
  "serde",
 ]
 
 [[package]]
+name = "bincode_derive"
+version = "2.0.0-rc.3"
+source = "git+https://github.com/bincode-org/bincode.git#224e41274b089e3833a3533459f5c5758c43ab2c"
+dependencies = [
+ "virtue",
+]
+
+[[package]]
 name = "bitflags"
 version = "1.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2249,7 +2258,7 @@ dependencies = [
 
 [[package]]
 name = "rtz"
-version = "0.4.2"
+version = "0.5.3"
 dependencies = [
  "anyhow",
  "async-trait",
@@ -2281,20 +2290,19 @@ dependencies = [
  "wasm-bindgen",
  "wasm-bindgen-futures",
  "wee_alloc",
+ "zip",
 ]
 
 [[package]]
 name = "rtz-build"
-version = "0.2.3"
+version = "0.2.6"
 dependencies = [
- "reqwest",
  "rtz-core",
- "zip",
 ]
 
 [[package]]
 name = "rtz-core"
-version = "0.1.1"
+version = "0.1.4"
 dependencies = [
  "anyhow",
  "bincode",
@@ -2303,8 +2311,10 @@ dependencies = [
  "geojson",
  "pretty_assertions",
  "rayon",
+ "reqwest",
  "serde",
  "serde_json",
+ "zip",
 ]
 
 [[package]]
@@ -3112,6 +3122,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
 
 [[package]]
+name = "virtue"
+version = "0.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b522f715ead3537dc57c9907899a08e461a8f1e87fc8414a4a89bbd9854289ff"
+
+[[package]]
 name = "want"
 version = "0.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/pkgs/tools/misc/rtz/default.nix b/pkgs/tools/misc/rtz/default.nix
index c4802b803422..7ae6525e5b64 100644
--- a/pkgs/tools/misc/rtz/default.nix
+++ b/pkgs/tools/misc/rtz/default.nix
@@ -11,13 +11,13 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "rtz";
-  version = "0.4.2";
+  version = "0.5.3";
 
   src = fetchFromGitHub {
     owner = "twitchax";
     repo = "rtz";
     rev = "v${version}";
-    hash = "sha256-hxRZhUSmocHQJqrWVjT6af5zTM6KKCv4GycWlO1T6qM=";
+    hash = "sha256-cc5yGZ4zHB9V//ywvKv9qgKGDpKotzkJKbfwv1rK2tM=";
   };
 
   cargoLock = {
diff --git a/pkgs/tools/misc/star-history/default.nix b/pkgs/tools/misc/star-history/default.nix
index 789f38a7dff3..6c6ed54eec7e 100644
--- a/pkgs/tools/misc/star-history/default.nix
+++ b/pkgs/tools/misc/star-history/default.nix
@@ -9,14 +9,14 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "star-history";
-  version = "1.0.12";
+  version = "1.0.13";
 
   src = fetchCrate {
     inherit pname version;
-    sha256 = "sha256-znISDhxmAEw38TWAtA3xCZrplYs1pQ+DvfCucGDJZSU=";
+    sha256 = "sha256-WOdiBN/qyszAI4GNFB/RuZd9EV0uj9l5yUnryZ6cqSE=";
   };
 
-  cargoSha256 = "sha256-GBms5Ha7agwG5u2U+perN8Uo5ihL4QFRZh2wxlV+Wxo=";
+  cargoSha256 = "sha256-sET5Gf4vLJAvgdslT+bov9vzCKuTKCEJ0/+JR2GfhmY=";
 
   nativeBuildInputs = [ pkg-config ];
 
diff --git a/pkgs/tools/misc/starship/default.nix b/pkgs/tools/misc/starship/default.nix
index fa88b633d219..b8f7e8cdbf36 100644
--- a/pkgs/tools/misc/starship/default.nix
+++ b/pkgs/tools/misc/starship/default.nix
@@ -52,5 +52,6 @@ rustPlatform.buildRustPackage rec {
     homepage = "https://starship.rs";
     license = licenses.isc;
     maintainers = with maintainers; [ bbigras danth davidtwco Br1ght0ne Frostman marsam ];
+    mainProgram = "starship";
   };
 }
diff --git a/pkgs/tools/misc/trdl-client/default.nix b/pkgs/tools/misc/trdl-client/default.nix
index b5f4405e64df..3748f1755d18 100644
--- a/pkgs/tools/misc/trdl-client/default.nix
+++ b/pkgs/tools/misc/trdl-client/default.nix
@@ -16,7 +16,7 @@ buildGoModule rec {
     hash = "sha256-jJwRIfxmjlhfS/0+IN2IdQPlO9FkTb64PWUiLwkarfM=";
   };
 
-  sourceRoot = "source/client";
+  sourceRoot = "${src.name}/client";
 
   vendorHash = "sha256-f7FPeR+us3WvwqzcSQLbkKv905CCIAAm+HNV2FFF8OY=";
 
diff --git a/pkgs/tools/misc/usbimager/default.nix b/pkgs/tools/misc/usbimager/default.nix
index 41ae07f1775b..533f61a9c7d1 100644
--- a/pkgs/tools/misc/usbimager/default.nix
+++ b/pkgs/tools/misc/usbimager/default.nix
@@ -14,7 +14,7 @@ stdenv.mkDerivation rec {
     sha256 = "sha256-CEGUXJXqXmD8uT93T9dg49Lf5vTpAzQjdnhYmbR5zTI=";
   };
 
-  sourceRoot = "source/src/";
+  sourceRoot = "${src.name}/src/";
 
   nativeBuildInputs = [ pkg-config wrapGAppsHook ];
   buildInputs = lib.optionals withUdisks [ udisks glib ]
diff --git a/pkgs/tools/misc/vector/default.nix b/pkgs/tools/misc/vector/default.nix
index b74bd1c9e3cd..fd3a94298c62 100644
--- a/pkgs/tools/misc/vector/default.nix
+++ b/pkgs/tools/misc/vector/default.nix
@@ -126,5 +126,6 @@ rustPlatform.buildRustPackage {
     license = licenses.mpl20;
     maintainers = with maintainers; [ thoughtpolice happysalada ];
     platforms = with platforms; all;
+    mainProgram = "vector";
   };
 }
diff --git a/pkgs/tools/misc/webcat/default.nix b/pkgs/tools/misc/webcat/default.nix
index d67c02a40217..52b9e78bccaa 100644
--- a/pkgs/tools/misc/webcat/default.nix
+++ b/pkgs/tools/misc/webcat/default.nix
@@ -1,18 +1,17 @@
-{ lib, buildGoModule, fetchFromGitea, asciidoctor, installShellFiles }:
+{ lib, buildGoModule, fetchFromGitHub, asciidoctor, installShellFiles }:
 
 buildGoModule rec {
   pname = "webcat";
-  version = "unstable-2021-09-06";
+  version = "0.2.0";
 
-  src = fetchFromGitea {
-    domain = "codeberg.org";
+  src = fetchFromGitHub {
     owner = "rumpelsepp";
     repo = "webcat";
-    rev = "57a65558f0affac0b2f8f4831c52964eb9ad5386";
-    sha256 = "15c62sjr15l5hwkvc4xarfn76341wi16pjv9qbr1agaz1vqgr6rd";
+    rev = "v${version}";
+    hash = "sha256-JyZHH8JgS3uoNVicx1wj0SAzlrXyTrpwIBZuok6buRw=";
   };
 
-  vendorSha256 = "1apnra58mqrazbq53f0qlqnyyhjdvvdz995yridxva0fxmwpwcjy";
+  vendorHash = "sha256-duVp/obT+5M4Dl3BAdSgRaP3+LKmS0y51loMMdoGysw=";
 
   nativeBuildInputs = [ asciidoctor installShellFiles ];
 
diff --git a/pkgs/tools/misc/wimboot/default.nix b/pkgs/tools/misc/wimboot/default.nix
index 5499cac9a8a1..244dccce6bb0 100644
--- a/pkgs/tools/misc/wimboot/default.nix
+++ b/pkgs/tools/misc/wimboot/default.nix
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
     sha256 = "sha256-rbJONP3ge+2+WzCIpTUZeieQz9Q/MZfEUmQVbZ+9Dro=";
   };
 
-  sourceRoot = "source/src";
+  sourceRoot = "${src.name}/src";
 
   buildInputs = [ libbfd zlib libiberty ];
   makeFlags = [ "wimboot.x86_64.efi" ];
diff --git a/pkgs/tools/misc/xvfb-run/default.nix b/pkgs/tools/misc/xvfb-run/default.nix
index 7b58b9c2d93c..fc87723208ed 100644
--- a/pkgs/tools/misc/xvfb-run/default.nix
+++ b/pkgs/tools/misc/xvfb-run/default.nix
@@ -60,5 +60,6 @@ stdenvNoCC.mkDerivation rec {
     platforms = platforms.linux;
     license = licenses.gpl2;
     maintainers = [ maintainers.artturin ];
+    mainProgram = "xvfb-run";
   };
 }
diff --git a/pkgs/tools/misc/yt-dlp/default.nix b/pkgs/tools/misc/yt-dlp/default.nix
index 3fa7a9a8076b..e274222b27b7 100644
--- a/pkgs/tools/misc/yt-dlp/default.nix
+++ b/pkgs/tools/misc/yt-dlp/default.nix
@@ -77,5 +77,6 @@ buildPythonPackage rec {
     '';
     license = licenses.unlicense;
     maintainers = with maintainers; [ mkg20001 SuperSandro2000 marsam ];
+    mainProgram = "yt-dlp";
   };
 }
diff --git a/pkgs/tools/misc/zf/default.nix b/pkgs/tools/misc/zf/default.nix
index a34e85def589..1dec403dcd92 100644
--- a/pkgs/tools/misc/zf/default.nix
+++ b/pkgs/tools/misc/zf/default.nix
@@ -1,61 +1,46 @@
-{
-  lib,
-  stdenv,
-  fetchFromGitHub,
-  zig,
-  testers,
-  installShellFiles,
-  zf,
+{ lib
+, stdenv
+, fetchFromGitHub
+, installShellFiles
+, testers
+, zf
+, zigHook
 }:
-stdenv.mkDerivation rec {
+
+stdenv.mkDerivation (finalAttrs: {
   pname = "zf";
   version = "0.8.0";
 
   src = fetchFromGitHub {
     owner = "natecraddock";
-    repo = pname;
-    rev = "refs/tags/${version}";
+    repo = "zf";
+    rev = "refs/tags/${finalAttrs.version}";
     fetchSubmodules = true;
     hash = "sha256-MzlSU5x2lb6PJZ/iNAi2aebfuClBprlfHMIG/4OPmuc=";
   };
 
-  nativeBuildInputs = [ zig installShellFiles ];
-
-  preBuild = ''
-    export HOME=$TMPDIR
-  '';
-
-  buildPhase = ''
-    runHook preBuild
-    zig build -Drelease-safe -Dcpu=baseline
-    runHook postBuild
-  '';
+  nativeBuildInputs = [
+    installShellFiles
+    zigHook
+  ];
 
-  doCheck = true;
-  checkPhase = ''
-    runHook preCheck
-    zig build test
-    runHook postCheck
-  '';
+  doCheck = false; # it's failing somehow
 
-  installPhase = ''
-    runHook preInstall
-    zig build -Drelease-safe -Dcpu=baseline --prefix $out install
+  postInstall = ''
     installManPage doc/zf.1
     installShellCompletion \
       --bash complete/zf \
       --fish complete/zf.fish \
       --zsh complete/_zf
-    runHook postInstall
   '';
 
-  passthru.tests.version = testers.testVersion {package = zf;};
+  passthru.tests.version = testers.testVersion { package = finalAttrs.zf; };
 
-  meta = with lib; {
+  meta = {
     homepage = "https://github.com/natecraddock/zf";
     description = "A commandline fuzzy finder that prioritizes matches on filenames";
-    license = licenses.mit;
-    platforms = platforms.unix;
-    maintainers = with maintainers; [ dit7ya mmlb ];
+    license = lib.licenses.mit;
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [ dit7ya mmlb ];
   };
-}
+})
diff --git a/pkgs/tools/misc/zoxide/default.nix b/pkgs/tools/misc/zoxide/default.nix
index 8d311223be75..cba030c8a653 100644
--- a/pkgs/tools/misc/zoxide/default.nix
+++ b/pkgs/tools/misc/zoxide/default.nix
@@ -10,13 +10,13 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "zoxide";
-  version = "0.9.1";
+  version = "0.9.2";
 
   src = fetchFromGitHub {
     owner = "ajeetdsouza";
     repo = "zoxide";
     rev = "v${version}";
-    sha256 = "sha256-qmT/gTkizZpyYN/YdobBq2vunGM5SpNpCHIFmg8nPhk=";
+    sha256 = "sha256-h/T3McaKKASwQt+0SBBxFXMnYyt+0Xl+5i8IulUAdnU=";
   };
 
   nativeBuildInputs = [ installShellFiles ];
@@ -28,7 +28,7 @@ rustPlatform.buildRustPackage rec {
       --replace '"fzf"' '"${fzf}/bin/fzf"'
   '';
 
-  cargoSha256 = "sha256-1sW6bvRJJp+qT5A9+l8wN3TQuzFDiBoeLyY5JvAA7dQ=";
+  cargoSha256 = "sha256-uu7zi6prnfbi4EQ0+0QcTEo/t5CIwNEQgJkIgxSk5u4=";
 
   postInstall = ''
     installManPage man/man*/*
diff --git a/pkgs/tools/networking/airgeddon/default.nix b/pkgs/tools/networking/airgeddon/default.nix
index 6ef64222fba8..5574a877c0d0 100644
--- a/pkgs/tools/networking/airgeddon/default.nix
+++ b/pkgs/tools/networking/airgeddon/default.nix
@@ -29,7 +29,6 @@
 , bettercap
 , bully
 , crunch
-, dhcp
 , dnsmasq
 , ettercap
 , hashcat
@@ -94,7 +93,6 @@ let
     wireshark-cli
   ] ++ lib.optionals supportEvilTwin [
     bettercap
-    dhcp
     dnsmasq
     ettercap
     hostapd
diff --git a/pkgs/tools/networking/bitmask-vpn/default.nix b/pkgs/tools/networking/bitmask-vpn/default.nix
index 8924924448e4..7d0c09107d6e 100644
--- a/pkgs/tools/networking/bitmask-vpn/default.nix
+++ b/pkgs/tools/networking/bitmask-vpn/default.nix
@@ -39,7 +39,7 @@ let
   # and may one day be replaced by pkg/helper
   bitmask-root = mkDerivation {
     inherit src version;
-    sourceRoot = "source/helpers";
+    sourceRoot = "${src.name}/helpers";
     pname = "bitmask-root";
     nativeBuildInputs = [ python3Packages.wrapPython ];
     postPatch = ''
diff --git a/pkgs/tools/networking/castnow/default.nix b/pkgs/tools/networking/castnow/default.nix
new file mode 100644
index 000000000000..43a15a2c1c10
--- /dev/null
+++ b/pkgs/tools/networking/castnow/default.nix
@@ -0,0 +1,27 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "castnow";
+  version = "0.6.0";
+
+  src = fetchFromGitHub {
+    owner = "xat";
+    repo = "castnow";
+    rev = "v${version}";
+    hash = "sha256-vAjeDPH+Lu/vj3GhwytXqpbSkg5hKpXsMRNV+8TUeio=";
+  };
+
+  npmDepsHash = "sha256-1cLuti3JHpMHn1sno8gE8Ko+eoUWCqFUfIDIBAS+M34=";
+
+  dontNpmBuild = true;
+
+  meta = {
+    description = "Command-line Chromecast player";
+    homepage = "commandline chromecast player";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ ];
+  };
+}
diff --git a/pkgs/tools/networking/clash-meta/default.nix b/pkgs/tools/networking/clash-meta/default.nix
index 244eab7809b9..c7275db6c0a6 100644
--- a/pkgs/tools/networking/clash-meta/default.nix
+++ b/pkgs/tools/networking/clash-meta/default.nix
@@ -40,5 +40,6 @@ buildGoModule rec {
     homepage = "https://github.com/MetaCubeX/Clash.Meta";
     license = licenses.gpl3Only;
     maintainers = with maintainers; [ oluceps ];
+    mainProgram = "clash-meta";
   };
 }
diff --git a/pkgs/tools/networking/clash/default.nix b/pkgs/tools/networking/clash/default.nix
index 6ddf423657fa..7eba0e1f2150 100644
--- a/pkgs/tools/networking/clash/default.nix
+++ b/pkgs/tools/networking/clash/default.nix
@@ -40,5 +40,6 @@ buildGoModule rec {
     changelog = "https://github.com/Dreamacro/clash/releases/tag/v${version}";
     license = licenses.gpl3Only;
     maintainers = with maintainers; [ contrun Br1ght0ne ];
+    mainProgram = "clash";
   };
 }
diff --git a/pkgs/tools/networking/curl/default.nix b/pkgs/tools/networking/curl/default.nix
index 11698bf25915..c15325a49e4d 100644
--- a/pkgs/tools/networking/curl/default.nix
+++ b/pkgs/tools/networking/curl/default.nix
@@ -196,5 +196,6 @@ stdenv.mkDerivation (finalAttrs: {
     # Fails to link against static brotli or gss
     broken = stdenv.hostPlatform.isStatic && (brotliSupport || gssSupport);
     pkgConfigModules = [ "libcurl" ];
+    mainProgram = "curl";
   };
 })
diff --git a/pkgs/tools/networking/dae/default.nix b/pkgs/tools/networking/dae/default.nix
index 8e5d792dc705..7abd3975eaff 100644
--- a/pkgs/tools/networking/dae/default.nix
+++ b/pkgs/tools/networking/dae/default.nix
@@ -9,17 +9,17 @@
 }:
 buildGoModule rec {
   pname = "dae";
-  version = "0.2.2";
+  version = "0.2.3";
 
   src = fetchFromGitHub {
     owner = "daeuniverse";
-    repo = pname;
+    repo = "dae";
     rev = "v${version}";
-    sha256 = "sha256-PAdhIhX2hXCgg3NAZR0k8d1I/qQ8Cs8bNT6s6tZ5t4E=";
+    hash = "sha256-Fk3xpQ8xuZMPulMFZb5fnN0Tisk13XRx49vBN5coanQ=";
     fetchSubmodules = true;
   };
 
-  vendorHash = "sha256-DCEvE2ES7GwiXKyD7tRlykqiIaKdmo7TczutPeGurKw=";
+  vendorHash = "sha256-sqcImm5BYTiUnBmcpWWMR1TuV877VE5gZ8Oth8AxjSg=";
 
   proxyVendor = true;
 
diff --git a/pkgs/tools/networking/dd-agent/integrations-core.nix b/pkgs/tools/networking/dd-agent/integrations-core.nix
index 8e0ed84e8a06..e4ecdd2ad850 100644
--- a/pkgs/tools/networking/dd-agent/integrations-core.nix
+++ b/pkgs/tools/networking/dd-agent/integrations-core.nix
@@ -51,7 +51,7 @@ let
     inherit src version;
     name = "datadog-integration-${pname}-${version}";
 
-    sourceRoot = "source/${args.sourceRoot or pname}";
+    sourceRoot = "${src.name}/${args.sourceRoot or pname}";
     doCheck = false;
   });
 
diff --git a/pkgs/tools/networking/dhcp/default.nix b/pkgs/tools/networking/dhcp/default.nix
deleted file mode 100644
index 1d07843cc48b..000000000000
--- a/pkgs/tools/networking/dhcp/default.nix
+++ /dev/null
@@ -1,102 +0,0 @@
-{ stdenv, fetchurl, perl, file, nettools, iputils, iproute2, makeWrapper
-, coreutils, gnused, openldap ? null
-, buildPackages, lib
-
-# client and relay are end of life, remove after 4.4.3
-, withClient ? false
-, withRelay ? false
-}:
-
-stdenv.mkDerivation rec {
-  pname = "dhcp";
-  version = "4.4.3-P1";
-
-  src = fetchurl {
-    url = "https://ftp.isc.org/isc/dhcp/${version}/${pname}-${version}.tar.gz";
-    sha256 = "sha256-CsQWu1WZfKhjIXT9EHN/1hzbjbonUhYKM1d1vCHcc8c=";
-  };
-
-  patches =
-    [
-      # Make sure that the hostname gets set on reboot.  Without this
-      # patch, the hostname doesn't get set properly if the old
-      # hostname (i.e. before reboot) is equal to the new hostname.
-      ./set-hostname.patch
-    ];
-
-  nativeBuildInputs = [ perl makeWrapper ];
-
-  buildInputs = [ openldap ];
-
-  depsBuildBuild = [ buildPackages.stdenv.cc ];
-
-  configureFlags = [
-    "--enable-failover"
-    "--enable-execute"
-    "--enable-tracing"
-    "--enable-delayed-ack"
-    "--enable-dhcpv6"
-    "--enable-paranoia"
-    "--enable-early-chroot"
-    "--sysconfdir=/etc"
-    "--localstatedir=/var"
-  ] ++ lib.optional stdenv.isLinux "--with-randomdev=/dev/random"
-    ++ lib.optionals (openldap != null) [ "--with-ldap" "--with-ldapcrypto" ]
-    ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) "BUILD_CC=$(CC_FOR_BUILD)";
-
-  env.NIX_CFLAGS_COMPILE = builtins.toString [
-    "-Wno-error=pointer-compare"
-    "-Wno-error=format-truncation"
-    "-Wno-error=stringop-truncation"
-    "-Wno-error=format-overflow"
-    "-Wno-error=stringop-overflow=8"
-  ];
-
-  installFlags = [ "DESTDIR=\${out}" ];
-
-  postInstall =
-    ''
-      mv $out/$out/* $out
-      DIR=$out/$out
-      while rmdir $DIR 2>/dev/null; do
-        DIR="$(dirname "$DIR")"
-      done
-
-      cp client/scripts/linux $out/sbin/dhclient-script
-      substituteInPlace $out/sbin/dhclient-script \
-        --replace /sbin/ip ${iproute2}/sbin/ip
-      wrapProgram "$out/sbin/dhclient-script" --prefix PATH : \
-        "${nettools}/bin:${nettools}/sbin:${iputils}/bin:${coreutils}/bin:${gnused}/bin"
-    '' + lib.optionalString (!withClient) ''
-      rm $out/sbin/{dhclient,dhclient-script,.dhclient-script-wrapped}
-    '' + lib.optionalString (!withRelay) ''
-      rm $out/sbin/dhcrelay
-    '';
-
-  preConfigure =
-    ''
-      substituteInPlace configure --replace "/usr/bin/file" "${file}/bin/file"
-      sed -i "includes/dhcpd.h" \
-          -e "s|^ *#define \+_PATH_DHCLIENT_SCRIPT.*$|#define _PATH_DHCLIENT_SCRIPT \"$out/sbin/dhclient-script\"|g"
-
-      export AR='${stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}ar'
-    '';
-
-  enableParallelBuilding = true;
-
-  meta = with lib; {
-    description = "Dynamic Host Configuration Protocol (DHCP) tools";
-
-    longDescription = ''
-      ISC's Dynamic Host Configuration Protocol (DHCP) distribution
-      provides a freely redistributable reference implementation of
-      all aspects of DHCP, through a suite of DHCP tools: server,
-      client, and relay agent.
-   '';
-
-    homepage = "https://www.isc.org/dhcp/";
-    license = licenses.mpl20;
-    platforms = platforms.unix;
-    knownVulnerabilities = lib.optional (withClient || withRelay) "The client and relay component of the dhcp package have reached their end of life";
-  };
-}
diff --git a/pkgs/tools/networking/dhcp/set-hostname.patch b/pkgs/tools/networking/dhcp/set-hostname.patch
deleted file mode 100644
index 7aa9d0814514..000000000000
--- a/pkgs/tools/networking/dhcp/set-hostname.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/client/scripts/linux	2010-09-15 00:49:48.000000000 +0200
-+++ b/client/scripts/linux	2011-04-01 16:08:10.984372269 +0200
-@@ -133,9 +133,7 @@
-            [ "$current_hostname" = '(none)' ] ||
-            [ "$current_hostname" = 'localhost' ] ||
-            [ "$current_hostname" = "$old_host_name" ]; then
--           if [ "$new_host_name" != "$old_host_name" ]; then
--               hostname "$new_host_name"
--           fi
-+           hostname "$new_host_name"
-         fi
-     fi
diff --git a/pkgs/tools/networking/dnsproxy/default.nix b/pkgs/tools/networking/dnsproxy/default.nix
index 47746cd13d46..aaa2ed1459a3 100644
--- a/pkgs/tools/networking/dnsproxy/default.nix
+++ b/pkgs/tools/networking/dnsproxy/default.nix
@@ -2,13 +2,13 @@
 
 buildGoModule rec {
   pname = "dnsproxy";
-  version = "0.51.0";
+  version = "0.52.0";
 
   src = fetchFromGitHub {
     owner = "AdguardTeam";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-82RBNMCcEe2gB1Ygbm1S6UgMPUQ+Lm37zc1JM3Ca/gg=";
+    sha256 = "sha256-vHiC7RWPba4LlS0YX088HqS3hLGEt0jHKzL7DcysEkw=";
   };
 
   vendorHash = null;
diff --git a/pkgs/tools/networking/dq/default.nix b/pkgs/tools/networking/dq/default.nix
new file mode 100644
index 000000000000..e166a19ce4dd
--- /dev/null
+++ b/pkgs/tools/networking/dq/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, installShellFiles }:
+
+stdenv.mkDerivation rec {
+  pname = "dq";
+  version = "20230101";
+
+  src = fetchFromGitHub {
+    owner = "janmojzis";
+    repo = "dq";
+    rev = "refs/tags/${version}";
+    hash = "sha256-K96yOonOYSsz26Bf/vx9XtWs7xyY0Dpxdd55OMbQz8k=";
+  };
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 dq dqcache dqcache-makekey dqcache-start -t $out/bin
+    installManPage man/*
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Recursive DNS/DNSCurve server and comandline tool";
+    homepage = "https://github.com/janmojzis/dq";
+    changelog = "https://github.com/janmojzis/dq/releases/tag/${version}";
+    license = licenses.cc0;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ sikmir ];
+  };
+}
diff --git a/pkgs/tools/networking/frp/default.nix b/pkgs/tools/networking/frp/default.nix
index 31206964f3dd..078d80af10eb 100644
--- a/pkgs/tools/networking/frp/default.nix
+++ b/pkgs/tools/networking/frp/default.nix
@@ -2,16 +2,16 @@
 
 buildGoModule rec {
   pname = "frp";
-  version = "0.51.1";
+  version = "0.51.2";
 
   src = fetchFromGitHub {
     owner = "fatedier";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-B15GyMk4tYbhj4QGpona0CK89WyIkPnH6QMxmd8BS+w=";
+    sha256 = "sha256-uiF27qGHwAg05o9thCxIf6Z2xhMnKzhDgMKTuS6IJ8A=";
   };
 
-  vendorHash = "sha256-JNBQO4rZmtBKIAQAikQDyREQ3Kw1CG6pC9HouJQ5dh4=";
+  vendorHash = "sha256-sqlBgEfIWuDnGsepSZtrgxmG/DoP+Hc4c3nOpo8S/Ks=";
 
   doCheck = false;
 
diff --git a/pkgs/tools/networking/gnirehtet/default.nix b/pkgs/tools/networking/gnirehtet/default.nix
index 5f6e0db6d581..be511c756587 100644
--- a/pkgs/tools/networking/gnirehtet/default.nix
+++ b/pkgs/tools/networking/gnirehtet/default.nix
@@ -21,7 +21,7 @@ apk = stdenv.mkDerivation {
   '';
 };
 in
-rustPlatform.buildRustPackage {
+rustPlatform.buildRustPackage rec {
   pname = "gnirehtet";
   inherit version;
 
@@ -35,7 +35,7 @@ rustPlatform.buildRustPackage {
     inherit apk;
   };
 
-  sourceRoot = "source/relay-rust";
+  sourceRoot = "${src.name}/relay-rust";
 
   cargoHash = "sha256-3oVWFMFzYsuCec1wxZiHXW6O45qbdL1npqYrg/m4SPc=";
 
diff --git a/pkgs/tools/networking/goimapnotify/default.nix b/pkgs/tools/networking/goimapnotify/default.nix
index 5df6013855a3..e7f7faac5cf4 100644
--- a/pkgs/tools/networking/goimapnotify/default.nix
+++ b/pkgs/tools/networking/goimapnotify/default.nix
@@ -25,5 +25,6 @@ buildGoModule rec {
     homepage = "https://gitlab.com/shackra/goimapnotify";
     license = licenses.gpl3Plus;
     maintainers = with maintainers; [ wohanley ];
+    mainProgram = "goimapnotify";
   };
 }
diff --git a/pkgs/tools/networking/gping/default.nix b/pkgs/tools/networking/gping/default.nix
index 59d3d6b314b0..6e9e32f361e1 100644
--- a/pkgs/tools/networking/gping/default.nix
+++ b/pkgs/tools/networking/gping/default.nix
@@ -2,6 +2,7 @@
 , stdenv
 , rustPlatform
 , fetchFromGitHub
+, installShellFiles
 , libiconv
 , Security
 , iputils
@@ -9,21 +10,27 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "gping";
-  version = "1.13.1";
+  version = "1.14.0";
 
   src = fetchFromGitHub {
     owner = "orf";
     repo = "gping";
     rev = "gping-v${version}";
-    hash = "sha256-EkoOHyHYcbyqtT1zCq0kmXND1eSADE7QD3QQ01RJtvM=";
+    hash = "sha256-ReP+s2p0X39LVvl3/QF7fsYkU+OvsQyMhyuH8v4HuVU=";
   };
 
-  cargoHash = "sha256-iDB3ZIlSLEBf+nSxLeQcE93nqMjH29w+z7kwCNksuSk=";
+  cargoHash = "sha256-FTiNxCoEe/iMz68F1CpJHypgrhn4WwwWowuN9I1rl6E=";
 
   buildInputs = lib.optionals stdenv.isDarwin [ libiconv Security ];
 
+  nativeBuildInputs = [ installShellFiles ];
+
   nativeCheckInputs = lib.optionals stdenv.isLinux [ iputils ];
 
+  postInstall = ''
+    installManPage gping.1
+  '';
+
   doInstallCheck = true;
   installCheckPhase = ''
     $out/bin/gping --version | grep "${version}"
diff --git a/pkgs/tools/networking/gupnp-tools/default.nix b/pkgs/tools/networking/gupnp-tools/default.nix
index 8341cf1e7e22..a54ea88b1ce9 100644
--- a/pkgs/tools/networking/gupnp-tools/default.nix
+++ b/pkgs/tools/networking/gupnp-tools/default.nix
@@ -17,11 +17,11 @@
 
 stdenv.mkDerivation rec {
   pname = "gupnp-tools";
-  version = "0.12.0";
+  version = "0.12.1";
 
   src = fetchurl {
     url = "mirror://gnome/sources/${pname}/${lib.versions.majorMinor version}/${pname}-${version}.tar.xz";
-    sha256 = "XqdgfuNlZCxVWSf+3FteH+COdPBh0MPrCL2QG16yAII=";
+    sha256 = "U8+TEj85fo+PC46eQ2TIanUCpTNPTAvi4FSoJEeL1bo=";
   };
 
   nativeBuildInputs = [
@@ -42,6 +42,7 @@ stdenv.mkDerivation rec {
   ];
 
   # new libxml2 version
+  # TODO: can be dropped on next update
   NIX_CFLAGS_COMPILE = [ "-Wno-error=deprecated-declarations" ];
 
   passthru = {
diff --git a/pkgs/tools/networking/gvproxy/default.nix b/pkgs/tools/networking/gvproxy/default.nix
index 4c6e69c600b4..d0e831bf1bd8 100644
--- a/pkgs/tools/networking/gvproxy/default.nix
+++ b/pkgs/tools/networking/gvproxy/default.nix
@@ -2,13 +2,13 @@
 
 buildGoModule rec {
   pname = "gvproxy";
-  version = "0.6.2";
+  version = "0.7.0";
 
   src = fetchFromGitHub {
     owner = "containers";
     repo = "gvisor-tap-vsock";
     rev = "v${version}";
-    hash = "sha256-3WBL+ByYSiYKXzFkeoUnCxTdhvy3XxLKUHgJ2hO6oIo=";
+    hash = "sha256-BCRUMAM/OeFf4gftYwLrRmeCkRGplYaF9QZ1ZI2YLLY=";
   };
 
   vendorHash = null;
diff --git a/pkgs/tools/networking/haproxy/default.nix b/pkgs/tools/networking/haproxy/default.nix
index 2b69064a1417..b7c39d83d896 100644
--- a/pkgs/tools/networking/haproxy/default.nix
+++ b/pkgs/tools/networking/haproxy/default.nix
@@ -1,21 +1,28 @@
 { useLua ? true
 , usePcre ? true
 , withPrometheusExporter ? true
-, stdenv, lib, fetchurl, nixosTests
-, openssl, zlib, libxcrypt
-, lua5_3 ? null, pcre ? null, systemd ? null
+, stdenv
+, lib
+, fetchurl
+, nixosTests
+, openssl
+, zlib
+, libxcrypt
+, lua5_3 ? null
+, pcre ? null
+, systemd ? null
 }:
 
 assert useLua -> lua5_3 != null;
 assert usePcre -> pcre != null;
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation (finalAttrs: {
   pname = "haproxy";
   version = "2.8.1";
 
   src = fetchurl {
-    url = "https://www.haproxy.org/download/${lib.versions.majorMinor version}/src/${pname}-${version}.tar.gz";
-    sha256 = "sha256-SFVS/NnV1fQarQRvEx/Ap+hJvvJaNJoEB1CvDG/FaAc=";
+    url = "https://www.haproxy.org/download/${lib.versions.majorMinor finalAttrs.version}/src/haproxy-${finalAttrs.version}.tar.gz";
+    hash = "sha256-SFVS/NnV1fQarQRvEx/Ap+hJvvJaNJoEB1CvDG/FaAc=";
   };
 
   buildInputs = [ openssl zlib libxcrypt ]
@@ -26,10 +33,10 @@ stdenv.mkDerivation rec {
   # TODO: make it work on bsd as well
   makeFlags = [
     "PREFIX=${placeholder "out"}"
-    ("TARGET=" + (if stdenv.isSunOS  then "solaris"
-             else if stdenv.isLinux  then "linux-glibc"
-             else if stdenv.isDarwin then "osx"
-             else "generic"))
+    ("TARGET=" + (if stdenv.isSunOS then "solaris"
+    else if stdenv.isLinux then "linux-glibc"
+    else if stdenv.isDarwin then "osx"
+    else "generic"))
   ];
 
   buildFlags = [
@@ -54,8 +61,11 @@ stdenv.mkDerivation rec {
 
   passthru.tests.haproxy = nixosTests.haproxy;
 
-  meta = with lib; {
+  meta = {
+    changelog = "https://www.haproxy.org/download/${lib.versions.majorMinor finalAttrs.version}/src/CHANGELOG";
     description = "Reliable, high performance TCP/HTTP load balancer";
+    homepage = "https://haproxy.org";
+    license = with lib.licenses; [ gpl2Plus lgpl21Only ];
     longDescription = ''
       HAProxy is a free, very fast and reliable solution offering high
       availability, load balancing, and proxying for TCP and HTTP-based
@@ -64,10 +74,7 @@ stdenv.mkDerivation rec {
       tens of thousands of connections is clearly realistic with todays
       hardware.
     '';
-    homepage = "https://haproxy.org";
-    changelog = "https://www.haproxy.org/download/${lib.versions.majorMinor version}/src/CHANGELOG";
-    license = with licenses; [ gpl2Plus lgpl21Only ];
-    maintainers = with maintainers; [ ];
-    platforms = with platforms; linux ++ darwin;
+    maintainers = with lib.maintainers; [ ];
+    platforms = with lib.platforms; linux ++ darwin;
   };
-}
+})
diff --git a/pkgs/tools/networking/junkie/default.nix b/pkgs/tools/networking/junkie/default.nix
index 9f7b4350f1b1..87c0fc6ae2a7 100644
--- a/pkgs/tools/networking/junkie/default.nix
+++ b/pkgs/tools/networking/junkie/default.nix
@@ -1,4 +1,4 @@
-{ lib, stdenv, fetchFromGitHub, fetchpatch, autoreconfHook, pkg-config, libpcap, guile, openssl }:
+{ lib, stdenv, fetchFromGitHub, fetchpatch, autoreconfHook, pkg-config, libpcap, guile_2_2, openssl }:
 
 stdenv.mkDerivation rec {
   pname = "junkie";
@@ -25,7 +25,7 @@ stdenv.mkDerivation rec {
     sed -i '10i#undef IP_DONTFRAG' include/junkie/proto/ip.h
   '';
 
-  buildInputs = [ libpcap guile openssl ];
+  buildInputs = [ libpcap guile_2_2 openssl ];
   nativeBuildInputs = [ autoreconfHook pkg-config ];
   configureFlags = [
     "GUILELIBDIR=\${out}/share/guile/site"
diff --git a/pkgs/tools/networking/kea/default.nix b/pkgs/tools/networking/kea/default.nix
index 9ee9a3df0f75..2c5b064a165f 100644
--- a/pkgs/tools/networking/kea/default.nix
+++ b/pkgs/tools/networking/kea/default.nix
@@ -80,6 +80,8 @@ stdenv.mkDerivation rec {
     kea = nixosTests.kea;
     prefix-delegation = nixosTests.systemd-networkd-ipv6-prefix-delegation;
     prometheus-exporter = nixosTests.prometheus-exporters.kea;
+    networking-scripted = lib.recurseIntoAttrs { inherit (nixosTests.networking.scripted) dhcpDefault dhcpSimple dhcpOneIf; };
+    networking-networkd = lib.recurseIntoAttrs { inherit (nixosTests.networking.networkd) dhcpDefault dhcpSimple dhcpOneIf; };
   };
 
   meta = with lib; {
diff --git a/pkgs/tools/networking/mailutils/default.nix b/pkgs/tools/networking/mailutils/default.nix
index 6ed8b2fc4b5b..2fa7f78f4937 100644
--- a/pkgs/tools/networking/mailutils/default.nix
+++ b/pkgs/tools/networking/mailutils/default.nix
@@ -12,7 +12,7 @@
 , gdbm
 , gnutls
 , gss
-, guile
+, guile_2_2
 , libmysqlclient
 , mailcap
 , nettools
@@ -69,7 +69,7 @@ stdenv.mkDerivation rec {
     libxcrypt
   ] ++ lib.optionals stdenv.isLinux [ nettools ]
   ++ lib.optionals pythonSupport [ python3 ]
-  ++ lib.optionals guileSupport [ guile ];
+  ++ lib.optionals guileSupport [ guile_2_2 ];
 
   patches = [
     ./fix-build-mb-len-max.patch
diff --git a/pkgs/tools/networking/minio-client/default.nix b/pkgs/tools/networking/minio-client/default.nix
index baab57c400d8..f685acc04982 100644
--- a/pkgs/tools/networking/minio-client/default.nix
+++ b/pkgs/tools/networking/minio-client/default.nix
@@ -2,16 +2,16 @@
 
 buildGoModule rec {
   pname = "minio-client";
-  version = "2023-07-11T23-30-44Z";
+  version = "2023-07-21T20-44-27Z";
 
   src = fetchFromGitHub {
     owner = "minio";
     repo = "mc";
     rev = "RELEASE.${version}";
-    sha256 = "sha256-hCHPDzdMqu36fICiyVhMDHhfOHxBzUl5+YfjnWbrRFk=";
+    sha256 = "sha256-y0+AGDI4zxMgcC65U51/UHW2mo0NNNKc+MQCcFevHmk=";
   };
 
-  vendorHash = "sha256-W3FenwPwfEQxJWym6QzqMczWtygPN65Hp4gjj/karMw=";
+  vendorHash = "sha256-6duYIeNkqql9y1Wo+foMe88dmPmHZ625FBTDdKsHnCE=";
 
   subPackages = [ "." ];
 
diff --git a/pkgs/tools/networking/mqttmultimeter/default.nix b/pkgs/tools/networking/mqttmultimeter/default.nix
index ddc04bab78b9..1edb48a62cbb 100644
--- a/pkgs/tools/networking/mqttmultimeter/default.nix
+++ b/pkgs/tools/networking/mqttmultimeter/default.nix
@@ -41,7 +41,7 @@ buildDotnetModule rec {
     hash = "sha256-/XQ5HD0dBfFn3ERlLwHknS9Fyd3YMpKHBXuvMwRXcQ8=";
   };
 
-  sourceRoot = "source/Source";
+  sourceRoot = "${src.name}/Source";
 
   projectFile = [ "mqttMultimeter.sln" ];
   nugetDeps = ./deps.nix;
diff --git a/pkgs/tools/networking/nzbget/default.nix b/pkgs/tools/networking/nzbget/default.nix
index 9141a2932bbb..4e67e81a7de8 100644
--- a/pkgs/tools/networking/nzbget/default.nix
+++ b/pkgs/tools/networking/nzbget/default.nix
@@ -1,11 +1,12 @@
 { lib
 , stdenv
-, fetchurl
-, fetchpatch
+, fetchFromGitHub
+, autoreconfHook
 , pkg-config
 , gnutls
 , libgcrypt
 , libpar2
+, libcap
 , libsigcxx
 , libxml2
 , ncurses
@@ -14,31 +15,24 @@
 , nixosTests
 }:
 
-stdenv.mkDerivation rec {
-  pname = "nzbget";
-  version = "21.1";
+stdenv.mkDerivation (finalAttrs: {
+  pname = "nzbget-ng";
+  version = "21.4-rc2";
 
-  src = fetchurl {
-    url = "https://github.com/nzbget/nzbget/releases/download/v${version}/nzbget-${version}-src.tar.gz";
-    hash = "sha256-To/BvrgNwq8tajajOjP0Te3d1EhgAsZE9MR5MEMHICU=";
+  src = fetchFromGitHub {
+    owner = "nzbget-ng";
+    repo = "nzbget";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-JJML5mtAog5xC7DkthCtoyn5QeC2Z+fdzSuEa/Te0Ew=";
   };
 
-  patches = [
-    # openssl 3 compatibility
-    # https://github.com/nzbget/nzbget/pull/793
-    (fetchpatch {
-      name = "daemon-connect-dont-use-fips-mode-set-with-openssl-3.patch";
-      url = "https://github.com/nzbget/nzbget/commit/f76e8555504e3af4cf8dd4a8c8e374b3ca025099.patch";
-      hash = "sha256-39lvnhBK4126TYsRbJOUxsV9s9Hjuviw7CH/wWn/VkM=";
-    })
-  ];
-
-  nativeBuildInputs = [ pkg-config ];
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
 
   buildInputs = [
     gnutls
     libgcrypt
     libpar2
+    libcap
     libsigcxx
     libxml2
     ncurses
@@ -46,15 +40,20 @@ stdenv.mkDerivation rec {
     zlib
   ];
 
+  prePatch = ''
+    sed -i 's/AC_INIT.*/AC_INIT( nzbget, m4_esyscmd_s( echo ${finalAttrs.version} ) )/' configure.ac
+  '';
+
   enableParallelBuilding = true;
 
   passthru.tests = { inherit (nixosTests) nzbget; };
 
   meta = with lib; {
-    homepage = "https://nzbget.net";
+    homepage = "https://nzbget-ng.github.io/";
+    changelog = "https://github.com/nzbget-ng/nzbget/releases/tag/v${finalAttrs.version}";
     license = licenses.gpl2Plus;
     description = "A command line tool for downloading files from news servers";
     maintainers = with maintainers; [ pSub ];
     platforms = with platforms; unix;
   };
-}
+})
diff --git a/pkgs/tools/networking/pgrok/default.nix b/pkgs/tools/networking/pgrok/default.nix
index 8fafcccd0707..6074746e9749 100644
--- a/pkgs/tools/networking/pgrok/default.nix
+++ b/pkgs/tools/networking/pgrok/default.nix
@@ -6,15 +6,15 @@
 
 buildGoModule rec {
   pname = "pgrok";
-  version = "1.3.3";
+  version = "1.3.4";
 
   src = fetchFromGitHub {
     owner = "pgrok";
     repo = "pgrok";
     rev = "v${version}";
-    hash = "sha256-0b7d3wyhRuTxZmpx9oJnZN88yYn+TsR82KrktPAx9P4=";
+    hash = "sha256-lhcaJVIqZK7GnC/Q/+RDxTVFmgTana3vugDHr/SStFE=";
   };
-  vendorHash = "sha256-laSfyHFkJJkv4EPMIVcai7RXaGIpUp+0tOpt5vhcLkA=";
+  vendorHash = "sha256-UzNx361cg4IDSQGlX5N9AxYZ8cYA0zsF5JF4Fe7efqM=";
 
   outputs = [ "out" "server" ];
 
diff --git a/pkgs/tools/networking/proxify/default.nix b/pkgs/tools/networking/proxify/default.nix
index 27cc53522b71..331d00cc2c58 100644
--- a/pkgs/tools/networking/proxify/default.nix
+++ b/pkgs/tools/networking/proxify/default.nix
@@ -5,16 +5,16 @@
 
 buildGoModule rec {
   pname = "proxify";
-  version = "0.0.10";
+  version = "0.0.11";
 
   src = fetchFromGitHub {
     owner = "projectdiscovery";
     repo = "proxify";
     rev = "refs/tags/v${version}";
-    hash = "sha256-bEAPj72HDiJHTN1WF50ow1OUwwsPhFwAkCvvEqgsVcA=";
+    hash = "sha256-aoge1K1T4jgh8TFN8nFIjFehmz/o1UefbzEbV85dHTk=";
   };
 
-  vendorHash = "sha256-ViUMPHj1udvyy19XToq3f7Bj708v6DuBg5k0tMtZmHA=";
+  vendorHash = "sha256-ingumSn4EDdw1Vgwm/ghQTsErqFVFZtjNfwfDwdJ/2s=";
 
   meta = with lib; {
     description = "Proxy tool for HTTP/HTTPS traffic capture";
diff --git a/pkgs/tools/networking/pykms/default.nix b/pkgs/tools/networking/pykms/default.nix
index fac532110d2f..a8dcbbebe141 100644
--- a/pkgs/tools/networking/pykms/default.nix
+++ b/pkgs/tools/networking/pykms/default.nix
@@ -43,7 +43,7 @@ pypkgs.buildPythonApplication rec {
     hash = "sha256-9KiMbS0uKTbWSZVIv5ziIeR9c8+EKfKd20yPmjCX7GQ=";
   };
 
-  sourceRoot = "source/py-kms";
+  sourceRoot = "${src.name}/py-kms";
 
   propagatedBuildInputs = with pypkgs; [ systemd pytz tzlocal dnspython ];
 
diff --git a/pkgs/tools/networking/ratman/default.nix b/pkgs/tools/networking/ratman/default.nix
index 5ddab7850fae..ce017731bd4a 100644
--- a/pkgs/tools/networking/ratman/default.nix
+++ b/pkgs/tools/networking/ratman/default.nix
@@ -42,7 +42,7 @@ rustPlatform.buildRustPackage rec {
   dashboard = stdenv.mkDerivation rec {
     pname = "ratman-dashboard";
     inherit version src;
-    sourceRoot = "source/ratman/dashboard";
+    sourceRoot = "${src.name}/ratman/dashboard";
 
     yarnDeps = fetchYarnDeps {
       yarnLock = src + "/ratman/dashboard/yarn.lock";
diff --git a/pkgs/tools/networking/reaver-wps-t6x/default.nix b/pkgs/tools/networking/reaver-wps-t6x/default.nix
index cd3d1bfed694..83479a6d88ed 100644
--- a/pkgs/tools/networking/reaver-wps-t6x/default.nix
+++ b/pkgs/tools/networking/reaver-wps-t6x/default.nix
@@ -14,7 +14,7 @@ stdenv.mkDerivation rec {
   nativeBuildInputs = [ makeWrapper ];
   buildInputs = [ libpcap pixiewps ];
 
-  sourceRoot = "source/src";
+  sourceRoot = "${src.name}/src";
 
   meta = with lib; {
     description = "Online and offline brute force attack against WPS";
diff --git a/pkgs/tools/networking/sing-box/default.nix b/pkgs/tools/networking/sing-box/default.nix
index d8f3858d59bb..e2f126a0baa3 100644
--- a/pkgs/tools/networking/sing-box/default.nix
+++ b/pkgs/tools/networking/sing-box/default.nix
@@ -11,16 +11,16 @@
 
 buildGoModule rec {
   pname = "sing-box";
-  version = "1.3.4";
+  version = "1.3.5";
 
   src = fetchFromGitHub {
     owner = "SagerNet";
     repo = pname;
     rev = "v${version}";
-    hash = "sha256-0/3y9aIhKzWIvt8iWcrJwQreBkSLcoPQ55gyTp48ysg=";
+    hash = "sha256-fSQuVvV2dL+cdPIAqyXbDB8OSW77gxaYaOHKElEbq6o=";
   };
 
-  vendorHash = "sha256-G6//YPNWhgTJf6nv+9KRExCclotsmk7TzzuxXmdiVVU=";
+  vendorHash = "sha256-AMtDAAKNbKRFcu9OEW9E+S73gGgXK7HaroEdidrXS4Y=";
 
   tags = [
     "with_quic"
diff --git a/pkgs/tools/networking/sitespeed-io/default.nix b/pkgs/tools/networking/sitespeed-io/default.nix
index 40949e6725ae..f7b71b2fb4ca 100644
--- a/pkgs/tools/networking/sitespeed-io/default.nix
+++ b/pkgs/tools/networking/sitespeed-io/default.nix
@@ -87,5 +87,6 @@ buildNpmPackage rec {
     license = licenses.mit;
     maintainers = with maintainers; [ misterio77 ];
     platforms = lib.unique (geckodriver.meta.platforms ++ chromedriver.meta.platforms);
+    mainProgram = "sitespeed-io";
   };
 }
diff --git a/pkgs/tools/networking/sleep-on-lan/default.nix b/pkgs/tools/networking/sleep-on-lan/default.nix
index 96a9b63e9129..98f4cfb44481 100644
--- a/pkgs/tools/networking/sleep-on-lan/default.nix
+++ b/pkgs/tools/networking/sleep-on-lan/default.nix
@@ -14,7 +14,7 @@ buildGoModule rec {
     sha256 = "sha256-WooFGIdXIIoJPMqmPpnT+bc+P+IARMSxa3CvXY9++mw=";
   };
 
-  sourceRoot = "source/src";
+  sourceRoot = "${src.name}/src";
   vendorSha256 = "sha256-JqDDG53khtDdMLVOscwqi0oGviF+3DMkv5tkHvp1gJc=";
 
   ldflags = [
diff --git a/pkgs/tools/networking/socat/default.nix b/pkgs/tools/networking/socat/default.nix
index 00c0ad7bd131..c34aa7ab4c22 100644
--- a/pkgs/tools/networking/socat/default.nix
+++ b/pkgs/tools/networking/socat/default.nix
@@ -41,5 +41,6 @@ stdenv.mkDerivation rec {
     platforms = platforms.unix;
     license = with licenses; [ gpl2Only ];
     maintainers = with maintainers; [ eelco ];
+    mainProgram = "socat";
   };
 }
diff --git a/pkgs/tools/networking/vegeta/default.nix b/pkgs/tools/networking/vegeta/default.nix
index 7fbb4127c086..17efa4336bf5 100644
--- a/pkgs/tools/networking/vegeta/default.nix
+++ b/pkgs/tools/networking/vegeta/default.nix
@@ -5,17 +5,17 @@
 
 buildGoModule rec {
   pname = "vegeta";
-  version = "12.10.0";
+  version = "12.11.0";
   rev = "e04d9c0df8177e8633bff4afe7b39c2f3a9e7dea";
 
   src = fetchFromGitHub {
     owner = "tsenart";
     repo = "vegeta";
     rev = "v${version}";
-    sha256 = "sha256-lBJXMI/OVxgi4AqAFKE6cXLBagUZzUTRzvcJBr0Wh/c=";
+    sha256 = "sha256-dqVwz4nc+QDD5M2ajLtnoEnvaka/n6KxqCvRH63Za4g=";
   };
 
-  vendorHash = "sha256-QWI2T1yJBATgCyGlR2dPbnBLn9KHQgfc30mPdMKzGsQ=";
+  vendorHash = "sha256-Pq8MRfwYhgk5YWEmBisBrV2F7Ztn18MdpRFZ9r/1y7A=";
 
   subPackages = [ "." ];
 
diff --git a/pkgs/tools/networking/wgautomesh/default.nix b/pkgs/tools/networking/wgautomesh/default.nix
index 823987888a31..a9843e2efa17 100644
--- a/pkgs/tools/networking/wgautomesh/default.nix
+++ b/pkgs/tools/networking/wgautomesh/default.nix
@@ -21,5 +21,6 @@ rustPlatform.buildRustPackage rec {
     homepage = "https://git.deuxfleurs.fr/Deuxfleurs/wgautomesh";
     license = licenses.agpl3Only;
     maintainers = [ maintainers.lx ];
+    mainProgram = "wgautomesh";
   };
 }
diff --git a/pkgs/tools/networking/whois/default.nix b/pkgs/tools/networking/whois/default.nix
index f4fa1e9c475e..20c6c5e36525 100644
--- a/pkgs/tools/networking/whois/default.nix
+++ b/pkgs/tools/networking/whois/default.nix
@@ -1,14 +1,14 @@
 { lib, stdenv, fetchFromGitHub, perl, gettext, pkg-config, libidn2, libiconv }:
 
 stdenv.mkDerivation rec {
-  version = "5.5.17";
+  version = "5.5.18";
   pname = "whois";
 
   src = fetchFromGitHub {
     owner = "rfc1036";
     repo = "whois";
     rev = "v${version}";
-    sha256 = "sha256-Nqnbi2nS95nzyzFNdahSKY/Om30sZXRJhoCSrzRiD9c=";
+    hash = "sha256-KHOKjblyCP1GykQehmxSKf7vP52wRRH6oz9WbE9fbCk=";
   };
 
   nativeBuildInputs = [ perl gettext pkg-config ];
diff --git a/pkgs/tools/networking/wireguard-tools/default.nix b/pkgs/tools/networking/wireguard-tools/default.nix
index 6d19aea8040d..08ef1fdae272 100644
--- a/pkgs/tools/networking/wireguard-tools/default.nix
+++ b/pkgs/tools/networking/wireguard-tools/default.nix
@@ -21,7 +21,7 @@ stdenv.mkDerivation rec {
 
   outputs = [ "out" "man" ];
 
-  sourceRoot = "source/src";
+  sourceRoot = "${src.name}/src";
 
   nativeBuildInputs = [ makeWrapper ];
 
diff --git a/pkgs/tools/nix/alejandra/default.nix b/pkgs/tools/nix/alejandra/default.nix
index 73f114d96ef9..0e5d59ee8f88 100644
--- a/pkgs/tools/nix/alejandra/default.nix
+++ b/pkgs/tools/nix/alejandra/default.nix
@@ -28,5 +28,6 @@ rustPlatform.buildRustPackage rec {
     changelog = "https://github.com/kamadorueda/alejandra/blob/${version}/CHANGELOG.md";
     license = licenses.unlicense;
     maintainers = with maintainers; [ _0x4A6F kamadorueda sciencentistguy ];
+    mainProgram = "alejandra";
   };
 }
diff --git a/pkgs/tools/nix/nixpkgs-fmt/default.nix b/pkgs/tools/nix/nixpkgs-fmt/default.nix
index 793f19e53329..b7f73c7eb795 100644
--- a/pkgs/tools/nix/nixpkgs-fmt/default.nix
+++ b/pkgs/tools/nix/nixpkgs-fmt/default.nix
@@ -17,5 +17,6 @@ rustPlatform.buildRustPackage rec {
     homepage = "https://nix-community.github.io/nixpkgs-fmt";
     license = licenses.asl20;
     maintainers = with maintainers; [ zimbatm ];
+    mainProgram = "nixpkgs-fmt";
   };
 }
diff --git a/pkgs/tools/nix/statix/default.nix b/pkgs/tools/nix/statix/default.nix
index e4e3cb857503..1ae3a8525a8f 100644
--- a/pkgs/tools/nix/statix/default.nix
+++ b/pkgs/tools/nix/statix/default.nix
@@ -25,6 +25,7 @@ rustPlatform.buildRustPackage rec {
     description = "Lints and suggestions for the nix programming language";
     homepage = "https://github.com/nerdypepper/statix";
     license = licenses.mit;
+    mainProgram = "statix";
     maintainers = with maintainers; [ figsoda nerdypepper ];
   };
 }
diff --git a/pkgs/tools/package-management/harmonia/default.nix b/pkgs/tools/package-management/harmonia/default.nix
index 5b815261fbc4..cee9301d5943 100644
--- a/pkgs/tools/package-management/harmonia/default.nix
+++ b/pkgs/tools/package-management/harmonia/default.nix
@@ -44,5 +44,6 @@ rustPlatform.buildRustPackage rec {
     homepage = "https://github.com/nix-community/harmonia";
     license = licenses.mit;
     maintainers = with maintainers; [ mic92 ];
+    mainProgram = "harmonia";
   };
 }
diff --git a/pkgs/tools/package-management/home-manager/default.nix b/pkgs/tools/package-management/home-manager/default.nix
index c65b244cb96f..15a9ee3b1a96 100644
--- a/pkgs/tools/package-management/home-manager/default.nix
+++ b/pkgs/tools/package-management/home-manager/default.nix
@@ -14,7 +14,7 @@
 , unstableGitUpdater
 }:
 
-stdenvNoCC.mkDerivation {
+stdenvNoCC.mkDerivation (finalAttrs: {
   pname = "home-manager";
   version = "2023-05-30";
 
@@ -55,7 +55,7 @@ stdenvNoCC.mkDerivation {
         ]
       }" \
       --subst-var-by HOME_MANAGER_LIB '${placeholder "out"}/share/bash/home-manager.sh' \
-      --subst-var-by HOME_MANAGER_PATH "" \
+      --subst-var-by HOME_MANAGER_PATH "${finalAttrs.src}" \
       --subst-var-by OUT '${placeholder "out"}'
 
     installShellCompletion --bash --name home-manager.bash home-manager/completion.bash
@@ -85,8 +85,8 @@ stdenvNoCC.mkDerivation {
       found in Nixpkgs. It allows declarative configuration of user specific
       (non global) packages and dotfiles.
     '';
-    platforms = lib.platforms.unix;
     license = lib.licenses.mit;
     maintainers = with lib.maintainers; [ AndersonTorres ];
+    platforms = lib.platforms.unix;
   };
-}
+})
diff --git a/pkgs/tools/package-management/nix-update/default.nix b/pkgs/tools/package-management/nix-update/default.nix
index efbf2037f227..130e36c858cf 100644
--- a/pkgs/tools/package-management/nix-update/default.nix
+++ b/pkgs/tools/package-management/nix-update/default.nix
@@ -9,14 +9,14 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "nix-update";
-  version = "0.19.0";
+  version = "0.19.2";
   format = "setuptools";
 
   src = fetchFromGitHub {
     owner = "Mic92";
     repo = pname;
     rev = version;
-    hash = "sha256-v58x48la837gbqMaQ6PEl9Ick1NH+Y4okf2yttDzqC4=";
+    hash = "sha256-FyQcsKCHsAB8BmPxeIZdiidaxyNi/5bFA/ilGydDVM0=";
   };
 
   makeWrapperArgs = [
diff --git a/pkgs/tools/package-management/nix/common.nix b/pkgs/tools/package-management/nix/common.nix
index e79f0f5e3bbe..609d0da08afa 100644
--- a/pkgs/tools/package-management/nix/common.nix
+++ b/pkgs/tools/package-management/nix/common.nix
@@ -241,6 +241,7 @@ self = stdenv.mkDerivation {
     maintainers = with maintainers; [ eelco lovesegfault artturin ];
     platforms = platforms.unix;
     outputsToInstall = [ "out" ] ++ optional enableDocumentation "man";
+    mainProgram = "nix";
   };
 };
 in self
diff --git a/pkgs/tools/security/arti/default.nix b/pkgs/tools/security/arti/default.nix
index e0b553a8e441..c746bb8557c3 100644
--- a/pkgs/tools/security/arti/default.nix
+++ b/pkgs/tools/security/arti/default.nix
@@ -10,7 +10,7 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "arti";
-  version = "1.1.6";
+  version = "1.1.7";
 
   src = fetchFromGitLab {
     domain = "gitlab.torproject.org";
@@ -18,10 +18,10 @@ rustPlatform.buildRustPackage rec {
     owner = "core";
     repo = "arti";
     rev = "arti-v${version}";
-    sha256 = "sha256-6VmpBt1KxWRdZJLVPNeqETQnZITGoX+rz29eIiOnHnU=";
+    sha256 = "sha256-RUBSF6zG+LpBopnCo/mj+Sr+iFz95Ce0p0/RNIOuRCg=";
   };
 
-  cargoHash = "sha256-Q/1zgfF1v3D5Mg+JhS0K9mF4BN9xHV2tf7AtsBHZGh0=";
+  cargoHash = "sha256-ngIrAaQY3aWPridH67ZKACbFRkP8BeZ1W1wji6IPBAA=";
 
   nativeBuildInputs = lib.optionals stdenv.isLinux [ pkg-config ];
 
diff --git a/pkgs/tools/security/b2sum/default.nix b/pkgs/tools/security/b2sum/default.nix
index 2b08da598fa3..1f0f2a2bf0cb 100644
--- a/pkgs/tools/security/b2sum/default.nix
+++ b/pkgs/tools/security/b2sum/default.nix
@@ -18,7 +18,7 @@ stdenv.mkDerivation (finalAttrs: {
       --replace "FILES=b2sum.c ../sse/" "#FILES=b2sum.c ../sse/"
   '';
 
-  sourceRoot = "source/b2sum";
+  sourceRoot = "${finalAttrs.src.name}/b2sum";
 
   buildInputs = [ openmp ];
 
diff --git a/pkgs/tools/security/bitwarden/default.nix b/pkgs/tools/security/bitwarden/default.nix
index db618f4ec4c3..a9b902f80d3b 100644
--- a/pkgs/tools/security/bitwarden/default.nix
+++ b/pkgs/tools/security/bitwarden/default.nix
@@ -41,7 +41,7 @@ let
   desktop-native = rustPlatform.buildRustPackage {
     pname = "bitwarden-desktop-native";
     inherit src version;
-    sourceRoot = "source-patched/apps/desktop/desktop_native";
+    sourceRoot = "${src.name}/apps/desktop/desktop_native";
     cargoSha256 = "sha256-8U4E5q2OSZGXy2ZRn0y4Skm5Y+FiOJVU1mtzObO9UqY=";
 
     nativeBuildInputs = [
diff --git a/pkgs/tools/security/dnsrecon/default.nix b/pkgs/tools/security/dnsrecon/default.nix
index a63205d9ba06..65fae4928c6f 100644
--- a/pkgs/tools/security/dnsrecon/default.nix
+++ b/pkgs/tools/security/dnsrecon/default.nix
@@ -5,16 +5,22 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "dnsrecon";
-  version = "1.1.4";
+  version = "1.1.5";
   format = "setuptools";
 
   src = fetchFromGitHub {
     owner = "darkoperator";
     repo = pname;
     rev = version;
-    hash = "sha256-DtyYYNtv0Zk8103NN+vlnr3Etv0bAZ6+A2CXeZZgiUg=";
+    hash = "sha256-W7ZFc+kF00ANoYVTlsY+lJ9FjMEGbqYfNojoZFiRHU8=";
   };
 
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "flake8" "" \
+      --replace "pytest" ""
+  '';
+
   propagatedBuildInputs = with python3.pkgs; [
     dnspython
     netaddr
diff --git a/pkgs/tools/security/donkey/default.nix b/pkgs/tools/security/donkey/default.nix
index 8244d7f0c298..514df406f3b9 100644
--- a/pkgs/tools/security/donkey/default.nix
+++ b/pkgs/tools/security/donkey/default.nix
@@ -17,7 +17,7 @@ stdenv.mkDerivation rec {
     rev = "tags/release/${version}";
     hash = "sha256-2xgb9l0Eko39HJVROAWEIP3qLg5t/5h/rm2MoXoKnJI=";
   };
-  sourceRoot = "source/src";
+  sourceRoot = "${src.name}/src";
 
   buildInputs = [ libmd ];
 
diff --git a/pkgs/tools/security/exploitdb/default.nix b/pkgs/tools/security/exploitdb/default.nix
index 96ad353e8fbe..251b585d7ac7 100644
--- a/pkgs/tools/security/exploitdb/default.nix
+++ b/pkgs/tools/security/exploitdb/default.nix
@@ -6,13 +6,13 @@
 
 stdenv.mkDerivation rec {
   pname = "exploitdb";
-  version = "2023-07-29";
+  version = "2023-08-03";
 
   src = fetchFromGitLab {
     owner = "exploit-database";
     repo = pname;
     rev = "refs/tags/${version}";
-    hash = "sha256-/e6nemEoaWcx9A4KvweQgsQkNMdPX+PLerKv//vVQPQ=";
+    hash = "sha256-mS77s3wBVGRxGrPxjOCi5QN82N2N4pIPrxz5JczaIBc=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/tools/security/fulcio/default.nix b/pkgs/tools/security/fulcio/default.nix
index 5beb23d424a8..61e01daa0fe6 100644
--- a/pkgs/tools/security/fulcio/default.nix
+++ b/pkgs/tools/security/fulcio/default.nix
@@ -2,13 +2,13 @@
 
 buildGoModule rec {
   pname = "fulcio";
-  version = "1.3.4";
+  version = "1.4.0";
 
   src = fetchFromGitHub {
     owner = "sigstore";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-HJ1hTq6Mwt4f8r92ZNpL/Aco9dzIpxBH9ZSA3h1P4/A=";
+    sha256 = "sha256-9FDHMhL2vWyS5o04E3nML/pCL+juA87ZAEU6naIPCdc=";
     # populate values that require us to use git. By doing this in postFetch we
     # can delete .git afterwards and maintain better reproducibility of the src.
     leaveDotGit = true;
@@ -20,7 +20,7 @@ buildGoModule rec {
       find "$out" -name .git -print0 | xargs -0 rm -rf
     '';
   };
-  vendorHash = "sha256-zbh/NWA9or3dIeAwQ/sUOKrq03d3KVa5G5JkPbissr8=";
+  vendorHash = "sha256-dEBHhgy4dyorVbP1TloPTa1h6U/923bYrXX4qiRa/2w=";
 
   nativeBuildInputs = [ installShellFiles ];
 
diff --git a/pkgs/tools/security/grype/default.nix b/pkgs/tools/security/grype/default.nix
index 3b096f8869d0..cb21ecb119c7 100644
--- a/pkgs/tools/security/grype/default.nix
+++ b/pkgs/tools/security/grype/default.nix
@@ -7,13 +7,13 @@
 
 buildGoModule rec {
   pname = "grype";
-  version = "0.65.0";
+  version = "0.65.1";
 
   src = fetchFromGitHub {
     owner = "anchore";
     repo = pname;
     rev = "refs/tags/v${version}";
-    hash = "sha256-Dqjdl0fco3t8/jVt9/7pwXzoKapctU3T+ixkKTQ6sAE=";
+    hash = "sha256-hmjg1W1E1pdrHxPA7qbEJP0R1mEiV0P54+y+RXxKH4c=";
     # populate values that require us to use git. By doing this in postFetch we
     # can delete .git afterwards and maintain better reproducibility of the src.
     leaveDotGit = true;
diff --git a/pkgs/tools/security/hashcat-utils/default.nix b/pkgs/tools/security/hashcat-utils/default.nix
index ccd6230b06f2..f252c7eedce7 100644
--- a/pkgs/tools/security/hashcat-utils/default.nix
+++ b/pkgs/tools/security/hashcat-utils/default.nix
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
     sha256 = "0wgc6wv7i6cs95rgzzx3zqm14xxbjyajvcqylz8w97d8kk4x4wjr";
   };
 
-  sourceRoot = "source/src";
+  sourceRoot = "${src.name}/src";
 
   installPhase = ''
     runHook preInstall
diff --git a/pkgs/tools/security/jwx/default.nix b/pkgs/tools/security/jwx/default.nix
index da39777074c6..fb5c2c59f11e 100644
--- a/pkgs/tools/security/jwx/default.nix
+++ b/pkgs/tools/security/jwx/default.nix
@@ -16,7 +16,7 @@ buildGoModule rec {
 
   vendorHash = "sha256-RyAQh1uXw3bEZ6vuh8+mEf8T4l3ZIFAaFJ6dGMoANys=";
 
-  sourceRoot = "source/cmd/jwx";
+  sourceRoot = "${src.name}/cmd/jwx";
 
   meta = with lib; {
     description = " Implementation of various JWx (Javascript Object Signing and Encryption/JOSE) technologies";
diff --git a/pkgs/tools/security/lesspass-cli/default.nix b/pkgs/tools/security/lesspass-cli/default.nix
index a7b266c34ece..34d36f93b5fb 100644
--- a/pkgs/tools/security/lesspass-cli/default.nix
+++ b/pkgs/tools/security/lesspass-cli/default.nix
@@ -14,7 +14,7 @@ buildPythonApplication rec {
     rev = version;
     sha256 = "126zk248s9r72qk9b8j27yvb8gglw49kazwz0sd69b5kkxvhz2dh";
   };
-  sourceRoot = "source/cli";
+  sourceRoot = "${src.name}/cli";
 
   # some tests are designed to run against code in the source directory - adapt to run against
   # *installed* code
diff --git a/pkgs/tools/security/libmodsecurity/default.nix b/pkgs/tools/security/libmodsecurity/default.nix
index a0b88c5b64e5..e1d78b79753e 100644
--- a/pkgs/tools/security/libmodsecurity/default.nix
+++ b/pkgs/tools/security/libmodsecurity/default.nix
@@ -6,13 +6,13 @@
 
 stdenv.mkDerivation rec {
   pname = "libmodsecurity";
-  version = "3.0.9";
+  version = "3.0.10";
 
   src = fetchFromGitHub {
     owner = "SpiderLabs";
     repo = "ModSecurity";
     rev = "v${version}";
-    sha256 = "sha256-7tA1fqKK5aGOhWBifLAjDmQ80ven4+OcwAzAowPStzA=";
+    sha256 = "sha256-VaoPpJ0twuGWU7G9AvKK4kq9Ed0BeG2J7B81sOuJVrE=";
     fetchSubmodules = true;
   };
 
diff --git a/pkgs/tools/security/metasploit/Gemfile b/pkgs/tools/security/metasploit/Gemfile
index e5aca4f11ffe..d5bfa0529161 100644
--- a/pkgs/tools/security/metasploit/Gemfile
+++ b/pkgs/tools/security/metasploit/Gemfile
@@ -1,4 +1,4 @@
 # frozen_string_literal: true
 source "https://rubygems.org"
 
-gem "metasploit-framework", git: "https://github.com/rapid7/metasploit-framework", ref: "refs/tags/6.3.26"
+gem "metasploit-framework", git: "https://github.com/rapid7/metasploit-framework", ref: "refs/tags/6.3.27"
diff --git a/pkgs/tools/security/metasploit/Gemfile.lock b/pkgs/tools/security/metasploit/Gemfile.lock
index 3bd2348d76f0..37e3161509f6 100644
--- a/pkgs/tools/security/metasploit/Gemfile.lock
+++ b/pkgs/tools/security/metasploit/Gemfile.lock
@@ -1,9 +1,9 @@
 GIT
   remote: https://github.com/rapid7/metasploit-framework
-  revision: dd1f90dd6fd267d8430d8e0299ebcfe6a85327cf
-  ref: refs/tags/6.3.26
+  revision: 53af96320f2fddfc0189ea66fd9db1f87d94eb06
+  ref: refs/tags/6.3.27
   specs:
-    metasploit-framework (6.3.26)
+    metasploit-framework (6.3.27)
       actionpack (~> 7.0)
       activerecord (~> 7.0)
       activesupport (~> 7.0)
@@ -131,13 +131,13 @@ GEM
     arel-helpers (2.14.0)
       activerecord (>= 3.1.0, < 8)
     aws-eventstream (1.2.0)
-    aws-partitions (1.790.0)
-    aws-sdk-core (3.178.0)
+    aws-partitions (1.795.0)
+    aws-sdk-core (3.180.1)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.5)
       jmespath (~> 1, >= 1.6.1)
-    aws-sdk-ec2 (1.392.0)
+    aws-sdk-ec2 (1.395.0)
       aws-sdk-core (~> 3, >= 3.177.0)
       aws-sigv4 (~> 1.1)
     aws-sdk-iam (1.86.0)
@@ -146,8 +146,8 @@ GEM
     aws-sdk-kms (1.71.0)
       aws-sdk-core (~> 3, >= 3.177.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.131.0)
-      aws-sdk-core (~> 3, >= 3.177.0)
+    aws-sdk-s3 (1.132.0)
+      aws-sdk-core (~> 3, >= 3.179.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.6)
     aws-sdk-ssm (1.156.0)
@@ -190,7 +190,7 @@ GEM
     faraday-net_http (3.0.2)
     faraday-retry (2.2.0)
       faraday (~> 2.0)
-    faye-websocket (0.11.2)
+    faye-websocket (0.11.3)
       eventmachine (>= 0.12.0)
       websocket-driver (>= 0.5.1)
     ffi (1.15.5)
@@ -259,7 +259,7 @@ GEM
     metasploit_payloads-mettle (1.0.20)
     method_source (1.0.0)
     mini_portile2 (2.8.4)
-    minitest (5.18.1)
+    minitest (5.19.0)
     mqtt (0.6.0)
     msgpack (1.6.1)
     multi_json (1.15.0)
@@ -271,7 +271,7 @@ GEM
       timeout
     net-smtp (0.3.3)
       net-protocol
-    net-ssh (7.1.0)
+    net-ssh (7.2.0)
     network_interface (0.0.2)
     nexpose (7.3.0)
     nio4r (2.5.9)
@@ -300,7 +300,7 @@ GEM
     puma (6.3.0)
       nio4r (~> 2.0)
     racc (1.7.1)
-    rack (2.2.7)
+    rack (2.2.8)
     rack-protection (3.0.6)
       rack
     rack-test (2.1.0)
@@ -326,7 +326,7 @@ GEM
     recog (3.1.1)
       nokogiri
     redcarpet (3.6.0)
-    reline (0.3.6)
+    reline (0.3.7)
       io-console (~> 0.5)
     rex-arch (0.1.14)
       rex-text
@@ -376,9 +376,9 @@ GEM
     rex-text (0.2.52)
     rex-zip (0.1.4)
       rex-text
-    rexml (3.2.5)
+    rexml (3.2.6)
     rkelly-remix (0.0.7)
-    ruby-macho (3.0.0)
+    ruby-macho (4.0.0)
     ruby-rc4 (0.1.5)
     ruby2_keywords (0.0.5)
     ruby_smb (3.2.5)
@@ -423,7 +423,7 @@ GEM
     warden (1.2.9)
       rack (>= 2.0.9)
     webrick (1.8.1)
-    websocket-driver (0.7.5)
+    websocket-driver (0.7.6)
       websocket-extensions (>= 0.1.0)
     websocket-extensions (0.1.5)
     win32api (0.1.0)
@@ -442,7 +442,7 @@ GEM
       activesupport (>= 4.2, < 8.0)
     xmlrpc (0.3.2)
       webrick
-    zeitwerk (2.6.8)
+    zeitwerk (2.6.10)
 
 PLATFORMS
   ruby
diff --git a/pkgs/tools/security/metasploit/default.nix b/pkgs/tools/security/metasploit/default.nix
index 88f25a706571..d1d445954240 100644
--- a/pkgs/tools/security/metasploit/default.nix
+++ b/pkgs/tools/security/metasploit/default.nix
@@ -15,13 +15,13 @@ let
   };
 in stdenv.mkDerivation rec {
   pname = "metasploit-framework";
-  version = "6.3.26";
+  version = "6.3.27";
 
   src = fetchFromGitHub {
     owner = "rapid7";
     repo = "metasploit-framework";
     rev = version;
-    sha256 = "sha256-GSf+GE4LeZxmhTskiwWjWf9rc6K4wg357MuK5cbLuMs=";
+    sha256 = "sha256-3iNzOLOASz78ZUoShKMH/AYZE+UTu31qU/VjXP677cc=";
   };
 
   nativeBuildInputs = [ makeWrapper ];
diff --git a/pkgs/tools/security/metasploit/gemset.nix b/pkgs/tools/security/metasploit/gemset.nix
index 6cfc7da1e69e..71feb682f9d4 100644
--- a/pkgs/tools/security/metasploit/gemset.nix
+++ b/pkgs/tools/security/metasploit/gemset.nix
@@ -104,30 +104,30 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1mjzb10zyx78hnnz6j4bjv3awpgajfi0nmavrhy9x1qsf7yc9bjd";
+      sha256 = "07nz6pdzhrfzyhcnd0slikbw0xpslisis2ab57v83fbmn3rkpwn4";
       type = "gem";
     };
-    version = "1.790.0";
+    version = "1.795.0";
   };
   aws-sdk-core = {
     groups = ["default"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1jv5h7n0vkyjq0v3xqad5xhrl4ijnh214zq3xg4ghvsk6ah8a90r";
+      sha256 = "1a820i7b3fcpnk0966sp7sdj9mzkazfwjflrd1f3i9qgbabf5li3";
       type = "gem";
     };
-    version = "3.178.0";
+    version = "3.180.1";
   };
   aws-sdk-ec2 = {
     groups = ["default"];
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "15vb0gn23xig6alcxh487r0jl5cdxm45b6zihh3wscvfzwqq0n5n";
+      sha256 = "01ds6pw1q87mqbyv7v0a444lsifrv6y0sqcw3v5yrng2ap43xby7";
       type = "gem";
     };
-    version = "1.392.0";
+    version = "1.395.0";
   };
   aws-sdk-iam = {
     groups = ["default"];
@@ -154,10 +154,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1855m1v6lh9rji543nvk0fjn98ma0q2978zc4f5y76qsibl7fg6c";
+      sha256 = "0cjb40w8hw4h59bbjidp6hlb1j6akb36d8s5a37vlm6zwq327i7f";
       type = "gem";
     };
-    version = "1.131.0";
+    version = "1.132.0";
   };
   aws-sdk-ssm = {
     groups = ["default"];
@@ -404,10 +404,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1p4hsz3v75lxyj3ymwjm7pxrrk1997n54lfm51h5laakzxbji421";
+      sha256 = "01xkpv5b4fjc5n6n1fq6z1ris991av2fbadvs8r71i9r34b8g48h";
       type = "gem";
     };
-    version = "0.11.2";
+    version = "0.11.3";
   };
   ffi = {
     groups = ["default"];
@@ -634,12 +634,12 @@
     platforms = [];
     source = {
       fetchSubmodules = false;
-      rev = "dd1f90dd6fd267d8430d8e0299ebcfe6a85327cf";
-      sha256 = "1jxqrg3fb2nbxkwhvhmql9rnpzsrlc2qn91vhmk9qy8b9qcgw9qr";
+      rev = "53af96320f2fddfc0189ea66fd9db1f87d94eb06";
+      sha256 = "1izdpgz5qqzmadm7vfqkwl9ij1pw0yiq84jacpy3wjw0ncw768yy";
       type = "git";
       url = "https://github.com/rapid7/metasploit-framework";
     };
-    version = "6.3.26";
+    version = "6.3.27";
   };
   metasploit-model = {
     groups = ["default"];
@@ -706,10 +706,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1kg9wh7jlc9zsr3hkhpzkbn0ynf4np5ap9m2d8xdrb8shy0y6pmb";
+      sha256 = "0jnpsbb2dbcs95p4is4431l2pw1l5pn7dfg3vkgb4ga464j0c5l6";
       type = "gem";
     };
-    version = "5.18.1";
+    version = "5.19.0";
   };
   mqtt = {
     groups = ["default"];
@@ -796,10 +796,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0yx0pb5fmziz92bw8qzbh8vf20lr56nd3s6q8h0gsgr307lki687";
+      sha256 = "1jyj6j7w9zpj2zhp4dyhdjiwsn9rqwksj7s7fzpnn7rx2xvz2a1a";
       type = "gem";
     };
-    version = "7.1.0";
+    version = "7.2.0";
   };
   network_interface = {
     groups = ["default"];
@@ -977,10 +977,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "16w217k9z02c4hqizym8dkj6bqmmzx4qdvqpnskgzf174a5pwdxk";
+      sha256 = "15rdwbyk71c9nxvd527bvb8jxkcys8r3dj3vqra5b3sa63qs30vv";
       type = "gem";
     };
-    version = "2.2.7";
+    version = "2.2.8";
   };
   rack-protection = {
     groups = ["default"];
@@ -1087,10 +1087,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "1rgsfxm3sb9mgsxa7gks40wy4sb41w33j30y6izmih70ss34x4dh";
+      sha256 = "1n6b6a1b18fscw9ff0fw5jk1l7kzw542r8444mm7d27zyx5v18sj";
       type = "gem";
     };
-    version = "0.3.6";
+    version = "0.3.7";
   };
   rex-arch = {
     groups = ["default"];
@@ -1277,10 +1277,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "08ximcyfjy94pm1rhcx04ny1vx2sk0x4y185gzn86yfsbzwkng53";
+      sha256 = "05i8518ay14kjbma550mv0jm8a6di8yp5phzrd8rj44z9qnrlrp0";
       type = "gem";
     };
-    version = "3.2.5";
+    version = "3.2.6";
   };
   rkelly-remix = {
     groups = ["default"];
@@ -1297,10 +1297,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0sg0kzqrldx9mlpvymif3dcgz8j8q1nc8jaszrd03nfh5bvp3fd5";
+      sha256 = "1yf8fq0l5hlqkjklcpxmg6vhzvbyigwd2n441aq42b2wa2f8xj5q";
       type = "gem";
     };
-    version = "3.0.0";
+    version = "4.0.0";
   };
   ruby-rc4 = {
     groups = ["default"];
@@ -1548,10 +1548,10 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0a3bwxd9v3ghrxzjc4vxmf4xa18c6m4xqy5wb0yk5c6b9psc7052";
+      sha256 = "1nyh873w4lvahcl8kzbjfca26656d5c6z3md4sbqg5y1gfz0157n";
       type = "gem";
     };
-    version = "0.7.5";
+    version = "0.7.6";
   };
   websocket-extensions = {
     groups = ["default"];
@@ -1618,9 +1618,9 @@
     platforms = [];
     source = {
       remotes = ["https://rubygems.org"];
-      sha256 = "0ck6bj7wa73dkdh13735jl06k6cfny98glxjkas82aivlmyzqqbk";
+      sha256 = "06vf6y5ai20ry3b1h9cl7vsdj6i5valq172zdxpnfhj5zvlp104j";
       type = "gem";
     };
-    version = "2.6.8";
+    version = "2.6.10";
   };
 }
diff --git a/pkgs/tools/security/osv-scanner/default.nix b/pkgs/tools/security/osv-scanner/default.nix
index ff5d43bcfee2..e40d9c4cdab4 100644
--- a/pkgs/tools/security/osv-scanner/default.nix
+++ b/pkgs/tools/security/osv-scanner/default.nix
@@ -6,16 +6,16 @@
 }:
 buildGoModule rec {
   pname = "osv-scanner";
-  version = "1.3.5";
+  version = "1.3.6";
 
   src = fetchFromGitHub {
     owner = "google";
     repo = pname;
     rev = "v${version}";
-    hash = "sha256-QKswDnqPJzucfOrRzKkBMvyuGsjamY9yhyBqcyhZNvI=";
+    hash = "sha256-mvR4LqUPtmLBH9RSfVge4anwun1wHJMCuGyHGQvA56s=";
   };
 
-  vendorHash = "sha256-xHgatAblsnPikAYnfoWTGzpeAHs3ON06bDuxELH/AKI=";
+  vendorHash = "sha256-oxAvpiNrdst7Y8EbSTrTEebX6+G/8K5UFwdKG+wiDQE=";
 
   subPackages = [
     "cmd/osv-scanner"
diff --git a/pkgs/tools/security/pass/default.nix b/pkgs/tools/security/pass/default.nix
index 1b840999e6af..3437b19e3a30 100644
--- a/pkgs/tools/security/pass/default.nix
+++ b/pkgs/tools/security/pass/default.nix
@@ -29,8 +29,7 @@ let
       selected = [ pass ] ++ extensions passExtensions
         ++ lib.optional tombPluginSupport passExtensions.tomb;
     in buildEnv {
-      # lib.getExe looks for name, so we keep it the same as mainProgram
-      name = "pass";
+      name = "pass-env";
       paths = selected;
       nativeBuildInputs = [ makeWrapper ];
       buildInputs = lib.concatMap (x: x.buildInputs) selected;
@@ -51,6 +50,7 @@ let
         wrapProgram $out/bin/pass \
           --set SYSTEM_EXTENSION_DIR "$out/lib/password-store/extensions"
       '';
+      meta.mainProgram = "pass";
     };
 in
 
diff --git a/pkgs/tools/security/proxmark3/default.nix b/pkgs/tools/security/proxmark3/default.nix
index b52e7279fa98..48d0d4a0ee14 100644
--- a/pkgs/tools/security/proxmark3/default.nix
+++ b/pkgs/tools/security/proxmark3/default.nix
@@ -1,61 +1,86 @@
-{ lib, stdenv, fetchFromGitHub, pkg-config, ncurses, readline, pcsclite, qt5
-, gcc-arm-embedded }:
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, gcc-arm-embedded
+, readline
+, bzip2
+, openssl
+, jansson
+, whereami
+, lua
+, Foundation
+, AppKit
+, withGui ? true, wrapQtAppsHook, qtbase
+, withPython ? true, python3
+, withBlueshark ? false, bluez5
+, withGeneric ? false
+, withSmall ? false
+, withoutFunctions ? []
+, hardwarePlatform ? if withGeneric then "PM3GENERIC" else "PM3RDV4"
+, hardwarePlatformExtras ? lib.optionalString withBlueshark "BTADDON"
+, standalone ? "LF_SAMYRUN"
+}:
+assert withBlueshark -> stdenv.hostPlatform.isLinux;
+stdenv.mkDerivation rec {
+  pname = "proxmark3";
+  version = "4.16717";
 
-let
-  generic = { pname, version, rev, sha256 }:
-    stdenv.mkDerivation rec {
-      inherit pname version;
-
-      src = fetchFromGitHub {
-        owner = "Proxmark";
-        repo = "proxmark3";
-        inherit rev sha256;
-      };
-
-      nativeBuildInputs = [ pkg-config gcc-arm-embedded ];
-      buildInputs = [ ncurses readline pcsclite qt5.qtbase ];
-
-      dontWrapQtApps = true;
-
-      postPatch = ''
-        substituteInPlace client/Makefile --replace '-ltermcap' ' '
-        substituteInPlace liblua/Makefile --replace '-ltermcap' ' '
-        substituteInPlace client/flasher.c \
-          --replace 'armsrc/obj/fullimage.elf' \
-                    '${placeholder "out"}/firmware/fullimage.elf'
-      '';
+  src = fetchFromGitHub {
+    owner = "RfidResearchGroup";
+    repo = "proxmark3";
+    rev = "v${version}";
+    sha256 = "sha256-rkfVgT+9fqlWvUXzLH28Nzd8HldJnU+IZz8conY8Mis=";
+  };
 
-      buildPhase = ''
-        make bootrom/obj/bootrom.elf armsrc/obj/fullimage.elf client
-      '';
+  patches = [
+    # Don't check for DISPLAY env variable on Darwin. pm3 uses this to test if
+    # XQuartz is installed, however it is not actually required for GUI features
+    ./darwin-always-gui.patch
+  ];
 
-      installPhase = ''
-        install -Dt $out/bin client/proxmark3
-        install -T client/flasher $out/bin/proxmark3-flasher
-        install -Dt $out/firmware bootrom/obj/bootrom.elf armsrc/obj/fullimage.elf
-      '';
+  postPatch = ''
+    # Remove hardcoded paths on Darwin
+    substituteInPlace Makefile.defs \
+      --replace "/usr/bin/ar" "ar" \
+      --replace "/usr/bin/ranlib" "ranlib"
+    # Replace hardcoded path to libwhereami
+    substituteInPlace client/Makefile \
+      --replace "/usr/include/whereami.h" "${whereami}/include/whereami.h"
+  '';
 
-      meta = with lib; {
-        description = "Client for proxmark3, powerful general purpose RFID tool";
-        homepage = "http://www.proxmark.org";
-        license = licenses.gpl2Plus;
-        maintainers = with maintainers; [ fpletz ];
-      };
-    };
-in
+  nativeBuildInputs = [
+    pkg-config
+    gcc-arm-embedded
+  ] ++ lib.optional withGui wrapQtAppsHook;
+  buildInputs = [
+    readline
+    bzip2
+    openssl
+    jansson
+    whereami
+    lua
+  ] ++ lib.optional withGui qtbase
+    ++ lib.optional withPython python3
+    ++ lib.optional withBlueshark bluez5
+    ++ lib.optionals stdenv.hostPlatform.isDarwin [ Foundation AppKit ];
 
-{
-  proxmark3 = generic rec {
-    pname = "proxmark3";
-    version = "3.1.0";
-    rev = "v${version}";
-    sha256 = "1qw28n1bhhl91ix77lv50qcr919fq3hjc8zhhqphwxal2svgx2jf";
-  };
+  makeFlags = [
+    "PREFIX=${placeholder "out"}"
+    "UDEV_PREFIX=${placeholder "out"}/etc/udev/rules.d"
+    "PLATFORM=${hardwarePlatform}"
+    "PLATFORM_EXTRAS=${hardwarePlatformExtras}"
+    "STANDALONE=${standalone}"
+    "USE_BREW=0"
+  ] ++ lib.optional withSmall "PLATFORM_SIZE=256"
+    ++ map (x: "SKIP_${x}=1") withoutFunctions;
+  enableParallelBuilding = true;
 
-  proxmark3-unstable = generic {
-    pname = "proxmark3-unstable";
-    version = "2019-12-28";
-    rev = "a4ff62be63ca2a81071e9aa2b882bd3ff57f13ad";
-    sha256 = "067lp28xqx61n3i2a2fy489r5frwxqrcfj8cpv3xdzi3gb3vk5c3";
+  meta = with lib; {
+    description = "Client for proxmark3, powerful general purpose RFID tool";
+    homepage = "https://github.com/RfidResearchGroup/proxmark3";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ nyanotech emilytrau ];
+    platforms = platforms.unix;
   };
 }
diff --git a/pkgs/tools/security/proxmark3/proxmark3-rrg.nix b/pkgs/tools/security/proxmark3/proxmark3-rrg.nix
deleted file mode 100644
index fc033125e8b6..000000000000
--- a/pkgs/tools/security/proxmark3/proxmark3-rrg.nix
+++ /dev/null
@@ -1,86 +0,0 @@
-{ lib
-, stdenv
-, fetchFromGitHub
-, pkg-config
-, gcc-arm-embedded
-, readline
-, bzip2
-, openssl
-, jansson
-, whereami
-, lua
-, Foundation
-, AppKit
-, withGui ? true, wrapQtAppsHook, qtbase
-, withPython ? true, python3
-, withBlueshark ? false, bluez5
-, withGeneric ? false
-, withSmall ? false
-, withoutFunctions ? []
-, hardwarePlatform ? if withGeneric then "PM3GENERIC" else "PM3RDV4"
-, hardwarePlatformExtras ? lib.optionalString withBlueshark "BTADDON"
-, standalone ? "LF_SAMYRUN"
-}:
-assert withBlueshark -> stdenv.hostPlatform.isLinux;
-stdenv.mkDerivation rec {
-  pname = "proxmark3-rrg";
-  version = "4.16717";
-
-  src = fetchFromGitHub {
-    owner = "RfidResearchGroup";
-    repo = "proxmark3";
-    rev = "v${version}";
-    sha256 = "sha256-rkfVgT+9fqlWvUXzLH28Nzd8HldJnU+IZz8conY8Mis=";
-  };
-
-  patches = [
-    # Don't check for DISPLAY env variable on Darwin. pm3 uses this to test if
-    # XQuartz is installed, however it is not actually required for GUI features
-    ./darwin-always-gui.patch
-  ];
-
-  postPatch = ''
-    # Remove hardcoded paths on Darwin
-    substituteInPlace Makefile.defs \
-      --replace "/usr/bin/ar" "ar" \
-      --replace "/usr/bin/ranlib" "ranlib"
-    # Replace hardcoded path to libwhereami
-    substituteInPlace client/Makefile \
-      --replace "/usr/include/whereami.h" "${whereami}/include/whereami.h"
-  '';
-
-  nativeBuildInputs = [
-    pkg-config
-    gcc-arm-embedded
-  ] ++ lib.optional withGui wrapQtAppsHook;
-  buildInputs = [
-    readline
-    bzip2
-    openssl
-    jansson
-    whereami
-    lua
-  ] ++ lib.optional withGui qtbase
-    ++ lib.optional withPython python3
-    ++ lib.optional withBlueshark bluez5
-    ++ lib.optionals stdenv.hostPlatform.isDarwin [ Foundation AppKit ];
-
-  makeFlags = [
-    "PREFIX=${placeholder "out"}"
-    "UDEV_PREFIX=${placeholder "out"}/etc/udev/rules.d"
-    "PLATFORM=${hardwarePlatform}"
-    "PLATFORM_EXTRAS=${hardwarePlatformExtras}"
-    "STANDALONE=${standalone}"
-    "USE_BREW=0"
-  ] ++ lib.optional withSmall "PLATFORM_SIZE=256"
-    ++ map (x: "SKIP_${x}=1") withoutFunctions;
-  enableParallelBuilding = true;
-
-  meta = with lib; {
-    description = "Client for proxmark3, powerful general purpose RFID tool";
-    homepage = "https://github.com/RfidResearchGroup/proxmark3";
-    license = licenses.gpl3Plus;
-    maintainers = with maintainers; [ nyanotech emilytrau ];
-    platforms = platforms.unix;
-  };
-}
diff --git a/pkgs/tools/security/rage/default.nix b/pkgs/tools/security/rage/default.nix
index ea8e304099c0..44b67e96a1e0 100644
--- a/pkgs/tools/security/rage/default.nix
+++ b/pkgs/tools/security/rage/default.nix
@@ -46,5 +46,6 @@ rustPlatform.buildRustPackage rec {
     changelog = "https://github.com/str4d/rage/raw/v${version}/rage/CHANGELOG.md";
     license = with licenses; [ asl20 mit ]; # either at your option
     maintainers = with maintainers; [ marsam ryantm ];
+    mainProgram = "rage";
   };
 }
diff --git a/pkgs/tools/security/rekor/default.nix b/pkgs/tools/security/rekor/default.nix
index 62de3da17449..2820f473c11b 100644
--- a/pkgs/tools/security/rekor/default.nix
+++ b/pkgs/tools/security/rekor/default.nix
@@ -4,13 +4,13 @@ let
   generic = { pname, packageToBuild, description }:
     buildGoModule rec {
       inherit pname;
-      version = "1.2.1";
+      version = "1.2.2";
 
       src = fetchFromGitHub {
         owner = "sigstore";
         repo = "rekor";
         rev = "v${version}";
-        hash = "sha256-tPiojtSCpqJjLGRZ1rNno7TKhmZ3jBtdb4dWLfRmh14=";
+        hash = "sha256-U7KxkPYVAy3/olXsEgPMX/kzg0KvYMovLO4LWw8guE4=";
         # populate values that require us to use git. By doing this in postFetch we
         # can delete .git afterwards and maintain better reproducibility of the src.
         leaveDotGit = true;
@@ -23,7 +23,7 @@ let
         '';
       };
 
-      vendorHash = "sha256-AIXoq/sYQRCR1pllwBhflAnanUD0aGo54drBOsaxiDQ=";
+      vendorHash = "sha256-hZyoVlNrPKE6ub94jVEOLGvxWoXKxFYcsEZyRrZuNkQ=";
 
       nativeBuildInputs = [ installShellFiles ];
 
diff --git a/pkgs/tools/security/sequoia-sq/default.nix b/pkgs/tools/security/sequoia-sq/default.nix
index fbb5ff956a4d..d8bac3e70725 100644
--- a/pkgs/tools/security/sequoia-sq/default.nix
+++ b/pkgs/tools/security/sequoia-sq/default.nix
@@ -12,16 +12,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "sequoia-sq";
-  version = "0.30.1";
+  version = "0.31.0";
 
   src = fetchFromGitLab {
     owner = "sequoia-pgp";
     repo = "sequoia-sq";
     rev = "v${version}";
-    hash = "sha256-uFcmuyz0JsUTvKqCb+3t8JdB4Dn4hJq00jeEhvMNW18=";
+    hash = "sha256-rrNN52tDM3CEGyNvsT3x4GmfWIpU8yoT2XsgOhPyLjo=";
   };
 
-  cargoHash = "sha256-PWqwTGodQ7LBTgHFB2AWX5wIOVJja2GzPoocX59Dr/0=";
+  cargoHash = "sha256-B+gtUzUB99At+kusupsN/v6sCbpXs36/EbpTL3gUxnc=";
 
   nativeBuildInputs = [
     pkg-config
diff --git a/pkgs/tools/security/spire/default.nix b/pkgs/tools/security/spire/default.nix
index b76a03e42cda..6c64e19043a2 100644
--- a/pkgs/tools/security/spire/default.nix
+++ b/pkgs/tools/security/spire/default.nix
@@ -2,7 +2,7 @@
 
 buildGoModule rec {
   pname = "spire";
-  version = "1.7.0";
+  version = "1.7.1";
 
   outputs = [ "out" "agent" "server" ];
 
@@ -10,10 +10,10 @@ buildGoModule rec {
     owner = "spiffe";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-aJ9T8OUsHNeWV05MWLet35V0YFyD7QoiExN6PTmHs3w=";
+    sha256 = "sha256-42UEFil9b2z8vfnA5oJvkqcPuSApi61m//RZ4pKZZ5w=";
   };
 
-  vendorHash = "sha256-4KJysqByDVuK2OU/+sGtpXtSJe4YkVe4OhRyn9tkgsg=";
+  vendorHash = "sha256-H4INblBEWc/AuOn59lXmj5XX6mKrhmRTRVWtVhusW9k=";
 
   subPackages = [ "cmd/spire-agent" "cmd/spire-server" ];
 
diff --git a/pkgs/tools/security/ssdeep/default.nix b/pkgs/tools/security/ssdeep/default.nix
index acc617103d71..7647246369ff 100644
--- a/pkgs/tools/security/ssdeep/default.nix
+++ b/pkgs/tools/security/ssdeep/default.nix
@@ -13,8 +13,10 @@ stdenv.mkDerivation rec {
 
   nativeBuildInputs = [ autoreconfHook ];
 
-  # Hack to avoid TMPDIR in RPATHs.
-  preFixup = ''rm -rf "$(pwd)" '';
+  # remove forbidden references to $TMPDIR
+  preFixup = lib.optionalString stdenv.isLinux ''
+    patchelf --shrink-rpath --allowed-rpath-prefixes "$NIX_STORE" "$out"/bin/*
+  '';
 
   meta = {
     description = "A program for calculating fuzzy hashes";
diff --git a/pkgs/tools/security/terrascan/default.nix b/pkgs/tools/security/terrascan/default.nix
index bb71c3134d88..8cc4212fbb28 100644
--- a/pkgs/tools/security/terrascan/default.nix
+++ b/pkgs/tools/security/terrascan/default.nix
@@ -5,16 +5,16 @@
 
 buildGoModule rec {
   pname = "terrascan";
-  version = "1.18.1";
+  version = "1.18.2";
 
   src = fetchFromGitHub {
     owner = "accurics";
     repo = pname;
     rev = "refs/tags/v${version}";
-    hash = "sha256-w0ZOkPw8Y6Z1hyZecZfjd/YrTP8v6S0jNhgNzLjMRrY=";
+    hash = "sha256-ZWkuzblPIvYcOllmIjk2RQZdkcPYZLGOuxwgX3NMydg=";
   };
 
-  vendorHash = "sha256-0WkOIgIA1fKn2SeS5QFeLGCGMstdlkU+eDRUVAs3ETA=";
+  vendorHash = "sha256-e09F4dA/uT50Cted3HqE08d04+l0V6U95AdKGKBFDpI=";
 
   # Tests want to download a vulnerable Terraform project
   doCheck = false;
diff --git a/pkgs/tools/security/tor/default.nix b/pkgs/tools/security/tor/default.nix
index 06e43158190b..28e38d6ad1c9 100644
--- a/pkgs/tools/security/tor/default.nix
+++ b/pkgs/tools/security/tor/default.nix
@@ -30,11 +30,11 @@ let
 in
 stdenv.mkDerivation rec {
   pname = "tor";
-  version = "0.4.7.13";
+  version = "0.4.7.14";
 
   src = fetchurl {
     url = "https://dist.torproject.org/${pname}-${version}.tar.gz";
-    sha256 = "sha256-IHkXLM4DRVbxEASOJgg86b6nUfMVSwrSgJdRgVsR6p0=";
+    sha256 = "sha256-paxn9kZjgPwF6AQ9AcWB5Oiisi/glDABNHPnEGXmXfg=";
   };
 
   outputs = [ "out" "geoip" ];
diff --git a/pkgs/tools/security/trufflehog/default.nix b/pkgs/tools/security/trufflehog/default.nix
index da9a7334396e..6b6e970a38ca 100644
--- a/pkgs/tools/security/trufflehog/default.nix
+++ b/pkgs/tools/security/trufflehog/default.nix
@@ -7,16 +7,16 @@
 
 buildGoModule rec {
   pname = "trufflehog";
-  version = "3.45.1";
+  version = "3.46.3";
 
   src = fetchFromGitHub {
     owner = "trufflesecurity";
     repo = "trufflehog";
     rev = "refs/tags/v${version}";
-    hash = "sha256-kWEDeFx3ngpL6ySCD5GsJbmtbhv1qCMt9yjrskLmbbg=";
+    hash = "sha256-IdLNDJYg86dTj+E2w7+sXmNf/MY7eqW9NMAmuhrzm10=";
   };
 
-  vendorHash = "sha256-dg29rK5/se2DVhc+GLFeFzh3bqJl3dfC2zjGLX7utDs=";
+  vendorHash = "sha256-ecEms2Zf4EckP2OLoL41S1ZTTnGJhpdMDhknq/mO7qI=";
 
   ldflags = [
     "-s"
diff --git a/pkgs/tools/security/vaultwarden/default.nix b/pkgs/tools/security/vaultwarden/default.nix
index 9321537539e0..cfe65eb332c1 100644
--- a/pkgs/tools/security/vaultwarden/default.nix
+++ b/pkgs/tools/security/vaultwarden/default.nix
@@ -9,13 +9,13 @@ in
 
 rustPlatform.buildRustPackage rec {
   pname = "vaultwarden";
-  version = "1.29.0";
+  version = "1.29.1";
 
   src = fetchFromGitHub {
     owner = "dani-garcia";
     repo = pname;
     rev = version;
-    hash = "sha256-dF27b29n4JUHdXG68UfQwlacZE1SXqk0h854cMR8Ii8=";
+    hash = "sha256-uASoPZRBQ9IKJHtMGeeZzmr0fCYDWl56EzaJVj6LwMk=";
   };
 
   cargoLock = {
diff --git a/pkgs/tools/security/yubikey-touch-detector/default.nix b/pkgs/tools/security/yubikey-touch-detector/default.nix
index 9e66a5ffd5a8..26402caa812b 100644
--- a/pkgs/tools/security/yubikey-touch-detector/default.nix
+++ b/pkgs/tools/security/yubikey-touch-detector/default.nix
@@ -49,5 +49,6 @@ buildGoModule rec {
     maintainers = with maintainers; [ sumnerevans ];
     license = with licenses; [ bsd2 isc ];
     platforms = platforms.linux;
+    mainProgram = "yubikey-touch-detector";
   };
 }
diff --git a/pkgs/tools/security/zeekscript/default.nix b/pkgs/tools/security/zeekscript/default.nix
index cf5e44ea8f68..c1ab0cb4a190 100644
--- a/pkgs/tools/security/zeekscript/default.nix
+++ b/pkgs/tools/security/zeekscript/default.nix
@@ -13,8 +13,13 @@ python3.pkgs.buildPythonApplication rec {
     hash = "sha256-LogI9sJHvLN5WHJGdW47D09XZInKln/I2hNmG62d1JU=";
   };
 
+  postPatch = ''
+    sed -i '/name = "zeekscript"/a version = "${version}"' pyproject.toml
+  '';
+
   nativeBuildInputs = with python3.pkgs; [
     setuptools
+    wheel
   ];
 
   propagatedBuildInputs = with python3.pkgs; [
diff --git a/pkgs/tools/system/auto-cpufreq/default.nix b/pkgs/tools/system/auto-cpufreq/default.nix
index b72ee7a6911f..faa280575e1e 100644
--- a/pkgs/tools/system/auto-cpufreq/default.nix
+++ b/pkgs/tools/system/auto-cpufreq/default.nix
@@ -43,5 +43,6 @@ python3Packages.buildPythonPackage rec {
     license = licenses.lgpl3Plus;
     platforms = platforms.linux;
     maintainers = [ maintainers.Technical27 ];
+    mainProgram = "auto-cpufreq";
   };
 }
diff --git a/pkgs/tools/system/htop/default.nix b/pkgs/tools/system/htop/default.nix
index 215818862cdb..c00f25780839 100644
--- a/pkgs/tools/system/htop/default.nix
+++ b/pkgs/tools/system/htop/default.nix
@@ -55,5 +55,6 @@ stdenv.mkDerivation rec {
     platforms = platforms.all;
     maintainers = with maintainers; [ rob relrod SuperSandro2000 ];
     changelog = "https://github.com/htop-dev/htop/blob/${version}/ChangeLog";
+    mainProgram = "htop";
   };
 }
diff --git a/pkgs/tools/system/kanata/default.nix b/pkgs/tools/system/kanata/default.nix
index 5a3450df0866..6e86812ece44 100644
--- a/pkgs/tools/system/kanata/default.nix
+++ b/pkgs/tools/system/kanata/default.nix
@@ -6,16 +6,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "kanata";
-  version = "1.3.0";
+  version = "1.4.0";
 
   src = fetchFromGitHub {
     owner = "jtroo";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-gHkcOn37MNpcP6ra1Eur9O4/trPGmAOAGVU1NwiuQGY=";
+    sha256 = "sha256-Tenh2LARajYAFHJ5gddeozY7rfySSvqFhudc/7b9cGg=";
   };
 
-  cargoHash = "sha256-C2d7QdgWd9RTQtXLD4mO0txpzo/SbemJx9YYu62QbqA=";
+  cargoHash = "sha256-oJVGZhKJVK8q5lgK+G+KhVupOF05u37B7Nmv4rrI28I=";
 
   buildFeatures = lib.optional withCmd "cmd";
 
@@ -29,5 +29,6 @@ rustPlatform.buildRustPackage rec {
     license = licenses.lgpl3Only;
     maintainers = with maintainers; [ linj ];
     platforms = platforms.linux;
+    mainProgram = "kanata";
   };
 }
diff --git a/pkgs/tools/system/osquery/default.nix b/pkgs/tools/system/osquery/default.nix
index 6c6d0b45e2a1..a7c8f18214fa 100644
--- a/pkgs/tools/system/osquery/default.nix
+++ b/pkgs/tools/system/osquery/default.nix
@@ -51,7 +51,9 @@ buildStdenv.mkDerivation rec {
     # which provides the ARC4RANDOM_BUF function
     substituteInPlace libraries/cmake/source/libarchive/CMakeLists.txt --replace "  target_compile_definitions(thirdparty_libarchive PRIVATE" "  target_compile_definitions(thirdparty_libarchive PRIVATE HAVE_ARC4RANDOM_BUF"
     # We need to override this hash because we use our own openssl 1.1 version
-    substituteInPlace libraries/cmake/formula/openssl/CMakeLists.txt --replace "d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" "e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6"
+    substituteInPlace libraries/cmake/formula/openssl/CMakeLists.txt --replace \
+      "d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" \
+      "$(sha256sum ${openssl_1_1.src} | cut -f1 '-d ')"
     cat libraries/cmake/formula/openssl/CMakeLists.txt
   '';
 
diff --git a/pkgs/tools/system/zx/default.nix b/pkgs/tools/system/zx/default.nix
new file mode 100644
index 000000000000..857661c31f2f
--- /dev/null
+++ b/pkgs/tools/system/zx/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "zx";
+  version = "7.2.3";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "zx";
+    rev = version;
+    hash = "sha256-YMfecNazmL8J+f80FdIRvr2upQ7VgXSkQQnm8z0Swhw=";
+  };
+
+  npmDepsHash = "sha256-ywNd2LGjM35ecW4dnj0oNwdSX2CRy8i9OGKPIdI0UEQ=";
+
+  meta = {
+    description = "Tool for writing scripts using JavaScript";
+    homepage = "https://github.com/google/zx";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ hlolli ];
+  };
+}
diff --git a/pkgs/tools/text/chroma/default.nix b/pkgs/tools/text/chroma/default.nix
index 86e5fe76923e..6ef96b287b4d 100644
--- a/pkgs/tools/text/chroma/default.nix
+++ b/pkgs/tools/text/chroma/default.nix
@@ -6,7 +6,7 @@ in
 
 buildGoModule rec {
   pname = "chroma";
-  version = "2.7.0";
+  version = "2.8.0";
 
   # To update:
   # nix-prefetch-git --rev v${version} https://github.com/alecthomas/chroma.git > src.json
@@ -17,7 +17,7 @@ buildGoModule rec {
     inherit (srcInfo) sha256;
   };
 
-  vendorSha256 = "0kw53983bjrmh9nk2xcv4d9104krxnc1jh1g44xjmaq8i6f3q0k1";
+  vendorSha256 = "1qawayihklidfzln3jr899wh4zp9w7yq3i18klaylqndrg47k286";
 
   modRoot = "./cmd/chroma";
 
diff --git a/pkgs/tools/text/chroma/src.json b/pkgs/tools/text/chroma/src.json
index 4b0a5aeb8eba..8bba14faf188 100644
--- a/pkgs/tools/text/chroma/src.json
+++ b/pkgs/tools/text/chroma/src.json
@@ -1,9 +1,9 @@
 {
   "url": "https://github.com/alecthomas/chroma.git",
-  "rev": "b9e37581208ea7d7f167c59e6f635721617c381b",
-  "date": "2023-03-21T13:55:45+11:00",
-  "path": "/nix/store/52c919gjqdwva73ajwz11iv5gg18vi8y-chroma",
-  "sha256": "0i4ck23gn0v7x6r8wa2k7qiwhxpxqqnaknb9iy9rz8pjcj14ai75",
+  "rev": "e8acfc274c22a76fd38030d2977a2246cd4322b3",
+  "date": "2023-06-30T08:43:39+10:00",
+  "path": "/nix/store/57y15g11dmdy2s6vxrjzl03s03j509gy-chroma",
+  "sha256": "0fdgpi5r0k42qzdn4lxh81ww1zcn9mwfildwrqf1s7crsqmr9dc5",
   "fetchLFS": false,
   "fetchSubmodules": false,
   "deepClone": false,
diff --git a/pkgs/tools/text/gawk/default.nix b/pkgs/tools/text/gawk/default.nix
index 8fe044a9e218..d85880e82e15 100644
--- a/pkgs/tools/text/gawk/default.nix
+++ b/pkgs/tools/text/gawk/default.nix
@@ -82,5 +82,6 @@ stdenv.mkDerivation rec {
     license = licenses.gpl3Plus;
     platforms = platforms.unix ++ platforms.windows;
     maintainers = [ ];
+    mainProgram = "gawk";
   };
 }
diff --git a/pkgs/tools/text/markdownlint-cli/default.nix b/pkgs/tools/text/markdownlint-cli/default.nix
new file mode 100644
index 000000000000..6916999cb42e
--- /dev/null
+++ b/pkgs/tools/text/markdownlint-cli/default.nix
@@ -0,0 +1,28 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "markdownlint-cli";
+  version = "0.35.0";
+
+  src = fetchFromGitHub {
+    owner = "igorshubovych";
+    repo = "markdownlint-cli";
+    rev = "v${version}";
+    hash = "sha256-PkvgZn7cQafKO7p5i1fYYZrWjNcFuX700r223qUMN5I=";
+  };
+
+  npmDepsHash = "sha256-hh8T2MRjUJQVibd+cY7vkJvBgNDueWuluGE3HxWOCU8=";
+
+  dontNpmBuild = true;
+
+  meta = {
+    description = "Command line interface for MarkdownLint";
+    homepage = "https://github.com/igorshubovych/markdownlint-cli";
+    license = lib.licenses.mit;
+    mainProgram = "markdownlint";
+    maintainers = with lib.maintainers; [ ambroisie ];
+  };
+}
diff --git a/pkgs/tools/text/mdbook-toc/default.nix b/pkgs/tools/text/mdbook-toc/default.nix
index 9d92c7e94141..3fc144ff84e6 100644
--- a/pkgs/tools/text/mdbook-toc/default.nix
+++ b/pkgs/tools/text/mdbook-toc/default.nix
@@ -2,16 +2,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "mdbook-toc";
-  version = "0.12.0";
+  version = "0.13.0";
 
   src = fetchFromGitHub {
     owner = "badboy";
     repo = pname;
     rev = version;
-    sha256 = "sha256-3lAi9ZNtwhA2OtIR4tN2wiztp3pnRxtaGG0MwGEk0u0=";
+    sha256 = "sha256-Z3ZspXD7M3VVi70+dRz7NhO6msw5htmPRX6VzhA9NPY=";
   };
 
-  cargoHash = "sha256-l3ETQ/ARBZmU1wMCK6F/4g6tlxHsEV9D5LO1wue1Jps=";
+  cargoHash = "sha256-5EC9xfjSg0sIkZ2fIkX3SrwL0wzBfpIObFQpkMRj6oM=";
 
   buildInputs = lib.optionals stdenv.isDarwin [ CoreServices ];
 
diff --git a/pkgs/tools/text/mrkd/default.nix b/pkgs/tools/text/mrkd/default.nix
new file mode 100644
index 000000000000..b43b6cfdf6ab
--- /dev/null
+++ b/pkgs/tools/text/mrkd/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, python3
+, fetchPypi
+}:
+
+let
+  python = python3.override {
+    packageOverrides = self: super: {
+      # https://github.com/refi64/mrkd/pull/6
+      mistune = super.mistune.overridePythonAttrs (old: rec {
+        version = "0.8.4";
+        src = fetchPypi {
+          inherit (old) pname;
+          inherit version;
+          hash = "sha256-WaNCnbU8ULXGvMigf4hIywDX3IvbQxpKtBkg0gHUdW4=";
+        };
+        meta = old.meta // {
+          knownVulnerabilities = [
+            "CVE-2022-34749"
+          ];
+        };
+      });
+    };
+  };
+in python.pkgs.buildPythonApplication rec {
+  pname = "mrkd";
+  version = "0.2.0";
+
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "456f8c1be99da268554b29c6b5383532e58119def5a65d85270bc6a0ecc26aaf";
+  };
+
+  propagatedBuildInputs = with python.pkgs; [
+    jinja2
+    mistune
+    pygments
+    setuptools
+  ];
+
+  pythonImportsCheck = [ "mrkd" ];
+
+  meta = with lib; {
+    description = "Write man pages using Markdown, and convert them to Roff or HTML";
+    homepage = "https://github.com/refi64/mrkd";
+    license = licenses.bsd2;
+    mainProgram = "mrkd";
+    maintainers = with maintainers; [ prusnak ];
+  };
+}
diff --git a/pkgs/tools/text/rare-regex/default.nix b/pkgs/tools/text/rare-regex/default.nix
index 76b928e2b1e5..6dbd062ef61c 100644
--- a/pkgs/tools/text/rare-regex/default.nix
+++ b/pkgs/tools/text/rare-regex/default.nix
@@ -10,13 +10,13 @@
 
 buildGoModule rec {
   pname = "rare";
-  version = "0.3.2";
+  version = "0.3.3";
 
   src = fetchFromGitHub {
     owner = "zix99";
     repo = "rare";
     rev = version;
-    hash = "sha256-v3zczT3PMSm2AMKVnVdDxsCpYA8QhZcmOCuiQiz5hFo=";
+    hash = "sha256-83iHYWMdLOzWDu/WW2TN8D2gUe2Y74aGBUjfHIa9ki8=";
   };
 
   vendorHash = "sha256-wUOtxNjL/4MosACCzPTWKWrnMZhxINfN1ppkRsqDh9M=";
diff --git a/pkgs/tools/text/reveal-md/default.nix b/pkgs/tools/text/reveal-md/default.nix
new file mode 100644
index 000000000000..0ae05e59025d
--- /dev/null
+++ b/pkgs/tools/text/reveal-md/default.nix
@@ -0,0 +1,41 @@
+{ lib
+, buildNpmPackage
+, fetchFromGitHub
+}:
+
+buildNpmPackage rec {
+  pname = "reveal-md";
+  version = "5.5.1";
+
+  src = fetchFromGitHub {
+    owner = "webpro";
+    repo = "reveal-md";
+    rev = version;
+    hash = "sha256-BlUZsETMdOmnz+OFGQhQ9aLHxIIAZ12X1ipy3u59zxo=";
+  };
+
+  npmDepsHash = "sha256-xaDBB16egGi8zThHRrhcN8TVf6Nqkx8fkbxWqvJwJb4=";
+
+  env = {
+    PUPPETEER_SKIP_CHROMIUM_DOWNLOAD = true;
+  };
+
+  dontNpmBuild = true;
+
+  doCheck = true;
+
+  checkPhase = ''
+    runHook preCheck
+
+    npm run test
+
+    runHook postCheck
+  '';
+
+  meta = {
+    description = "Get beautiful reveal.js presentations from your Markdown files";
+    homepage = "https://github.com/webpro/reveal-md";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ sagikazarmark ];
+  };
+}
diff --git a/pkgs/tools/text/xml/jing-trang/default.nix b/pkgs/tools/text/xml/jing-trang/default.nix
index c7866f8cba8a..f13a82faf295 100644
--- a/pkgs/tools/text/xml/jing-trang/default.nix
+++ b/pkgs/tools/text/xml/jing-trang/default.nix
@@ -24,7 +24,7 @@ stdenv.mkDerivation rec {
 
   installPhase = ''
     mkdir -p "$out"/{share/java,bin}
-    cp ./build/*.jar "$out/share/java/"
+    cp ./build/*.jar ./lib/resolver.jar "$out/share/java/"
 
     for tool in jing trang; do
     cat > "$out/bin/$tool" <<EOF
diff --git a/pkgs/tools/typesetting/scdoc/default.nix b/pkgs/tools/typesetting/scdoc/default.nix
index 17a91d18e393..7ab2a82ed320 100644
--- a/pkgs/tools/typesetting/scdoc/default.nix
+++ b/pkgs/tools/typesetting/scdoc/default.nix
@@ -1,38 +1,42 @@
-{ lib, stdenv, fetchFromSourcehut, buildPackages }:
+{ lib
+, stdenv
+, fetchFromSourcehut
+, buildPackages
+}:
 
-stdenv.mkDerivation rec {
+stdenv.mkDerivation (finalAttrs: {
   pname = "scdoc";
   version = "1.11.2";
 
   src = fetchFromSourcehut {
     owner = "~sircmpwn";
-    repo = pname;
-    rev = version;
-    sha256 = "07c2vmdgqifbynm19zjnrk7h102pzrriv73izmx8pmd7b3xl5mfq";
+    repo = "scdoc";
+    rev = finalAttrs.version;
+    hash = "sha256-2NVC+1in1Yt6/XGcHXP+V4AAz8xW/hSq9ctF/Frdgh0=";
   };
 
+  outputs = [ "out" "man" "dev" ];
+
   postPatch = ''
     substituteInPlace Makefile \
-      --replace "-static" "" \
-      --replace "/usr/local" "$out"
+      --replace "-static" ""
   '';
 
-  makeFlags = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
-    "HOST_SCDOC=${buildPackages.scdoc}/bin/scdoc"
+  makeFlags = [
+    "PREFIX=${placeholder "out"}"
+  ] ++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) [
+    "HOST_SCDOC=${lib.getExe buildPackages.scdoc}"
   ];
 
   doCheck = true;
 
-  meta = with lib; {
-    description = "A simple man page generator";
-    longDescription = ''
-      scdoc is a simple man page generator written for POSIX systems written in
-      C99.
-    '';
+  meta = {
+    description = "A simple man page generator written in C99 for POSIX systems";
     homepage = "https://git.sr.ht/~sircmpwn/scdoc";
-    changelog = "https://git.sr.ht/~sircmpwn/scdoc/refs/${version}";
-    license = licenses.mit;
-    platforms = platforms.unix;
-    maintainers = with maintainers; [ primeos ];
+    changelog = "https://git.sr.ht/~sircmpwn/scdoc/refs/${finalAttrs.version}";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ primeos AndersonTorres ];
+    platforms = lib.platforms.unix;
+    mainProgram = "scdoc";
   };
-}
+})
diff --git a/pkgs/tools/typesetting/sile/default.nix b/pkgs/tools/typesetting/sile/default.nix
index 8cf45ea584c0..122f4304838b 100644
--- a/pkgs/tools/typesetting/sile/default.nix
+++ b/pkgs/tools/typesetting/sile/default.nix
@@ -108,8 +108,14 @@ stdenv.mkDerivation rec {
       --replace "ASSERT(ht && ht->table && iter);" "ASSERT(ht && iter);"
   '';
 
-  # Hack to avoid TMPDIR in RPATHs.
-  preFixup = ''rm -rf "$(pwd)" && mkdir "$(pwd)" '';
+  # remove forbidden references to $TMPDIR
+  preFixup = lib.optionalString stdenv.isLinux ''
+    for f in "$out"/bin/*; do
+      if isELF "$f"; then
+        patchelf --shrink-rpath --allowed-rpath-prefixes "$NIX_STORE" "$f"
+      fi
+    done
+  '';
 
   outputs = [ "out" "doc" "man" "dev" ];
 
diff --git a/pkgs/tools/typesetting/skribilo/default.nix b/pkgs/tools/typesetting/skribilo/default.nix
index 24b579c49a33..264eeea52e38 100644
--- a/pkgs/tools/typesetting/skribilo/default.nix
+++ b/pkgs/tools/typesetting/skribilo/default.nix
@@ -10,9 +10,9 @@
 , imagemagick
 , makeWrapper
 , pkg-config
-, ploticus
 , enableEmacs ? false, emacs
-, enableLout ? true, lout
+, enableLout ? stdenv.isLinux, lout
+, enablePloticus ? stdenv.isLinux, ploticus
 , enableTex ? true, tex
 }:
 
@@ -40,10 +40,10 @@ in stdenv.mkDerivation (finalAttrs: {
     guile-lib
     guile-reader
     imagemagick
-    ploticus
   ]
   ++ optional enableEmacs emacs
   ++ optional enableLout lout
+  ++ optional enablePloticus ploticus
   ++ optional enableTex tex;
 
   postInstall =
diff --git a/pkgs/tools/typesetting/tex/texlive/UPGRADING.md b/pkgs/tools/typesetting/tex/texlive/UPGRADING.md
index c9d4a81a2c39..302fac3020a6 100644
--- a/pkgs/tools/typesetting/tex/texlive/UPGRADING.md
+++ b/pkgs/tools/typesetting/tex/texlive/UPGRADING.md
@@ -98,3 +98,34 @@ a message like
 
 Please make sure to follow the [CONTRIBUTING](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md)
 guidelines.
+
+## Reviewing the bin containers
+
+Most `tlType == "bin"` containers consist of links to scripts distributed in
+`$TEXMFDIST/scripts` with a number of patches applied within `default.nix`.
+
+At each upgrade, please run the tests `tests.texlive.shebangs` to verify that
+all shebangs have been patched and in case add the relevant interpreters, and
+use `tests.texlive.binaries` to check if basic execution of all binaries works.
+
+Please review manually all binaries in the `broken` and `ignored` lists of
+`tests.texlive.binaries` at least once for major TeX Live release.
+
+Since the tests cannot catch all runtime dependencies, you should grep the
+`$TEXMFDIST/scripts` folder for common cases, for instance (where `$scripts`
+points to the relevant folder of `scheme-full`):
+- Calls to `exec $interpreter`
+  ```
+  grep -IRS 'exec ' "$TEXMFDIST/scripts" | cut -d: -f2 | sort -u | less -S
+  ```
+- Calls to Ghostscripts (see `needsGhostscript` in `combine.nix`)
+  ```
+  grep -IR '\([^a-zA-Z]\|^\)gs\( \|$\|"\)' "$TEXMFDIST"/scripts
+  grep -IR 'rungs' "$TEXMFDIST"
+  ```
+
+As a general rule, if a runtime dependency as above is essential for the core
+functionality of the package, then it should be made available in the bin
+containers (by patching `PATH`), or in `texlive.combine` (as we do for
+Ghostscript). Non-essential runtime dependencies should be ignored if they
+increase the closure substantially.
diff --git a/pkgs/tools/typesetting/tex/texlive/bin.nix b/pkgs/tools/typesetting/tex/texlive/bin.nix
index b48886e10096..21e916f66429 100644
--- a/pkgs/tools/typesetting/tex/texlive/bin.nix
+++ b/pkgs/tools/typesetting/tex/texlive/bin.nix
@@ -5,7 +5,7 @@
 , perl, perlPackages, python3Packages, pkg-config
 , libpaper, graphite2, zziplib, harfbuzz, potrace, gmp, mpfr
 , brotli, cairo, pixman, xorg, clisp, biber, woff2, xxHash
-, makeWrapper, shortenPerlShebang, useFixedHashes
+, makeWrapper, shortenPerlShebang, useFixedHashes, asymptote
 }:
 
 # Useful resource covering build options:
@@ -387,38 +387,6 @@ dvipng = stdenv.mkDerivation {
   enableParallelBuilding = true;
 };
 
-
-latexindent = perlPackages.buildPerlPackage rec {
-  pname = "latexindent";
-  inherit (src) version;
-
-  src = assertFixedHash pname (lib.head (builtins.filter (p: p.tlType == "run") texlive.latexindent.pkgs));
-
-  outputs = [ "out" ];
-
-  nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang;
-  propagatedBuildInputs = with perlPackages; [ FileHomeDir LogDispatch LogLog4perl UnicodeLineBreak YAMLTiny ];
-
-  postPatch = ''
-    substituteInPlace scripts/latexindent/LatexIndent/GetYamlSettings.pm \
-      --replace '$FindBin::RealBin/defaultSettings.yaml' ${src}/scripts/latexindent/defaultSettings.yaml
-  '';
-
-  # Dirty hack to apply perlFlags, but do no build
-  preConfigure = ''
-    touch Makefile.PL
-  '';
-  dontBuild = true;
-  installPhase = ''
-    install -D ./scripts/latexindent/latexindent.pl "$out"/bin/latexindent
-    mkdir -p "$out"/${perl.libPrefix}
-    cp -r ./scripts/latexindent/LatexIndent "$out"/${perl.libPrefix}/
-  '' + lib.optionalString stdenv.isDarwin ''
-    shortenPerlShebang "$out"/bin/latexindent
-  '';
-};
-
-
 pygmentex = python3Packages.buildPythonApplication rec {
   pname = "pygmentex";
   inherit (src) version;
@@ -456,27 +424,7 @@ pygmentex = python3Packages.buildPythonApplication rec {
   };
 };
 
-
-texlinks = stdenv.mkDerivation rec {
-  name = "texlinks";
-
-  src = assertFixedHash name (lib.head (builtins.filter (p: p.tlType == "run") texlive.texlive-scripts-extra.pkgs));
-
-  dontBuild = true;
-  doCheck = false;
-
-  installPhase = ''
-    runHook preInstall
-
-    # Patch texlinks.sh back to 2015 version;
-    # otherwise some bin/ links break, e.g. xe(la)tex.
-    patch --verbose -R scripts/texlive-extra/texlinks.sh < '${./texlinks.diff}'
-    install -Dm555 scripts/texlive-extra/texlinks.sh "$out"/bin/texlinks
-
-    runHook postInstall
-  '';
-};
-
+inherit asymptote;
 
 inherit biber;
 bibtexu = bibtex8;
diff --git a/pkgs/tools/typesetting/tex/texlive/combine.nix b/pkgs/tools/typesetting/tex/texlive/combine.nix
index 38a26721abfd..8d4c2998d6d4 100644
--- a/pkgs/tools/typesetting/tex/texlive/combine.nix
+++ b/pkgs/tools/typesetting/tex/texlive/combine.nix
@@ -1,39 +1,26 @@
 params: with params;
 # combine =
 args@{
-  pkgFilter ? (pkg: pkg.tlType == "run" || pkg.tlType == "bin" || pkg.pname == "core")
+  pkgFilter ? (pkg: pkg.tlType == "run" || pkg.tlType == "bin" || pkg.pname == "core"
+                    || pkg.hasManpages or false)
 , extraName ? "combined"
 , extraVersion ? ""
 , ...
 }:
 let
-  pkgSet = removeAttrs args [ "pkgFilter" "extraName" "extraVersion" ] // {
-    # include a fake "core" package
-    core.pkgs = [
-      (bin.core.out // { pname = "core"; tlType = "bin"; })
-      (bin.core.doc // { pname = "core"; tlType = "doc"; })
-    ];
-  };
+  pkgSet = removeAttrs args [ "pkgFilter" "extraName" "extraVersion" ];
   pkgList = rec {
     combined = combinePkgs (lib.attrValues pkgSet);
     all = lib.filter pkgFilter combined;
     splitBin = builtins.partition (p: p.tlType == "bin") all;
-    bin = splitBin.right
-      ++ lib.optional
-          (lib.any (p: p.tlType == "run" && p.pname == "pdfcrop") splitBin.wrong)
-          (lib.getBin ghostscript);
+    bin = splitBin.right;
     nonbin = splitBin.wrong;
     tlpkg = lib.filter (pkg: pkg.tlType == "tlpkg") combined;
-
-    # extra interpreters needed for shebangs, based on 2015 schemes "medium" and "tetex"
-    # (omitted tk needed in pname == "epspdf", bin/epspdftk)
-    pkgNeedsPython = pkg: pkg.tlType == "run" && lib.elem pkg.pname
-      [ "de-macro" "pythontex" "dviasm" "texliveonfly" ];
-    pkgNeedsRuby = pkg: pkg.tlType == "run" && pkg.pname == "match-parens";
-    extraInputs =
-      lib.optional (lib.any pkgNeedsPython splitBin.wrong) python3
-      ++ lib.optional (lib.any pkgNeedsRuby splitBin.wrong) ruby;
   };
+  # list generated by inspecting `grep -IR '\([^a-zA-Z]\|^\)gs\( \|$\|"\)' "$TEXMFDIST"/scripts`
+  # and `grep -IR rungs "$TEXMFDIST"`
+  # and ignoring luatex, perl, and shell scripts (those must be patched using postFixup)
+  needsGhostscript = lib.any (p: lib.elem p.pname [ "context" "dvipdfmx" "latex-papersize" "lyluatex" ]) pkgList.bin;
 
   name = "texlive-${extraName}-${bin.texliveYear}${extraVersion}";
 
@@ -43,11 +30,11 @@ let
     # remove fake derivations (without 'outPath') to avoid undesired build dependencies
     paths = lib.catAttrs "outPath" pkgList.nonbin;
 
-    nativeBuildInputs = [ perl bin.core.out ];
+    nativeBuildInputs = [ (lib.last tl.texlive-scripts.pkgs) ];
 
     postBuild = # generate ls-R database
     ''
-      perl "$out/scripts/texlive/mktexlsr.pl" --sort "$out"
+      mktexlsr --sort "$out"
     '';
   }).overrideAttrs (_: { allowSubstitutes = true; });
 
@@ -94,11 +81,17 @@ in (buildEnv {
     "/share/texmf-var/scripts"
     "/share/texmf-var/tex/generic/config"
     "/share/texmf-var/web2c"
+    "/share/texmf-config"
     "/bin" # ensure these are writeable directories
   ];
 
-  nativeBuildInputs = [ makeWrapper libfaketime perl bin.texlinks ];
-  buildInputs = pkgList.extraInputs;
+  nativeBuildInputs = [
+    makeWrapper
+    libfaketime
+    (lib.last tl.texlive-scripts.pkgs) # fmtutil, mktexlsr, updmap
+    (lib.last tl.texlive-scripts-extra.pkgs) # texlinks
+    perl
+  ];
 
   passthru = {
     # This is set primarily to help find-tarballs.nix to do its job
@@ -107,7 +100,9 @@ in (buildEnv {
     fonts = "${texmfroot}/texmf-dist/fonts";
   };
 
-  postBuild = ''
+  postBuild =
+    # environment variables (note: only export the ones that are used in the wrappers)
+  ''
     TEXMFROOT="${texmfroot}"
     TEXMFDIST="${texmfdist}"
     export PATH="$out/bin:$PATH"
@@ -115,6 +110,35 @@ in (buildEnv {
     TEXMFSYSVAR="$out/share/texmf-var"
     export TEXMFCNF="$TEXMFSYSVAR/web2c"
   '' +
+    # wrap executables with required env vars as early as possible
+    # 1. we want texlive.combine to use the wrapped binaries, to catch bugs
+    # 2. we do not want to wrap links generated by texlinks
+  ''
+    enable -f '${bash}/lib/bash/realpath' realpath
+    declare -i wrapCount=0
+    for link in "$out"/bin/*; do
+      target="$(realpath "$link")"
+      if [[ "''${target##*/}" != "''${link##*/}" ]] ; then
+        # detected alias with different basename, use immediate target of $link to preserve $0
+        # relevant for mktexfmt, repstopdf, ...
+        target="$(readlink "$link")"
+      fi
+
+      rm "$link"
+      makeWrapper "$target" "$link" \
+        --inherit-argv0 \
+        --prefix PATH : "${
+          # very common dependencies that are not detected by tests.texlive.binaries
+          lib.makeBinPath ([ coreutils gawk gnugrep gnused ] ++ lib.optional needsGhostscript ghostscript)}:$out/bin" \
+        --set-default TEXMFCNF "$TEXMFCNF" \
+        --set-default FONTCONFIG_FILE "${
+          # necessary for XeTeX to find the fonts distributed with texlive
+          makeFontsConf { fontDirectories = [ "${texmfroot}/texmf-dist/fonts" ]; }
+        }"
+      wrapCount=$((wrapCount + 1))
+    done
+    echo "wrapped $wrapCount binaries and scripts"
+  '' +
     # patch texmf-dist  -> $TEXMFDIST
     # patch texmf-local -> $out/share/texmf-local
     # patch texmf.cnf   -> $TEXMFSYSVAR/web2c/texmf.cnf
@@ -153,7 +177,7 @@ in (buildEnv {
   (let
     hyphens = lib.filter (p: p.hasHyphens or false && p.tlType == "run") pkgList.splitBin.wrong;
     hyphenPNames = map (p: p.pname) hyphens;
-    formats = lib.filter (p: p.hasFormats or false && p.tlType == "run") pkgList.splitBin.wrong;
+    formats = lib.filter (p: p ? formats && p.tlType == "run") pkgList.splitBin.wrong;
     formatPNames = map (p: p.pname) formats;
     # sed expression that prints the lines in /start/,/end/ except for /end/
     section = start: end: "/${start}/,/${end}/{ /${start}/p; /${end}/!p; };\n";
@@ -199,54 +223,11 @@ in (buildEnv {
     [[ -e "$TEXMFDIST"/web2c/fmtutil.cnf ]] && sed -E -f '${fmtutilSed}' "$TEXMFDIST"/web2c/fmtutil.cnf > "$TEXMFCNF"/fmtutil.cnf
 
     # make new files visible to kpathsea
-    perl "$TEXMFDIST"/scripts/texlive/mktexlsr.pl --sort "$TEXMFSYSVAR"
+    mktexlsr --sort "$TEXMFSYSVAR"
   '') +
-
-  # function to wrap created executables with required env vars
+    # generate format links (reads fmtutil.cnf to know which ones) *after* the wrappers have been generated
   ''
-    wrapBin() {
-    for link in "$out"/bin/*; do
-      [ -L "$link" -a -x "$link" ] || continue # if not link, assume OK
-      local target=$(readlink "$link")
-
-      # skip simple local symlinks; mktexfmt in particular
-      echo "$target" | grep / > /dev/null || continue;
-
-      echo -n "Wrapping '$link'"
-      rm "$link"
-      makeWrapper "$target" "$link" \
-        --prefix PATH : "${gnused}/bin:${gnugrep}/bin:${coreutils}/bin:$out/bin:${perl}/bin" \
-        --set-default TEXMFCNF "$TEXMFCNF" \
-        --set-default FONTCONFIG_FILE "${
-          # neccessary for XeTeX to find the fonts distributed with texlive
-          makeFontsConf { fontDirectories = [ "${texmfroot}/texmf-dist/fonts" ]; }
-        }"
-
-      # avoid using non-nix shebang in $target by calling interpreter
-      if [[ "$(head -c 2 "$target")" = "#!" ]]; then
-        local cmdline="$(head -n 1 "$target" | sed 's/^\#\! *//;s/ *$//')"
-        local relative=`basename "$cmdline" | sed 's/^env //' `
-        local newInterp=`echo "$relative" | cut -d\  -f1`
-        local params=`echo "$relative" | cut -d\  -f2- -s`
-        local newPath="$(type -P "$newInterp")"
-        if [[ -z "$newPath" ]]; then
-          echo " Warning: unknown shebang '$cmdline' in '$target'"
-          continue
-        fi
-        echo " and patching shebang '$cmdline'"
-        sed "s|^exec |exec $newPath $params |" -i "$link"
-
-      elif head -n 1 "$target" | grep -q 'exec perl'; then
-        # see #24343 for details of the problem
-        echo " and patching weird perl shebang"
-        sed "s|^exec |exec '${perl}/bin/perl' -w |" -i "$link"
-
-      else
-        sed 's|^exec |exec -a "$0" |' -i "$link"
-        echo
-      fi
-    done
-    }
+    texlinks --quiet "$out/bin"
   '' +
   # texlive postactions (see TeXLive::TLUtils::_do_postaction_script)
   (lib.concatMapStrings (pkg: ''
@@ -259,20 +240,8 @@ in (buildEnv {
     echo "postaction install script for ${pkg.pname}: ''${postInterp:+$postInterp }$postaction install $TEXMFROOT"
     $postInterp "$TEXMFROOT/$postaction" install "$TEXMFROOT"
   '') (lib.filter (pkg: pkg ? postactionScript) pkgList.tlpkg)) +
-  # texlive post-install actions
-  ''
-    ln -sf "$TEXMFDIST"/scripts/texlive/updmap.pl "$out"/bin/updmap
-    ln -sf "$TEXMFDIST"/scripts/texlive/fmtutil.pl "$out"/bin/fmtutil
-  '' +
-    # now hack to preserve "$0" for mktexfmt
-  ''
-    cp "$TEXMFDIST"/scripts/texlive/fmtutil.pl "$TEXMFSYSVAR"/scripts/mktexfmt
-    ln -sf "$TEXMFSYSVAR"/scripts/mktexfmt "$out"/bin/mktexfmt
-  '' +
     # generate formats
   ''
-    texlinks "$out/bin" && wrapBin
-
     # many formats still ignore SOURCE_DATE_EPOCH even when FORCE_SOURCE_DATE=1
     # libfaketime fixes non-determinism related to timestamps ignoring FORCE_SOURCE_DATE
     # we cannot fix further randomness caused by luatex; for further details, see
@@ -282,41 +251,20 @@ in (buildEnv {
     substitute "$TEXMFDIST"/scripts/texlive/fmtutil.pl fmtutil \
       --replace 'my $cmdline = "$eng -ini ' 'my $cmdline = "faketime -f '"'"'\@1980-01-01 00:00:00 x0.001'"'"' $eng -ini '
     FORCE_SOURCE_DATE=1 TZ= perl fmtutil --sys --all | grep '^fmtutil' # too verbose
-    #texlinks "$out/bin" && wrapBin # do we need to regenerate format links?
 
     # Disable unavailable map files
-    echo y | updmap --sys --syncwithtrees --force
+    echo y | updmap --sys --syncwithtrees --force 2>&1 | grep '^\(updmap\|  /\)'
     # Regenerate the map files (this is optional)
-    updmap --sys --force
+    updmap --sys --force 2>&1 | grep '^\(updmap\|  /\)'
 
     # sort entries to improve reproducibility
     [[ -f "$TEXMFSYSCONFIG"/web2c/updmap.cfg ]] && sort -o "$TEXMFSYSCONFIG"/web2c/updmap.cfg "$TEXMFSYSCONFIG"/web2c/updmap.cfg
 
-    perl "$TEXMFDIST"/scripts/texlive/mktexlsr.pl --sort "$TEXMFSYSCONFIG" "$TEXMFSYSVAR" # to make sure
-  '' +
-    # install (wrappers for) scripts, based on a list from upstream texlive
-  ''
-    source '${bin.core.out}/share/texmf-dist/scripts/texlive/scripts.lst'
-    for s in $texmf_scripts; do
-      [[ -x "$TEXMFDIST/scripts/$s" ]] || continue
-      tName="$(basename $s | sed 's/\.[a-z]\+$//')" # remove extension
-      [[ ! -e "$out/bin/$tName" ]] || continue
-      ln -sv "$(realpath "$TEXMFDIST/scripts/$s")" "$out/bin/$tName" # wrapped below
-    done
+    mktexlsr --sort "$TEXMFSYSCONFIG" "$TEXMFSYSVAR" # to make sure (of what?)
   '' +
-    # A hacky way to provide repstopdf
-    #  * Copy is done to have a correct "$0" so that epstopdf enables the restricted mode
-    #  * ./bin/repstopdf needs to be a symlink to be processed by wrapBin
-  ''
-    if [[ -e "$out"/bin/epstopdf ]]; then
-      cp "$out"/bin/epstopdf "$TEXMFSYSVAR"/scripts/repstopdf
-      ln -s "$TEXMFSYSVAR"/scripts/repstopdf "$out"/bin/repstopdf
-    fi
-  '' +
-    # finish up the wrappers
+    # remove *-sys scripts since /nix/store is readonly
   ''
     rm "$out"/bin/*-sys
-    wrapBin
   '' +
   # TODO: a context trigger https://www.preining.info/blog/2015/06/debian-tex-live-2015-the-new-layout/
     # http://wiki.contextgarden.net/ConTeXt_Standalone#Unix-like_platforms_.28Linux.2FMacOS_X.2FFreeBSD.2FSolaris.29
@@ -332,8 +280,7 @@ in (buildEnv {
         --replace 'uuid=osuuid(),' 'uuid="242be807-d17e-4792-8e39-aa93326fc871",'
       FORCE_SOURCE_DATE=1 TZ= faketime -f '@1980-01-01 00:00:00 x0.001' luatex --luaonly mtxrun.lua --generate
     fi
-  ''
-    + bin.cleanBrokenLinks +
+  '' +
   # Get rid of all log files. They are not needed, but take up space
   # and render the build unreproducible by their embedded timestamps
   # and other non-deterministic diagnostics.
diff --git a/pkgs/tools/typesetting/tex/texlive/default.nix b/pkgs/tools/typesetting/tex/texlive/default.nix
index f5696eba4f94..8dff1469a90d 100644
--- a/pkgs/tools/typesetting/tex/texlive/default.nix
+++ b/pkgs/tools/typesetting/tex/texlive/default.nix
@@ -4,8 +4,10 @@
 */
 { stdenv, lib, fetchurl, runCommand, writeText, buildEnv
 , callPackage, ghostscript_headless, harfbuzz
-, makeWrapper, python3, ruby, perl, gnused, gnugrep, coreutils
-, libfaketime, makeFontsConf
+, makeWrapper
+, python3, ruby, perl, tk, jdk, bash, snobol4
+, coreutils, findutils, gawk, getopt, gnugrep, gnumake, gnused, gzip, ncurses, zip
+, libfaketime, asymptote, makeFontsConf
 , useFixedHashes ? true
 , recurseIntoAttrs
 }:
@@ -22,7 +24,7 @@ let
   # function for creating a working environment from a set of TL packages
   combine = import ./combine.nix {
     inherit bin combinePkgs buildEnv lib makeWrapper writeText runCommand
-      stdenv python3 ruby perl gnused gnugrep coreutils libfaketime makeFontsConf;
+      stdenv perl libfaketime makeFontsConf bash tl coreutils gawk gnugrep gnused;
     ghostscript = ghostscript_headless;
   };
 
@@ -32,24 +34,340 @@ let
 
   # the set of TeX Live packages, collections, and schemes; using upstream naming
   tl = let
-    orig = removeAttrs tlpdb [ "00texlive.config" ];
+    # most format -> engine links are generated by texlinks according to fmtutil.cnf at combine time
+    # so we remove them from binfiles, and add back the ones texlinks purposefully ignore (e.g. mptopdf)
+    removeFormatLinks = lib.mapAttrs (_: attrs:
+      if (attrs ? formats && attrs ? binfiles)
+      then let formatLinks = lib.catAttrs "name" (lib.filter (f: f.name != f.engine) attrs.formats);
+               binNotFormats = lib.subtractLists formatLinks attrs.binfiles;
+           in if binNotFormats != [] then attrs // { binfiles = binNotFormats; } else removeAttrs attrs [ "binfiles" ]
+      else attrs);
+
+    orig = removeFormatLinks (removeAttrs tlpdb [ "00texlive.config" ]);
+
+    overridden = lib.recursiveUpdate orig rec {
+      #### overrides of texlive.tlpdb
+
+      #### nonstandard script folders
+      context.scriptsFolder = "context/stubs/unix";
+      cyrillic-bin.scriptsFolder = "texlive-extra";
+      fontinst.scriptsFolder = "texlive-extra";
+      mptopdf.scriptsFolder = "context/perl";
+      pdftex.scriptsFolder = "simpdftex";
+      "texlive.infra".scriptsFolder = "texlive";
+      texlive-scripts.scriptsFolder = "texlive";
+      texlive-scripts-extra.scriptsFolder = "texlive-extra";
+      xetex.scriptsFolder = "texlive-extra";
+
+      #### interpreters not detected by looking at the script extensions
+      ctanbib.extraBuildInputs = [ bin.luatex ];
+      de-macro.extraBuildInputs = [ python3 ];
+      match_parens.extraBuildInputs = [ ruby ];
+      optexcount.extraBuildInputs = [ python3 ];
+      pdfbook2.extraBuildInputs = [ python3 ];
+      texlogsieve.extraBuildInputs = [ bin.luatex ];
+
+      #### perl packages
+      crossrefware.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ LWP URI ])) ];
+      ctan-o-mat.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ LWP LWPProtocolHttps ])) ];
+      ctanify.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ FileCopyRecursive ])) ];
+      ctanupload.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ HTMLFormatter WWWMechanize ])) ];
+      exceltex.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ SpreadsheetParseExcel ])) ];
+      latex-git-log.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ IPCSystemSimple ])) ];
+      latexindent.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ FileHomeDir LogDispatch LogLog4perl UnicodeLineBreak YAMLTiny ])) ];
+      pax.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ FileWhich ])) ];
+      ptex-fontmaps.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ Tk ])) ];
+      purifyeps.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ FileWhich ])) ];
+      svn-multi.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ TimeDate ])) ];
+      texdoctk.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ Tk ])) ];
+      ulqda.extraBuildInputs = [ (perl.withPackages (ps: with ps; [ DigestSHA1 ])) ];
+
+      #### python packages
+      pythontex.extraBuildInputs = [ (python3.withPackages (ps: with ps; [ pygments ])) ];
+
+      #### other runtime PATH dependencies
+      a2ping.extraBuildInputs = [ ghostscript_headless ];
+      bibexport.extraBuildInputs = [ gnugrep ];
+      checklistings.extraBuildInputs = [ coreutils ];
+      cjk-gs-integrate.extraBuildInputs = [ ghostscript_headless ];
+      context.extraBuildInputs = [ coreutils ruby ];
+      cyrillic-bin.extraBuildInputs = [ coreutils gnused ];
+      dtxgen.extraBuildInputs = [ coreutils getopt gnumake zip ];
+      dviljk.extraBuildInputs = [ coreutils ];
+      epspdf.extraBuildInputs = [ ghostscript_headless ];
+      epstopdf.extraBuildInputs = [ ghostscript_headless ];
+      fragmaster.extraBuildInputs = [ ghostscript_headless ];
+      installfont.extraBuildInputs = [ coreutils getopt gnused ];
+      latexfileversion.extraBuildInputs = [ coreutils gnugrep gnused ];
+      listings-ext.extraBuildInputs = [ coreutils getopt ];
+      ltxfileinfo.extraBuildInputs = [ coreutils getopt gnused ];
+      ltximg.extraBuildInputs = [ ghostscript_headless ];
+      luaotfload.extraBuildInputs = [ ncurses ];
+      makeindex.extraBuildInputs = [ coreutils gnused ];
+      pagelayout.extraBuildInputs = [ gnused ncurses ];
+      pdfcrop.extraBuildInputs = [ ghostscript_headless ];
+      pdftex.extraBuildInputs = [ coreutils ghostscript_headless gnused ];
+      pdftex-quiet.extraBuildInputs = [ coreutils ];
+      pdfxup.extraBuildInputs = [ coreutils ghostscript_headless ];
+      pkfix-helper.extraBuildInputs = [ ghostscript_headless ];
+      ps2eps.extraBuildInputs = [ ghostscript_headless ];
+      pst2pdf.extraBuildInputs = [ ghostscript_headless ];
+      tex4ht.extraBuildInputs = [ ruby ];
+      texlive-scripts.extraBuildInputs = [ gnused ];
+      texlive-scripts-extra.extraBuildInputs = [ coreutils findutils ghostscript_headless gnused ];
+      thumbpdf.extraBuildInputs = [ ghostscript_headless ];
+      tpic2pdftex.extraBuildInputs = [ gawk ];
+      wordcount.extraBuildInputs = [ coreutils gnugrep ];
+      xdvi.extraBuildInputs = [ coreutils gnugrep ];
+      xindy.extraBuildInputs = [ gzip ];
+
+      #### adjustments to binaries
+      # TODO patch the scripts from bin.* directly in bin.* instead of here
+
+      # TODO we do not build binaries for the following packages (yet!)
+      biber-ms.binfiles = [];
+      xpdfopen.binfiles = [];
+
+      # mptopdf is a format link, but not generated by texlinks
+      # so we add it back to binfiles to generate it from mkPkgBin
+      mptopdf.binfiles = (orig.mptopdf.binfiles or []) ++ [ "mptopdf" ];
+
+      # mktexlsr distributed by texlive.infra has implicit dependencies (e.g. kpsestat)
+      # the perl one hidden in texlive-scripts is better behaved
+      "texlive.infra".binfiles = lib.remove "mktexlsr" orig."texlive.infra".binfiles;
+
+      # remove man, add mktexlsr
+      texlive-scripts.binfiles = (lib.remove "man" orig.texlive-scripts.binfiles) ++ [ "mktexlsr" ];
+
+      # upmendex is "TODO" in bin.nix
+      uptex.binfiles = lib.remove "upmendex" orig.uptex.binfiles;
+
+      # teckit_compile seems to be missing from bin.core{,-big}
+      # TODO find it!
+      xetex.binfiles = lib.remove "teckit_compile" orig.xetex.binfiles;
+
+      # xindy is broken on some platforms unfortunately
+      xindy.binfiles = if bin ? xindy
+        then lib.subtractLists [ "xindy.mem" "xindy.run" ] orig.xindy.binfiles
+        else [];
+
+      #### additional symlinks
+      cluttex.binlinks = {
+        cllualatex = "cluttex";
+        clxelatex = "cluttex";
+      };
 
-    overridden = lib.recursiveUpdate orig {
-      # overrides of texlive.tlpdb
+      epstopdf.binlinks.repstopdf = "epstopdf";
+      pdfcrop.binlinks.rpdfcrop = "pdfcrop";
 
-      # only *.po for tlmgr
-      texlive-msg-translations.hasTlpkg = false;
+      ptex.binlinks = {
+        pdvitomp = bin.metapost + "/bin/pdvitomp";
+        pmpost = bin.metapost + "/bin/pmpost";
+        r-pmpost = bin.metapost + "/bin/r-pmpost";
+      };
 
-      # it seems to need it to transform fonts
-      xdvi.deps = (orig.xdvi.deps or []) ++  [ "metafont" ];
+      texdef.binlinks = {
+        latexdef = "texdef";
+      };
 
-      # TODO: remove when updating to texlive-2023, metadata has been corrected in the TeX catalogue
-      # tlpdb lists license as "unknown", but the README says lppl13: http://mirrors.ctan.org/language/arabic/arabi-add/README
-      arabi-add.license = [  "lppl13c" ];
+      texlive-scripts.binlinks = {
+        mktexfmt = "fmtutil";
+        texhash = "mktexlsr";
+      };
 
-      # TODO: remove this when updating to texlive-2023, npp-for-context is no longer in texlive
-      # tlpdb lists license as "noinfo", but it's gpl3: https://github.com/luigiScarso/context-npp
-      npp-for-context.license = [  "gpl3Only" ];
+      texlive-scripts-extra.binlinks = {
+        allec = "allcm";
+        kpsepath = "kpsetool";
+        kpsexpand = "kpsetool";
+      };
+
+      # metapost binaries are in bin.metapost instead of bin.core
+      uptex.binlinks = {
+        r-upmpost = bin.metapost + "/bin/r-upmpost";
+        updvitomp = bin.metapost + "/bin/updvitomp";
+        upmpost = bin.metapost + "/bin/upmpost";
+      };
+
+      #### add PATH dependencies without wrappers
+      # TODO deduplicate this code
+      a2ping.postFixup = ''
+        sed -i '6i$ENV{PATH}='"'"'${lib.makeBinPath a2ping.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/a2ping
+      '';
+
+      bibexport.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath bibexport.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/bibexport
+      '';
+
+      checklistings.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath checklistings.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/checklistings
+      '';
+
+      cjk-gs-integrate.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath cjk-gs-integrate.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/cjk-gs-integrate
+      '';
+
+      context.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath [ coreutils ]}''${PATH:+:$PATH}"' "$out"/bin/{contextjit,mtxrunjit}
+        sed -i '2iPATH="${lib.makeBinPath [ ruby ]}''${PATH:+:$PATH}"' "$out"/bin/texexec
+      '';
+
+      cyrillic-bin.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath cyrillic-bin.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/rumakeindex
+      '';
+
+      dtxgen.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath dtxgen.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/dtxgen
+      '';
+
+      dviljk.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath dviljk.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/dvihp
+      '';
+
+      epstopdf.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath epstopdf.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/epstopdf
+      '';
+
+      fragmaster.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath fragmaster.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/fragmaster
+      '';
+
+      installfont.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath installfont.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/installfont-tl
+      '';
+
+      latexfileversion.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath latexfileversion.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/latexfileversion
+      '';
+
+      listings-ext.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath listings-ext.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/listings-ext.sh
+      '';
+
+      ltxfileinfo.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath ltxfileinfo.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/ltxfileinfo
+      '';
+
+      ltximg.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath ltximg.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/ltximg
+      '';
+
+      luaotfload.postFixup = ''
+        sed -i '2ios.setenv("PATH","${lib.makeBinPath luaotfload.extraBuildInputs}" .. (os.getenv("PATH") and ":" .. os.getenv("PATH") or ""))' "$out"/bin/luaotfload-tool
+      '';
+
+      makeindex.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath makeindex.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/mkindex
+      '';
+
+      pagelayout.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath [ gnused ]}''${PATH:+:$PATH}"' "$out"/bin/pagelayoutapi
+        sed -i '2iPATH="${lib.makeBinPath [ ncurses ]}''${PATH:+:$PATH}"' "$out"/bin/textestvis
+      '';
+
+      pdfcrop.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath pdfcrop.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/pdfcrop
+      '';
+
+      pdftex.postFixup = ''
+        sed -i -e '2iPATH="${lib.makeBinPath [ coreutils gnused ]}''${PATH:+:$PATH}"' \
+          -e 's!^distillerpath="/usr/local/bin"$!distillerpath="${lib.makeBinPath [ ghostscript_headless ]}"!' \
+          "$out"/bin/simpdftex
+      '';
+
+      pdftex-quiet.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath pdftex-quiet.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/pdftex-quiet
+      '';
+
+      pdfxup.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath pdfxup.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/pdfxup
+      '';
+
+      pkfix-helper.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath pkfix-helper.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/pkfix-helper
+      '';
+
+      ps2eps.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath ps2eps.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/ps2eps
+      '';
+
+      pst2pdf.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath pst2pdf.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/pst2pdf
+      '';
+
+      tex4ht.postFixup = ''
+        sed -i -e '2iPATH="${lib.makeBinPath tex4ht.extraBuildInputs}''${PATH:+:$PATH}"' -e 's/\\rubyCall//g;' "$out"/bin/htcontext
+      '';
+
+      texlive-scripts.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath texlive-scripts.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/{fmtutil-user,mktexmf,mktexpk,mktextfm,updmap-user}
+      '';
+
+      thumbpdf.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath thumbpdf.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/thumbpdf
+      '';
+
+      tpic2pdftex.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath tpic2pdftex.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/tpic2pdftex
+      '';
+
+      wordcount.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath wordcount.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/wordcount
+      '';
+
+      # TODO patch in bin.xdvi
+      xdvi.postFixup = ''
+        sed -i '2iPATH="${lib.makeBinPath xdvi.extraBuildInputs}''${PATH:+:$PATH}"' "$out"/bin/xdvi
+      '';
+
+      xindy.postFixup = ''
+        sed -i '2i$ENV{PATH}='"'"'${lib.makeBinPath xindy.extraBuildInputs}'"'"' . ($ENV{PATH} ? ":$ENV{PATH}" : '"'''"');' "$out"/bin/{texindy,xindy}
+      '';
+
+      #### other script fixes
+      # misc tab and python3 fixes
+      ebong.postFixup = ''
+        sed -Ei 's/import sre/import re/; s/file\(/open(/g; s/\t/        /g; s/print +(.*)$/print(\1)/g' "$out"/bin/ebong
+      '';
+
+      # find files in script directory, not binary directory
+      # add runtime dependencies to PATH
+      epspdf.postFixup = ''
+        sed -i '2ios.setenv("PATH","${lib.makeBinPath epspdf.extraBuildInputs}" .. (os.getenv("PATH") and ":" .. os.getenv("PATH") or ""))' "$out"/bin/epspdf
+        substituteInPlace "$out"/bin/epspdftk --replace '[info script]' "\"$scriptsFolder/epspdftk.tcl\""
+      '';
+
+      # find files in script directory, not in binary directory
+      latexindent.postFixup = ''
+        substituteInPlace "$out"/bin/latexindent --replace 'use FindBin;' "BEGIN { \$0 = '$scriptsFolder' . '/latexindent.pl'; }; use FindBin;"
+      '';
+
+      # make tlmgr believe it can use kpsewhich to evaluate TEXMFROOT
+      "texlive.infra".postFixup = ''
+        substituteInPlace "$out"/bin/tlmgr \
+          --replace 'if (-r "$bindir/$kpsewhichname")' 'if (1)'
+      '';
+
+      # Patch texlinks.sh back to 2015 version;
+      # otherwise some bin/ links break, e.g. xe(la)tex.
+      # add runtime dependencies to PATH
+      texlive-scripts-extra.postFixup = ''
+        patch -R "$out"/bin/texlinks < '${./texlinks.diff}'
+        sed -i '2iPATH="${lib.makeBinPath [ coreutils ]}''${PATH:+:$PATH}"' "$out"/bin/{allcm,dvired,mkocp,ps2frag}
+        sed -i '2iPATH="${lib.makeBinPath [ coreutils findutils ]}''${PATH:+:$PATH}"' "$out"/bin/allneeded
+        sed -i '2iPATH="${lib.makeBinPath [ coreutils ghostscript_headless ]}''${PATH:+:$PATH}"' "$out"/bin/dvi2fax
+        sed -i '2iPATH="${lib.makeBinPath [ gnused ]}''${PATH:+:$PATH}"' "$out"/bin/{kpsetool,texconfig,texconfig-sys}
+        sed -i '2iPATH="${lib.makeBinPath [ coreutils gnused ]}''${PATH:+:$PATH}"' "$out"/bin/texconfig-dialog
+      '';
+
+      # patch interpreter
+      texosquery.postFixup = ''
+        substituteInPlace "$out"/bin/* --replace java "$interpJava"
+      '';
+
+      #### dependency changes
+
+      # it seems to need it to transform fonts
+      xdvi.deps = (orig.xdvi.deps or []) ++  [ "metafont" ];
 
       # remove dependency-heavy packages from the basic collections
       collection-basic.deps = lib.subtractLists [ "metafont" "xdvi" ] orig.collection-basic.deps;
@@ -58,6 +376,15 @@ let
       collection-metapost.deps = orig.collection-metapost.deps ++ [ "metafont" ];
       collection-plaingeneric.deps = orig.collection-plaingeneric.deps ++ [ "xdvi" ];
 
+      #### misc
+
+      # tlpdb lists license as "unknown", but the README says lppl13: http://mirrors.ctan.org/language/arabic/arabi-add/README
+      arabi-add.license = [  "lppl13c" ];
+
+      # TODO: remove this when updating to texlive-2023, npp-for-context is no longer in texlive
+      # tlpdb lists license as "noinfo", but it's gpl3: https://github.com/luigiScarso/context-npp
+      npp-for-context.license = [  "gpl3Only" ];
+
       texdoc = {
         extraRevision = ".tlpdb${toString tlpdbVersion.revision}";
         extraVersion = "-tlpdb-${toString tlpdbVersion.revision}";
@@ -91,27 +418,27 @@ let
         pkg = attrs // {
           sha512 = attrs.sha512.${if tlType == "tlpkg" then "run" else tlType};
           inherit pname tlType version;
+        } // lib.optionalAttrs (attrs.hasManpages or false) {
+          hasManpages = true;
         };
         in mkPkg pkg;
-    in {
-      # TL pkg contains lists of packages: runtime files, docs, sources, tlpkg, binaries
-      pkgs =
-        # tarball of a collection/scheme itself only contains a tlobj file
-        [( if (attrs.hasRunfiles or false) then mkPkgV "run"
+      run = if (attrs.hasRunfiles or false) then mkPkgV "run"
             # the fake derivations are used for filtering of hyphenation patterns and formats
-          else {
+          else ({
             inherit pname version;
             tlType = "run";
-            hasFormats = attrs.hasFormats or false;
             hasHyphens = attrs.hasHyphens or false;
             tlDeps = map (n: tl.${n}) (attrs.deps or []);
-          }
-        )]
+          } // lib.optionalAttrs (attrs ? formats) { inherit (attrs) formats; });
+    in {
+      # TL pkg contains lists of packages: runtime files, docs, sources, tlpkg, binaries
+      pkgs =
+        # tarball of a collection/scheme itself only contains a tlobj file
+        [ run ]
         ++ lib.optional (attrs.sha512 ? doc) (mkPkgV "doc")
         ++ lib.optional (attrs.sha512 ? source) (mkPkgV "source")
         ++ lib.optional (attrs.hasTlpkg or false) (mkPkgV "tlpkg")
-        ++ lib.optional (bin ? ${pname})
-            ( bin.${pname} // { tlType = "bin"; } );
+        ++ lib.optional (attrs ? binfiles && attrs.binfiles != []) (mkPkgBin pname version run attrs);
     };
 
   version = {
@@ -167,8 +494,46 @@ let
   # name + version for the derivation
   mkTLName = { tlType, version, extraVersion ? "", ... }@attrs: mkURLName attrs + (lib.optionalString (tlType == "tlpkg") ".tlpkg") + "-${version}${extraVersion}";
 
+  # build tlType == "bin" containers based on `binfiles` in TLPDB
+  # see UPGRADING.md for how to keep the list of shebangs up to date
+  mkPkgBin = let extToInput = {
+      jar = jdk;
+      lua = bin.luatex;
+      py = python3;
+      rb = ruby;
+      sno = snobol4;
+      tcl = tk;
+      texlua = bin.luatex;
+      tlu = bin.luatex;
+    }; in pname: version: run:
+    { binfiles, scriptsFolder ? pname, postFixup ? "", scriptExts ? [], extraBuildInputs ? [], binlinks ? {}, ... }@args:
+    runCommand "texlive-${pname}.bin-${version}"
+      {
+        # metadata for texlive.combine
+        passthru = {
+          inherit pname version;
+          tlType = "bin";
+        };
+        # shebang interpreters
+        buildInputs = extraBuildInputs ++ [ bash perl ] ++ (lib.attrVals scriptExts extToInput);
+        # absolute scripts folder
+        scriptsFolder = lib.optionalString (run ? outPath) (run.outPath + "/scripts/" + scriptsFolder);
+        # binaries info
+        inherit binfiles;
+        binlinks = builtins.attrNames binlinks;
+        bintargets = builtins.attrValues binlinks;
+        binfolders = [ (lib.getBin bin.core) ] ++ lib.optional (bin ? ${pname}) (lib.getBin bin.${pname});
+        # build scripts
+        patchScripts = ./patch-scripts.sed;
+        makeBinContainers = ./make-bin-containers.sh;
+      }
+      ''
+        . "$makeBinContainers"
+        ${postFixup}
+      '';
+
   # create a derivation that contains an unpacked upstream TL package
-  mkPkg = { pname, tlType, revision, version, sha512, extraRevision ? "", postUnpack ? "", stripPrefix ? 1, ... }@args:
+  mkPkg = { pname, tlType, revision, version, sha512, extraRevision ? "", postUnpack ? "", stripPrefix ? 1, hasManpages ? false, ... }@args:
     let
       # the basename used by upstream (without ".tar.xz" suffix)
       urlName = mkURLName args;
@@ -191,11 +556,12 @@ let
           } // lib.optionalAttrs (tlType == "run" && args ? deps) {
             tlDeps = map (n: tl.${n}) args.deps;
           } // lib.optionalAttrs (tlType == "run") {
-            hasFormats = args.hasFormats or false;
             hasHyphens = args.hasHyphens or false;
           } // lib.optionalAttrs (tlType == "tlpkg" && args ? postactionScript) {
             postactionScript = args.postactionScript;
-          };
+          }
+          // lib.optionalAttrs (tlType == "run" && args ? formats) { inherit (args) formats; }
+          // lib.optionalAttrs (tlType == "doc" && hasManpages) { hasManpages = true; };
         } // lib.optionalAttrs (fixedHash != null) {
           outputHash = fixedHash;
           outputHashAlgo = "sha256";
@@ -250,7 +616,10 @@ in
       xz = tlpdbxz;
     };
 
-    bin = assert assertions; bin;
+    bin = assert assertions; bin // {
+      # for backward compatibility
+      latexindent = lib.findFirst (p: p.tlType == "bin") tl.latexindent.pkgs;
+    };
     combine = assert assertions; combine;
 
     # Pre-defined combined packages for TeX Live schemes,
diff --git a/pkgs/tools/typesetting/tex/texlive/fixed-hashes.nix b/pkgs/tools/typesetting/tex/texlive/fixed-hashes.nix
index a2ef174c2853..5b704a1870a0 100644
--- a/pkgs/tools/typesetting/tex/texlive/fixed-hashes.nix
+++ b/pkgs/tools/typesetting/tex/texlive/fixed-hashes.nix
@@ -8629,6 +8629,7 @@
 "texlive-fr.doc.r63071"="120jahzjmak3shjhiy81gv6nk3c1hv4rrxyi1mmzi1xklxjlhl4b";
 "texlive-it.doc.r58653"="0vmwn6n8bxpzcfrzic5qg5k2vklbm6rhl9861zxsli0rd9396qn6";
 "texlive-ja.doc.r62817"="1h2rv13ip3bgmfz8q64abqx3ajla9mc02a50xz1nzmng0rmgz04r";
+"texlive-msg-translations.tlpkg.r65889"="03bshv5xacw01ssbpd5wmz4ryym3dc27l8mwyh652i8gd2lg0scm";
 "texlive-pl.doc.r62841"="19qab4nd9z87v9dpx7gh2a87rw8k4x6kqzg5yc7wqmf46pfjmpcw";
 "texlive-ru.doc.r58426"="0c77yyfj87fajran8jppj0x8krk6b5195iscpn8z2n94spz2fcc9";
 "texlive-scripts.r66570"="0hl1vjr4hr7q7s2pvizicmabb185df5rl84cjsz0ki7vai5mh7pq";
diff --git a/pkgs/tools/typesetting/tex/texlive/make-bin-containers.sh b/pkgs/tools/typesetting/tex/texlive/make-bin-containers.sh
new file mode 100644
index 000000000000..c293970ac7f9
--- /dev/null
+++ b/pkgs/tools/typesetting/tex/texlive/make-bin-containers.sh
@@ -0,0 +1,62 @@
+# load realpath
+loadables="$(command -v bash)"
+loadables="${loadables%/bin/bash}/lib/bash"
+enable -f "$loadables/realpath" realpath
+mkdir -p "$out/bin"
+
+# find interpreters
+export interpPerl="$(PATH="$HOST_PATH" command -v perl)"
+export interpJava="$(PATH="$HOST_PATH" command -v java || :)"
+export interpWish="$(PATH="$HOST_PATH" command -v wish || :)"
+
+# prepare sed script
+substituteAll "$patchScripts" patch-scripts.sed
+
+for binname in $binfiles ; do
+  # binlinks to be created last, after the other binaries are in place
+  if [[ " $binlinks " == *" $binname "* ]] ; then
+    continue
+  fi
+
+  output="$out/bin/$binname"
+
+  # look for existing binary from bin.core or bin.${pname}
+  for folder in $binfolders ; do
+    target="$folder"/bin/"$binname"
+    if [[ -f "$target" && -x "$target" ]] ; then
+      ln -s "$(realpath "$target")" "$output"
+      continue 2
+    fi
+  done
+
+  # look for scripts
+  # the explicit list of extensions avoid non-scripts such as $binname.cmd, $binname.jar, $binname.pm
+  # the order is relevant: $binname.sh is preferred to other $binname.*
+  if [[ -n "$scriptsFolder" ]] ; then
+    for script in "$scriptsFolder/$binname"{,.sh,.lua,.pl,.py,.rb,.sno,.tcl,.texlua,.tlu}; do
+      if [[ -f "$script" ]] ; then
+        sed -f patch-scripts.sed \
+          -e 's/^scriptname=`basename "\$0"`$/'"scriptname='$(basename "$binname")'/" \
+          -e 's/^scriptname=`basename "\$0" .sh`$'"/scriptname='$(basename "$binname" .sh)'/" \
+          "$script" > "$output"
+        chmod +x "$output"
+        continue 2
+      fi
+    done
+  fi
+
+  echo "error: could not find source for 'bin/$binname'" >&2
+  exit 1
+done
+
+# patch shebangs
+patchShebangs "$out/bin"
+
+# generate links
+# we canonicalise the source to avoid symlink chains, and to check that it exists
+cd "$out"/bin
+for alias in $binlinks ; do
+  target="${bintargets%% *}"
+  bintargets="${bintargets#* }"
+  ln -s "$(realpath "$target")" "$out/bin/$alias"
+done
diff --git a/pkgs/tools/typesetting/tex/texlive/patch-scripts.sed b/pkgs/tools/typesetting/tex/texlive/patch-scripts.sed
new file mode 100644
index 000000000000..c08d765ebd71
--- /dev/null
+++ b/pkgs/tools/typesetting/tex/texlive/patch-scripts.sed
@@ -0,0 +1,57 @@
+1{
+  /python/{
+    N;
+    # add script folder to path, unless we interfere with a docstring
+    /\nr"""/b skip-python-path-patch
+    s!\n!\nimport sys; sys.path.insert(0,'@scriptsFolder@')\n!
+    :skip-python-path-patch
+  }
+
+  /^#!.*perl/{
+    # add script folder to @INC
+    s!$! -I@scriptsFolder@!
+  }
+
+  /^eval/{
+    # most likely the weird perl shebang
+    N
+    /^eval '(exit \$?0)' && eval 'exec perl -S \$0 \${1+"\$@"}' && eval 'exec perl -S \$0 \$argv:q'\n *if 0;$/{
+      x; s/.*/patching weird perl shebang/; w /dev/stderr
+      x; s|^.*$|#!@interpPerl@ -I@scriptsFolder@|
+    }
+  }
+}
+
+# patch 'exec interpreter'
+/exec java /{
+  x; s/.*/patching exec java/; w /dev/stderr
+  x; s|exec java |exec '@interpJava@' |g
+  /exec ''/{
+    x; s/^.*$/error: java missing from PATH/; w /dev/stderr
+    q 1
+  }
+}
+
+/exec perl /{
+  x; s/.*/patching exec perl/; w /dev/stderr
+  x; s|exec perl |exec @interpPerl@ -I@scriptsFolder@ |g
+  /exec ''/{
+    x; s/^.*$/error: perl missing from PATH/; w /dev/stderr
+    q 1
+  }
+}
+
+/exec wish /{
+  x; s/.*/patching exec wish/; w /dev/stderr
+  x; s|exec wish |exec '@interpWish@' |g
+  /exec ''/{
+    x; s/^.*$/error: wish missing from PATH/; w /dev/stderr
+    q 1
+  }
+}
+
+# make jar wrappers work without kpsewhich
+s!^jarpath=`kpsewhich --progname=[^ ]* --format=texmfscripts \([^ ]*\)`$!jarpath=@scriptsFolder@/\1!g
+
+# replace CYGWIN grep test with bash builtin
+s!echo "$kernel" | grep CYGWIN >/dev/null;![[ "$kernel" == *CYGWIN* ]]!g
diff --git a/pkgs/tools/typesetting/tex/texlive/tl2nix.sed b/pkgs/tools/typesetting/tex/texlive/tl2nix.sed
index 022ec5c8589b..7c8520707a93 100644
--- a/pkgs/tools/typesetting/tex/texlive/tl2nix.sed
+++ b/pkgs/tools/typesetting/tex/texlive/tl2nix.sed
@@ -81,6 +81,20 @@ $a}
   }
 
   # detect presence of notable files
+  /^docfiles /{
+    s/^.*$//  # ignore the first line
+
+    # read all files
+    :next-doc
+      N
+      s/\n / /   # remove newline
+      t next-doc # loop if the previous lines matched
+
+    / (texmf-dist|RELOC)\/doc\/man\//i\  hasManpages = true;
+
+    D # restart cycle
+  }
+
   /^runfiles /{
     s/^.*$//  # ignore the first line
 
@@ -89,9 +103,25 @@ $a}
       N
       s/\n / /    # remove newline
       t next-file # loop if previous line matched
+    s/\n/ \n/     # add space before last newline for accurate matching below
 
     / (RELOC|texmf-dist)\//i\  hasRunfiles = true;
     / tlpkg\//i\  hasTlpkg = true;
+
+    # extract script extensions
+    / texmf-dist\/scripts\/.*\.(jar|lua|py|rb|sno|tcl|texlua|tlu) /{
+      i\  scriptExts = [
+        / texmf-dist\/scripts\/.*\.jar /i\    "jar"
+        / texmf-dist\/scripts\/.*\.lua /i\    "lua"
+        / texmf-dist\/scripts\/.*\.py /i\    "py"
+        / texmf-dist\/scripts\/.*\.rb /i\    "rb"
+        / texmf-dist\/scripts\/.*\.sno /i\    "sno"
+        / texmf-dist\/scripts\/.*\.tcl /i\    "tcl"
+        / texmf-dist\/scripts\/.*\.texlua /i\    "texlua"
+        / texmf-dist\/scripts\/.*\.tlu /i\    "tlu"
+      i\  ];
+    }
+
     D # restart cycle from the current line
   }
 
@@ -101,8 +131,50 @@ $a}
   # extract hyphenation patterns and formats
   # (this may create duplicate lines, use uniq to remove them)
   /^execute\sAddHyphen/i\  hasHyphens = true;
-  /^execute\sAddFormat/i\  hasFormats = true;
+
+  # extract format details
+  /^execute\sAddFormat\s/{
+    # open a list
+    i\  formats = [
+
+    # create one attribute set per format
+    # note that format names are not unique
+
+    # plain keys: name, engine, patterns
+    # optionally double quoted key: options
+    # boolean key: mode (enabled/disabled)
+    # comma-separated lists: fmttriggers, patterns
+    :next-fmt
+      s/(^|\n)execute\sAddFormat/    {/
+      s/\s+options="([^"]+)"/\n      options = "\1";/
+      s/\s+(name|engine|options)=([^ \t\n]+)/\n      \1 = "\2";/g
+      s/\s+mode=enabled//
+      s/\s+mode=disabled/\n      enabled = false;/
+      s/\s+(fmttriggers|patterns)=([^ \t\n]+)/\n      \1 = [ "\2" ];/g
+      s/$/\n    }/
+
+      :split-triggers
+        s/"([^,]+),([^"]+)" ]/"\1" "\2" ]/;
+        t split-triggers   # repeat until there are no commas
+
+      p
+      s/^.*$// # clear pattern space
+      N
+      /^\nexecute\sAddFormat\s/b next-fmt
+
+    # close the list
+    i\  ];
+    D # restart cycle from the current line
+  }
 
   # close attrmap
   /^$/i};
 }
+
+# add list of binaries from one of the architecture-specific packages
+/^name ([^.]+|texlive\.infra)\.x86_64-linux$/,/^$/{
+  s/^name ([0-9].*|texlive\.infra)\.x86_64-linux$/"\1".binfiles = [/p
+  s/^name (.*)\.x86_64-linux$/\1.binfiles = [/p
+  s!^ bin/x86_64-linux/(.+)$!  "\1"!p
+  /^$/i];
+}
diff --git a/pkgs/tools/typesetting/tex/texlive/tlpdb.nix b/pkgs/tools/typesetting/tex/texlive/tlpdb.nix
index eb36837b8186..876591606081 100644
--- a/pkgs/tools/typesetting/tex/texlive/tlpdb.nix
+++ b/pkgs/tools/typesetting/tex/texlive/tlpdb.nix
@@ -36,10 +36,14 @@ a2ping = {
   revision = 52964;
   sha512.run = "4008c18f93a7d378c8da20bad7c1fdf19c3e6befccdcc804326168854fcd35bb89fe414b30a26dbddeaf81a11c0d404bf5b5459bd3d8adce49dc30279e3bd420";
   sha512.doc = "7a7b6474819b2715c131485472963b463163378d4ae4ac586f17a130b3327c6dda1f4132f4f2379388a8a493fb2374abfff6b7ad87513cbe9d04993572692aeb";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl1Only" ];
   version = "2.84p";
 };
+a2ping.binfiles = [
+  "a2ping"
+];
 a4wide = {
   revision = 20943;
   stripPrefix = 0;
@@ -216,6 +220,11 @@ accfonts = {
   license = [ "gpl1Only" ];
   version = "0.25";
 };
+accfonts.binfiles = [
+  "mkt1font"
+  "vpl2ovp"
+  "vpl2vpl"
+];
 accsupp = {
   revision = 53052;
   stripPrefix = 0;
@@ -384,6 +393,9 @@ adhocfilelist = {
   hasRunfiles = true;
   license = [ "lppl13c" ];
 };
+adhocfilelist.binfiles = [
+  "adhocfilelist"
+];
 adigraph = {
   revision = 49862;
   stripPrefix = 0;
@@ -484,8 +496,12 @@ afm2pl = {
   revision = 54074;
   sha512.run = "e539a12013dae7b30a83f615fe9f01678a25136a72ce754101aeb6bc8f1d287e006648f3050573ab211eeb00e5ac8082857b15e388d0da4886929a57d018fed2";
   sha512.doc = "771e72385110bfaf133865ceaf9cb85a94dc1037f7390b027b21a9117aaeb00e88f67b191229fbbb61f417ccecd6556335ba1d2ba46a0a65079929a0ccbfb1a7";
+  hasManpages = true;
   hasRunfiles = true;
 };
+afm2pl.binfiles = [
+  "afm2pl"
+];
 afparticle = {
   revision = 35900;
   stripPrefix = 0;
@@ -570,11 +586,18 @@ albatross = {
   revision = 65647;
   sha512.run = "3ca4c3ff3fdbb1b865e62fa96e984f94761bbce1de24cf09d7e5bdee3b4361c6536cfbd2119aeb6aa5df842228004cb78a27e2aa9e5e957cff59ef82b9fb459e";
   sha512.doc = "dfc9cb6a72ec80fe5f240a8c50c8c98167d069cf13e3502ba281991deadccd094e369a2ef2ae6b089064de77d937c45ad3a3dc70c06fe6fc5e39190b7d652189";
+  hasManpages = true;
   sha512.source = "93b72dbb855302d42faed5be48e2e4f11ba7b91212a296eac0cda3f13c0eb89e857decff834f7cf05b9164d2ee2ef8eb6174f077026b285dded75e10c1086a2e";
   hasRunfiles = true;
+  scriptExts = [
+    "jar"
+  ];
   license = [ "bsd3" ];
   version = "0.5.0";
 };
+albatross.binfiles = [
+  "albatross"
+];
 alchemist = {
   revision = 66557;
   stripPrefix = 0;
@@ -602,11 +625,22 @@ aleph = {
     "latex"
     "plain"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "aleph";
+      engine = "aleph";
+      options = "*aleph.ini";
+      fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" ];
+    }
+  ];
   sha512.run = "222d0c7045ddfdde5f0ca0ebe20a029c32fd0d4f35326c5ead6bf4ebbcadc86a2a2ff609bca3a6c3a04a09828c50c885f49ef9da0e6e548c18c2633400865c7f";
   sha512.doc = "77d2daaacfa99d7f4ed5b70706751936bed5ae00ac67490e428d900b5fee3d78797d2324039743cbf0cb06a3a03dba17643d67d9057d020a95a536c860d5e78e";
+  hasManpages = true;
   license = [ "gpl1Only" ];
 };
+aleph.binfiles = [
+  "aleph"
+];
 alertmessage = {
   revision = 38055;
   stripPrefix = 0;
@@ -926,13 +960,24 @@ amstex = {
     "plain"
     "tex"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "amstex";
+      engine = "pdftex";
+      options = "-translate-file=cp227.tcx *amstex.ini";
+      fmttriggers = [ "amsfonts" "cm" "hyphen-base" "knuth-lib" "plain" ];
+    }
+  ];
   sha512.run = "d92156cc5a01152776378c8809993b2ccbc9e917125d2ecfd2a06482401008385928e279a8832f328f7a8f4f3eeb746f9725e4986e4eb2f478c20a432ea8698e";
   sha512.doc = "ba87f3c3858ad7d86de6bcc03e50c5407e83f9de4bd3b3c63e3ce612fc5f933fba0d10bbad88525bae0a1f489adbd02643687f650874409962ee5b29447e14e8";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "2.01";
 };
+amstex.binfiles = [
+  "amstex"
+];
 amsthdoc-it = {
   revision = 45662;
   stripPrefix = 0;
@@ -1319,11 +1364,18 @@ arara = {
   revision = 63760;
   sha512.run = "b30ab2023cea6e606301146c06b34711b4c40b771721724bef178a5df7a1bf3e22ce97675131ee7370acae3b6416d49b28f12d0c02eb7e34885e2609f8dc5ca8";
   sha512.doc = "0c0b799f6e4f43c6d123f66b6a84e35607b2c10d6241c445376d29a466154634c559cb6282f4e3f66c273342c764b56604e00bc1ee12b4452ef78ab7620aaaf2";
+  hasManpages = true;
   sha512.source = "6cc31f1368d8588d9a7bca3717171c43786ab6ed7a1b3ed159d700324ec42bf588234483a4e56f7322726c30156900086a901f081cfa7010f79cc393a449fe13";
   hasRunfiles = true;
+  scriptExts = [
+    "jar"
+  ];
   license = [ "bsd3" ];
   version = "7.0.4";
 };
+arara.binfiles = [
+  "arara"
+];
 archaeologie = {
   revision = 57090;
   stripPrefix = 0;
@@ -1654,6 +1706,7 @@ asymptote = {
   revision = 66119;
   sha512.run = "4f97d0d87d1f29985c83c99629fc52e8e18f6eabf95d77aa888429187b49ed9525661d9c06b46a9b2295b03df412778ede1490fa9cd8ec680c3209a4ca6d0be0";
   sha512.doc = "940297c3d69de7e01caa09ff44483f7334aba14705bdcdc83661ca9be2210133e094f99a8355b4b88d076355bb4f13f64c21700bff57f452dd5dbc8d2fddb432";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lgpl3" ];
   version = "2.85";
@@ -1679,6 +1732,10 @@ asymptote-manual-zh-cn = {
   sha512.doc = "0f82e25773a14b0f81b34354f16931834d0496b2c6636c498c6af686f46e7ff93a274739a1a4c189433c9df1ae91ca010f0887081c81f2ac9006a105c7fd4ac9";
   license = [ "lgpl2" ];
 };
+asymptote.binfiles = [
+  "asy"
+  "xasy"
+];
 asypictureb = {
   revision = 33490;
   stripPrefix = 0;
@@ -1741,11 +1798,15 @@ attachfile2 = {
   revision = 57959;
   sha512.run = "57ef4d0c2de0cb854bb91b14a55921851a4abdd60221589f0655afc64a01d4bc672380fd572e0d451b6bac7ffd66f407b4ffab5f0fa1092dc8fcd809c81b23bc";
   sha512.doc = "3033a58688a822f74712d072be3251c58b96e9e370859effc8a4ff7f8b9db98906c471a6472b7b9ab4b0d9725a9b53918e8b65d5bdbbed56e737addbe582737f";
+  hasManpages = true;
   sha512.source = "abd6284061c0f936df92479cd18c0440d654a8f6ca1d610f8763fc1af6668b3eb3d4efc2f4ff33a5b9192844083e55605fbeee2fe1bcaca8079fabf498a702fe";
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "2.11";
 };
+attachfile2.binfiles = [
+  "pdfatfi"
+];
 atveryend = {
   revision = 53108;
   stripPrefix = 0;
@@ -1832,6 +1893,9 @@ authorindex = {
   hasRunfiles = true;
   license = [ "lppl13c" ];
 };
+authorindex.binfiles = [
+  "authorindex"
+];
 auto-pst-pdf = {
   revision = 56596;
   stripPrefix = 0;
@@ -1937,8 +2001,13 @@ autosp = {
   revision = 58211;
   sha512.run = "67587e8b456257be9b924a5bb8c8f4def22fa9aa9678663975ef74e346dc186ae7848a9dc043733cf1244f254750ef4f34204575f62195d4b966ed8336781bce";
   sha512.doc = "2905669b9e2b61749cb7b1eaa02be889c4e8d8adbd78b126e7ee6d894f24f623c888a24abac1d163f3332c5cfa9cd1f64d0de95200350b88a7f47faeacb841a6";
+  hasManpages = true;
   license = [ "gpl2Plus" ];
 };
+autosp.binfiles = [
+  "autosp"
+  "tex2aspc"
+];
 auxhook = {
   revision = 53173;
   stripPrefix = 0;
@@ -1989,11 +2058,15 @@ axodraw2 = {
   revision = 58155;
   sha512.run = "bc9923a9614ef9d7bece20e682729347dc942470a927b40736d6868f02867408b5fba51b117edd8745f96df23b9c1e93792d321291db13b7fdfdae0ee32bb7fd";
   sha512.doc = "927e42358d543f46ccabb8184e35b6f0a5848783ce9eea09e6c780fc83955d5f37b998254153b1954cf1a59be6cfe573a6c79c2c328ab2a22a6e5f6764a50fa1";
+  hasManpages = true;
   sha512.source = "3c2fbbff234836ffe40edb7f38c77c5986cca7fc68b3dd7672bb4f1ce9327a12fa8c51d38461d914cd6466bac8b2b578a151d09d4e84dd903530f7a545d707d9";
   hasRunfiles = true;
   license = [ "gpl3Plus" ];
   version = "2.1.1c";
 };
+axodraw2.binfiles = [
+  "axohelp"
+];
 b1encoding = {
   revision = 21271;
   stripPrefix = 0;
@@ -3435,11 +3508,19 @@ bib2gls = {
   ];
   sha512.run = "009e393b3083a3260642cb36dc463c714689d1b32d07885c9d20092e4f7386d05118c452e6f97001120f70558a69aa58d757ae0998cefe10e164bb172e432fbf";
   sha512.doc = "2a22e662fa0c41581a3c9d9496f97854ea2faa0d01970ab0cc0542048d0ebdcfcbf7ddc7fcf519510d99300eb6634f1c7688874cf02cf6052962d903c5810887";
+  hasManpages = true;
   sha512.source = "da69973053fda82589612813834134837cf9680f4257a6336aed08213df0ff4c34dbef3c7edb833c7987549599cc48ae82dec36bac96dda003e3de3d1422bc6d";
   hasRunfiles = true;
+  scriptExts = [
+    "jar"
+  ];
   license = [ "gpl3Plus" ];
   version = "3.2";
 };
+bib2gls.binfiles = [
+  "bib2gls"
+  "convertgls2bib"
+];
 bibarts = {
   revision = 64579;
   stripPrefix = 0;
@@ -3458,11 +3539,15 @@ bibcop = {
   ];
   sha512.run = "a035642f1b1827f0b6b4d15b4115054b9ab3ff49d7d369f3e304cab5964a707b23865b837c6b156b913e33fe8ae5589941e6ff284ee0b62454a9eb8ec77f3442";
   sha512.doc = "93abe6f0a97138237d7546d132385069f8ff8a638a31cf9be23619b812fa578af808e6f9ce04c06778a4559b1eef98b7d24a0ce5ce6eb5ca9680fc2ddbf7c4b8";
+  hasManpages = true;
   sha512.source = "42a5b9a9f058afa6a1460a3a7c6f7dc9ded6abbd8915529f8366d2df9c2871727bc766a407d2dbbb6716420da7115af5bc2795b343c974f2bf0e1d673d8e96f3";
   hasRunfiles = true;
   license = [ "mit" ];
   version = "0.0.9";
 };
+bibcop.binfiles = [
+  "bibcop"
+];
 biber = {
   revision = 66456;
   sha512.run = "09e6751c129a0fe21ed251d191fb0e0e4a1b7896e03b925a024f19eb8c7526b9134e9fd5fef7a02e525dadc589976a8744b249a9486b5367303b6f830e0d3eb2";
@@ -3479,6 +3564,12 @@ biber-ms = {
   license = [ "artistic2" ];
   version = "4.0-1";
 };
+biber-ms.binfiles = [
+  "biber-ms"
+];
+biber.binfiles = [
+  "biber"
+];
 bibexport = {
   revision = 50677;
   sha512.run = "75f9cb374e0aee1b049e977e3ee1a855ae8f908a6c6191589ce9d9fc28a8358fedf93faa416b1020e157a8ec7a3980673d00e052a100c88724e86050ea5eb487";
@@ -3488,6 +3579,9 @@ bibexport = {
   license = [ "lppl13c" ];
   version = "3.03";
 };
+bibexport.binfiles = [
+  "bibexport"
+];
 bibhtml = {
   revision = 31607;
   stripPrefix = 0;
@@ -4182,18 +4276,26 @@ bibtex = {
   ];
   sha512.run = "fadbb6ca18794e52b40a7083db41c5f1d42e47ce93daed7a551bf8e263f8aac8302578f23fe915c3706e4e3603cbdc9cafc55b07c895542a60eb1670ce07d628";
   sha512.doc = "6e1433e40fd604e391be05b9b68449cb6804488a42aac802d8960407930f99ae4450b77afe1baae4fe9b4d20b48c359472cf6c1e0a67d6f0a4a87cbffaaf1d8c";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "knuth" ];
   version = "0.99d";
 };
+bibtex.binfiles = [
+  "bibtex"
+];
 bibtex8 = {
   revision = 64491;
   sha512.run = "ca2af96d3d11d27a4ff01297ca91f5b829f0ebc67ceedd358acb5e89842cd86776864a0d948c85f9364b5542476bfd8e0cdc189853637e77b0b66ef8de453130";
   sha512.doc = "31de3b7bbef0733347ab71f2c893df1cdc163a0d2ce4d47fc1f49a86e7bef225653cc704f4e6b9f8cdfe245cff5295ea45daf7995e863cdac930984ca64de84e";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl1Only" ];
   version = "3.72";
 };
+bibtex8.binfiles = [
+  "bibtex8"
+];
 bibtexperllibs = {
   revision = 57137;
   stripPrefix = 0;
@@ -4207,9 +4309,13 @@ bibtexu = {
   revision = 64491;
   sha512.run = "8f629b95c9a12cdaa6be4fca3e6ee0d69f7c54a988ef778737de505446fac17aa9baa6d0bf08ea6dcf33d68202acc9223df91df0cd46696802e7ed238d4ef717";
   sha512.doc = "18934f3f91e19dddd6940110c4d1a17072a7640a6a56133535f8ad8ff7d3e6d3a3ba7d8b4e82906f65c1de17fea4911ea78ea96c0b9e0b561be488c3da6d8f67";
+  hasManpages = true;
   license = [ "gpl1Only" ];
   version = "3.72";
 };
+bibtexu.binfiles = [
+  "bibtexu"
+];
 bibtopic = {
   revision = 15878;
   stripPrefix = 0;
@@ -5018,10 +5124,15 @@ bundledoc = {
   revision = 64620;
   sha512.run = "8f1e4428993dda804a2bd6b11504996e6cbef869b98a64d576f0edd97a47b1f2301b34ed234ecf1cc902c74dcb31064a96cb69018ac514fd91eb3e5c1b6df5ad";
   sha512.doc = "d74b1ec9473c4616642911fb918553350c5c65ae2cd5171d3513d6fdd5b5b774a516c54a5ce09a8fb966a9de6c5e372b773f7e8ade9f14fa2b1a646112638679";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "3.4";
 };
+bundledoc.binfiles = [
+  "arlatex"
+  "bundledoc"
+];
 burmese = {
   revision = 25185;
   stripPrefix = 0;
@@ -5290,9 +5401,15 @@ cachepic = {
   sha512.run = "a0405befc4ed9217cedc4abc78c355b869bb803fa4be32245198ba4aa8151884ace023b3465db3b4757c923d0425fd1d186e25facd7c29d05d5072668a9f0e3d";
   sha512.doc = "93108475f74b2356cea79a8403729df7c24e95871680b0b53f9316a7b158aa973ce108632a121198459352968bfdfd79f265d4aa301ecd00ce55cf56db5f976c";
   hasRunfiles = true;
+  scriptExts = [
+    "tlu"
+  ];
   license = [ "lppl13c" ];
   version = "1.0";
 };
+cachepic.binfiles = [
+  "cachepic"
+];
 caladea = {
   revision = 64549;
   stripPrefix = 0;
@@ -5934,9 +6051,15 @@ checkcites = {
   sha512.run = "c28a2785348bdc7cf8e30d3339f301a355b6a9e513d143d34f2b2535a69a32f7cf8a8ae9c26b42c6db32d00021a10ca135891a22b0547c219f31c6c9720d8ca5";
   sha512.doc = "a394ea5f70f48e7dc7c9d75de33bbf788904a5e1d8e3aefb5dd3bfd5207ee512b1a84ab4bc03bddfa15dedf962f330931d9e80593542e5a180fdda8a8aaf87c2";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
   version = "2.6";
 };
+checkcites.binfiles = [
+  "checkcites"
+];
 checkend = {
   revision = 51475;
   stripPrefix = 0;
@@ -5955,6 +6078,9 @@ checklistings = {
   license = [ "lppl12" ];
   version = "1.0";
 };
+checklistings.binfiles = [
+  "checklistings"
+];
 chem-journal = {
   revision = 15878;
   stripPrefix = 0;
@@ -6274,18 +6400,28 @@ chklref = {
   revision = 52649;
   sha512.run = "12f5e950ae439d0efd3f625572e8b81d993485a1efd71dc04c078cb1dc9b76650de3c424d7a6c60ebc5ccb5d29f37ed04c477ea1306acf4c5f4fccbd95e18985";
   sha512.doc = "5aeb13824c1781feefe94215f3efce15c212e0d38f9e0d5fb393e96c2159ba43f165c600cd64ee9d8c42c0a4f0db6c2e462ee85a93993965bad0420b6b662ef6";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl3" ];
   version = "3.1.2";
 };
+chklref.binfiles = [
+  "chklref"
+];
 chktex = {
   revision = 64797;
   sha512.run = "7c28847e87e788d0f50c07c1c3140962a70173d2a36997720f3066755740744060ecd03272662aff563de39102052e91a4582a4bb63e35f918ad8f517dff55e6";
   sha512.doc = "28df4bed075d66d9f25bcbe332731f1d5f0bb0f7f92bd2f3618c84adf788d0f429bd0c6e75381ebf7bbeac98409d94f85d17ebd752f9e4af707d9e3373d45f97";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2Plus" ];
   version = "1.7.8";
 };
+chktex.binfiles = [
+  "chktex"
+  "chkweb"
+  "deweb"
+];
 chletter = {
   revision = 20060;
   stripPrefix = 0;
@@ -6443,10 +6579,17 @@ citation-style-language = {
   ];
   sha512.run = "4260ef2c25c7350e01a0bb7b7372a63da723c81a473ecad7346962c49ce35b68d5385863bf3ad742bd4da79720d4d240293f65677e01cdc41993509a5999cd21";
   sha512.doc = "19c2336b57d8da88dcf22a92e54872a0d9548d5b2f9433ef155534c29f935988056240064ee863fa4a86caaa93dd0e4873725342c698bddabcbc90b771fb8d60";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "mit" "cc-by-sa-30" ];
   version = "0.3.0";
 };
+citation-style-language.binfiles = [
+  "citeproc-lua"
+];
 cite = {
   revision = 36428;
   stripPrefix = 0;
@@ -6519,6 +6662,9 @@ cjk-gs-integrate = {
   license = [ "gpl3" ];
   version = "20210625.0";
 };
+cjk-gs-integrate.binfiles = [
+  "cjk-gs-integrate"
+];
 cjk-ko = {
   revision = 63561;
   stripPrefix = 0;
@@ -6545,10 +6691,34 @@ cjkutils = {
   revision = 60833;
   sha512.run = "36b0d0ef4bae2a9e5f2238c5c9aa125eabfca509462b65a159f66cbafc690939e16760a86e7e7dcce22ffda2f301c039059cdff1af8ed862017f18552e13e728";
   sha512.doc = "636e6486f9661061d22d248b0b7a8debdb81cd08c56b449067782568fcc7db58922f7c9d40fbc992bdd008908f22a6733af4a8115d85c0572556d01e925c5587";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2" ];
   version = "4.8.5";
 };
+cjkutils.binfiles = [
+  "bg5+latex"
+  "bg5+pdflatex"
+  "bg5conv"
+  "bg5latex"
+  "bg5pdflatex"
+  "cef5conv"
+  "cef5latex"
+  "cef5pdflatex"
+  "cefconv"
+  "ceflatex"
+  "cefpdflatex"
+  "cefsconv"
+  "cefslatex"
+  "cefspdflatex"
+  "extconv"
+  "gbklatex"
+  "gbkpdflatex"
+  "hbf2gf"
+  "sjisconv"
+  "sjislatex"
+  "sjispdflatex"
+];
 clara = {
   revision = 54512;
   stripPrefix = 0;
@@ -6667,11 +6837,15 @@ clojure-pamphlet = {
   revision = 60981;
   sha512.run = "67047118c74e1d19426d99bd3a716d6076d977156f1e686bbd991d6b1cba464897f662e950c86218910b485300d40a5cb80d8d43868fb7920cc99a6d7f1c5735";
   sha512.doc = "02ab33398a87a47c76fd34df9eccde47b60b028b3a659294968b35beaead85908d958ccd94b8f706f6f2173c9af3d7f7382c510134dabde4bfab9be20f85998d";
+  hasManpages = true;
   sha512.source = "5848f7ace83c5bbf5017f7a760fdc464e848511717f5fcca5e17f95421429a5608c590fcbc1e7a0d49bb5996def552f16515edfbfa5a2673fef962529141e5a2";
   hasRunfiles = true;
   license = [ "gpl3Plus" ];
   version = "1.3";
 };
+clojure-pamphlet.binfiles = [
+  "pamphletangler"
+];
 cloze = {
   revision = 55763;
   stripPrefix = 0;
@@ -6723,9 +6897,17 @@ cluttex = {
   sha512.run = "35c8ec3711963131bb50fe67ef95705a1d40a6dfd831a33d863bde16f16e66086e204725154d0deaed13e94fdc28dd59497561673542151c1574f7fe87f516f9";
   sha512.doc = "c8e395e087f9ca511db96b96dee3de4a51fdfc9374ddaf40703db0980724000f1987298dc8253d0c5a8d7c97e46cc2a8165b7cad6560fa560213cd5ce85205de";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "gpl3Plus" ];
   version = "0.5.1";
 };
+cluttex.binfiles = [
+  "cllualatex"
+  "cluttex"
+  "clxelatex"
+];
 cm = {
   revision = 57963;
   stripPrefix = 0;
@@ -12073,10 +12255,60 @@ context = {
     "stmaryrd"
     "xetex"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "cont-en";
+      engine = "pdftex";
+      patterns = [ "cont-usr.tex" ];
+      options = "-8bit *cont-en.mkii";
+    }
+    {
+      name = "cont-en";
+      engine = "xetex";
+      patterns = [ "cont-usr.tex" ];
+      options = "-8bit *cont-en.mkii";
+    }
+    {
+      name = "cont-fr";
+      enabled = false;
+      engine = "pdftex";
+      patterns = [ "cont-usr.tex" ];
+      options = "-8bit *cont-fr.mkii";
+      fmttriggers = [ "context" ];
+    }
+    {
+      name = "cont-it";
+      enabled = false;
+      engine = "pdftex";
+      patterns = [ "cont-usr.tex" ];
+      options = "-8bit *cont-it.mkii";
+      fmttriggers = [ "context" ];
+    }
+    {
+      name = "cont-nl";
+      enabled = false;
+      engine = "pdftex";
+      patterns = [ "cont-usr.tex" ];
+      options = "-8bit *cont-nl.mkii";
+      fmttriggers = [ "context" ];
+    }
+    {
+      name = "cont-ro";
+      enabled = false;
+      engine = "pdftex";
+      patterns = [ "cont-usr.tex" ];
+      options = "-8bit *cont-ro.mkii";
+      fmttriggers = [ "context" ];
+    }
+  ];
   sha512.run = "61fcc778837ecff88bb0e80e39e2acb3ee64e2c26e4069f7634e5dc6c74dc93caab78e4b0088ed58f494d6dcd3a5084bc55cd471baaeb292dc208cf2a241bf69";
   sha512.doc = "ee4458cd6d45a41652ae24b3b82bea5cfa2d8b9c14cf4ba1357f9f07d6572f8ba83e350b74659c471ebf5068f33f5c5762a11669ab2a4f5adb3db41f392956dd";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+    "rb"
+  ];
   license = [ "free" ];
 };
 context-account = {
@@ -12455,6 +12687,15 @@ context-visualcounter = {
   hasRunfiles = true;
   license = [ "bsd2" ];
 };
+context.binfiles = [
+  "context"
+  "contextjit"
+  "luatools"
+  "mtxrun"
+  "mtxrunjit"
+  "texexec"
+  "texmfstart"
+];
 continue = {
   revision = 49449;
   stripPrefix = 0;
@@ -12499,9 +12740,15 @@ convbkmk = {
   sha512.run = "01bb9621459bac7eecc99b1d9aa59de420ba805b2e0ecdb2a89f5c86fa4a3021d957b4ddc69617ea406e77865d68e40c657979c488fc51f4676d084cfe6181cd";
   sha512.doc = "937d436cb9387eac601883ced516fa40f60e606bb4bae0be62e1ded2a31754a1d00461a34ad533cce1cc48f4d11e880233eaac128d80841e0b22f18801e86506";
   hasRunfiles = true;
+  scriptExts = [
+    "rb"
+  ];
   license = [ "mit" ];
   version = "0.30";
 };
+convbkmk.binfiles = [
+  "convbkmk"
+];
 cooking = {
   revision = 15878;
   stripPrefix = 0;
@@ -12868,9 +13115,18 @@ crossrefware = {
   revision = 64754;
   sha512.run = "7e8836c9c1cec51676a01e3e631cd3a0155f081909415e8ae2a4143b5eb611c5c843a0c700af98dc983ace1f9e3492da5a42bd54e74757ca68da7f106f7eb6b5";
   sha512.doc = "7b7212f8a4b6f75d93ec573f9d7544f09df2e73e0b2a32e2f22866378f0d69e0b035511ee5cbc7eee4114b5540b3783d613aafd7508a41aa336195e49b070a78";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl1Only" ];
 };
+crossrefware.binfiles = [
+  "bbl2bib"
+  "bibdoiadd"
+  "bibmradd"
+  "biburl2doi"
+  "bibzbladd"
+  "ltx2crossrefxml"
+];
 crossword = {
   revision = 64375;
   stripPrefix = 0;
@@ -12969,13 +13225,31 @@ cslatex = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "cslatex";
+      engine = "pdftex";
+      options = "-etex cslatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "cm" "csplain" "everyshi" "firstaid" "hyphen-base" "l3kernel" "l3packages" "latex-fonts" "latex" "unicode-data" ];
+    }
+    {
+      name = "pdfcslatex";
+      engine = "pdftex";
+      options = "-etex cslatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "cm" "csplain" "everyshi" "firstaid" "hyphen-base" "l3kernel" "l3packages" "latex-fonts" "latex" "unicode-data" "tex-ini-files" ];
+    }
+  ];
   sha512.run = "a65516275b53ce0e2487193b537759da447137898915f577c66893d6408c664b7cb830941dac2e80b2922c1597719cc879f66d3378216bfa2dc190e1bf502675";
   sha512.doc = "d1be033b7355bb3431193a9a39bdd1e269c7f3a97333c2b753ffdf795ad45a366893267a13472463805ed428760de680aae3377b25ef39bf5522a0186f80f899";
+  hasManpages = true;
   sha512.source = "def618478c9d3b500aafdf47ea5e9432412b9ae5029417b85fe38f2c506d691cc001b9c4492bceb7ff276a15612bf17b13dc2fecd2158ad940e97c6ca2d03bb7";
   hasRunfiles = true;
   license = [ "gpl1Only" ];
 };
+cslatex.binfiles = [
+  "cslatex"
+  "pdfcslatex"
+];
 csplain = {
   revision = 62771;
   deps = [
@@ -12990,12 +13264,48 @@ csplain = {
     "tex"
     "tex-ini-files"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "csplain";
+      engine = "pdftex";
+      options = "-etex -enc csplain-utf8.ini";
+      fmttriggers = [ "cm" "cs" "hyphen-base" "plain" "enctex" "hyph-utf8" ];
+    }
+    {
+      name = "luacsplain";
+      engine = "luatex";
+      options = "-etex csplain.ini";
+      fmttriggers = [ "cm" "cs" "hyphen-base" "plain" "tex-ini-files" "luatex" "luatex85" ];
+    }
+    {
+      name = "pdfcsplain";
+      engine = "luatex";
+      options = "-etex csplain.ini";
+      fmttriggers = [ "cm" "cs" "hyphen-base" "plain" "tex-ini-files" "luatex" "luatex85" ];
+    }
+    {
+      name = "pdfcsplain";
+      engine = "pdftex";
+      options = "-etex -enc csplain-utf8.ini";
+      fmttriggers = [ "cm" "cs" "hyphen-base" "plain" "enctex" "hyph-utf8" "tex-ini-files" ];
+    }
+    {
+      name = "pdfcsplain";
+      engine = "xetex";
+      options = "-etex csplain.ini";
+      fmttriggers = [ "cm" "cs" "hyphen-base" "plain" ];
+    }
+  ];
   sha512.run = "c4dbe1721fc2281cba7e426f6c75d35671cfeddf77a947f147a33c651090bc90528583445736bc2933c2d3986424e1b3ac4984e93cfae5f0ad1cfe41902f63cb";
   hasRunfiles = true;
   license = [ "free" ];
   version = "Mar._2022";
 };
+csplain.binfiles = [
+  "csplain"
+  "luacsplain"
+  "pdfcsplain"
+];
 csquotes = {
   revision = 64389;
   stripPrefix = 0;
@@ -13084,10 +13394,14 @@ ctan-o-mat = {
   revision = 51578;
   sha512.run = "a995dfc6d79ba77fe673aa501f28eaf9f057c34501fa032423569317e5a4eed048c3375d806eafacedefec02e91bcb587fa6bfb8c0ff980395bb877b2ce88c4c";
   sha512.doc = "423efc3f2f850c5a9bcbe787edb8155ef76e56ce5e3a1ba3332bb465b8239616bd1fcff2e8a58db6f5ce9d5191ae3209a5451f746250a3b081fe9b35d024eebd";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "bsd3" ];
   version = "1.2";
 };
+ctan-o-mat.binfiles = [
+  "ctan-o-mat"
+];
 ctan_chk = {
   revision = 36304;
   stripPrefix = 0;
@@ -13100,18 +13414,26 @@ ctanbib = {
   revision = 66069;
   sha512.run = "5cb965c9b387d5c733204663f5f6496e4ff8033ece3f6063513bb8890516e8e96b4d307ce830ac51f15796ac467e3db0e27eea668f14b4da8b3446623b6767fa";
   sha512.doc = "e161bc466807c7697cb7232874c0d7daf14d82677d25a081085dce91461826d2aace842f599cd27cc0f6491d31028d3253e8d9dbf237f9e97444dda80490e5ba";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "0.2b";
 };
+ctanbib.binfiles = [
+  "ctanbib"
+];
 ctanify = {
   revision = 44129;
   sha512.run = "6774b151bb0fb052d41d8447c7e8d378d7f31b0a5aea5f2f00b93669b8c2f629f479ae21d40480fd62f468d866cbe0c6f0dedd8a0248f8d83cd1039131849439";
   sha512.doc = "f9b636cb41b126809d808c167410a37052b1c6c385fe4eb8df3b819c0cf2cac2c7c1c74d7ea15d2916c1cbc563e078845e451000e3a08cd9a8e0696a342b22ac";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "1.9.1";
 };
+ctanify.binfiles = [
+  "ctanify"
+];
 ctanupload = {
   revision = 26313;
   sha512.run = "4464bdfbf72318b24abcd88e1c25dae5925a96e867c694f3f02a594ed7b8b24cffdcdb345f0054e200a6af63f88b591ff84058af0adfb4a1b3feff2a057d9d72";
@@ -13120,6 +13442,9 @@ ctanupload = {
   license = [ "gpl3" ];
   version = "1.2c";
 };
+ctanupload.binfiles = [
+  "ctanupload"
+];
 ctex = {
   revision = 66119;
   stripPrefix = 0;
@@ -13192,9 +13517,13 @@ ctie = {
   ];
   sha512.run = "c1c69127e1157c15086beb269e1925feaf63eebbc45baec018ce97196a2fc42638bb3107a4c1d065e98a08e490d238d2bffe1827f27f9015ffa5be88be53d6bf";
   sha512.doc = "494a3e6569a77b434f66a56f1fa44d4651dc23e7cdcacb101043ed55cc6e32551f148e67976b67b88507da2fe05a0b006c810fb737f9364d47cb010438c7b39e";
+  hasManpages = true;
   license = [ "gpl1Only" ];
   version = "1.1";
 };
+ctie.binfiles = [
+  "ctie"
+];
 cuisine = {
   revision = 34453;
   stripPrefix = 0;
@@ -13340,6 +13669,7 @@ cweb = {
   revision = 65081;
   sha512.run = "a3c7600debbae6ee9af48efc27cb69eb84fb338985ddcbaceffd969e18673d0943d080a3c9fd83a3edda8b93a0d70e2b4bcced158c903477c29620decc1587f0";
   sha512.doc = "6f0ced7413dd513cdbde98a2c9e4f3841e8469084938e921a186b0f0a571ed859548921e710deb1c1634063068807aba15209cb0d07f891564d42dc751784e45";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "knuth" ];
 };
@@ -13357,6 +13687,14 @@ cweb-old = {
   sha512.run = "efb1c9b65f7c628905d2dac1373da96346b6b6c78f15e8c0c8055e86c1a52b09bdb5f78fb06106e350d10a8daa378eb45f5fe788c6c3d8b23f0b47c3db6f256a";
   hasRunfiles = true;
 };
+cweb.binfiles = [
+  "ctangle"
+  "ctwill"
+  "ctwill-refsort"
+  "ctwill-twinx"
+  "cweave"
+  "twill"
+];
 cyber = {
   revision = 46776;
   stripPrefix = 0;
@@ -13403,8 +13741,13 @@ cyrillic-bin = {
   revision = 62517;
   sha512.run = "30d3bdb0f92a0006613dee654714818b6961207029982d62b9933829b3d044bea0b2d9a30d0007dac23c08358a7ada2df9ac25ee92398cb32d47e9c29c503c67";
   sha512.doc = "91da42251e165d17507b37eb48b35e157c75b06fa8822c9717fafd5e7aadc60bfeb084dc30a5ec32df22ae4e69c03c3f00e8a243d187881212ffe62c96b6235b";
+  hasManpages = true;
   hasRunfiles = true;
 };
+cyrillic-bin.binfiles = [
+  "rubibtex"
+  "rumakeindex"
+];
 cyrplain = {
   revision = 45692;
   stripPrefix = 0;
@@ -14045,6 +14388,9 @@ de-macro = {
   license = [ "free" ];
   version = "1.4.1";
 };
+de-macro.binfiles = [
+  "de-macro"
+];
 debate = {
   revision = 64846;
   stripPrefix = 0;
@@ -14201,8 +14547,12 @@ detex = {
   revision = 62387;
   sha512.run = "27c94ef578afaf7fa3ca232f4a4a0e5167c69cf24a2c005c1d5a06830332b6a4aca8d0eb4450026d498e371d5c142bb71cd41de199b77f5963d88d612208e0ad";
   sha512.doc = "f3339f5d93f073bdc2b6052f38c314a1f4284c60a5adc7813ee2cf7d5f609ce8c68b60cb2a0fc9571e26796ba2fc2660da137120751fb465ed723a800aac2cc8";
+  hasManpages = true;
   license = [ "free" ];
 };
+detex.binfiles = [
+  "detex"
+];
 dhua = {
   revision = 24035;
   stripPrefix = 0;
@@ -14226,9 +14576,15 @@ diadia = {
   sha512.run = "55a246d4e3ab86d6300210d830ce464a935bb83c9ffd29b5387f0a56f5c82d4c5a71cf107f78ffe0cde07f17897e2f949acf1fe70da9da7c7992b330a07b1c68";
   sha512.doc = "e7487bb47fbe8aee714304150c00866780782a9ad32bf6ccbb02799aeb251345ce1cf042e8b4d7b4011083a3be2fe3b16b78f25a4a4206d173ac1384716592ab";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
   version = "1.1";
 };
+diadia.binfiles = [
+  "diadia"
+];
 diagbox = {
   revision = 54080;
   stripPrefix = 0;
@@ -14311,9 +14667,15 @@ digestif = {
   sha512.run = "098d625749cee42f965d21ef5ec2843211db36fd0f4cced882ed15f32a20a2d70bf292b01e6797e7ca097adfadf2fd40d3c5eef6c694da39e8302770cfb784d3";
   sha512.doc = "fabc6d0ea5a1e55b7ecd6430b2373c15e413c985485331bd7bd5bca437947a76ac7d8ac6ed2ea3d6afe687284aef673b0e302a1c9925737c6e1d95cecf2ea8cb";
   hasRunfiles = true;
+  scriptExts = [
+    "texlua"
+  ];
   license = [ "gpl3Plus" "lppl13c" "fdl13Only" ];
   version = "0.5.1";
 };
+digestif.binfiles = [
+  "digestif"
+];
 digiconfigs = {
   revision = 15878;
   stripPrefix = 0;
@@ -14597,11 +14959,15 @@ dosepsbin = {
   revision = 29752;
   sha512.run = "7f31d47d60b0bf151cd6e6516e29a8414c6344657c133e726e6e8dfe23818995b10b9a2898b1801c4bcb9219969a8af1d2725b75df514ffb119730b3e49008f1";
   sha512.doc = "b9edce9984698db8e50f9183f89b025cfa89dca8a8725054af80f379c88ff1d2b02cef8f3d5f37ee5b8585a59d1a4d0f0ee0e541a7784f3f3f4e382d78e6a47e";
+  hasManpages = true;
   sha512.source = "d5739533a9d10e584ed7de4ec033b4a31be5681fd06fd9a2268f924d4434df902fc1f346ac2636f4ba7b7dcc6b5804a80b5431f7055fe8eccfeeea09915ad2e7";
   hasRunfiles = true;
   license = [ "artistic1-cl8" ];
   version = "1.2";
 };
+dosepsbin.binfiles = [
+  "dosepsbin"
+];
 dot2texi = {
   revision = 26237;
   stripPrefix = 0;
@@ -14897,9 +15263,14 @@ dtl = {
   revision = 62387;
   sha512.run = "c2b7f3ab778c01979b158c335e4bff7bbb677fe8c5bc3202a5f43c747119dbc4a7e348c5fbb0bf2a487a49430939fae6abc855392da92ba65441b87e08585189";
   sha512.doc = "476723cb714863405daaa5fdc35557ffe7cb1149735272cfec2f14473ee65b93da90648abf73b4cf09799b1595569513f3735a07173b50eb6db405d526d40660";
+  hasManpages = true;
   license = [ "publicDomain" ];
   version = "0.6.1";
 };
+dtl.binfiles = [
+  "dt2dv"
+  "dv2dt"
+];
 dtxdescribe = {
   revision = 65445;
   stripPrefix = 0;
@@ -14926,6 +15297,9 @@ dtxgen = {
   license = [ "gpl1Only" ];
   version = "1.08";
 };
+dtxgen.binfiles = [
+  "dtxgen"
+];
 dtxtut = {
   revision = 38375;
   stripPrefix = 0;
@@ -15012,29 +15386,49 @@ dvi2tty = {
   revision = 62387;
   sha512.run = "1dd9556f0b16e6111c1d93ec18fcc850a92b94298587ebda093d27d2abfb0e2adfb30afa64f8cb2d6e651711f4818ff8a6e8d85007c30e0130278ce1ed6fcaa3";
   sha512.doc = "396fefcb10e6f44b841ed0afb6604d9ffede1ec9f4bb180ddbe09cf3d2f9eb3989658d8976e3e3d446c186933f22d5579cc2ead2047fa56dc066b2aa65bb3670";
+  hasManpages = true;
   license = [ "gpl2" ];
   version = "6.0.0";
 };
+dvi2tty.binfiles = [
+  "disdvi"
+  "dvi2tty"
+];
 dviasm = {
   revision = 64430;
   sha512.run = "bfdc888c7a69d103d9c4548ca0465223a4e16be51a5c36f4c7a9d1064a553f60e6fb5d197a6be72e2be076c5012d7d3c7f871e217777d0be0c0e4669c1602a6c";
   sha512.doc = "c1be5541992450e6519c1768ea21d342c5e41fb4da6547828c89c79bd8abf77634ae76c3e5c06b608172234d117f5d5839600031dc4fb0cbbaa493d0bb1154ac";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "py"
+  ];
   license = [ "gpl3Plus" ];
 };
+dviasm.binfiles = [
+  "dviasm"
+];
 dvicopy = {
   revision = 62387;
   sha512.run = "9932e2c5c2c3c0ddf4c874b81441d8ca740b851da75644bfe20d0a4bde8d8bd062829423680bc95b6b53c83ed05bcd3148330d273c1cd1c3ab93dc95ca2265ea";
   sha512.doc = "e081e3971664c8322568481d87b5723bce54320c796f928dfd1f20f7e65eddaa2d9dad65ff2775ac6d5cccbc36a1ac72e3f33198c20008698fdbcad713638dd5";
+  hasManpages = true;
   license = [ "gpl1Only" ];
   version = "1.5";
 };
+dvicopy.binfiles = [
+  "dvicopy"
+];
 dvidvi = {
   revision = 52851;
   sha512.run = "d4589c7c034308547b4970104f6396ef24a15be22e034ac2f4f04a1004915c8d477e64e2c4b61927f43313b90b063602a4bcd45afb1bc33ee395e0b7caef202b";
   sha512.doc = "865f4e96bc8ff13005350800014ede4c95671db1c45f35e37b153637c23834d34054e3aac1b6033c6a219f9f123563b1d0cc3093c901f67dba7e33e65ba81646";
+  hasManpages = true;
   license = [ "free" ];
 };
+dvidvi.binfiles = [
+  "dvidvi"
+];
 dviincl = {
   revision = 29349;
   stripPrefix = 0;
@@ -15052,17 +15446,34 @@ dviinfox = {
   license = [ "mit" ];
   version = "1.06";
 };
+dviinfox.binfiles = [
+  "dviinfox"
+];
 dviljk = {
   revision = 52851;
   sha512.run = "7f0fff6f850f22788981370dfe9759f8d1ac803f75e6355c582eca83ca3940f64e3c32c32881234e25d8bda59e47a4f236751c9464dc41f93c67c16cc55082ef";
   sha512.doc = "82d28f1adfc368582a5b1d05e2e73ba99bd05d51f9daa972f5ca753905341ee1d61b9e15d402b3017bfdd78bd64c7c222794bbf76073517f96ea1b9d7a58cea6";
+  hasManpages = true;
   license = [ "gpl1Only" ];
 };
+dviljk.binfiles = [
+  "dvihp"
+  "dvilj"
+  "dvilj2p"
+  "dvilj4"
+  "dvilj4l"
+  "dvilj6"
+];
 dviout-util = {
   revision = 52851;
   sha512.run = "a9445602ac5a3663920f8c7d428e833b0451c3e80203be57cc6fbdda5db5f7c89da75cf58e74d56c4ab9cd817fc9f080a056ebd045828a0d5b034108cda61bc5";
   sha512.doc = "61f86a23314334d7faa4f1ae0760aea6c5e5f77754a6a9b1d5952f09e3e15d3dead73a9f72ccfe9b9d7a022654f8d2e1e6e3051dc12bff574b6f053cdbc9b598";
+  hasManpages = true;
 };
+dviout-util.binfiles = [
+  "chkdvifont"
+  "dvispc"
+];
 dvipdfmx = {
   revision = 61101;
   deps = [
@@ -15071,29 +15482,52 @@ dvipdfmx = {
   postactionScript = "tlpkg/tlpostcode/dvipdfmx.pl";
   sha512.run = "6dd78f4b5cabb51c3bd9988fa46bf90a5a79b3d3293257a4c563a8a76a5a03eb167ce3ec0d4ce6ed05412a551eb201f2379a50a97ac5355ebe833f7b34cee4b4";
   sha512.doc = "00dce9b36eefd1788bbe455b2e5104efd9afc8bd891aeafb2cd9bdee406eeb25ab520e42e614e9d2363eb6a7273232bc3c4805bacd82a22099c5ffc438e852cb";
+  hasManpages = true;
   hasRunfiles = true;
   hasTlpkg = true;
   license = [ "gpl1Only" ];
 };
+dvipdfmx.binfiles = [
+  "dvipdfm"
+  "dvipdfmx"
+  "dvipdft"
+  "ebb"
+  "extractbb"
+  "xdvipdfmx"
+];
 dvipng = {
   revision = 62517;
   sha512.run = "d24be610a63a9df22ebe6f53891519ab77900611d1159dec5e97b27160f3552b4cbce42b575a036125d2b15910a72cb5e3793a3409c5d0f4b1df0c2433e828f8";
   sha512.doc = "976ff6c9628fe85adca2287f04d76f2c1605f243e28b4d32cb1ef9a90d30dcae0d202e6d5156914c204fd42b0a66460755a89f7dbdeb9ec1ccf6010cfe8daf78";
+  hasManpages = true;
   license = [ "lgpl3" ];
   version = "1.17";
 };
+dvipng.binfiles = [
+  "dvigif"
+  "dvipng"
+];
 dvipos = {
   revision = 52851;
   sha512.run = "152cc45942bb1d241008ea0924f1e96e2329d6fd4228be42dc6dcb9eb28081bcb3d80e407e9fdf0560e93d095fd07351cf073f14d4a4c25eb984613fd9189826";
   sha512.doc = "2bf3fd5bbd7b6e1fb8a263dd0e3deef358bead727df5de280342376225fd7366ff470b9c2fca8f763890d1047fe2c7a5b138ade1b5fcab383c8113e10f245199";
+  hasManpages = true;
 };
+dvipos.binfiles = [
+  "dvipos"
+];
 dvips = {
   revision = 62387;
   sha512.run = "a680a4685d3cbb429ad9dada0d48098f7755253ad1d7c808731f0f4fb4c37971cb937a9fa68bcecd892de93cc35a8086b742c86338460585c2912f36d00ade67";
   sha512.doc = "a6acb780a45663fb21976622d7b6c3ea8d4adf1fe405ee97cd7c4cf09fa49b59069ba72b2aa14b53d3ba631b37c5cbd979929adaa274a0bec8b1272d85e1cd43";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "free" ];
 };
+dvips.binfiles = [
+  "afm2tfm"
+  "dvips"
+];
 dvipsconfig = {
   revision = 13293;
   stripPrefix = 0;
@@ -15106,9 +15540,13 @@ dvisvgm = {
   revision = 66534;
   sha512.run = "503ca116be0a87f2606c9e898a591dedaa7a078713e30673eae5dc748fa4c4f13ce8c81852c959e84c3c45766daa565222db59a66315b0238e716e762e19eb31";
   sha512.doc = "faa5efd79a8cf665cc502825ea185e1abe8ce5e466b5bf485f90fc2a21a1df564ce7f9c91e6db42e67acbe78bbeb683dd9a94231044503c8082f68c33d9f8ec0";
+  hasManpages = true;
   license = [ "gpl3Plus" ];
   version = "3.0.4";
 };
+dvisvgm.binfiles = [
+  "dvisvgm"
+];
 dynamicnumber = {
   revision = 38726;
   stripPrefix = 0;
@@ -15296,8 +15734,14 @@ ebong = {
   sha512.run = "2553e46f91021de4fc9eda99ff45f8efe9b20b0663912b4339b22247d1bf7125f9be398661fe24fa2e3fae6a220025d47b05f4680601f7b4842d1111a6128d8c";
   sha512.doc = "22d20c89883c6cbb95f3fbc3da3f4c5526c9c22b15ec35828bb03a1edf068573de0b35187a893c8356b50fd59c93ce4231f02ac4f15de4071e6ced73b9e44a57";
   hasRunfiles = true;
+  scriptExts = [
+    "py"
+  ];
   license = [ "publicDomain" ];
 };
+ebong.binfiles = [
+  "ebong"
+];
 ebook = {
   revision = 29466;
   stripPrefix = 0;
@@ -16154,14 +16598,26 @@ eplain = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "eplain";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "-translate-file=cp227.tcx *eplain.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "dehyph" "hyph-utf8" "knuth-lib" "plain" ];
+    }
+  ];
   sha512.run = "fda8158ae2bdc96187b6e6ace2a94be3e0f68201adbc02553b48a3848481352ac10ddd72babcbc2835e089ce751ade7dfa6cfd1c642c94155c2861db865f5c29";
   sha512.doc = "60902b2422d2f5d7570a19daf7f586df7882505d7c156539699a0aa47a0f3bde5688dcbdc92c8a6a9878f11392bc9b9f147626aad230eecd2740d56f104928ed";
+  hasManpages = true;
   sha512.source = "015de2eeeaec99bd15882a190f9ef3f2112520f8c591c7e6d2351c52d8690b024750adea426bcf95f438aaa20c97dd321881ac7212ff181e148337b57f6d386c";
   hasRunfiles = true;
   license = [ "gpl2Plus" ];
   version = "3.13";
 };
+eplain.binfiles = [
+  "eplain"
+];
 epsdice = {
   revision = 15878;
   stripPrefix = 0;
@@ -16211,9 +16667,17 @@ epspdf = {
   sha512.run = "f155834a9636991c8ae752f61f70bdf22ab3172270c85aebb05462cf26e44f6e81fb83842c8515bfa54e632a3beab8bb91cccf2b5eef459d77738443c77df56d";
   sha512.doc = "5d06f8a4ef295e0fac8cd1dc73ff98e266dcf4394ed76223c92d20758fa8195ef5bea9bde49b1a247acfdf67aa7717092f978b55fc4fbc8665922487d57985d6";
   hasRunfiles = true;
+  scriptExts = [
+    "tcl"
+    "tlu"
+  ];
   license = [ "gpl2" ];
   version = "0.6.5.1";
 };
+epspdf.binfiles = [
+  "epspdf"
+  "epspdftk"
+];
 epspdfconversion = {
   revision = 18703;
   stripPrefix = 0;
@@ -16227,6 +16691,7 @@ epstopdf = {
   revision = 66465;
   sha512.run = "7640431f06879ebf5f557ec298f57dbedfa8f19d332cd05302bc09b69a0eb676f89597fab7f2d7d6358d023bcd3888e6007944f3cf66a07c6a852fe5b064c800";
   sha512.doc = "eb66e71ad2ef95d603f48bc70a997fe17579e57c9e0114dc33dfa30207f3babc28989f59f8cab2299ec03d1b3665cecf53e3e07750539906d4a2c374c3424d49";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "free" ];
   version = "2.31";
@@ -16241,6 +16706,10 @@ epstopdf-pkg = {
   license = [ "lppl13c" ];
   version = "2.11";
 };
+epstopdf.binfiles = [
+  "epstopdf"
+  "repstopdf"
+];
 eq-pin2corr = {
   revision = 59477;
   stripPrefix = 0;
@@ -16545,6 +17014,7 @@ etex = {
   stripPrefix = 0;
   sha512.run = "662338c145e84577ee49bd7d1941ade688d07ab8382faec25d6f45891953554e85ab4d531164e58db97071a7950c31b36f9eec8700ad4b43dffef30217f0fd89";
   sha512.doc = "d7c7cb6c0a8c2056be906761c7f0173c7ec28aa4e910d9546aa75aea79f8a2aedef06d708710135d3f557586990fefd73086b4f11b8b7642a1cbaedde91b1b8b";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "knuth" ];
 };
@@ -16897,6 +17367,9 @@ exceltex = {
   license = [ "gpl1Only" ];
   version = "0.5.1";
 };
+exceltex.binfiles = [
+  "exceltex"
+];
 excludeonly = {
   revision = 17262;
   stripPrefix = 0;
@@ -17576,6 +18049,9 @@ fig4latex = {
   license = [ "gpl3" ];
   version = "0.2";
 };
+fig4latex.binfiles = [
+  "fig4latex"
+];
 figbas = {
   revision = 28943;
   stripPrefix = 0;
@@ -17697,10 +18173,14 @@ findhyph = {
   revision = 47444;
   sha512.run = "aea6305dc0d9b31367638078a7958933468e761ef4cf47a1c44d9fd5ab2e25f7af22273c4631946a90edc9b51947c2e56b3d4b74c8c59f0a79250c2edf5bc137";
   sha512.doc = "97f3fa22fe490d21bc9e5ce5ea0b23ff25ab9afd9c5dbf6e8d78b24fd306ddc132c5ba7ca7ea7e3d7aaeb48993c7968b0c02ae0b765416a939d84b53171f4179";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2" ];
   version = "3.4";
 };
+findhyph.binfiles = [
+  "findhyph"
+];
 fink = {
   revision = 24329;
   stripPrefix = 0;
@@ -18258,11 +18738,15 @@ fontinst = {
   revision = 62517;
   sha512.run = "c3668f79f4b926090188386044fd68b0f13913168cdcb2aa23ccfd3aead488dec03e79133669bac3d2b719fdd2d5ef735fd46cbb27fd26fe560368f9e0cda05d";
   sha512.doc = "23c569bdd6f12dd4cd0b5673ed9efde2c7c7988d86bf2f89409bc22c80f64ea80ca6824745b50ea3ef30f70e4bd7c8d7005a9e05e511c1e917a12630f4b4bdb2";
+  hasManpages = true;
   sha512.source = "1645dfe5c6cd0efc8d8af966eb7363176ee7a44646b5860a3c137dd70c7e130340887e8690913d03be84eb1d84134c4ec2add713e4583a0feeefe4a1c4554402";
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "1.933";
 };
+fontinst.binfiles = [
+  "fontinst"
+];
 fontinstallationguide = {
   revision = 59755;
   stripPrefix = 0;
@@ -18291,9 +18775,15 @@ fontools = {
   revision = 65706;
   sha512.run = "a4cd3009c98502534f3c54d40fb22d788bcdfd474ba6bfc1b7010aa4d3471f468cd54a5d5c292d5afe685f9e4d99c023b8f78f302792dd1b381418042d96f47c";
   sha512.doc = "0506f6e9d0e0ae4fe4bb15303e2abde50a076899e4330a7d68f875abeaacff999cbab779bb368da5c717370e7cf885333c1479d6e795da4e387edd4656c30933";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2" ];
 };
+fontools.binfiles = [
+  "afm2afm"
+  "autoinst"
+  "ot2kpx"
+];
 fonts-churchslavonic = {
   revision = 56350;
   stripPrefix = 0;
@@ -18364,8 +18854,15 @@ fontware = {
   revision = 62387;
   sha512.run = "6103b16df1b465b08ebec98236b04a858ab1db6f7721c324d6776d5367c4a7ea5642869fff828147860b3858569abd4658174d03c3f23317c5ed28b53cf8cd75";
   sha512.doc = "c4caeb1ed2e50915e4ae76fe7b5fb53a4a7c55b9184e5a6c83a6912fa3d37f47627863bf76ca92578441d87055c82204bc09a3a8a96568edeef25e80c4cdac25";
+  hasManpages = true;
   license = [ "knuth" ];
 };
+fontware.binfiles = [
+  "pltotf"
+  "tftopl"
+  "vftovp"
+  "vptovf"
+];
 fontwrap = {
   revision = 15878;
   stripPrefix = 0;
@@ -18608,6 +19105,9 @@ fragmaster = {
   license = [ "gpl1Only" ];
   version = "1.6";
 };
+fragmaster.binfiles = [
+  "fragmaster"
+];
 fragments = {
   revision = 15878;
   stripPrefix = 0;
@@ -19209,9 +19709,15 @@ getmap = {
   sha512.run = "e5287152442820e20087b45c50a750af621e71e2175cd6790231d81e1f338e50aa75f29d9fbc31c2e5802229c8f15c4e0c7769d0513f1d1b0bafc96a8a3b120f";
   sha512.doc = "bb55c60ec958182aaaa6dfc292a06fbad8a0ebdcb56a6799f1358ad2009bcb72b06611672219c5e9bd6d7cb4db76c4fa030be5e06f9bb38d04fa6744f8bca330";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
   version = "1.11";
 };
+getmap.binfiles = [
+  "getmapdl"
+];
 getoptk = {
   revision = 23567;
   stripPrefix = 0;
@@ -19407,10 +19913,14 @@ git-latexdiff = {
   revision = 54732;
   sha512.run = "74077b3dd1a91a734af6d668b309f804dc58a282393d88d8d5d74a5e6fc73c197e49b462369f829cc7151e20aaf8085c0587428ed61ce7957a1ef173d92c5481";
   sha512.doc = "bfda354f808c1f94dfac207d1526409a160b89292e44541930dac34383e3ffec9ce63d04db041ea5ac529e1e01fdc80c4c64cd43e8cdc14aac974094732d6fe8";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "bsd2" ];
   version = "1.6.0";
 };
+git-latexdiff.binfiles = [
+  "git-latexdiff"
+];
 gitfile-info = {
   revision = 51928;
   stripPrefix = 0;
@@ -19516,8 +20026,12 @@ glossaries = {
   ];
   sha512.run = "a805158d4c2741c4efc707bfe417032903630d3f235c7431a3767e47592d8b9be2d64f6a14f21a0c7a3f4b37cbcba90d501c0ab1a551fe16357745960f362a1b";
   sha512.doc = "24e43bacdaf3d3680b49460849f2d4eb652f2e2103558edecff0cb78d261d0275e5f416c7fe83857fbe09f7016643849ee5f030e4b3db167f469960d7791489b";
+  hasManpages = true;
   sha512.source = "5240de5d2c942ec2eba38e76073f230265ce74dda641622acc8aad4c5856c1e8a749d01829ac39fc4b83479d9d24346270507c0f4bc5b957b7f4f3d07c4e898e";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
   version = "4.52";
 };
@@ -19691,6 +20205,10 @@ glossaries-spanish = {
   license = [ "lppl13c" ];
   version = "1.0";
 };
+glossaries.binfiles = [
+  "makeglossaries"
+  "makeglossaries-lite"
+];
 glyphlist = {
   revision = 54074;
   stripPrefix = 0;
@@ -20086,9 +20604,15 @@ gregoriotex = {
   sha512.doc = "67f018fe0eb9568b0ecc6977de8eb8fc1b0b9503372e2f674a97723c537d8a8fb4f48d48b95ee8979e4d4490d3725cf4a1411ab9d7da2ea14f72d0dad0fddd95";
   sha512.source = "0ae6211b33a256f1b10a2b167f3f5886f712688ae73baf13f698af37f69f83a9be754efbc6b0d5b3a1cdf11e7d459a98986b27c27b6318cba8fbb3e48d7f682a";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "gpl3" ];
   version = "6.0.0";
 };
+gregoriotex.binfiles = [
+  "gregorio"
+];
 grfext = {
   revision = 53024;
   stripPrefix = 0;
@@ -20208,10 +20732,14 @@ gsftopk = {
   revision = 52851;
   sha512.run = "cb9aebd7428d10b627d80ea40d297f3e6de006859c7dd713478ff193458494f90017ecd0737376ac1f47638b059e02e8a46ea53a7c56b8561af75f770e214413";
   sha512.doc = "0a597e2908438fc00fc2bafa7ec635a82b70aad9d7f7e86851a654c0b72b719b8c550be0c20ecf6c8d96627863a48e6a387156ad2c7e71d1e296dd4937d60805";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl1Only" ];
   version = "1.19.2";
 };
+gsftopk.binfiles = [
+  "gsftopk"
+];
 gtl = {
   revision = 49527;
   stripPrefix = 0;
@@ -20979,12 +21507,35 @@ hitex = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "hilatex";
+      enabled = false;
+      engine = "hitex";
+      patterns = [ "language.dat" ];
+      options = "-etex -ltx hilatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" ];
+    }
+    {
+      name = "hitex";
+      engine = "hitex";
+      patterns = [ "language.def" ];
+      options = "-etex -ltx hitex.ini";
+      fmttriggers = [ "cm" "hyphen-base" "etex" "knuth-lib" "plain" ];
+    }
+  ];
   sha512.run = "5a88c0f4d7bddc0161ce24bbe17884a93469f9ffb56ea6a2dcd3045cb97e5c9d09941e44e365483bc5126e1c9c6970ad151e19573d93b1472534333a507f1c63";
   sha512.doc = "3016748caa430c75689e27459c002abc8f68d4aa1c2d0be04b1f82981c44f7a3fd748f900aab5e4c37b16a56f884d5c0cf7d42323288c74cb51b72c19e0b08aa";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "x11" ];
 };
+hitex.binfiles = [
+  "hilatex"
+  "hishrink"
+  "histretch"
+  "hitex"
+];
 hithesis = {
   revision = 64005;
   stripPrefix = 0;
@@ -21410,11 +21961,15 @@ hyperxmp = {
   revision = 65979;
   sha512.run = "b2520a486ed2451f20b3414b29ccd209c427bfce22d248ba8e9e7b1f0c13e276b35853ed28b5d578e60d7234a1f6755f00023cc3f4bad968e0f22019aa547007";
   sha512.doc = "ce7269f6c014def7c967fd8782c3ba2e6bcbb2540e9dfaeccc63917d865ea0cc131c28ad2fcd7aff507b560d1dd7f05d4c3ee2cb9e483ba8f6f64e0bbc0dc619";
+  hasManpages = true;
   sha512.source = "c97193eda5c7e02f743ccb0dbc7915c6cff7c29facbc1e098b70987aa3a9b35123fd71bdc1d0b5fbf2f0d249dd48a6ace45b73c82351e1b4cf874420aea74871";
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "5.11";
 };
+hyperxmp.binfiles = [
+  "hyperxmp-add-bytecount"
+];
 hyph-utf8 = {
   revision = 61719;
   stripPrefix = 0;
@@ -22726,6 +23281,9 @@ installfont = {
   license = [ "lppl13c" ];
   version = "1.7";
 };
+installfont.binfiles = [
+  "installfont-tl"
+];
 intcalc = {
   revision = 53168;
   stripPrefix = 0;
@@ -23118,14 +23676,34 @@ jadetex = {
     "wasysym"
     "zapfding"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "jadetex";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "*jadetex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "amsfonts" "auxhook" "bigintcalc" "bitset" "colortbl" "cyrillic" "dehyph" "ec" "etexcmds" "fancyhdr" "gettitlestring" "graphics" "graphics-cfg" "graphics-def" "hycolor" "hyperref" "hyph-utf8" "iftex" "infwarerr" "intcalc" "kvdefinekeys" "kvoptions" "kvsetkeys" "latex" "latexconfig" "letltxmacro" "ltxcmds" "marvosym" "passivetex" "pdfescape" "pdftexcmds" "psnfss" "refcount" "rerunfilecheck" "stmaryrd" "symbol" "tipa" "tools" "ulem" "uniquecounter" "url" "wasysym" "zapfding" ];
+    }
+    {
+      name = "pdfjadetex";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "*pdfjadetex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "amsfonts" "auxhook" "bigintcalc" "bitset" "colortbl" "cyrillic" "dehyph" "ec" "etexcmds" "fancyhdr" "gettitlestring" "graphics" "graphics-cfg" "graphics-def" "hycolor" "hyperref" "hyph-utf8" "iftex" "infwarerr" "intcalc" "kvdefinekeys" "kvoptions" "kvsetkeys" "latex" "latexconfig" "letltxmacro" "ltxcmds" "marvosym" "passivetex" "pdfescape" "pdftexcmds" "psnfss" "refcount" "rerunfilecheck" "stmaryrd" "symbol" "tipa" "tools" "ulem" "uniquecounter" "url" "wasysym" "zapfding" ];
+    }
+  ];
   sha512.run = "75b9c8be4f87b51798826f5ea070ff9877e8bfa2fbee5112972e9e0fc81a76dcb7081c2fe9eed645f53a38dd85443dfdb394004b2970c2ff5a91b32dc1cab909";
   sha512.doc = "f70f85a12d730fc9dfb29da57a6f95239c10aa8ba7b9453ae884cae81399609fb99ccac3bfbc41f0c5f360ef80bd3f78b2f8479a826412bf573e9c5336d7e8ca";
+  hasManpages = true;
   sha512.source = "180798c7f61cfd56cef3b98f25dec39b4062b636297e60bfdf96c925f295a256e19fd25bdb8f18794db31d586234cf7c4d22989cd901d51bdaf6c3b8002e73ae";
   hasRunfiles = true;
   license = [ "free" ];
   version = "3.13";
 };
+jadetex.binfiles = [
+  "jadetex"
+  "pdfjadetex"
+];
 jamtimes = {
   revision = 20408;
   stripPrefix = 0;
@@ -23178,6 +23756,9 @@ jfmutil = {
   license = [ "mit" ];
   version = "1.3.3";
 };
+jfmutil.binfiles = [
+  "jfmutil"
+];
 jieeetran = {
   revision = 65642;
   stripPrefix = 0;
@@ -23614,9 +24195,15 @@ ketcindy = {
   sha512.run = "da33a0bdc989fcb6f4521d23e5d44bae70d608ed8ac10f05d6962a252e99bbd80380afa2cbe9e02b9c652b044dfff79218f951144da6ce55f8a53033c11ff346";
   sha512.doc = "1704411b3e7c41b6318ff6f8da56007dbf1bec67bb495d25364d6274d9b8acf234430081c22bab6ad13ffd0ea47586e6e24c9f27da8a97a309e2128ec74f89e9";
   hasRunfiles = true;
+  scriptExts = [
+    "jar"
+  ];
   license = [ "gpl3Plus" ];
   version = "20191225.0";
 };
+ketcindy.binfiles = [
+  "ketcindy"
+];
 keycommand = {
   revision = 18042;
   stripPrefix = 0;
@@ -23902,13 +24489,25 @@ kotex-utils = {
   license = [ "lppl13c" ];
   version = "2.1.0";
 };
+kotex-utils.binfiles = [
+  "jamo-normalize"
+  "komkindex"
+  "ttf2kotexfont"
+];
 kpathsea = {
   revision = 65309;
   sha512.run = "8a9f0dd49470bec5ba0f963a0385bea45141d6b805682bd65e95291b02158b9d2cedd5bd43592de7c447fe87f04efa00e4d1aa191a490147adcb57ec3922b5db";
   sha512.doc = "51500943de0184fd9794dbf6af80aed2fc7bbaf2a7949facb1840ad0e32344d217aa4d58ee76e3934aec891858f789b3847b9027cb2bd75e5962be98ddd9d02f";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lgpl21" ];
 };
+kpathsea.binfiles = [
+  "kpseaccess"
+  "kpsereadlink"
+  "kpsestat"
+  "kpsewhich"
+];
 kpfonts = {
   revision = 65583;
   stripPrefix = 0;
@@ -24090,10 +24689,17 @@ l3build = {
   ];
   sha512.run = "448eb99216ab32847ca682083ec700ef04851f3a680b67b6e2abcb7eb5e0b1d705260776f23073e5e8c43ff0dac9bfe343a6d271aaa5b99392c0603538f23bac";
   sha512.doc = "a1b2a775a1b12937afe34c4843aa6374f6e2bfe3e29004bb2b05f16d81f440921503c6373f7a44f5c72fa1185c7d0e7d06a7a2c5113986fc6b35d66b4b6d6f49";
+  hasManpages = true;
   sha512.source = "35f6b8a5c72b5e4d7e019ec7d4954fef929f3958dc0667f554728034c28f2aab63df3c82f5d2101502906534ee02f51a6fbc1e88b49f8da8c017355c9cd7fdb2";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
 };
+l3build.binfiles = [
+  "l3build"
+];
 l3experimental = {
   revision = 65621;
   stripPrefix = 0;
@@ -24181,8 +24787,12 @@ lacheck = {
   revision = 54070;
   sha512.run = "30241d13ac35054017c6240ad066ae84b11c26757fa895ffdc1444b0825e50a2a89864ca85d710882be4105127c4df203ad4a403504a6c309b796c9b9ee5b589";
   sha512.doc = "a1ef923bfe1c3496651052b4a8b6978665b75f43b7dbeb254fb61657050427aedc8415218f988a7e727849dd0001b67ed023ecd252bac2445b0965a58800187c";
+  hasManpages = true;
   license = [ "gpl1Only" ];
 };
+lacheck.binfiles = [
+  "lacheck"
+];
 ladder = {
   revision = 44394;
   stripPrefix = 0;
@@ -24345,9 +24955,39 @@ latex-bin = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "dvilualatex";
+      engine = "luatex";
+      patterns = [ "language.dat" "language.dat.lua" ];
+      options = "dvilualatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex" "lm" "luaotfload" ];
+    }
+    {
+      name = "latex";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "-translate-file=cp227.tcx *latex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex" "dehyph" "hyph-utf8" "latexconfig" ];
+    }
+    {
+      name = "lualatex";
+      engine = "luahbtex";
+      patterns = [ "language.dat" "language.dat.lua" ];
+      options = "lualatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex" "lm" "luaotfload" ];
+    }
+    {
+      name = "pdflatex";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "-translate-file=cp227.tcx *pdflatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex" "dehyph" "hyph-utf8" "latexconfig" ];
+    }
+  ];
   sha512.run = "91b6749a7fc520500812c203a1acb0701e7984e5e309eaf0c4815bc7ea0b507f3eeaaae3a6ad715ee53f018b8e38c695c4ff9567f26222cd2c52ba24e1a03c1f";
   sha512.doc = "30f9001ed8236f01555f8a21ff8286ea409d75583876f8ba795e1a819dea14cb3f2b3dff31e0258cf5deb75ae2fd9201e33260ef1f32c2ce53fb86bfa4e59f83";
+  hasManpages = true;
 };
 latex-bin-dev = {
   revision = 62387;
@@ -24378,10 +25018,52 @@ latex-bin-dev = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "dvilualatex-dev";
+      engine = "luatex";
+      patterns = [ "language.dat" "language.dat.lua" ];
+      options = "dvilualatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "lm" "luaotfload" ];
+    }
+    {
+      name = "latex-dev";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "-translate-file=cp227.tcx *latex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "dehyph" "hyph-utf8" "latexconfig" "pdftex" ];
+    }
+    {
+      name = "lualatex-dev";
+      engine = "luahbtex";
+      patterns = [ "language.dat" "language.dat.lua" ];
+      options = "lualatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "lm" "luaotfload" ];
+    }
+    {
+      name = "pdflatex-dev";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "-translate-file=cp227.tcx *pdflatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "dehyph" "hyph-utf8" "latexconfig" "pdftex" ];
+    }
+  ];
   sha512.run = "dade40731ce41c6a0304cb7472255f2d6c8b1fed45b619282aa747b3ebbdfd707da18947f06c8896d72605b324ffa58c3c7195bd90629531ef1fb54a91f1310c";
   sha512.doc = "7434698038dd90f10c51743e238cfcf0d85da2067d458f399e557b855c7ae6fd4e013ef4272e710eb9695d3e4f8757acae95c41a9e704a393202aafc11218754";
-};
+  hasManpages = true;
+};
+latex-bin-dev.binfiles = [
+  "dvilualatex-dev"
+  "latex-dev"
+  "lualatex-dev"
+  "pdflatex-dev"
+];
+latex-bin.binfiles = [
+  "dvilualatex"
+  "latex"
+  "lualatex"
+  "pdflatex"
+];
 latex-brochure = {
   revision = 40612;
   stripPrefix = 0;
@@ -24434,10 +25116,14 @@ latex-git-log = {
   revision = 54010;
   sha512.run = "15994c6eb9ba1b194df270c68a3d74ab3db11974875ce192559182b2dbfa9b308d598056a3145f2cc2f6718865a5b140ccb95dea22a9e23edee527e5b86362ff";
   sha512.doc = "52bc94324c64caac9a5b25b49c9ea01b8560433d640646ee70830d27637482cf50da95bbb86db93006f2be4ab9f5f79fa144e4b631d62c05f0a11ab45e639cbf";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl3Plus" ];
   version = "1.0.0";
 };
+latex-git-log.binfiles = [
+  "latex-git-log"
+];
 latex-graphics-companion = {
   revision = 29235;
   stripPrefix = 0;
@@ -24508,9 +25194,15 @@ latex-papersize = {
   sha512.run = "00010f764235c6d9e4d6667c8c8b9f0ec6ae4b65afb53109f8179e0429d4b3787bd6b0985cd511f770cd74512483d1077e0f42136fe7ce1871984b372f2f2e54";
   sha512.doc = "8ebddd884e3e533d06332f2d6f8657ed54c9c376b3de68c7e7652f3b2835ec6601f5326ea70dc830b645440f0bd9ba2281e4f71a847946bb595771c6a950c0a6";
   hasRunfiles = true;
+  scriptExts = [
+    "py"
+  ];
   license = [ "asl20" ];
   version = "1.63";
 };
+latex-papersize.binfiles = [
+  "latex-papersize"
+];
 latex-refsheet = {
   revision = 45076;
   stripPrefix = 0;
@@ -24586,18 +25278,28 @@ latex2man = {
   revision = 64477;
   sha512.run = "2617f6e8059f30c0098ea896cff69f585ea2ddbd3bbbd8066e7296dd833d3a246b8fefc0af71a92abf7e2051c754c0e3e6098175a4b181780563416bc9146b95";
   sha512.doc = "390666cc56ad70342c9a24ca593fe65b3760674a882ed8bba383d193f2578285727a085f823afc03fa0dbc9966612caf9a29222fd2a9f39214f01aa268acdc50";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl1" ];
   version = "1.29";
 };
+latex2man.binfiles = [
+  "latex2man"
+];
 latex2nemeth = {
   revision = 65269;
   sha512.run = "f2669a9e58857094c922b968f337e2cb2cf475b07811d53c61a8e0b4dc8bcc41d95186940361676bc62c0f235edb4fe7a7c0d5ee0f6d74c541d1108960e18e7e";
   sha512.doc = "7fa7ae1c628e29549fc3cb2c98164e27f60cc0bcbf14e26b7a325aee313a5f41c3144d5adf2993c20999016f4798dcd436d96c637c4258ace0efc3bda4a54a43";
   hasRunfiles = true;
+  scriptExts = [
+    "jar"
+  ];
   license = [ "gpl3" ];
   version = "1.1.3";
 };
+latex2nemeth.binfiles = [
+  "latex2nemeth"
+];
 latex4musicians = {
   revision = 49759;
   stripPrefix = 0;
@@ -24710,10 +25412,16 @@ latexdiff = {
   revision = 64980;
   sha512.run = "ae7179b5a9d410302d750233b6b22d29382406f3222129155c98b1f2ddc23d22ca7abe1683fd013c7302fe8e21e82a376499ae33d83c15a01fa2720696e5b718";
   sha512.doc = "2f484db22ec12886a4d76fabde3a65a982d3e659f524120b377221f91c7ad5973ad6023aa3226dd35baa687c86ec8dd8e736553d1604690d87e68d3cf7be84f8";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl3" ];
   version = "1.3.3";
 };
+latexdiff.binfiles = [
+  "latexdiff"
+  "latexdiff-vc"
+  "latexrevise"
+];
 latexfileinfo-pkgs = {
   revision = 26760;
   stripPrefix = 0;
@@ -24732,6 +25440,9 @@ latexfileversion = {
   license = [ "lppl13c" ];
   version = "0.3";
 };
+latexfileversion.binfiles = [
+  "latexfileversion"
+];
 latexgit = {
   revision = 54811;
   stripPrefix = 0;
@@ -24749,14 +25460,21 @@ latexindent = {
   license = [ "gpl3" ];
   version = "3.20.3";
 };
+latexindent.binfiles = [
+  "latexindent"
+];
 latexmk = {
   revision = 65485;
   sha512.run = "c00227344e815dd558173662022045e2d6d2bf626235aa2b12e637da5ecfe069b4bf74d243eda7d33d0fb9d7c98e67fc33b2a6735d87bae17f22f5e81b1f2710";
   sha512.doc = "4daa3f455c7396aaff4c7ad0322787621fb91f247cf8da95dd65aebc4d09f114ef226b65c701807b6f4d66777026be2d65ff10745d96832658139f33b315069b";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2" ];
   version = "4.79";
 };
+latexmk.binfiles = [
+  "latexmk"
+];
 latexmp = {
   revision = 55643;
   stripPrefix = 0;
@@ -24774,6 +25492,9 @@ latexpand = {
   license = [ "bsd3" ];
   version = "1.7.2";
 };
+latexpand.binfiles = [
+  "latexpand"
+];
 latino-sine-flexione = {
   revision = 53485;
   stripPrefix = 0;
@@ -24848,8 +25569,22 @@ lcdftypetools = {
   ];
   sha512.run = "3f3cc8f7cce233eb36315b21db408847a267ff393d6d4118de61c4b03ec408f3f29b2d41fdcf84995bfbf5d07bcb25984d7ffc76458d4f2dc12fdb6dfb85e23f";
   sha512.doc = "5a1dd1e2fd79351afc65d6786b24aebd9681a2b9e92755b44a836b47da5ceb1817f085483f306991a113dc0c26edfcd84839dec93bb46a003034536f31b31e5f";
+  hasManpages = true;
   license = [ "gpl1Only" ];
 };
+lcdftypetools.binfiles = [
+  "cfftot1"
+  "mmafm"
+  "mmpfb"
+  "otfinfo"
+  "otftotfm"
+  "t1dotlessj"
+  "t1lint"
+  "t1rawafm"
+  "t1reencode"
+  "t1testpage"
+  "ttftotype42"
+];
 lcg = {
   revision = 31474;
   stripPrefix = 0;
@@ -25292,10 +26027,17 @@ light-latex-make = {
   revision = 66474;
   sha512.run = "e069afa8933cf7389014409342159462d2f04fed07cb9857bbaa828ae7752e89a2c21bf9814cee4d0a7763045986761f41cd92fd0bdf1b697815a37212832a16";
   sha512.doc = "53b2edb93b66c7addbbb4c8bb98ad7a9da4ca38ad33ccd8d5df38281bcb86ab6ea16aeb3babc3d0d18f8e355d5c678caf82f7bf3eaebd927a669e04274e4d5ab";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "mit" ];
   version = "1.2.0";
 };
+light-latex-make.binfiles = [
+  "llmk"
+];
 ligtype = {
   revision = 63577;
   stripPrefix = 0;
@@ -25311,9 +26053,17 @@ lilyglyphs = {
   sha512.doc = "4d9ac765c6a4b2b736d08569eeb6d0d8b168fe96563526264f2485d3d27a944a3e81c6144cd8f1d8cb5162d425b436fc688172db18b09610b3088df4ce868a27";
   sha512.source = "e0a1db8b5c4e57374ea19a7f8da3f4a89a2947869eba3f57411a9e815d645f4cb4200832276e3d3c869e2b3a8e3018e8e0f20f942f2396395b7739d7e9b23951";
   hasRunfiles = true;
+  scriptExts = [
+    "py"
+  ];
   license = [ "lppl13c" ];
   version = "0.2.4";
 };
+lilyglyphs.binfiles = [
+  "lily-glyph-commands"
+  "lily-image-commands"
+  "lily-rebuild-pdfs"
+];
 limap = {
   revision = 44863;
   stripPrefix = 0;
@@ -25442,6 +26192,9 @@ listbib = {
   license = [ "gpl1Only" ];
   version = "2.2";
 };
+listbib.binfiles = [
+  "listbib"
+];
 listing = {
   revision = 17373;
   stripPrefix = 0;
@@ -25470,6 +26223,9 @@ listings-ext = {
   license = [ "lppl12" ];
   version = "67";
 };
+listings-ext.binfiles = [
+  "listings-ext.sh"
+];
 listingsutf8 = {
   revision = 53097;
   stripPrefix = 0;
@@ -25701,13 +26457,23 @@ lollipop = {
     "cm"
     "hyphen-base"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "lollipop";
+      engine = "tex";
+      options = "lollipop.ini";
+      fmttriggers = [ "cm" "hyphen-base" ];
+    }
+  ];
   sha512.run = "81557b83acfa4ad42dfa6fb1a65ea42bc33885da444ee23bc3c67a899df7b3ac2c19a1607305b5ec10b503980365c5d29ac3598339fc186a05417ea5bca60a78";
   sha512.doc = "206dee2be733e3ac04b5b259862b60fb3641fc44ea182da601ca54a010ff8e42f254dd01c03be7bcdd2a6258110c567a596ee82b4eb74d04ca8ed70e50cd6a86";
   hasRunfiles = true;
   license = [ "gpl3" ];
   version = "1.07";
 };
+lollipop.binfiles = [
+  "lollipop"
+];
 longdivision = {
   revision = 59979;
   stripPrefix = 0;
@@ -26117,6 +26883,9 @@ ltxfileinfo = {
   license = [ "gpl1Only" ];
   version = "2.04";
 };
+ltxfileinfo.binfiles = [
+  "ltxfileinfo"
+];
 ltxguidex = {
   revision = 50992;
   stripPrefix = 0;
@@ -26130,10 +26899,14 @@ ltximg = {
   revision = 59335;
   sha512.run = "0c91f46da529823a96ef441ec88d6d3c077a8bd5997bc291f55012e0d227cc24f00081f846ae127a364cba26498a74f2769d401e6d5fe0057afdb2a76a875f4a";
   sha512.doc = "05f9639a0224c779276a3b7f19450c93e255c70680fd54292e1ad41b3c89aa15dc187d58a73475ed9a8f7279faa0f3a0ec15042e75a52c70d78416ec46255b44";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl3Plus" ];
   version = "2.1";
 };
+ltximg.binfiles = [
+  "ltximg"
+];
 ltxkeys = {
   revision = 28332;
   stripPrefix = 0;
@@ -26334,10 +27107,17 @@ luafindfont = {
   revision = 64936;
   sha512.run = "a73bfe0aa1b6a907224cc98f2d5f6344249f79010ad5552c66286eb7c103d5c69851a452cb6eebf39ebd5b6e8e64062efb125bea1c6586ef5117f994a97244bd";
   sha512.doc = "e7196d9a2e69b5a6d5582d7ddc00ac480b16228b424cb9d568ef1ff6fbef48e5926776d5f22fa0eb5c4b09b6b29a283416206f64cf324356b35d66228bbbd3ea";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
   version = "0.11";
 };
+luafindfont.binfiles = [
+  "luafindfont"
+];
 luagcd = {
   revision = 65396;
   stripPrefix = 0;
@@ -26360,10 +27140,22 @@ luahbtex = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "luahbtex";
+      engine = "luahbtex";
+      patterns = [ "language.def" "language.dat.lua" ];
+      options = "luatex.ini";
+      fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" "luatex" ];
+    }
+  ];
   sha512.run = "daafa6e417e7c366dde221488b91708f8c1302cf6db849b91a82bd74619f0b91e16430680aabeb27e43d1469262c9f799cd0bd6547635ac6ad54ef8e2dae5703";
   sha512.doc = "5d2915af80990896181a70c24dd3c51748fbaa6f3f9b96b67b1b40bc8ab36d39293e8f76c0f3dabdaffb252423eec61375b6f5aa859a1310236f7d39d6f2fcf3";
+  hasManpages = true;
 };
+luahbtex.binfiles = [
+  "luahbtex"
+];
 luahyphenrules = {
   revision = 56200;
   stripPrefix = 0;
@@ -26423,10 +27215,32 @@ luajittex = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "luajithbtex";
+      engine = "luajithbtex";
+      options = "luatex.ini";
+      patterns = [ "language.def" "language.dat.lua" ];
+      fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" "luatex" ];
+    }
+    {
+      name = "luajittex";
+      engine = "luajittex";
+      options = "luatex.ini";
+      patterns = [ "language.def" "language.dat.lua" ];
+      fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" "luatex" ];
+    }
+  ];
   sha512.run = "f7503044bf237ca6d6e33a3a067bba0d73dfecfee7e77b5ebd4f3d6417dd24f7aa263cb08e7ffb86708574ecda31d5c7d89b42d2ad2179119393b99129f8077d";
   sha512.doc = "3924029e274913999cf54e2f3a4d3ef85dbfbb4ee93a629b8eeb77c796557c3086eb447fa74d2d7a6f33a17f433f38ceb033f7e1633e240bbb135b4239b588f7";
-};
+  hasManpages = true;
+};
+luajittex.binfiles = [
+  "luajithbtex"
+  "luajittex"
+  "texluajit"
+  "texluajitc"
+];
 luakeys = {
   revision = 65533;
   stripPrefix = 0;
@@ -26561,11 +27375,18 @@ luaotfload = {
   ];
   sha512.run = "70f27796fdfe61e0337239a2962052eb2896478358fca0f271287db06a1d2de2f83cd7394d0ec6c281e9a5779ec396e2993f53b8b045ed7a09cb17f100a4a477";
   sha512.doc = "9e1c223ec2589f32640aefd2692d031b8ba324da30a814eea98768443eeb76d92d2700c320e6f96006e54635d31a655cae0a27c76931e7640748889ead4fbfb4";
+  hasManpages = true;
   sha512.source = "3ed04272b887f434bfe2dd166974889318597e22c57109647946f2b255efca2fb6d1ecc1f02485a1bf387e77956c64a9f42c4af237b29f9fc7a38400d8cfbef1";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "gpl2" ];
   version = "3.23";
 };
+luaotfload.binfiles = [
+  "luaotfload-tool"
+];
 luapackageloader = {
   revision = 54779;
   stripPrefix = 0;
@@ -26644,12 +27465,34 @@ luatex = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "dviluatex";
+      engine = "luatex";
+      options = "dviluatex.ini";
+      patterns = [ "language.def" "language.dat.lua" ];
+      fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" ];
+    }
+    {
+      name = "luatex";
+      engine = "luatex";
+      options = "luatex.ini";
+      patterns = [ "language.def" "language.dat.lua" ];
+      fmttriggers = [ "cm" "etex" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" "unicode-data" "hyph-utf8" ];
+    }
+  ];
   sha512.run = "3bac06a5349e13d48ffebee9e78e271d8ea64d0e1b55df018ee1fab2533fbde3d9e9f99b64c3dbd3026c24b61bf6b867684489a73202cfdeb620558522c53b7f";
   sha512.doc = "ed7298a561425d7e5776ac6555716b2b57f0d16584a871de94c5c341f0d8023bbb341b2deb78dc313e9aaff18659b49f24c41063a5719a43b67e5b074fc0d3b5";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2Plus" ];
 };
+luatex.binfiles = [
+  "dviluatex"
+  "luatex"
+  "texlua"
+  "texluac"
+];
 luatex85 = {
   revision = 41456;
   stripPrefix = 0;
@@ -26756,9 +27599,15 @@ lwarp = {
   sha512.doc = "4e25b1cd6286c5ad70153993a0660db10e43bdae2099a66544fda73a6820404351352df5ba6889634d3b000257408cdc15945130a496a58ed52260734308cd57";
   sha512.source = "756b877b4bd41fea4f11dbb8951ec232ca6b97a3ed5ff197467ab38150cac04c788dfc5b390506d611fc47e749cb78c03fb3db73e191f380b2eed1cc00534426";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
   version = "0.911";
 };
+lwarp.binfiles = [
+  "lwarpmk"
+];
 lxfonts = {
   revision = 32354;
   stripPrefix = 0;
@@ -26790,10 +27639,18 @@ m-tx = {
   revision = 64182;
   sha512.run = "b56bc4432bcd340f3e92f5043c38bde7f14b5f2d32b9433fa21c73c20f7ebb981714175aa6f4f871636efb62a52cd24aa639e87a320039313b16db1b027ee2f5";
   sha512.doc = "316fbc2b37b903cae8da6bb9f44b8afad0e3e577c6fd84664e1724ffe318bbdbf9609dcadd5cde6a14cc5acbc134f69bd7a87dd90d9da7d4442a5f913b8132f5";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "mit" ];
   version = "0.63d";
 };
+m-tx.binfiles = [
+  "m-tx"
+  "prepmx"
+];
 macrolist = {
   revision = 60139;
   stripPrefix = 0;
@@ -26907,9 +27764,15 @@ make4ht = {
   sha512.run = "c6da836e4cd40bb987d2e15b3cbcc2a650284fc0bbc0c5220ac9b5e03b3ba9177986e013b68e401a951cb7982cd0a359d3ae2819c1ff516b4c6e88dacfe728c9";
   sha512.doc = "9a802d3a26656f066457d07118bea52c0859d77bd02c6599e572538c54461f577d6ceed5845ef339811bbbf36560c69528cc76b29550e209f021163a2f57c639";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
   version = "0.3m";
 };
+make4ht.binfiles = [
+  "make4ht"
+];
 makebarcode = {
   revision = 15878;
   stripPrefix = 0;
@@ -26983,6 +27846,9 @@ makedtx = {
   license = [ "lppl13c" ];
   version = "1.2";
 };
+makedtx.binfiles = [
+  "makedtx"
+];
 makeglos = {
   revision = 15878;
   stripPrefix = 0;
@@ -26995,9 +27861,14 @@ makeindex = {
   revision = 62517;
   sha512.run = "5967ba4123fd4c708ce841d29211fdb66c28518f4b418903be0ddf2a49964f706af96b250eec814c547e0703460c1273ce72a7acf3ea9fe28cc1c7073af29d3c";
   sha512.doc = "40b9ee1ebf7dba9a4bb4bb3077cdb1e88b07f276a9d0ae9c2817bd76a2f742ec9237d1b6d9658694fc5fc4e8f82591194862637bd83ea8e106c0541591d343ee";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "free" ];
 };
+makeindex.binfiles = [
+  "makeindex"
+  "mkindex"
+];
 makelabels = {
   revision = 60255;
   stripPrefix = 0;
@@ -27205,6 +28076,9 @@ match_parens = {
   license = [ "gpl1Only" ];
   version = "1.43";
 };
+match_parens.binfiles = [
+  "match_parens"
+];
 math-into-latex-4 = {
   revision = 44131;
   stripPrefix = 0;
@@ -27399,10 +28273,14 @@ mathspic = {
   revision = 31957;
   sha512.run = "e556960f07a003e877ce678110e724ef94d34aabc0ae52c59ec2ae487fc7d3e5de169844baaefd61e467e98a7a9718d94d881c3f0d43855e133040bdbddb6a62";
   sha512.doc = "1702071f4c26097e241ba161258a51461405954105c8a7f2d92a552d6397ef69af029652ba5528df999c569fae32955d1b194b0f7c4475b3fc870656b473386a";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "1.13";
 };
+mathspic.binfiles = [
+  "mathspic"
+];
 mathtools = {
   revision = 63767;
   stripPrefix = 0;
@@ -27760,9 +28638,17 @@ metafont = {
     "kpathsea"
     "modes"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "mf";
+      engine = "mf-nowin";
+      options = "-translate-file=cp227.tcx mf.ini";
+      fmttriggers = [ "modes" ];
+    }
+  ];
   sha512.run = "4e287680b7b14497133165a45ed668dd326e587a305475d90f4b545aa1973a0e6001fef2e3a9afa5fd2f343497d109f4670fcc0f4c0263b20624dbbad1f21bd3";
   sha512.doc = "07e574fce34949b71ea0b156c394db80bdd9c9a3018afbdadf786fa431674b6fd0c2f79e8f9a72c872b17b2dbedb755c0ce3def552740a99e63d65e28fc3d2b0";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "knuth" ];
   version = "2.71828182";
@@ -27774,6 +28660,11 @@ metafont-beginners = {
   sha512.doc = "4fb7148b0668845447fd38411df0288972312a56897b1d5bce69a7e57ae632aacd12c273a911045204705a5534ac1d1c290af08a7057bd62184a59eb7146feb6";
   license = [ "publicDomain" ];
 };
+metafont.binfiles = [
+  "inimf"
+  "mf"
+  "mf-nowin"
+];
 metago = {
   revision = 15878;
   stripPrefix = 0;
@@ -27837,6 +28728,7 @@ metapost = {
   ];
   sha512.run = "d807a22bd0f3358d1986a477834c19b2fce636e4ea96f52f745220a165726505849ac4a1048bd4be49cf9e42e098a55df2a4c9b4d267dddbe2fb093ba3029d6d";
   sha512.doc = "384730c3f784bb026bb29ee69dc95d179c53636c405e1a037477269e9a3a95d8c296729d7bb54037ca4a76e5ef00eff4876c4538203e400db8c4f0850c48b259";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lgpl2" ];
 };
@@ -27855,6 +28747,12 @@ metapost-examples = {
   sha512.doc = "2a3aec80b511864878e07ff973e17ed4fe1aec692c7e6983b57dde586aa19500cdd373687b0e081dc80c8584f116f0fa3de7ed4f09ba232eee8adce5e998c954";
   license = [ "free" ];
 };
+metapost.binfiles = [
+  "dvitomp"
+  "mfplain"
+  "mpost"
+  "r-mpost"
+];
 metastr = {
   revision = 56246;
   stripPrefix = 0;
@@ -27936,7 +28834,29 @@ mex = {
     "tex-ini-files"
     "utf8mex"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "mex";
+      engine = "pdftex";
+      patterns = [ "mexconf.tex" ];
+      options = "-translate-file=cp227.tcx *mex.ini";
+      fmttriggers = [ "hyph-utf8" "hyphen-base" "hyphen-polish" "knuth-lib" "pl" "plain" "tex-ini-files" ];
+    }
+    {
+      name = "pdfmex";
+      engine = "pdftex";
+      patterns = [ "mexconf.tex" ];
+      options = "-translate-file=cp227.tcx *pdfmex.ini";
+      fmttriggers = [ "hyph-utf8" "hyphen-base" "hyphen-polish" "knuth-lib" "pl" "plain" "tex-ini-files" ];
+    }
+    {
+      name = "utf8mex";
+      engine = "pdftex";
+      patterns = [ "mexconf.tex" ];
+      options = "-enc *utf8mex.ini";
+      fmttriggers = [ "hyph-utf8" "hyphen-base" "hyphen-polish" "knuth-lib" "pl" "plain" "tex-ini-files" "enctex" "utf8mex" ];
+    }
+  ];
   sha512.run = "a79d6a1ecb15f7962826773d7eab4b1ffd86a5c15f8076f096fecf63df1bd661449eb7d14251a57a1eb2bede030ddf93aac170fc3c59ae0a124da6cef69e55be";
   sha512.doc = "091f2825376718d8c2190555af7ef54d0ae5202425d57b986fba861df2f8604301df5a121ccfcfcdc91032d07dcda8289fb8de5d81c487b93b0e202a2a5a658e";
   sha512.source = "6f20a7e4f80670f7dfe5b2cfe3357a5d16b0f627b5e9e95c2d7d46598e00b989d5ae8c797589c56c594b7d3610f5f79cad42f3bb64a628be968e4e9e5d541e98";
@@ -27944,6 +28864,11 @@ mex = {
   license = [ "knuth" ];
   version = "1.05a";
 };
+mex.binfiles = [
+  "mex"
+  "pdfmex"
+  "utf8mex"
+];
 mf2pt1 = {
   revision = 61217;
   sha512.run = "ca93a3ae439f9cd8029720bd1d90fbe75a403e7ab4ebcbe1ba1e5a7a28aa9269197f90a4aee849fea59d734d5dc38f04eedc140ff1be64fd805a10ab5510a2f5";
@@ -27952,6 +28877,9 @@ mf2pt1 = {
   license = [ "lppl13c" ];
   version = "2.7";
 };
+mf2pt1.binfiles = [
+  "mf2pt1"
+];
 mfirstuc = {
   revision = 64743;
   stripPrefix = 0;
@@ -27987,10 +28915,27 @@ mflua = {
     "luatex"
     "metafont"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "mflua";
+      engine = "mflua-nowin";
+      options = "mf.ini";
+      fmttriggers = [ "luatex" "metafont" ];
+      enabled = false;
+    }
+  ];
   sha512.run = "fa735fa117e7bd433339efbb709caa5fc25007088500dd5e4f6999cc417d188fd43435f74d526186880ac857f9bfc52e1fb7f1055974cea959e28536150b1a19";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
 };
+mflua.binfiles = [
+  "mflua"
+  "mflua-nowin"
+  "mfluajit"
+  "mfluajit-nowin"
+];
 mfnfss = {
   revision = 46036;
   stripPrefix = 0;
@@ -28034,9 +28979,18 @@ mfware = {
   revision = 62387;
   sha512.run = "4ed72f1fdd64298b0ae67af00c3ba64bc6ee0a4851ab09c674adf5824972ef183d2913f5bda7d0756be403cbb14817e67913274e350bed81201fbf7af5b2ec97";
   sha512.doc = "a4715a988208eb7ae2b252fa9e6d9e7dcd55cf86cd66d55d42d13cfe9acbfea8dee03ce0312944ed5075f7b6a48aaa25a7134831b7798c60af13cfc648955951";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "publicDomain" ];
 };
+mfware.binfiles = [
+  "gftodvi"
+  "gftopk"
+  "gftype"
+  "mft"
+  "pktogf"
+  "pktype"
+];
 mgltex = {
   revision = 63255;
   stripPrefix = 0;
@@ -28367,15 +29321,22 @@ mkgrkindex = {
   license = [ "free" ];
   version = "2.0";
 };
+mkgrkindex.binfiles = [
+  "mkgrkindex"
+];
 mkjobtexmf = {
   revision = 29725;
   sha512.run = "c0dffdb276141b78bd2c47e6d2bfddcd13c1800d3a0806a05ca1fba72a91621364b827801430bc757601e07f2a5130366ade49d7ac1df27901fbec29827739c3";
   sha512.doc = "3ef5c333cedd5104b63c1457fff2eee40aea7d1f1b187d34ce4cfccd5b6bd38809b7686dc7b41a147fbee2ae0e951470f3ae574bd3c10a5f9b6fb76b686ce4f5";
+  hasManpages = true;
   sha512.source = "7f9de9bafb890d12ef2f07d3b8596dc31c4bb97079f826c9efd4f318383f64d8250099a937d8d692fecf703e626b42f942962f4d906e705cf4b0155e354bff0f";
   hasRunfiles = true;
   license = [ "artistic1-cl8" ];
   version = "0.8";
 };
+mkjobtexmf.binfiles = [
+  "mkjobtexmf"
+];
 mkpattern = {
   revision = 15878;
   stripPrefix = 0;
@@ -28393,6 +29354,9 @@ mkpic = {
   license = [ "gpl1Only" ];
   version = "1.02";
 };
+mkpic.binfiles = [
+  "mkpic"
+];
 mla-paper = {
   revision = 54080;
   stripPrefix = 0;
@@ -28463,13 +29427,31 @@ mltex = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "mllatex";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "-translate-file=cp227.tcx -mltex *mllatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "dehyph" "hyph-utf8" "latex" "latexconfig" ];
+    }
+    {
+      name = "mltex";
+      engine = "pdftex";
+      options = "-translate-file=cp227.tcx -mltex mltex.ini";
+      fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" ];
+    }
+  ];
   sha512.run = "e04f33b83474e58c4725abbba21ae56659920ad2929faba7f25b47befeeb7e207e36888e1dbf7260ecc95c126e1732f6f5dced3d277db7c3889f2b08590b04dc";
   sha512.doc = "e9d5a1cfdc6183bf99ef369b447c73e9ec5926952a80a75708db4fc6343ffc1a10d599276c13f295005f7c8c56e2e35ad9edc9dee3ee06928fa8c7b267d82bbf";
   hasRunfiles = true;
   license = [ "knuth" ];
   version = "2.2";
 };
+mltex.binfiles = [
+  "mllatex"
+  "mltex"
+];
 mluexercise = {
   revision = 56927;
   stripPrefix = 0;
@@ -28836,11 +29818,22 @@ mptopdf = {
   deps = [
     "plain"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "mptopdf";
+      engine = "pdftex";
+      options = "-translate-file=cp227.tcx mptopdf.tex";
+      fmttriggers = [ "plain" ];
+    }
+  ];
   sha512.run = "1d488a0254f5fc2197d3e8e66de4b0c38abefd477cedac511098612e7200ba90f9d81715273e5e24b731638b91d69ec4b86f0ef1b65ebbd115e9d09c6f2772ab";
   sha512.doc = "ad89851e9f944f18ce1226d6c753a14aad0abe9012b4fc97d5328005e2f758a351db1ddd5ea590694396cab8852b6f77adc5ac77bf1de5277ab224d9470e513e";
+  hasManpages = true;
   hasRunfiles = true;
 };
+mptopdf.binfiles = [
+  "mptopdf"
+];
 mptrees = {
   revision = 60929;
   stripPrefix = 0;
@@ -28982,6 +29975,9 @@ multibibliography = {
   license = [ "lppl13c" ];
   version = "1.03";
 };
+multibibliography.binfiles = [
+  "multibibliography"
+];
 multicap = {
   revision = 15878;
   stripPrefix = 0;
@@ -29135,8 +30131,12 @@ musixtex = {
   revision = 65519;
   sha512.run = "85ff6dae443655c320990517debd59c2d3b3cf79ae795fd27836704af1ead716da34521e254a201ee8cad90ba0b5d1c559157567adf3e7142aa5446e91af0147";
   sha512.doc = "cae619ff0b16f557537ce3d28fd8df938d9297aeb37ed47713934e3a6ee41e4d8007e4e798b03221df6e958db93e2a765b9854576381eaacc924433e4efaa362";
+  hasManpages = true;
   sha512.source = "e81c23471fa26ef887aa5e16eefd562c5f133619557e734c7b36de2dcb9b1746c04263e7f3c300ccd90e85cdbfb4146496448a31909403631510645d28e39608";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "gpl2Plus" ];
   version = "1.36";
 };
@@ -29148,6 +30148,10 @@ musixtex-fonts = {
   hasRunfiles = true;
   license = [ "gpl1Only" ];
 };
+musixtex.binfiles = [
+  "musixflx"
+  "musixtex"
+];
 musixtnt = {
   revision = 40307;
   deps = [
@@ -29155,9 +30159,13 @@ musixtnt = {
   ];
   sha512.run = "eab6332d626f199e46dcd03ea546abbc4446b41c4b0354c066790ebfde154c6fa90f861dcff77206318b58a31565d884576899629520e78b3285bac673d1f4bf";
   sha512.doc = "2da473ad2425064747187da005e01d6844731c536b75095828a85d358ffb1344331ef483c0cebe79b346b4fa96a358a1e416cce7d7cfcce6b1242cf3c0a3645e";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2" ];
 };
+musixtnt.binfiles = [
+  "msxlint"
+];
 musuos = {
   revision = 24857;
   stripPrefix = 0;
@@ -30536,8 +31544,24 @@ omegaware = {
   revision = 62517;
   sha512.run = "08c491924b039476930473310611a6d2c0b5af7d0f2253a28558081cca254e6aa080727dc90456b4a011732353ca027569d7b8d8ab3ecdfb011ccc9f80e9ba68";
   sha512.doc = "6d8331109f114612d637234164e9d3d8ade9e23bba200c1ef8bbd585ff4c3e9d7f58df3ddd021990ab26a5024001fd94f7fdb3e1e329e4f91dac069fc1f6ba32";
+  hasManpages = true;
   license = [ "gpl1Only" ];
 };
+omegaware.binfiles = [
+  "odvicopy"
+  "odvitype"
+  "ofm2opl"
+  "omfonts"
+  "opl2ofm"
+  "otangle"
+  "otp2ocp"
+  "outocp"
+  "ovf2ovp"
+  "ovp2ovf"
+  "wofm2opl"
+  "wopl2ofm"
+  "wovf2ovp"
+];
 onedown = {
   revision = 59010;
   stripPrefix = 0;
@@ -30627,13 +31651,24 @@ optex = {
     "rsfs"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "optex";
+      engine = "luatex";
+      options = "optex.ini";
+      fmttriggers = [ "amsfonts" "cm" "ec" "hyphen-base" "lm" "rsfs" "unicode-data" ];
+    }
+  ];
   sha512.run = "6bf9c1fa24209cc10b624d630010c18225a7034e9f146f557b5ae7e522260094767a4e81c1b8b4d9b01a3acf560a4fd8991796b386e01483e6908b7357efaa6f";
   sha512.doc = "31dc2e58e6aa17460f2cd26001fd94e0e11b0b9522a3d0c182ca9048909c0262d97f6fc25baa74af6ff82bda8798d9df49374bfba1787852186c5c7b8d2a3a68";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "publicDomain" ];
   version = "1.11";
 };
+optex.binfiles = [
+  "optex"
+];
 optexcount = {
   revision = 59817;
   sha512.run = "88a35391d3deb37dd6466e903f3cdd7d134eb9fb8c0a9ab548ca2eeee86687544e1b499248c2d0a7aa3b801d9604913e763128309f88f768d0dafb8ac1fd6998";
@@ -30643,6 +31678,9 @@ optexcount = {
   license = [ "mit" ];
   version = "1.1";
 };
+optexcount.binfiles = [
+  "optexcount"
+];
 optidef = {
   revision = 50941;
   stripPrefix = 0;
@@ -30926,10 +31964,15 @@ pagelayout = {
   revision = 66399;
   sha512.run = "062652a39fb6aed7efcc700f4a47a94d2d7307be4c79a700ddbd7a40247eb3dfb0373611469a6e624f8d24e355dca539ad822d7b41d81cad6475ceaba06ab2c1";
   sha512.doc = "4f2d2790ea9ac43457b07b510eb95d91c5f17b36cf65953ae4de4fd0f483fdf7dcfe9f76c4e186ba3d55fe48c396d220a5a6e05b3306444dc16ed0339ce70abe";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "1.0.4";
 };
+pagelayout.binfiles = [
+  "pagelayoutapi"
+  "textestvis"
+];
 pagella-otf = {
   revision = 64705;
   stripPrefix = 0;
@@ -31222,9 +32265,13 @@ patgen = {
   ];
   sha512.run = "e4b04bdc28d75de619307567716d2c29b41286a82cdafd6eca45df36baf67588cee94c4c320abadee4e3103fac8b33ba9367114875e56f198665388fc93e341d";
   sha512.doc = "dcf16fddb0085e8a8984047ff9e500c8b7fdd7d6b24b4f6154f464e05fe137b807c13d910881fda96e617cf80780ed1e75ccfe0fda2477b1d9b95990baf5f279";
+  hasManpages = true;
   license = [ "publicDomain" ];
   version = "2.4";
 };
+patgen.binfiles = [
+  "patgen"
+];
 patgen2-tutorial = {
   revision = 58841;
   stripPrefix = 0;
@@ -31268,8 +32315,14 @@ pax = {
   sha512.doc = "a2e0e7129e98efc8a44184d445118220e16f8149166c2093b7c44a936885845c0d49d37a7588f32e2c06fc834f808b0e4a1b15808a32183bf9e457a9a1c19ba7";
   sha512.source = "3920502e3ef59332129792eb87b771bac81ec3061d6cf35d77fcf785fdc88434824592b6f0d5b74041d372977e17b85d9253e7280a5ce9bc361ce56857397dd1";
   hasRunfiles = true;
+  scriptExts = [
+    "jar"
+  ];
   license = [ "lppl13c" "gpl1Only" ];
 };
+pax.binfiles = [
+  "pdfannotextractor"
+];
 pb-diagram = {
   revision = 15878;
   stripPrefix = 0;
@@ -31356,10 +32409,14 @@ pdfbook2 = {
   revision = 53521;
   sha512.run = "dd87268e3856eb26b37f025ac62f24cd5e680e92e727588d36878de9df799f49254ef2259c29de15db11d5888ada83110a39aaa3116aa6f6aa290d3e64f1231f";
   sha512.doc = "3048de4be891e270e8efe9f9d85524aff948c9483da25f491669a7181967dc281f42b984c9ee46464bc563c42a4f171589066f67818a291a136e1f49d40912ef";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl3" ];
   version = "1.4";
 };
+pdfbook2.binfiles = [
+  "pdfbook2"
+];
 pdfcol = {
   revision = 64469;
   stripPrefix = 0;
@@ -31416,6 +32473,10 @@ pdfcrop = {
   license = [ "lppl13c" ];
   version = "1.40";
 };
+pdfcrop.binfiles = [
+  "pdfcrop"
+  "rpdfcrop"
+];
 pdfescape = {
   revision = 53082;
   stripPrefix = 0;
@@ -31439,10 +32500,14 @@ pdfjam = {
   revision = 56991;
   sha512.run = "1b1084859a811861e60e27186d67d267d3740152331f50fdbe67ce7226a76b4db24d79b674e6511d2f3de9a711da3369c565d781614f5d0c1a8021bc1ac18827";
   sha512.doc = "a29c09a2e843188135265aaec690e09cd08fe29076a0378b308ec0e48aa7936ba0edfa7d6ad3ac808ec334bb5c2793a32d8ef625f4ad9b3fea40d4db567cae56";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2Plus" ];
   version = "3.03";
 };
+pdfjam.binfiles = [
+  "pdfjam"
+];
 pdflatexpicscale = {
   revision = 46617;
   sha512.run = "d36dcc4d70156d52bcaf668d620c8eee5db8914473f943412ea5ad5c8bde673a6715fd5a69d13e502a5d4fe0b1e0e55099432c4e0e5e02bd5f6155ca5804c3f3";
@@ -31451,6 +32516,9 @@ pdflatexpicscale = {
   license = [ "lppl13c" ];
   version = "0.32";
 };
+pdflatexpicscale.binfiles = [
+  "pdflatexpicscale"
+];
 pdflscape = {
   revision = 64851;
   stripPrefix = 0;
@@ -31600,9 +32668,32 @@ pdftex = {
     "plain"
     "tex-ini-files"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "etex";
+      engine = "pdftex";
+      patterns = [ "language.def" ];
+      options = "-translate-file=cp227.tcx *etex.ini";
+      fmttriggers = [ "cm" "dehyph" "etex" "hyph-utf8" "hyphen-base" "knuth-lib" "plain" ];
+    }
+    {
+      name = "pdfetex";
+      engine = "pdftex";
+      patterns = [ "language.def" ];
+      options = "-translate-file=cp227.tcx *pdfetex.ini";
+      fmttriggers = [ "cm" "dehyph" "etex" "hyph-utf8" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" ];
+    }
+    {
+      name = "pdftex";
+      engine = "pdftex";
+      patterns = [ "language.def" ];
+      options = "-translate-file=cp227.tcx *pdfetex.ini";
+      fmttriggers = [ "cm" "dehyph" "etex" "hyph-utf8" "hyphen-base" "knuth-lib" "plain" "tex-ini-files" ];
+    }
+  ];
   sha512.run = "a7b4d8672355fc3edaa1fa0b31ea4009c7dfe33d779c82dd5c2182c1b136f745c9b3fae6089b14458f0ac5d5491f0070c9232eca0fbdc27320ccd87d2f34f50f";
   sha512.doc = "021dcbddbe4759731e9411be407a5e2f0c66b04fe22fc5331420f0dad295d3d28109352a962f6d83966ee7b7236bc1bb5aa2455074c19e032f01af415437efb9";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl1Only" ];
 };
@@ -31614,6 +32705,15 @@ pdftex-quiet = {
   license = [ "gpl3" ];
   version = "1.1.0";
 };
+pdftex-quiet.binfiles = [
+  "pdftex-quiet"
+];
+pdftex.binfiles = [
+  "etex"
+  "pdfetex"
+  "pdftex"
+  "simpdftex"
+];
 pdftexcmds = {
   revision = 55777;
   stripPrefix = 0;
@@ -31628,7 +32728,11 @@ pdftosrc = {
   revision = 62387;
   sha512.run = "c86b7123c88bc5c50a8ca4c6e435eccf04cb5d2e2d2b2a25922dfd69cc2eac3eb09c0bfef8fe0444a49f13035cc6a475de54e2b4ced603841f466b2c07568434";
   sha512.doc = "347ff9fe5424657b152afe0cc15ded0b2a81911934c3adac249c75f32f21ab72970bd285ae29447b7189d4df0399ff0dc3d084dba42896d17c5fbbc33cebf7e6";
+  hasManpages = true;
 };
+pdftosrc.binfiles = [
+  "pdftosrc"
+];
 pdftricks = {
   revision = 15878;
   stripPrefix = 0;
@@ -31668,10 +32772,14 @@ pdfxup = {
   revision = 59001;
   sha512.run = "f5b7623c1ecd132bb3646af5953245bc7378901bd5ded2e910487770cd79bb3d248cad426aafd18dd12a28bdd46be0f89b81dc95959f06688fb6a7a8f96dd11b";
   sha512.doc = "23db38fd8ebbd04bf6fed3b2814360cb6d0b736db1540d0298e9ab6edd449894c420078adae11d97998fa1fceb8e7083adacc0048337afbf4b6fbb253c8ed21f";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "2.10";
 };
+pdfxup.binfiles = [
+  "pdfxup"
+];
 pecha = {
   revision = 15878;
   stripPrefix = 0;
@@ -31685,11 +32793,15 @@ pedigree-perl = {
   revision = 64227;
   sha512.run = "4aca97c3d231e3c68a8372d6d8c970aa681fef3d1b7061fbea1648a188c03e06221bf83d2ed0678390780e9a3c2edfe425ea0050172e837ef1a1a62369c41909";
   sha512.doc = "b0b251fcf40185b017835a7a47e32736ce0d49c56be134bf93619dffedae4ecf44d36050e4515fa681c8c37707a933d8faece2943b4eddb58dab6ba3a2df113d";
+  hasManpages = true;
   sha512.source = "febf928301eddf00aa84ede679712a3e58520368f7ecd488e9d696b82dc6ed5afc403d88b344071b4291391528a4552620c4882ba2d2e6ee518fc3a8733a2f41";
   hasRunfiles = true;
   license = [ "gpl2" ];
   version = "2.1";
 };
+pedigree-perl.binfiles = [
+  "pedigree"
+];
 penlight = {
   revision = 64811;
   stripPrefix = 0;
@@ -31729,11 +32841,15 @@ perltex = {
   revision = 52162;
   sha512.run = "af7cd6b065f2405a514d20cb386b34399742a42286002ab3e0f795b64dcb434ae97470ce9cbf25cb27a9b124ebe56844b47c7cf89e1f83a4bd35f1bfcc98163a";
   sha512.doc = "d39c93f4bf3da08266bb0f10b06582db2bf96bee73faafdb191af3770c7c24abde407774f21d3c97b1f2453a8a9bd24576acaf0606796d7439334b8b1e42ac7d";
+  hasManpages = true;
   sha512.source = "99a8e27c23a7056496c56e734fefa1e921a002d7b86c153b3a209f7c3d7c415dac05e77b0ce5bc8685bd622243d6ed53be4a7f570a3ed487c3d55baa5b5af06e";
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "2.2";
 };
+perltex.binfiles = [
+  "perltex"
+];
 permute = {
   revision = 15878;
   stripPrefix = 0;
@@ -31768,15 +32884,25 @@ petri-nets = {
   hasRunfiles = true;
   license = [ "gpl1Only" ];
 };
+petri-nets.binfiles = [
+  "pn2pdf"
+];
 pfarrei = {
   revision = 31934;
   sha512.run = "f6046dc96672b60ed272dd6fe23a4a51032f039d3aeaff3f8b5e2407c99fe1f43c568a03564a7c20212a97bbfa4ecbd0dcb7f5f44593e1485c8e5d9197467a6c";
   sha512.doc = "d50ff4603d51eb72d1d12e7f5b1440fa3d7abb1ab74fdf441d7e4a474df91247a1ccad504a14438bc0c3c6354c8f8674f180b5d9d826ff09a8749db3cf0d08c4";
   sha512.source = "1e4008782161066066fc4cb1b029a36f6a18eb0d5d52f11a2a70d04d4778de6ed1a80ea1fef5d8cc86c2e13b8cbcb1cf8ce43e58ff4431b16ca23c3fdafb9884";
   hasRunfiles = true;
+  scriptExts = [
+    "tlu"
+  ];
   license = [ "lppl13c" ];
   version = "r36";
 };
+pfarrei.binfiles = [
+  "a5toa4"
+  "pfarrei"
+];
 pfdicons = {
   revision = 60089;
   stripPrefix = 0;
@@ -32357,10 +33483,17 @@ pkfix-helper = {
   revision = 56061;
   sha512.run = "e5151d85d2db65f41b69320ad92611adcc8d211719aa06f39488ba75972f6bd4eda3a9ebd9f13e8889eb84451a640bbdbfd8862c95620304917cca3dcff4a194";
   sha512.doc = "50103799bbfc18a728b6510f9cd3d9aa4cbafaebb1e68f2f3280b3a57efbdbf75ff68f36e72b4442e49bbb04801795250fb3e2d0728968e30c1e70fc5b7d15d0";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "1.6";
 };
+pkfix-helper.binfiles = [
+  "pkfix-helper"
+];
+pkfix.binfiles = [
+  "pkfix"
+];
 pkgloader = {
   revision = 47486;
   stripPrefix = 0;
@@ -32505,9 +33638,25 @@ platex = {
     "tex-ini-files"
     "unicode-data"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "platex";
+      engine = "eptex";
+      options = "*platex.ini";
+      patterns = [ "language.dat" ];
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "ptex-fonts" "latex" ];
+    }
+    {
+      name = "platex-dev";
+      engine = "eptex";
+      options = "*platex.ini";
+      patterns = [ "language.dat" ];
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "ptex-fonts" "l3kernel" "latex-base-dev" "latex-firstaid-dev" ];
+    }
+  ];
   sha512.run = "f5fbb5629bd73cdd7eb69917526528b10c905f603ff2a5c2cf77445f7250777e34d3a374e6f26ff4fd8fa2a362033cd6bfa11493501cd8120c47a351bc611f51";
   sha512.doc = "2b3751cff2502ddb862774f58919ac98f9a233f02ceba6f2756de3659ac4555831d4af03276798cab9b02ad0152f4a9f0c313ad3ad9af58f429ea54d23fd131f";
+  hasManpages = true;
   sha512.source = "e78fad3ef13b2289e88b0844528c0ecd25f1052e2aa443f79a7b25aa72a7645ad576a20e4dcd16412abf68fbf50cb5f4763dc18410813371d9b984afadea9fc6";
   hasRunfiles = true;
   license = [ "bsd3" ];
@@ -32520,6 +33669,10 @@ platex-tools = {
   hasRunfiles = true;
   license = [ "bsd3" ];
 };
+platex.binfiles = [
+  "platex"
+  "platex-dev"
+];
 platexcheat = {
   revision = 49557;
   stripPrefix = 0;
@@ -32660,18 +33813,30 @@ pmx = {
   revision = 66119;
   sha512.run = "90a0d9a2782885f90c361fe99a5c20e761eabde7b79140f8c8cca25bb6e731a8bf16988328166aeddc80c37a45cf9d6ff71e177f85338dab6953276462625346";
   sha512.doc = "15600a9b81fdc4e7be4581cc035b6b75bc08d6858003d092382637304393946e1b38d8d693e4b62f86707b29c37a1dc9ad0665ae69f16cc8ee672bd2f537f650";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2" ];
   version = "3.00";
 };
+pmx.binfiles = [
+  "pmxab"
+  "scor2prt"
+];
 pmxchords = {
   revision = 39249;
   sha512.run = "0a8f4a88834eb22d3f11ca567f37189af7834370530c6dbca4d83482e94cfb48b128bc1290e7f3ee718bffb4df445a300ddf5081805f88002f53bcf8b434bb3c";
   sha512.doc = "d4075306620fa1ce037a37b9d2646d197348f6482e1286ff6fd99641a8b441b3d830a1420dbf6c025b8d11af78363b717a1acc7ea6b9e2954aa4f11ef04452ad";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "gpl2" ];
   version = "2.0.2";
 };
+pmxchords.binfiles = [
+  "pmxchords"
+];
 pnas2009 = {
   revision = 16287;
   stripPrefix = 0;
@@ -32959,6 +34124,7 @@ prerex = {
   stripPrefix = 0;
   sha512.run = "4238f65f9ef42d218f092bc436fbbe95ddcbcee44a9032b74020a989696db3ce1481460162171f5feeb16f7507a41643443429afb8000d5bea0d7bf16e8dee96";
   sha512.doc = "af17b95e20638fecfe6d431cc320b6d3207dd739779636206899d7bf39c26018718521dabf76adab33db28f975e99d2b2dcd9b13a164dc24927d2017e947bdba";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2" "lppl13c" ];
 };
@@ -33247,16 +34413,28 @@ ps2eps = {
   revision = 62856;
   sha512.run = "c43ba33d29d5b23ece2add44310b89036d5c4725ad76da1ed6e17bb93d0e7d103549f4a7e7807f89cdffcb19a95e0df2fe7851989b8a3b691aacfebfd41044ae";
   sha512.doc = "0194c8634c5d31cf441fb3d7fa171d85358db9831c03cc77bac37272ddfed81d8296e9b05eb4daa7c8012f3bad1a01625aeacb2232989969551e01a92912c409";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl1Only" ];
   version = "1.70";
 };
+ps2eps.binfiles = [
+  "bbox"
+  "ps2eps"
+];
 ps2pk = {
   revision = 52851;
   sha512.run = "4b3ead8d2708a182d0c158dd8ae5077fb2f4a94c7f6fff52a66d6479d4c05de3d742e4c960ab79b63084435bef491866c38e01d77c41ae3d630c7a32450d0a11";
   sha512.doc = "c5b22a86807378fd7d6d83e8802780567a2473e87875bee4c827a48ff470911855bc4a1db4f439fbda1baf71f714086b96e6e78ee059590fb6ebb45c58abca4f";
+  hasManpages = true;
   license = [ "free" ];
 };
+ps2pk.binfiles = [
+  "mag"
+  "pfb2pfa"
+  "pk2bm"
+  "ps2pk"
+];
 psbao = {
   revision = 55013;
   stripPrefix = 0;
@@ -33971,6 +35149,9 @@ pst-pdf = {
   license = [ "lppl12" ];
   version = "1.2f";
 };
+pst-pdf.binfiles = [
+  "ps4pdf"
+];
 pst-pdgr = {
   revision = 45875;
   stripPrefix = 0;
@@ -34267,6 +35448,9 @@ pst2pdf = {
   license = [ "gpl2" ];
   version = "0.20";
 };
+pst2pdf.binfiles = [
+  "pst2pdf"
+];
 pstool = {
   revision = 46393;
   stripPrefix = 0;
@@ -34314,10 +35498,22 @@ psutils = {
   revision = 61719;
   sha512.run = "1489c9cd3ae9e1063367301f038cd52f0fd7f5b2d548ea78c06a2bff56100aa613cd01026ce601527b6a32f88b6ed1df96f9c8c6a591d16a63dccdc8e32d6969";
   sha512.doc = "8b4814c2a769b1ea8831aa945352f31125267aeebedd8dc8abf6381928707799bcb1eb29214930152046bab63b1a56179ea035ae6568595fd5ac83bbbd22f588";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "free" ];
   version = "p17";
 };
+psutils.binfiles = [
+  "epsffit"
+  "extractres"
+  "includeres"
+  "psbook"
+  "psjoin"
+  "psnup"
+  "psresize"
+  "psselect"
+  "pstops"
+];
 ptex = {
   revision = 62464;
   deps = [
@@ -34329,9 +35525,24 @@ ptex = {
     "ptex-base"
     "ptex-fonts"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "eptex";
+      engine = "eptex";
+      options = "*eptex.ini";
+      patterns = [ "language.def" ];
+      fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" "ptex-base" "ptex-fonts" "etex" ];
+    }
+    {
+      name = "ptex";
+      engine = "ptex";
+      options = "ptex.ini";
+      fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" "ptex-base" "ptex-fonts" ];
+    }
+  ];
   sha512.run = "6e2e40d86740a24550cb4f55630db81bdc777daf87533cb23b4fe041439d00e10cbb7b5fab92e33828c87945e710ea3579d76a8e0fdae0b8ba069b5eb33968c3";
   sha512.doc = "96aed9e990d013c7f5310a5ec86a1f7465d0de8503009669a5e10ccf4d3ed8767bf1408cfb04cfa8876e02640bc4a3b07249c331cc6190e391cb4a5b8aeafa35";
+  hasManpages = true;
   license = [ "bsd3" ];
 };
 ptex-base = {
@@ -34353,6 +35564,12 @@ ptex-fontmaps = {
   license = [ "publicDomain" "gpl3" ];
   version = "20210625.0";
 };
+ptex-fontmaps.binfiles = [
+  "kanji-config-updmap"
+  "kanji-config-updmap-sys"
+  "kanji-config-updmap-user"
+  "kanji-fontmap-creator"
+];
 ptex-fonts = {
   revision = 64330;
   stripPrefix = 0;
@@ -34368,6 +35585,19 @@ ptex-manual = {
   sha512.doc = "f84a8a047c4387ee45214b6bc98cf2710cdd3497e5a6066fed518b754fa4dbcbe1602cdedaa0f48638f37801f7f7801ad40f288a2e5b8e03cb36848d3992a7d7";
   license = [ "bsd3" ];
 };
+ptex.binfiles = [
+  "eptex"
+  "makejvf"
+  "mendex"
+  "pbibtex"
+  "pdvitomp"
+  "pdvitype"
+  "pmpost"
+  "ppltotf"
+  "ptex"
+  "ptftopl"
+  "r-pmpost"
+];
 ptex2pdf = {
   revision = 64072;
   postactionScript = "tlpkg/tlpostcode/ptex2pdf-tlpost.pl";
@@ -34375,9 +35605,15 @@ ptex2pdf = {
   sha512.doc = "f193b44004b487d93f025b34b72a17cbaf4111b1a6e1ceb4ac1b69c6c07aa4dce46cde510cbd01fb71fb08c06f7bbb415a4a8051de5861f1f586b756060f386f";
   hasRunfiles = true;
   hasTlpkg = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "gpl2" ];
   version = "20200520.0";
 };
+ptex2pdf.binfiles = [
+  "ptex2pdf"
+];
 ptext = {
   revision = 30171;
   stripPrefix = 0;
@@ -34436,10 +35672,14 @@ purifyeps = {
   revision = 29725;
   sha512.run = "79d99ef7ebc462c7c65d03f23cc85b9f136df2b0c9d647fc0672584fa57bfb7447f6db0e6d6b11bfc738cfe8c8658f45fe0b4059ff00f355e4b21d44f0d4102a";
   sha512.doc = "3f9fadfb35596835b250cab98b0d1e3c6d537cfac5878e0b9788aeb5cc7ef455ce3d44f7d0f03e9002796a162d374f6aa8f9bce5bd4c3f0e8937040de0b82a8d";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "1.1";
 };
+purifyeps.binfiles = [
+  "purifyeps"
+];
 puyotikz = {
   revision = 57254;
   stripPrefix = 0;
@@ -34582,9 +35822,15 @@ pygmentex = {
   sha512.run = "097a1eec7e6a969b0c2aef3915d8231d7e6b6c234abe79caa7f7325df22f4976d1bcf2b111c87c9b457250a2c89b5b0a29afd7deb81ee309753901768fb3fd08";
   sha512.doc = "050bf2576a7305eda104ac928cb332e6fd1437e1852726442694fb7ec88ebe7fb9e7e54987a13b76aa103afcc446019a57b8e011f4e638469ea34a9788a8e7cf";
   hasRunfiles = true;
+  scriptExts = [
+    "py"
+  ];
   license = [ "lppl13c" ];
   version = "0.11";
 };
+pygmentex.binfiles = [
+  "pygmentex"
+];
 pyluatex = {
   revision = 65855;
   stripPrefix = 0;
@@ -34632,9 +35878,16 @@ pythontex = {
   sha512.doc = "3ec2fe0f095384734575c2c9fd1bc9d485b628485c8ee75cd8fb9ebd6d1f56edbec6f378c7c9e1d5ba9c10c4bbcc3934ddb957dc47a258ac81ca89b5ce3a2e92";
   sha512.source = "8a3cf562716df588d4ada0273c3340b73e16a01524e02a9c83c4ca781b8dd1763a1deb9e303635878721831e0d57b780c0666b694629106650f639061d2f32f4";
   hasRunfiles = true;
+  scriptExts = [
+    "py"
+  ];
   license = [ "lppl13c" ];
   version = "0.18";
 };
+pythontex.binfiles = [
+  "depythontex"
+  "pythontex"
+];
 qcircuit = {
   revision = 48400;
   stripPrefix = 0;
@@ -35686,11 +36939,15 @@ rubik = {
   revision = 46791;
   sha512.run = "67931287ea126947b5b2d567ba355d44ce094b2b527288ce32329de4a73434be9a43cd520e6c24ef570a46a16c0edcf12212f46228ee1bcd2b8a8be7f9db3a7c";
   sha512.doc = "33d5c8210600cb4ce7b1313d1046f6644f0a6648f7ee9676d4d628d042f6501b5e92f2b56a31fbad6f637dc93a460a568be9e1335bd52bcea825f5772b2a9d51";
+  hasManpages = true;
   sha512.source = "3159acbc71a007877c046f6c075bf271e031feb00cda04c1818e4490396c3fb0651f160c7a98d8d3391efccae6a5b1dfde2155c6bde1c463e1c7416107b4ab90";
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "5.0";
 };
+rubik.binfiles = [
+  "rubikrotation"
+];
 ruhyphen = {
   revision = 21081;
   stripPrefix = 0;
@@ -36700,8 +37957,15 @@ seetexk = {
   revision = 57972;
   sha512.run = "1f217550f7455a82dd1771556045e10a39138eebddc90f4d38a274d56d9072501d94476c6045012f3c5cda43aea71924268fd222895079b225d893df3b78fa97";
   sha512.doc = "1b36ac131e25541123a7d18e9a5e3cb1fccab04ffca1b0d1e5a036a26de99fb05e6745d43cac6dc76a295eac5503f90eafdb2b40f96c88836123b5b599a47e2e";
+  hasManpages = true;
   license = [ "free" ];
 };
+seetexk.binfiles = [
+  "dvibook"
+  "dviconcat"
+  "dviselect"
+  "dvitodvi"
+];
 selectp = {
   revision = 20185;
   stripPrefix = 0;
@@ -37917,10 +39181,17 @@ spix = {
   revision = 65050;
   sha512.run = "e0447cedced73a9544b837c555f3d42995b5fa5e23ba737b6794e11e7fa391969c2156ae89d6e7e18140dae0e0c9b0f2d5d6036c4fda3d236790abb21fc8d9ed";
   sha512.doc = "b783636e01e976f3a0020d6e5b8c87918277fb0caae09057e68b2e216e504618f0b784b1214fdf99fde79cae5a6169c585bacf093de149a99534ef7069e6cb2a";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "py"
+  ];
   license = [ "gpl3Plus" ];
   version = "1.3.0";
 };
+spix.binfiles = [
+  "spix"
+];
 splines = {
   revision = 15878;
   stripPrefix = 0;
@@ -37945,11 +39216,18 @@ splitindex = {
   revision = 39766;
   sha512.run = "858033eadfa82b4e40a388356f64002370a5f4fc2c95565eae90c68373f708a3c9827fc4e0ba8094659382aba4e5925cba86632733b15d85ea6a82f73ace8737";
   sha512.doc = "c8dd92e955fcccf71b412d9750fff7b6f214e929ddf194a6496a79a146f4837af3d773ed3f2303546727cc4a8fb9d5366dd75b64d3877e6121ce20315f71997a";
+  hasManpages = true;
   sha512.source = "8aa928bdf6f2e8fb6274c1fe8d0b4567d03a1c6ffbd078726bf6a36ff1bdab981d5150cf0250602a64d2a0a9be92695fdd399c04d041b7a9579a7d3a71910151";
   hasRunfiles = true;
+  scriptExts = [
+    "tlu"
+  ];
   license = [ "lppl13c" ];
   version = "1.2c";
 };
+splitindex.binfiles = [
+  "splitindex"
+];
 spot = {
   revision = 22408;
   stripPrefix = 0;
@@ -38029,10 +39307,14 @@ srcredact = {
   revision = 38710;
   sha512.run = "9e11ed88fbbfc0130f43fdecd8fb0b3eecbdf50eb33bdca57bd34c860cdfe84dcd560371efba4cb261e65aaf4577306f478d1c43ed89152e7e21fd627eb7328d";
   sha512.doc = "dba9916acf75e800af1e581b4276e82bfe4c421a500a400773354766b37849568c1f19752a75983374ca41f793903f9776423888215f00376db1e0f5f3b3dbbc";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl2" ];
   version = "1.0";
 };
+srcredact.binfiles = [
+  "srcredact"
+];
 srdp-mathematik = {
   revision = 65293;
   stripPrefix = 0;
@@ -38427,10 +39709,14 @@ sty2dtx = {
   revision = 64967;
   sha512.run = "f95ad4f6260657ce329c10ae1306e5ec50965c2766c3c28f5a6dd77f4884637c36ecfae28b7853dfaf4e2e5bc256713abe4c8b3525e194fed1eccdd1ea24e1ac";
   sha512.doc = "1bc66506350b07341c8c4b858c6b1c637d9f0bf48323714ee7dedd701faf20e3cadb318f56bfb1a05f4fcaf84cdd6e9db18299801a69e0359937d7852ac6a824";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl3" ];
   version = "2.4";
 };
+sty2dtx.binfiles = [
+  "sty2dtx"
+];
 styledcmd = {
   revision = 65262;
   stripPrefix = 0;
@@ -38704,6 +39990,9 @@ svn-multi = {
   license = [ "lppl13c" ];
   version = "2.4d";
 };
+svn-multi.binfiles = [
+  "svn-multi"
+];
 svn-prov = {
   revision = 64967;
   stripPrefix = 0;
@@ -38814,7 +40103,11 @@ synctex = {
   revision = 54074;
   sha512.run = "1cc1900df90ceebc6865ce7c4a4befc86d1aa5aeb0f19808526a6cb369d7bd2ecf3c4789817da937e84fdf1fa3c921660e64e3e8a8e215d4f6dd97b2371743c5";
   sha512.doc = "37b7f0e3b86494715763c0d230a076aeec1f41ad658432099871d26b933cd8d0e8e831064cbe462a31a30260004c6dfe9b6b4d555d281d909615910470a2b1ef";
+  hasManpages = true;
 };
+synctex.binfiles = [
+  "synctex"
+];
 synproof = {
   revision = 15878;
   stripPrefix = 0;
@@ -38882,8 +40175,17 @@ t1utils = {
   revision = 57972;
   sha512.run = "9065b22ec60747b603c758c3bae67ff06759ebf97c979028ac940a1b773e3a20f5f249a4a61b7564038dcda3c72ef635315e64a3b8692501cc8f6c30ff7fa989";
   sha512.doc = "34eacd2f14282108ba41d49cc68c066e12383c4873c9cb8a2389300f9c5685b3f3d7d0626e33008d28c229f8311daf2404b2bfa164fa550184f1e856163ab386";
+  hasManpages = true;
   license = [ "publicDomain" ];
 };
+t1utils.binfiles = [
+  "t1ascii"
+  "t1asm"
+  "t1binary"
+  "t1disasm"
+  "t1mac"
+  "t1unmac"
+];
 t2 = {
   revision = 47870;
   stripPrefix = 0;
@@ -39442,9 +40744,17 @@ tex = {
     "kpathsea"
     "plain"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "tex";
+      engine = "tex";
+      options = "tex.ini";
+      fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" ];
+    }
+  ];
   sha512.run = "7d177346a2df7e7dbd2fce3635a8860c0deee30271beeba585091f8027c796678a3dc9cda2952a073c9ca02e26cd656a3bdcabe4661c23e81af350a987d7e4aa";
   sha512.doc = "e545796c64bbce0680d12b9d77ca64b008c369f90639ad9c3e7b7b219ceb85fcf24fa7eccaff65639bb9fe7159c2b2dd124866acd2ad78d860ff4e872a341d23";
+  hasManpages = true;
   license = [ "knuth" ];
   version = "3.141592653";
 };
@@ -39557,6 +40867,10 @@ tex-vpat = {
   license = [ "cc-by-30" ];
   version = "2.1_June_2022";
 };
+tex.binfiles = [
+  "initex"
+  "tex"
+];
 tex4ebook = {
   revision = 66333;
   deps = [
@@ -39566,26 +40880,57 @@ tex4ebook = {
   sha512.run = "5ed55a074d557cc433780b838fa0a53a3bd8428a192ddc1bfd71c306a110041663ceb0d6931b580e150ebd7f5f07145796ebd12bfd7d1c986e7feb74803dc104";
   sha512.doc = "964824dc432799c57af3d69dae35b35e1f327dd57d245a6c392d434033bc627d8c93682c1bbbb1b099f71acde25c10f7cca2d3b72cca02e3f9c8d94de0dff807";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
   version = "0.3i";
 };
+tex4ebook.binfiles = [
+  "tex4ebook"
+];
 tex4ht = {
   revision = 66531;
   sha512.run = "44ed16da1e774edb33b68c478ba8fa70eb33b03094c87cfd2c17068786c93bf4c083e85046158aef30353824d1458f0c5646ee71446f22ed991145827fad5f4a";
   sha512.doc = "7c831eccdb5d303b756799bb28fa962593eec8a12e5ee1c763b7c614bab29d27fc507ebd86637e920581a4dd3a89d9e7acdb0aba2798b24048b9b0bacdcd1dd7";
   sha512.source = "777422dea0615764a824f70ec7a85d4fbc824c25587935bfdf514420c2e0c61243dee2a84861b2290cec1fb444f64bd9754ce6334fb47c9ab3142d8e083fed75";
   hasRunfiles = true;
-  license = [ "lppl13c" ];
-};
+  scriptExts = [
+    "jar"
+    "lua"
+  ];
+  license = [ "lppl13c" ];
+};
+tex4ht.binfiles = [
+  "ht"
+  "htcontext"
+  "htlatex"
+  "htmex"
+  "httex"
+  "httexi"
+  "htxelatex"
+  "htxetex"
+  "mk4ht"
+  "t4ht"
+  "tex4ht"
+  "xhlatex"
+];
 texaccents = {
   revision = 64447;
   sha512.run = "5a2a79c9faddebd523939cb3cf42236b1d2c441a036cd7fc6f6f62422e5142cdbc0a45ddaa9e642266c41c9fe5b723fc440d0372639cffd399a89d489bd11b66";
   sha512.doc = "87bc11f186513adbf32c15af2f1c1253dd72802fb2008b76b9d7d67fc0a039aab0d2424fb853b6bd8e968cd4e9c1cd93bff786fa07e84593fbda99191b053eaa";
+  hasManpages = true;
   sha512.source = "8bf5d4957008833d54f87eff9feb14f60694ea02e7e9fd2cd5c5d2e2db3f6de3a33784121208ffab516763fbf578125399cbd6f39750e6bb0162a65c2fc44f24";
   hasRunfiles = true;
+  scriptExts = [
+    "sno"
+  ];
   license = [ "mit" ];
   version = "1.0.1";
 };
+texaccents.binfiles = [
+  "texaccents"
+];
 texapi = {
   revision = 54080;
   stripPrefix = 0;
@@ -39610,6 +40955,9 @@ texcount = {
   license = [ "lppl13c" ];
   version = "3.1.1";
 };
+texcount.binfiles = [
+  "texcount"
+];
 texdate = {
   revision = 49362;
   stripPrefix = 0;
@@ -39629,14 +40977,22 @@ texdef = {
   license = [ "gpl3" ];
   version = "1.9";
 };
+texdef.binfiles = [
+  "latexdef"
+  "texdef"
+];
 texdiff = {
   revision = 29752;
   sha512.run = "26fa84b3090d641efb186947ce4d1d89c30a2c224cfc8fa759da3ba7ec9cc113c0ed4afc1c3d0fa5f9d0a88af4f9b3001d57651df6b5be6e0234fb78ec4f252a";
   sha512.doc = "d458fa8db6433b4c7fbd23a16f9be53c2c822e396e7f50844cfa6acdd2a08acf8efdd0bd946c8fdc09ca8aa28d1eb25708d3719184634abced92ea5c94d9a948";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "artistic1-cl8" ];
   version = "0.4";
 };
+texdiff.binfiles = [
+  "texdiff"
+];
 texdimens = {
   revision = 61070;
   stripPrefix = 0;
@@ -39650,10 +41006,14 @@ texdirflatten = {
   revision = 55064;
   sha512.run = "3cd6cf4d9ff3a1a3daef0bd5a998417696f6645cb54679e99e5424ebbe3926c45acad7b999ee4371392a7ba13fe3f2899438ce66efca7829c7aa1eaef84aa6e5";
   sha512.doc = "1114dce13ac47c4352e968f42e89582b62b2702bc25ce3a9a4fd766b3bd63607e11eab52d19bc9f809b2b67cd92153c4f591632cfc72dcaf1c0a1b1cfb416b11";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "artistic1-cl8" ];
   version = "1.3";
 };
+texdirflatten.binfiles = [
+  "texdirflatten"
+];
 texdoc = {
   revision = 66228;
   deps = [
@@ -39661,10 +41021,17 @@ texdoc = {
   ];
   sha512.run = "3d10ce6a38e3b676bc7495714962b527e2c78d5844b184eade200ad55cf07b44945203019315f1d6e2ef825c8093f0fc60abdf67efd641ce3777c32f0680c10f";
   sha512.doc = "85e16d57fd1f89364caf38a714756a31c4a89dfdc0313e11641593df2227a7a17df861ef34d109a5737ce463ca1016653635499186d9f99a1e75d9225e2c66d2";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "tlu"
+  ];
   license = [ "gpl1Only" ];
   version = "4.0.1";
 };
+texdoc.binfiles = [
+  "texdoc"
+];
 texdoctk = {
   revision = 62186;
   deps = [
@@ -39672,10 +41039,14 @@ texdoctk = {
   ];
   sha512.run = "f3300a088f5ecedfe66ca277f793d3565b5b0f111721a0d73a788d65b72f09d0103a11edda13679fb9e919f11ce9ed3662717c18e46be99a83b744a1f7ec88fe";
   sha512.doc = "fb403dc17ad839ea64bcf6da84e59288a8745b5eb731051d7df8593138aa5d3b6891d56f52bdbe5c9a41e590f1f36db390e7e7a825d9aaf00d4fbc01c8dc16ba";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl1Only" ];
   version = "0.6.0";
 };
+texdoctk.binfiles = [
+  "texdoctk"
+];
 texdraw = {
   revision = 64477;
   stripPrefix = 0;
@@ -39689,10 +41060,14 @@ texfot = {
   revision = 65545;
   sha512.run = "e7553ab1e2368f1ee54cebe94ef1cc6675a6dd6f76f1bb94b1d79a742ddbbfb30215c97b7aa08165ec0e94b4468491d6cbbe6e1d8d77c24e37f3ec46104cc12f";
   sha512.doc = "07cbd86a5f4731257804a8a62fab247a5a091fbdb51b5f618b42200c06ac8293e809ba19fc98f844dbfe6321e733aae5671b5a8318892608687a454cac15bd10";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "publicDomain" ];
   version = "1.48";
 };
+texfot.binfiles = [
+  "texfot"
+];
 texilikechaps = {
   revision = 28553;
   stripPrefix = 0;
@@ -39789,15 +41164,56 @@ texlive-scripts = {
   ];
   sha512.run = "3dbb2007ae7b80862265d6196f77a9d796f02f6914871f4dad094f8419040fe7064daf6ecf5dd611b5764dd4148d034a97d82aa22671199e8a3dc79373859c67";
   sha512.doc = "6976ba00c8ee50664aaa1f762231f297f01548a94d6a632b386845e7fa43b20b63342d58874e87869a73a9c23bba358f762f5cc3814690f870c6216679471a89";
+  hasManpages = true;
   hasRunfiles = true;
   hasTlpkg = true;
+  scriptExts = [
+    "lua"
+    "tcl"
+  ];
 };
 texlive-scripts-extra = {
   revision = 62517;
   sha512.run = "46ac37826d3c60de6c9260bf83d6275d49a35cbde88fb03481a050f92e87b698e9a94b2e520a74edc0417419f5a2dee53000a529b9c81ea6f6244a83480e56e7";
   sha512.doc = "22cf59bf4dafc7ad9425086bc0aaedb2bf5f7d8aa6ea9c65abde2d523be37665b9c9bee4acb399857eae03613e7241ca1d6099f43cab77a95c10eced8813ad80";
-  hasRunfiles = true;
-};
+  hasManpages = true;
+  hasRunfiles = true;
+};
+texlive-scripts-extra.binfiles = [
+  "allcm"
+  "allec"
+  "allneeded"
+  "dvi2fax"
+  "dvired"
+  "e2pall"
+  "kpsepath"
+  "kpsetool"
+  "kpsewhere"
+  "kpsexpand"
+  "mkocp"
+  "mkofm"
+  "ps2frag"
+  "pslatex"
+  "texconfig"
+  "texconfig-dialog"
+  "texconfig-sys"
+  "texlinks"
+];
+texlive-scripts.binfiles = [
+  "fmtutil"
+  "fmtutil-sys"
+  "fmtutil-user"
+  "man"
+  "mktexfmt"
+  "mktexmf"
+  "mktexpk"
+  "mktextfm"
+  "rungs"
+  "texhash"
+  "updmap"
+  "updmap-sys"
+  "updmap-user"
+];
 texlive-sr = {
   revision = 54594;
   stripPrefix = 0;
@@ -39814,16 +41230,27 @@ texlive-zh-cn = {
   revision = 63645;
   sha512.run = "cbc7e70f3b4d451a51f06ed640b37ce28b8ea32f0dad75b32e54856e1051934d32125f2428b074a69503fb24c943c5eded58d77168d606891ea8209bbf852c65";
   sha512.doc = "37f37bfd17988a8897312581efcf05aff76af6fd2c30867c65e0a4445ddc1f7fb90bb86984999d5fc942159bccf5c2a188e5b552702405405c902c97ae4828ff";
+  hasManpages = true;
   hasRunfiles = true;
   hasTlpkg = true;
 };
+"texlive.infra".binfiles = [
+  "mktexlsr"
+  "tlmgr"
+];
 texliveonfly = {
   revision = 55777;
   sha512.run = "63353a768b700ea11982e9552046dfd1dc3d844883f03099833cabe2af5ccddecebd7ef737fbcd256c90304174165a4d283d4912f8311508e61c723d751619a7";
   sha512.doc = "46d57a6ebd68a56d55ccddc68006693fcbad8ed8f809243a3ffac7adb82da58cbc28239b57556d5d8d6388ea034b6571557588ff9365d4891145d5cc3fabfaea";
   hasRunfiles = true;
+  scriptExts = [
+    "py"
+  ];
   license = [ "gpl3" ];
 };
+texliveonfly.binfiles = [
+  "texliveonfly"
+];
 texloganalyser = {
   revision = 54526;
   sha512.run = "85f491af4a3867283d56bc2d98ebcf491e622008b3a70bb2cae03b9deb38170e1c73088d109445fac11fcce6e10aac57f42f03066580a79c978dd19af1f74caa";
@@ -39832,14 +41259,21 @@ texloganalyser = {
   license = [ "bsd3" ];
   version = "0.11";
 };
+texloganalyser.binfiles = [
+  "texloganalyser"
+];
 texlogfilter = {
   revision = 62792;
   sha512.run = "8012a0cca2e408c60a5ead5d59af92ba4befffe184f298ba16f6b57f1487d1e4cb22301a88d61748c8db0fca444bf861e01dbae5335aabaeb2c25e3f94f1ff8d";
   sha512.doc = "76fbce938945ebfd6bfb78022219fe217b7e6f0ae3c298e1bd9d0c570bfff1100d34034475f2577a9676e01a5bf64428664bb5cce4fd65c7d0cd350c9f156d5f";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "1.1";
 };
+texlogfilter.binfiles = [
+  "texlogfilter"
+];
 texlogos = {
   revision = 19083;
   stripPrefix = 0;
@@ -39852,10 +41286,14 @@ texlogsieve = {
   revision = 64301;
   sha512.run = "8017144da38d3e7b011b1620b4165e62159cb2975a418b350bf8a5d87e8d519166fb87b916a96ef6ec203df12834e72a31e21c41a84e113e8ebe620bd5eb8860";
   sha512.doc = "7a744ba4bdbcda04c1adf53c07acb5d20799268f31aebf2234203251ac56a96ad6cd0574d1c25c983eec0d7191dcb49bc9f11dbb2aa6aedccf31c7499400fd9f";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl3Plus" ];
   version = "1.3.1";
 };
+texlogsieve.binfiles = [
+  "texlogsieve"
+];
 texmate = {
   revision = 15878;
   stripPrefix = 0;
@@ -39900,18 +41338,32 @@ texosquery = {
   sha512.doc = "51bc4e5a9f62b4526198b380fa69dd2d79ff69ccf0915aef4269d890fed057c4130ccca65e0c279e58ebfb72347d627b186534138f9c4bc8d395677c73a2a0fc";
   sha512.source = "5ed0dddadb7e8f406635d7a2cc309a030826607a76b4520b1f47a07affb603d96577118ba1fb5b9797322aa49a68616acbbcdde39bc8538c54c5d2fa1aebe510";
   hasRunfiles = true;
+  scriptExts = [
+    "jar"
+  ];
   license = [ "lppl13c" ];
   version = "1.7";
 };
+texosquery.binfiles = [
+  "texosquery"
+  "texosquery-jre5"
+  "texosquery-jre8"
+];
 texplate = {
   revision = 61719;
   sha512.run = "5b19c1f2d5bdaacb1c842e78b1980ecb3f4fc548873e6a36fc9c5a70c3e3649b812819cc0d3bf68622acf31ac6c687cc4ba657ce2a4682bd13faba4070b0a1d7";
   sha512.doc = "e28f0f3476e710fcec772206138a2f423ea6f9df903bfd4c4a278453f217752b7f4ffd7e68f10821ee36a9251a14e6226887ed5aa7a5fb53e5deb7a1685a04e8";
   sha512.source = "658467f513fc37799df279d636f5927477c51cf0adfbff2ea1597bc8bbd4d9edc3f5f22e2f09d9049a6015a6825bde043ae10e8b55ef78ba8dbbfb04604de0b5";
   hasRunfiles = true;
+  scriptExts = [
+    "jar"
+  ];
   license = [ "bsd3" ];
   version = "1.0.4";
 };
+texplate.binfiles = [
+  "texplate"
+];
 texpower = {
   revision = 29349;
   stripPrefix = 0;
@@ -39952,13 +41404,24 @@ texsis = {
     "plain"
     "tex"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "texsis";
+      engine = "pdftex";
+      options = "-translate-file=cp227.tcx texsis.ini";
+      fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" ];
+    }
+  ];
   sha512.run = "7309726b33eadf8290e596aab50bb1af95600a067338b352c1ac092643a8c6d4142180d0146abbbb828a38fb08fdd9ae03da6572e6c221afcd151a51430a423e";
   sha512.doc = "2a4979a10514ccd589b331ff34a677a4e22adbeea73d6112c9a14392b3ee75a8cdb292b008b160792b3d00b812834afa7e0211db860c41f1beb69bbc900fdb90";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "2.18";
 };
+texsis.binfiles = [
+  "texsis"
+];
 texsurgery = {
   revision = 59885;
   stripPrefix = 0;
@@ -40083,8 +41546,13 @@ texware = {
   revision = 62387;
   sha512.run = "fd6b433f0774441ad8cda525f45a7ec18076b69f9c666c6b4ab13190f9140b288a2d4b838dbb8065e260d77fd2220f10b37f349805ad266a4b6b5c3041f5f5b7";
   sha512.doc = "1699ff3feb1b0023938ccbe77856311efc40ab90d7288fe611a040e76c04f5ac38ba4cf75ca9e0d3638a017287e6abe4971a1ec450f6b74d90aea0b59909c4a8";
+  hasManpages = true;
   license = [ "publicDomain" ];
 };
+texware.binfiles = [
+  "dvitype"
+  "pooltype"
+];
 texworks = {
   revision = 54074;
   sha512.run = "4867a2f6ca333fc42d774154179f438970d392857b0f631f58211b7174c4b56c7fe9c43cac534cac1828d3edf18069fa781d4760ca472a99b5abfe4c7a6f72c9";
@@ -40323,10 +41791,14 @@ thumbpdf = {
   revision = 62518;
   sha512.run = "74d1b32b1a48825c423d4346258f6f1eea60d2054ed38b3d9d4e207a3375e35b6e80d87706bc2d265f62606a449a0a665c8698f4e1615b39df98f6f54b309fff";
   sha512.doc = "26f698eef73b85181abbd155e8ec8f6057f7ec0c5ed1448a256e4fc2e41cffc77474fe4c3695d611e8993bbb1afdf238e3db3a90bc2b7af145535f726af027ed";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "3.17";
 };
+thumbpdf.binfiles = [
+  "thumbpdf"
+];
 thumbs = {
   revision = 33134;
   stripPrefix = 0;
@@ -40390,9 +41862,13 @@ tie = {
   ];
   sha512.run = "96cab708d9faec3f451302c6141655b79524d3497d9bded141235a2fcfbb27bb2d65fd096e559cc01b01f4ab28b97f5851ba9e202c313240ef1af07c4676085f";
   sha512.doc = "519a15cde0a8b52250bdf61926ce44ea9267ff9f75f57f3ee9b390ce1aa6f7bc2a6bc2f30222d41a7606721ed28cbbd44348cb44229fba1c7126196291667917";
+  hasManpages = true;
   license = [ "free" ];
   version = "2.4";
 };
+tie.binfiles = [
+  "tie"
+];
 tikz-3dplot = {
   revision = 25087;
   stripPrefix = 0;
@@ -40861,10 +42337,14 @@ tikztosvg = {
   revision = 60289;
   sha512.run = "0957b87c9a06771afab350de769e3fa9f97ec0aa09e4e740d0f916992948a65740a96446a0f8ac144273e94f228db2c6c0ddb22bd01ea9f0f66abe5adfe0125c";
   sha512.doc = "3d90c0963c570a115390603bcd5f39a224a155faea8ac6eec511b9689ab98383386d3d6e92076129e0f704d69bd18da52cf2f89f5db024a4d5c34a75c1edf279";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl3" ];
   version = "0.3.0";
 };
+tikztosvg.binfiles = [
+  "tikztosvg"
+];
 tikzviolinplots = {
   revision = 65687;
   stripPrefix = 0;
@@ -41134,11 +42614,18 @@ tlcockpit = {
   revision = 54857;
   sha512.run = "50817d4c68d4e302cf0f4075ff9321bde2fd26336923efd2fb39bf097090b617a2a67ce75d1a14d562939514acb17b2a356bc388f72049dbe52a868ff3d63ffd";
   sha512.doc = "d40cec8456db0d9fdd55b76c84b40565a8b16d7639084eaa5dbc61c3bd2ebd73fdde6f40b11007835be242a9103cdc5ecbbecb6082ad650663968db18cc1b04d";
+  hasManpages = true;
   sha512.source = "01a9038bab5226f57922215e6dac5acf69ba2bae866f72df1d2d4a3a6252fef78e18d1e7b2a8baf327bd4b89262abe6750b0dd1166f47868e797e50b205322a2";
   hasRunfiles = true;
+  scriptExts = [
+    "jar"
+  ];
   license = [ "gpl3Plus" ];
   version = "1.2";
 };
+tlcockpit.binfiles = [
+  "tlcockpit"
+];
 tlmgr-intro-zh-cn = {
   revision = 59100;
   stripPrefix = 0;
@@ -41159,7 +42646,13 @@ tlshell = {
   sha512.doc = "73962fa94f7ca3a78b6149a44b72c39096fb54263660ccb6c0bcc024023dfef665c5132b9cb78953c92ec8b7d161581294e32b0ab26c9e0e2e9eadc16aa9ff72";
   hasRunfiles = true;
   hasTlpkg = true;
+  scriptExts = [
+    "tcl"
+  ];
 };
+tlshell.binfiles = [
+  "tlshell"
+];
 to-be-determined = {
   revision = 64882;
   stripPrefix = 0;
@@ -41357,8 +42850,12 @@ tpic2pdftex = {
   revision = 52851;
   sha512.run = "fa8689bd257b6336badb8e5a742d5c5f12d9088b33b43bdc41474feda62358c754db05735fa471baa307907bcd61f68e8d061e66c400198d6a1dc165f39d2226";
   sha512.doc = "f24f8508279ded0689bb9dda8c653cfbd903c46782744fcb8d004f50a771ca74b86549c86abc765a408f2be67334048390e407be9446faa476a02ce9c27d5547";
+  hasManpages = true;
   license = [ "gpl1Only" ];
 };
+tpic2pdftex.binfiles = [
+  "tpic2pdftex"
+];
 tpslifonts = {
   revision = 42428;
   stripPrefix = 0;
@@ -41641,8 +43138,15 @@ ttfutils = {
   revision = 62517;
   sha512.run = "63686a2f8b014fca1c40ef36d9a95b443addd7b99e8151115ec99a8117188643970d9a8889983ad84f50d4d70cf7a4716947c3cc5b07fd55ff0ef53a97a273a2";
   sha512.doc = "7a6417bdd98ca495914f7cd3c61162e9cc505aa700060a3de9098610d27d4b5a812fe333d9c8ecab6316d8c4b51d1e63d78327ff3fb7bf9d51344bd5fd030814";
+  hasManpages = true;
   hasRunfiles = true;
 };
+ttfutils.binfiles = [
+  "ttf2afm"
+  "ttf2pk"
+  "ttf2tfm"
+  "ttfdump"
+];
 tucv = {
   revision = 20680;
   stripPrefix = 0;
@@ -41900,6 +43404,9 @@ typeoutfileinfo = {
   license = [ "lppl13c" ];
   version = "0.31";
 };
+typeoutfileinfo.binfiles = [
+  "typeoutfileinfo"
+];
 typewriter = {
   revision = 46641;
   stripPrefix = 0;
@@ -42186,6 +43693,9 @@ ulqda = {
   license = [ "lppl13c" ];
   version = "1.1";
 };
+ulqda.binfiles = [
+  "ulqda"
+];
 ulthese = {
   revision = 60217;
   stripPrefix = 0;
@@ -42661,13 +44171,33 @@ uplatex = {
     "uptex"
     "uptex-fonts"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "uplatex";
+      engine = "euptex";
+      options = "*uplatex.ini";
+      patterns = [ "language.dat" ];
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "uptex-fonts" "platex" "latex" ];
+    }
+    {
+      name = "uplatex-dev";
+      engine = "euptex";
+      options = "*uplatex.ini";
+      patterns = [ "language.dat" ];
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "uptex-fonts" "platex" "l3kernel" "latex-base-dev" "latex-firstaid-dev" ];
+    }
+  ];
   sha512.run = "aa49098049ae86a286ccd14a3a25060104ade1ecfa1f31d44c36398dc1d9130e78ee2f3dfbda067c5cda54275a5ace7fdfa66ff8a4e30ab2cfef32c52d4c8781";
   sha512.doc = "373eaf7028b4528b1e7d1be399d0bc05b477fdb8a429f845d0bc7d767bbc7ff6a991174c8eff0e346a5b4c0a3dbee24b633df97656dcc1a1c5e5f80487f73a64";
+  hasManpages = true;
   sha512.source = "bcc1d990342f27296c842a0cc1e35e1f456e7d70f44ac3db691939675ee787f48e87ce03e0a0625d69524c7e47e0893ff2b1eb678a9b74a63bb3d644cb8bb172";
   hasRunfiles = true;
   license = [ "bsd3" ];
 };
+uplatex.binfiles = [
+  "uplatex"
+  "uplatex-dev"
+];
 upmethodology = {
   revision = 64613;
   stripPrefix = 0;
@@ -42708,9 +44238,24 @@ uptex = {
     "uptex-base"
     "uptex-fonts"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "euptex";
+      engine = "euptex";
+      options = "*euptex.ini";
+      patterns = [ "language.def" ];
+      fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" "uptex-base" "uptex-fonts" "etex" "ptex-base" ];
+    }
+    {
+      name = "uptex";
+      engine = "uptex";
+      options = "uptex.ini";
+      fmttriggers = [ "cm" "hyphen-base" "knuth-lib" "plain" "uptex-base" "uptex-fonts" ];
+    }
+  ];
   sha512.run = "9255b1ec06d2b1e214dda666b5f37df20ce98095a3726e2e114082cd0ebb13f9f4e0d46b8cfd28da528a6ab68896fd62a0593e02b5072e6c3196937b098bd626";
   sha512.doc = "2a9d880635afb3c848893c371d3aca7796e6aafb11949047a21e9f0df73d06b69d3cc84cfe28438f0424722b41b795be913e79cc01b16dacd5370ec5d1e9ac5b";
+  hasManpages = true;
   license = [ "free" ];
 };
 uptex-base = {
@@ -42729,6 +44274,19 @@ uptex-fonts = {
   hasRunfiles = true;
   license = [ "bsd3" ];
 };
+uptex.binfiles = [
+  "euptex"
+  "r-upmpost"
+  "upbibtex"
+  "updvitomp"
+  "updvitype"
+  "upmendex"
+  "upmpost"
+  "uppltotf"
+  "uptex"
+  "uptftopl"
+  "wovp2ovf"
+];
 upzhkinsoku = {
   revision = 47354;
   stripPrefix = 0;
@@ -42775,6 +44333,9 @@ urlbst = {
   license = [ "gpl2" "lppl13c" ];
   version = "0.9.1";
 };
+urlbst.binfiles = [
+  "urlbst"
+];
 urwchancal = {
   revision = 21701;
   stripPrefix = 0;
@@ -43045,10 +44606,14 @@ velthuis = {
   ];
   sha512.run = "451023c09755f3aa884128a6ddd5e70a6820724de66f8923deea812a8e28c337676de95aa98a06a96013502fa24e9855b24977603c675820b1d5a0a056fe4cab";
   sha512.doc = "e17270b0e427e3ff02b1d43e578815ec37c0046a20ceb898a357041f9184044162077d9fc64f66d955d774637a8d2ec59d31b624dd743113c972d0854075df10";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl1Only" ];
   version = "2.17.1";
 };
+velthuis.binfiles = [
+  "devnag"
+];
 venn = {
   revision = 15878;
   stripPrefix = 0;
@@ -43242,7 +44807,11 @@ vlna = {
   revision = 54074;
   sha512.run = "ce37751f6cbd088e8faffb0c2ddb6d8bec9c0d1f0fa3a4ab0a3e5f2517e6f54fb6903f441cf72398284801c9b9f00d684d6a6555e2588ae72679050734fff8c9";
   sha512.doc = "f46c2e29da8f4edbe544d41b05ac3ba13cb5e3c09d299ce5ccb85207703c99569df94640c651a1afbcafcaf4669bb73157945f8dfc1d2b43ce5c0c7970c35544";
+  hasManpages = true;
 };
+vlna.binfiles = [
+  "vlna"
+];
 vmargin = {
   revision = 15878;
   stripPrefix = 0;
@@ -43298,6 +44867,9 @@ vpe = {
   license = [ "lppl13c" ];
   version = "0.2";
 };
+vpe.binfiles = [
+  "vpe"
+];
 vruler = {
   revision = 21598;
   stripPrefix = 0;
@@ -43428,9 +45000,14 @@ web = {
   ];
   sha512.run = "edac6079f0de1904e008c2a5fd7ee697f32c5324e3b9a7a4d8997b97ef214bfa1a787c84ecd4bcccd38e88c58b9729b4c5684ab58bbfcc97ce159dc5c2b5b312";
   sha512.doc = "50ae800de53cecfa6f656ba41d35d7c486e4cfe4b2ed42dd26dc60ecaa9a0b80c178dead765a7076fcc6141e8a2158e9b0854ceecc2cbf7b2e85c23cf22a7da3";
+  hasManpages = true;
   license = [ "knuth" ];
   version = "4.5";
 };
+web.binfiles = [
+  "tangle"
+  "weave"
+];
 webguide = {
   revision = 25813;
   stripPrefix = 0;
@@ -43442,10 +45019,17 @@ webquiz = {
   revision = 58808;
   sha512.run = "04ce66027089c2be815380a10540e6c12040d33a33b1de9c6a98985e82a65e87f58a19b6cbf2b0ad7bc8e0a1e500bd21a80e2adbe3ff395ec4be1ecdd5b5adf0";
   sha512.doc = "58faed1d21c5f0abe004d5aff0ef6f754012722dace25948e236c940f3e9f3a49d4f661d6692afa0bbd0a654424017e84611c32cdd99a0ef60e510c4b2fa01e9";
+  hasManpages = true;
   hasRunfiles = true;
+  scriptExts = [
+    "py"
+  ];
   license = [ "gpl3Plus" ];
   version = "5.2";
 };
+webquiz.binfiles = [
+  "webquiz"
+];
 wheelchart = {
   revision = 64373;
   stripPrefix = 0;
@@ -43545,6 +45129,9 @@ wordcount = {
   license = [ "lppl13c" ];
   version = "1.7";
 };
+wordcount.binfiles = [
+  "wordcount"
+];
 wordlike = {
   revision = 15878;
   stripPrefix = 0;
@@ -43805,9 +45392,14 @@ xdvi = {
   revision = 62387;
   sha512.run = "57024e05928f45e253e236d7e8c6b9cef07359c1cabc10b3f6ac13a9b98dc04530517d8d66b20cefaeced793fbc57a5373c226fb3d26186ba3bb7eaadb0f4ef2";
   sha512.doc = "0fd1bc1ba7bb022f03334fa6c6bc6aed779179a7c486211c3016b0880efa2b13859eb7cea78e8bfc0069192f93313d37a4966fd7e233bccfb1d010d3e413cfd9";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "free" ];
 };
+xdvi.binfiles = [
+  "xdvi"
+  "xdvi-xaw"
+];
 xebaposter = {
   revision = 63513;
   stripPrefix = 0;
@@ -43898,9 +45490,20 @@ xelatex-dev = {
     "unicode-data"
     "xetex"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "xelatex-dev";
+      engine = "xetex";
+      patterns = [ "language.dat" ];
+      options = "-etex xelatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "latex-base-dev" "latex-firstaid-dev" "lm" ];
+    }
+  ];
   sha512.run = "088c917758f727ba08b8571d302c93f0b14fc15ca6dcb0ef7a89df4ba144c508d8d42265cc6b1915707329b64aa1d1030ed0b5513987fbd4437d0a58a232b5db";
 };
+xelatex-dev.binfiles = [
+  "xelatex-dev"
+];
 xellipsis = {
   revision = 47546;
   stripPrefix = 0;
@@ -43973,10 +45576,26 @@ xetex = {
     "unicode-data"
     "xetexconfig"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "xelatex";
+      engine = "xetex";
+      patterns = [ "language.dat" ];
+      options = "-etex xelatex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "lm" ];
+    }
+    {
+      name = "xetex";
+      engine = "xetex";
+      patterns = [ "language.def" ];
+      options = "-etex xetex.ini";
+      fmttriggers = [ "cm" "hyphen-base" "tex-ini-files" "unicode-data" "etex" "plain" ];
+    }
+  ];
   postactionScript = "tlpkg/tlpostcode/xetex.pl";
   sha512.run = "e9f0aebda0a7fb36e2cbce4dd49e965335438c4ebf2d41eb8e19eabe29617239dd67e7e3433a8c75fd40f072a2c6753a7d0762afd34fca4130929e51888aaabf";
   sha512.doc = "31f03ee1ae00bc7883109ab7b7374feedc384d86b491873e90797658eae12299dd60b95edc1c86f1faa61a0b7a952cca23993e991863b37e49c27afd6c21c034";
+  hasManpages = true;
   hasRunfiles = true;
   hasTlpkg = true;
   license = [ "x11" ];
@@ -44016,6 +45635,13 @@ xetex-tibetan = {
   license = [ "lppl13c" ];
   version = "0.1";
 };
+xetex.binfiles = [
+  "teckit_compile"
+  "xelatex"
+  "xelatex-unsafe"
+  "xetex"
+  "xetex-unsafe"
+];
 xetexconfig = {
   revision = 45845;
   stripPrefix = 0;
@@ -44124,13 +45750,20 @@ xindex = {
   sha512.run = "c88e7d602c741db871ab6ec5895fee5455b954c4487d57be812b172369c5d973a8fad4b9fdcb60179562d04ba4105ecfc1228ae7d414a7d90df9a9723306de07";
   sha512.doc = "3d36e5f8811c6df621717a7077bb49bec137a5bbc3c6593078644811d915c720d41c2e1a6e5be6e3af95ddc64879582061f7aba6113e2b3a1ee5d7b3f63064d0";
   hasRunfiles = true;
+  scriptExts = [
+    "lua"
+  ];
   license = [ "lppl13c" ];
   version = "0.47";
 };
+xindex.binfiles = [
+  "xindex"
+];
 xindy = {
   revision = 59894;
   sha512.run = "0abfc9c3d4f4418fa63845df092e074762f215b334f76016814988f5243bbb184768256792779c65f277fa6a48c41d762c33be6c5cf25ba292efcf9f0554abf8";
   sha512.doc = "3fed723b6115fd7e05b84c010ded501fcd8440af72353b2b7ccb6df39082515b5de33951821c8546b65ba2462695971695caf2ce88fed67c9bd766db9d13e859";
+  hasManpages = true;
   hasRunfiles = true;
   license = [ "gpl1Only" ];
   version = "2.5.1";
@@ -44143,6 +45776,13 @@ xindy-persian = {
   license = [ "lppl13c" ];
   version = "0.8";
 };
+xindy.binfiles = [
+  "tex2xindy"
+  "texindy"
+  "xindy"
+  "xindy.mem"
+  "xindy.run"
+];
 xint = {
   revision = 63562;
   stripPrefix = 0;
@@ -44235,8 +45875,12 @@ xml2pmx = {
   revision = 57972;
   sha512.run = "9545fb5ca0e95788afab79d8a29336f337619adbcac68472bb5de6af6c54187f19bda655232175223168891c064f6fadc67c4ab8f5a0256e2c55e1a65c5e6f6b";
   sha512.doc = "973960f65159f5107caa7e9a041dca75f0171fc61f94794c7b7560eb9b6898534974fb8b360a28dfa3a01d422b71618bcaf8aba2ed25ae4d4b9f67d24ab730be";
+  hasManpages = true;
   license = [ "gpl3Plus" ];
 };
+xml2pmx.binfiles = [
+  "xml2pmx"
+];
 xmltex = {
   revision = 62145;
   deps = [
@@ -44261,13 +45905,32 @@ xmltex = {
     "unicode-data"
     "xmltexconfig"
   ];
-  hasFormats = true;
+  formats = [
+    {
+      name = "pdfxmltex";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "*pdfxmltex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "dehyph" "hyph-utf8" "latex" "latexconfig" "tex-ini-files" "xmltexconfig" ];
+    }
+    {
+      name = "xmltex";
+      engine = "pdftex";
+      patterns = [ "language.dat" ];
+      options = "*xmltex.ini";
+      fmttriggers = [ "atbegshi" "atveryend" "babel" "cm" "everyshi" "firstaid" "hyphen-base" "l3backend" "l3kernel" "l3packages" "latex" "latex-fonts" "tex-ini-files" "unicode-data" "dehyph" "hyph-utf8" "latex" "latexconfig" "tex-ini-files" "xmltexconfig" ];
+    }
+  ];
   sha512.run = "ee01abb25b18e99f18bc78357be04fb1405473e90fbdf74ed875e2910812550c44fcc7aee960b2bdc53fcd7d78e9aa706e46929da65d5cb78d9ca43ba475d675";
   sha512.doc = "d87c6d1f4c472b436104b0746d48a463977dc7eb520de3d7a53f48bc1c8e5682a23d604bbe2ebda1b5029d4a6dd33c2d2bf8b917ad4f54d2c7472874fdfe8509";
   hasRunfiles = true;
   license = [ "lppl13c" ];
   version = "0.8";
 };
+xmltex.binfiles = [
+  "pdfxmltex"
+  "xmltex"
+];
 xmltexconfig = {
   revision = 45845;
   stripPrefix = 0;
@@ -44326,9 +45989,14 @@ xpdfopen = {
   revision = 53998;
   sha512.run = "fe873bb22b94a26720e37671e283e0085619c2129a4568399544ac0df1e5c443a9476590ca7ef76a21409589eb2416a14165b8a48a6182f3773a3009cb7c1a47";
   sha512.doc = "bb4be8fe1b4590e74a7573baa1d699895fb62f6b30b05c9c81655001c75ffb43a6d7f92deca337072690ce3297d4ab06f1aca389524c5d5d500a9fce4abd8404";
+  hasManpages = true;
   license = [ "publicDomain" ];
   version = "0.86";
 };
+xpdfopen.binfiles = [
+  "pdfclose"
+  "pdfopen"
+];
 xpeek = {
   revision = 61719;
   stripPrefix = 0;
@@ -44756,6 +46424,9 @@ yplan = {
   hasRunfiles = true;
   license = [ "lppl13c" ];
 };
+yplan.binfiles = [
+  "yplan"
+];
 yquant = {
   revision = 65944;
   stripPrefix = 0;
diff --git a/pkgs/tools/typesetting/xmlroff/default.nix b/pkgs/tools/typesetting/xmlroff/default.nix
index cd1a97c2da60..69c48120b061 100644
--- a/pkgs/tools/typesetting/xmlroff/default.nix
+++ b/pkgs/tools/typesetting/xmlroff/default.nix
@@ -29,7 +29,7 @@ stdenv.mkDerivation rec {
     popt
   ];
 
-  sourceRoot = "source/xmlroff/";
+  sourceRoot = "${src.name}/xmlroff/";
 
   enableParallelBuilding = true;
 
diff --git a/pkgs/tools/virtualization/cloud-init/default.nix b/pkgs/tools/virtualization/cloud-init/default.nix
index 5df0e539058e..5b85bae033af 100644
--- a/pkgs/tools/virtualization/cloud-init/default.nix
+++ b/pkgs/tools/virtualization/cloud-init/default.nix
@@ -16,14 +16,14 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "cloud-init";
-  version = "23.2.1";
+  version = "23.2.2";
   namePrefix = "";
 
   src = fetchFromGitHub {
     owner = "canonical";
     repo = "cloud-init";
     rev = "refs/tags/${version}";
-    hash = "sha256-2e05ExF6JOeFR0BUd/iCIYV0XoKTgoI7xz20GQ/bmO4=";
+    hash = "sha256-lOeLVgT/qTB6JhRcLv9QIfNLMnMyNlUp3dMCqva9Tes=";
   };
 
   patches = [
diff --git a/pkgs/tools/virtualization/google-guest-agent/default.nix b/pkgs/tools/virtualization/google-guest-agent/default.nix
index f34a56f5d143..bf53f43a5731 100644
--- a/pkgs/tools/virtualization/google-guest-agent/default.nix
+++ b/pkgs/tools/virtualization/google-guest-agent/default.nix
@@ -1,16 +1,16 @@
 { buildGoModule, fetchFromGitHub, lib, coreutils, makeWrapper
-, google-guest-configs, google-guest-oslogin, iproute2, dhcp, procps
+, google-guest-configs, google-guest-oslogin, iproute2, procps
 }:
 
 buildGoModule rec {
   pname = "guest-agent";
-  version = "20230711.00";
+  version = "20230726.00";
 
   src = fetchFromGitHub {
     owner = "GoogleCloudPlatform";
     repo = pname;
     rev = version;
-    sha256 = "sha256-m5SPRT0179jLgzPWncZJGkcmN6RCtXjOHG9/+AdwJSk=";
+    sha256 = "sha256-p+gjiaUaBBGhCVkbXrubfV/xZWvanC8ktlfIfjyUQSA=";
   };
 
   vendorHash = "sha256-Xw/5yHW9DRtZFC6cECLI0RncgzSGB5/Y0yjW7hz247s=";
@@ -27,7 +27,7 @@ buildGoModule rec {
   '';
 
   # We don't add `shadow` here; it's added to PATH if `mutableUsers` is enabled.
-  binPath = lib.makeBinPath [ google-guest-configs google-guest-oslogin iproute2 dhcp procps ];
+  binPath = lib.makeBinPath [ google-guest-configs google-guest-oslogin iproute2 procps ];
 
   # Skip tests which require networking.
   preCheck = ''
diff --git a/pkgs/tools/wayland/gtklock/default.nix b/pkgs/tools/wayland/gtklock/default.nix
index 3d74344a4e76..c5146532e442 100644
--- a/pkgs/tools/wayland/gtklock/default.nix
+++ b/pkgs/tools/wayland/gtklock/default.nix
@@ -52,5 +52,6 @@ stdenv.mkDerivation rec {
     license = licenses.gpl3;
     maintainers = with maintainers; [ dit7ya ];
     platforms = platforms.linux;
+    mainProgram = "gtklock";
   };
 }
diff --git a/pkgs/tools/wayland/swww/default.nix b/pkgs/tools/wayland/swww/default.nix
index 3555af7c0424..d97c8ea28df8 100644
--- a/pkgs/tools/wayland/swww/default.nix
+++ b/pkgs/tools/wayland/swww/default.nix
@@ -1,4 +1,13 @@
-{ lib, fetchFromGitHub, rustPlatform, pkg-config, lz4, libxkbcommon }:
+{ lib
+, fetchFromGitHub
+, rustPlatform
+, pkg-config
+, lz4
+, libxkbcommon
+, installShellFiles
+, scdoc
+}:
+
 rustPlatform.buildRustPackage rec {
   pname = "swww";
   version = "0.8.1";
@@ -11,15 +20,39 @@ rustPlatform.buildRustPackage rec {
   };
 
   cargoSha256 = "sha256-AE9bQtW5r1cjIsXA7YEP8TR94wBjaM7emOroVFq9ldE=";
-  buildInputs = [ lz4 libxkbcommon ];
+
+  buildInputs = [
+    lz4
+    libxkbcommon
+  ];
+
   doCheck = false; # Integration tests do not work in sandbox environment
-  nativeBuildInputs = [ pkg-config ];
+
+  nativeBuildInputs = [
+    pkg-config
+    installShellFiles
+    scdoc
+  ];
+
+  postInstall = ''
+    for f in doc/*.scd; do
+      local page="doc/$(basename "$f" .scd)"
+      scdoc < "$f" > "$page"
+      installManPage "$page"
+    done
+
+    installShellCompletion --cmd swww \
+      --bash <(cat completions/swww.bash) \
+      --fish <(cat completions/swww.fish) \
+      --zsh <(cat completions/_swww)
+  '';
 
   meta = with lib; {
     description = "Efficient animated wallpaper daemon for wayland, controlled at runtime";
     homepage = "https://github.com/Horus645/swww";
     license = licenses.gpl3;
-    maintainers = with maintainers; [ mateodd25 ];
+    maintainers = with maintainers; [ mateodd25 donovanglover ];
     platforms = platforms.linux;
+    mainProgram = "swww";
   };
 }
diff --git a/pkgs/tools/wayland/wlogout/default.nix b/pkgs/tools/wayland/wlogout/default.nix
index de150c3af309..2be33bee6ac0 100644
--- a/pkgs/tools/wayland/wlogout/default.nix
+++ b/pkgs/tools/wayland/wlogout/default.nix
@@ -59,6 +59,7 @@ stdenv.mkDerivation rec {
     license = licenses.mit;
     maintainers = with maintainers; [ AndersonTorres ];
     platforms = platforms.linux;
+    mainProgram = "wlogout";
   };
 }
 # TODO: shell completions
diff --git a/pkgs/tools/wayland/wtype/default.nix b/pkgs/tools/wayland/wtype/default.nix
index 5928b9dd489d..f9461ef7613b 100644
--- a/pkgs/tools/wayland/wtype/default.nix
+++ b/pkgs/tools/wayland/wtype/default.nix
@@ -31,5 +31,6 @@ stdenv.mkDerivation rec {
     license = licenses.mit;
     platforms = platforms.linux;
     maintainers = with maintainers; [ justinlovinger ];
+    mainProgram = "wtype";
   };
 }