tmux
Keep tmux for
Remote sessions you reach from any machine, vim splits, ops work, and a .tmux.conf you actually enjoy.
tmux is a fine multiplexer and this page does not pretend otherwise. What it does not know is what a project is: which commands belong together, which order they start in, and which repo they came out of.
Most people asking for a tmux alternative want one of tmux's three jobs. lpm takes that one.
Facts checked against the tmux manual and the tmuxinator README. Where tmux is the better tool the comparison below says so, in three of its fifteen rows; every lpm cell was read off the app's own source.
The short answer
Yes, if what you want from tmux is one pane per service. lpm is a macOS app that starts every service in a project at once, each in its own live pane, from a short service list instead of a .tmux.conf. It does not use tmux and does not need it installed — quit lpm and your dev servers keep running; reopen it and it finds them again.
Each pane keeps 10,000 lines of scrollback, and you restart one service with lpm service web restart instead of respawning a pane by hand. When the repo has a package.json dev script, a Procfile, a Rails Gemfile or a go.mod, lpm writes that list itself as you add the folder; anything it misses is a service name and a command, so translating a tmuxinator window list takes about a minute.
name: myapp
root: ~/Projects/myapp
services:
web: npm run dev
api: go run ./cmd/server
db: docker compose up postgresThen press Start, or run lpm start myapp from any terminal while the app is open. tmux is still the better answer for a session that lives on a remote box, for vim splits, and for anything you have already bound to a key — this page is about the one job the two tools overlap on.
tmux
Remote sessions you reach from any machine, vim splits, ops work, and a .tmux.conf you actually enjoy.
lpm
Starting and stopping a project's whole stack, switching between projects, and watching Claude Code or Codex work beside the services.
Both
lpm has no opinion on your shell or terminal, and it does not touch your .tmux.conf or your tmuxinator files. Nothing to uninstall.
Every morning: four panes, four commands, in the same order. In lpm that is a services map drafted from your repo when you add it, and a Start button, with dependsOn for the ones that must come up first and profiles for the days you only need the front end.
If the session lives on a remote box you reach from a laptop, a phone and a machine at the office, tmux on that box is the right tool. lpm drives remote boxes as projects from a Mac; it does not replace a multiplexer you attach to over SSH.
Prefix keys, copy mode, custom layouts, vim splits. lpm has splits, three remappable app hotkeys and a shortcut you can bind to any action — not a scripting surface. If your .tmux.conf is a pleasure to use, keep it.
Most people asking for a tmux alternative want job one and have never wanted jobs two and three.
tmux wins on persistence, portability and raw scriptability; lpm wins on projects, a drafted config and a desktop app. Three rows below go to tmux outright — your own shells across a restart, keys and layouts in a config file, and where you install each tool — and one goes to neither.
| Capability | lpm | tmux |
|---|---|---|
| One command brings the whole project up | Start button; lpm start myapp needs lpm running | via tmuxinator |
| Service list drafted from your repo, then yours to edit | package.json, Procfile, Gemfile, go.mod, compose and more, read as you add it | No |
| Redrafts the whole config with your own agent CLI | Claude Code, Codex, Gemini CLI or OpenCode | No |
| One live pane per service | Yes | Yes |
| Scrollback kept per service pane | 10,000 lines, and no setting to change it | 2,000 by default, raise it with history-limit |
| Restart one service without touching the others | lpm service web restart | respawn-pane by hand |
| Services keep running after you quit the app | Yes | Yes |
| Your own shells survive a restart too | tabs come back; Claude Code and Codex resume their conversation, shells start fresh | Yes |
| Restarts a crashed service automatically | No | No |
| Which agent needs you, shown on its own tab | working, needs you, done or error, from Claude Code and Codex | No |
| Runs with no tmux installed | Yes | No |
| Switch projects from a sidebar that remembers them | Yes | via tmuxinator |
| Attach a remote box and run its services in the same window | from the Mac app | on the box itself |
| Remap every key and script custom layouts in a config file | three remappable app hotkeys, plus a shortcut per action | via .tmux.conf |
| Where you install it | a Mac app; a Linux box joins as a remote host | on each Unix box you use it on |
The sidebar remembers the projects you add, the folders you put them in and the order you leave them — there is more on the project sidebar.
A tmuxinator project is a window list. An lpm project is a service map. The translation is mechanical, and adding the folder already does most of it.
name: myapp
root: ~/Projects/myapp
windows:
- web: npm run dev
- api: go run ./cmd/server
- db: docker compose up postgresname: myapp
root: ~/Projects/myapp
services:
web: npm run dev
api:
cmd: go run ./cmd/server
cwd: ./backend
dependsOn: [db]
db: docker compose up postgresTwo things a window list cannot express: dependsOn, so db is up before api goes looking for it, and profiles, so profiles: { frontend: [web] } gives you a smaller stack on the days you do not need the rest. dependsOn sets the order, not readiness — lpm wait --port 5432 is the gate. Put the same services in a .lpm.yml at the repo root and your team gets them on clone, next to anything lpm picks up from the repo on their machine. The reference documents every field a project file takes.
The tmux and tmuxinator lines a dev stack actually uses, next to the lpm line that does the same job.
| tmux / tmuxinator | lpm | Notes |
|---|---|---|
tmuxinator start myapp | lpm start myapp | Or press Start on the project. |
tmux ls | lpm list | Running state and service counts, plus agents when lpm is up. |
tmux attach -t myapp | click the project in the sidebar | |
tmux kill-session -t myapp | lpm stop myapp | |
tmux capture-pane -p -t myapp:web | lpm logs web -n 200 | Trailing lines of that service's pane. |
respawn one pane | lpm service web restart | The other services keep running. |
set -g history-limit 2000 | nothing to set; 10,000 lines per pane | |
— | lpm wait --port 3000 | Block a script until the stack is listening. |
tmux / tmuxinator
tmuxinator start myapplpm
lpm start myappOr press Start on the project.
tmux / tmuxinator
tmux lslpm
lpm listRunning state and service counts, plus agents when lpm is up.
tmux / tmuxinator
tmux attach -t myapplpm
click the project in the sidebartmux / tmuxinator
tmux kill-session -t myapplpm
lpm stop myapptmux / tmuxinator
tmux capture-pane -p -t myapp:weblpm
lpm logs web -n 200Trailing lines of that service's pane.
tmux / tmuxinator
respawn one panelpm
lpm service web restartThe other services keep running.
tmux / tmuxinator
set -g history-limit 2000lpm
nothing to set; 10,000 lines per panetmux / tmuxinator
—lpm
lpm wait --port 3000Block a script until the stack is listening.
These fall into two groups. lpm start, lpm stop and lpm service … restart hand the work to the app, and lpm status asks it what your agents are doing — so those four want lpm open. lpm list, lpm logs and lpm wait --port read your running services themselves, from any shell, whether lpm is up or not.
Adding a project and shaping its service list in the built-in editor — the whole of what replaces your tmuxinator file.
tmux and lpm do different jobs that overlap only at 'run services in panes.' Pick based on what you really need, not on which tool is newer.
A one-minute tour: start a project and hand it to Claude Code.No prefix key to learn — click anything, it runs live.
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.
rails s, npm dev, redis, and sidekiq, lpm will feel like a shortcut. If you lean on custom layouts, splits, and keybindings, tmuxinator will still suit you better.For anyone whose service list already lives in a Procfile: lpm imports it once, when the folder is added.
lpm does not restart a service that dies. That trade-off, at length.
Attach a dev box over SSH: its services get panes in the same window as the local ones.
Every repo you work in, in folders, in the order you left them.
What a project file takes: services, dependsOn, profiles, declared ports, actions.
The agent tabs that sit next to the service panes, and the working or needs-you state each one shows.
lpm is free, MIT-licensed, and runs as a native macOS app. Add the folder, check the services it lists, press Start, and every service comes up in its own pane — with no tmux installed.