<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Laksopan Ravindran</title>
    <description>The latest articles on DEV Community by Laksopan Ravindran (@_laksopan23_).</description>
    <link>https://dev.to/_laksopan23_</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3743143%2F78da85a9-d01d-439f-899c-a2044b515e27.jpeg</url>
      <title>DEV Community: Laksopan Ravindran</title>
      <link>https://dev.to/_laksopan23_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_laksopan23_"/>
    <language>en</language>
    <item>
      <title>I Built a Cross-Platform Port Intelligence Tool to Stop Accidental Process Kills During Local Dev</title>
      <dc:creator>Laksopan Ravindran</dc:creator>
      <pubDate>Thu, 21 May 2026 17:14:19 +0000</pubDate>
      <link>https://dev.to/_laksopan23_/i-built-a-cross-platform-port-intelligence-tool-to-stop-accidental-process-kills-during-local-dev-5gkj</link>
      <guid>https://dev.to/_laksopan23_/i-built-a-cross-platform-port-intelligence-tool-to-stop-accidental-process-kills-during-local-dev-5gkj</guid>
      <description>&lt;p&gt;Every developer has seen this at 2 AM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Error: listen EADDRINUSE: address already in use :::5173
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The usual workflow? Open a terminal, run &lt;code&gt;netstat&lt;/code&gt; or &lt;code&gt;lsof&lt;/code&gt;, copy the PID, run &lt;code&gt;kill -9&lt;/code&gt;. Simple enough — until you grab the wrong PID and accidentally terminate a critical database daemon, a Docker proxy, or a core OS service. Suddenly your machine is freezing and you're wondering what just happened.&lt;/p&gt;

&lt;p&gt;I got tired of that workflow and built &lt;strong&gt;PortIntel&lt;/strong&gt; — a cross-platform port intelligence tool with embedded offline ML, a safety override engine, and a clean visual UI. Here is a deep dive into how it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is PortIntel?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PortIntel&lt;/strong&gt; is an offline-first, cross-platform port intelligence tool and safe process termination supervisor built with &lt;strong&gt;Tauri v2 (Rust)&lt;/strong&gt; and &lt;strong&gt;React/TypeScript&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike a generic port scanner, it embeds an &lt;strong&gt;offline Decision Tree ML classifier&lt;/strong&gt; directly into the Rust binary that evaluates every active socket and tells you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Importance Category&lt;/strong&gt; — Is this port running a system-critical service, a dev workload, or something unknown/suspicious?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Termination Safety&lt;/strong&gt; — Is it safe to kill this process, or will doing so crash your system?&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Laksopan23/PortIntel" rel="noopener noreferrer"&gt;https://github.com/Laksopan23/PortIntel&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;PortIntel uses a clean decoupled architecture — a React frontend talking to a Tauri/Rust backend over IPC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────┐
│     React / TypeScript UI           │
│  (Vite + Tailwind CSS)              │
└───────────────┬─────────────────────┘
                │ Tauri IPC Commands
┌───────────────▼─────────────────────┐
│         Rust Backend (Tauri v2)     │
│                                     │
│  ┌─────────────────────────────┐    │
│  │  Socket Scanner             │    │
│  │  netstat/tasklist (Windows) │    │
│  │  lsof (macOS / Linux)       │    │
│  ├─────────────────────────────┤    │
│  │  ONNX ML Classifier         │    │
│  │  (tract-onnx, fully offline)│    │
│  ├─────────────────────────────┤    │
│  │  Safety Override Engine     │    │
│  │  (hard-coded kernel guards) │    │
│  ├─────────────────────────────┤    │
│  │  HTTP Daemon (tiny_http)    │◄───┼── Browser Extension / CLI
│  │  http://127.0.0.1:12200     │    │
│  └─────────────────────────────┘    │
└─────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The ML Classifier — 100% Offline Inference
&lt;/h2&gt;

&lt;p&gt;This is the core of PortIntel. Instead of a dumb blocklist, every active socket is evaluated by a &lt;strong&gt;Decision Tree Classifier&lt;/strong&gt; trained in Python (scikit-learn) and compiled directly into the Rust binary using &lt;code&gt;tract-onnx&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature Vector
&lt;/h3&gt;

&lt;p&gt;For each active socket, a 4-dimensional feature vector is constructed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="nx"&gt;port_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// e.g. 5173, 5432, 80&lt;/span&gt;
  &lt;span class="nx"&gt;is_system_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// 0 or 1 (root/SYSTEM)&lt;/span&gt;
  &lt;span class="nx"&gt;process_category_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="c1"&gt;// 0–18 (mapped from process name)&lt;/span&gt;
  &lt;span class="nx"&gt;operating_system&lt;/span&gt;       &lt;span class="c1"&gt;// 0 = macOS/Linux, 1 = Windows&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Two Output Models
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Model 1 — Importance Classification:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt; — CRITICAL&lt;/td&gt;
&lt;td&gt;System-level services (RPC, spooler, resolver)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; — DEVELOPMENT&lt;/td&gt;
&lt;td&gt;Dev servers, local DBs, Node/Vite/Django&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;2&lt;/code&gt; — UNKNOWN&lt;/td&gt;
&lt;td&gt;Unidentified, non-standard bindings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Model 2 — Termination Safety:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;0&lt;/code&gt; — SAFE_TO_KILL&lt;/td&gt;
&lt;td&gt;Safe to terminate to free port resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;1&lt;/code&gt; — DANGEROUS_TO_KILL&lt;/td&gt;
&lt;td&gt;Termination could destabilize the system&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Training the Model
&lt;/h3&gt;

&lt;p&gt;The model training pipeline is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;numpy scikit-learn skl2onnx
python train_model.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This outputs two ONNX files directly into &lt;code&gt;src-tauri/assets/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;port_classifier_importance.onnx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;port_classifier_safety.onnx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These get compiled directly into the Tauri binary at build time — &lt;strong&gt;no external files, no cloud API, no network required.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Safety Override Engine
&lt;/h2&gt;

&lt;p&gt;Even if the ML model outputs &lt;code&gt;SAFE_TO_KILL&lt;/code&gt;, a second hard-coded safety layer kicks in. The Rust backend checks every kill request against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System PIDs&lt;/strong&gt; (typically ≤ 100) — always blocked&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core executables&lt;/strong&gt; — &lt;code&gt;svchost.exe&lt;/code&gt;, &lt;code&gt;lsass.exe&lt;/code&gt;, &lt;code&gt;wininit.exe&lt;/code&gt;, &lt;code&gt;services.exe&lt;/code&gt;, &lt;code&gt;smss.exe&lt;/code&gt;, &lt;code&gt;csrss.exe&lt;/code&gt;, &lt;code&gt;winlogon.exe&lt;/code&gt;, &lt;code&gt;spoolsv.exe&lt;/code&gt;, &lt;code&gt;launchd&lt;/code&gt;, &lt;code&gt;init&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System/root users&lt;/strong&gt; — sockets registered under system namespaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of these match, the &lt;strong&gt;Kill&lt;/strong&gt; button is disabled in the UI entirely. Instead, the user sees a contextual advisory suggesting safer alternatives (gracefully stopping a service, pausing a Docker container, etc.).&lt;/p&gt;

&lt;p&gt;This dual-layer approach — ML + hard overrides — ensures PortIntel never causes a BSOD or system freeze.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Comprehensive Socket Scanning
&lt;/h3&gt;

&lt;p&gt;Real-time detection of active TCP/UDP bindings on all platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;netstat&lt;/code&gt; + &lt;code&gt;tasklist&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS/Linux&lt;/strong&gt;: &lt;code&gt;lsof&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Project-Centric Workload Grouping
&lt;/h3&gt;

&lt;p&gt;Ports are automatically categorized into logical groups:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web Dev&lt;/td&gt;
&lt;td&gt;Vite (:5173), Next.js (:3000), React DevServer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Databases&lt;/td&gt;
&lt;td&gt;PostgreSQL (:5432), MySQL (:3306), Redis (:6379)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;Container proxies, daemon sockets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System Daemons&lt;/td&gt;
&lt;td&gt;RPC, spooler, Bonjour, DNS resolver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Utilities&lt;/td&gt;
&lt;td&gt;Language servers, build tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Offline Diagnostic Advisor Panel
&lt;/h3&gt;

&lt;p&gt;Every port has a detail-rich inspector showing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Socket context and process category&lt;/li&gt;
&lt;li&gt;ML-based security assessment&lt;/li&gt;
&lt;li&gt;OS-native command alternatives to stop the process safely&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Background HTTP API Daemon
&lt;/h3&gt;

&lt;p&gt;When running, PortIntel spins up a micro HTTP server at &lt;code&gt;http://127.0.0.1:12200&lt;/code&gt; — enabling browser extensions, CLI tools, and custom dashboards to query live port data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Available endpoints:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get all active ports&lt;/span&gt;
GET /ports

&lt;span class="c"&gt;# Analyze a specific socket&lt;/span&gt;
POST /analyze
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"port"&lt;/span&gt;: 3000, &lt;span class="s2"&gt;"processName"&lt;/span&gt;: &lt;span class="s2"&gt;"node"&lt;/span&gt;, &lt;span class="s2"&gt;"isSystem"&lt;/span&gt;: &lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Kill a process (subject to safety checks)&lt;/span&gt;
POST /kill
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"pid"&lt;/span&gt;: 14201 &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example &lt;code&gt;/analyze&lt;/code&gt; response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dev Server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"importance"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DEVELOPMENT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"safety"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SAFE_TO_KILL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User development environment or application server. Safe to terminate to free up port resources."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dynamic Theme Engine
&lt;/h3&gt;

&lt;p&gt;Built with a fully responsive glassmorphic UI supporting &lt;strong&gt;Light&lt;/strong&gt;, &lt;strong&gt;Dark&lt;/strong&gt;, and &lt;strong&gt;System&lt;/strong&gt; theme switching using Tailwind CSS's &lt;code&gt;selector&lt;/code&gt; strategy with smooth CSS transitions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UI Framework&lt;/td&gt;
&lt;td&gt;React 18, TypeScript, Vite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Tailwind CSS, Lucide Icons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desktop Shell&lt;/td&gt;
&lt;td&gt;Tauri v2 (Rust)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML Inference&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;tract-onnx&lt;/code&gt; (compiled into binary)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model Training&lt;/td&gt;
&lt;td&gt;Python 3.10+, scikit-learn, &lt;code&gt;skl2onnx&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP Daemon&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;tiny_http&lt;/code&gt;, &lt;code&gt;serde_json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone the repo&lt;/span&gt;
git clone https://github.com/Laksopan23/PortIntel.git
&lt;span class="nb"&gt;cd &lt;/span&gt;PortIntel

&lt;span class="c"&gt;# 2. Install dependencies&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# 3. (Optional) Retrain the ML models&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;numpy scikit-learn skl2onnx
python train_model.py

&lt;span class="c"&gt;# 4. Run in development mode&lt;/span&gt;
npm run tauri dev

&lt;span class="c"&gt;# 5. Build a production installer&lt;/span&gt;
npm run tauri build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt; Node.js v18+, Rust (via &lt;code&gt;rustup&lt;/code&gt;), Python 3.10+ (only for model retraining)&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned Building This
&lt;/h2&gt;

&lt;p&gt;A few things that made this project genuinely interesting to build:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Embedding ML in Rust&lt;/strong&gt; — Converting a scikit-learn model to ONNX and loading it inside a Rust binary with &lt;code&gt;tract-onnx&lt;/code&gt; was a surprisingly smooth pipeline. The model adds zero startup latency and runs inference in microseconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tauri IPC patterns&lt;/strong&gt; — Designing a clean command interface between the React frontend and Rust backend forced me to think carefully about data contracts and error surfaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-platform syscalls&lt;/strong&gt; — Handling the difference between &lt;code&gt;netstat&lt;/code&gt;/&lt;code&gt;tasklist&lt;/code&gt; on Windows and &lt;code&gt;lsof&lt;/code&gt; on Unix inside a single Rust codebase required careful output parsing and OS detection logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSS theming without FOUC&lt;/strong&gt; — Building a robust light/dark/system switcher in Tailwind that avoids a flash-of-unstyled-content required some careful class injection timing in the Tauri shell.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;The project is fully open source. If you have hit the &lt;code&gt;EADDRINUSE&lt;/code&gt; wall one too many times, give it a try:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👉 &lt;a href="https://github.com/Laksopan23/PortIntel" rel="noopener noreferrer"&gt;https://github.com/Laksopan23/PortIntel&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you find it useful, a ⭐ on GitHub goes a long way. And if you have ideas for improvements — cross-platform installers, a VS Code extension, better process grouping heuristics — PRs and issues are very welcome.&lt;/p&gt;

&lt;p&gt;Drop a comment below with how you currently handle port conflicts. I am curious what workflows other developers have.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9siyg3ki9f9ghmsw0d69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9siyg3ki9f9ghmsw0d69.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzj0a14ke3e00bbvcyfv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzj0a14ke3e00bbvcyfv.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfbnoedbv7i0ob57tich.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfbnoedbv7i0ob57tich.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lw7yf21393hqud67058.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lw7yf21393hqud67058.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffk4bp1cmxxv4d85hvivd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffk4bp1cmxxv4d85hvivd.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
