feat: PortBar 3.0 — LAN-exposure marker, reliable kill, resizable popover#1
Merged
Merged
Conversation
Capture the bind host from lsof/docker and classify each listening port as local-only (127.0.0.1/::1) or LAN-exposed, resolving a port with multiple bindings as exposed-wins. Also make scanning sturdier: emit a fallback entry when ps races and drops a pid instead of hiding a live port, match Docker even when lsof truncates the process name to 9 chars, key change-detection on pid+port so a rebind (same port, new pid) is noticed, and centralise the HTTP/browser heuristics in shared helpers.
Kill now refreshes the list immediately (row disappears at once) and targets the process group so dev-server child workers die too and can't hold the port or respawn, falling back to a single-pid kill when the target shares our own group. Popover UI for 3.0: an orange broadcast icon flags LAN-exposed rows; the browser button covers the 5xxx range and any web framework and opens 443 over https; the PROCESS column is flexible with a hover bubble revealing the full path; and the panel is drag-resizable with the size persisted.
The transient NSPopover did not reliably close for this LSUIElement accessory app. Close it explicitly on any outside mouse-down or when the app resigns active, cleaning up the monitors in popoverDidClose.
New user-facing features (LAN-exposure marker, resizable popover) plus the kill/scanner fixes warrant a major bump per the versioning rules.
Indigo squircle with a glowing lightning bolt, generated at every required size by scripts/make_icon.swift (zero-dependency AppKit/CoreGraphics).
Shortcuts for building, launching, spawning test ports, and the smoke test, so contributors can verify changes without memorising xcodebuild flags.
One-line installer that downloads the latest release DMG, copies the app to /Applications, clears quarantine, and launches it.
Cover the LAN-exposure marker, resizable popover, curl install, an icon reference table, and the new scanner/kill behaviour in CLAUDE.md.
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Changes
Feature — LAN bind-scope
BindScopeonPortEntry; scanner captures the bind host fromlsof/dockerand classifies local-only (127.0.0.1/::1) vs exposed (0.0.0.0/*/::/LAN IP), exposed-wins on multi-binding.📡in the legacy menu title.Fixes
5xxxrange and any web framework;:443opens overhttps; single shared HTTP heuristic.psraces, Docker match despitelsoftruncation, change-detection keyed onpid+port.UI / tooling
scripts/make_icon.swift).scripts/install.shcurl installer and a devMakefile.Test plan
make build— BUILD SUCCEEDED--bind 0.0.0.0) shows the orange icon; local-only (127.0.0.1) does not:5173(Vite range) shows the browser button