tmux, iTerm2, PM2, Docker Compose: seven ways to run a Mac dev stack.
Four processes, one repo, twenty times a day. Terminal tabs, a multiplexer, a Procfile runner, a container stack, a production supervisor — each solves part of it. Here is the whole field in one table, an honest verdict on each, and where lpm fits.
What should run a multi-process dev stack on a Mac?
It depends on how many processes there are and how often you restart them. One process: any terminal. Four processes you restart all day: you want one command that starts them all and one pane per process — that is what tmux, Foreman, Overmind, Docker Compose and PM2 each do differently. Several repos at once, or a coding agent working beside the services: you want the project itself to be the thing you start and stop.
The five families, one line each. Terminal emulators (iTerm2, cmux) give you panes and leave the wiring to you. Multiplexers (tmux) make those panes survive a disconnect. Procfile runners (Foreman, Overmind) start a fixed list of named processes with one command. Container stacks (Docker Compose) also build the environment those processes run in. Supervisors (PM2) keep processes alive and restart them when they die. lpm is a shape of its own: the project is the object — start it, stop it, duplicate it, and give Claude Code or Codex a tab of its own next to the services.
Foreman and Overmind run straight off a Procfile you already have, Docker Compose off a compose file, and all three read it again on every start. lpm uses either one once, when you add the folder — a service per Procfile line, or a single docker compose up for the compose file — and keeps a list of its own after that. Five of the seven also run somewhere other than a Mac; lpm does not, and the table below says so.
The same two processes, three ways
Procfile web: bin/rails server
css: bin/rails tailwindcss:watch
compose.yaml services:
web: { command: bin/rails server }
.lpm.yml services:
web: bin/rails server
css: bin/rails tailwindcss:watch
The shapes barely differ — a name and a command. What differs is what happens after they are running. For the lpm side of it, see the full field list.
Every tool, side by side
The capabilities that actually differ
Thirteen rows, each one a place where the eight columns genuinely differ. Two of them go against lpm.
Capability
lpm
iTerm2
tmux
cmux
Docker Compose
Foreman
Overmind
PM2
Has a desktop app, not just a command line
Yes
Yes
No
Yes
Docker Desktop
No
No
No
One live pane per process, no scripting
Yes
you split them
you script it
you script it
interleaved
interleaved
one tmux window each
pm2 logs
Many repos as switchable projects
Yes
profiles
sessions
workspaces
No
No
No
No
Restart one process without the rest
Yes
No
respawn by hand
No
Yes
No
Yes
Yes
Brings a crashed process back on its own
No
No
No
No
with a restart policy
No
start -r
Yes
Works out the services from package.json, Gemfile or go.mod
built in, when you add the folder
No
No
No
No
No
No
No
Duplicates the project for a second agent
worktree or full copy, 1–50
No
No
No
No
No
No
No
Says whether an agent is working, needs you or done
Claude Code, Codex
Claude Code, since 3.7
No
when it needs you
No
No
No
No
Runs services natively, no containers
Yes
Yes
Yes
Yes
No
Yes
Yes
Yes
Services survive quitting the app
Yes
only via tmux
Yes
reopens panes
detached
No
Yes
Yes
Reads a Procfile or compose file you already have
once, when you add the folder
No
No
No
its compose file, every start
the Procfile, every start
the Procfile, every start
No
Available outside macOS
macOS only
No
Linux, *BSD
No
Linux, Windows
Linux
Linux, *BSD
Linux, Windows
Free and open source
MIT
GPLv2
Yes
GPL-3.0-or-later
Apache-2.0
Yes
MIT
Yes
Has a desktop app, not just a command line
lpm
Yes
iTerm2
Yes
tmux
No
cmux
Yes
Docker Compose
Docker Desktop
Foreman
No
Overmind
No
PM2
No
One live pane per process, no scripting
lpm
Yes
iTerm2
you split them
tmux
you script it
cmux
you script it
Docker Compose
interleaved
Foreman
interleaved
Overmind
one tmux window each
PM2
pm2 logs
Many repos as switchable projects
lpm
Yes
iTerm2
profiles
tmux
sessions
cmux
workspaces
Docker Compose
No
Foreman
No
Overmind
No
PM2
No
Restart one process without the rest
lpm
Yes
iTerm2
No
tmux
respawn by hand
cmux
No
Docker Compose
Yes
Foreman
No
Overmind
Yes
PM2
Yes
Brings a crashed process back on its own
lpm
No
iTerm2
No
tmux
No
cmux
No
Docker Compose
with a restart policy
Foreman
No
Overmind
start -r
PM2
Yes
Works out the services from package.json, Gemfile or go.mod
lpm
built in, when you add the folder
iTerm2
No
tmux
No
cmux
No
Docker Compose
No
Foreman
No
Overmind
No
PM2
No
Duplicates the project for a second agent
lpm
worktree or full copy, 1–50
iTerm2
No
tmux
No
cmux
No
Docker Compose
No
Foreman
No
Overmind
No
PM2
No
Says whether an agent is working, needs you or done
lpm
Claude Code, Codex
iTerm2
Claude Code, since 3.7
tmux
No
cmux
when it needs you
Docker Compose
No
Foreman
No
Overmind
No
PM2
No
Runs services natively, no containers
lpm
Yes
iTerm2
Yes
tmux
Yes
cmux
Yes
Docker Compose
No
Foreman
Yes
Overmind
Yes
PM2
Yes
Services survive quitting the app
lpm
Yes
iTerm2
only via tmux
tmux
Yes
cmux
reopens panes
Docker Compose
detached
Foreman
No
Overmind
Yes
PM2
Yes
Reads a Procfile or compose file you already have
lpm
once, when you add the folder
iTerm2
No
tmux
No
cmux
No
Docker Compose
its compose file, every start
Foreman
the Procfile, every start
Overmind
the Procfile, every start
PM2
No
Available outside macOS
lpm
macOS only
iTerm2
No
tmux
Linux, *BSD
cmux
No
Docker Compose
Linux, Windows
Foreman
Linux
Overmind
Linux, *BSD
PM2
Linux, Windows
Free and open source
lpm
MIT
iTerm2
GPLv2
tmux
Yes
cmux
GPL-3.0-or-later
Docker Compose
Apache-2.0
Foreman
Yes
Overmind
MIT
PM2
Yes
The lpm column covers the app and its lpm command together. Anything that changes what is running — starting, stopping, restarting — is the app's job, and the command hands it over, so keep lpm open for those; reading what is already running (lpm list, lpm logs) works either way.lpm's desktop app is macOS only. A Linux box can take the other end of it — the services and the agents run there, the Mac drives them — see the guide.Duplicating a project gives each agent its own checkout, so two of them never save over each other's work; the ports and the database underneath stay shared, and lpm checks the ports a project declares before it starts and names whatever process is holding one. A worktree copy brings across only the files git tracks — no .env, and Node packages only if you ask lpm to install them — here is what else it leaves behind.
Facts checked . Where we cannot name a workflow difference we do not invent one — two rows above go against lpm.
A multiplexer: panes and sessions that survive a disconnect.
Switch if
your config exists mostly to lay out rails s, npm dev and a worker.
Stay if
what you attach to lives on a server you keep open from every machine you use. lpm does not need tmux installed, and does not use it — which also means there is nothing on that box for you to attach to.
The Procfile classic: one command, every process interleaved into one stream, and foreman export for launchd, systemd and five other init formats.
Switch if
one interleaved stream stopped being readable at four processes.
Stay if
one Rails app in one terminal suits you, or your deploy depends on foreman export, or the Procfile is a file you keep editing: lpm lifts its lines in once, as you add the folder, and later edits stay on Foreman's side.
Containers that reproduce the stack on any machine, with pinned image versions and its own network namespace.
Switch if
your inner loop is application code and the container boundary is buying you nothing on the laptop.
Stay if
production parity matters, someone on the team is on Linux, or a dependency nobody wants to install natively. Add the folder and lpm already lists docker compose upas one of its services, beside any native ones it found.
The row every tool in the table implements differently: what starting the whole stack looks like when the project is the thing you start.
FAQ
Questions before you pick one
What is the difference between a multiplexer, a Procfile runner, and a container stack?
A multiplexer (tmux) gives you panes and keeps them alive; you decide what runs in them. A Procfile runner (Foreman, Overmind) starts a fixed list of named processes with one command. A container stack (Docker Compose) also builds the environment those processes run in. Three different layers, and it is normal to want two of them.
Does lpm read a Procfile or a compose file?
Once, at the moment you add the folder. Procfile.dev — or Procfile when there is no .dev one — turns into one service per line under the same names and commands, minus the release line, and a compose file turns into a single docker compose up service beside the native ones. From then on the list belongs to lpm: a later edit to the Procfile is not picked up, whereas Foreman, Overmind and Compose go back to their file on every start.
Where do Foreman and Overmind fit next to the other five?
Both are Procfile runners you drive from a terminal. Foreman prints every process into one merged stream; Overmind gives each its own tmux window, so tmux has to be installed first. The head-to-head, with the Procfile conversion, is on the Foreman vs Overmind page.
Which of these run on Linux or Windows?
tmux, Docker Compose, Foreman and PM2 all run on Linux, and Compose and PM2 run on Windows too; Overmind covers Linux, *BSD and macOS. iTerm2, cmux and lpm are Mac apps. lpm can drive a Linux machine as a headless host from the Mac, but the app itself is macOS only.
Which of them will launch Claude Code or Codex for me?
cmux and lpm, and as of September 2026 iTerm2 has a Claude Code integration too. cmux is built around agent sessions in the terminal. lpm puts Claude Code and Codex a click away in every project from the first launch, offers Gemini CLI and OpenCode when they are installed, opens each agent in its own tab alongside the running services, marks a Claude Code or Codex tab working, needs-you or done as the agent goes, and can copy the whole project so two agents never edit the same files. The rest are process runners with no opinion about agents.
Can I run more than one of these at once?
Usually yes, and most people do. Keep iTerm2 or tmux for SSH and ad-hoc shells, keep PM2 for anything that has to stay alive, keep compose for the services that need a container — and let one tool own starting and stopping the project. Nothing here holds your processes hostage.
Which of them are free and open source?
tmux, Foreman, Overmind, PM2 and Docker Compose are all open source and free; iTerm2 is free under GPLv2 and lpm is free under MIT. cmux ships under GPL-3.0-or-later; an organisation that cannot live with that can ask for commercial terms, and new features reach paying Founder's Edition users first. Docker Desktop — how most Mac developers get Compose — is the one that can cost money: past Docker's size and revenue thresholds a company needs a paid subscription.