Release Notes
Two products, two version lines. Localhost Explorer is the macOS menu-bar app (1.x). le is the free, MIT-licensed CLI (0.1.x) — its full changelog lives in the repo; the notable releases are summarised here.
The CLI — le
le 0.1.23 — 21 August 2026
- A status message no longer eats the hotkey footer. The footer is one line, and a status message renders instead of the key hints — so the first successful
F,o,c,t,forzreplacedj/k move · z group · / filter · …with something likerevealed /Library/Frameworks/…/Python, and nothing ever brought the hints back. Messages now retire after four seconds: long enough to read a revealed path, short enough that the hints feel like they returned on their own.
le 0.1.22 — 21 August 2026
- ⏎ on a row opens that row's actions. The detail pane's per-field focus shipped in 0.1.19 reachable only by
tab, which nothing on screen advertises — so the key you actually press on a selected row did nothing, and the pane read as decoration. ⏎ now moves focus into the pane and lands on its first field:j/kstep between fields, ⏎ runs the focused one (open this port, reveal the binary vs the folder, stop the row),tab/esc back out. On a group header ⏎ still folds the group. The story, including the test harness that was verifying an empty screen →
le 0.1.21 — 9 August 2026
- New:
le fix-terminal— undoes the terminal modes any TUI leaves behind when it is killed before it can clean up: mouse reporting, bracketed paste, a hidden cursor, the alt screen. The symptom is a prompt that fills with;62;38M65;…whenever you move the mouse.resetdoes this too; this is discoverable from the tool that caused the problem, and it does not wipe your scrollback. - A killed
leno longer leaves mouse reporting on for the exits it can observe. The byte-encoded mode maps screen coordinates onto printable ASCII, so a mouse sweep across a wedged terminal can "type" real letters into whatever reads stdin next.kill -9still cannot be cleaned up from inside the process — that is whatfix-terminalis for. - Stop output names the port, so two same-named processes are no longer distinguishable only by PID:
would stop node (pid 100) on 3000 — TERM. - Rows that share a name are told apart. A colliding identity gains its helper binary (
Antigravity IDE · language_server); a unique one is left alone. The header also counts what you can actually stop, alongside the risk pulse.
le 0.1.20 — 9 August 2026
- The table names the app. Eight rows used to read "App helper" — the product was in the command line all along and was never read. Rows now say OneDrive, Figma, Grammarly Desktop, Adobe, Antigravity IDE. The advice is unchanged: still high risk, still refused. Knowing what a thing is doesn't make it safe to stop, it makes the refusal comprehensible.
- Group the list by owner with
z. Fifteen listeners, twelve of them untouchable helpers, becomes nine lines with every stoppable process on screen. Folding hides ports, so it is guarded: opt-in, an active filter expands everything, a pinned port keeps its group open, and a folded header lists the ports inside it. - Visual weight follows what you can do. A row you can stop gets a solid rail and a bold name; one
lerefuses to stop gets a hairline and normal weight — in weight and glyph rather than hue, so it survivesmonoandNO_COLOR.
The app — Localhost Explorer
1.2.0 — in the works
Finished and being packaged; here early because the free CLI half already shipped (v0.1.16).
- Tunnels say what they are.
kubectl port-forwardandcloudflaredrows name the service, the ports, and the kube context — prod on a row is a safety feature, and now you see it. Plus a new Port forward tool: akubectl port-forwardthat reconnects itself when the pod restarts. - Pinned ports. Star a listener and its port pins to the top — keyed by port, not PID, so the pin survives every restart of whatever serves it. Same feature in the CLI: press
f. - A global hotkey (off by default) — ⌘⌥L, ⌘⌥P, or ⌃⌥L — and full keyboard control of the list: ↑↓ move,
oopens,xstops (same confirmations as the button), Esc collapses. - HTTPS-aware links. Endpoint links check whether the listener speaks TLS before writing the scheme — no more
http://against a local cert. Detection is a handshake attempt on loopback; nothing transmitted, nothing trusted. - Your cadence, your rows. Scan refresh is a setting (Fast / Normal / Relaxed / manual-only), and every per-row control — Stop, star, CPU — can be switched off in Row Display.
- 96 tools — the catalog grows by one: Port forward.
1.1.1
We answer "what's listening?" — but the day your Mac crawls, the thing eating it usually isn't listening at all. Now we say so.
- Machine load, in plain language. A new strip at the top of Stats shows the load average per core — the number that actually predicts a slow machine, because a load of 8 is alarming on 4 cores and unremarkable on 16 — with a verdict in words: healthy, fully committed, or oversubscribed — everything will feel slow.
- The heavy processes that aren't listening. Alongside it, the biggest CPU consumers that never open a port, so they never appeared here: antivirus scans, build jobs, the window server — and worker pools, where the children burn the cores while only the parent listens, so the one row we used to show was the calmest process in the tree.
- It stays out of the way. The strip hides itself entirely when the reading is unavailable or the machine is quiet. A healthy Mac gets no new chrome.
- Hold-to-repeat can't fire twice. Holding a letter key in the list — open, terminal, stop — repeated the action and leaked the keystroke through as typed text. One press, one action.
1.1.0
Every listener now tells you how hard it's working — and says so loudly when something's running hot. And you now choose how loud the rest of the list is allowed to be.
A real toolbox: 95 tools
- The Tools panel grows from 14 to 95. Ports and processes (what's on a port, kill its owner, top CPU/memory), network and DNS (LAN/public IP, dig, ping, traceroute, speed test), HTTP (headers, status + timing breakdown), Docker and Homebrew (containers, services, disk usage, prunes and cleanups), developer cleanup (DerivedData, npm/pip/yarn caches, find node_modules), clipboard utilities (UUID, pretty-print JSON, base64, URL-encode, hashes), and system one-shots (battery, thermal state, memory pressure, toggle dark mode). Sectioned by how often you'll reach for them, searchable, and every command is shown up front in its terminal form.
- Desk & Character. A new section for the desk the ports happen on: a rubber duck that debugs (runs nothing, right disturbingly often), a colour loupe that copies hex from any pixel, Type Clipboard for VNC consoles and everywhere paste is forbidden (3-second countdown, 5,000-character cap), free-port roulette, and the Is-it-DNS verdict tool. Every toy is also a real tool — that's the rule that keeps character honest.
- Clean your keyboard without typing a novel. The new Clean Keyboard tool locks every key — letters, modifiers, media keys — so you can wipe the crumbs off, then unlocks with one click. The pointer stays alive the whole time and a 3-minute failsafe unlocks on its own, because a keyboard-disabling tool's only unforgivable bug is staying locked. Needs the Accessibility permission (one honest grant, explained in place).
- Safety is structural. Nothing needs (or asks for) sudo, anything destructive is labelled and styled as destructive, and typed inputs are validated and passed to the command directly — never through a shell.
Three row styles: pick your kind of quiet
- Ten themes, one of them MS-DOS. The native list now takes a full change of character: MS-DOS (Norton Commander blue — cyan panels, yellow headers, the CGA palette, sharp corners), System 7, Game Boy, Phosphor and Amber CRT, Paper (e-ink and serifs), Blueprint, Dracula, Nord, and Vaporwave. Themes change canvas, signal hues, chips, corners, and typeface; they compose with the three row styles — any theme × any style. Risk stays legible in every one of them.
- Calm, Mono, or Signal — a new Row style picker under Settings → Row Display, for the Standard appearance. Calm (the default) keeps everything you had, decluttered. Mono sets every machine value — port, PID, path, command — in monospace, so the list reads as a table you scan. Signal strips rows to greyscale except the two things that are signal: risk and hot CPU. The only loud thing is the thing that needs you.
- Stats follows the style. Under Signal the dashboard's decorative tints drop to grey too — with one deliberate survivor: the orange "Open *" tile, because a listener reachable from the whole network is a genuine risk, and risk is exactly what color is reserved for.
- The style governs everything — buttons included. Filter tabs, toggles, banners, and counts follow your chosen style, and the native macOS buttons are replaced by a house button: flat fill, hairline border, monospace label under Mono/Signal, red reserved for the destructive role. The badge rainbow is retired in every style — badges are quiet neutral capsules, and color now always means risk or heat.
- Behind it: a written design system. Color is signal, never decoration; machine values are monospace; hierarchy lives in weight and size, so every style reads correctly in greyscale and with any color vision. The backstory, including the part where our own default broke our own rules →
See what's running hot
- Live CPU and memory on every row. A new CPU column sits right beside the port, and the detail view adds resident memory. A forgotten emulator or dev server pinning your cores stops hiding as a calm-looking row.
- A signal you can't skim past. A process using half a core or more is drawn in amber; one holding two full cores or more is drawn in red and bold — color and weight, so the alarm survives the monochrome terminal theme and colorblind vision alike.
- Top CPU in Stats. The hottest processes, worst first, so the offender is the first thing you read. When nothing's working hard, the section simply isn't there.
- Honest numbers. CPU is never clamped to 100% — on a multicore Mac, 100% is one core, and a runaway pinning eight of them reads as 800%, exactly as Activity Monitor shows it. Rounding that down would hide how bad it is.
- The free CLI got it too.
le's live table grows a CPU column,le listmarks hot rows with●and warm ones with▲(sole list | grep ●works with no color at all), and--jsoncarriescpuandrssfor your own scripts. Same thresholds as the app, kept identical on purpose.
A stop that heals itself
- No more "refresh and try again" dead-end. When the identity guard refuses a stop because the PID was recycled since you looked, Localhost Explorer now rescans on the spot and tells you it did — so retrying is one click on fresh data instead of a chore it made you do by hand.
1.0.1
A reliability release: an independent review of the scanning and stopping core, with every finding fixed.
Stopping the right thing, every time
- "Stop by folder" now stops managed listeners the right way. A Docker container or Homebrew service living under your project folder is stopped via
docker stop/brew services stop— not by signalling a helper process that launchd or Docker would immediately respawn. - Scans no longer lose data when one process is off-limits. A single system process that refused inspection could silently blank out every listener's folder and identity details — which also made "Stop by folder" find nothing. Scans now keep everything the system reports.
- Stricter identity checks before any signal. If a process can't be positively re-identified at the moment you click Stop (PIDs get recycled), Localhost Explorer refuses and asks for a refresh instead of guessing. Docker restarts now target the container's immutable ID, never its reusable name.
- Honest results. The folder-stop summary now distinguishes "stop sent", "failed", and "skipped because the process changed since preview" — and doesn't claim a process exited when it can only know the signal was delivered.
Smarter identification
- Gunicorn, Rails, Puma, and Sidekiq now get their framework badge; a project folder named "mongodb-*" is no longer mistaken for the MongoDB database; instrumentation preloads (
--require=./instrument.js) no longer masquerade as the app's entry point; andpython-config-style tools are no longer read as Python itself. - Docker port ranges (
8000-8010) are attributed to their container across the whole range.
Window polish
- Fixed a window/popover collision. Clicking the menu bar icon while a standalone window was open used to show the popover and yank the window forward — two copies of the panel at once. Now a live window always wins: the icon focuses the open window (restoring it if it was minimized) instead of stacking a popover over it.
- Detaching to a window sticks. Opening a window from the popover's detach button no longer silently reverted on the next settings change and slammed the window shut.
- Unified "liquid glass" surface. The popover and the standalone window now share one translucent canvas, so a resized window no longer frames a translucent panel with an opaque background band.
1.0.0
The 1.0 release. Localhost Explorer graduates from a listener viewer into a small suite of localhost-aware utilities — now with signed in-app auto-updates, so it keeps itself current.
New: Tools panel
- Added a Tools panel mode alongside Explore, Stats, and Settings.
- Added Keep awake: wraps
caffeinate -di, with timed durations or "Until process exits" — pick any listener and the Mac stays awake exactly as long as it lives. - Added Open when ready: polls
lsoffor a port and openshttp://localhost:PORT/the moment it starts listening. - Added Wait for port: sends a macOS notification when a busy port becomes free.
- Added Hold port: binds a sentinel
NWListeneron127.0.0.1so nothing else can grab the port until you release. - Added Restart listener: bounces Homebrew- or Docker-managed listeners via their real owner —
brew services restartordocker restart. - Added Notify on exit: macOS notification the moment a chosen listener dies.
- Added Kill by folder: picks a directory, lists every listener whose working directory lives under it, sends
SIGTERMto all of them. - Added one-shot wrappers: Flush DNS, Restart Dock, Restart Finder, Sleep display.
Menu bar + status item
- Menu bar icon swaps to a cup glyph while caffeinate is running.
- Right-click the menu bar icon for quick-fire tools: Caffeinate 15 min / 1 hour / Stop, Flush DNS, Restart Finder, Sleep display.
Standalone window + Settings
- Window mode setting (popover, window, both) — switch live without relaunching.
- Real NSToolbar on the standalone window with segmented mode tabs.
- macOS-native Settings: NSVisualEffectView sidebar,
Form { Section { … } }.formStyle(.grouped)right pane, native NSSwitch toggles.
Brand + auto-update
- Monochrome menu bar template glyph that recolors for light and dark menu bars.
- Sparkle auto-update integration with Ed25519 signing. Check for Updates… in Settings → About and the status menu.
Explore + search
- Live free-text search across name, folder, port, command, and PID — promoted to its own toolbar page.
- Smarter empty states: a PID hint that tells "no such process" apart from "that PID exists, it's just not listening."
Website
- Light/dark mode with manual toggle.
- Centered 1080 px reading column.
- New Tools section.
- "The month I got used to the fan" — origin-story blog post.
0.1.3
- Added cached process intelligence so source, profile, risk, and category decisions are computed once per scan.
- Added source badges for Terminal, Homebrew, Container, Framework, IDE, macOS, App, and Unknown listeners.
- Added Free a Port flow to jump straight from a port number to the owning process row.
- Added container lifecycle support for simple Docker-compatible published ports.
- Added Control Sources to the stats dashboard.
0.1.2
- Added Settings mode with live preview.
- Added row display controls and expanded detail controls.
- Added safety settings for stop confirmation and smart scrolling.
- Added popover layout presets.
- Added local-only trust copy, privacy page, and support page.
0.1.1
- Added ProcessProfile v1 intelligence.
- Added detection for Redis, MongoDB, Postgres, MySQL, MariaDB, Ollama, Node, Python, MkDocs, editor helpers, Homebrew services, and wildcard listeners.
- Added profile badges, risk, stop strategy, confidence, restart hints, and richer stop confirmations.
0.1.0
- Initial direct-download macOS build.
- Menu bar scanning, filters, stats, folders, endpoints, and stop controls.