Repository navigation
Releases
v1.7.0
Everything since 1.4.0, in one download.
Running more than one stack
- Projects can say exactly what Run means with an
openport.jsonfile. Handy when the dev command hides behind a launcher script. - A project with several stacks gets one row per stack, each with its own Play, Stop, status and logs.
Status you can trust
- Run shows "starting" with a timer instead of calling a slow boot a crash.
- The dashboard refreshes itself and notices servers you start or stop in a terminal.
- Vite now uses the port OpenPort gives it.
- A start that takes over 45 seconds says so and points you at the logs.
Less babysitting
- Restart button, plus one automatic retry if a server dies right after Play.
- If a port is taken, Play moves to the next free one.
- After a crash or quit, the next launch offers to start your servers again.
- Archive projects you never open. They give their port back.
- Terminal tabs name themselves after what's running in them.
Fixes
- Stop no longer kills your browser.
- Quitting takes down everything OpenPort started, including terminal tabs.
- The LAN launcher refuses cross-site requests.
- Plenty of smaller process and port bugs.
First launch: right-click the app and choose Open. It isn't signed with a paid Apple certificate.
v1.4.0 — Clean Restart
Clean Restart — right-click any app row → Clean Restart to stop it, delete its framework build cache, free the port, and start fresh in one move.
This is the fix for a dev server that wedges on compile: port open, CPU pegged, but the page never loads — and a normal Stop→Run doesn't help because it reuses the same poisoned cache. OpenPort wipes the right cache per framework so you never have to drop into a terminal:
| Framework | Cache cleared |
|---|---|
| Next.js | .next |
| Vite / SvelteKit | node_modules/.vite, .svelte-kit |
| CRA | node_modules/.cache |
Plain Run is unchanged — the cache is only cleared when you explicitly choose Clean Restart, so day-to-day launches stay fast.
Also: dropped the redundant System theme mode (Auto already follows the system sun-based appearance).
v1.3.0 — LAN Launcher
LAN Launcher
Flip on the Wi-Fi icon in the footer (or Settings → LAN Launcher) and OpenPort serves a phone-friendly page at port 1453 that lists every app with:
- a tap-to-open link built from your Mac's Wi-Fi IP, so it works from any device on the same network
- a live status dot per app — running / stopped / localhost-only
- Run / Stop buttons so you can start an app straight from your phone
Clicking the footer icon reveals a QR code pointing at the launcher itself, so you can pull the page up on a device in the first place.
Auto-expose on Run
While the launcher is on, apps you Run from OpenPort bind to all interfaces automatically (Vite --host, Next -H 0.0.0.0, CRA HOST=0.0.0.0), so the links actually work from your phone without editing each dev script. Apps already running bound to localhost are flagged localhost-only with a nudge to relaunch from OpenPort.
The per-app QR action now defaults off, since the launcher supersedes it.
🤖 Generated with Claude Code
v1.2.0 — Readable logs, auto appearance, backend awareness
What's new
- Readable logs — the live logs viewer strips ANSI color codes, so output (and especially errors when a server won't start) reads as clean plain text instead of
[36m/[2mnoise. - Auto appearance — Light / Dark / Auto / System, where Auto follows the sun at your location (flips to dark at local sunset, back at sunrise). No geolocation prompt; it derives coordinates from your system timezone. Pick it from the footer appearance menu or Settings → General.
- Backend awareness — detects when a project has a Convex or Supabase backend, whether the dev script already starts it, and whether it's a local process or a cloud connection. Each row shows a backend line with live status, and warns when a local backend has nothing to start it.
- dev:backend sidecar — when a project splits frontend and backend into separate scripts, Run starts both so the frontend doesn't boot alone with failing data calls.
- Node version pinning — respects a project's
.nvmrc/.node-version, and drops Convex projects to a compatible Node when your default is too new, so the local backend stops failing to deploy"use node"actions silently.
First launch: macOS warns "unidentified developer" (the app isn't signed with a paid Apple cert). Right-click the app → Open → Open. macOS only asks once.
Requirements: macOS 14 (Sonoma)+ · Node.js installed
v1.1.0 — Terminal tabs, context-aware search, terminal profiles
What's new
- In-app terminal tabs — click the terminal icon on any row (or the
+in the tab bar) to open a real shell tab inside OpenPort, no more alt-tabbing to Terminal.app. Each tab runs your login shell, cd'd into the project folder. - Context-aware search — the title-bar search filters apps on the Dashboard and finds in scrollback when you're on a terminal tab; ▲▼ jump between matches; per-tab query memory.
- Terminal profiles — Settings → Terminal lets you pick a theme (System, Dark, Light, Solarized Dark/Light, Dracula, Nord) and font size. Changes apply live to every open terminal.
- Orphan reaper — process group kills + recursive descendant reap fix the EADDRINUSE bug after restart. Dead OpenPort sessions no longer leak
convex/next/esbuildzombies for days. - Settings reorganized — sidebar layout (General / go/ links / Terminal / Rows). Portfolio folder moved here from the footer.
- Custom title bar — bold OpenPort flush left, soft search pill flush right, traffic lights in the same strip (via
NSTitlebarAccessoryViewControllerso drag/focus all behave correctly). - Quick launch redesign — menu bar dropdown is now a 3-column grid: status icon + name | port | globe button. Click anywhere on a row to start/stop, click the globe to open in your browser.
- Footer cleanup — refresh + spinner sit next to Stop All; help / settings / theme cluster on the right; the unseen-changelog blue dot decorates the gear.
- Use external Terminal.app toggle — Settings → Terminal lets you keep launching the row's terminal button into macOS Terminal.app if you prefer the old behavior.
Download
- macOS 14 (Sonoma) or later
- Right-click the app → Open → Open on first launch (unsigned)
OpenPort v1.0.0
OpenPort v1.0.0
First major release. Native macOS app for managing local dev servers across your portfolio.
⬇ Download openport-macos.zip — unzip, double-click, done.
What's new in v1.0
- Live port detection — sees every dev server bound on your machine, not just ones it started. Match by working directory.
- Multi-port awareness — green dot next to the port column when an app is bound to multiple ports (frontend + backend, HMR, debug). Click for the full list with command lines.
- "Other ports in use" section — orphan dev servers running outside your portfolio. System processes (Tailscale, ssh tunnels, ControlCenter, Mac apps) filtered out so you can't accidentally kill them.
- Live logs viewer — resizable modal with stdout + stderr from any running app. Search filter, auto-scroll, copy, clear. No more switching to terminal.
- Customizable rows — hide any of the 7 action buttons (browser, copy, QR, logs, terminal, VS Code, Finder) per-app in Settings.
- Detached state with real ports — if you started an app in a terminal on a different port, the row flips to detached and shows the actual port.
- Settings & Help as draggable windows — keep them next to the main app instead of sheet-modal.
- Help redesigned — sidebar TOC, search, 12 sections covering every feature.
- What's new — discreet blue dot when there are unseen changes, hidden once viewed. Reachable from Settings or menu bar.
- macOS switches everywhere — no more checkboxes.
Requirements
- macOS 14 (Sonoma) or later
- Node.js
First launch
macOS will warn "unidentified developer" because the app isn't signed. Right-click the app → Open → Open. macOS only asks once.
Localhost 3000 v0.1.0
First public macOS build of Localhost 3000.\n\nIncludes the signed app bundle zipped for download on a new Mac.