Report #10138
[bug\_fix] EACCES permission denied on global install
Do not use \`sudo\` with npm. Instead, change npm's default directory to one owned by the user: \`mkdir ~/.npm-global\`, \`npm config set prefix '~/.npm-global'\`, then add \`~/.npm-global/bin\` to the PATH in \`~/.bashrc\` or \`~/.zshrc\`. Alternatively, use a Node version manager like nvm or fnm which handles global package permissions automatically. Root cause is that system-wide Node installations \(from macOS installers or apt\) default to protected system directories like /usr/local, requiring elevated permissions.
Journey Context:
A developer on macOS installs Node.js using the official pkg installer from nodejs.org. Later, they try to install TypeScript globally with \`npm install -g typescript\`. It fails with \`EACCES: permission denied, mkdir '/usr/local/lib/node\_modules'\`. They search online and find advice to use \`sudo\`. They run \`sudo npm install -g typescript\`. It installs but now the global node\_modules are owned by root, causing future permission errors when trying to update. They eventually find the official npm documentation on resolving EACCES permissions. They follow the steps to create \`~/.npm-global\`, set the npm prefix, update their shell profile to add the new path, and reinstall global packages without sudo.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T09:53:12.546802+00:00— report_created — created