No sudo. No IT ticket. No drama. Just qnvs and vibes.
Suggested hero image: Unsplash — Christopher Gower (Developer workstation)
The Problem That Made Me Build This
Picture this: Monday morning. You're a developer at a company where IT guards the admin password like it's nuclear launch codes. You need Node.js 22 for a new project, but your machine has Node 18. The options?
- Submit an IT ticket. Estimated response: 3-7 business days. Maybe. If Mercury is in retrograde.
- Use nvm. Great on macOS/Linux! On Windows? [laughs in Group Policy]
- Use nvm-windows. Requires admin privileges to create symlinks. Back to step 1.
- Download Node.js manually. Sure, if you enjoy living like it's 2009.
None of these worked for me. So instead of rage-quitting, I rage-coded.
Meet QNVS — Quick Node Version Switcher. A single binary, zero-dependency, cross-platform, no-admin-required Node.js version manager with a gorgeous interactive TUI. Built in Go. Ships in ~10MB. Works everywhere.
Suggested image: Unsplash — Florian Olivo (Terminal/Code)
Wait, What Does "No Admin Required" Actually Mean?
Let me be crystal clear because this is the entire reason QNVS exists:
- ❌ No
sudo - ❌ No Administrator PowerShell
- ❌ No Developer Mode toggle
- ❌ No Group Policy exceptions
- ❌ No IT tickets
- ❌ No "please sir, may I have write access to Program Files"
QNVS lives entirely in user space. On macOS/Linux, it chills in ~/.qnvs. On Windows, it sits in %LOCALAPPDATA%\qnvs. That's it. Your home directory. The one place on the computer that's actually yours.
You download the binary. You run qnvs setup. You install Node.js versions. You switch between them. You feel powerful. All without elevating a single privilege.
The TUI That Made My Terminal Beautiful ✨
Look, I could've just built a boring CLI. But I had access to the Charm ecosystem — bubbletea, bubbles, lipgloss — and honestly, if you're going to build a terminal tool in 2025, you owe it to yourself to make it pretty.
Run qnvs with no arguments and you get this:
██████╗ ███╗ ██╗██╗ ██╗███████╗
██╔═══██╗████╗ ██║██║ ██║██╔════╝
██║ ██║██╔██╗ ██║██║ ██║███████╗
██║▄▄ ██║██║╚██╗██║╚██╗ ██╔╝╚════██║
╚██████╔╝██║ ╚████║ ╚████╔╝ ███████║
╚══▀▀═╝ ╚═╝ ╚═══╝ ╚═══╝ ╚══════╝
Quick Node Version Switcher • No admin required
╭──────────────────────────────────────────────╮
│ │
│ ▸ 📦 Install Node.js │
│ Download and install a new version │
│ │
│ 📋 List/Switch │
│ 🗑️ Uninstall │
│ 🔧 Setup │
│ 🔓 Toggle TLS Skip │
│ ❓ Help │
│ 👋 Exit │
│ │
│ 2 installed Active: v22.22.0 │
╰──────────────────────────────────────────────╯
↑↓ navigate │ ⏎ select │ q quit
Arrow keys to navigate. Enter to select. q to quit. That's the entire learning curve.
No flags to memorize. No --help to desperately consult. Just a menu. With emojis. Like civilized people.
Suggested image: Unsplash — Clay Banks (Colorful keyboard)
The Windows Problem (And How I Solved It)
Here's the dirty secret of Node.js version managers on Windows: they almost all rely on symlinks or junctions.
- Symlinks need Developer Mode or admin rights
-
Directory junctions (
mklink /J) usually work without admin... until your company's Group Policy says "nah" - Cue developer tears
QNVS takes a hybrid approach that I'm unreasonably proud of:
Step 1: Try to create a directory junction. This works on most Windows machines without admin rights and gives you fast, transparent version switching.
Step 2: If junctions fail (thanks, Group Policy), QNVS automatically falls back to shim mode — it creates tiny .cmd wrapper scripts in ~/.qnvs/bin/ that redirect to the active Node.js version:
@echo off
"C:\Users\you\AppData\Local\qnvs\versions\v22.22.0\node.exe" %*
That's it. A .cmd file. Group Policy can't block .cmd files because that would break literally everything else on Windows. It's not a hack — it's a feature.
The fallback is completely automatic and transparent. You don't configure anything. You don't even know it happened. QNVS just... works.
The CLI: For When You Know What You Want
The interactive TUI is great for exploring, but sometimes you just want to get in, switch versions, and get out. The CLI has your back:
# Install Node 22 (latest 22.x.x)
qnvs install 22
# Install the latest LTS
qnvs install lts
# Install a specific version
qnvs install 20.10.0
# Switch versions
qnvs use 22
# See what you've got
qnvs list
# What's active?
qnvs current
Version resolution is smart. Type 22 and QNVS fetches the latest 22.x.x from nodejs.org. Type lts and it finds the latest Long Term Support release. Type latest and... you get the latest. Revolutionary stuff.
| Command | What It Does |
|---|---|
qnvs |
Launch the interactive TUI |
qnvs install <version> |
Download and install a version |
qnvs use <version> |
Switch to an installed version |
qnvs list |
List installed versions |
qnvs current |
Show the active version |
qnvs uninstall <version> |
Remove a version |
qnvs setup |
Initialize QNVS + configure PATH |
Corporate VPN? No Problem.
Raise your hand if you've ever seen this error:
x509: certificate signed by unknown authority
If you're behind a corporate VPN like Cato, Zscaler, or Palo Alto, your company is probably doing TLS inspection — which means your HTTPS requests are getting re-signed by a corporate certificate that your tools don't trust.
Most tools: "Figure it out yourself. Here's a 47-step Stack Overflow thread."
QNVS: "Toggle a switch."
CLI:
qnvs install 22 --insecure
Interactive mode: Just select "🔓 Toggle TLS Skip" from the menu before installing.
Is it ideal? No. TLS verification exists for good reasons. But when you're on a locked-down corporate machine and the VPN is doing inspection, this beats "can't install Node.js at all" every single time.
Why Go? (Again)
I keep building things in Go and people keep asking why. So here's the elevator pitch:
Single binary. No runtime. No
node_modules. No Python virtual environment. No Java classpath. Just one file. Copy it. Run it. Done.Cross-compilation is stupid easy. One command gives me binaries for Windows/macOS/Linux across amd64 and arm64. Six platforms, zero hassle:
GOOS=windows GOARCH=amd64 go build -o qnvs-windows-amd64.exe .
GOOS=darwin GOARCH=arm64 go build -o qnvs-macos-arm64 .
GOOS=linux GOARCH=amd64 go build -o qnvs-linux-amd64 .
The Charm ecosystem. Bubbletea + Bubbles + Lipgloss = gorgeous terminal UIs with minimal effort. It's like React but for terminals and without the existential crisis of choosing a state management library.
~10MB binary. The entire tool — TUI, version resolution, download with progress bars, archive extraction, platform detection — fits in the space of about 3 JPEG photos from your phone.
Suggested image: Gopherize.me for a custom gopher, or Unsplash — Go-related imagery
How It Actually Works Under The Hood
For the curious (and the people who read source code for fun — I see you), here's the architecture:
The whole project is two files:
-
main.go— The core: version resolution, downloading, extraction, symlink/junction/shim management, CLI handling -
interactive.go— The entire TUI, built on Bubbletea's Elm architecture
Version resolution hits https://nodejs.org/dist/index.json, parses the JSON, and fuzzy-matches your input. 22 → latest v22.x.x. lts → latest release where the lts field is a string (Node.js marks LTS versions with a codename like "Jod").
Downloading uses a custom progress bar (Charm's progress component) that shows real-time MB progress. It does a HEAD request first to get the content length, then streams the download with a 32KB buffer.
Extraction handles both .tar.gz (macOS/Linux) and .zip (Windows) natively — no tar or unzip binary needed. Pure Go. It even handles symlinks in tar archives (npm/npx are symlinks in the Node.js distribution).
Switching is where it gets spicy:
-
Unix: Swap a symlink.
~/.qnvs/current→~/.qnvs/versions/v22.22.0. Done. - Windows (happy path): Create a directory junction. Same concept, Windows flavor.
-
Windows (corporate dystopia): Generate
.cmdshims. Same result, different mechanism.
Installation: Pick Your Poison
macOS / Linux:
curl -L https://github.com/qnvs/qnvs/releases/latest/download/qnvs-linux-amd64 -o qnvs
chmod +x qnvs
./qnvs setup
Windows (PowerShell):
Invoke-WebRequest -Uri "https://github.com/qnvs/qnvs/releases/latest/download/qnvs-windows-amd64.exe" -OutFile "qnvs.exe"
.\qnvs.exe setup
Build from source:
git clone https://github.com/qnvs/qnvs.git
cd qnvs
go build -o qnvs .
./qnvs setup
setup creates the directory structure, copies the binary to ~/.qnvs/bin/, and even tries to auto-append the PATH export to your .bashrc or .zshrc. On Windows, it tells you exactly what to add to your PATH. No guessing.
Suggested image: Unsplash — Riccardo Annandale (Light bulb)
QNVS vs. The Competition
Let's be honest — there are other version managers out there. Here's where QNVS stands:
| Feature | QNVS | nvm | nvm-windows | fnm | Volta |
|---|---|---|---|---|---|
| No admin required | ✅ | ✅ | ❌ | ⚠️ | ⚠️ |
| Windows support | ✅ | ❌ | ✅ | ✅ | ✅ |
| Works behind corporate VPN | ✅ (built-in) | ❌ | ❌ | ❌ | ❌ |
| Interactive TUI | ✅ | ❌ | ❌ | ❌ | ❌ |
| Single binary | ✅ | ❌ | ✅ | ✅ | ✅ |
| Corporate Windows (no junctions) | ✅ (auto shim) | N/A | ❌ | ❌ | ❌ |
| Zero dependencies | ✅ | ❌ (bash) | ✅ | ✅ | ✅ |
The corporate Windows row is the killer feature. If you've ever been stuck on a locked-down Windows machine where mklink is blocked and Developer Mode is disabled, you know the pain. QNVS is the first version manager I know of that handles this gracefully with its automatic shim fallback.
Who Is This For?
- 🏢 Corporate developers trapped behind Group Policy and VPN inspection
- 💻 Windows users who are tired of "requires admin" being the answer to everything
- 🎨 TUI enthusiasts who believe CLI tools should be beautiful
- 🏃 Developers who hate bloat — one binary, no runtime, no install scripts
- 🔄 Anyone juggling multiple Node.js projects with different version requirements
- 🆕 Beginners who find
nvmconfusing — just runqnvsand use the arrow keys
If you've ever Googled "how to install Node.js without admin rights" at 11 PM on a work laptop... I built this for you.
Suggested image: Unsplash — Jason Leung (Confetti)
What's Next?
QNVS is at v1.1.3 and I'm actively working on it. Things rattling around in my brain:
- 📌 Auto-detect
.nvmrc/.node-version— walk into a project directory and QNVS switches automatically - 🔄 Self-update —
qnvs updateto grab the latest QNVS binary - 📦 Package manager support — install and manage
pnpm/yarnalongside Node - 🪟 Windows code signing — so you stop getting the "Unknown Publisher" warning
- 🌐 Mirror support — for environments that can't reach nodejs.org directly
- 📊 Disk usage display — see how much space each version is eating
Give It a Spin ⭐
QNVS is open-source (MIT licensed) and lives at github.com/qnvs/qnvs.
Three steps to happiness:
- Download the binary for your platform from Releases
- Run
qnvs setup - Run
qnvsand bask in the TUI glow
Star the repo if it saved you from filing an IT ticket. Open an issue if something's broken. Submit a PR if you want to make it better. Or just enjoy switching Node versions without asking anyone's permission for once in your corporate life.
Built with 🐹 Go, the ✨ Charm ecosystem, and a deep resentment for "Please contact your system administrator."
Top comments (0)