NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #158 most downloaded on PyPI
Node.js virtual environment builder
Last release 8 days ago
26 Sep 2026
Ships fairly regularly
a new release about every 9 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
15 years old
76 releases · first in 2011
address deprecation warning in tarfile.TarFile.extract all in Python … by @nernst in #380
Full Changelog: 1.10.0...1.11.0
One column per quarter.
source bin/activate aborting on the direct-call guard #398 <https://github.com/ekalinin/nodeenv/issues/398>_activate is called
#384 <https://github.com/ekalinin/nodeenv/pull/384>_tarfile.extractall deprecation on Python >= 3.12 by
setting filter='data', which also prevents writing files via ".." or
absolute paths #380 <https://github.com/ekalinin/nodeenv/pull/380>_#360 <https://github.com/ekalinin/nodeenv/issues/360>_predeactivate hooks for Windows#336 <https://github.com/ekalinin/nodeenv/issues/336>_print that leaked a dict to stdout on every
version detection #390 <https://github.com/ekalinin/nodeenv/issues/390>_--with-certifi to download packages with the certifi certificate
bundle #388 <https://github.com/ekalinin/nodeenv/pull/388>_--node accepts npm-style semver ranges
#393 <https://github.com/ekalinin/nodeenv/pull/393>_--prefer-system to use system-wide node.js when available and
install one otherwise #153 <https://github.com/ekalinin/nodeenv/issues/153>_--isolate-npm to keep npm cache, userconfig and init-module inside
the environment #154 <https://github.com/ekalinin/nodeenv/issues/154>_-p no longer reinstalls node when the requested version is already in the
virtualenv #159 <https://github.com/ekalinin/nodeenv/issues/159>_-p runs no longer duplicate the predeactivate hook
#159 <https://github.com/ekalinin/nodeenv/issues/159>_-p accepts an optional virtualenv directory and prefers the activated
VIRTUAL_ENV over the virtualenv nodeenv itself is installed in
#156 <https://github.com/ekalinin/nodeenv/issues/156>_-r/--requirements may now be given more than once, and the new
--local-requirements installs the packages of a file locally, into
"node_modules" of the current directory, which is what freeze -l writes.
Under npm < 1.0.0, which has no -g, a local file is still installed the
old way #206 <https://github.com/ekalinin/nodeenv/issues/206>_--no-clean-src to keep it: with
--source that is what lets a repeated --force build reuse the
downloaded source tree
#205 <https://github.com/ekalinin/nodeenv/issues/205>_--mirror takes a file:// URL, so a local directory can
serve as the download source
#193 <https://github.com/ekalinin/nodeenv/issues/193>_activate is now written on Windows too, into "Scripts", so
git-bash and the other posix shells there can activate an environment
#226 <https://github.com/ekalinin/nodeenv/issues/226>_http_proxy or
https_proxy usually causes, now reports the url and the proxy settings
instead of a traceback
#229 <https://github.com/ekalinin/nodeenv/issues/229>_-p extends "activate.bat", "deactivate.bat" and
"Activate.ps1" of the python virtualenv instead of overwriting them, so
VIRTUAL_ENV and the virtualenv's own deactivation survive
#243 <https://github.com/ekalinin/nodeenv/issues/243>_--list and --source instead of a traceback
#250 <https://github.com/ekalinin/nodeenv/issues/250>_freeze now reads npm ls --parseable instead of the drawn tree: scoped
packages keep their scope, a package whose name contains "npm" is no longer
dropped, and npm and corepack, which come with node.js itself, are left
out of the list. The fish version, which printed nothing at all under
npm >= 1, now writes the same file as the posix one
#287 <https://github.com/ekalinin/nodeenv/issues/287>_x86_64-alpine-linux-musl) gets the musl build
of node.js instead of the glibc one
#290 <https://github.com/ekalinin/nodeenv/issues/290>_os.symlink, falling back to a
hard link, instead of mklink, which broke on paths with forward slashes
or spaces and needs elevation or Developer Mode. If both fail, only a
warning is logged #303 <https://github.com/ekalinin/nodeenv/issues/303>_Added support for Python 3.13 #367 _
#367 <https://github.com/ekalinin/nodeenv/pull/367>_#386 <https://github.com/ekalinin/nodeenv/pull/386>_sh instead of bash #389 <https://github.com/ekalinin/nodeenv/pull/389>_which(1) calls with shutil.which()
#355 <https://github.com/ekalinin/nodeenv/pull/355>_v in .node-version
#359 <https://github.com/ekalinin/nodeenv/pull/359>_node version
#363 <https://github.com/ekalinin/nodeenv/pull/363>_archmap lookup to be lowercase
#382 <https://github.com/ekalinin/nodeenv/pull/382>_#358 ( #356 , #356 )
#358 <https://github.com/ekalinin/nodeenv/pull/358>_
#356 <https://github.com/ekalinin/nodeenv/issues/356>_#338 #347 #348 #345 #342 #346
packaging for version comparison
#338 <https://github.com/ekalinin/nodeenv/pull/338>_ and then dropped the
dependency in favor of a simple version-parsing function
#352 <https://github.com/ekalinin/nodeenv/pull/352>_#347 <https://github.com/ekalinin/nodeenv/pull/347>_#348 <https://github.com/ekalinin/nodeenv/pull/348>_#345 <https://github.com/ekalinin/nodeenv/pull/345>_pipes.quote with shlex.quote on Python 3.3+
#342 <https://github.com/ekalinin/nodeenv/pull/342>_which
#346 <https://github.com/ekalinin/nodeenv/pull/346>_Changes: #312 #313 #317 #320 #327 #329 #330
fish_prompt
#312 <https://github.com/ekalinin/nodeenv/pull/312>_#313 <https://github.com/ekalinin/nodeenv/pull/313>_#317 <https://github.com/ekalinin/nodeenv/pull/317>_mock dependency optional
#320 <https://github.com/ekalinin/nodeenv/pull/320>_fail-fast: false
#327 <https://github.com/ekalinin/nodeenv/pull/327>_#329 <https://github.com/ekalinin/nodeenv/pull/329>_#330 <https://github.com/ekalinin/nodeenv/pull/330>_#272 #289 #288 #294 #296 #295 #298 #299 #307 #308
#272 <https://github.com/ekalinin/nodeenv/pull/272>_#289 <https://github.com/ekalinin/nodeenv/pull/289>_.node-version if it exists
#288 <https://github.com/ekalinin/nodeenv/pull/288>_#294 <https://github.com/ekalinin/nodeenv/pull/294>_#295 <https://github.com/ekalinin/nodeenv/pull/295>_#296 <https://github.com/ekalinin/nodeenv/issues/296>_#298 <https://github.com/ekalinin/nodeenv/pull/298>_#299 <https://github.com/ekalinin/nodeenv/pull/299>_#307 <https://github.com/ekalinin/nodeenv/pull/307>_--with-npm to README #308 <https://github.com/ekalinin/nodeenv/pull/308>_#270 #271 #273 #275 #276 #277 #281 #282
nodejs or node in tests
#270 <https://github.com/ekalinin/nodeenv/pull/270>_#271 <https://github.com/ekalinin/nodeenv/pull/271>_#273 <https://github.com/ekalinin/nodeenv/pull/273>_node instead of nodejs #275 <https://github.com/ekalinin/nodeenv/pull/275>_#276 <https://github.com/ekalinin/nodeenv/pull/276>_#277 <https://github.com/ekalinin/nodeenv/pull/277>_#281 <https://github.com/ekalinin/nodeenv/pull/281>_#282 <https://github.com/ekalinin/nodeenv/pull/282>_#259 #256 #263 #268
-n system
#259 <https://github.com/ekalinin/nodeenv/pull/259>_--ignore_ssl_certs to ignore SSL certs for MITM/firewalls
#256 <https://github.com/ekalinin/nodeenv/pull/256>_#263 <https://github.com/ekalinin/nodeenv/pull/263>_#268 <https://github.com/ekalinin/nodeenv/pull/268>_#258 #255 #252 #247
/download/release/index.json to discover versions#258 <https://github.com/ekalinin/nodeenv/pull/258>_deactivate_node in fish
#255 <https://github.com/ekalinin/nodeenv/pull/255>_--mirror argument
#252 <https://github.com/ekalinin/nodeenv/pull/252>_#247 <https://github.com/ekalinin/nodeenv/pull/247>_#249
#249 <https://github.com/ekalinin/nodeenv/issues/249>_#230 #231 #232 #233 #234 #241 #242 #236 #208 #245 #246
#230 <https://github.com/ekalinin/nodeenv/pull/230>_#231 <https://github.com/ekalinin/nodeenv/pull/231>_#232 <https://github.com/ekalinin/nodeenv/pull/232>_npm_url in install_npm_win
#233 <https://github.com/ekalinin/nodeenv/pull/233>_#234 <https://github.com/ekalinin/nodeenv/pull/234>_#241 <https://github.com/ekalinin/nodeenv/pull/241>_#242 <https://github.com/ekalinin/nodeenv/pull/242>_install_node fails
#236 <https://github.com/ekalinin/nodeenv/pull/236>_#208 <https://github.com/ekalinin/nodeenv/pull/208>_#245 <https://github.com/ekalinin/nodeenv/pull/245>_logger.info(...)
#246 <https://github.com/ekalinin/nodeenv/pull/246>_Installed a certain npm version via npm install #225 _
npm install
#225 <https://github.com/ekalinin/nodeenv/issues/225>_Updated node/node -> node/cli #222 _
#222 <https://github.com/ekalinin/nodeenv/pull/222>_#216 <https://github.com/ekalinin/nodeenv/pull/216>_#213 <https://github.com/ekalinin/nodeenv/pull/213>_- Windows related fix #207 _ - Fixed url for arm64 #210 _ - Fixed fish support #212 _
#207 <https://github.com/ekalinin/nodeenv/pull/207>_#210 <https://github.com/ekalinin/nodeenv/pull/210>_#212 <https://github.com/ekalinin/nodeenv/pull/212>_- Fixed symlink creation #189 _ - Python3.6 support #200 _ - Added activate for fish #201 _ - Fixed cp866 #202 _ - Added Conda support #203 _
#189 <https://github.com/ekalinin/nodeenv/issues/189>_#200 <https://github.com/ekalinin/nodeenv/pull/200>_activate for fish #201 <https://github.com/ekalinin/nodeenv/pull/201>_#202 <https://github.com/ekalinin/nodeenv/pull/202>_#203 <https://github.com/ekalinin/nodeenv/pull/203>_Support for Cygwin #194 _ #195 _
#194 <https://github.com/ekalinin/nodeenv/pull/194>_ #195 <https://github.com/ekalinin/nodeenv/pull/195>_#197 <https://github.com/ekalinin/nodeenv/pull/197>_- Fixed directory copy #188 _
#188 <https://github.com/ekalinin/nodeenv/issues/188>_- Fixed spaces in paths #187 _
#187 <https://github.com/ekalinin/nodeenv/issues/187>_- Fixed MANIFEST.in #184 _
#184 <https://github.com/ekalinin/nodeenv/issues/184>_Improve Windows support. See #181 _
#181 <https://github.com/ekalinin/nodeenv/pull/181>_--force. See #183 <https://github.com/ekalinin/nodeenv/pull/183>_#49 <https://github.com/ekalinin/nodeenv/issues/49>_- Windows support
--prebuilt is default. See # 161_
--prebuilt is default. See # 161_--source optionARM. See # 171_$PATH. See # 86_.. _# 171: https://github.com/ekalinin/nodeenv/issues/171 .. _# 161: https://github.com/ekalinin/nodeenv/issues/161 .. _# 86: https://github.com/ekalinin/nodeenv/issues/86
Use https for nodejs.org. See # 129_
# 129_.. _# 129: https://github.com/ekalinin/nodeenv/issues/129
Improved user-agent identification
Custom user-agent. See # 125_, # 127_
user-agent. See # 125, # 127.. _# 125: https://github.com/ekalinin/nodeenv/issues/125 .. _# 127: https://github.com/ekalinin/nodeenv/issues/127
Fixed env creation with non-ASCII chars in path. See # 49_
# 49_# 96_# 122_# 124_.. _# 49: https://github.com/ekalinin/nodeenv/issues/49 .. _# 96: https://github.com/ekalinin/nodeenv/issues/96 .. _# 122: https://github.com/ekalinin/nodeenv/issues/122 .. _# 124: https://github.com/ekalinin/nodeenv/pull/124
Fixed freeze command. See # 121_
freeze command. See # 121_.. _# 121: https://github.com/ekalinin/nodeenv/issues/121
Fixed bug: nodeenv --list is raising TypeError. See # 117_, # 118_
nodeenv --list is raising TypeError. See # 117, # 118.. _# 117: https://github.com/ekalinin/nodeenv/issues/117 .. _# 118: https://github.com/ekalinin/nodeenv/pull/118
Removed deps from sort, egrep, curl, tar. See # 114_, # 116_.
sort, egrep, curl, tar.
See # 114, # 116... _# 114: https://github.com/ekalinin/nodeenv/pull/114 .. _# 116: https://github.com/ekalinin/nodeenv/pull/116
Fixed check for installed curl/tar/etc for py3.
Added check for installed curl/egrep/sort/tar. See # 110_, # 61_
# 110, # 61.. _# 110: https://github.com/ekalinin/nodeenv/issues/110 .. _# 61: https://github.com/ekalinin/nodeenv/issues/61
Removed dep for lxml in favor of stdlib HTMLParser. See # 109_
# 109_# 109_# 109_.. _# 109: https://github.com/ekalinin/nodeenv/pull/109
Added support for io.js (new option --iojs)
--iojs)get_last_stable_node_version for python3Disallow prefix overridden by .npmrc. See # 98_, # 100_, # 103_
# 98, # 100, # 103_.. _# 98: https://github.com/ekalinin/nodeenv/issue/98 .. _# 100: https://github.com/ekalinin/nodeenv/pull/100 .. _# 103: https://github.com/ekalinin/nodeenv/pull/103
Added --config-file option. See # 91_
# 90_# 91_# 91_# 92, # 93.. _# 90: https://github.com/ekalinin/nodeenv/pull/90 .. _# 91: https://github.com/ekalinin/nodeenv/pull/91 .. _# 92: https://github.com/ekalinin/nodeenv/pull/92 .. _# 93: https://github.com/ekalinin/nodeenv/pull/93
Added support for config file. See # 85_
# 85_# 87_freeze for zsh. See # 88_nodejs symlink creation. See # 84_.. _# 85: https://github.com/ekalinin/nodeenv/pull/85 .. _# 87: https://github.com/ekalinin/nodeenv/pull/87 .. _# 88: https://github.com/ekalinin/nodeenv/pull/88
Removed os.symlink added in # 76_. See # 84_
os.symlink added in # 76. See # 84.. _# 84: https://github.com/ekalinin/nodeenv/issues/84
Fixed a few spelling typos in README. See # 74_
# 74_# 74_# 75_nodejs if used system-wide node as well. See # 76_assert if used system-wide node and it wasnt found. See # 76_-l option into freeze command. See # 71_.. _# 71: https://github.com/ekalinin/nodeenv/issues/71 .. _# 74: https://github.com/ekalinin/nodeenv/issues/74 .. _# 75: https://github.com/ekalinin/nodeenv/pull/75 .. _# 76: https://github.com/ekalinin/nodeenv/pull/76
Fixed support for python2.6. See # 70_
# 70_.. _# 70: https://github.com/ekalinin/nodeenv/issues/70
Fixed npm when using prebuilt binaries on Mac OS X. See # 68_
# 68_system node under python3.4. See # 43_system node script bin/node always overwritten.. _# 68: https://github.com/ekalinin/nodeenv/issues/68 .. _# 43: https://github.com/ekalinin/nodeenv/issues/43
Fixed infinite loop when system-wide node used. See # 67_
# 67_.. _# 67: https://github.com/ekalinin/nodeenv/issues/67
Fixed 'shim' script if used system-wide node
.. _# 59: https://github.com/ekalinin/nodeenv/issues/59
shim script. See # 59_.. _# 59: https://github.com/ekalinin/nodeenv/issues/59
exclude top-level files in prebuilt tar. See # 63_
# 64_# 63_.. _# 63: https://github.com/ekalinin/nodeenv/issues/63 .. _# 64: https://github.com/ekalinin/nodeenv/issues/64
Fixed system's node usage. See # 62_
# 62_.. _# 62: https://github.com/ekalinin/nodeenv/pull/62
Added support for prebuilt packages. See # 56_
# 56_# 42_.. _# 56: https://github.com/ekalinin/nodeenv/issues/56 .. _# 42: https://github.com/ekalinin/nodeenv/issues/42
Fixed npm.js redirect. See # 52_
# 52_--update option. See # 25_.. _# 52: https://github.com/ekalinin/nodeenv/pull/52 .. _# 25: https://github.com/ekalinin/nodeenv/issues/25
Bug fixing in freeze. See # 47_
freeze. See # 47_.. _# 47: https://github.com/ekalinin/nodeenv/issues/47
- Added --make option
--make optionpython3 support (first steps). See # 38_, # 39_
--force. See # 37_# 38, # 39# 40_# 41_.. _# 37: https://github.com/ekalinin/nodeenv/pull/37 .. _# 38: https://github.com/ekalinin/nodeenv/issues/38 .. _# 39: https://github.com/ekalinin/nodeenv/issues/39 .. _# 40: https://github.com/ekalinin/nodeenv/pull/40 .. _# 41: https://github.com/ekalinin/nodeenv/pull/41
Fixed incomplete package names using freeze. See # 35_
# 35_# 33_.. _# 33: https://github.com/ekalinin/nodeenv/issues/33 .. _# 35: https://github.com/ekalinin/nodeenv/pull/35
Node's source not loaded if it already exists in FS.
Added python3 compatibility. See # 32_
# 32_.. _# 32: https://github.com/ekalinin/nodeenv/pull/32
Fixed nodeenv -p. See issue # 31_
nodeenv -p. See issue # 31_.. _issue # 31: https://github.com/ekalinin/nodeenv/issues/31
Skipped stand-alone npm installation by default. See pull # 30_
pull # 30_--without-npm has been changed to --with-npm. See pull # 30_pull # 30_.. _pull # 30: https://github.com/ekalinin/nodeenv/pull/30
Used pkg_resources.parse_version to compare versions. See pull # 29_
pull # 29_issues # 26_.. _pull # 29: https://github.com/ekalinin/nodeenv/pull/29 .. _issues # 26: https://github.com/ekalinin/nodeenv/issues/26
Fixed typo in deactive command. See pull # 20_
pull # 20_pull # 21_pull # 22_pull # 23_.. _pull # 20: https://github.com/ekalinin/nodeenv/pull/20 .. _pull # 21: https://github.com/ekalinin/nodeenv/pull/21 .. _pull # 22: https://github.com/ekalinin/nodeenv/pull/22 .. _pull # 23: https://github.com/ekalinin/nodeenv/pull/23
Bug fix. Used https, /dist/latest/. See pull # 16_
pull # 16_.. _pull # 16: https://github.com/ekalinin/nodeenv/pull/16
Improved installation logic for release candidate versions. See pull # 10_
pull # 10_.. _pull # 10: https://github.com/ekalinin/nodeenv/pull/10
Improved logic for the option '--without-npm'. See issue # 14_, pull # 15_
issue # 14, pull # 15.. _issue # 14: https://github.com/ekalinin/nodeenv/issues/14 .. _pull # 15: https://github.com/ekalinin/nodeenv/pull/15
Your coding agent can read these notes before it upgrades. Set up the MCP server →