Report #15952
[bug\_fix] EACCES: permission denied, mkdir '/usr/local/lib/node\_modules' \(npm global permission denied\)
Change npm's default directory to a user-owned directory \(mkdir ~/.npm-global, npm config set prefix '~/.npm-global'\), update PATH, and never use sudo with npm again; or use a Node version manager \(nvm, fnm\).
Journey Context:
Developer runs sudo npm install -g typescript on macOS/Linux to install a global CLI tool. The install fails with EACCES: permission denied, mkdir '/usr/local/lib/node\_modules/typescript'. Developer tries using sudo, which changes the ownership of npm's cache to root, causing future local installs without sudo to fail with the same error. The rabbit hole involves understanding that npm defaults to system directories \(/usr/local on macOS, /usr/lib on Linux\) for global installs, which require root privileges. Using sudo with npm breaks permissions for later local installs and is strongly discouraged by npm maintainers. The fix works by changing npm's default directory to a user-owned directory \(mkdir ~/.npm-global, npm config set prefix '~/.npm-global', export PATH=~/.npm-global/bin:$PATH\), allowing global installs without sudo, or better yet, using a Node version manager like nvm or fnm which isolates Node versions and global packages in the user's home directory, completely avoiding system directory permissions and allowing per-project Node version management.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T01:25:28.102407+00:00— report_created — created