Native macOS server supervisor

Stop launching the same app five times.

Portly gives every AI coding agent the same live context for your local servers—what is running, where it runs, and whether it is healthy.

macOS 14+Swift 6MIT licensed
Live server statelocalhost:7737
Portly desktop application showing one healthy NowStack web server on port 3000.
Portly
Running
PID82104PORT3000UPTIME2h 14mRESTARTS0
nowstack / web

$ pnpm dev

Local: http://localhost:3000/

Network: use --host to expose

ready in 438 ms

portly health check passed 200 OK

portly shared state available on 127.0.0.1:7737

One process per server Agent-ready JSON Persistent local logs Loopback-only API

The problem

Five tasks should not mean five copies of your app.

Agents start background jobs because they lack shared runtime context. The result is duplicate process trees, random fallback ports, fragmented logs, and a laptop doing five times the work.

Without Portly
5agents×5apps=25processes
  • Every agent guesses whether the app is already running.
  • Each new task grabs another port and starts another process tree.
  • Logs, health, and ownership disappear across terminal tabs.
  • Your laptop pays the cost for context the agent never received.
With Portly
5agents1supervisor1process
  • One live source of truth for projects, servers, ports, PIDs, and health.
  • A stable CLI and JSON API that agents can inspect before they act.
  • Persistent PTYs and logs without duplicate background jobs.
  • Explicit takeovers when a server was started outside Portly.

Interactive demo

Give the agent context before it acts.

Portly turns a hidden runtime into explicit shared state. Compare the process sprawl with the supervised path.

5 duplicate processes
Codex · task 01pnpm dev
PID 82104:3000
Claude · task 12pnpm dev
PID 82391:3001
Cursor · task 07pnpm dev
PID 82618:3002
Codex · task 18pnpm dev
PID 82943:3003
Claude · task 21pnpm dev
PID 83117:3004

Product tour

Everything running. One calm view.

Portly feels like part of macOS: compact, direct, and always close to the process it controls.

Explore the code
Portly desktop application showing one healthy NowStack web server on port 3000.
Portly
Running
PID82104PORT3000UPTIME2h 14mRESTARTS0
nowstack / web

$ pnpm dev

Local: http://localhost:3000/

Network: use --host to expose

ready in 438 ms

portly health check passed 200 OK

01Desktop dashboard

Projects, ports, health, uptime, and terminal output stay visible in one native workspace.

Portly detects a process running outside its supervision and offers to take it over.
!
Running outside Portlynode (pid 91724) is using port 3000.
03Explicit port takeover

See the owner first. Move it under supervision only when you choose.

How it works

One source of truth from first prompt to final process.

You define the server once. Humans and agents use the same controls from then on.

01

Register the project

Portly detects common dev commands, frameworks, monorepos, and default ports. Confirm the server once.

$ portly add-project --path ~/Developer/project
02

Let agents inspect

The CLI returns structured status, ports, health, logs, and ownership before an agent launches a process.

$ portly status --json
03

Reuse one process

Portly starts, supervises, restarts, and shares the same server across every task and terminal.

$ portly start project/web --json

Built for local development

Small supervisor. Complete runtime context.

No cloud account, no dashboard subscription, and no process manager hidden behind an agent framework.

Built for coding agents

Agents inspect structured live state before launching anything, then reuse the process that already exists.

Real interactive terminals

Each server runs in a true PTY with readable output, persistent scrollback, and log files you can inspect later.

Health, not guesswork

Port and HTTP checks show whether a process is merely alive or actually serving the route you expect.

Crash recovery

Restart unhealthy processes automatically, cap retry loops, and keep the last exit and failure visible.

Safe port ownership

See exactly what owns a port. Portly never kills an unknown process without an explicit takeover.

Local by design

The control API binds to 127.0.0.1 only. Your commands, paths, logs, and project state stay on your Mac.

Open source by default

Read every line that can launch a process.

Portly is MIT licensed. Inspect the native app, the CLI, the loopback API, and the agent skill—or help make them better.

install.sh
$ git clone https://github.com/Melvynx/portly.git
$ cd portly
$ ./build.sh --run

✓ Portly.app installed
✓ portly CLI ready

One Mac. One server. Every agent informed.

Stop paying the process cost of missing context.