foreman

Organize terminals by project, on top of tmux. Identity badges, one view at a time, agent state at a glance.

The real star is the terminal server: tmux keeps your terminals alive in the background — the windows on your screen are just viewers. Close a window by accident? Nothing happened. That idea alone will calm a chaotic terminal life; foreman adds the missing semantics on top: every terminal is a named participant in a project.

You always know what you're typing into

Every managed terminal wears a colored badge with its project's name — and the right side of the status bar tells you when an agent in another project wants your attention.

A terminal with the project badge on the left of the status bar and a cross-project waiting ticker on the right

Working in webapp (badge, window tags). fm new reviewer infers the project from the terminal you're in and offers to take you there. Bottom right, the ticker: two other projects want attention.

Agent state at a glance — without attaching

AI agents made terminal life crowded: several projects at once, each with agent terminals and manual shells. foreman list shows who's working, who's waiting for you, and who's done — computed live from the tmux server, nothing stored.

foreman list output showing participant states: working, waiting with warning mark, shell

Asked from a third project (data-pipeline's badge below): webapp's agent is deep in work, api's planner is waiting⚠ for you.

Two commands do most of the work

new starts a named terminal in the right directory with the role's command already running; go moves a project's view to wherever you are — navigating never multiplies terminals, and windows foreman opens are cleaned up again when their view moves on.

$ fm new coder                # infers the project from where you are
created webapp/coder in ~/code/webapp
go to coder? [Y/n] ⏎          # and you're there

$ fm api go planner --window  # open another project's agent beside you
$ fm list                     # the whole floor at a glance

The menu bar knows too

The explorer sits in the menu bar: every project and participant, states included — click one and its view lands in a Terminal window.

The fm menu bar app open, listing projects and their participants with state marks

Pinned projects (★) also notify you the moment their agent starts waiting.

…and it speaks up when you're needed

Pin the projects you care about. The moment their agent finishes a turn or stops at a question, macOS tells you — while everything else stays glanceable in the ticker and menu, never interrupting.

Two macOS notifications from foreman: coder is waiting in NamWeb, coder is waiting in foreman

Two projects raise their hands — real notifications from the day foreman was built (the second one is the agent building it).

Install

$ brew install tmux           # the engine
$ git clone https://github.com/Aha43/Foreman && cd Foreman
$ make install                # foreman + fm + fm-explorer into ~/.local/bin

macOS for the full experience (Terminal integration, menu bar, notifications); the core CLI is portable Go over tmux.

If foreman isn't for you, keep the engine

foreman is one opinion about what to build on a terminal server — projects, participants, roles. If you hit a bug, or the model just isn't how you think, don't let that put you off the idea underneath: tmux on its own is excellent (named sessions and tmux attach get you surprisingly far), and it's a lovely thing to build your own thin layer on. The server does the heavy lifting either way — foreman is proof of how little you need on top.