Skip to content

Version managers install runtimes you tried once and kept forever

Every language version manager keeps each install in full. How to list what is on your Mac, and which versions nothing pins.

5 min read

Version managers make trying a new runtime free, which is the point and also the problem. Each install is a complete runtime, they are never removed automatically, and after a few years a Mac holds several of everything.

List what is installed

du -sh ~/.asdf ~/.sdkman ~/.local/share/mise ~/.pyenv ~/.rbenv ~/.nvm \
  2>/dev/null | sort -h
asdf list 2>/dev/null; sdk list java 2>/dev/null | head -20; mise ls 2>/dev/null

Find what your projects actually pin

cat ~/**/.tool-versions ~/**/.sdkmanrc ~/**/.python-version \
  ~/**/.ruby-version ~/**/.nvmrc 2>/dev/null | sort -u

That is the list of versions something on your Mac requires. Anything installed and not in that list, and not your default, is a candidate for removal. It is usually most of them.

Removing cleanly, per tool

ToolRemove a versionNotes
asdfasdf uninstall <plugin> <version>Plugins themselves are small
SDKMANsdk uninstall java <version>JDKs are 300 MB and up each
misemise uninstall <tool>@<version>Shares a cache directory
pyenvpyenv uninstall <version>Each Python is 100 MB plus packages
nvmnvm uninstall <version>Takes global npm packages with it

The download archives underneath

Most of these keep the archive they installed from as well as the installed runtime, in a downloads or cache folder inside their directory. Clearing that costs a redownload only if you reinstall the same version, which is rare:

du -sh ~/.sdkman/archives ~/.asdf/downloads ~/.pyenv/cache 2>/dev/null

Why this is worth doing once a year

Runtimes are large, individually forgettable and collectively significant. On the Mac these guides are measured on, nvm alone held 4.5 GB across eight Node versions, and that is one tool of five. The audit takes ten minutes and does not recur if you remove versions as you finish with them.

Common questions

How do I see which runtime versions I have installed?

Each manager has a list command: asdf list, sdk list, mise ls, pyenv versions, nvm ls. Running du against their directories shows what each is costing in disk space.

How do I know which versions are safe to remove?

Collect the version files your projects pin, such as .tool-versions, .nvmrc and .python-version, and compare. Anything installed that nothing pins and that is not your default is a candidate.

Do version managers keep the downloads after installing?

Usually yes, in an archives, downloads or cache folder inside their directory. Clearing that costs a redownload only if you reinstall the same version later.

Does removing a runtime affect installed tools?

Yes. Anything installed globally into that runtime goes with it, which is most noticeable with Node and Python where command line tools are installed per version.

Read next