asdf solves a common headache: every language has its own version manager (nvm, rbenv, pyenv), each with different commands. asdf unifies them under one tool using a plugin architecture, so you learn one workflow and apply it to dozens of runtimes. You install a plugin per language, then install and switch versions with consistent commands.

A typical session looks like this:

sh
asdf plugin add nodejs
asdf install nodejs 20.11.0
asdf set nodejs 20.11.0

A .tool-versions file at the project root pins exact versions for the whole team, which asdf reads automatically when you enter the directory. This makes onboarding and CI reproducible. The trade-off is that asdf uses shims, which add a small per-command overhead and occasionally surprise users when a binary isn't where they expect. Even so, it's been a community standard for years and has a huge plugin ecosystem. For polyglot teams, it dramatically reduces tooling sprawl.