Skip to content

Commit d22928d

Browse files
author
Your Name
committed
v1.0.0: Remove server category grouping, add TCP exposure panel & bind address badges, update README and packaging for release
1 parent 25d8299 commit d22928d

10 files changed

Lines changed: 400 additions & 542 deletions

File tree

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ jobs:
313313
PackageUrl: https://github.com/marlocarlo/psnet
314314
License: MIT
315315
LicenseUrl: https://github.com/marlocarlo/psnet/blob/master/LICENSE
316-
ShortDescription: A beautiful real-time TUI network monitor for Windows — built in Rust
316+
ShortDescription: A beautiful real-time TUI network monitor for Windows — 9 tabs, GeoIP, device discovery, firewall, topology
317317
Tags:
318318
- cli
319319
- monitor

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
[package]
22
name = "psnet"
3-
version = "0.3.0"
3+
version = "1.0.0"
44
edition = "2021"
5-
description = "A beautiful real-time TUI network monitor for Windows PowerShell — built in Rust"
5+
description = "A beautiful real-time TUI network monitor for Windows — 9 tabs, GeoIP, device discovery, firewall, topology & more"
66
license = "MIT"
77
repository = "https://github.com/marlocarlo/psnet"
88
homepage = "https://github.com/marlocarlo/psnet"

README.md

Lines changed: 216 additions & 192 deletions
Large diffs are not rendered by default.

choco/psnet.nuspec

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,25 @@
1616
<releaseNotes>$repoUrl$/releases</releaseNotes>
1717
<copyright>Copyright (c) 2026 PSNET Contributors</copyright>
1818
<tags>network monitor tui terminal windows rust cli wireshark sniffer connections speed</tags>
19-
<summary>A beautiful real-time TUI network monitor for Windows — built in Rust</summary>
19+
<summary>A beautiful real-time TUI network monitor for Windows — 9 tabs, GeoIP, device discovery, firewall, topology</summary>
2020
<description><![CDATA[## PSNET — See your network. Understand your network.
2121
2222
PSNET is a **zero-dependency** (no Npcap/WinPcap needed) TUI network monitor built in Rust for Windows.
23-
It gives you real-time visibility into everything happening on your network:
23+
A single 12 MB binary gives you 9 interactive tabs:
2424
25-
- **Live speed graphs** — sparkline waveforms for download and upload
26-
- **Smart connection table** — DNS-resolved hostnames, service labels, process names
27-
- **Traffic event log** — Wireshark-style connection lifecycle events
28-
- **Wire preview** — real packet payload inspection (requires Administrator)
29-
- **Beautiful dark theme** — consistent deep navy palette with Unicode box-drawing
25+
- **Dashboard** — GlassWire-style traffic graph, world map, health gauge, top apps/countries
26+
- **Connections** — live table with DNS hostnames, service labels, process names, TCP state
27+
- **Servers** — listening ports with 200+ fingerprinted services, TCP exposure panel, bind address badges
28+
- **Packets** — Wireshark-style packet inspector with protocol dissection, GeoIP, hex view
29+
- **Topology** — hub-and-spoke network diagram of your machine's connections
30+
- **Alerts** — categorized security alerts with severity and recommendations
31+
- **Firewall** — per-app firewall management (block/allow) with bandwidth stats
32+
- **Devices** — LAN device scanner with MAC vendor lookup (35,000+ OUI entries)
33+
- **Networks** — multi-adapter view (VPN, Docker, WSL, Hyper-V, Bluetooth)
34+
35+
Plus always-visible speed sparklines and wire preview (live packet payloads).
36+
37+
**Embedded databases:** GeoIP country (DB-IP), 200+ server fingerprints, 6,500+ Wappalyzer web technology signatures, 35,000+ MAC vendor prefixes.
3038
3139
### Quick Start
3240

src/app.rs

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -959,7 +959,7 @@ impl App {
959959
filtered.get(selected).map(|c| DetailKind::Connection((*c).clone()))
960960
}
961961
BottomTab::Servers => {
962-
let visible = self.servers_scanner.visible_servers();
962+
let visible = self.servers_scanner.filtered_servers();
963963
if visible.is_empty() { return; }
964964
let selected = self.servers_scanner.scroll_offset.min(visible.len() - 1);
965965
if let Some(s) = visible.get(selected) {
@@ -1140,17 +1140,10 @@ impl App {
11401140
}
11411141
}
11421142

1143-
/// Get the category of the currently selected server.
1144-
fn selected_server_category(&self) -> Option<crate::network::servers::types::ServerCategory> {
1145-
let visible = self.servers_scanner.visible_servers();
1146-
if visible.is_empty() { return None; }
1147-
let idx = self.servers_scanner.scroll_offset.min(visible.len() - 1);
1148-
Some(visible[idx].server_kind.category())
1149-
}
11501143

11511144
/// Get the exe_path of the currently selected server (if any).
11521145
fn selected_server_exe_path(&self) -> Option<String> {
1153-
let visible = self.servers_scanner.visible_servers();
1146+
let visible = self.servers_scanner.filtered_servers();
11541147
if visible.is_empty() { return None; }
11551148
let idx = self.servers_scanner.scroll_offset.min(visible.len() - 1);
11561149
let path = &visible[idx].exe_path;
@@ -1203,16 +1196,6 @@ impl App {
12031196
self.status_message = Some(("No executable path available".into(), Instant::now()));
12041197
}
12051198
}
1206-
// Collapse selected server's category
1207-
KeyCode::Left => {
1208-
if let Some(cat) = self.selected_server_category() {
1209-
self.servers_scanner.collapsed_categories.insert(cat);
1210-
}
1211-
}
1212-
// Expand all collapsed categories
1213-
KeyCode::Right => {
1214-
self.servers_scanner.collapsed_categories.clear();
1215-
}
12161199
KeyCode::Char('1') => {
12171200
self.servers_scanner.sort_column = 0;
12181201
self.servers_scanner.sort_ascending = !self.servers_scanner.sort_ascending;
@@ -1607,7 +1590,7 @@ impl App {
16071590
match self.bottom_tab {
16081591
BottomTab::Connections => self.conn_scroll = self.connections.len(),
16091592
BottomTab::Servers => {
1610-
self.servers_scanner.scroll_offset = self.servers_scanner.visible_servers().len().saturating_sub(1);
1593+
self.servers_scanner.scroll_offset = self.servers_scanner.filtered_servers().len().saturating_sub(1);
16111594
}
16121595
BottomTab::Alerts => {
16131596
if let Some((cat, count)) = self.focused_alert_cat() {

src/network/servers/mod.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ pub struct ServersScanner {
3737
pub sort_column: usize,
3838
/// Sort ascending.
3939
pub sort_ascending: bool,
40-
/// Collapsed categories in the UI.
41-
pub collapsed_categories: std::collections::HashSet<types::ServerCategory>,
4240
}
4341

4442
impl ServersScanner {
@@ -57,7 +55,6 @@ impl ServersScanner {
5755
scroll_offset: 0,
5856
sort_column: 0,
5957
sort_ascending: true,
60-
collapsed_categories: std::collections::HashSet::new(),
6158
}
6259
}
6360

@@ -229,13 +226,6 @@ impl ServersScanner {
229226
}
230227
}
231228

232-
/// Get servers filtered by text AND excluding collapsed categories (for selection).
233-
pub fn visible_servers(&self) -> Vec<&ListeningPort> {
234-
self.filtered_servers()
235-
.into_iter()
236-
.filter(|s| !self.collapsed_categories.contains(&s.server_kind.category()))
237-
.collect()
238-
}
239229

240230
}
241231

0 commit comments

Comments
 (0)