A great starting point with the power of Neovim, Portability and Windows <3
A fully selfβcontained development environment for Windows (10+/Server). Drop it into any folder. Run one installer and get a complete toolchain (REQUIRED 1GB+):
- Neovim (stable/nightly) Link
- Python (embed) + Automatic pip & pynvim Link
- Node.js + Automatic npm & neovim provider Link
- Git (portable) Link
- ripgrep Link
- fd Link
- Zig Link
- Autoβgenerated launchers
- Portable PATH activation
- Persistent JSON state
- No registry writes
- No system PATH pollution
- Fully reproducible clean installs
This project is designed for developers who want a portable, relocatable, zeroβconf environment that works anywhere β USB drives, cloud folders, offline machines, restricted systems, or clean Windows installs. This project was also designed by me! Also it was debugged and fine-tuned with the help of the awesome Copilot ;-)
Modern development environments are powerful β but theyβre also fragile. They depend on system PATH, registry entries, installers, admin rights, and a dozen assumptions about the machine theyβre running on. One broken dependency or one conflicting version can ruin everything.
A portable toolchain solves all of that.
This toolchain never touches:
- system PATH
- registry keys
- Program Files
- AppData
- global Python/Node installations
- global Zig compiler installations
Everything stays inside one folder. Delete the folder β everything is gone. No leftovers. No pollution. No surprises.
Because itβs selfβcontained, you can run it on:
- clean Windows installs
- lockedβdown corporate machines
- university lab PCs
- cloud VMs
- USB drives
- offline environments
- machines without admin rights
If the folder exists, the toolchain works.
A clean install always produces the exact same environment:
- same versions
- same folder structure
- same launchers
- same PATH
- same behavior
No βit works on my machine.β Your environment becomes deterministic.
You can:
- move the folder
- rename it
- zip it
- sync it with OneDrive/Dropbox
- clone it to another machine
Everything still works because paths are stored in state.json and launchers activate the environment dynamically.
Portable tools never conflict with:
- system Python
- system Node
- system Git
- system Zig
- system Neovim
- system PATH
Your environment is isolated and predictable.
Neovim plugins depend on:
- ripgrep
- fd
- Python + pynvim
- Zig
- Node.js + neovim provider
A portable toolchain guarantees all of these exist and work together, no matter what the host machine has installed.
You always know:
- where your tools live
- what versions youβre using
- what PATH is active
- what Neovim sees
- what Python sees
- what Node sees
- what Zig sees
No hidden state. No global conflicts. No mystery errors.
Everything lives inside a single root folder:
& Your desired directory & /
tools/
scripts/
links/
state.json
Move it anywhere. Put it on a USB stick. Sync it with OneDrive. It just works.
- No registry edits
- No PATH changes
- No installers
- No admin rights required
A persistent state.json tracks tool paths and is read by all launchers.
Every tool gets a PowerShell launcher that:
- Activates the portable PATH
- Sets XDG directories for Neovim
- Sets Python environment variables
- Sets Node environment variables
- Runs the tool cleanly and consistently
Delete the tools/ folder and run the installer again β you get the exact same environment every time.
- Downloads tools using
curl - Extracts archives using
tar - Flattens directory structures
- Writes
state.json - Generates PowerShell launchers
- Creates CMD wrappers
- Load
state.ps1 - Build PATH using arrayβjoin (preserves system PATH)
- Set environment variables
- Run the tool
state.json stores:
{
"nodePath": "D:\\tw\\tools\\node\\current",
"pythonPath": "D:\\tw\\tools\\python\\current",
"nvimPath": "D:\\tw\\tools\\nvim\\current",
"rgPath": "D:\\tw\\tools\\ripgrep\\current",
"fdPath": "D:\\tw\\tools\\fd\\current",
"gitPath": "D:\\tw\\tools\\git\\current\\cmd"
"zigPath": "C:\\tw\\tools\\zig\\current"
}| Tool | Description |
|---|---|
| Neovim | Portable build with full runtime, XDG directories, and plugin support |
| Python (embed) | Selfβcontained Python environment with pip + pynvim preinstalled |
| Node.js | Portable Node + npm with the Neovim Node provider installed |
| Git (PortableGit) | Fully portable Git distribution (no installer, no system changes) |
| ripgrep | Highβperformance search tool used by many Neovim plugins |
| fd | Fast, userβfriendly alternative to find, used by Telescope and others |
| Zig | General-purpose programming language designed for systems programming, offering compile-time safety, explicit memory management, and a modern syntax. |
- Clone or download this repository.
- Place it anywhere (e.g.,
D:\tw\). - Make sure the
D:\tw\linksdirectory is in the same directory as theD:\tw\install.cmdfile!
tw/
β
βββ install.cmd # Main installer script (downloads + extracts + configures tools)
β
βββ links/ # Version profiles for all tools
β
βββ links-latest.conf # The newest versions of every tool (time of production)
βββ links-lts.conf # Stable, long-term support versions
βββ links-example.conf # An example configuration file
βββ links-custom.conf # User-editable profile for custom versions
- Run:
install.cmd
- Choose a link profile (latest, LTS, or custom).
- Wait for the installer to download and configure all tools.
Thatβs it.
Just delete the folder.
No registry keys. No PATH pollution. No system changes.
Your toolchain is fully versionβagnostic. Every tool β Neovim, Python, Node.js, Git, ripgrep, fd, Zig β is downloaded from URLs defined in a link profile.
These profiles live in:
links/
links-latest.conf
links-lts.conf
links-custom.conf
Each profile is a simple key=value file where:
- key = tool name
- value = download URL for that tool
The installer reads the selected profile and builds the environment accordingly.
Use a nightly URL.
Swap the URL.
Point to the LTS ZIP.
Create a custom profile.
Edit the link profile:
links/links-latest.conf
Each line maps a tool to a download URL:
GIT=https://...
RIPGREP=https://...
FD=https://...
NODE=https://...
PYTHON=https://...
NVIM=https://...
You can create your own profile with:
links/links-custom.conf
Then select it during installation.
When running the installer:
install.cmd
Youβll be prompted:
Available link profiles:
1. links-latest.conf
2. links-lts.conf
3. links-custom.conf
Choose profile (1/2/3):
Choose 3 to use your custom versions.
Hereβs a clean, realistic example you can include in your repo:
# Custom tool versions for the portable toolchain
# You can pin exact versions or mix-and-match as needed.
GIT=https://github.com/git-for-windows/git/releases/download/v2.43.0.windows.1/PortableGit-2.43.0-64-bit.7z.exe
NODE=https://nodejs.org/dist/v20.11.1/node-v20.11.1-win-x64.zip
PYTHON=https://www.python.org/ftp/python/3.12.2/python-3.12.2-embed-amd64.zip
NEOVIM=https://github.com/neovim/neovim/releases/download/v0.10.1/nvim-win64.zip
RIPGREP=https://github.com/BurntSushi/ripgrep/releases/download/14.1.0/ripgrep-14.1.0-x86_64-pc-windows-msvc.zip
FD=https://github.com/sharkdp/fd/releases/download/v9.0.0/fd-v9.0.0-x86_64-pc-windows-msvc.zip
ZIG=https://ziglang.org/download/0.12.0/zig-windows-x86_64-0.12.0.zip
This file is:
- Easy to read
- Easy to edit
- Easy to versionβcontrol
- Fully deterministic
Your portable toolchain is intentionally simple, predictable, and selfβcontained. Everything lives inside a single root directory, and every component has a clear purpose.
tw/
β
βββ install.cmd # One-shot installer (downloads + extracts + configures everything)
βββ state.json # Persistent state (paths for all tools)
β
β
βββ tools/ # All portable tools live here
β β
β βββ git/
β β βββ home/
β β βββ tmp/
β β βββ current/ # PortableGit extracted here
β β
β βββ node/
β β βββ current/ # Node.js + npm + neovim provider
β β
β βββ python/
β β βββ current/ # Python embed + pip + pynvim
β β
β βββ nvim/
β β βββ current/ # Neovim portable build
β β βββ bin/ # nvim.exe + runtime binaries
β β βββ config/ # Your Neovim config (init.lua lives here)
β β β βββ nvim/
β β βββ data/ # XDG_DATA_HOME (plugins, packer, lazy.nvim, etc.)
β β βββ state/ # XDG_STATE_HOME (LSP logs, sessions)
β β βββ cache/ # XDG_CACHE_HOME (treesitter, swap, undo, etc.)
β β
β βββ ripgrep/
β β βββ current/ # rg.exe
β β
β βββ fd/
β β βββ current/ # fd.exe
β β
β βββ zig/
β β βββ current/ # zig.exe
β β
| βββ *.cmd # CMD wrappers for each tool (nvim.cmd, python.cmd, node.cmd, etc.)
β
β
βββ scripts/ # Auto-generated PowerShell launchers
β β
β βββ state.ps1 # Reads/writes state.json
β β
β βββ launch-nvim.ps1 # Activates PATH + XDG + runs Neovim
β βββ launch-python.ps1 # Activates PATH + PYTHONHOME + runs Python
β βββ launch-node.ps1 # Activates PATH + NODE_PATH + runs Node
β βββ launch-npm.ps1 # Activates PATH + runs npm
β βββ launch-npx.ps1 # Activates PATH + runs npx
β βββ launch-rg.ps1 # Activates PATH + runs ripgrep
β βββ launch-fd.ps1 # Activates PATH + runs fd
β
β
βββ links/ # Version profiles for tools
β
βββ links-latest.conf # Latest versions of all tools
βββ links-lts.conf # Long-term stable versions
βββ links-example.conf # An example configuration file
βββ links-custom.conf # User-defined versions (editable)
Every tool has a current/ folder.
Every launcher knows exactly where to look.
Move the entire folder β everything still works. State.json updates paths automatically (After reinstalling).
No global installs. No registry keys. No PATH pollution.
Delete tools/ β run installer β get the exact same environment.
Launch Neovim:
tools\nvim.cmd
Launch Python:
tools\python.cmd
Launch Node:
tools\node.cmd
All tools automatically activate the portable PATH and environment.
Your Neovim config lives here:
../tools/nvim/current/config/nvim/init.lua
What are you waiting for ? Create one !
Inside Neovim:
:checkhealth
You should see:
- ripgrep β
- node provider β
- python provider β
- treesitter β
- etc
Perl/Ruby warnings are normal unless you install those providers.
- You can pin exact versions for reproducibility
- You can track nightly builds for bleedingβedge setups
- You can maintain multiple profiles for different projects
- You can share profiles with teammates
- You can freeze your environment for years
- Portable LSP servers
- Portable Treesitter parser installer
- Portable plugin manager
- GUI launcher
Built by Ali β a developer obsessed with clean, portable, reproducible workflows. Designed with care, iteration, and a relentless pursuit of reliability. (Thanks Copilot (β'β‘'β)β€οΈ)