v0.3.1
A bug-fix release. Most of it was found by using the desktop app on a real network rather than by reading the code, and the rest by an assessment run before tagging; the recurring theme is code that reported success while doing nothing.
Fixed
- Pinging your own machine no longer reports 100% loss. On Windows,
ping 127.0.0.1— and the machine's own LAN address — timed out while the systempinganswered immediately. Two causes stacked up: raw ICMP sockets need administrator rights, so an ordinary run fell back to TCP probes on ports 80/443/22 and concluded a host was down when nothing answered; and a Windows raw socket does not observe traffic to an address the host owns. Windows now sends echoes through the IP Helper API, which needs no privileges and reaches local addresses. Discover and sweep both start from a ping sweep, so both returned nothing for any range covering this host. - IPv6 hosts can be pinged.
ping ::1reported total loss because IPv6 had no ICMP path at all and fell through to the same TCP probe. Windows now usesIcmp6SendEcho2. - A fresh install no longer runs one probe at a time.
Number(null)is0and passes anisFinitecheck, so reading an unset preference produced a stored zero rather than the default: max concurrent probes came out as 1 instead of 256, serialising every scan, discover and sweep. Traffic precision had the same fault, showing no decimals. Profiles already left at 1 by the broken build are repaired once on upgrade. - Discover reports devices the OS already knows about. Results now merge probe replies with the neighbour table, so a device that answers ARP but not ICMP is no longer missing. Each host records whether it was found by probe or by neighbour, since a stale neighbour entry can outlive the device.
netscli arp --clearno longer claims to have cleared the table when it has not.arp -d *on Windows prints "The requested operation requires elevation" and then exits 0, so checking the exit status alone reported success while nothing was touched. It now fails, with the reason, and a non-zero exit.- The settings dialog is centred on the window, and its Max Concurrent Probes control is themed rather than rendering in the WebView's default 3D-bevelled controls with duplicate spin arrows.
- Menu items in the run options popover respond to clicks. An unrecognised popover was torn down by the global dismissal handler before its own item could fire, so the item did nothing, threw nothing and logged nothing.
netscli arp --addand--deleteno longer claim to have changed the table when they have not. The same fault as--clearabove, in the two functions beside it:arp -sandarp -dalso print "The requested operation requires elevation" and exit 0, so an ordinary run printed "ARP entry added for 192.0.2.77" — and"ok": truein JSON — having done nothing. All three now share one check.--clearalso returns an error on platforms where it was never implemented, instead of reporting a cleared table.- The MCP server no longer says it returned everything while truncating. A capped result reported the byte count as its item count, so a 40,000-row scan that returned 11,518 rows said
returned: 40000, total: 40000besidetruncated: true. - Packet captures fetched as a background MCP job are bounded like every other result.
get_pcap_capture_resultwas routed before the limits that strip and truncate remote text, so the one result made entirely of bytes off the wire was the one that skipped them — while the blockingcapture_pcapbeside it was capped. - A database written by a newer netscli is refused rather than read. The version check treated a future schema as "already migrated", so an older build queried tables it had never seen.
- The Exit item no longer flashes red on the way out, and Packet Capture is greyed with an explanation rather than hidden on builds without capture support.
- The desktop app describes how each host was found. A discover row from the neighbour table is no longer labelled as having responded to a probe, and the table carries a column for it rather than burying it in the detail pane.
- winget publishes the version number, not the tag. Both package manifests were passed the tag including its
v, which the action only strips when the input is left empty. This is not hypothetical:v0.2.2throughv0.2.6are already in the public catalog that way, sowinget show netsclireports a version this project never issued, and the CLI reads inconsistently beside the desktop package's0.2.6. Upgrades still work — winget normalises a leadingvwhen comparing — and the next correctly-numbered release fixes what is displayed. The publish job now assertsMAJOR.MINOR.PATCHrather than trusting the strip, because winget-pkgs accepted all five without complaint and a merged manifest is permanent. The same two jobs would also have failed on the documented re-run path, looking for a release taggedmain.
Added
- Clear ARP table, then discover. A chevron beside Run offers a cache-flushing variant on discover, sweep and the ARP tab — the tools where a stale neighbour entry changes the answer. Clearing needs administrator rights; when it fails the run is suppressed rather than quietly returning the stale entries it was meant to drop.
- Right-click a tab to close it, its neighbours, or all of them. Close, close others, close to the right, close to the left, close all. Every item acts on the tab you clicked rather than the active one — those are often different — and anything that would do nothing is greyed rather than hidden, so the menu keeps its shape wherever you open it. Closing cancels whatever those tabs were running.
Changed
- The app opens on Discover rather than Scan. The first useful question on an unfamiliar network is what is on it, and a scan needs a host you do not have yet.
- Completion notifications only appear for tabs you are not looking at. On the visible tab the result arriving in the table already says the run finished. Failures still report unconditionally.
- Dependency updates:
pcap2.4 → 2.5,astro,lucide-react,vitest,@axe-core/cli, and the vite/rollup group.
Website
- The install guide has the verification steps the landing page promises. It advertised checksums and Sigstore signatures "see the install guide for verification steps" and linked to a page with none of them on it.
- The changelog no longer dates a release that has not happened. An entry marked "Not yet released" was rendered beside a publication date taken from this file's own heading.
- The docs table of contents is back in the right-hand rail. It had been moved under the page hero at every width, which is the mobile layout applied to desktop.
- Release notes are in the page rather than painted in by script, so the changelog reads with JavaScript disabled and does not flash "Loading".
- The website's colours are now covered by the contrast gate, which had been measuring the desktop app's palette and reporting a pass for both.
- Docs pages are evenly padded. The page frame was always centred, but the two rails inset their text differently — the section list started 84px from the edge while the contents list ended 40px from it. Both use the same inset now, and the contents rail is wider so it did not lose its text to the change.
- Headings are sized for reading rather than for a poster. They were 42px and 35px against 16px body text; they are 34, 26 and 21 now.
- Anchor links move to the heading instead of jumping past it. Following a contents link or a shared deep link landed the heading behind the sticky header, because the docs never loaded the rule that prevents it.
- The left nav's hover highlight lines up with the current page's. Only the current item sat on the rail, so hovering anything else drew a highlight inset from it by 9px.
- The theme selector shows keyboard focus, and its dropdown is legible. Focus produced the hover treatment and removed the background rather than drawing a ring, and the list itself was set in a translucent colour the platform will not use, so it fell back to the browser default.
- The search button and the menu button match, and the breadcrumb separators sit level with their text.
- Search fills the screen on a phone. The results stopped 151px above the bottom, Cancel sat level with the middle of the results rather than with the field, and the clear control floated short of the field's edge.
- The install section leads with
winget install netscli. The prominent command was acurl … | bashpipeline until JavaScript ran, and stayed one for anyone without it. The panel also lost a Cargo row repeated on all three platforms and a hash note repeated four times in one panel, and the direct-download button is no longer the loudest control in a section where it is the least verified route. - The interface coverage table says what it means. Yes/No became ticks and dashes with a legend, and the page now says that the CLI, terminal UI and MCP server are one binary rather than three programs — a dash in the MCP column never meant a second install. Rows that conflated two things (setup with doctor, reading the ARP table with changing it) are split, and dashes that meant "not applicable" say which.
- The FAQ answers two questions people actually search for, from the Search Console data rather than guesswork: whether there is a
netscancommand, and whether this replaces nmap and has a terminal UI.