Every developer who works on Windows has faced the friction: you start a development server, only to be stopped by Error: listen EADDRINUSE :::3000. You open a terminal, run netstat -ano, filter through hundreds of sockets, locate the PID, and kill the process. Or you have four microservices running simultaneously across Vite, FastAPI, Redis, and Ollama, and you find yourself constantly typing localhost:5173, localhost:8000, and localhost:11434 into browser tabs.
We built PortPeek to make this friction vanish forever. PortPeek is an ultra-lightweight system tray utility for Windows that lives silently in your taskbar, automatically detects active development servers, identifies the owning process and framework, and lets you open or stop them in a single click.
Why We Rejected Electron and WebView2
When planning PortPeek, the standard modern path would have been to spin up an Electron or Tauri/WebView2 shell with React. But desktop utilities that live in your system tray 24/7 should not consume 150 MB of RAM or require a 120 MB installer just to display a context menu.
By choosing native Win32 and modern C++17, we achieved:
- ~500 KB standalone executable: No installer needed. Portable, instant copy-and-run.
- 0.0% idle CPU usage: Zero background polling loops. PortPeek sleeps until you click the tray or press the global hotkey.
- < 8 MB working RAM: Less memory than an empty Chrome tab.
- Sub-2ms cold reaction time: The menu renders instantaneously upon click.
Reading Windows TCP Tables with GetExtendedTcpTable
Traditional scripts parse netstat text output via regular expressions. This is slow (spawning subprocesses takes 100ms+ on Windows) and error-prone across Windows locales.
Instead, PortPeek calls the native Windows IP Helper API (Iphlpapi.dll) directly via GetExtendedTcpTable:
// Direct kernel table snapshot in PortPeek (sub-2ms execution)
DWORD size = 0;
GetExtendedTcpTable(NULL, &size, FALSE, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0);
auto pTcpTable = reinterpret_cast<PMIB_TCPTABLE_OWNER_PID>(malloc(size));
if (GetExtendedTcpTable(pTcpTable, &size, FALSE, AF_INET, TCP_TABLE_OWNER_PID_LISTENER, 0) == NO_ERROR) {
for (DWORD i = 0; i < pTcpTable->dwNumEntries; i++) {
DWORD port = ntohs((u_short)pTcpTable->table[i].dwLocalPort);
DWORD pid = pTcpTable->table[i].dwOwningPid;
// Process name & framework resolution
}
}
free(pTcpTable);
This query executes in under 2 milliseconds directly in memory, without disk I/O, subprocess spawns, or shell wrappers.
Intelligent Framework Auto-Detection
PortPeek doesn't just show bare port numbers like 3000 or 5173. It inspects the process image name and standard development signatures to show actionable labels:
- 3000 →
frontend [Next.js / React](Node.js) - 5173 →
dashboard [Vite](Node.js) - 8000 →
api [FastAPI / Django](Python) - 8080 →
backend [Spring Boot / Tomcat](Java) - 5432 →
database [PostgreSQL] - 6379 →
cache [Redis] - 11434 →
ollama [Local LLMs]
The Windows 11 Experience
We designed PortPeek to feel completely native to Windows 11. It respects system dark/light theme switching automatically, handles high-DPI scaling across multiple monitors, and provides a global keyboard shortcut:
Pressing this hotkey from anywhere — whether you are inside VS Code, Windows Terminal, or your browser — instantly opens the PortPeek menu at your cursor.
Privacy & Open Source
Developer tools must respect developer privacy. PortPeek contains zero analytics, zero telemetry, and zero outbound network connections. It operates 100% offline. The source code is open under the MIT License on GitHub.
Get Started
PortPeek v0.2.0 is available today. Download the standalone executable and drop it into your workflow:
Download PortPeek for Windows
Standalone ~500 KB executable • Windows 11 & 10 compatible
Download v0.2.0 (x64)