Changelog

To be included in v0.2.0- (if present)

v0.2.0- [UNRELEASED DRAFT]

(2026-05-21)

Improved documentation

  • Updated the README quick starts, docs landing page, runnable example and API reference to use async with so copy-pasted code closes the resolver automatically instead of demonstrating the manual try/finally close – by @aiolibsbot.

    Related issues and pull requests on GitHub: #92.

  • Added a runnable examples/dual.py demonstrating AsyncDualMDNSResolver so the dual mDNS/DNS resolver has a copy-pasteable example alongside the existing single-resolver one – by @aiolibsbot.

    Related issues and pull requests on GitHub: #100.

  • Documented that mDNS resolution of .local names is not authenticated and should not be treated as a trust boundary, with guidance to use HTTPS with certificate verification (optionally certificate pinning or mTLS) for sensitive .local services and a note that mdns_timeout=0 or None restricts mDNS to the zeroconf cache – by @bdraco.

    Related issues and pull requests on GitHub: #102.

Contributor-facing changes

  • Added regression tests covering the cache-only behavior of AsyncMDNSResolver when mdns_timeout is 0 or None – by @aiolibsbot.

    Related issues and pull requests on GitHub: #93.

  • Added tests covering AsyncDualMDNSResolver’s concurrent mDNS/DNS merge for the AF_UNSPEC and AF_INET6 address families, which were previously only exercised for IPv4 – by @aiolibsbot.

    Related issues and pull requests on GitHub: #94.

  • Added a dual_mdns_resolver factory test fixture mirroring mdns_resolver so AsyncDualMDNSResolver tests can select mdns_timeout through the public constructor instead of poking private state – by @aiolibsbot.

    Related issues and pull requests on GitHub: #95.

  • Added regression tests pinning the mDNS routing boundary so near-miss hostnames (e.g. host.local.example.com or foo.localdomain) stay on the unicast DNS path instead of being misrouted to mDNS – by @aiolibsbot.

    Related issues and pull requests on GitHub: #96.

  • Added tests asserting the family, proto and flags fields of the ResolveResult entries returned by the mDNS resolvers, locking in that each result’s family follows the resolved address version rather than the query family – by @aiolibsbot.

    Related issues and pull requests on GitHub: #97.

  • Added regression tests pinning the mdns_timeout seconds-to-milliseconds conversion that AsyncMDNSResolver forwards to zeroconf’s async_request – by @aiolibsbot.

    Related issues and pull requests on GitHub: #101.


Released versions

v0.2.0

(2026-05-20)

Bug fixes

  • Matched the .local mDNS suffix case-insensitively so hostnames such as MyHost.LOCAL are routed through mDNS as required by RFC 6762 – by @aiolibsbot.

    Related issues and pull requests on GitHub: #65.

  • Cancelled the in-flight mDNS and DNS lookup tasks when AsyncDualMDNSResolver.resolve() is itself cancelled, so a cancelled lookup no longer orphans tasks that keep running against the shared zeroconf instance – by @bdraco.

    Related issues and pull requests on GitHub: #69.

  • Made resolver close() idempotent – a second call on a resolver that owns its AsyncZeroconf no longer raises AttributeError – by @aiolibsbot.

    Related issues and pull requests on GitHub: #74.

  • Stopped AsyncDualMDNSResolver from returning the same address twice when the mDNS and DNS resolvers agree on a .local name – by @aiolibsbot.

    Related issues and pull requests on GitHub: #87.

Features

Removals and backward incompatible breaking changes

  • Dropped Python 3.9 support; the minimum supported Python version is now 3.10 – by @bdraco.

    Related issues and pull requests on GitHub: #62.

Improved documentation

  • Corrected the public API module docstring (it described an unrelated project), fixed a grammar error in the package docstring, and normalized the indentation of the class directives in the API reference so the parameter lists render correctly, and added an intersphinx mapping to python-zeroconf so the async_zeroconf parameter cross-references resolve under the nitpicky docs build – by @aiolibsbot.

    Related issues and pull requests on GitHub: #67.

  • Fixed the README quick-start example leaking the resolver: a resolver passed to aiohttp.TCPConnector is owned by the caller, so it is now closed in a finally block – by @aiolibsbot.

    Related issues and pull requests on GitHub: #80.

  • Completed the documentation landing page: filled the empty Introduction section, added an installation snippet, and added a runnable usage example that closes the resolver in a finally block. Also fixed the same resolver leak in the AsyncMDNSResolver reference example – by @aiolibsbot.

    Related issues and pull requests on GitHub: #84.

  • Documented the resolve() and close() methods of AsyncMDNSResolver and AsyncDualMDNSResolver in the API reference, including the .local routing behaviour and the AsyncZeroconf ownership semantics of close() – by @aiolibsbot.

    Related issues and pull requests on GitHub: #85.

  • Added a usage example for AsyncDualMDNSResolver in the API reference and documented the family parameter of resolve() (socket.AF_INET, socket.AF_INET6 and socket.AF_UNSPEC). Also clarified that mdns_timeout=None is cache-only, the same as 0 – by @aiolibsbot.

    Related issues and pull requests on GitHub: #86.

  • Documented AsyncDualMDNSResolver in the README quick start so the landing page covers the full public API, not just AsyncMDNSResolver – by @aiolibsbot.

    Related issues and pull requests on GitHub: #89.

Packaging updates and notes for downstreams

  • The packaging metadata switched to including an SPDX license identifier introduced in PEP 639 – by @cdce8p.

    As a side effect, the minimum required version of setuptools increased to v77.

    Related issues and pull requests on GitHub: #36.

  • Fixed MANIFEST.in to graft the src/ tree and dropped references to the non-existent packaging/ directory and NOTICE file, removing spurious build warnings. The py.typed marker is now shipped explicitly via package-data, and the distribution advertises the Python 3.10–3.13, CPython, PyPy, and Typing :: Typed classifiers – by @aiolibsbot.

    Related issues and pull requests on GitHub: #68.

  • Added support for Python 3.14: the test matrix now runs against 3.14 and the distribution advertises the Programming Language :: Python :: 3.14 classifier – by @aiolibsbot.

    Related issues and pull requests on GitHub: #81.

Contributor-facing changes

  • Expanded the public-API regression test to cover AsyncDualMDNSResolver, api.__all__, and the aiohttp.resolver.AsyncResolver drop-in subclass guarantee for both resolvers.

    Related issues and pull requests on GitHub: #71.

  • Hardened the CI workflow: the default GITHUB_TOKEN is now restricted to contents: read, and a concurrency group cancels superseded in-progress pull request runs to conserve CI resources – by @aiolibsbot.

    Related issues and pull requests on GitHub: #72.

  • Enabled the mypy disallow_untyped_defs, disallow_incomplete_defs, and check_untyped_defs checks so that newly added functions in src/ and tests/ must carry complete type annotations – by @aiolibsbot.

    Related issues and pull requests on GitHub: #73.

  • Migrated CI runners from actions/setup-python to astral-sh/setup-uv so dependencies and Python interpreters are provisioned via uv instead of system pip – by @aiolibsbot.

    Related issues and pull requests on GitHub: #76.

  • Replaced the pyupgrade pre-commit hook with Ruff’s UP rule set so a single linter handles syntax modernization, targeting Python 3.10+ – by @aiolibsbot.

    Related issues and pull requests on GitHub: #78.


v0.1.1

(2025-02-14)

Miscellaneous internal changes

  • Improved MDNS resolver performance when the name is already in the cache – by @bdraco.

    Related issues and pull requests on GitHub: #27.


v0.1.0

(2025-02-05)

Features


v0.0.3

(2025-01-31)

Bug fixes

  • Fixed imports not being properly sorted – by @bdraco.

    Related issues and pull requests on GitHub: #21.


v0.0.2

(2025-01-30)

Miscellaneous internal changes

  • Migrated to using zeroconf’s built-in resolver classes – by @bdraco.

    Related issues and pull requests on GitHub: #19.


v0.0.1

(2025-01-05)

Initial release