npm ci in buildPhase hangs because the Nix build sandbox has no network access. buildNpmPackage pre-fetches dependencies as a fixed-output derivation with network access, then the main build runs offline. npmDepsHash values are placeholders (lib.fakeHash) — the first builds will fail with hash mismatches that report the correct hashes.