Every morning I sit down, open my terminal, and start working on a project. That means I need my editor, a dev server, a type checker, lazygit, and a couple of AI coding tools. That is six terminal windows. Every single day.
For a long time I was doing this manually. Open tmux, create a window, run a command, create another window, run another command. Repeat six times. It is not the end of the world, but it is boring and repetitive. And sometimes I forgot to start the type checker and only noticed when something was already broken.
Then I found tmuxinator.
This post is part of my terminal workflow series.
What is tmuxinator?
Tmuxinator is a simple tool that manages tmux sessions using YAML config files. You describe what windows you want, what commands should run in each one, and tmuxinator does the rest. One command and your entire workspace is ready.
If you do not know tmux: it is a terminal multiplexer. It lets you have multiple terminal windows inside one terminal, and your sessions survive even if you close the terminal app. I wrote a detailed post about my tmux setup. Tmuxinator just adds a nice layer on top of it.
Why I like it
It removes the boring part of starting work. I type tmuxinator start eshlox and in a few seconds everything is running. My editor is open, the dev server is up, the type checker is watching for errors, lazygit is ready, and my AI tools are loaded. I can start coding immediately.
It is just a YAML file. No complex configuration, no special syntax. You list your windows and commands. That is it. The config lives in ~/.config/tmuxinator/ so it is easy to back up or share.
Each project can have its own setup. I have different configs for different projects. One project needs a dev server and type checking. Another might need a database and a queue worker. Each project gets exactly what it needs.
It is consistent. I always know where things are. Window 1 is the editor, window 2 is Claude Code, window 3 is Codex, and so on. Muscle memory kicks in and I switch between windows without thinking.
My config
Here is the tmuxinator config I use for my personal site project:
name: eshloxroot: ~/projects/eshlox.net
# Which window to focus when the session startsstartup_window: helix
windows: - helix: - hx . - claude: - claude - codex: - codex - lazygit: - lazygit - dev: - pnpm run dev - typecheck: - pnpm run typecheck:watchLet me walk through it:
The name is used to start and stop the session. The root sets the working directory for all windows, so every command runs in the project folder.
Then there are six windows. helix opens my code editor. claude and codex are AI coding assistants that I use for different things. lazygit is a terminal UI for Git. dev starts the development server. And typecheck runs the TypeScript type checker in watch mode so I see errors in real time.
The startup_window option means when the session opens, I land directly in the editor, ready to work.
Getting started
Install tmuxinator (you need tmux installed first):
brew install tmuxinatorCreate a new project config:
tmuxinator new myprojectThis opens a YAML file in your editor. Fill in your windows and commands, save it, and then:
tmuxinator start myprojectWhen you are done:
tmuxinator stop myprojectFinal thoughts
Tmuxinator is one of those small tools that you do not think you need until you try it. It saves maybe two minutes each morning. But those two minutes of repetitive setup were the most annoying part of starting work. Now I just run one command and I am in the zone.
If you use tmux and you find yourself opening the same windows every day, give tmuxinator a try. It is simple, it works, and it makes your workflow a little bit nicer.