flake.nix 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. {
  2. description = "QMD - Quick Markdown Search";
  3. inputs = {
  4. nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  5. flake-utils.url = "github:numtide/flake-utils";
  6. };
  7. outputs = { self, nixpkgs, flake-utils }:
  8. {
  9. homeModules.default = { config, lib, pkgs, ... }:
  10. with lib;
  11. let
  12. cfg = config.programs.qmd;
  13. in
  14. {
  15. options.programs.qmd = {
  16. enable = mkEnableOption "QMD - on-device search engine for markdown notes";
  17. package = mkOption {
  18. type = types.package;
  19. default = self.packages.${pkgs.stdenv.hostPlatform.system}.default;
  20. defaultText = literalExpression "inputs.qmd.packages.\${pkgs.stdenv.hostPlatform.system}.default";
  21. description = "The qmd package to use.";
  22. };
  23. };
  24. config = mkIf cfg.enable {
  25. home.packages = [ cfg.package ];
  26. };
  27. };
  28. } //
  29. flake-utils.lib.eachDefaultSystem (system:
  30. let
  31. pkgs = nixpkgs.legacyPackages.${system};
  32. packageJson = builtins.fromJSON (builtins.readFile ./package.json);
  33. version = packageJson.version;
  34. # SQLite with loadable extension support for sqlite-vec
  35. sqliteWithExtensions = pkgs.sqlite.overrideAttrs (old: {
  36. configureFlags = (old.configureFlags or []) ++ [
  37. "--enable-load-extension"
  38. ];
  39. });
  40. nodeModulesHashes = {
  41. x86_64-linux = "sha256-D0ezO4vqq4iswcAMU2DCql9ZAQvh3me6N9aDB5roq4w=";
  42. aarch64-darwin = "sha256-qU+9KdR/nTocelyANS09I/4yaQ+7s1LvJNqB27IOK/c=";
  43. # Populate these on first build for additional hosts if/when needed.
  44. aarch64-linux = pkgs.lib.fakeHash;
  45. x86_64-darwin = pkgs.lib.fakeHash;
  46. };
  47. nodeModules = pkgs.stdenvNoCC.mkDerivation {
  48. pname = "qmd-node-modules";
  49. inherit version;
  50. src = ./.;
  51. impureEnvVars = pkgs.lib.fetchers.proxyImpureEnvVars ++ [
  52. "GIT_PROXY_COMMAND"
  53. "SOCKS_SERVER"
  54. ];
  55. nativeBuildInputs = [
  56. pkgs.bun
  57. ];
  58. dontConfigure = true;
  59. buildPhase = ''
  60. export HOME=$(mktemp -d)
  61. bun install \
  62. --backend copyfile \
  63. --frozen-lockfile \
  64. --ignore-scripts \
  65. --no-progress \
  66. --production
  67. '';
  68. installPhase = ''
  69. mkdir -p $out
  70. cp -R node_modules $out/
  71. '';
  72. dontFixup = true;
  73. outputHash = nodeModulesHashes.${system};
  74. outputHashAlgo = "sha256";
  75. outputHashMode = "recursive";
  76. };
  77. qmd = pkgs.stdenv.mkDerivation {
  78. pname = "qmd";
  79. inherit version;
  80. src = ./.;
  81. nativeBuildInputs = [
  82. pkgs.bun
  83. pkgs.makeWrapper
  84. pkgs.nodejs
  85. pkgs.node-gyp
  86. pkgs.python3 # needed by node-gyp to compile better-sqlite3
  87. ] ++ pkgs.lib.optionals pkgs.stdenv.hostPlatform.isDarwin [
  88. pkgs.darwin.cctools # provides libtool needed by node-gyp on macOS
  89. ];
  90. buildInputs = [ pkgs.sqlite ];
  91. buildPhase = ''
  92. export HOME=$(mktemp -d)
  93. cp -R ${nodeModules}/node_modules ./
  94. chmod -R u+w node_modules
  95. (cd node_modules/better-sqlite3 && node-gyp rebuild --release)
  96. '';
  97. installPhase = ''
  98. mkdir -p $out/lib/qmd
  99. mkdir -p $out/bin
  100. cp -r node_modules $out/lib/qmd/
  101. cp -r src $out/lib/qmd/
  102. cp package.json $out/lib/qmd/
  103. makeWrapper ${pkgs.bun}/bin/bun $out/bin/qmd \
  104. --add-flags "$out/lib/qmd/src/cli/qmd.ts" \
  105. --set DYLD_LIBRARY_PATH "${pkgs.sqlite.out}/lib" \
  106. --set LD_LIBRARY_PATH "${pkgs.sqlite.out}/lib"
  107. '';
  108. meta = with pkgs.lib; {
  109. description = "On-device search engine for markdown notes, meeting transcripts, and knowledge bases";
  110. homepage = "https://github.com/tobi/qmd";
  111. license = licenses.mit;
  112. platforms = platforms.unix;
  113. };
  114. };
  115. in
  116. {
  117. packages = {
  118. default = qmd;
  119. qmd = qmd;
  120. };
  121. apps.default = {
  122. type = "app";
  123. program = "${qmd}/bin/qmd";
  124. };
  125. devShells.default = pkgs.mkShell {
  126. buildInputs = [
  127. pkgs.bun
  128. sqliteWithExtensions
  129. ];
  130. shellHook = ''
  131. export BREW_PREFIX="''${BREW_PREFIX:-${sqliteWithExtensions.out}}"
  132. echo "QMD development shell"
  133. echo "Run: bun src/cli/qmd.ts <command>"
  134. '';
  135. };
  136. }
  137. );
  138. }