Your localhost, in the menu bar.
See every dev server running on your Mac, kill the one squatting on a port —
then open any of them on your phone with a QR code.
Three rituals every web developer knows: Error: listen EADDRINUSE :3000 followed by lsof -i :3000 and kill -9; "I need to test this on my phone" followed by fighting local IPs or paying for a tunnel; and "what do I even have running right now?" Portside owns all three from one menu-bar app.
Every listening TCP port, with the project behind it — read straight from package.json and other manifests — plus framework, uptime, memory, and bind address. Dev servers sort to the top; system daemons collapse into their own section.
Graceful SIGTERM first, escalating to SIGKILL only if the process won't go. No more copy-pasting a PID out of lsof.
One click shows a QR code that opens the server from any device on your Wi-Fi — including servers bound to 127.0.0.1 only, the common case for vite, next dev, and friends. Portside bridges these with a built-in TCP relay: it listens on your LAN address and pipes bytes straight to the loopback port, so HTTP, WebSockets, and hot-reload all just work. Stop sharing and the relay is gone; nothing about your dev setup has to change.
Click the window icon in the menu-bar popover (or use the ⋯ menu) for a resizable dashboard: a filter field, richer rows with the server's working directory, and always-visible actions instead of hover-to-reveal.
Everything is lsof, ps, Unix signals, and a plain TCP listener. No kernel extensions, no Accessibility access, no accounts. macOS may prompt once for Local Network access the first time you share a server to your phone — that's the relay's listening socket, nothing more.
Important
Portside is not yet notarized by Apple (that requires a paid developer account), so macOS will warn you on first open. The steps below get you through it — or skip the download entirely and build from source in under a minute.
brew install --cask aadhilfarhan/tap/portsideOne command, and Homebrew verifies the download's checksum for you automatically. Step 3 below (allowing the app to open) still applies on first open. Updating later is brew upgrade --cask portside.
The steps below cover the direct download instead.
Download Portside.dmg — this link always fetches the newest release. Release notes live on the releases page.
Each release includes a .dmg.sha256 checksum file (download it here). With both files in the same folder:
cd ~/Downloads
shasum -a 256 -c Portside.dmg.sha256A result ending in OK means your download is byte-for-byte the published release.
Open the .dmg and drag Portside to your Applications folder. Because the app isn't notarized, double-clicking will show a warning:
- Double-click Portside, and dismiss the warning
- Open System Settings → Privacy & Security, scroll down, and click Open Anyway next to the Portside message
- Confirm in the dialog that appears
You only do this once. The Portside icon appears in your menu bar — click it to see your first dev server.
Portside checks nothing and phones home to nothing, so updates are manual: download the new .dmg from the releases page and drag-replace the app, or brew upgrade --cask portside.
No Xcode required — just the Command Line Tools.
git clone https://github.com/AadhilFarhan/Portside.git
cd Portside
./scripts/build-app.sh
open dist/Portside.appThe script builds the SwiftPM package in release mode and assembles dist/Portside.app. Building locally also skips the Gatekeeper "Open Anyway" dance, since the binary is built on your own machine.
To regenerate the app icon:
swift scripts/generate-icon.swiftRunning the test suite needs the full Xcode toolchain (XCTest isn't in the bare Command Line Tools):
env DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer swift testThe same binary doubles as a CLI, useful for scripting or for checking the engine without the UI:
Portside.app/Contents/MacOS/Portside --scan # print the server table
Portside.app/Contents/MacOS/Portside --share 3000 # relay a port to your LAN, print the URLYour phone can't reach 127.0.0.1:3000 on your Mac, and most dev servers bind only to loopback. Portside starts a tiny relay that listens on your LAN address and pipes bytes to the loopback port — a dumb, fast TCP pipe, so HTTP, WebSockets, and streaming all just work.
- macOS 14.0 (Sonoma) or later
- Apple silicon or Intel
Portside has no networking code beyond the local relay it starts on request, and it contains no analytics, telemetry, or update pings. Port and process information comes from standard Unix tools (lsof, ps) running locally; nothing leaves your Mac except the traffic you explicitly choose to share to your own phone over your own Wi-Fi.
- Trusted HTTPS to your phone — a locally-generated CA (the mkcert approach) with a guided install-profile flow for iOS/Android, so camera, clipboard, and PWA APIs that require a secure context work on device.
- New-server notifications, port history, favorites.
Portside is released under the MIT License. You are free to use, read, modify, and distribute it.