All notable changes to PortPilot will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Port reservation - opt in per app to hold its
preferredPortwith a lightweight placeholder socket while the app is stopped, so nothing else can take it. Released the instant the app starts (so the real server can bind) and re-acquired on stop/crash. Toggle in the detail drawer; reserved apps show anRbadge. - Health checks - running apps are probed on the loopback address and shown as healthy (2xx/3xx), not responding (an amber pulsing dot using the previously-unused error state), or down. Optional per-app health path (default
/). - Conflict resolution - when an app's preferred port is squatted, resolve it inline: kill the blocker and start, or start on the next free port (without changing the saved port).
- Framework auto-detect - Add-App suggests the conventional dev port for Next, Nuxt, Astro, SvelteKit, Gatsby, Remix, Vite, CRA, Vue and Angular when no explicit port is configured.
- Stack presets - Start all / Stop all for a whole group in one click.
- Crash notifications - an OS notification + in-app toast when a running app exits unexpectedly (deliberate stops stay quiet). New
notifyOnCrashsetting (default on). - Share to phone - copy an app's local or LAN URL, or scan a QR code, to open it on a phone on the same network. QR is generated server-side as a
data:URL (no external calls). Adds theqrcodedependency. - Light theme + Auto - a crisp GitHub-style Light theme and an Auto option that follows the OS light/dark setting and updates live.
- Retired the Brutalist Dark and Solarized Light themes; saved preferences migrate automatically (
brutalist-dark→tokyonight,solarized-light→light).
- Branch & worktree awareness - run several git branches/worktrees of one project at once, each on its own port, nested under the parent project and colour-coded to match its VS Code (Peacock) window.
- Add worktrees - detect a repo's git worktrees (
git worktree list) and bulk-add the unregistered ones, reading each one's Peacock colour from.vscode/settings.json. add_worktreeMCP tool +register-worktreeCLI - register a worktree under its parent in one call (19 MCP tools total).- Detail drawer - clicking a row opens a slide-over with full command, cwd, PID, uptime and branch, plus Start/Stop/Open/Copy/Add-branch/Remove. Denser rows with hover-revealed actions; ports and requirements as chips.
- Stale-worktree pruning - a branch whose folder is gone is flagged
STALEand one-click removable. - VS Code extension parity - branches nest in the tree; Active Ports grouped into Dev / Other / System with kill gated off system-owned ports.
- Web portal, hosted from VS Code - the VS Code extension can now host the web portal itself via
portpilot.webPortal.enabled(opt-in, off by default). The browser UI runs whenever the editor window is open, with no desktop app: the extension spawns the hardened loopback agent using the editor's own Node and shows a "PP Portal" status-bar item that opens it. Stopping is graceful over an IPC channel (signals are unreliable on Windows), and the agent self-exits if the editor host closes, so it does not orphan. portpilot.webPortal.stopAppsOnStop(opt-in, off by default) - when the portal stops, also stop the dev servers it started.
- Web Agent (browser access) - run the full PortPilot UI in a browser with no Electron, via
npm run agentor the opt-in "Web Access" toggle in Settings. Embedded in the desktop app it runs in-process, sharing the same config and process table, so apps started in the browser and on the desktop are the same. - SSE live updates - external config changes (including MCP edits) push to the browser in real time via
/events. - Auto-port-fallback - the web agent picks the next free port from 7317 if the default is taken, instead of failing.
- App log viewer (desktop) - running apps get a "logs" button that streams captured stdout/stderr.
- 6 new MCP tools -
get_status,check_port,bulk_start,bulk_stop,list_groups,move_to_group.
- Unified config path across the desktop app, MCP server, VS Code extension, and web agent (shared
core/configPath.js), so all clients read the same file on every platform. - Two-phase running detection in every client - apps started on a dynamic or non-preferred port are now detected by command-line CWD match, instead of always reading "stopped".
- Honest MCP start/detection -
start_apppolls for the port before reporting success;bulk_startruns concurrently. - Dropped
wmic(deprecated/removed on recent Windows 11) for PowerShell/CIM plus a single batchedtasklistlookup. - Window auto-resize is now opt-in (Settings), default off.
- Config data loss - editing or starring an MCP-added app no longer drops fields like
descriptionandstartupDelay(saveAppnow merges onto the existing record). - Locale-independent
killPortin the MCP server and VS Code extension (the "LISTENING" match failed on non-English Windows). - VS Code extension running detection - the apps tree and "PP: N running" counter now use the same two-phase matcher as the desktop app, so an app on a non-preferred port shows its live port and running state.
- Live auto-scan (desktop) now honours the
autoScan/scanIntervalsettings instead of scanning only once at startup.
- Hardened loopback web agent - binds
127.0.0.1only, per-session 256-bit token (constant-time check), Host-header allowlist (DNS-rebinding defence), Origin allowlist + locked CORS, preflight-forcing custom header, 1 MB body cap, path-traversal guard, andagent.jsonwrittenchmod 600. Full threat model inSECURITY.md. - Strict CSP - removed
script-src 'unsafe-inline'by converting the inline handlers to delegateddata-actlisteners, closing the main XSS to code-execution vector.
- Single-Pane Layout - Removed 4-tab system, unified apps and ports in one scrollable view
- Settings Slide-out Panel - Right-edge panel with backdrop blur replaces Settings tab
- SVG Icon System - 21 inline SVG icons replace all emoji (play, stop, browser, folder, trash, edit, star, gear, search, plus, close, more, plug, copy, refresh, grip, chevron, docker, kill, home, globe)
- Glassmorphism Cards -
rgba(255,255,255,0.03)background withbackdrop-filter: blur(12px) - Glass Theme - 7th theme with extra transparency
- Global Search - Header search bar filters both apps and ports simultaneously
- MCP v2.0 - Rewritten with McpServer high-level API and Zod schemas on SDK 1.29.0
- 6 New MCP Tools -
get_status,check_port,bulk_start,bulk_stop,list_groups,move_to_group - VS Code Status Bar - "PP: N running" counter with click-to-refresh
- VS Code Groups - Apps grouped under collapsible folder nodes in tree view
- VS Code Full CRUD - Add, edit, delete apps, change ports, toggle favourites from sidebar
- Knowledge tab (13 help sections moved to GitHub docs)
- Quick Add modal (normal Add App modal is sufficient)
- Header subtitle "Localhost Port Manager"
- 4-tab navigation system (replaced by single-pane)
- App cards redesigned: status dot + drag handle + name + port (cyan mono) + star + actions
- Running apps show memory, uptime, PID inline on cards
- Codebase reduced 28%: 5,148 to 3,706 lines across renderer files
- MCP SDK updated from 0.5.0 to 1.29.0
-
🔍 Project Auto-Discovery - Automatically scan directories to discover development projects
- User-configurable scan paths in Settings → Project Discovery
- Smart detection for Node.js, Docker, Python, and Static sites
- Extracts project metadata (name, command, port) automatically
- Confidence scoring (95% match, 85% match, etc.)
- Modal UI shows discovered projects with "Add" or "Add All" options
- Filters out already-registered apps to avoid duplicates
- Supports scan depth configuration (1-5 levels)
- Caches results for 5 minutes for performance
-
🔍 Browse & Auto-detect Project - One-click project setup from any directory
- New button in Add App modal to browse and auto-detect projects
- Recursive subdirectory scanning (up to 2 levels deep)
- Automatically finds projects in parent folders (e.g., select
C:\Scratch\Projectfindsmanual-build/inside) - Smart sorting: prefers high-confidence matches and shallower paths
- Ignores build folders (node_modules, .git, .next, dist, etc.)
- Auto-fills all form fields (name, command, working directory, port)
-
📦 Package Manager Detection - Auto-detect now uses the correct package manager
- Detects
pnpm,yarn, ornpmfrompackageManagerfield or lock files - Generates proper commands:
pnpm run dev,yarn dev,npm run dev - No more "command not found" errors from raw script extraction
- Works with Turborepo, monorepos, and multi-package projects
- Detects
-
⚠️ Unknown Port Conflict Warnings - Know when unknown processes block your app ports- Toast notifications when registered app ports are occupied by unknown processes
- Shows process name and PID for blocked ports
- "
⚠️ Port Blocked" status badge on affected app cards - 🌐 Globe button to preview what's running on the blocked port
- Kill Blocker button to terminate the blocking process
- Warnings limited to 3 at a time to avoid spam
-
⭐ Favorites System - Star your most-used apps for quick access
- Star (⭐/☆) button on each app card
- Apps organised into collapsible sections:
- ⭐ Favorites - Starred apps at the top
- 📁 Other Projects - Non-starred apps below
- Section collapse state persists across app restarts
- Smooth expand/collapse animations
- Click section headers to toggle visibility
-
🗑 Delete All - Bulk delete all apps with one click
- "Delete All" button in My Apps toolbar
- Strong confirmation modal with app count
- Warns that action cannot be undone
- Reminds user to export config first
- Clears all apps in one operation
-
Port Matching Algorithm - Much more accurate detection of running apps
- Two-phase matching with stricter validation:
- Phase 1: High-confidence CWD (working directory) matches
- Phase 2: Requires CWD match OR strong app name keywords in command/process
- Keyword extraction from app names (e.g., "AzurePrep" → ["azure", "prep"])
- No more false positives - apps only match if there's strong evidence
- Tracks unknown conflicts separately from confident matches
- Two-phase matching with stricter validation:
-
Port Detection - Only uses explicit configuration, no more framework defaults
- Removed hard-coded framework defaults (no more "everything gets port 3000")
- Checks package.json scripts for
--portorPORT=flags - Checks vite.config.js/ts for explicit port configuration
- Checks .env/.env.local for PORT environment variable
- Returns
nullif no explicit port found (user assigns manually or uses Find Free) - StaticSiteDetector no longer hard-codes port 8080
-
Find Free Port - Avoids ports already registered to other apps
- Now checks both system availability AND registered app ports
- Loops through candidates to find truly unique ports
- Prevents duplicate port assignments when multiple apps need ports
-
My Apps Tab
- App cards now support favoriting with instant visual feedback
- Port conflict warnings with globe and kill buttons
- Better organisation with expandable/collapsible sections
- Section headers show app count (e.g., "⭐ Favorites • 3 apps")
- Improved toolbar layout with grouped action buttons
-
Settings Tab
- New "Project Discovery" section with scan path management
- Visual list of configured scan paths with remove buttons
- Empty state messaging when no scan paths configured
- Max scan depth configuration (1-5 levels)
- Auto-scan on startup option (disabled by default)
- Created
projectScanner.jswith intelligent detector classes:NodeDetector- Detects package.json, extracts scripts and port with package manager awarenessDockerDetector- Parses docker-compose.yml for services and portsPythonDetector- Identifies FastAPI, Flask, Django projectsStaticSiteDetector- Finds standalone HTML sites
- Enhanced
matchPortsToApps()with two-phase algorithm and keyword extraction - Added
detectProject()function with recursive subdirectory scanning (maxDepth: 2) - Added
shell:browseDirectoryanddiscovery:detectProjectIPC handlers - Added
unknownConflictstracking to port matching results - Added
isFavoritefield to app config schema - Added favorites section state to settings (favoritesExpanded, otherProjectsExpanded)
- Refactored
renderApps()to support section-based rendering - Added
showUnknownConflictWarnings(),killConflictingProcess(),openPortInBrowser()functions - Added
browseAndAutoDetect()function for one-click project setup - Enhanced
findFreePort()to check registered app ports - 315+ lines of new CSS for modals, sections, badges, animations, and conflict warnings
- New:
src/main/projectScanner.js- Project detection engine (423 lines) - Modified:
src/main/ipcHandlers.js- Enhanced port matching, added browse/detect handlers - Modified:
src/main/preload.js- Added browseDirectory() and detectProject() APIs - Modified:
src/renderer/renderer.js- Conflict detection, auto-detect UI, enhanced findFreePort() - Modified:
src/renderer/index.html- Browse & Auto-detect button - Modified:
src/renderer/styles.css- Conflict warnings, auto-detect button styling - Modified:
package.json- Version bump to 1.4.0
- DevTools Setting - Toggle to open DevTools on startup (dev mode only)
- Process Cleanup - Automatic cleanup after failed app starts (no more ghost "already running" errors)
- Port Conflict Detection - Pre-flight check and resolution dialog for port conflicts
- Smart Startup Delay - Visual countdown display when starting apps
- Refresh Button - Manual refresh for app status in My Apps tab
- App Configuration Editing - Add and delete apps via UI
- Screenshot Automation -
npm run screenshotscommand for UI documentation - Test Infrastructure - Test servers for 100% comprehensive test coverage
- Port Cards
- Increased padding from 8px/12px to 12px/16px for better breathing room
- Port numbers enlarged from 1.25rem to 1.5rem for faster scanning
- Labels (PROCESS, PID, COMMAND) now use text-secondary with 75% opacity (2x more readable)
- Long command paths now use ellipsis truncation instead of awkward breaks
- My Apps Tab
- STOPPED status badges now clearly visible (text-secondary with 80% opacity)
- App metadata (command + port) improved visibility (text-secondary with 85% opacity)
- App count badge ("11 apps • 5 running") larger and more prominent
- Typography
- Better font weight hierarchy throughout
- Consistent opacity levels for secondary text (75-85%)
- Improved contrast across all themes
- AzurePrep monorepo configuration (npm run web instead of npm start)
- Process manager cleanup to prevent zombie process entries
- 100% test coverage on core functionality (11/11 tests)
- 100% test coverage on v1.3.0 features (9/9 tests)
- Total: 20/20 tests passing
- Port kill functionality (critical fix)
- Port kill test now passing (11/11 comprehensive tests)
- Test for port kill functionality
- Initial comprehensive E2E test suite
- 11 core functionality tests covering:
- Window and UI initialization
- Port scanning and detection
- Port filtering
- Port card display
- Copy to clipboard
- Tab navigation
- Settings access
- User guide and documentation
- Organized script structure
- Improved port matching logic
- Initial release
- Port scanning for localhost apps
- App management (start/stop)
- Multiple theme support (TokyoNight, Brutalist Dark/Light, Nord, Dracula, Solarized)
- System tray integration
- Auto-scan functionality
- Configurable scan interval
- Add/edit/delete app configurations
- v2.0.0 - April 14, 2026 (Current)
- v1.7.0 - March 25, 2026
- v1.6.2 - March 21, 2026
- v1.5.0 - January 10, 2026
- v1.4.0 - January 6, 2026
- v1.3.0 - January 5, 2026
- v1.2.0 - December 2025
- v1.1.0 - December 2025
- v1.0.0 - December 2025
No breaking changes. Config file will be automatically updated with new settings:
openDevToolssetting added (defaults tofalse)
All existing configurations remain compatible.
Note: For detailed testing information, see TESTING_SUMMARY.md