flake.nix 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. # SQLite with loadable extension support for sqlite-vec
  33. sqliteWithExtensions = pkgs.sqlite.overrideAttrs (old: {
  34. configureFlags = (old.configureFlags or []) ++ [
  35. "--enable-load-extension"
  36. ];
  37. });
  38. nodeModulesHashes = {
  39. x86_64-linux = "sha256-D0ezO4vqq4iswcAMU2DCql9ZAQvh3me6N9aDB5roq4w=";
  40. aarch64-darwin = "sha256-qU+9KdR/nTocelyANS09I/4yaQ+7s1LvJNqB27IOK/c=";
  41. # Populate these on first build for additional hosts if/when needed.
  42. aarch64-linux = pkgs.lib.fakeHash;
  43. x86_64-darwin = pkgs.lib.fakeHash;
  44. };
  45. nodeModules = pkgs.stdenvNoCC.mkDerivation {
  46. pname = "qmd-node-modules";
  47. version = "1.0.0";
  48. src = ./.;
  49. impureEnvVars = pkgs.lib.fetchers.proxyImpureEnvVars ++ [
  50. "GIT_PROXY_COMMAND"
  51. "SOCKS_SERVER"
  52. ];
  53. nativeBuildInputs = [
  54. pkgs.bun
  55. ];
  56. dontConfigure = true;
  57. buildPhase = ''
  58. export HOME=$(mktemp -d)
  59. bun install \
  60. --backend copyfile \
  61. --frozen-lockfile \
  62. --ignore-scripts \
  63. --no-progress \
  64. --production
  65. '';
  66. installPhase = ''
  67. mkdir -p $out
  68. cp -R node_modules $out/
  69. '';
  70. dontFixup = true;
  71. outputHash = nodeModulesHashes.${system};
  72. outputHashAlgo = "sha256";
  73. outputHashMode = "recursive";
  74. };
  75. qmd = pkgs.stdenv.mkDerivation {
  76. pname = "qmd";
  77. version = "1.0.0";
  78. src = ./.;
  79. nativeBuildInputs = [
  80. pkgs.bun
  81. pkgs.makeWrapper
  82. pkgs.nodejs
  83. pkgs.node-gyp
  84. pkgs.python3 # needed by node-gyp to compile better-sqlite3
  85. ] ++ pkgs.lib.optionals pkgs.stdenv.hostPlatform.isDarwin [
  86. pkgs.darwin.cctools # provides libtool needed by node-gyp on macOS
  87. ];
  88. buildInputs = [ pkgs.sqlite ];
  89. buildPhase = ''
  90. export HOME=$(mktemp -d)
  91. cp -R ${nodeModules}/node_modules ./
  92. chmod -R u+w node_modules
  93. (cd node_modules/better-sqlite3 && node-gyp rebuild --release)
  94. '';
  95. installPhase = ''
  96. mkdir -p $out/lib/qmd
  97. mkdir -p $out/bin
  98. cp -r node_modules $out/lib/qmd/
  99. cp -r src $out/lib/qmd/
  100. cp package.json $out/lib/qmd/
  101. makeWrapper ${pkgs.bun}/bin/bun $out/bin/qmd \
  102. --add-flags "$out/lib/qmd/src/cli/qmd.ts" \
  103. --set DYLD_LIBRARY_PATH "${pkgs.sqlite.out}/lib" \
  104. --set LD_LIBRARY_PATH "${pkgs.sqlite.out}/lib"
  105. '';
  106. meta = with pkgs.lib; {
  107. description = "On-device search engine for markdown notes, meeting transcripts, and knowledge bases";
  108. homepage = "https://github.com/tobi/qmd";
  109. license = licenses.mit;
  110. platforms = platforms.unix;
  111. };
  112. };
  113. in
  114. {
  115. packages = {
  116. default = qmd;
  117. qmd = qmd;
  118. };
  119. apps.default = {
  120. type = "app";
  121. program = "${qmd}/bin/qmd";
  122. };
  123. devShells.default = pkgs.mkShell {
  124. buildInputs = [
  125. pkgs.bun
  126. sqliteWithExtensions
  127. ];
  128. shellHook = ''
  129. export BREW_PREFIX="''${BREW_PREFIX:-${sqliteWithExtensions.out}}"
  130. echo "QMD development shell"
  131. echo "Run: bun src/cli/qmd.ts <command>"
  132. '';
  133. };
  134. }
  135. );
  136. }