about summary refs log tree commit diff
path: root/pkgs/by-name/lu
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/lu')
-rw-r--r--pkgs/by-name/lu/luarocks-packages-updater/package.nix55
-rw-r--r--pkgs/by-name/lu/luarocks-packages-updater/pyproject.toml19
-rwxr-xr-xpkgs/by-name/lu/luarocks-packages-updater/updater.py220
-rw-r--r--pkgs/by-name/lu/lubelogger/deps.nix25
-rw-r--r--pkgs/by-name/lu/lubelogger/package.nix10
-rw-r--r--pkgs/by-name/lu/lug-helper/package.nix70
-rw-r--r--pkgs/by-name/lu/lumafly/deps.nix729
-rw-r--r--pkgs/by-name/lu/lumafly/package.nix67
-rw-r--r--pkgs/by-name/lu/lunacy/package.nix85
-rw-r--r--pkgs/by-name/lu/lunar-client/package.nix23
-rw-r--r--pkgs/by-name/lu/lunarvim/package.nix17
-rw-r--r--pkgs/by-name/lu/luneta/package.nix2
-rw-r--r--pkgs/by-name/lu/lutgen/package.nix35
-rw-r--r--pkgs/by-name/lu/lutok/package.nix87
14 files changed, 1347 insertions, 97 deletions
diff --git a/pkgs/by-name/lu/luarocks-packages-updater/package.nix b/pkgs/by-name/lu/luarocks-packages-updater/package.nix
new file mode 100644
index 0000000000000..0659cd25aaf8e
--- /dev/null
+++ b/pkgs/by-name/lu/luarocks-packages-updater/package.nix
@@ -0,0 +1,55 @@
+{ nix
+, makeWrapper
+, python3Packages
+, lib
+, nix-prefetch-scripts
+, luarocks-nix
+, pluginupdate
+}:
+let
+
+  path = lib.makeBinPath [
+    nix nix-prefetch-scripts luarocks-nix
+  ];
+
+  attrs = builtins.fromTOML (builtins.readFile ./pyproject.toml);
+  pname = attrs.project.name;
+  inherit (attrs.project) version;
+in
+
+python3Packages.buildPythonApplication {
+  inherit pname version;
+  pyproject = true;
+
+  src = lib.cleanSource ./.;
+
+  build-system = [
+    python3Packages.setuptools
+  ];
+
+  dependencies = [
+    python3Packages.gitpython
+  ];
+
+  postFixup = ''
+    echo "pluginupdate folder ${pluginupdate}"
+    wrapProgram $out/bin/luarocks-packages-updater \
+     --prefix PYTHONPATH : "${pluginupdate}" \
+     --prefix PATH : "${path}"
+  '';
+
+  shellHook = ''
+    export PYTHONPATH="maintainers/scripts/pluginupdate-py:$PYTHONPATH"
+    export PATH="${path}:$PATH"
+  '';
+
+  meta = {
+    inherit (attrs.project) description;
+    license = lib.licenses.gpl3Only;
+    homepage = attrs.project.urls.Homepage;
+    mainProgram = "luarocks-packages-updater";
+    maintainers = with lib.maintainers; [ teto ];
+  };
+}
+
+
diff --git a/pkgs/by-name/lu/luarocks-packages-updater/pyproject.toml b/pkgs/by-name/lu/luarocks-packages-updater/pyproject.toml
new file mode 100644
index 0000000000000..0f19ce5f832c7
--- /dev/null
+++ b/pkgs/by-name/lu/luarocks-packages-updater/pyproject.toml
@@ -0,0 +1,19 @@
+[build-system]
+build-backend = "setuptools.build_meta"
+requires = [ "setuptools" ]
+
+[project]
+name = "luarocks-packages-updater"
+version = "0.0.1"
+description = """
+Module to update luarocks-packages"""
+
+[project.urls]
+Homepage = "https://github.com/NixOS/nixpkgs/tree/master/pkgs/by-name/lu/luarocks-packages-updater"
+
+[project.scripts]
+luarocks-packages-updater = "updater:main"
+
+[tool.ruff]
+line-length = 120
+indent-width = 4
diff --git a/pkgs/by-name/lu/luarocks-packages-updater/updater.py b/pkgs/by-name/lu/luarocks-packages-updater/updater.py
new file mode 100755
index 0000000000000..91194879b875e
--- /dev/null
+++ b/pkgs/by-name/lu/luarocks-packages-updater/updater.py
@@ -0,0 +1,220 @@
+#!/usr/bin/env python
+# format:
+# $ nix run nixpkgs#python3Packages.black -- update.py
+# type-check:
+# $ nix run nixpkgs#python3Packages.mypy -- update.py
+# linted:
+# $ nix run nixpkgs#python3Packages.flake8 -- --ignore E501,E265,E402 update.py
+
+import inspect
+import os
+import tempfile
+import shutil
+from dataclasses import dataclass
+import subprocess
+import csv
+import logging
+import textwrap
+from multiprocessing.dummy import Pool
+import pluginupdate
+from pluginupdate import update_plugins, FetchConfig
+
+from typing import List, Tuple, Optional
+from pathlib import Path
+
+log = logging.getLogger()
+log.addHandler(logging.StreamHandler())
+
+ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))).parent.parent  # type: ignore
+
+PKG_LIST = "maintainers/scripts/luarocks-packages.csv"
+TMP_FILE = "$(mktemp)"
+GENERATED_NIXFILE = "pkgs/development/lua-modules/generated-packages.nix"
+
+HEADER = """/* {GENERATED_NIXFILE} is an auto-generated file -- DO NOT EDIT!
+Regenerate it with: nix run nixpkgs#luarocks-packages-updater
+You can customize the generated packages in pkgs/development/lua-modules/overrides.nix
+*/
+""".format(
+    GENERATED_NIXFILE=GENERATED_NIXFILE
+)
+
+FOOTER = """
+}
+/* GENERATED - do not edit this file */
+"""
+
+
+@dataclass
+class LuaPlugin:
+    name: str
+    """Name of the plugin, as seen on luarocks.org"""
+    rockspec: str
+    """Full URI towards the rockspec"""
+    ref: Optional[str]
+    """git reference (branch name/tag)"""
+    version: Optional[str]
+    """Set it to pin a package """
+    server: Optional[str]
+    """luarocks.org registers packages under different manifests.
+    Its value can be 'http://luarocks.org/dev'
+    """
+    luaversion: Optional[str]
+    """lua version if a package is available only for a specific lua version"""
+    maintainers: Optional[str]
+    """ Optional string listing maintainers separated by spaces"""
+
+    @property
+    def normalized_name(self) -> str:
+        return self.name.replace(".", "-")
+
+
+# rename Editor to LangUpdate/ EcosystemUpdater
+class LuaEditor(pluginupdate.Editor):
+
+    def create_parser(self):
+        parser = super().create_parser()
+        parser.set_defaults(proc=1)
+        return parser
+
+    def get_current_plugins(self):
+        return []
+
+    def load_plugin_spec(self, input_file) -> List[LuaPlugin]:
+        luaPackages = []
+        csvfilename = input_file
+        log.info("Loading package descriptions from %s", csvfilename)
+
+        with open(csvfilename, newline="") as csvfile:
+            reader = csv.DictReader(
+                csvfile,
+            )
+            for row in reader:
+                # name,server,version,luaversion,maintainers
+                plugin = LuaPlugin(**row)
+                luaPackages.append(plugin)
+        return luaPackages
+
+    def update(self, args):
+        update_plugins(self, args)
+
+    def generate_nix(self, results: List[Tuple[LuaPlugin, str]], outfilename: str):
+        with tempfile.NamedTemporaryFile("w+") as f:
+            f.write(HEADER)
+            header2 = textwrap.dedent(
+                """
+                { stdenv, lib, fetchurl, fetchgit, callPackage, ... }:
+                final: prev:
+                {
+            """
+            )
+            f.write(header2)
+            for plugin, nix_expr in results:
+                f.write(f"{plugin.normalized_name} = {nix_expr}")
+            f.write(FOOTER)
+            f.flush()
+
+            # if everything went fine, move the generated file to its destination
+            # using copy since move doesn't work across disks
+            shutil.copy(f.name, outfilename)
+
+        print(f"updated {outfilename}")
+
+    @property
+    def attr_path(self):
+        return "luaPackages"
+
+    def get_update(self, input_file: str, outfile: str, config: FetchConfig):
+        _prefetch = generate_pkg_nix
+
+        def update() -> dict:
+            plugin_specs = self.load_plugin_spec(input_file)
+            sorted_plugin_specs = sorted(plugin_specs, key=lambda v: v.name.lower())
+
+            try:
+                pool = Pool(processes=config.proc)
+                results = pool.map(_prefetch, sorted_plugin_specs)
+            finally:
+                pass
+
+            self.generate_nix(results, outfile)
+
+            redirects = {}
+            return redirects
+
+        return update
+
+    def rewrite_input(self, input_file: str, *args, **kwargs):
+        # vim plugin reads the file before update but that shouldn't be our case
+        # not implemented yet
+        # fieldnames = ['name', 'server', 'version', 'luaversion', 'maintainers']
+        # input_file = "toto.csv"
+        # with open(input_file, newline='') as csvfile:
+        #     writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
+        #     writer.writeheader()
+        #     for row in reader:
+        #         # name,server,version,luaversion,maintainers
+        #         plugin = LuaPlugin(**row)
+        #         luaPackages.append(plugin)
+        pass
+
+
+def generate_pkg_nix(plug: LuaPlugin):
+    """
+    Generate nix expression for a luarocks package
+    Our cache key associates "p.name-p.version" to its rockspec
+    """
+    log.debug("Generating nix expression for %s", plug.name)
+
+    cmd = ["luarocks", "nix"]
+
+    if plug.maintainers:
+        cmd.append(f"--maintainers={plug.maintainers}")
+
+    if plug.rockspec != "":
+        if plug.ref or plug.version:
+            msg = (
+                "'version' and 'ref' will be ignored as the rockspec is hardcoded for package %s"
+                % plug.name
+            )
+            log.warning(msg)
+
+        log.debug("Updating from rockspec %s", plug.rockspec)
+        cmd.append(plug.rockspec)
+
+    # update the plugin from luarocks
+    else:
+        cmd.append(plug.name)
+        if plug.version and plug.version != "src":
+            cmd.append(plug.version)
+
+    if plug.server != "src" and plug.server:
+        cmd.append(f"--only-server={plug.server}")
+
+    if plug.luaversion:
+        cmd.append(f"--lua-version={plug.luaversion}")
+        luaver = plug.luaversion.replace('.', '')
+        if luaver := os.getenv(f"LUA_{luaver}"):
+            cmd.append(f"--lua-dir={luaver}")
+
+    log.debug("running %s", " ".join(cmd))
+
+    output = subprocess.check_output(cmd, text=True)
+    output = "callPackage(" + output.strip() + ") {};\n\n"
+    return (plug, output)
+
+
+def main():
+    editor = LuaEditor(
+        "lua",
+        ROOT,
+        "",
+        default_in=PKG_LIST,
+        default_out=GENERATED_NIXFILE,
+    )
+
+    editor.run()
+
+
+if __name__ == "__main__":
+    main()
diff --git a/pkgs/by-name/lu/lubelogger/deps.nix b/pkgs/by-name/lu/lubelogger/deps.nix
index beb83e87aeae0..45a8db74a44c5 100644
--- a/pkgs/by-name/lu/lubelogger/deps.nix
+++ b/pkgs/by-name/lu/lubelogger/deps.nix
@@ -2,14 +2,19 @@
 # Please dont edit it manually, your changes might get overwritten!
 
 { fetchNuGet }: [
-  (fetchNuGet { pname = "CsvHelper"; version = "30.0.1"; sha256 = "0v01s672zcrd3fjwzh14dihbal3apzyg3dc80k05a90ljk8yh9wl"; })
-  (fetchNuGet { pname = "LiteDB"; version = "5.0.17"; sha256 = "126h0g850nc6dqvhwivfjsgb8lydsg250pcsvbzkasda2z5m9mln"; })
-  (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "8.0.0"; sha256 = "1zw0bpp5742jzx03wvqc8csnvsbgdqi0ls9jfc5i2vd3cl8b74pg"; })
-  (fetchNuGet { pname = "Microsoft.Extensions.Logging.Abstractions"; version = "8.0.0"; sha256 = "1klcqhg3hk55hb6vmjiq2wgqidsl81aldw0li2z98lrwx26msrr6"; })
-  (fetchNuGet { pname = "Microsoft.IdentityModel.Abstractions"; version = "7.3.1"; sha256 = "0dvknvmnzi3jn2kz0fbcb3ilryd75dwyiwqn6cwc6nd5gdz4mdlm"; })
-  (fetchNuGet { pname = "Microsoft.IdentityModel.JsonWebTokens"; version = "7.3.1"; sha256 = "03pd6b35a5j1qxmcf9552rp43fwddn1z3czyb6wlf1w1f95b5fqb"; })
-  (fetchNuGet { pname = "Microsoft.IdentityModel.Logging"; version = "7.3.1"; sha256 = "0368p59kf6r9dyk511phl65wvk76n8885d2m9812fpj0ifqcdqg8"; })
-  (fetchNuGet { pname = "Microsoft.IdentityModel.Tokens"; version = "7.3.1"; sha256 = "0i8mqrvzx9xi9pg1c92iy6cr756nnc3lr5cdawj0yh1x919wvx59"; })
-  (fetchNuGet { pname = "Npgsql"; version = "8.0.2"; sha256 = "0w1hm3bjh1vfnkzflp1x8bd4d723mpr4y6gb6ga79v5kkf09cmm2"; })
-  (fetchNuGet { pname = "System.IdentityModel.Tokens.Jwt"; version = "7.3.1"; sha256 = "095vn30apzwhqf70541617276whp19a92ncfppbknjj97dlb8bja"; })
+  (fetchNuGet { pname = "BouncyCastle.Cryptography"; version = "2.3.0"; hash = "sha256-TIBOegJAEfFRyvtwuPakvKsQbqoPHj1RSTmK7SKYsf0="; })
+  (fetchNuGet { pname = "CsvHelper"; version = "30.0.1"; hash = "sha256-lCfo0ZQUJFXABIi18fy/alC1YGwkwM+lGy2zL47RAWw="; })
+  (fetchNuGet { pname = "LiteDB"; version = "5.0.17"; hash = "sha256-ltZUyxeqaTX/2ppdUMTTzVO0npZuRw43boZZUNAD0Ig="; })
+  (fetchNuGet { pname = "MailKit"; version = "4.5.0"; hash = "sha256-quU88XNBF+tzb1yr7+lSfx90kmvZpbX43+YJtdYgPzk="; })
+  (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "8.0.0"; hash = "sha256-75KzEGWjbRELczJpCiJub+ltNUMMbz5A/1KQU+5dgP8="; })
+  (fetchNuGet { pname = "Microsoft.Extensions.Logging.Abstractions"; version = "8.0.0"; hash = "sha256-Jmddjeg8U5S+iBTwRlVAVLeIHxc4yrrNgqVMOB7EjM4="; })
+  (fetchNuGet { pname = "Microsoft.IdentityModel.Abstractions"; version = "7.3.1"; hash = "sha256-lbZKfnulWcM4Mxbz6Hkrp/lM41hsOfCnsHLEb+u2czc="; })
+  (fetchNuGet { pname = "Microsoft.IdentityModel.JsonWebTokens"; version = "7.3.1"; hash = "sha256-C7uySnKBB0e5Wf6z8YNtjbtBbhalJMdqx0EWVcYy7Q4="; })
+  (fetchNuGet { pname = "Microsoft.IdentityModel.Logging"; version = "7.3.1"; hash = "sha256-6OHGsItAXicCSlW0ghCy5szNi6HwhlCmbykbN1O5yAw="; })
+  (fetchNuGet { pname = "Microsoft.IdentityModel.Tokens"; version = "7.3.1"; hash = "sha256-qfTNU0g9QA8kV42VTAez1pSTmfFRJBbeTbGn/nfGFUU="; })
+  (fetchNuGet { pname = "MimeKit"; version = "4.5.0"; hash = "sha256-Nsk3Br9yLOC5wDLtRQyw04Kq205y5QCISpyiB13mwLU="; })
+  (fetchNuGet { pname = "Npgsql"; version = "8.0.3"; hash = "sha256-weBGo/IXKI5ufixBCuWG7OqDSyIqvGV07oxrG0XnQIQ="; })
+  (fetchNuGet { pname = "System.Formats.Asn1"; version = "8.0.0"; hash = "sha256-AVMl6N3SG2AqAcQHFruf2QDQeQIC3CICxID+Sh0vBxI="; })
+  (fetchNuGet { pname = "System.IdentityModel.Tokens.Jwt"; version = "7.3.1"; hash = "sha256-Si60aDtJSjvXvY5ZkVQKF3JzxAkmkAKOw5D/q8CwuyQ="; })
+  (fetchNuGet { pname = "System.Security.Cryptography.Pkcs"; version = "8.0.0"; hash = "sha256-yqfIIeZchsII2KdcxJyApZNzxM/VKknjs25gDWlweBI="; })
 ]
diff --git a/pkgs/by-name/lu/lubelogger/package.nix b/pkgs/by-name/lu/lubelogger/package.nix
index 24b5d9992be0a..504490b825266 100644
--- a/pkgs/by-name/lu/lubelogger/package.nix
+++ b/pkgs/by-name/lu/lubelogger/package.nix
@@ -6,13 +6,13 @@
 
 buildDotnetModule rec {
   pname = "lubelogger";
-  version = "1.3.1";
+  version = "1.3.6";
 
   src = fetchFromGitHub {
     owner = "hargata";
     repo = "lubelog";
     rev = "v${version}";
-    hash = "sha256-5gpwB4x2/JAaNtPQrlgFwh7om3rTJE0/mGr/Kn4qIIw=";
+    hash = "sha256-gfnfxm/xxFx77UnEinr+D8GoIN/KMz3BEbjpCYqQ6as=";
   };
 
   projectFile = "CarCareTracker.sln";
@@ -28,7 +28,7 @@ buildDotnetModule rec {
   executables = [ "CarCareTracker" ]; # This wraps "$out/lib/$pname/foo" to `$out/bin/foo`.
 
   meta = with lib; {
-    description = "A vehicle service records and maintainence tracker";
+    description = "Vehicle service records and maintainence tracker";
     longDescription = ''
       A self-hosted, open-source, unconventionally-named vehicle maintenance records and fuel mileage tracker.
 
@@ -36,8 +36,8 @@ buildDotnetModule rec {
     '';
     homepage = "https://lubelogger.com";
     changelog = "https://github.com/hargata/lubelog/releases/tag/v${version}";
-    license = licenses.unfree;
-    maintainers = with maintainers; [ samasaur ];
+    license = licenses.mit;
+    maintainers = with maintainers; [ lyndeno ];
     mainProgram = "CarCareTracker";
     platforms = platforms.all;
   };
diff --git a/pkgs/by-name/lu/lug-helper/package.nix b/pkgs/by-name/lu/lug-helper/package.nix
new file mode 100644
index 0000000000000..7f6324d8162e0
--- /dev/null
+++ b/pkgs/by-name/lu/lug-helper/package.nix
@@ -0,0 +1,70 @@
+{
+  stdenvNoCC,
+  lib,
+  makeDesktopItem,
+  makeWrapper,
+  copyDesktopItems,
+  coreutils,
+  findutils,
+  zenity,
+  fetchFromGitHub,
+  nix-update-script,
+}:
+stdenvNoCC.mkDerivation (finalAttrs: {
+  name = "lug-helper";
+  version = "2.18";
+  src = fetchFromGitHub {
+    owner = "starcitizen-lug";
+    repo = "lug-helper";
+    rev = "refs/tags/v${finalAttrs.version}";
+    hash = "sha256-x6o9hNXadlZrww5+a9xZtNfRwxKuTO/O9M9iYvhMIYc=";
+  };
+
+  buildInputs = [
+    coreutils
+    findutils
+    zenity
+  ];
+
+  nativeBuildInputs = [
+    copyDesktopItems
+    makeWrapper
+  ];
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "lug-helper";
+      exec = "lug-helper";
+      icon = "lug-logo";
+      comment = "Star Citizen LUG Helper";
+      desktopName = "LUG Helper";
+      categories = [ "Utility" ];
+      mimeTypes = [ "application/x-lug-helper" ];
+    })
+  ];
+
+  postInstall = ''
+    install -Dm755 lug-helper.sh $out/bin/lug-helper
+    install -Dm644 lug-logo.png $out/share/pixmaps/lug-logo.png
+    install -Dm644 lib/* -t $out/share/lug-helper
+
+    wrapProgram $out/bin/lug-helper \
+      --prefix PATH : ${
+        lib.makeBinPath [
+          coreutils
+          findutils
+          zenity
+        ]
+      }
+
+  '';
+  passthru.updateScript = nix-update-script { };
+  meta = {
+    description = "Script to manage and optimize Star Citizen on Linux";
+    homepage = "https://github.com/starcitizen-lug/lug-helper";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ fuzen ];
+    platforms = lib.platforms.linux;
+    mainProgram = "lug-helper";
+  };
+})
diff --git a/pkgs/by-name/lu/lumafly/deps.nix b/pkgs/by-name/lu/lumafly/deps.nix
new file mode 100644
index 0000000000000..7573409bb55e0
--- /dev/null
+++ b/pkgs/by-name/lu/lumafly/deps.nix
@@ -0,0 +1,729 @@
+# This file was automatically generated by passthru.fetch-deps.
+# Please dont edit it manually, your changes might get overwritten!
+{fetchNuGet}: [
+  (fetchNuGet {
+    pname = "Avalonia";
+    version = "11.0.4";
+    sha256 = "0jid0x90dc8m609wqwbq87014yzih2iimz74wm6zi1j02k080jk0";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Angle.Windows.Natives";
+    version = "2.1.0.2023020321";
+    sha256 = "1az4s1g22ipak9a3xfh55z2h3rm6lpqh7svbpw6ag4ysrgsjjsjd";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.AvaloniaEdit";
+    version = "11.0.0";
+    sha256 = "12ibz472083iiz5zskd1ivigggbl0d9yv3nazgw17s97nmnl2lpj";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.BuildServices";
+    version = "0.0.29";
+    sha256 = "05mm7f0jssih3gbzqfgjnfq5cnqa85ihsg0z1897ciihv8qd3waq";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Controls.ColorPicker";
+    version = "11.0.4";
+    sha256 = "1sqdcaknqazq4mw2x1jb6pfmfnyhpkd4xh6fl4ld85qikzzj7796";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Controls.DataGrid";
+    version = "11.0.4";
+    sha256 = "10kc1pfyi0jq29xavq059vfjm51igi45yikz7i1ys061zbjs0n62";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Controls.ItemsRepeater";
+    version = "11.0.4";
+    sha256 = "1p7mz33a6dn6ghvwajxdghq15mn5f6isvvqzxcjbnhh3m5c1zhrz";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Desktop";
+    version = "11.0.4";
+    sha256 = "101jlqx24d19nk0nd7x19pvbjjybckzgqh9h78c85vb98xbwh3ky";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Diagnostics";
+    version = "11.0.4";
+    sha256 = "1dxylsvaffzravz64rwq2wjjlr3392i5153nmkqk89ldaq70wjja";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.FreeDesktop";
+    version = "11.0.4";
+    sha256 = "1sbgs6d1b751h0ipq249w7z3aclpfb42sw3f7g31vin9w8wxwa6q";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.HtmlRenderer";
+    version = "11.0.0-rc1.1";
+    sha256 = "0b8idah8s6xi34s3ldvhl0rrph0sdbyvkx4yj3934ghcq1iga79a";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Native";
+    version = "11.0.4";
+    sha256 = "10fyr63sqb4xyr7rlk94rzjbnb9mbln95mb9papip5kb3sm8jx60";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.ReactiveUI";
+    version = "11.0.4";
+    sha256 = "1hs29qvbhm5qdhys0j3d89c37qfalx1pcpxl3hh9adz11wc0nb3b";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Remote.Protocol";
+    version = "11.0.4";
+    sha256 = "096436hhg45v02pp4f43mf00xn6blx7x66sb8fq5j4jn7479fynp";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Skia";
+    version = "11.0.4";
+    sha256 = "1ysmq4f8bxabpq3nhcrrvgwvxb9z7gx9565bvdyksdhsq16wyxym";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Svg";
+    version = "11.0.0";
+    sha256 = "1xmgaj2wnjdl16x4y6rmfp3q9faca5na90zlb8j62rxcwf1v3lkr";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Themes.Fluent";
+    version = "11.0.4";
+    sha256 = "03zdixi6m9g4mcxmp24z8dzamzqqy9i0wg069m4gl5p3wcvfbqla";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Themes.Simple";
+    version = "11.0.4";
+    sha256 = "1rncb8ifqarjc5gfh6ld0ldahvxy57a2hzi7vs826an4zl3r0yrx";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.Win32";
+    version = "11.0.4";
+    sha256 = "07ijkpbhz59gvsxsik8mib8rhpm5yrpnjz66sjnxl8m0ghqnkf02";
+  })
+  (fetchNuGet {
+    pname = "Avalonia.X11";
+    version = "11.0.4";
+    sha256 = "0xq6xqd3cwwdcqsipvrs4rpf82nqhr45ispwjj4dxlyn4i1n8ryd";
+  })
+  (fetchNuGet {
+    pname = "ColorTextBlock.Avalonia";
+    version = "11.0.1";
+    sha256 = "0mkqh9hzr3z40wxhp0xy569cb4sq6lvq49f51n0kbdyvfnvbsipy";
+  })
+  (fetchNuGet {
+    pname = "Deadpikle.AvaloniaProgressRing";
+    version = "0.10.1";
+    sha256 = "1zk7ylw4iwl1rbnipq8djcrzwmgbsdwa6di00ml7drdpnrvzf600";
+  })
+  (fetchNuGet {
+    pname = "DialogHost.Avalonia";
+    version = "0.7.6";
+    sha256 = "1byzs1fqz4nhn2ljhyxpifhvdkpyg7k4xfjcb1h3pf0hr4y9fgf6";
+  })
+  (fetchNuGet {
+    pname = "DynamicData";
+    version = "7.9.5";
+    sha256 = "1m9qx8g6na5ka6kd9vhg8gjmxrnkzb6v5cl5yqp1kdjsw4rcwy6x";
+  })
+  (fetchNuGet {
+    pname = "ExCSS";
+    version = "4.1.4";
+    sha256 = "1y50xp6rihkydbf5l73mr3qq2rm6rdfjrzdw9h1dw9my230q5lpd";
+  })
+  (fetchNuGet {
+    pname = "Fizzler";
+    version = "1.2.1";
+    sha256 = "1w5jb1d0figbv68dydbnlcsfmqlc3sv9z1zxp7d79dg2dkarc4qm";
+  })
+  (fetchNuGet {
+    pname = "HarfBuzzSharp";
+    version = "2.8.2.3";
+    sha256 = "115aybicqs9ijjlcv6k6r5v0agkjm1bm1nkd0rj3jglv8s0xvmp2";
+  })
+  (fetchNuGet {
+    pname = "HarfBuzzSharp.NativeAssets.Linux";
+    version = "2.8.2.3";
+    sha256 = "1f18ahwkaginrg0vwsi6s56lvnqvvxv7pzklfs5lnknasxy1a76z";
+  })
+  (fetchNuGet {
+    pname = "HarfBuzzSharp.NativeAssets.macOS";
+    version = "2.8.2.3";
+    sha256 = "052d8frpkj4ijs6fm6xp55xbv95b1s9biqwa0w8zp3rgm88m9236";
+  })
+  (fetchNuGet {
+    pname = "HarfBuzzSharp.NativeAssets.WebAssembly";
+    version = "2.8.2.3";
+    sha256 = "043hv36bg5240znbm8x5la7py17m4jfzy57q3ka32f6zjld83j36";
+  })
+  (fetchNuGet {
+    pname = "HarfBuzzSharp.NativeAssets.Win32";
+    version = "2.8.2.3";
+    sha256 = "08khd2jqm8sw58ljz5srangzfm2sz3gd2q1jzc5fr80lj8rv6r74";
+  })
+  (fetchNuGet {
+    pname = "HPackage.Net";
+    version = "1.0.1";
+    sha256 = "1jm2gaydndpyhywdm4sbbvwzjk3sdd825fw2gxd1s6x6dbppsl3i";
+  })
+  (fetchNuGet {
+    pname = "HtmlAgilityPack";
+    version = "1.11.42";
+    sha256 = "0cvnc1qdfcjbqkh335bv4wp44zisb4hc69lq3zphiyzqfrjisnyb";
+  })
+  (fetchNuGet {
+    pname = "JetBrains.Annotations";
+    version = "2023.2.0";
+    sha256 = "0nx7nrzbg9gk9skdc9x330cbr5xbsly6z9gzxm46vywf55yp8vaj";
+  })
+  (fetchNuGet {
+    pname = "Markdown.Avalonia";
+    version = "11.0.1";
+    sha256 = "08sv0cmzhhwnw0mv9dc7gzr1kvlqrl5pgmc045gigkqb3fi4zps1";
+  })
+  (fetchNuGet {
+    pname = "Markdown.Avalonia.Html";
+    version = "11.0.1";
+    sha256 = "00ipmxrq994w3vdqxicbw2dpv6nm54n2xz0xkvn127p8qvb734a7";
+  })
+  (fetchNuGet {
+    pname = "Markdown.Avalonia.Svg";
+    version = "11.0.1";
+    sha256 = "1lhfb9jk70fgfng87k2kxr82glrmrhv3llyd1kylmdv2vl3w9gwg";
+  })
+  (fetchNuGet {
+    pname = "Markdown.Avalonia.SyntaxHigh";
+    version = "11.0.1";
+    sha256 = "076wn8ylpxiawn9vnsy6z6d8y4mb0nk80j52aaqm3293f9cqajz6";
+  })
+  (fetchNuGet {
+    pname = "Markdown.Avalonia.Tight";
+    version = "11.0.1";
+    sha256 = "0bxclsly98jngdw4ykf23ip1x78d5l0xkqbqmny0pjw3pi4nsxzk";
+  })
+  (fetchNuGet {
+    pname = "MessageBox.Avalonia";
+    version = "3.1.4";
+    sha256 = "1qfaadvax0yc6wlqbm88ilz3jqzx0qh855ixymlkbi7wmg62fxzc";
+  })
+  (fetchNuGet {
+    pname = "MicroCom.Runtime";
+    version = "0.11.0";
+    sha256 = "0p9c3m0zk59x9dcqw077hzd2yk60myisbacvm36mnwpcjwzjkp2m";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.CodeAnalysis.Analyzers";
+    version = "3.0.0";
+    sha256 = "0bbl0jpqywqmzz2gagld1p2gvdfldjfjmm25hil9wj2nq1zc4di8";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.CodeAnalysis.Common";
+    version = "3.8.0";
+    sha256 = "12n7rvr39bzkf2maw7zplw8rwpxpxss4ich3bb2pw770rx4nyvyw";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.CodeAnalysis.CSharp";
+    version = "3.8.0";
+    sha256 = "1kmry65csvfn72zzc16vj1nfbfwam28wcmlrk3m5rzb8ydbzgylb";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.CodeAnalysis.CSharp.Scripting";
+    version = "3.8.0";
+    sha256 = "0w0yx0lpg54iw5jazqk46h48gx43ij32gwac8iywdj6kxfxm03vw";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.CodeAnalysis.Scripting.Common";
+    version = "3.8.0";
+    sha256 = "0hjgxcsj5zy27lqk0986m59n5dbplx2vjjla2lsvg4bwg8qa7bpk";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.CSharp";
+    version = "4.3.0";
+    sha256 = "0gw297dgkh0al1zxvgvncqs0j15lsna9l1wpqas4rflmys440xvb";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.Extensions.DependencyInjection";
+    version = "8.0.0-preview.7.23375.6";
+    sha256 = "0xjffkqxhz0a2fv91rpiajksni7g8h3nl6cq1jzgyh0vx692n7xg";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.Extensions.DependencyInjection.Abstractions";
+    version = "8.0.0-preview.7.23375.6";
+    sha256 = "15c3pjyqqn47shxmzxkp0bmsnqa6721cphncmp7vqa3735wqp7jh";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.NETCore.Platforms";
+    version = "1.1.0";
+    sha256 = "08vh1r12g6ykjygq5d3vq09zylgb84l63k49jc4v8faw9g93iqqm";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.NETCore.Platforms";
+    version = "2.1.2";
+    sha256 = "1507hnpr9my3z4w1r6xk5n0s1j3y6a2c2cnynj76za7cphxi1141";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.NETCore.Targets";
+    version = "1.1.0";
+    sha256 = "193xwf33fbm0ni3idxzbr5fdq3i2dlfgihsac9jj7whj0gd902nh";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.Toolkit.HighPerformance";
+    version = "7.1.2";
+    sha256 = "18l950mq0l8s1z771l9p332ni7jryidjh4hi9p37l6p8frcnccxb";
+  })
+  (fetchNuGet {
+    pname = "Microsoft.Win32.SystemEvents";
+    version = "6.0.0";
+    sha256 = "0c6pcj088g1yd1vs529q3ybgsd2vjlk5y1ic6dkmbhvrp5jibl9p";
+  })
+  (fetchNuGet {
+    pname = "Mono.Cecil";
+    version = "0.11.5";
+    sha256 = "1l388sy7ibsq4b2pj08g3di0g8yppq47chd7ip10kwml6mpp1wcw";
+  })
+  (fetchNuGet {
+    pname = "NetSparkleUpdater.SparkleUpdater";
+    version = "2.3.0-preview20230704001";
+    sha256 = "07j73ak79wwxl62pj35za1la47537xjbb4c7fjq8zdy2bzjifc23";
+  })
+  (fetchNuGet {
+    pname = "NetSparkleUpdater.UI.Avalonia";
+    version = "3.0.0-preview20230703001";
+    sha256 = "04d53xb30hx86p6ski6kvv67bfdi6p4xim8v59rfyc388f363nkl";
+  })
+  (fetchNuGet {
+    pname = "Newtonsoft.Json";
+    version = "13.0.3";
+    sha256 = "0xrwysmrn4midrjal8g2hr1bbg38iyisl0svamb11arqws4w2bw7";
+  })
+  (fetchNuGet {
+    pname = "Newtonsoft.Json.Schema";
+    version = "3.0.15";
+    sha256 = "1nmc9zxpcyyf3f2ypxw6vnjwlw5sxjv13r65p2dy8xrx8jkgaslp";
+  })
+  (fetchNuGet {
+    pname = "Portable.BouncyCastle";
+    version = "1.9.0";
+    sha256 = "0kphjwz4hk2nki3b4f9z096xzd520nrpvi3cjib8fkjk6zhwrr8q";
+  })
+  (fetchNuGet {
+    pname = "PropertyChanged.SourceGenerator";
+    version = "1.0.8";
+    sha256 = "05ygdj1sizcw678vf459hzhz4ynz2s5s206vl99g5gy3d9kaham6";
+  })
+  (fetchNuGet {
+    pname = "ReactiveUI";
+    version = "18.3.1";
+    sha256 = "1lxkc8yk9glj0w9n5vry2dnwwvh8152ad2c5bivk8aciq64zidyn";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Collections";
+    version = "4.3.0";
+    sha256 = "0bv5qgm6vr47ynxqbnkc7i797fdi8gbjjxii173syrx14nmrkwg0";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Globalization";
+    version = "4.3.0";
+    sha256 = "1daqf33hssad94lamzg01y49xwndy2q97i2lrb7mgn28656qia1x";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.IO";
+    version = "4.3.0";
+    sha256 = "0l8xz8zn46w4d10bcn3l4yyn4vhb3lrj2zw8llvz7jk14k4zps5x";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Reflection";
+    version = "4.3.0";
+    sha256 = "02c9h3y35pylc0zfq3wcsvc5nqci95nrkq0mszifc0sjx7xrzkly";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Reflection.Extensions";
+    version = "4.3.0";
+    sha256 = "0zyri97dfc5vyaz9ba65hjj1zbcrzaffhsdlpxc9bh09wy22fq33";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Reflection.Primitives";
+    version = "4.3.0";
+    sha256 = "0x1mm8c6iy8rlxm8w9vqw7gb7s1ljadrn049fmf70cyh42vdfhrf";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Resources.ResourceManager";
+    version = "4.3.0";
+    sha256 = "03kickal0iiby82wa5flar18kyv82s9s6d4xhk5h4bi5kfcyfjzl";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Runtime";
+    version = "4.3.0";
+    sha256 = "1cqh1sv3h5j7ixyb7axxbdkqx6cxy00p4np4j91kpm492rf4s25b";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Runtime.Handles";
+    version = "4.3.0";
+    sha256 = "0bh5bi25nk9w9xi8z23ws45q5yia6k7dg3i4axhfqlnj145l011x";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Runtime.InteropServices";
+    version = "4.3.0";
+    sha256 = "0c3g3g3jmhlhw4klrc86ka9fjbl7i59ds1fadsb2l8nqf8z3kb19";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Text.Encoding";
+    version = "4.3.0";
+    sha256 = "0aqqi1v4wx51h51mk956y783wzags13wa7mgqyclacmsmpv02ps3";
+  })
+  (fetchNuGet {
+    pname = "runtime.any.System.Threading.Tasks";
+    version = "4.3.0";
+    sha256 = "03mnvkhskbzxddz4hm113zsch1jyzh2cs450dk3rgfjp8crlw1va";
+  })
+  (fetchNuGet {
+    pname = "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "16rnxzpk5dpbbl1x354yrlsbvwylrq456xzpsha1n9y3glnhyx9d";
+  })
+  (fetchNuGet {
+    pname = "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "0hkg03sgm2wyq8nqk6dbm9jh5vcq57ry42lkqdmfklrw89lsmr59";
+  })
+  (fetchNuGet {
+    pname = "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "0c2p354hjx58xhhz7wv6div8xpi90sc6ibdm40qin21bvi7ymcaa";
+  })
+  (fetchNuGet {
+    pname = "runtime.native.System";
+    version = "4.3.0";
+    sha256 = "15hgf6zaq9b8br2wi1i3x0zvmk410nlmsmva9p0bbg73v6hml5k4";
+  })
+  (fetchNuGet {
+    pname = "runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "18pzfdlwsg2nb1jjjjzyb5qlgy6xjxzmhnfaijq5s2jw3cm3ab97";
+  })
+  (fetchNuGet {
+    pname = "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "0qyynf9nz5i7pc26cwhgi8j62ps27sqmf78ijcfgzab50z9g8ay3";
+  })
+  (fetchNuGet {
+    pname = "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "1klrs545awhayryma6l7g2pvnp9xy4z0r1i40r80zb45q3i9nbyf";
+  })
+  (fetchNuGet {
+    pname = "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "0zcxjv5pckplvkg0r6mw3asggm7aqzbdjimhvsasb0cgm59x09l3";
+  })
+  (fetchNuGet {
+    pname = "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "0vhynn79ih7hw7cwjazn87rm9z9fj0rvxgzlab36jybgcpcgphsn";
+  })
+  (fetchNuGet {
+    pname = "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "160p68l2c7cqmyqjwxydcvgw7lvl1cr0znkw8fp24d1by9mqc8p3";
+  })
+  (fetchNuGet {
+    pname = "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "15zrc8fgd8zx28hdghcj5f5i34wf3l6bq5177075m2bc2j34jrqy";
+  })
+  (fetchNuGet {
+    pname = "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl";
+    version = "4.3.0";
+    sha256 = "1p4dgxax6p7rlgj4q73k73rslcnz4wdcv8q2flg1s8ygwcm58ld5";
+  })
+  (fetchNuGet {
+    pname = "runtime.unix.System.Diagnostics.Debug";
+    version = "4.3.0";
+    sha256 = "1lps7fbnw34bnh3lm31gs5c0g0dh7548wfmb8zz62v0zqz71msj5";
+  })
+  (fetchNuGet {
+    pname = "runtime.unix.System.Private.Uri";
+    version = "4.3.0";
+    sha256 = "1jx02q6kiwlvfksq1q9qr17fj78y5v6mwsszav4qcz9z25d5g6vk";
+  })
+  (fetchNuGet {
+    pname = "runtime.unix.System.Runtime.Extensions";
+    version = "4.3.0";
+    sha256 = "0pnxxmm8whx38dp6yvwgmh22smknxmqs5n513fc7m4wxvs1bvi4p";
+  })
+  (fetchNuGet {
+    pname = "ShimSkiaSharp";
+    version = "1.0.0";
+    sha256 = "0gdsrzh8q8mxlm7sxvai7zshaz93a3dm1ha4cgs4845lfhpn8nhc";
+  })
+  (fetchNuGet {
+    pname = "SkiaSharp";
+    version = "2.88.3";
+    sha256 = "1yq694myq2rhfp2hwwpyzcg1pzpxcp7j72wib8p9pw9dfj7008sv";
+  })
+  (fetchNuGet {
+    pname = "SkiaSharp.NativeAssets.Linux";
+    version = "2.88.3";
+    sha256 = "0dajvr60nwvnv7s6kcqgw1w97zxdpz1c5lb7kcq7r0hi0l05ck3q";
+  })
+  (fetchNuGet {
+    pname = "SkiaSharp.NativeAssets.macOS";
+    version = "2.88.3";
+    sha256 = "191ajgi6fnfqcvqvkayjsxasiz6l0bv3pps8vv9abbyc4b12qvph";
+  })
+  (fetchNuGet {
+    pname = "SkiaSharp.NativeAssets.WebAssembly";
+    version = "2.88.3";
+    sha256 = "1w5njksq3amrrp7fqxw89nv6ar2kgc5yx092i4rxv7hrjbd1aagx";
+  })
+  (fetchNuGet {
+    pname = "SkiaSharp.NativeAssets.Win32";
+    version = "2.88.3";
+    sha256 = "03wwfbarsxjnk70qhqyd1dw65098dncqk2m0vksx92j70i7lry6q";
+  })
+  (fetchNuGet {
+    pname = "Splat";
+    version = "14.4.1";
+    sha256 = "03ycyjn2ii44npi015p4rk344xnjgdzz02cf63cmhx2ab8hv6p4b";
+  })
+  (fetchNuGet {
+    pname = "Splat";
+    version = "14.7.1";
+    sha256 = "1rs8bmwcvzg4yn05zglgk7vbmyi2flyyhjqn62sx1cjkrd9m0cs7";
+  })
+  (fetchNuGet {
+    pname = "Splat.Microsoft.Extensions.DependencyInjection";
+    version = "14.7.1";
+    sha256 = "0niwhksr74frjrkb47ihf44fq0353y4y1i3cim0fd855brvq8xh5";
+  })
+  (fetchNuGet {
+    pname = "Svg.Custom";
+    version = "1.0.0";
+    sha256 = "0bmvgaqy4iaxw9x88ifx3a2zz0vw3p9w6pj4bk3xfnf5p9vjx1mr";
+  })
+  (fetchNuGet {
+    pname = "Svg.Model";
+    version = "1.0.0";
+    sha256 = "0yrjcqcrlgqpdm3bi59nc3fppcqgrfc7jddjwxjj2q423gimip97";
+  })
+  (fetchNuGet {
+    pname = "Svg.SourceGenerator.Skia";
+    version = "1.0.0.1";
+    sha256 = "0sjx3kqwrmrlv9jsb59hwgs9ahj4qryrmqmgq41qnqi0w8d7yjyr";
+  })
+  (fetchNuGet {
+    pname = "System.Collections";
+    version = "4.3.0";
+    sha256 = "19r4y64dqyrq6k4706dnyhhw7fs24kpp3awak7whzss39dakpxk9";
+  })
+  (fetchNuGet {
+    pname = "System.Collections.Immutable";
+    version = "1.6.0";
+    sha256 = "1pbxzdz3pwqyybzv5ff2b7nrc281bhg7hq34w0fn1w3qfgrbwyw2";
+  })
+  (fetchNuGet {
+    pname = "System.Collections.Immutable";
+    version = "5.0.0";
+    sha256 = "1kvcllagxz2q92g81zkz81djkn2lid25ayjfgjalncyc68i15p0r";
+  })
+  (fetchNuGet {
+    pname = "System.ComponentModel.Annotations";
+    version = "4.5.0";
+    sha256 = "1jj6f6g87k0iwsgmg3xmnn67a14mq88np0l1ys5zkxhkvbc8976p";
+  })
+  (fetchNuGet {
+    pname = "System.Diagnostics.Debug";
+    version = "4.3.0";
+    sha256 = "00yjlf19wjydyr6cfviaph3vsjzg3d5nvnya26i2fvfg53sknh3y";
+  })
+  (fetchNuGet {
+    pname = "System.Drawing.Common";
+    version = "6.0.0";
+    sha256 = "02n8rzm58dac2np8b3xw8ychbvylja4nh6938l5k2fhyn40imlgz";
+  })
+  (fetchNuGet {
+    pname = "System.Dynamic.Runtime";
+    version = "4.3.0";
+    sha256 = "1d951hrvrpndk7insiag80qxjbf2y0y39y8h5hnq9612ws661glk";
+  })
+  (fetchNuGet {
+    pname = "System.Globalization";
+    version = "4.3.0";
+    sha256 = "1cp68vv683n6ic2zqh2s1fn4c2sd87g5hpp6l4d4nj4536jz98ki";
+  })
+  (fetchNuGet {
+    pname = "System.IO";
+    version = "4.3.0";
+    sha256 = "05l9qdrzhm4s5dixmx68kxwif4l99ll5gqmh7rqgw554fx0agv5f";
+  })
+  (fetchNuGet {
+    pname = "System.IO.Abstractions";
+    version = "19.2.69";
+    sha256 = "0k22xbyypfw0s4lia46c2ykcw1mwnkq1fqrw7bql6q3kvwm7ab7h";
+  })
+  (fetchNuGet {
+    pname = "System.IO.Pipelines";
+    version = "6.0.0";
+    sha256 = "08211lvckdsdbd67xz4f6cyk76cli565j0dby1grlc4k9bhwby65";
+  })
+  (fetchNuGet {
+    pname = "System.Linq";
+    version = "4.3.0";
+    sha256 = "1w0gmba695rbr80l1k2h4mrwzbzsyfl2z4klmpbsvsg5pm4a56s7";
+  })
+  (fetchNuGet {
+    pname = "System.Linq.Expressions";
+    version = "4.3.0";
+    sha256 = "0ky2nrcvh70rqq88m9a5yqabsl4fyd17bpr63iy2mbivjs2nyypv";
+  })
+  (fetchNuGet {
+    pname = "System.Memory";
+    version = "4.5.4";
+    sha256 = "14gbbs22mcxwggn0fcfs1b062521azb9fbb7c113x0mq6dzq9h6y";
+  })
+  (fetchNuGet {
+    pname = "System.Numerics.Vectors";
+    version = "4.5.0";
+    sha256 = "1kzrj37yzawf1b19jq0253rcs8hsq1l2q8g69d7ipnhzb0h97m59";
+  })
+  (fetchNuGet {
+    pname = "System.ObjectModel";
+    version = "4.3.0";
+    sha256 = "191p63zy5rpqx7dnrb3h7prvgixmk168fhvvkkvhlazncf8r3nc2";
+  })
+  (fetchNuGet {
+    pname = "System.Private.Uri";
+    version = "4.3.0";
+    sha256 = "04r1lkdnsznin0fj4ya1zikxiqr0h6r6a1ww2dsm60gqhdrf0mvx";
+  })
+  (fetchNuGet {
+    pname = "System.Reactive";
+    version = "5.0.0";
+    sha256 = "1lafmpnadhiwxyd543kraxa3jfdpm6ipblxrjlibym9b1ykpr5ik";
+  })
+  (fetchNuGet {
+    pname = "System.Reactive";
+    version = "6.0.0";
+    sha256 = "1mkvx1fwychpczksy6svfmniqhbm3xqblxqik6178l12xgq7aw45";
+  })
+  (fetchNuGet {
+    pname = "System.Reflection";
+    version = "4.3.0";
+    sha256 = "0xl55k0mw8cd8ra6dxzh974nxif58s3k1rjv1vbd7gjbjr39j11m";
+  })
+  (fetchNuGet {
+    pname = "System.Reflection.Emit";
+    version = "4.3.0";
+    sha256 = "11f8y3qfysfcrscjpjym9msk7lsfxkk4fmz9qq95kn3jd0769f74";
+  })
+  (fetchNuGet {
+    pname = "System.Reflection.Emit.ILGeneration";
+    version = "4.3.0";
+    sha256 = "0w1n67glpv8241vnpz1kl14sy7zlnw414aqwj4hcx5nd86f6994q";
+  })
+  (fetchNuGet {
+    pname = "System.Reflection.Emit.Lightweight";
+    version = "4.3.0";
+    sha256 = "0ql7lcakycrvzgi9kxz1b3lljd990az1x6c4jsiwcacrvimpib5c";
+  })
+  (fetchNuGet {
+    pname = "System.Reflection.Extensions";
+    version = "4.3.0";
+    sha256 = "02bly8bdc98gs22lqsfx9xicblszr2yan7v2mmw3g7hy6miq5hwq";
+  })
+  (fetchNuGet {
+    pname = "System.Reflection.Metadata";
+    version = "5.0.0";
+    sha256 = "17qsl5nanlqk9iz0l5wijdn6ka632fs1m1fvx18dfgswm258r3ss";
+  })
+  (fetchNuGet {
+    pname = "System.Reflection.Primitives";
+    version = "4.3.0";
+    sha256 = "04xqa33bld78yv5r93a8n76shvc8wwcdgr1qvvjh959g3rc31276";
+  })
+  (fetchNuGet {
+    pname = "System.Reflection.TypeExtensions";
+    version = "4.3.0";
+    sha256 = "0y2ssg08d817p0vdag98vn238gyrrynjdj4181hdg780sif3ykp1";
+  })
+  (fetchNuGet {
+    pname = "System.Resources.ResourceManager";
+    version = "4.3.0";
+    sha256 = "0sjqlzsryb0mg4y4xzf35xi523s4is4hz9q4qgdvlvgivl7qxn49";
+  })
+  (fetchNuGet {
+    pname = "System.Runtime";
+    version = "4.3.0";
+    sha256 = "066ixvgbf2c929kgknshcxqj6539ax7b9m570cp8n179cpfkapz7";
+  })
+  (fetchNuGet {
+    pname = "System.Runtime.CompilerServices.Unsafe";
+    version = "4.7.1";
+    sha256 = "119br3pd85lq8zcgh4f60jzmv1g976q1kdgi3hvqdlhfbw6siz2j";
+  })
+  (fetchNuGet {
+    pname = "System.Runtime.Extensions";
+    version = "4.3.0";
+    sha256 = "1ykp3dnhwvm48nap8q23893hagf665k0kn3cbgsqpwzbijdcgc60";
+  })
+  (fetchNuGet {
+    pname = "System.Runtime.Handles";
+    version = "4.3.0";
+    sha256 = "0sw2gfj2xr7sw9qjn0j3l9yw07x73lcs97p8xfc9w1x9h5g5m7i8";
+  })
+  (fetchNuGet {
+    pname = "System.Runtime.InteropServices";
+    version = "4.3.0";
+    sha256 = "00hywrn4g7hva1b2qri2s6rabzwgxnbpw9zfxmz28z09cpwwgh7j";
+  })
+  (fetchNuGet {
+    pname = "System.Text.Encoding";
+    version = "4.3.0";
+    sha256 = "1f04lkir4iladpp51sdgmis9dj4y8v08cka0mbmsy0frc9a4gjqr";
+  })
+  (fetchNuGet {
+    pname = "System.Text.Encoding.CodePages";
+    version = "4.5.1";
+    sha256 = "1z21qyfs6sg76rp68qdx0c9iy57naan89pg7p6i3qpj8kyzn921w";
+  })
+  (fetchNuGet {
+    pname = "System.Text.Encodings.Web";
+    version = "7.0.0";
+    sha256 = "1151hbyrcf8kyg1jz8k9awpbic98lwz9x129rg7zk1wrs6vjlpxl";
+  })
+  (fetchNuGet {
+    pname = "System.Text.Json";
+    version = "7.0.3";
+    sha256 = "0zjrnc9lshagm6kdb9bdh45dmlnkpwcpyssa896sda93ngbmj8k9";
+  })
+  (fetchNuGet {
+    pname = "System.Threading";
+    version = "4.3.0";
+    sha256 = "0rw9wfamvhayp5zh3j7p1yfmx9b5khbf4q50d8k5rk993rskfd34";
+  })
+  (fetchNuGet {
+    pname = "System.Threading.Tasks";
+    version = "4.3.0";
+    sha256 = "134z3v9abw3a6jsw17xl3f6hqjpak5l682k2vz39spj4kmydg6k7";
+  })
+  (fetchNuGet {
+    pname = "System.Threading.Tasks.Extensions";
+    version = "4.5.4";
+    sha256 = "0y6ncasgfcgnjrhynaf0lwpkpkmv4a07sswwkwbwb5h7riisj153";
+  })
+  (fetchNuGet {
+    pname = "System.ValueTuple";
+    version = "4.5.0";
+    sha256 = "00k8ja51d0f9wrq4vv5z2jhq8hy31kac2rg0rv06prylcybzl8cy";
+  })
+  (fetchNuGet {
+    pname = "TestableIO.System.IO.Abstractions";
+    version = "19.2.69";
+    sha256 = "1y6xn5fgh4ia5ympjf33pvry4l76hgn7jwimvirbq8bkkc32v4hg";
+  })
+  (fetchNuGet {
+    pname = "TestableIO.System.IO.Abstractions.Wrappers";
+    version = "19.2.69";
+    sha256 = "1fjcgya57bx9n00y926d9bwrcii7l41gr470gz00q9ipj726wy30";
+  })
+  (fetchNuGet {
+    pname = "Tmds.DBus.Protocol";
+    version = "0.15.0";
+    sha256 = "0d99kcs7r9cp6gpyc7z230czkkyx4164x86dhy0mca73f2ykc2g2";
+  })
+]
diff --git a/pkgs/by-name/lu/lumafly/package.nix b/pkgs/by-name/lu/lumafly/package.nix
new file mode 100644
index 0000000000000..c15e290b465cd
--- /dev/null
+++ b/pkgs/by-name/lu/lumafly/package.nix
@@ -0,0 +1,67 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildDotnetModule,
+  dotnetCorePackages,
+  zlib,
+  icu,
+  openssl,
+  icoutils,
+  copyDesktopItems,
+  makeDesktopItem,
+}:
+buildDotnetModule rec {
+  pname = "lumafly";
+  version = "3.2.0.0";
+
+  src = fetchFromGitHub {
+    owner = "TheMulhima";
+    repo = "lumafly";
+    rev = "v${version}";
+    hash = "sha256-oDSM5Ev9SCjbvCgDZcpzm2bVnzG04yy/WaSwJyh0b18=";
+  };
+
+  projectFile = "Lumafly/Lumafly.csproj";
+
+  nugetDeps = ./deps.nix;
+
+  dotnet-sdk = dotnetCorePackages.sdk_7_0;
+
+  selfContainedBuild = true;
+
+  runtimeDeps = [
+    zlib
+    icu
+    openssl
+  ];
+
+  nativeBuildInputs = [
+    icoutils
+    copyDesktopItems
+  ];
+
+  postFixup = ''
+    # Icon for the desktop file
+    icotool -x $src/Lumafly/Assets/Lumafly.ico
+    install -D Lumafly_1_32x32x32.png $out/share/icons/hicolor/32x32/apps/lumafly.png
+  '';
+
+  desktopItems = [(makeDesktopItem {
+    desktopName = "Lumafly";
+    name = "lumafly";
+    exec = "Lumafly";
+    icon = "lumafly";
+    comment = meta.description;
+    type = "Application";
+    categories = [ "Game" ];
+  })];
+
+  meta = {
+    description = "A cross platform mod manager for Hollow Knight written in Avalonia";
+    homepage = "https://themulhima.github.io/Lumafly/";
+    license = lib.licenses.gpl3Plus;
+    mainProgram = "Lumafly";
+    maintainers = with lib.maintainers; [ rohanssrao ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/lu/lunacy/package.nix b/pkgs/by-name/lu/lunacy/package.nix
index 1e3ad510bf9ef..1fcc9ed4e745d 100644
--- a/pkgs/by-name/lu/lunacy/package.nix
+++ b/pkgs/by-name/lu/lunacy/package.nix
@@ -1,28 +1,30 @@
-{ stdenv
-, lib
-, fetchurl
-, dpkg
-, autoPatchelfHook
-, zlib
-, libgcc
-, fontconfig
-, libX11
-, lttng-ust
-, icu
-, libICE
-, libSM
-, libXcursor
-, openssl
-, imagemagick
+{
+  stdenv,
+  lib,
+  fetchurl,
+  dpkg,
+  autoPatchelfHook,
+  zlib,
+  libgcc,
+  fontconfig,
+  libX11,
+  lttng-ust,
+  icu,
+  libICE,
+  libSM,
+  libXcursor,
+  openssl,
+  imagemagick,
+  makeWrapper,
 }:
 
 stdenv.mkDerivation (finalAttrs: {
   pname = "lunacy";
-  version = "9.6.0";
+  version = "10.0.1";
 
   src = fetchurl {
     url = "https://lcdn.icons8.com/setup/Lunacy_${finalAttrs.version}.deb";
-    hash = "sha256-PvQGDUC9BsIql4xMM1OH45gq3YtJMKJcYg4N2o18hno=";
+    hash = "sha256-roD/bKv1N2sru/tZ6Zl1J2AyY1mgj2ssB2a42kwBNHM=";
   };
 
   unpackCmd = ''
@@ -47,19 +49,22 @@ stdenv.mkDerivation (finalAttrs: {
   nativeBuildInputs = [
     dpkg
     autoPatchelfHook
+    makeWrapper
   ];
 
   # adds to the RPATHS of all shared objects (exe and libs)
-  appendRunpaths = map (pkg: (lib.getLib pkg) + "/lib") [
-    icu
-    openssl
-    stdenv.cc.libc
-    stdenv.cc.cc
-  ] ++ [
-    # technically, this should be in runtimeDependencies but will not work as
-    # "lib" is appended to all elements in the array
-    "${placeholder "out"}/lib/lunacy"
-  ];
+  appendRunpaths =
+    map (pkg: (lib.getLib pkg) + "/lib") [
+      icu
+      openssl
+      stdenv.cc.libc
+      stdenv.cc.cc
+    ]
+    ++ [
+      # technically, this should be in runtimeDependencies but will not work as
+      # "lib" is appended to all elements in the array
+      "${placeholder "out"}/lib/lunacy"
+    ];
 
   # will add to the RPATH of executable only
   runtimeDependencies = [
@@ -82,33 +87,35 @@ stdenv.mkDerivation (finalAttrs: {
     # Prepare the desktop icon, the upstream icon is 200x200 but the hicolor theme does not
     # support this resolution. Nearest sizes are 192x192 and 256x256.
     ${imagemagick}/bin/convert "opt/icons8/lunacy/Assets/LunacyLogo.png" -resize 192x192 lunacy.png
-    install -D lunacy.png "$out/share/icons/hicolor/192x192/apps/${finalAttrs.pname}.png"
+    install -D lunacy.png "$out/share/icons/hicolor/192x192/apps/lunacy.png"
 
     runHook postInstall
   '';
 
   postInstall = ''
     substituteInPlace $out/share/applications/lunacy.desktop \
-      --replace "Exec=/opt/icons8/lunacy/Lunacy" "Exec=${finalAttrs.pname}" \
-      --replace "Icon=/opt/icons8/lunacy/Assets/LunacyLogo.png" "Icon=${finalAttrs.pname}"
+      --replace-fail "Exec=/opt/icons8/lunacy/Lunacy" "Exec=lunacy" \
+      --replace-fail "Icon=/opt/icons8/lunacy/Assets/LunacyLogo.png" "Icon=lunacy"
   '';
 
   postFixup = ''
     mkdir $out/bin
 
-    # Fixes runtime error regarding missing libSkiaSharp.so (which is in the same directory as the binary).
-    ln -s "$out/lib/lunacy/Lunacy" "$out/bin/${finalAttrs.pname}"
+    # The wrapper is needed instead of a symlink to prevent a random "Unsupported file format" when running the app.
+    makeWrapper "$out/lib/lunacy/Lunacy" "$out/bin/lunacy"
   '';
 
-  meta = with lib; {
+  meta = {
     description = "Free design software that keeps your flow with AI tools and built-in graphics";
     homepage = "https://icons8.com/lunacy";
     changelog = "https://lunacy.docs.icons8.com/release-notes/";
-    license = licenses.unfree;
-    maintainers = [ maintainers.eliandoran ];
-    platforms = platforms.linux;
-    sourceProvenance = [ sourceTypes.binaryBytecode ];
+    license = lib.licenses.unfree;
+    maintainers = with lib.maintainers; [
+      eliandoran
+      luftmensch-luftmensch
+    ];
+    platforms = lib.platforms.linux;
+    sourceProvenance = [ lib.sourceTypes.binaryBytecode ];
     mainProgram = "lunacy";
   };
-
 })
diff --git a/pkgs/by-name/lu/lunar-client/package.nix b/pkgs/by-name/lu/lunar-client/package.nix
index f507a4dbc3117..6ebddafa5dcb9 100644
--- a/pkgs/by-name/lu/lunar-client/package.nix
+++ b/pkgs/by-name/lu/lunar-client/package.nix
@@ -5,35 +5,34 @@
 }:
 
 appimageTools.wrapType2 rec {
-  pname = "lunar-client";
-  version = "3.2.6";
+  pname = "lunarclient";
+  version = "3.2.17";
 
   src = fetchurl {
     url = "https://launcherupdates.lunarclientcdn.com/Lunar%20Client-${version}.AppImage";
-    hash = "sha512-JZ6fXUDurLxe6acRRXTHot2GTUqMaSwy7N5K4cmFmOn4s8W2aXek+o8med3ytaxoTd6FmibXmCxrjnOVMHBRGA==";
+    hash = "sha512-hzW7khHfWEYPtzMmedy/dXqKh7LPniqI7/0F1FtBtrlDnEIEQUq/7VUcygsVTBI6kuj8vTG5+PYcLez+cYAjqg==";
   };
 
   extraInstallCommands =
     let contents = appimageTools.extract { inherit pname version src; };
     in ''
       source "${makeWrapper}/nix-support/setup-hook"
-      wrapProgram $out/bin/lunar-client \
+      wrapProgram $out/bin/lunarclient \
         --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}"
-      install -Dm444 ${contents}/launcher.desktop $out/share/applications/lunar-client.desktop
-      install -Dm444 ${contents}/launcher.png $out/share/pixmaps/lunar-client.png
-      substituteInPlace $out/share/applications/lunar-client.desktop \
-        --replace 'Exec=AppRun --no-sandbox %U' 'Exec=lunar-client' \
-        --replace 'Icon=launcher' 'Icon=lunar-client'
+      install -Dm444 ${contents}/lunarclient.desktop -t $out/share/applications/
+      install -Dm444 ${contents}/lunarclient.png -t $out/share/pixmaps/
+      substituteInPlace $out/share/applications/lunarclient.desktop \
+        --replace-fail 'Exec=AppRun --no-sandbox %U' 'Exec=lunarclient' \
     '';
 
   passthru.updateScript = ./update.sh;
 
   meta = with lib; {
-    description = "Free Minecraft client with mods, cosmetics, and performance boost.";
+    description = "Free Minecraft client with mods, cosmetics, and performance boost";
     homepage = "https://www.lunarclient.com/";
     license = with licenses; [ unfree ];
-    mainProgram = "lunar-client";
-    maintainers = with maintainers; [ zyansheep Technical27 surfaceflinger ];
+    mainProgram = "lunarclient";
+    maintainers = with maintainers; [ Technical27 surfaceflinger ];
     platforms = [ "x86_64-linux" ];
   };
 }
diff --git a/pkgs/by-name/lu/lunarvim/package.nix b/pkgs/by-name/lu/lunarvim/package.nix
index 5dcd5585ea2ee..6050010bdbb5c 100644
--- a/pkgs/by-name/lu/lunarvim/package.nix
+++ b/pkgs/by-name/lu/lunarvim/package.nix
@@ -1,7 +1,6 @@
 { lib
 , stdenv
 , fetchFromGitHub
-, fetchpatch
 , makeWrapper
 , cargo
 , curl
@@ -29,25 +28,15 @@ stdenv.mkDerivation (finalAttrs: {
   inherit nvimAlias viAlias vimAlias globalConfig;
 
   pname = "lunarvim";
-  version = "1.3.0";
+  version = "1.4.0";
 
   src = fetchFromGitHub {
     owner = "LunarVim";
     repo = "LunarVim";
     rev = "refs/tags/${finalAttrs.version}";
-    hash = "sha256-z1Cw3wGpFDmlrAIy7rrjlMtzcW7a6HWSjI+asEDcGPA=";
+    hash = "sha256-uuXaDvZ9VaRJlZrdu28gawSOJFVSo5XX+JG53IB+Ijw=";
   };
 
-  # Pull in the fix for Nerd Fonts until the next release
-  patches = [
-    (
-      fetchpatch {
-        url = "https://github.com/LunarVim/LunarVim/commit/d187cbd03fbc8bd1b59250869e0e325518bf8798.patch";
-        sha256 = "sha256-ktkQ2GiIOhbVOMjy1u5Bf8dJP4SXHdG4j9OEFa9Fm7w=";
-      }
-    )
-  ];
-
   nativeBuildInputs = [
     gnused
     makeWrapper
@@ -140,7 +129,7 @@ stdenv.mkDerivation (finalAttrs: {
     changelog = "https://github.com/LunarVim/LunarVim/blob/${finalAttrs.src.rev}/CHANGELOG.md";
     sourceProvenance = with sourceTypes; [ fromSource ];
     license = licenses.gpl3Only;
-    maintainers = with maintainers; [ prominentretail ];
+    maintainers = with maintainers; [ prominentretail lebensterben ];
     platforms = platforms.unix;
     mainProgram = "lvim";
   };
diff --git a/pkgs/by-name/lu/luneta/package.nix b/pkgs/by-name/lu/luneta/package.nix
index 02e9a0724da2b..698e8b84a3285 100644
--- a/pkgs/by-name/lu/luneta/package.nix
+++ b/pkgs/by-name/lu/luneta/package.nix
@@ -35,7 +35,7 @@ buildDubPackage rec {
 
   meta = {
     changelog = "https://github.com/fbeline/luneta/releases/tag/${src.rev}";
-    description = "An interactive filter and fuzzy finder for the command-line";
+    description = "Interactive filter and fuzzy finder for the command-line";
     homepage = "https://github.com/fbeline/luneta";
     license = lib.licenses.gpl2Only;
     mainProgram = "luneta";
diff --git a/pkgs/by-name/lu/lutgen/package.nix b/pkgs/by-name/lu/lutgen/package.nix
index 78779051349eb..5c1cd965ef22b 100644
--- a/pkgs/by-name/lu/lutgen/package.nix
+++ b/pkgs/by-name/lu/lutgen/package.nix
@@ -1,38 +1,41 @@
-{ lib
-, fetchFromGitHub
-, rustPlatform
-, stdenv
-, installShellFiles
+{
+  lib,
+  fetchFromGitHub,
+  rustPlatform,
+  stdenv,
+  installShellFiles,
 }:
 
 rustPlatform.buildRustPackage rec {
   pname = "lutgen";
-  version = "0.10.0";
+  version = "0.11.0";
 
   src = fetchFromGitHub {
     owner = "ozwaldorf";
     repo = "lutgen-rs";
     rev = "v${version}";
-    hash = "sha256-O2995+DLiCRDM/+oPTOBiM0L1x0jmbLTlR48+5IfOQw=";
+    hash = "sha256-ybaapL9OUUQ+sO8P0JH1MuxCFmTihKp9gXJpM7KLY7U=";
   };
 
-  cargoHash = "sha256-ys4c/YUJJikDEUJjzagZBB+kSy+EFf+PqQdK/h+3gWU=";
+  cargoHash = "sha256-Fxecnq7QKcDe6aAsKj9uye3sFdfkgFEKYmdqnvQDiAQ=";
 
-  nativeBuildInputs = [
-    installShellFiles
-  ];
+  nativeBuildInputs = [ installShellFiles ];
 
   postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
     installShellCompletion --cmd lutgen \
-      --bash <($out/bin/lutgen completions bash) \
-      --fish <($out/bin/lutgen completions fish) \
-      --zsh <($out/bin/lutgen completions zsh)
+      --bash <($out/bin/lutgen --bpaf-complete-style-bash) \
+      --fish <($out/bin/lutgen --bpaf-complete-style-fish) \
+      --zsh <($out/bin/lutgen --bpaf-complete-style-zsh)
   '';
 
   meta = with lib; {
-    description = "A blazingly fast interpolated LUT generator and applicator for arbitrary and popular color palettes";
+    description = "Blazingly fast interpolated LUT generator and applicator for arbitrary and popular color palettes";
     homepage = "https://github.com/ozwaldorf/lutgen-rs";
-    maintainers = with maintainers; [ zzzsy donovanglover ];
+    maintainers = with maintainers; [
+      ozwaldorf
+      zzzsy
+      donovanglover
+    ];
     mainProgram = "lutgen";
     license = licenses.mit;
   };
diff --git a/pkgs/by-name/lu/lutok/package.nix b/pkgs/by-name/lu/lutok/package.nix
new file mode 100644
index 0000000000000..144854abb9e4a
--- /dev/null
+++ b/pkgs/by-name/lu/lutok/package.nix
@@ -0,0 +1,87 @@
+{
+  lib,
+  stdenv,
+  fetchFromGitHub,
+  atf,
+  autoreconfHook,
+  kyua,
+  lua,
+  pkg-config,
+  gitUpdater,
+}:
+
+lib.fix (
+  drv:
+  let
+    # Avoid infinite recursions:
+    # - Lutok depends on ATF and Kyua for testing; but
+    # - ATF depends on Kyua for testing, and Kyua depends on Lutok as a build input.
+    # To break the cycle (ATF -> Kyua -> Lutok -> ATF and Kyua):
+    # - Build ATF without testing (avoiding the Kyua dependency); and
+    # - Build Kyua against a version of Lutok without testing (also avoiding the ATF and Kyua dependencies).
+    atf' = atf.overrideAttrs (_: {
+      doInstallCheck = false;
+    });
+    kyua' =
+      (kyua.override {
+        lutok = drv.overrideAttrs (_: {
+          doCheck = false;
+        });
+      }).overrideAttrs
+        (_: {
+          # Assume Kyua’s install check phase will run when Kyua is built. Don’t run it again
+          # while building Lutok because it can take four to five minutes to run.
+          doInstallCheck = false;
+        });
+  in
+  stdenv.mkDerivation (finalAttrs: {
+    pname = "lutok";
+    version = "0.4";
+
+    outputs = [
+      "out"
+      "dev"
+    ];
+
+    src = fetchFromGitHub {
+      owner = "freebsd";
+      repo = "lutok";
+      rev = "lutok-${finalAttrs.version}";
+      hash = "sha256-awAFxx9q8dZ6JO1/mShjhJnOPTLn1wCT4VrB4rlgWyg=";
+    };
+
+    strictDeps = true;
+
+    propagatedBuildInputs = [ lua ];
+
+    nativeBuildInputs = [
+      atf'
+      autoreconfHook
+      pkg-config
+    ];
+
+    enableParallelBuilding = true;
+
+    makeFlags = [
+      # Lutok isn’t compatible with C++17, which is the default on current clang and GCC.
+      "CXXFLAGS=-std=c++11"
+    ];
+
+    doCheck = true;
+
+    checkInputs = [ atf' ];
+    nativeCheckInputs = [ kyua' ];
+
+    passthru.updateScript = gitUpdater { rev-prefix = "lutok-"; };
+
+    __structuredAttrs = true;
+
+    meta = {
+      description = "Lightweight C++ API for Lua";
+      homepage = "https://github.com/freebsd/lutok/";
+      license = lib.licenses.bsd3;
+      maintainers = with lib.maintainers; [ reckenrode ];
+      platforms = lib.platforms.unix;
+    };
+  })
+)