mDNS Browser

Discovering the Invisible…

Most of our devices talk to each other quietly over the network, advertising services via mDNS / DNS-SD. Printers, smart speakers, DAWs, and audio interfaces (like Dante) all announce themselves this way. But unless you’re running avahi-browse or dns-sd in a terminal, you don’t see these conversations.

I wanted a way to see those services live — and more importantly, to be able to inspect them in detail, filter them, and experiment with custom queries. That’s how this little tool, the Async mDNS Service Browser, came to life.


Why Another Browser?

There are already command-line tools and some GUIs for Zeroconf, but I kept running into problems:

  • Tools that only showed raw TXT records, not a nice overview.
  • No “one click” for common audio-related queries (like Dante).

So the goals were:

  • ✅ Use asyncio to avoid blocking and missing responses.
  • ✅ Provide a PyQt6 interface that updates in real time.
  • ✅ Have a quick and nice view on the service on my network
  • ✅ Add a Dante shortcut button because that’s what I need 90% of the time.

Under the Hood

The app is powered by python-zeroconf, specifically the newer AsyncZeroconf API. Instead of blocking calls, it runs an asyncio loop in a background thread and uses Qt signals to update the GUI safely.

Here’s the basic flow:

  1. Start an AsyncZeroconf instance, bound to either all interfaces or a specific one.
  2. Use an AsyncServiceBrowser to listen for _services._dns-sd._udp.local. — the directory of all service types.
  3. For each new type, spin up another browser to watch instances of that service.
  4. Resolve services asynchronously with async_get_service_info() so we don’t miss slow devices.
  5. Push results into the PyQt6 main thread, where they update a simple dual-list interface:
  • Left panel: service types
  • Right panel: services of the selected type

Clicking a service pops up a dialog with details like addresses, priority/weight, and TXT properties.


Features in Action

  • Automatic Discovery: See every service type on the network as it appears.
  • Filtering: Focus on one service type at a time.
  • Rescan Button: Clear and restart browsing instantly.
  • Manual Queries: Enter _http._tcp, _ssh._tcp, _netaudio._udp, etc.
  • Dante Shortcut: One button to query _netaudio._udp.local. because Dante won’t respond on service queries!


Try It Yourself

The project is open source (MIT licensed). Clone it, install dependencies, and run:

git clone https://github.com/WagenerHAW/mDNSBrowser.git
pip install -r requirements.txt
python src/app.py

or Download the pre-compiled binary for Windows or MacOS from

https://github.com/WagenerHAW/mDNSBrowser/releases

Microsoft executable release is right now only for v0.1a available, but there are only small improvements so no worries to use v0.1a

Then start browsing your network!


What’s Next?

I’m planning to:

  • Add favorites so I can pin common service types.
  • Improve the properties view (collapsible sections).
  • Add retry logic for devices that are slow to announce themselves.

Final Thoughts

This project started as a “scratch my own itch” tool for debugging Dante devices, but it turned into a handy network magnifying glass. It’s fascinating to see all the services that are just there on your LAN — from smart TVs to IoT gadgets.

If you’re curious about what’s chatting on your network, give it a spin. And if you want to contribute — the code’s waiting for you 😉

Categories:

Tags:

Comments are closed