CLI tool
version-fox/vfox avatar
version-fox/vfox

vfox: A Plugin-Based Version Manager That Centralizes Runtimes Across Projects

Project brief: A cross-platform and extendable version manager with support for Java, Node.js, Golang, Python, Flutter, .NET & more.

3,985 stars156 forksGoApache-2.0

At a glance

What is it?
vfox is a cross-platform version manager for runtimes like Java, Node.js, Go, and Python, using a plugin system and automatic switching. This review examines its mechanism, setup, limitations, and whether it fits your workflow.
Who is it for?
Adopt vfox if you juggle multiple runtimes across projects and want a single command set with automatic switching and existing config file support. Do not use it if you need deep per-language features beyond version management, or if you prefer a mature, battle-tested ecosystem like asdf-vm.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 4 days ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The Problem: Fragmented Runtime Management

Developers often work across projects that require different versions of Java, Node.js, Go, Python, or Flutter. Each language has its own version manager: nvm for Node, sdkman for Java, fvm for Flutter. Switching between them means learning different commands, remembering where each tool stores its config, and manually adjusting environment variables. vfox aims to replace this fragmentation with a single tool. It targets developers who switch between projects with different runtime expectations, or who are tired of cumbersome environment configurations. The README positions it as an ideal choice for such users, promising consistent commands across all supported languages.

How vfox Works: Plugins, Hooks, and Automatic Switching

vfox is built as a cross-platform version manager, similar to nvm, fvm, sdkman, and asdf-vm, but with a plugin system. The core mechanism is that you add a plugin for each runtime, then install specific versions. The tool tracks which version is active per project, shell, or globally. A key feature is automatic switching: as you traverse your project directories, vfox changes the active runtime version based on the project's configuration. This is achieved through a shell hook, which is why the README emphasizes hooking vfox into your shell. The hook intercepts directory changes and applies the appropriate environment. The plugin system is simple, allowing you to add support for any runtime. vfox also supports existing config files like .node-version, .nvmrc, and .sdkmanrc, which eases migration from other tools.

Getting Started: Commands and Shell Integration

Installation is not fully detailed in the README; it points to a Quick Start guide at vfox.dev. However, the essential steps are clear. First, install vfox using a method from the guide. Then, you must hook it into your shell. For bash, you add 'eval "$(vfox activate bash)"' to your .bashrc. For zsh, use 'eval "$(vfox activate zsh)"' in .zshrc. Fish uses 'vfox activate fish | source' in config.fish. PowerShell requires adding 'Invoke-Expression "$(vfox activate pwsh)"' to your $PROFILE. Clink and Nushell have different, more manual setups: for Clink, you copy internal/shell/clink_vfox.lua to the script path found via 'clink info'. The README warns to restart your shell after hooking. After that, you add a plugin with 'vfox add nodejs', install a version with 'vfox install nodejs@21.5.0', and switch with 'vfox use nodejs@21.5.0'. The README shows that after running 'vfox use', the command 'node -v' outputs the selected version.

Plugin Ecosystem and Extensibility

The plugin system is the core of vfox. The README lists supported runtimes: Java, Node.js, Golang, Python, Flutter, .NET, and more. To see all available plugins, you run 'vfox available'. This command queries a public registry, which is maintained separately at github.com/version-fox/vfox-plugins. The simplicity of the plugin system is a double-edged sword. On one hand, it allows community contributions to add new runtimes quickly. On the other, the quality and maintenance of plugins vary. The README does not detail how to write a plugin, but it references a public registry for contributions. This means the tool's usefulness depends on the health of that registry. If a plugin is abandoned, you may be stuck with an outdated runtime version or a broken install.

Cross-Platform Support and Shell Compatibility

vfox claims cross-platform support for Windows, Linux, and macOS. The shell hooks cover bash, zsh, fish, PowerShell, Clink, and Nushell. However, the integration depth varies. Bash, zsh, and fish are straightforward one-liners. PowerShell requires a profile setup that checks if the profile exists. Clink and Nushell are more involved: Clink requires copying a Lua script manually, and Nushell's hook is not shown in the README, leaving a gap. This inconsistency suggests that while the core tool is cross-platform, the shell integration experience is uneven. Users on Clink or Nushell may face friction during setup. Also, the README does not specify how vfox handles Windows-specific environment variables or path separators, but the project is written in Go, which compiles to native binaries, so it likely works well across platforms.

Migration and Compatibility with Existing Configs

One of vfox's strengths is its support for existing configuration files: .node-version, .nvmrc, and .sdkmanrc. This is a practical feature for teams already using nvm or sdkman. Instead of converting all projects to a new format, vfox can read these files and switch versions accordingly. The README lists this as a reason to use vfox, and it directly addresses the migration pain point. However, the README does not specify how vfox handles conflicting config files (e.g., if both .node-version and .nvmrc exist in the same directory). It also does not mention support for other common files like .python-version or .java-version. This partial compatibility may be sufficient for many users, but it is a limitation to consider. If your project uses an unsupported config file, you will need to switch to vfox's own configuration mechanism.

Limitations: What vfox Does Not Do

vfox is a version manager, not a full environment manager. It does not handle environment variables beyond the runtime path, nor does it manage system-level dependencies like native libraries. For example, installing Python with vfox does not install pip packages or manage virtual environments; those remain separate concerns. Also, the README does not mention support for private registries or custom plugin sources. If you need to use a runtime version that is not in the public registry, you may have to write your own plugin, which requires understanding the plugin API. The documentation for that API is not in the README, so you would need to consult the vfox.dev site. Another limitation is that vfox's automatic switching relies on shell hooks, which can be fragile in complex shell environments or when using terminal multiplexers like tmux. The README does not address these edge cases.

Alternatives: asdf-vm and Language-Specific Managers

The closest alternative is asdf-vm, which also uses a plugin system and supports multiple runtimes. asdf-vm has been around longer, has a larger plugin ecosystem, and is widely adopted. The key difference is that asdf-vm uses a single .tool-versions file per project, while vfox supports existing config files like .nvmrc and .sdkmanrc. asdf-vm also has a more mature plugin development guide. If you already use asdf-vm, the migration effort to vfox may not be worth it, unless you specifically need the existing config file support. Language-specific managers like nvm or sdkman are simpler for single-language workflows, but they do not offer the cross-language consistency that vfox provides. The trade-off is between simplicity and breadth: vfox gives you one command set for all runtimes, but you trade the deep integration that dedicated managers often have.

Maintenance, Licensing, and Upgrade Costs

The project is licensed under Apache-2.0, which is permissive for commercial use. The last push was on April 29, 2026, with version v1.0.11 released the same day, indicating active maintenance. The release cadence shows frequent updates: v1.0.10 on April 15 and v1.0.8 on April 3, 2026. This suggests a responsive development team. However, the project is relatively young, and the plugin registry is community-driven. Upgrade costs are low for the core tool, as it is a single binary, but you must update plugins separately. The README does not describe an upgrade command, but you can likely re-run 'vfox add' or use a built-in update mechanism. The main maintenance concern is plugin compatibility with the core tool; as vfox evolves, older plugins may break. You should check the plugin registry for updates regularly.

Editorial conclusion

Adopt vfox if you juggle multiple runtimes across projects and want a single command set with automatic switching and existing config file support. Do not use it if you need deep per-language features beyond version management, or if you prefer a mature, battle-tested ecosystem like asdf-vm. Before adopting, verify that the plugins you need are available and actively maintained in the public registry, and test shell hook behavior in your specific shell (especially Clink or Nushell, where setup is manual). The project is Apache-2.0 licensed and actively maintained as of April 2026, but its success depends on plugin quality and community growth.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Community notes

Community notes