Always know what’s running, and on which port.

Your agents start dev servers all day. Hun gives them one way to do it, and shows you every server they or you started, with its port and its logs, in your menu bar.

Apple silicon, macOS 15 or later.

Hun's window showing the project orbit: its four services with ports, and the live log of its Next.js app.

“My agent already starts the dev server.”

Without Hun

It does. It runs npm run dev inside its own session, and that’s where it goes wrong. The logs scroll by in a terminal you never see. The server dies with the session, or stays behind holding :3000. And when a second agent needs that port, it frees it the quick way: kill -9, on your other project.

With Hun

Every agent starts your project the same way, hun run orbit. Each server shows up in your menu bar with its port and logs. Ports don’t collide, nothing gets killed to make room, and the server keeps running after the session ends, until you stop it.

Hun installs a skill that teaches Claude Code, Codex and Cursor to work this way.

Right there in your menu bar.

Click the switch in your menu bar and Hun drops down with everything that’s running, each project with its port.

Open it
Click a port and it opens in your browser.
Flip a switch
Each project has its own switch. On runs it, off stops it.
Focus or Multitask
One project at a time, or as many as you like.
Close it, they keep running
Closing the window doesn’t stop anything. Your servers run until you stop them.
 
2
running
docs
orbit
blog
mobile-api

Your frontend on the Mac. The rest in Docker.

Most projects are a mix: npm run dev on your machine, and the API, workers, Postgres and Redis in Docker Compose. In Hun that’s one project, started in order, each service with its own port and logs.

atlas · starting
Service
0s1s2s3s4s5s
Port

Started for you

Docker Desktopstarted in the background

In Docker

postgresdocker compose up postgres
:5432
redisdocker compose up redis
:6379
apidocker compose up api
:8000
workerdocker compose up worker

On your Mac

webnpm run dev
:3000
~/code/atlas % hun run atlas0 of 5 running
Docker, started for you
If Docker Desktop isn’t running, Hun starts it before the services that need it.
One log per container
Read the API without scrolling past Postgres and Redis, or switch to All to see them together.
Honest when Docker isn’t
If Docker stops answering, Hun stops those services instead of showing them as running.

Run just the part you’re working on.

Most days you don’t need the whole stack. A profile is a named set of services. Pick one from the window, or run hun run orbit -p api, and Hun starts those services and whatever they depend on.

profiles:
  ui: [app]
  api: [server, worker]
  # postgres comes along
orbit · profiles

Profiles

Services4 of 4 running
BackendFrontend
postgres:5432

docker compose up postgres

Running
server:8000

uv run server

Running
worker

uv run worker

Running
app:3000

npm run dev

Running
Starts first. server and worker need it.
All services running
Only the difference
Switching from ui to api stops the app and starts the backend. Nothing that stays gets restarted.
Remembered
Hun runs the last profile you picked, from the menu bar, the window or the terminal.
Saved as you go
Running a set of services you like? Save Running Services as Profile, and it’s in your .hun.yml.

Write it down once. Start it the same way every time.

  1. Step 1: Describe it once

    A short .hun.yml lists what your project runs and on which ports. Your agent can write it, then check it with hun validate .

    No. 0001

    orbit

    4 services

    ~/code/orbit/.hun.yml
    name: orbit
    
    services:
      app:
        cmd: npm run dev -- --port $PORT
        port: 3000
      server:
        cmd: uv run server
        port: 8000
        depends_on: [postgres]
      worker:
        cmd: uv run worker
        depends_on: [postgres]
      postgres:
        cmd: docker compose up postgres
        port: 5432
    
    profiles:
      ui: [app]
      api: [server, worker]
    

    Hun fills in 3000, or the next free port if it’s taken.

    server and worker wait for postgres, so it starts first.

    1. Hun fills in $PORT: 3000, or the next free port if it’s taken.
    2. server and worker wait for postgres, so it starts first.

    Start it with hun run orbit

  2. Step 2: Your agent starts it the same way

    Ask your agent to run the app and it uses hun run orbit, not a guess. Postgres starts first, and a busy port moves to the next free one.

    A coding agent in ~/code/orbit:
    You: Start orbit so I can try the new dashboard.
    Agent ran: hun run orbit
    ✓ Started orbit in parallel
    Agent ran: hun status
    app :3000 · postgres :5432 · server :8000 · worker, all running
    Agent: orbit is running. The app is on localhost:3000, the API on :8000, and its logs are in Hun.
  3. Step 3: See it, stop it

    Hun’s switch in your menu bar turns on, and so does orbit’s. Click a port to open it; flip the switch to stop it.

Useful on the days it’s just you, too.

Switch projects in one click
In Focus, starting one project stops the last, so it always gets its own ports.
Search every log
Filter one service’s output as you type, or switch to All and search the whole project at once.
Two projects, both on :3000
Both run. The second gets the next free port, and nothing gets killed to make room.
Something else on your port
Hun tells you what holds it, like node (pid 4121), and stops it only if you ask.
Crashes don’t hide
A crashed service says so, keeps its log, and restarts with one click.
Branches and a terminal
Switch a project’s branch from its header, and open a terminal that’s already in the right folder.

$9, once.

One key works on three Macs, and every update is included. No subscription.

Apple silicon, macOS 15 or later.