Skip to content
Mac dev stacks · seven tools

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.

Jump to the table: seven tools and lpm

The short answer

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.

  • 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.

Start here: what are you using now?

You run each process in its own terminal tab

lpm vs iTerm2

What it is
A Mac terminal emulator with a deep configuration surface: triggers, smart selection, a Python API, tmux control mode.
Switch if
you retype the same four commands in four tabs every morning.
Stay if
you want a terminal emulator. lpm ships its own, and its Open in iTerm action hands the project directory straight to yours.

You have a .tmux.conf or a tmuxinator file

lpm vs tmux

What it is
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.

You have a Procfile

lpm vs Foreman

What it is
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.

lpm vs Overmind

What it is
A Procfile runner built on tmux — overmind connect attaches one process, overmind restart bounces one.
Switch if
you want that per-process control with no multiplexer to install under it.
Stay if
you need Linux or *BSD, -m web=2,worker=3 scaling, or a PORT handed to each process.

You have a compose file

lpm vs Docker Compose

What it is
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 up as one of its services, beside any native ones it found.

You use pm2 for local dev

lpm vs PM2

What it is
A production process supervisor: keep-alive with backoff, cluster mode across cores, boot persistence, log rotation.
Switch if
you are driving a production daemon through a dev loop you sit and watch.
Stay if
you need cluster mode, pm2 startup, or zero-downtime reload. Different jobs — plenty of people run both.

You are choosing a terminal for coding agents

lpm vs cmux

What it is
A macOS terminal built around agent sessions: workspaces you switch between, plus a browser pane and a CLI you can automate.
Switch if
you want the project managed too — services, a port check before they start, and a separate checkout per agent — not just the panes.
Stay if
the terminal is the whole job.

Either way, read the agent-workflow guide →

One command

Every service up, one live pane each

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.

Keep the tool that already works. Let lpm start the project.

Free, open source, native macOS app. No lock-in — lpm starts and stops native processes the same way you would.