It started with a bug that only one developer could reproduce, which turned out to be a Node version mismatch — he was on an older Node that handled a particular Buffer method differently than everyone else's machine. That was the push we needed to standardize, after losing the better part of a day to a bug that had nothing to do with the actual code.
We settled on nvm rather than mandating a single system-wide Node install, since different projects on our plate genuinely need different Node versions — an older client project still pinned to an earlier LTS release for stability reasons, a newer internal tool built against the latest release — and we did not want to force every client project onto the same one just for the sake of consistency. Each repository now carries a `.nvmrc` file, and onboarding a new developer is a matter of `nvm install` picking up the right version automatically, followed by `nvm use` any time they switch between projects in different terminal tabs.
A couple of small additions made this stick as an actual habit rather than a one-time setup step: we added a short check to each project's README reminding developers to run `nvm use` before starting work, and for the couple of team members who kept forgetting, a one-line addition to their shell profile that automatically runs `nvm use` whenever they `cd` into a directory containing an `.nvmrc` file solved it for good.
We also updated our CI configuration and our deployment scripts to read from the same `.nvmrc` file rather than hardcoding a version number in a second place, which had previously been a quiet source of drift whenever someone updated the local development version but forgot the pipeline config existed as a separate thing to update.
The other habit we picked up alongside nvm was pinning exact dependency versions more aggressively in each project's `package-lock.json`-equivalent of the time, since a mismatched Node version was often just the most visible symptom of a broader "two machines, two slightly different environments" problem, and standardizing on one without the other only solved half of it.
It is a small process change, but it removed an entire category of "works on my machine" bug reports from our internal tracker, and it made our CI setup more reliable too, since the build pipeline now reads the same file that developers use locally rather than relying on whatever Node version happened to be installed on the CI runner's image.