Find out what is actually connected to your network, keep a record of it, and get told when something changes.
Discovery Now scans a subnet you own, builds an inventory of every device it finds, and then keeps watching: it remembers when each device first appeared, flags the ones that are new, and reports when something goes offline, changes address, or opens a port it did not have yesterday.
It runs as a command-line tool and as a desktop app, both built on the same engine and sharing the same inventory.
Both screenshots use invented devices.
Status: early development (v0.1). The discovery engine, the inventory, the CLI and the desktop app work. The desktop app is built and tested on Windows, where it comes with an installer. The command line is tested on Windows and Linux. A Linux build of the app, richer notifications and the security checks listed in the roadmap are not built yet.
Most discovery tools ask for root or administrator because they craft raw ARP and ICMP packets themselves. Discovery Now does not:
- it sends ordinary pings through the system's own
pingcommand, and makes ordinary TCP connections, neither of which is privileged; - it then reads the ARP cache that those probes just caused the operating system to fill, which is where the MAC addresses come from;
- it adds this machine's own interfaces from the system tables, because a machine never ARPs for itself.
The result is the same picture, from a normal user account, on Windows and on Linux.
On Windows, without Python: download the installer (or the zip) from Releases and run it. See The desktop app.
From source (Windows or Linux), with Python 3.11 or newer:
git clone https://github.com/TrueScaleTech/discovery-local-devices.git
cd discovery-local-devices
python -m venv .venvThen activate the environment (.venv\Scripts\activate on Windows,
source .venv/bin/activate on Linux and macOS) and install:
pip install -e .For the desktop app, install the optional gui extra, which adds PySide6 (Qt):
pip install -e ".[gui]"# Which subnets would be scanned by default?
discoverynow interfaces
# Scan them, and remember what was found
discoverynow scan
# What is on the network?
discoverynow devices list
# Or skip the typing: browse every command and its options in a menu
discoverynow menu
# Or use the window
discoverynow guiA scan looks like this (example data):
7 device(s) on 192.168.1.0/24 (254 addresses probed in 15.4s)
┌──────────────┬───────────────────┬──────────────┬─────────────┬───────────────────┬──────────┐
│ Address │ MAC │ Name │ Vendor │ Kind │ Ports │
├──────────────┼───────────────────┼──────────────┼─────────────┼───────────────────┼──────────┤
│ 192.168.1.1 │ 00:04:0e:00:00:01 │ router.home │ AVM │ router or gateway │ 53, 80 │
│ 192.168.1.14 │ b8:27:eb:00:00:02 │ pi-hole │ Raspberry… │ single-board com… │ 22, 53 │
│ 192.168.1.22 │ 00:80:77:00:00:03 │ printer │ Brother │ printer │ 631,9100 │
│ 192.168.1.31 │ 24:0a:c4:00:00:04 │ - │ Espressif │ smart device │ 80 │
│ 192.168.1.44 │ 00:11:32:00:00:05 │ nas.home │ Synology │ NAS │ 445,5000 │
│ 192.168.1.60 │ ae:11:22:00:00:06 │ phone.home │ - │ phone │ - │
│ 192.168.1.88 │ 3c:97:0e:00:00:07 │ desktop.home │ Intel │ computer │ 139, 445 │
└──────────────┴───────────────────┴──────────────┴─────────────┴───────────────────┴──────────┘
new 192.168.1.31 Espressif
That phone has no vendor on purpose: its MAC is randomized, which Discovery Now recognises rather than guessing wrongly. Its kind comes from its name instead.
The Kind is a guess, shown as one, made from whatever the device gives away. The clues are weighed from the strongest to the weakest:
- The ports it answers on: a printing port is a printer, DNS plus a web page is a router, and so on.
- The name it gives itself:
phone,iphone,tablet,laptop,macbook,desktop,printer,camera,nas,tvand a few more. Longer words are found anywhere in the name (ana-sphoneis a phone); short ones only as a whole word, socanastais not a NAS. A WindowsDESKTOP-xxxxname only says computer, because Windows gives that name to laptops too. - The company that made its network chip, from the built-in list.
- The shape of what it exposes: file sharing, SSH, a web interface.
- Last of all, if none of that says anything and the device chose its own MAC address, the Kind reads Private address auto-assigned. It describes the address, which is all that is known, rather than guessing a type.
A device with none of these clues stays unknown. The Kind is only a hint: to keep
track of a device whatever it is called, give it a name of your own with
discoverynow devices rename.
The first three bytes of a MAC address identify the company that made the network chip. Discovery Now carries a short list of the makers you are most likely to meet at home or in a lab (routers, access points, Raspberry Pi, ESP32 smart plugs, printers, NAS boxes, phones and consoles) and uses it to fill the Vendor column.
- The list is part of the program. It is read locally, and Discovery Now never downloads anything.
- A vendor that is not on the list simply shows as unknown.
- Phones and laptops that randomize their MAC address have no vendor on purpose: the address was made up by the device, so there is no maker to name.
discoverynow watchIt scans every five minutes and prints only what changed:
2026-01-14 21:05 7 online (15.1s)
new 192.168.1.31 Espressif
offline 192.168.1.22 printer
A device is not called offline the first time it misses a scan. Phones sleep and wifi drops frames; three missed rounds in a row mean something, one does not. The threshold is yours to set.
A fresh inventory is a list of strangers. These turn it into something you can read at a glance, and keep a new arrival from hiding in a crowd of known devices:
discoverynow devices rename 192.168.1.44 "NAS"
discoverynow devices note 192.168.1.31 "Smart plug, living room"
discoverynow devices approve NAS
discoverynow devices list --unapprovedApproving is a statement that a device belongs here. Everything you have not approved stays flagged, so "I have never looked at this" never looks the same as "this is mine".
discoverynow guiOr install it without Python at all: every release carries a Windows installer and a zip, under Releases.
The window shows the same inventory as the command line, from the same database and the same settings file, so the two can be used side by side. Four screens, down the left:
Every device in a table you can sort by any column, filter with the buttons above
it (All, Online, Offline, New, Not approved, each carrying its count) and search
by name, address, MAC, vendor, guessed kind or notes. A device that has just
appeared wears a NEW tag until it is approved or the new-device window passes,
whichever comes first.
Select a row to see everything known about that device on the right, and to give it a name, write a note, approve it or forget it. Right-click a row to copy its address or MAC, or to find it on the map; right-click a column heading to choose which columns the table shows.
Select several rows (ctrl-click, or shift-click for a run of them) and a bar appears above the table: approve them all at once, withdraw approval, or forget them together. This is the quick way to go through everything a first scan found.
A map of the network: the router in the middle, everything else around it, grouped so that devices of the same kind sit together. Each node carries its kind, whether it is online, whether it is new, and an amber dot while it is not approved.
Drag the background to move around, scroll to zoom, double-click the background to fit everything. Drag a circle to put it where you want it: the position is remembered between runs, and Reset layout gives the map's own placement back. Click a node to see what it is and approve it from there; double-click it to open it in the Devices list.
What the map claims is worth being clear about. Discovery Now never sees which switch port a device is plugged into, so it cannot draw the real wiring. What it can see is the gateway (from the system's own routing table, falling back to working it out from the devices themselves) and that a home network is normally one flat segment behind it. That is what the map shows.
The history of everything that happened, newest first: devices discovered, gone offline, back online, changed address, opened or closed ports.
- Appearance. Follow the system, or pin light, dark or black (true black for OLED screens). Six accents. A change applies at once.
- Scanning. Scan on its own, from every minute to every hour. Which networks
to scan, whether to look up names, how many missed scans mean a device is
offline, how long the
NEWtag lasts. These are kept inconfig.toml, the same file the command line reads, so changing one here changes it for both. - Alerts and privacy. Whether to be told about a new device, and whether exports hide private details.
- Files. Where the settings and the inventory live, with a button to open each.
Shortcuts: F5 scan now, Ctrl+F search, Ctrl+1 to Ctrl+3 for the first
three screens, Ctrl+, for the settings.
What the window remembers (its size, the columns you hid, the appearance, the
scan interval) is kept in gui.ini next to the configuration file, not in the
Windows registry.
.\packaging\build-windows.ps1This produces dist\DiscoveryNow\DiscoveryNow.exe, a zip of the folder, and,
when Inno Setup is installed, the installer
too. Pass -NoInstaller to skip it.
If the repository sits deep inside nested folders, pass a short output path
(-OutDir C:\dn-build): Windows stops at 260 characters unless long paths are
switched on.
The installer puts the app in the current user's own folders, so it asks for no
administrator rights, and it leaves the inventory and the settings alone when it
uninstalls. Neither the installer nor the .exe is signed, so Windows SmartScreen
will warn the first time one is run.
Pushing a tag (git tag vX.Y.Z && git push origin vX.Y.Z) builds all of this on
a clean Windows machine, checks that the packaged app really starts and scans,
and attaches the files to a draft release.
discoverynow menuIf you would rather browse than remember, the menu lists every command, lets you fill in any of its options, and runs the result. Nothing in it is a separate feature: each entry runs the ordinary command, and the exact command line is shown as you build it, so the menu is also a quick way of learning the CLI.
scan
Scan the network once and record what is there.
--subnet, -s 192.168.1.0/24
--timeout not set
> --workers 32
--no-dns off
--no-store off
--json off
--fail-on-new off
Run run it with the values above
Show help what the command prints for --help
Back
Parallel probes.
Accepts: a whole number
discoverynow scan --subnet 192.168.1.0/24 --workers 32
| Key | What it does |
|---|---|
Up / Down (or k / j) |
Move the cursor |
| Enter | Open a command or group, edit the option under the cursor, or press a button |
| Backspace / Delete | Clear the value of the option under the cursor |
| Esc or Left | Go back one screen. On the first screen, leave the menu |
q |
Leave the menu from anywhere |
| Ctrl+C | Leave the menu, or stop a running command such as watch |
How the options behave:
- On/off options (
--json,--force) flip each time you press Enter. - Either-way options (
--online/--offline) cycle through not set, the first and the second. - Options with a fixed list of values (
--format) open a small list to pick from. - Everything else asks you to type the value. Numbers are checked as you type them, and an empty answer clears the option.
- Options you can repeat (
--subnet) ask for one value per line; an empty line ends the list. - Options marked
*are required: Run will not start until they are filled in. - Global options at the bottom of the first screen (the
--configfile) are added to every command you run from the menu. - A command remembers what you set while the menu is open, so you can run it again with a small change.
After a command runs, its output stays on screen until you press a key, so there is
time to read it. Show help on any command prints what --help would.
The menu needs a real, interactive terminal. If the output is piped or redirected it says so and stops; the ordinary commands work everywhere.
The menu reads its commands and options from the command line itself instead of describing them a second time, so anything added to the CLI appears in the menu without further work.
discoverynow export # CSV to the terminal
discoverynow export -o devices.csv # CSV file, opens straight in Excel
discoverynow export -o devices.json # JSON, picked from the extension
discoverynow export --unapproved --redact -o to-share.csvThe same filters as devices list apply (--online, --offline, --new,
--unapproved). With no -o the data goes to the terminal and nothing else does,
so it can be piped. An existing file is never overwritten unless you pass --force.
An inventory is a record of a real home, and an export is where it can leave your
machine. Before sharing one, use --redact: it hides the unique half of every
MAC address (00:11:22:xx:xx:xx) and removes hostnames, labels and notes, and it
replaces each device name with device-<number>. The vendor, address, open ports
and state stay, which is what someone helping you troubleshoot needs.
CSV cells that a spreadsheet would run as a formula (a hostname that starts with
=, for instance, which a device on a hostile network can choose for itself) are
defused with a leading apostrophe.
| Command | What it does |
|---|---|
scan |
Scan once and record what is there |
watch |
Keep scanning on a schedule, reporting changes |
status |
Counts: known, online, offline, new, not approved |
interfaces |
The local interfaces and what would be scanned |
events |
Recent history across all devices |
export |
Write the device list to a CSV or JSON file |
menu |
An interactive menu over every command and option |
gui |
Open the desktop app (needs the gui extra) |
devices list |
The inventory, with --online, --new, --unapproved |
devices show |
Everything known about one device, with its history |
devices rename / note / approve / forget |
Annotate the inventory |
config init / show / path |
The configuration file |
Every command that shows something accepts --json, so the same tool serves a
person reading a table and a script reading a pipe. scan --fail-on-new exits
with status 3 when an unknown device appears, which is enough to drive a cron job
or a CI step.
discoverynow config init # writes a commented file
discoverynow config path # says where it isWorth knowing about:
| Setting | Default | Meaning |
|---|---|---|
subnets |
auto | Which subnets to scan. Empty means the active interfaces |
offline_after |
3 | Missed scans before a device counts as offline |
new_device_days |
7 | How long a device keeps its "new" badge |
watch_interval |
300 | Seconds between scans in watch mode |
timeout / workers |
1.0 / 128 | How patient and how parallel the probes are |
allow_public_ranges |
false | Refuse anything outside private address space |
One SQLite file, in the per-user data directory that discoverynow status
prints. It holds MAC addresses, hostnames and the history of your network, so
treat it as personal data: it never leaves the machine, there is no telemetry and
no cloud component, and the repository is set up to make committing it difficult.
Nothing of the sort ships with the program. The repository, the installer and the zip contain no inventory and no settings: a new install starts with an empty list, and its first scan builds yours.
Discovery Now is for networks you own or are authorized to assess. It identifies hosts and the services they expose; it never authenticates, never exploits, and never changes anything on the devices it finds. Addresses outside private ranges are refused unless you turn that off deliberately. See SECURITY.md.
- Discovery engine, inventory, online/offline monitoring, CLI
- Interactive menu, and export with the private details removed
- Desktop app: devices, topology map, activity, settings, themes
- Windows installer and portable zip, built and attached to every release
- Desktop app for Linux (packaging and a release build)
- A code-signed Windows installer, so SmartScreen stops warning
- Notifications: device offline, webhook, and richer desktop alerts
- Security checks: MAC and IP changes, ARP anomalies, rogue DHCP, risky ports
pip install -e ".[dev,gui]"
ruff check . && ruff format --check . && mypy && pytestThe test suite needs no network and no display: it parses captured command output,
talks to loopback sockets, runs the inventory against temporary databases, and
drives the desktop window on Qt's invisible offscreen platform. The window's
tests skip themselves when PySide6 is not installed.

