Foreman
Keep Foreman
Two lines in Procfile.dev, $PORT assigned for you, .env loaded automatically, and foreman export generating the launchd or systemd units your deploy needs.
Both read the same Procfile.dev. Foreman interleaves everything on one stdout stream, Overmind gives each process a tmux window, and lpm gives every line a live pane of its own.
If your Procfile.dev is two lines and nothing ever crashes, Foreman is still the answer.
Facts checked . The foreman gem sits at 0.90.0 from July 2025; Overmind's newest tag, v2.5.1, is from March 2024. Every lpm cell was re-read off the app's own source.
The short answer
Overmind, if you want to attach to or restart one process without touching the rest — it runs each process in its own tmux window to make that possible, and -m web=2,worker=3 scales one of them. Foreman, if one interleaved stream on stdout is all you need, if you would rather not install tmux, or if your deploy depends on foreman export.
There is a third shape. foreman start puts your whole stack in one terminal, and when the CSS watcher dies it takes Rails with it. lpm runs the same web, css and worker lines as separate live panes on macOS — restart one, leave the rest alone, and quit the app without killing anything. Add the folder and lpm reads Procfile.dev for you, one service per line, with the -p 3000 kept as the port it watches.
web: bin/rails server -p 3000
css: bin/rails tailwindcss:watch
worker: bundle exec sidekiqservices:
web:
cmd: bin/rails server -p 3000
port: 3000
css:
cmd: bin/rails tailwindcss:watch
worker:
cmd: bundle exec sidekiqThat is the whole migration, and nobody types it. What changes is not the declaration — it is that worker can crash without taking web down with it.
Foreman
Two lines in Procfile.dev, $PORT assigned for you, .env loaded automatically, and foreman export generating the launchd or systemd units your deploy needs.
Overmind
overmind connect web to attach one process, restart it without the rest, -m web=2 to scale it, and Linux or *BSD support.
lpm
A pane per process, a project switcher across repos, services that outlive the app, and Claude Code or Codex in the next tab. Mac only, and it takes Procfile.dev in once, as the project is added, rather than on every start.
One process exits and the whole formation shuts down mid-request.
In lpm each service is its own pane; nothing stops the siblings when one exits, and you bring that one back with lpm service css restart, or by switching it off and on again in the project's Services menu. Overmind restarts one too — that is what it exists for — though there a dying process interrupts the rest unless you list it under -c.
lpm's services run outside the app, so quitting it leaves the dev servers up and relaunching finds them again. Overmind's tmux session detaches and keeps going; a foreman formation ends with the command that started it.
lpm checks the ports your services declare before it starts, names the process holding one, and offers to free it or stop the start.
dependsOn: [db] gives a real start order, with a clear error instead of a hang if you write a cycle. It orders starts; lpm wait --port 5432 is the readiness gate.
Nine of these twenty-one rows go to Foreman or Overmind. They are the first nine.
| Capability | lpm | Foreman | Overmind |
|---|---|---|---|
| Re-reads Procfile.dev every time it starts | imports it once, when you add the folder | Yes | Yes |
| Sets $PORT for each process type | you write it in env: | -p base, +100 a line | -p base, -P step |
| Reads a .env file without being asked | No | .env in the working directory | .overmind.env, then .env |
| All output interleaved on one stdout stream | No | Yes | No |
| Exports launchd or systemd units for deploy | No | foreman export | No |
| Installs on a Windows or Linux workstation | Mac app; Linux only as a remote host | Linux, macOS | Linux, *BSD, macOS |
| Attach a shell to one running process | panes are read-only | No | overmind connect |
| Run two copies of web from one line | one entry, one process | -m web=2 | -m web=2 |
| One command brings the whole stack up | one click, or lpm start with the app running | Yes | Yes |
| A live pane per process, all visible at once | Yes | No | a tmux window each |
| Restart css without restarting web | lpm service css restart | No | overmind restart css |
| One process dying leaves the others alive | Yes | one exit ends the formation | only with -c or --any-can-die |
| The stack outlives the terminal you started it in | quit the app, services stay up | No | its tmux session, detach with Ctrl-b d |
| What you install before the first run | the app; no tmux, no Ruby | Ruby, then the gem | tmux, then the binary |
| Redis is started before Sidekiq | dependsOn: [redis] | No | No |
| Names what is already holding :3000 | Yes | No | No |
| Run a named subset instead of a per-run flag | profiles: | -m web=2,worker=0 | -l web,worker |
| Two Rails apps up at once in one window | Yes | No | No |
| A second Claude Code or Codex agent gets its own checkout | 1–50 worktrees or copies | No | No |
| A desktop window rather than a foreground command | Yes | a foreground command | a foreground command plus tmux |
| Licence on the gem, the binary and the app | MIT | MIT | MIT |
Adding the folder brings the three Procfile lines across, and the -p 3000 on web becomes the port lpm watches. What you add by hand is the Redis line a Procfile usually leaves out and the start order it has no room for. Every field is listed in the config reference.
services:
web:
cmd: bin/rails server -p 3000
port: 3000
env:
PORT: "3000"
css: bin/rails tailwindcss:watch
redis:
cmd: redis-server
port: 6379
worker:
cmd: bundle exec sidekiq
dependsOn: [redis]
profiles:
default: [web, css]
full: [web, css, redis, worker]$PORT is not set for you.port: is what it watches for conflicts, not something it exports, and an imported line that only says $PORT arrives with no port at all. Set it yourself — env: { PORT: "3000" } — or hard-code the flag the way Rails' own Procfile.dev already does..env is not loaded automatically.foreman start reads .env from the working directory; Overmind reads .overmind.env and then .env. lpm exports exactly the env: map you write, so move the handful of variables you need there, or keep loading .env inside the command with dotenv.foreman start -m web=2,worker=0 becomes a profile.profiles: { default: [web, css], full: [web, css, redis, worker] }, then lpm start --profile full. Named subsets instead of a per-run flag — and no process scaling: one entry is one process.foreman export.Which verbs need the app running, since this is the one thing foreman start never made you think about. lpm start, lpm stop, lpm run and lpm service css restart are requests to the app, and fail with a usage error when it is closed. lpm list and lpm logs css go straight to the services and answer from any shell, open app or not. lpm status, which reports what your agents are doing, needs it too.
The one-off commands you run with foreman run become actions you click, or call with lpm run.
Both start the same commands from the same one-line declaration. The split is what happens after they are running.
A short video: pick a folder or clone a repo, and it joins the sidebar.Click anything — the Rails stack runs in your browser.
lpm is a macOS app with a multi-pane terminal workspace. Open this page on your computer to try the interactive demo.
Get lpm for MacOr check your Macs from your iPhoneClick a step to run it in the window.
Done poking around? Get lpm for Mac and point it at your own projects.
-m web=2,worker=3 scales one of them. Foreman, if one interleaved stream on stdout is all you need, if you would rather not install tmux, or if your deploy depends on foreman export.Procfile.dev (or Procfile, if that is all there is) and makes each line a service, keeping its name, its command and any -p port. After that the list is lpm's own, so a line you add to the Procfile later has to be added in lpm too. The file itself is never touched — it stays in the repo for Heroku and foreman export.bin/dev shells out to Foreman with Procfile.dev. With lpm you press Start, or run lpm start, and the same lines come up as separate panes. Keep bin/dev working — nothing removes it.env: map you write on each service, so move the variables you need there or keep loading .env inside the command with dotenv.The two-way version of this page: what changes when the Procfile runner you already have is tmux-backed.
When the services in your stack are images rather than Procfile lines, and what you give up either way.
services, port, env, dependsOn, profiles and actions — the reference for the file you just converted into.
What it looks like to keep an agent in the tab next to the panes running your Rails stack.
Where the copies come from when two agents need the same repo, and exactly what a copy does not carry.
Pair a headless Linux machine, run the stack and the agents there, and drive both from the Mac window.
lpm starts the same commands your Procfile.dev already names, one pane each, and leaves them running when you quit the app. Free, MIT-licensed, macOS.