Portlivo is a native Mac menu bar app that shows every local dev server and port running on your Mac. Rather than a wall of lsof output, it presents named, grouped, live servers — Vite, Laravel, Next.js, Docker, Postgres — each with the project it belongs to, the command that started it, its PID and its uptime. From the panel you can open, kill, restart, tail or share any of them in one click. It is built for developers on macOS who run many local servers at once and want to know what is listening on which port without dropping into the terminal to type lsof -i. The promise is direct: every dev server, one click away.
The problem it addresses is the everyday friction of local development on a machine that runs several things at once. You start npm run dev and get "Error: listen EADDRINUSE: address already in use :5173". The next step is usually a terminal detour: lsof -i :5173, pipe it through grep LISTEN, read a PID, kill it, and try again — while hoping you did not stop the wrong process. Portlivo describes that loop with a screenshot caption and a one-line answer: "Not anymore. Click, kill, done." It also addresses drift — stray dev servers left behind by Claude Code or Codex, services listening on the LAN that should not be, and a list of ports that all look like "node" until you dig in.
Portlivo scans every two seconds and turns a wall of lsof output into named, grouped, live servers. It recognises the tools you already run: Laravel, Vite, Next.js, Nuxt, Astro, Remix, SvelteKit, Rails, Django, FastAPI, Flask, Express, Bun, Deno, Go, Phoenix, Spring Boot, Docker, PostgreSQL, MySQL, Redis, MongoDB, Herd, Valet, Homebrew, Storybook, Expo, Reverb, Mailpit and MinIO. More than a name, every port shows its project folder, command, PID and uptime — not just "node". Laravel, Herd, nginx, Node, Vite, Postgres, Redis and more show their own logos, so a row is recognisable at a glance. Docker rows show container names instead of docker-proxy, and anything Portlivo does not recognise still appears with its process name. Gradle and Kotlin daemons, language servers and system daemons are hidden so they stay out of the way.
Each web server is probed and coloured by status: 2xx green, redirects teal, 4xx orange, 5xx red, along with how fast it answered in milliseconds. You can set a custom health path — probe /health instead of / — and still see the response time. Live website previews give a thumbnail of each server's home page, so you know which localhost is which before you click. Live logs tail laravel.log, docker logs or Portlivo-started commands right inside the inspector, colour-coded, so an INFO request line, a slow query warning and an undefined variable error in InvoiceController read differently. Together these turn a port list into something closer to a live status board for your machine.
Every row is actionable. Open launches the server in your browser. Kill stops it safely, because Portlivo re-checks the PID right before stopping anything so a recycled PID never takes down the wrong app; it sends a polite SIGTERM first and leaves root-owned processes alone. Restart keeps the original arguments and environment, PORT=4000 and quoted values included, so an exact restart is genuinely exact. Share it — or scan it: a QR code opens a LAN server on your phone over the same Wi-Fi, or you can create a public HTTPS link through cloudflared or ngrok, stopped when you quit. A network-exposed badge marks servers listening on your LAN so nothing is shared by accident, and watch ports sends a banner with Start Again when a watched server stops, plus a red dot on the menu bar icon.
Stacks collapse a whole project into one action: point Portlivo at a folder and it finds composer run dev, npm/pnpm/yarn/bun scripts, a Procfile, Rails, Django, Go or Compose, then starts the whole stack in one click — the site's own example shows a billing-api stack with four commands. Services and containers are first class too: PostgreSQL, Redis, MySQL and other Homebrew or launchd services can be stopped or restarted without brew services, and Herd or Valet .test sites appear in a grid read from their own config. Live CPU and memory usage per server, with a trend line, makes a runaway dev server easy to spot. Stop Visible filters the list and then stops everything you can see with one confirmation, leaving services and containers alone.
Speed is treated as a feature. Press ⌥⌘P from any app and the panel drops down from the menu bar, with a shortcut you can record yourself in Settings. The ⌘K command palette opens servers, copies, restarts, kills (↩ twice, on purpose), starts stacks and jumps between pages without the mouse. Instant search filters as you type by port, project, tool or the app the server came from, and recent ports stay one click away even after they stop, surviving a relaunch. Keyboard-first controls keep hands off the pointer: ↑↓ to move, ↩ to open, ⌘⌫ to kill, or just O, T and K. Servers started by Claude Code or Codex get a badge and their own filter, and pressing T brings forward the app a port came from — Cursor, VS Code, iTerm2 or Warp.
Under the hood the model is simple and explicit: watch which processes are listening on TCP ports, refresh every two seconds, and resolve each one to a project, command, health status and resource footprint. Health checks, previews and scanning all run locally against localhost, which is why the only outbound connections are update checks, the licence check with Dodo Payments (your key and this Mac's name) and, when you choose to share a server, the cloudflared or ngrok tunnel you started. There is no account and no analytics in the app, and it asks for notifications only, and optionally — no Accessibility, Screen Recording or Full Disk Access. It is a native SwiftUI app, not Electron, signed with a Developer ID and notarized by Apple.
Beyond the menu bar, a devports CLI installs in one click from Settings, with devports ports, kill 3000 and open 5173, so the same project-aware names are available from any shell, script or Raycast command. Shortcuts actions — List Dev Ports, Free a Port and Open Port — make the same powers available to your own automations. There is also a real Mac window when you want more than a glance: an overview, every port grouped by kind, saved stacks, Herd sites, an activity timeline, and an inspector showing the command, folder, CPU, logs and preview of whatever you select, with light and dark mode, a sidebar you can hide, launch at login and signed, notarized automatic updates.
The outcome is less time lost to plumbing. Port conflicts that used to require lsof, grep and a guess become a notification with Kill Holder & Retry — one click and you are running again. The list is readable at a glance because rows carry project names, logos, health colours and previews rather than bare process names. Stray servers from AI coding agents no longer pile up unnoticed, and LAN-exposed servers are labelled before they are shared by accident. Recent ports and saved stacks mean a laptop reboot or a stopped server does not cost you the setup, and the activity timeline answers what started and stopped, and when, without a forensic session in the terminal.
Concrete workflows look like this. You hit address already in use on port 3000, press ⌥⌘P, find the offending Vite server in the list and use Kill Holder & Retry to get moving. You open a client project folder, let Portlivo discover its Composer, npm or Compose commands, and start the whole stack rather than four terminals. You tail docker logs or laravel.log in the inspector while testing an API. You share a LAN server to your phone by QR code to check a layout on a real device, or spin up a cloudflared HTTPS link to show a colleague. You use Stop Visible before a screen share, watch a critical port for downtime, or run devports kill 3000 from a script or Raycast.
Portlivo is aimed at Mac developers who run local servers all day — Laravel and PHP developers using artisan serve, Herd or Valet, JavaScript and TypeScript developers on Vite, Next.js, Nuxt, Astro or SvelteKit, and anyone juggling Docker containers and Homebrew services. It requires macOS 14 Sonoma or later and runs on Apple silicon and Intel. Pricing is a one-time purchase, not a subscription: free for 7 days, then $8.99 for one Mac at the early-bird launch price (normally $19.99, and the price steps up as licences sell), $39.99 for 3 Macs or $59.99 for 5 Macs, with free updates and a licence key delivered by email. Payments are handled by Dodo Payments, and you can deactivate a Mac to move the key to a new one.
Portlivo's core value proposition is narrow and well executed: stop hunting for ports and start shipping. It replaces the lsof-and-grep reflex with a menu bar panel that names, groups, probes and colour-codes every local server, then lets you open, kill, restart, tail, watch or share each one in a click. Native, private by design and priced once, it is the kind of tool that disappears into the menu bar and quietly removes a small, recurring tax on every development session.