Top
Best
New

Posted by rvermeulen98 1/23/2026

Show HN: Whosthere: A LAN discovery tool with a modern TUI, written in Go(github.com)
278 points | 89 commentspage 3
Anonbrit 1/23/2026|
It says 'Open ports: (None)' for all devices on my network, despite there being open ports on many of them (MacOS Tahoe 26.2 / installed via go)
rvermeulen98 1/23/2026|
It doesn't start port scanning by default, maybe this is a feature I can build in the future. When you are on the `detail` view of a device, you can press `p` and that will open a pop-up to perform the port scan. Also the list of ports that will be scanned is a default list of common ports, and can be configured via the configuration yaml.
47282847 1/23/2026||
In that case maybe print something different for unscanned hosts than „Open ports: None“?

Nice tool!

sneak 1/23/2026||
Love it! I already have some ideas for additional improvements, might jump in and contribute a PR or two.

Great work.

est 1/23/2026||
I hope browsers could support mDNS or SSDP. We need an Intranet browser!
coolius 1/23/2026||
this is great! i had to tweak the config file on macos because it was using some weird interface (utun4) instead of en0. otherwise awesome tool, i am definitely going to be using this more often.
rvermeulen98 1/23/2026|
Thanks, I am glad you like it! I couldn't find a Go API that just returns the OS "default" network interface, so struggled a bit with a correct implementation for that part.

When reading some blog posts, I found often a solution where it sends out an UDP dial to for example 8.8.8.8:53 because you can then get the network interface back from the connection it's local address. As fallback I implemented to pick the first non-loopback interface that is up.

Would be open to suggestions to do this in a better way!

fellerts 1/23/2026||
I think this package does exactly what you need: https://pkg.go.dev/github.com/google/gopacket/routing. Works on my machine (error handling left to the reader)

    router, _ := routing.New()
    iface, _, _, _ := router.Route(net.ParseIP("8.8.8.8"))
    fmt.Println(iface.Name)
this prints my Ethernet interface as expected. It doesn't make any requests, it just figures out where to route a packet. I guess it interfaces with the OS routing table.
rvermeulen98 1/23/2026||
Thanks for sharing! This is definitely something I will look into, I am all in favor to simplify the current implementation of finding the "default" OS network interface.
contingencies 1/23/2026||
You'd better use the default route and not some random IP, particularly DNS IPs which people often meddle with.

  # IPv4 default route only
  uname
  Darwin$ route -n get 0.0.0.0 | grep interface | cut -d ':' -f2
  Linux$ route -nv  |grep ^0.0.0.0 | awk '{print $NF}'
fulafel 1/24/2026||
Seems IPv4-only, which most LANs aren't since a good while.
SturgeonsLaw 1/24/2026|
You might be fortunate enough to work in forward-thinking workplaces, because I see very little IPv6 adoption outside of mobile. I work with a lot of small/medium business clients and pretty much all of them are still on some flavour of RFC1918 behind NAT
fulafel 1/24/2026||
Have a look at the traffic on your network with tcpdump, you might be surprised what's going on even if you don't have IPv6 internet connectivity.

But yeah, bigcorp managed networks still often make do with v4 routing only. Besides mobile, homes and SOHO are more likely to have current internet access.

pimlottc 1/23/2026||
I read the title as "W host here"
dalton_zk 1/24/2026||
Great tool, I will test the tool
spacecadet 1/24/2026|
Neat! Others have pointed out nmap, but hey, a project may look similar at first but evolve into something entirely different. For a few years I have slowly worked on a network analysis tool. It started out as a way to learn a few concepts better, make a prettier TUI app, but has turned into a tool I use for work as needed. I have never shared it here, https://github.com/derekburgess/jaws
More comments...