Enabling faster terminal startup with tmux

2024-03-16

I recently started a new job. The company cares about security; the computer I've been assigned has some program-startup-latency which I'm confident has something to do with some extra security features. It's super powerful M2 MacBook Pro that, in general, is very fast.

One of those slow actions is simply starting a new shell (I use Bash). Starting Bash takes almost a second (my .bashrc isn't doing much; the equivalent .bashrc on my personal Linux box provides an unnoticeable startup time). If the shell is slow to start, then obviously a fresh terminal which spins up a shell will be slow to start. Independent of terminal emulator use (I've tried multiple), it gets a little frustrating to type Cmd+N and wait a second, or click on the icon in the dock and wait a second. For me it's simple muscle memory to do both, so it adds up throughout the day.

I've been using tmux for years, but mostly just as a way to keep shells running on remote machines (and never really finding it useful for local work). With the slow shell startup I've been experiencing I decided to see if it could help, and it sure does. Instead of new sessions of my terminal emulator running bash, they run tmux and attach (or create, if necessary) to a tmux session called scratch (taking inspiration from the best: Emacs).

With my current terminal of choice, Alacritty, this is enabled by adding to my alacritty.toml file:

[shell]
program = "/opt/homebrew/bin/tmux"
args = ["new", "-A", "-s", "scratch"]

It can also be accomplished with Terminal.app by modifying the Profile's shell tab to run the command (same as above):

/opt/homebrew/bin/tmux new -A -s scratch

Now my terminals start without the 1 second drag, and I get to keep my scratch shell going all the time. It's also helping me get more out of tmux locally, because I'm always in it jumping around sessions, windows, and panes. It's really a great tool.