about summary refs log tree commit diff
path: root/pkgs/by-name/ch/chatd/package.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/ch/chatd/package.nix')
-rw-r--r--pkgs/by-name/ch/chatd/package.nix95
1 files changed, 95 insertions, 0 deletions
diff --git a/pkgs/by-name/ch/chatd/package.nix b/pkgs/by-name/ch/chatd/package.nix
new file mode 100644
index 0000000000000..692e7d752971f
--- /dev/null
+++ b/pkgs/by-name/ch/chatd/package.nix
@@ -0,0 +1,95 @@
+{
+  buildNpmPackage,
+  lib,
+  autoPatchelfHook,
+  electron,
+  fetchFromGitHub,
+  gitUpdater,
+  makeWrapper,
+  ollama,
+  pkg-config,
+  stdenv,
+  vips,
+}:
+
+buildNpmPackage rec {
+  pname = "chatd";
+  version = "1.1.2";
+
+  src = fetchFromGitHub {
+    owner = "BruceMacD";
+    repo = "chatd";
+    rev = "v${version}";
+    hash = "sha256-6z5QoJk81NEP115uW+2ah7vxpDz8XQUmMLESPsZT9uU=";
+  };
+
+  makeCacheWritable = true; # sharp tries to build stuff in node_modules
+  ELECTRON_SKIP_BINARY_DOWNLOAD = true;
+
+  npmDepsHash = "sha256-jvGvhgNhY+wz/DFS7NDtmzKXbhHbNF3i0qVQoFFeB0M=";
+
+  dontNpmBuild = true; # missing script: build
+
+  nativeBuildInputs = [
+    makeWrapper
+    electron
+    autoPatchelfHook # for onnx libs
+    pkg-config
+  ];
+
+  buildInputs = [
+    stdenv.cc.cc.lib # for libstdc++.so, required by onnxruntime
+    vips # or it will try to download from the Internet
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/{bin,share}
+    cp -r . $out/share/chatd
+
+    for bin in ollama-darwin ollama-linux; do
+      makeWrapper ${lib.getExe ollama} $out/share/chatd/src/service/ollama/runners/$bin
+    done
+
+    makeWrapper ${lib.getExe electron} $out/bin/chatd \
+      --add-flags $out/share/chatd/src/index.js \
+      --chdir $out/share/chatd \
+      --set-default ELECTRON_FORCE_IS_PACKAGED 1
+    runHook postInstall
+  '';
+
+  postInstall = ''
+    substituteInPlace $out/share/chatd/node_modules/@xenova/transformers/src/env.js \
+      --replace-fail "import fs from 'fs';" "import fs from 'fs';import os from 'os';" \
+      --replace-fail 'path.dirname(path.dirname(url.fileURLToPath(import.meta.url)))' 'path.join(os.homedir(), ".cache", "chatd")'
+
+    rm -rf $out/share/electron{,-winstaller} $(find $out -name 'win32')
+    find $out/share/chatd/node_modules -name '*.exe' -or -name '*.dll' -or -name '*.pdb' -delete
+    rm -rf ${
+      lib.concatStringsSep " " (
+        (lib.optional (!stdenv.isx86_64) "$out/share/chatd/node_modules/onnxruntime-node/bin/napi-v3/*/x64")
+        ++ (lib.optional (
+          !stdenv.isAarch64
+        ) "$out/share/chatd/node_modules/onnxruntime-node/bin/napi-v3/*/arm64")
+        ++ (lib.optional (
+          !stdenv.isDarwin
+        ) "$out/share/chatd/node_modules/onnxruntime-node/bin/napi-v3/darwin")
+        ++ (lib.optional (
+          !stdenv.isLinux
+        ) "$out/share/chatd/node_modules/onnxruntime-node/bin/napi-v3/linux")
+      )
+    }
+  '';
+
+  passthru.updateScript = gitUpdater { rev-prefix = "v"; };
+
+  meta = {
+    description = "Chat with your documents using local AI";
+    homepage = "https://github.com/BruceMacD/chatd";
+    changelog = "https://github.com/BruceMacD/chatd/releases/tag/v${version}";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.lucasew ];
+    mainProgram = "chatd";
+    platforms = electron.meta.platforms;
+  };
+}