{ description = "Quartz org-roam dev shell and build app"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; # Emacs with ox-hugo — shared between devShell and buildApp emacsWithOxHugo = (pkgs.emacsPackagesFor pkgs.emacs-nox).emacsWithPackages (epkgs: [ epkgs.ox-hugo ]); # Pre-fetched npm dependency tree (node_modules) quartzDeps = pkgs.buildNpmPackage { pname = "quartz-deps"; version = "4.5.2"; src = ./.; npmDepsHash = "sha256-7u+VlIx44B3/ivM9vLMIOn+e4TL4eS6B682vhS+Ikb4="; dontBuild = true; installPhase = '' mkdir -p $out cp -r node_modules $out/node_modules ''; }; # Pre-fetched Hex/Mix dependencies for scripts/pipeline pipelineMixDeps = pkgs.beamPackages.fetchMixDeps { pname = "pipeline-mix-deps"; version = "0.1.0"; src = ./scripts/pipeline; sha256 = "sha256-E79X+nUy86G1Jrwv3T7dXekoGv8Hd14ZgJSKWjvlmAw="; }; # The build application wrapper script buildApp = pkgs.writeShellApplication { name = "build"; runtimeInputs = [ pkgs.nodejs_22 pkgs.elixir emacsWithOxHugo ]; text = '' NOTES_DIR="''${1:?Usage: build }" NOTES_DIR=$(realpath "$NOTES_DIR") ORIG_CWD=$(pwd) # Set up a writable working copy of the repo in a temp dir WORK=$(mktemp -d) trap 'rm -rf "$WORK"' EXIT cp -r ${self}/. "$WORK/repo" chmod -R u+w "$WORK/repo" # Drop in pre-built node_modules ln -s ${quartzDeps}/node_modules "$WORK/repo/node_modules" # Drop in pre-fetched Mix deps so mix compile runs offline cp -r ${pipelineMixDeps} "$WORK/repo/scripts/pipeline/deps" chmod -R u+w "$WORK/repo/scripts/pipeline/deps" # ox-hugo requires static/ to exist before it can copy image assets mkdir -p "$WORK/repo/static" # Run the export pipeline (org → md, citations transform) NOTES_DIR="$NOTES_DIR" elixir "$WORK/repo/scripts/export.exs" # Build the static site from within the repo copy so relative paths # (e.g. ./package.json in constants.js) resolve correctly. # --output is absolute so the result lands in the caller's cwd. cd "$WORK/repo" node quartz/bootstrap-cli.mjs build \ --directory "$WORK/repo/content" \ --output "$ORIG_CWD/public" ''; }; in { devShells.default = pkgs.mkShell { buildInputs = [ pkgs.nodejs_22 pkgs.elixir emacsWithOxHugo pkgs.mcp-nixos ]; shellHook = '' echo "Node $(node --version) / npm $(npm --version)" elixir --version 2>/dev/null | head -1 || true echo "Emacs $(emacs --version | head -1)" ''; }; packages.default = buildApp; packages.build = buildApp; apps.default = { type = "app"; program = "${buildApp}/bin/build"; }; apps.build = { type = "app"; program = "${buildApp}/bin/build"; }; }); }