Native macOS utility

PortClear

See which server you left running and what port it's holding — then how much space node_modules is eating.

Finds Node processes left running in the background and the ports they are holding, with a button to free them. It also scans a folder and shows every node_modules with its size and last-used date, so you can delete the ones you no longer need.

active ports — dev
:3000 · next dev · 2h
:5173 · vite · 45m
:8080 · nodemon · 12m
:4321 · npm run dev · 3h
scroll
The problem

The port does not free itself

Port 3000 is taken and you don't know by which process. The alternative is lsof -i :3000 followed by kill, every single time.

node_modules does not clean itself up. It accumulates in every project you have ever worked on, and Finder will not tell you which ones are stale and which are in use.

How it works

Six steps, in the order they happen

From opening the app to a freed port — every step runs locally, on your Mac.

01ScanOpens straight onto the list of dev ports currently in use — 19 known ports (3000, 5173, 8080, 4200, 19000, 4321, 24678, …).
02IdentifyFor each port, shows what process holds it, how long it has been running and from which folder.
03FlagProcesses that look left behind are flagged — with the exact reason each was flagged, not just a warning triangle.
04ConfirmBefore anything is stopped, you see the targeted processes: kind, pid, uptime, port, working directory and the reason each was flagged.
05Free itFree port sends SIGTERM. A second button sends SIGKILL when the process is wedged.
06Clean upSeparately, scan a folder for forgotten node_modules and send them to the Trash, with the reclaimed space confirmed up front.
What it does

Three modules, one purpose

You got Error: listen EADDRINUSE: address already in use :::3000 and don't know which process is holding the port. PortClear solves that at a glance — and it also cleans up the dozens of forgotten node_modules folders scattered across old projects.

01

PortClear finds the Node processes on your Mac — Next.js, Vite, NestJS, nodemon, npm — with their PID, the ports they are listening on, how long they have been up and how much memory they use. You can stop them from there, instead of hunting through a terminal for whatever is holding port 3000.

02

The second module solves a related problem: the dozens of forgotten node_modules folders in directories you have not opened in months, each one hundreds of megabytes. PortClear scans a folder you choose and shows every node_modules it finds: how much space it takes, when it was last accessed, and which project it belongs to. Sort them, group them by project, reveal them in Finder, and delete them — one at a time or in bulk, with the reclaimed space confirmed.

03

The third shows the space distribution across projects, so you can see at a glance where it accumulated.

Features

Ports and space, in one place

Finds Node processes left running: PID, ports, uptime, memory

Stop them straight from the app, no terminal needed

Recursive scan with size and last-access date per folder

Grouped by project, with subtotals and sortable columns

Delete one or many, with the reclaimed space confirmed up front

A chart of how space is distributed across projects

Skips hidden directories and symlinks, so it cannot loop

Runs locally — no account, no telemetry, no external dependencies

Why you can trust it

Checkable in the source, not just claimed here

Five things you can verify directly in the app's own code.

It says why before it acts

Every kill confirmation lists the targeted processes — kind, pid, uptime, port, working directory — and the exact reason each was flagged, before you press stop.

Sources/PortClear/UI/PortsView.swift — commit 404791b

It sends nothing about you

Scanning, deleting and licence checking all run on your own Mac: there is no network call anywhere in the app's code, so no telemetry and no account. The one connection it can make is an update check, started by you from the menu — automatic checking is off by default.

Sources/ — zero URLSession, NWConnection or socket; Sparkle in App/Updater.swift, SUEnableAutomaticChecks = false

The scan never descends into what it found

A `node_modules` it has found is not walked into, and a cancelled scan stops exactly where it was — both pinned by tests that work on real folders, created and removed inside the test, not on mocks.

Tests/PortClearTests/ScannerTests.swift — neverDescendsIntoAFoundNodeModules, aCancelledScanStopsEarly

Symlinks are never followed on delete

Deleting a node_modules that is a symbolic link removes only the link; the target folder stays intact — verified, in both deletion modes.

Tests/PortClearTests/DeletionTests.swift

Universal binary, macOS 14+

The shipped build runs natively on Intel and Apple Silicon, with no Rosetta emulation.

`lipo -archs` on PortClear.app inside the served DMG — x86_64 and arm64; Package.swift:10

Signed by us, notarised by Apple

The build you download here is signed with a Developer ID and notarised by Apple — it opens on an ordinary double-click the first time, with no right-click and no macOS warning.

`spctl -a -t exec` on PortClear.app inside the served DMG → accepted, Notarized Developer ID (83S677R8NP)

What it does not do yet

Today's limits

A tool that states what it cannot do is easier to trust about what it can.

Only stops Node-ecosystem processes — Docker, Rails, Postgres or a stale JVM are reported, but the app cannot stop them.Scope
Automatic flagging works off a fixed list of dev ports, written into the code; a port that is not on the list is not flagged on its own and has to be looked up through the search box.Fixed list
Automatic update checks exist in the code (Sparkle), but are switched off by default.Off by default

Checked against the served build — the app and its Info.plist inside PortClear 0.3.2, 11 September 2026 — not a promise of what a later version adds.

Requirements
System
macOS 14.0 or later
Binary
Universal — Intel and Apple Silicon
Network
Not required — everything it does runs locally
Questions

Frequently asked questions

The detector is a heuristic and can be wrong — which is why every kill confirmation shows the process (kind, pid, uptime, folder) and the exact reason it was flagged, not just a "stop everything" button.

No. There is no network call in the code, at any stage. Everything you see comes from `ps` and `lsof`, run locally, on your Mac.

Only the link is deleted; the target folder stays intact. It is marked separately in the list and counts as 0 B reclaimable, so the number cannot mislead you.

It can report them if they hold a known port, but it cannot stop them — the app only stops Node-ecosystem processes. For the rest, `lsof -i :PORT` is still the way.

No. The app is signed with a Developer ID and notarised by Apple, so an ordinary double-click opens it the first time — no right-click, and no warning from macOS.

Built with
SwiftSwiftUImacOS

A native macOS app — no browser, no middleman server.

Get the app

Free the port now

€29

+ VAT, calculated at checkout for your country

Activation

How to activate your licence

Download the app

Download version 0.3.3

2.5 MB

Open the app, go to Preferences → Licence and paste the key from the email.