Releases: wntrblm/nox
Release list
2026.08.17 🪟
This is a small follow-up release to better support running the parallel mode on legacy windows.
We'd like to thank the following folks who contributed to this release:
- @henryiii
- @nightcityblade (first contribution)
Fixes:
- Support legacy encodings in the parallel reporter by @nightcityblade in #1160
Internal changes:
2026.08.10 🔀
This release can run sessions in parallel with --parallel/-j (experimental for now, report any bugs!). Requires session opt-in, or use --allow-parallel. Interpreter discovery now uses the python-discovery package, which should be better at finding Python and supports version specifier sets. Using this, script mode reads requires-python. Many bugs were fixed, mostly in Python version handling, conda version specifiers, and option precedence. Unrecognized global options are now an error.
We'd like to thank the following folks who contributed to this release:
- @henryiii
- @Himanshuagrawal4
- @chuenchen309 (first contribution)
- @ColumbusLabs (first contribution)
- @deepakganesh78 (first contribution)
- @espressolee (first contribution)
- @Sanjays2402 (first contribution)
- @uttam12331 (first contribution)
- @yangfan-yf-yf (first contribution)
Features:
- Run sessions in parallel with
--parallel/-jby @henryiii in #1131 - Use
python-discoveryfor interpreter discovery by @henryiii in #1086 - Support
requires-pythonin script mode by @henryiii in #1142 - Sort classifier-derived Python versions by @Himanshuagrawal4 in #1100
Fixes:
- Isolate script mode from inherited
PYTHONPATHby @yangfan-yf-yf in #1157 - Require virtualenv 21+ on Python 3.15 by @henryiii in #1158
- Correct conda version constraints on Windows by @deepakganesh78 in #1146
- Make explicit command-line options beat noxfile and alias values by @henryiii in #1145
- Translate PEP 440 range interpreters to conda version specs by @henryiii in #1150
- Download upper-bound-only Python ranges by @henryiii in #1148
- Do not write
~/.local/binshims when provisioning with uv by @henryiii in #1149 - Don't crash
python_versions()on a major-onlymax_versionby @chuenchen309 in #1140 - Correct
python_versions()minimum for major-only and multiple lower bounds by @Sanjays2402 in #1127 - Don't crash building the manifest when a python-matrix session has an empty parametrize by @chuenchen309 in #1141
- Keep an empty inner
@parametrizefrom being dropped when stacked by @chuenchen309 in #1138
Documentation:
- Add a multi-version pytest coverage recipe by @ColumbusLabs in #1143
- Fix broken examples, stale versions, and typos by @henryiii in #1154
Internal changes:
- Statically-typed option model as the single source of truth by @henryiii in #1144
- Fix flake8-lazy merge by @henryiii in #1147
- Drop stale type ignores for argcomplete 3.7.2 by @henryiii in #1155
- Make
test_download_python_failed_installpass without uv installed by @uttam12331 in #1137 - Make the remaining uv download tests pass without uv installed by @espressolee in #1153
- Update the auto-release recipe to bump-my-version by @ColumbusLabs in #1136
- Bump the github-actions group with 5 updates by @dependabot in #1151
- Bump the pre-commit group with 6 updates by @dependabot in #1152
2026.07.11 🏪
This release drops Python 3.9 and brings a batch of performance improvements, like caching uv detection and interpreter discovery, plus lazy module imports on Python 3.15. Various bugs were fixed as well.
We'd like to thank the following folks who contributed to this release:
- @henryiii
- @davidhewitt
- @SAY-5 (first contribution)
- @Himanshuagrawal4 (first contribution)
- @TejasAmle (first contribution)
- @felixfontein (first contribution)
Features:
- Drop Python 3.9 by @henryiii in #1049
- Add
return_codeproperty toCommandFailedexception by @felixfontein in #1129
Performance:
- Cache session-name normalization, uv detection, interpreter discovery, and metadata reads by @henryiii in #1113
- Lazy modules on Python 3.15 by @henryiii in #1115
Fixes:
- Script-mode pip resolution on Windows and
--download-pythonfallback by @henryiii in #1110 - Don't crash when a parametrized session has an empty parameter list by @henryiii in #1109
- Hash fully non-ASCII session names instead of returning the envdir by @henryiii in #1108
- Interpreter-resolution edge cases in
virtualenv.pyby @henryiii in #1111 - Create missing parent directories for the session cache dir by @henryiii in #1104
- Enforce
--error-on-external-runeven whenlog=Falseby @henryiii in #1107 - Handle
=inset_envvalues and out-of-treechange_dirintox-to-noxby @henryiii in #1105 - Return empty dict from
load_tomlwhen script file is missing by @SAY-5 in #1096 - Show envvars in CLI help by @henryiii in #1085
Documentation:
- Add PyO3 as a user by @davidhewitt in #1123
- List micromamba in
--default-venv-backendsupported names by @SAY-5 in #1092 - Clarify
session.notifytarget docs by @Himanshuagrawal4 in #1099 - Document venv backend for EOL Python by @Himanshuagrawal4 in #1101
- Fix typo in README installation section by @TejasAmle in #1097
Internal changes:
- Add Python 3.15 to the test matrix and classifiers by @henryiii in #1133
- Isolate
run_noxenvdir to fix flakytest_main_requiresby @henryiii in #1134 - Assorted simplifications and dead-code removal by @henryiii in #1112
- Remove Python 3.9-era pins/backports and tighten generator annotations by @henryiii in #1106
- Run tests in parallel by @henryiii in #965
- Prevent coverage data corruption from artifact name collisions by @henryiii in #1116
- Reduce the number of times we contact conda-forge servers on non-Windows by @henryiii in #1120
- Experimental MSYS2/MinGW test run by @henryiii in #1122
- Update pre-commit (and dependabot) by @henryiii in #1119
- Bump conda pin to fix signature-verification plugin conflict by @henryiii in #1103
- Bump setup-uv to maintained tag scheme by @henryiii in #1084
2026.04.10 🧹
This release drops Python 3.8 and adds a --usage command for full docstrings. Our .nox dir is now ignored by default, virtualenvs are recreated if symlinks are broken (such as after a Python upgrade), and -t now selects from all available sessions.
We'd like to thank the following folks who contributed to this release:
Features:
- Drop Python 3.8 (reapply #1004) by @henryiii in #1062
- Add a
nox --usage <session>command to print full docstrings for provided sessions by @agriyakhetarpal in #1064 - Write out
.gitignore/CACHEDIR.TAGto.noxdir by @henryiii in #1072
Fixes:
- Recreate venv if broken symlinks are present by @henryiii in #1078
- Ignore default selection for tags and keywords by @henryiii in #1057
- More uv variables set by @henryiii in #1056
- Ignore forcecolor falsy by @henryiii in #1073
- Fully pin actions in composite action by @henryiii in #1080
Internal changes:
- Pin CI to working conda version by @henryiii in #1079
- Use prek by @agriyakhetarpal in #1065
- Switch artifact attestations to actions/attest by @scop in #1070
- Use zizmor by @henryiii in #1082
Full Changelog: 2026.02.09...2026.04.10
2026.02.09 ❤️🩹
This small release supports uv 0.10's new requirement that --clear be passed to clear an environment. Python 3.8 support was temporarily re-added since uv 0.10 still supports 3.8, so nox on 3.8 was affected.
We'd like to thank the following folks who contributed to this release:
- @henryiii
- @kai687 (first contribution)
- @wu-zhao-min (first contribution)
Bugfixes:
- Support uv 0.10.0 by @henryiii in #1055
- Show tags by @henryiii in #1058
- Better support for multiple session decorators by @henryiii in #1048
- Normalize extra
tox-to-noxby @henryiii in #1059 - Better typing for
.runby @henryiii in #1037
Internal changes:
- Fix conda CI job by @henryiii in #1035
- Drop Python 3.8 by @henryiii in #1004 and revert in #1060
- Fix action test by @henryiii in #1036
- Bump packaging dep to remove pyparsing by @henryiii in #1047
- Avoid newest docutils until sphinx-tabs updates by @henryiii in #1052
- Optimize the naming of constants to enhance readability by @wu-zhao-min in #1041
Documentation:
2025.11.12 🦃
This is a small release to fix a warning when running in script mode before we drop Python 3.8.
We'd like to thank the following folks who contributed to this release:
Bugfixes:
- Avoid warnings when running in script mode by @henryiii in #1025
nox --report <file>should supportPathby @henryiii in #1026- Install env was typed differently by @henryiii in #1028
Internal changes:
2025.10.16 ⏲️
This is a quick release to make our new dependency, pbs-installer, optional. This is only needed to install Python if you are not using the uv backend. We've also added the time taken to the output when it's over a second.
We'd like to thank the following folks who contributed to this release:
Changes:
- Make pbs-installer an optional dependency by @henryiii in #1017
- Include time on longer runs (adds
humanizedependency) by @henryiii in #1014
Internal:
2025.10.14 🥧
This release updates the default for the GitHub Action to target the current range of recommended Pythons (3.10-3.14). There's now a mechanism to control if nox downloads Python (even when not using uv). Several fixes include better free-threading support, custom filenames in script mode, and support for GitHub Actions Windows ARM runners.
We'd like to thank the following folks who contributed to this release:
- @agriyakhetarpal (first contribution)
- @henryiii
- @IvanIsCoding (first contribution)
- @jbdyn (first contribution)
- @johnthagen
- @saucoide
- @shenxianpeng (first contribution)
- @Spacetown (first contribution)
- @zzzeek (first contribution)
Features:
- Add
--download-pythonpython option by @saucoide in #989 - Add
session.env_dirto get the Path to the environment by @jbdyn in #974
Changes:
- GitHub Action 3.10-3.14 default by @henryiii in #1003
- Percolate the
verboseglobal option to thesilentargument for session installation commands, and document it by @agriyakhetarpal in #983 - Disallow abbreviated options by @henryiii in #973
- Log output of failed process by @jbdyn in #974
- Use a separate logging level (
SESSION_INFO) for session info instead of warning by @Spacetown in #990
Bugfixes:
- Support scripts with custom names by @henryiii in #1007
- Correctly match free-threaded python versions by @zzzeek in #999
- Let uv replace the directory instead of deleting it ourselves by @henryiii in #981
- Tighten type for
venv_backendby @henryiii in #967 - GitHub Actions Windows ARM support by @henryiii in #1002
- Show a warning (eventually error) if a duplicate session is encountered by @henryiii in #1013
- Fix validation error for
nox.options.keywordsby @henryiii in #1011
Documentation:
- Add
--scripttouv runinline metadata for nox-uv example by @johnthagen in #984 - Document
nox-uvthird party package by @johnthagen in #978 - Recommend
--lockedover--frozenforuv syncby @johnthagen in #972 - Tweak the grammar in a comment in tasks.py by @brettcannon in #987
- Add rustworkx as an example user by @IvanIsCoding in #975
- Update badge from black to ruff by @shenxianpeng in #971
Internal changes:
- Hide new coverage warning on 3.14 by @henryiii in #980
- Correct minimum versions and test by @henryiii in #962
- CI ensure there are no duplicate log handlers by @saucoide in #991
- Add 3.14 beta 1 support by @henryiii in #970
- Add better reprs for some internal classes by @henryiii in #966
- Drop Windows 2019 by @henryiii in #985
- Modernize and remove rc conda channel by @henryiii in #964
- Restore minimums test by @henryiii in #982
- Use dict instead of OrderedDict by @henryiii in #963
- Add conda marker to tests by @henryiii in #969
- Clear the registry in tests by @henryiii in #968
2025.05.01 🌸
This is a bugfix release that primarily adds support for uv 0.7+. A few other small fixes were made.
We'd like to thank the following folks who contributed to this release:
- @chirizxc
- @gschaffner
- @henryiii
- @living180
- @Spectre5 (first contribution)
Bugfixes:
uv versionis nowuv self version, respectUVby @henryiii and @Spectre5 in #955- Add
UV_PYTHONto disallowed vars by @henryiii in #959 - Never ignore URL dependencies in PEP 723 noxfiles by @gschaffner in #935
- Support forcing Python on parametrized session by @henryiii in #958
- Fix
conda_installissue with newer conda (only Unix) by @henryiii in #957 - Show skip reason by default by @chirizxc in #941
- Support
Pathfor envdir by @henryiii in #932 - Use Python 3.12 for action, allow 3.13, drop 3.8 from auto versions by @henryiii in #946
Documentation:
- Fix a typo in the changelog by @gschaffner in #936
- Update uv recipe by @henryiii in #933
- Fix parametrized session tagging example by @living180 in #942
- uv now supports
pip install .reinstallation by @henryiii in #947
Internal changes:
2025.02.09 💝
This release improves PEP 723 support, including adding dependencies to the noxfile itself ("plugins"). It adds the long-awaited "requires" option, allowing sessions to require other sessions. And it brings further improvements to the pyproject.toml support, including helpers for dependency-groups and Python version lists.
We'd like to thank the following folks who contributed to this release:
- @btemplep (first contribution)
- @chirizxc (first contribution)
- @davidhewitt (first contribution)
- @gschaffner (first contribution)
- @henryiii
- @oliversen (first contribution)
New features:
- Support PEP 723 noxfiles by @henryiii in #881
- Expose main as
nox.mainby @henryiii in #878 (followup fix: #884) - Support session dependencies (
requires) by @gschaffner in #631 - Helper to get dependency-groups by @henryiii in #876
- Helper to get the Python listing by @henryiii in #877
- Add a
"pyproject.toml"default forload_tomlby @henryiii in #917
Bugfixes:
- Correct virtualenv bin dir under mingw python by @davidhewitt in #901
- Allow
pypy-*to be used as well forpypy*(matching GHA) by @henryiii in #913 - Don't trigger a background update process for virtualenv by @henryiii in #918
- Include encoding for consistent behavior (default in Python 3.15+) by @henryiii in #891
- Outer env issues fixed by @henryiii in #874
- Support noxfile being a symlink by @henryiii in #829
- Drop PyPy from the default list for the GitHub Action by @henryiii in #916
Bugfixes related to uv support:
- Catch
PermissionErrorfrom popen when UV is not installed by @btemplep in #908 - Use
uv python installonly with uv backend by @oliversen in #900 - Handle
"uvx"like"uv"by @henryiii in #920 - Support broken uv (via pyenv) by @henryiii in #922
Tox-to-nox script:
- Drop support for tox 3 by @henryiii in #910
- Switch pkgutil for importlib-resources by @henryiii in #887
- Correctly separate command-line arguments by @chirizxc in #906
Improved noxfile validation:
- Error if invalid
reuse_venvset by @henryiii in #872 - Error with helpful message if invalid option is set via
nox.optionsby @henryiii in #871 (followup fix: #921) - Validate entries in
nox.config, too, using attrs by @henryiii in #880
Internal changes:
- Add more Ruff checks and fixes by @henryiii in #893
- Cleanup symlink noxfile code by @henryiii in #865
- Drop some type ignores for colorlog by @henryiii in #888
- Limit the visible items for tab completion by @henryiii in #889
- More typing and test improvements by @henryiii in #890
- Some extra simplifications from Ruff by @henryiii in #870
- Use dependency-groups by @henryiii in #873
- Pull out env creation into helper method by @henryiii in #912
- Pulled out
get_virtualenv& better typing by @henryiii in #882 - Fix broken mock on CPython 3.12.8+ in tests by @henryiii in #903
- Statically type tests by @henryiii in #894
- Use
tmp_pathinstead oftmpdirin tests by @henryiii in #895