New features:
- Enable `py::implicitly_convertible<py::none, ...>` for `py::class_`-wrapped types. [3059](https://github.com/pybind/pybind11/pull/3059)
- Allow function pointer extraction from overloaded functions. [2944](https://github.com/pybind/pybind11/pull/2944)
- NumPy: added `.char_()` to type which gives the NumPy public `char` result, which also distinguishes types by bit length (unlike `.kind()`). [2864](https://github.com/pybind/pybind11/pull/2864)
- Add `pybind11::bytearray` to manipulate `bytearray` similar to `bytes`. [2799](https://github.com/pybind/pybind11/pull/2799)
- `pybind11/stl/filesystem.h` registers a type caster that, on C++17/Python 3.6+, converts `std::filesystem::path` to `pathlib.Path` and any `os.PathLike` to `std::filesystem::path`. [2730](https://github.com/pybind/pybind11/pull/2730)
- A `PYBIND11_VERSION_HEX` define was added, similar to `PY_VERSION_HEX`. [3120](https://github.com/pybind/pybind11/pull/3120)
Changes:
- `py::str` changed to exclusively hold `PyUnicodeObject`. Previously `py::str` could
also hold `bytes`, which is probably surprising, was never documented, and can mask bugs (e.g. accidental use of `py::str` instead of `py::bytes`). [2409](https://github.com/pybind/pybind11/pull/2409)
- Add a safety guard to ensure that the Python GIL is held when C++ calls back into Python via `object_api<>::operator()` (e.g. `py::function` `__call__`). (This feature is available for Python 3.6+ only.) [2919](https://github.com/pybind/pybind11/pull/2919)
- Catch a missing `self` argument in calls to `__init__()`. [2914](https://github.com/pybind/pybind11/pull/2914)
- Use `std::string_view` if available to avoid a copy when passing an object to a `std::ostream`. [3042](https://github.com/pybind/pybind11/pull/3042)
- An important warning about thread safety was added to the `iostream.h` documentation; attempts to make `py::scoped_ostream_redirect` thread safe have been removed, as it was only partially effective. [2995](https://github.com/pybind/pybind11/pull/2995)
Fixes:
- Performance: avoid unnecessary strlen calls. [3058](https://github.com/pybind/pybind11/pull/3058)
- Fix auto-generated documentation string when using `const T` in `pyarray_t`. [3020](https://github.com/pybind/pybind11/pull/3020)
- Unify error messages thrown by `simple_collector`/`unpacking_collector`. [3013](https://github.com/pybind/pybind11/pull/3013)
- `pybind11::builtin_exception` is now explicitly exported, which means the types included/defined in different modules are identical, and exceptions raised in different modules can be caught correctly. The documentation was updated to explain that custom exceptions that are used across module boundaries need to be explicitly exported as well. [2999](https://github.com/pybind/pybind11/pull/2999)
- Fixed exception when printing UTF-8 to a `scoped_ostream_redirect`. [2982](https://github.com/pybind/pybind11/pull/2982)
- Pickle support enhancement: `setstate` implementation will attempt to `setattr` `__dict__` only if the unpickled `dict` object is not empty, to not force use of `py::dynamic_attr()` unnecessarily. [2972](https://github.com/pybind/pybind11/pull/2972)
- Allow negative timedelta values to roundtrip. [2870](https://github.com/pybind/pybind11/pull/2870)
- Fix unchecked errors could potentially swallow signals/other exceptions. [2863](https://github.com/pybind/pybind11/pull/2863)
- Add null pointer check with `std::localtime`. [2846](https://github.com/pybind/pybind11/pull/2846)
- Fix the `weakref` constructor from `py::object` to create a new `weakref` on conversion. [2832](https://github.com/pybind/pybind11/pull/2832)
- Avoid relying on exceptions in C++17 when getting a `shared_ptr` holder from a `shared_from_this` class. [2819](https://github.com/pybind/pybind11/pull/2819)
- Allow the codec's exception to be raised instead of `RuntimeError` when casting from `py::str` to `std::string`. [2903](https://github.com/pybind/pybind11/pull/2903)
Build system improvements:
- In `setup_helpers.py`, test for platforms that have some multiprocessing features but lack semaphores, which `ParallelCompile` requires. [3043](https://github.com/pybind/pybind11/pull/3043)
- Fix `pybind11_INCLUDE_DIR` in case `CMAKE_INSTALL_INCLUDEDIR` is absolute. [3005](https://github.com/pybind/pybind11/pull/3005)
- Fix bug not respecting `WITH_SOABI` or `WITHOUT_SOABI` to CMake. [2938](https://github.com/pybind/pybind11/pull/2938)
- Fix the default `Pybind11Extension` compilation flags with a Mingw64 python. [2921](https://github.com/pybind/pybind11/pull/2921)
- Clang on Windows: do not pass `/MP` (ignored flag). [2824](https://github.com/pybind/pybind11/pull/2824)
- `pybind11.setup_helpers.intree_extensions` can be used to generate `Pybind11Extension` instances from cpp files placed in the Python
package source tree. [2831](https://github.com/pybind/pybind11/pull/2831)
Backend and tidying up:
- Enable clang-tidy performance, readability, and modernization checks throughout the codebase to enforce best coding practices. [3046](https://github.com/pybind/pybind11/pull/3046), [#3049](https://github.com/pybind/pybind11/pull/3049), [#3051](https://github.com/pybind/pybind11/pull/3051), [#3052](https://github.com/pybind/pybind11/pull/3052), [#3080](https://github.com/pybind/pybind11/pull/3080), and [#3094](https://github.com/pybind/pybind11/pull/3094)
- Checks for common misspellings were added to the pre-commit hooks. [3076](https://github.com/pybind/pybind11/pull/3076)
- Changed `Werror` to stricter `Werror-all` for Intel compiler and fixed minor issues. [2948](https://github.com/pybind/pybind11/pull/2948)
- Fixed compilation with GCC \< 5 when the user defines `_GLIBCXX_USE_CXX11_ABI`. [2956](https://github.com/pybind/pybind11/pull/2956)
- Added nox support for easier local testing and linting of contributions. [3101](https://github.com/pybind/pybind11/pull/3101) and [#3121](https://github.com/pybind/pybind11/pull/3121)
- Avoid RTD style issue with docutils 0.17+. [3119](https://github.com/pybind/pybind11/pull/3119)
- Support pipx run, such as `pipx run pybind11 --include` for a quick compile. [3117](https://github.com/pybind/pybind11/pull/3117)