Ghostty + tmux Startup Automation
Ghostty + tmux Startup Automation
This guide shows you how to configure Ghostty terminal to automatically start tmux sessions in specific directories when you press Cmd+T.
Series navigation:
- tmux Basics - Core concepts
- tmux Configuration with chezmoi - Config management
- TPM - Tmux Plugin Manager - Plugins
- Ghostty + tmux Startup Automation (this article)
- tmux Session Presets - Project layouts
What Problem Does This Solve?
Without automation:
- Press Cmd+T β Generic terminal opens in ~/
- Manually cd to project directory
- Manually start tmux session
- Manually create your layout
With automation:
- Press Cmd+T β tmux session already attached
- Already in your project directory
- Ready to code immediately
Pre-Setup Checklist
β Ghostty terminal installed β tmux installed and configured (tmux Configuration with chezmoi) β chezmoi managing your Ghostty config
Method 1: Simple Directory Preset (Recommended for Beginners)
This method makes new Ghostty tabs open in a specific directory with tmux attached.
Step 1: Configure Ghostty Working Directory
Add to your Ghostty config (managed by chezmoi):
bash# Edit through chezmoi chezmoi edit "Library/Application Support/com.mitchellh.ghostty/config"
Add these lines:
bash# Open new windows/tabs in specific directory working-directory = /Users/yourusername/Code/github.com/theslyprofessor/midimaze # Auto-attach to tmux (see next step) shell-integration-features = no-cursor,no-sudo,no-title
Step 2: Create Startup Script
Create a script that runs when terminal opens:
bash# Create the script touch ~/.local/bin/tmux-auto-attach chmod +x ~/.local/bin/tmux-auto-attach
Edit ~/.local/bin/tmux-auto-attach:
bash#!/bin/bash # Auto-attach to tmux session, or create default session if [ -z "$TMUX" ]; then # Check if we have a default session if tmux has-session -t default 2>/dev/null; then # Attach to existing default session exec tmux attach -t default else # Create new default session exec tmux new -s default fi else # Already in tmux, just start shell exec $SHELL fi
Step 3: Add to chezmoi
bash# Add script to chezmoi chezmoi add ~/.local/bin/tmux-auto-attach # Commit cd ~/.local/share/chezmoi git add . git commit -m "Add Ghostty tmux auto-attach script" git push
Step 4: Configure Shell to Use Script
Add to your ~/.zshrc (or ~/.bashrc):
bash# Auto-attach to tmux when opening new terminal # (Only if not already in tmux and TERM_PROGRAM is Ghostty) if [ -z "$TMUX" ] && [ "$TERM_PROGRAM" = "ghostty" ]; then ~/.local/bin/tmux-auto-attach fi
Add to chezmoi:
bashchezmoi add ~/.zshrc cd ~/.local/share/chezmoi git add . git commit -m "Add tmux auto-attach to shell rc" git push
Result
Now when you:
- Open Ghostty
- Press Cmd+T for new tab
- Automatically: Opens in midimaze directory with tmux attached!
Method 2: Smart Directory Detection
This method detects if you're in a project directory and creates/attaches to project-specific sessions.
Create Smart Script
Edit ~/.local/bin/tmux-smart-attach:
bash#!/bin/bash # Get current directory name PROJECT_NAME=$(basename "$PWD") # If already in tmux, do nothing if [ -n "$TMUX" ]; then exec $SHELL exit 0 fi # Check if we're in a known project directory case "$PWD" in */midimaze) SESSION="midimaze" ;; */nakultiruviluamala) SESSION="website" ;; */PhD) SESSION="phd" ;; */nnt-docs) SESSION="nnt" ;; *) # Default session for other directories SESSION="default" ;; esac # Attach to or create the session if tmux has-session -t "$SESSION" 2>/dev/null; then exec tmux attach -t "$SESSION" else exec tmux new -s "$SESSION" fi
Make it executable and add to chezmoi:
bashchmod +x ~/.local/bin/tmux-smart-attach chezmoi add ~/.local/bin/tmux-smart-attach
Update your .zshrc:
bash# Smart tmux session based on directory if [ -z "$TMUX" ] && [ "$TERM_PROGRAM" = "ghostty" ]; then ~/.local/bin/tmux-smart-attach fi
Result
Now tmux sessions are automatically named based on your project!
bash# In ~/Code/.../midimaze tmux ls # Shows: midimaze (attached) # In ~/Code/.../nakultiruviluamala tmux ls # Shows: website (attached)
Method 3: Per-Tab Custom Commands (Advanced)
Ghostty supports keybindings that can run different commands.
Configure Different Keybindings for Different Projects
Edit Ghostty config:
bashchezmoi edit "Library/Application Support/com.mitchellh.ghostty/config"
Add custom keybindings:
bash# Default new tab (Cmd+T) keybind = cmd+t=new_tab:~/.local/bin/tmux-smart-attach # Midimaze tab (Cmd+Shift+M) keybind = cmd+shift+m=new_tab:~/.local/bin/start-midimaze # Website tab (Cmd+Shift+W) keybind = cmd+shift+w=new_tab:~/.local/bin/start-website # PhD tab (Cmd+Shift+P) keybind = cmd+shift+p=new_tab:~/.local/bin/start-phd
Create Project-Specific Scripts
For midimaze (~/.local/bin/start-midimaze):
bash#!/bin/bash cd ~/Code/github.com/theslyprofessor/midimaze exec tmux new -s midimaze -A # -A = attach if exists
For website (~/.local/bin/start-website):
bash#!/bin/bash cd ~/Code/github.com/theslyprofessor/nakultiruviluamala exec tmux new -s website -A
For PhD (~/.local/bin/start-phd):
bash#!/bin/bash cd ~/Code/github.com/theslyprofessor/PhD exec tmux new -s phd -A
Make them executable:
bashchmod +x ~/.local/bin/start-*
Add to chezmoi:
bashchezmoi add ~/.local/bin/start-* cd ~/.local/share/chezmoi git add . git commit -m "Add project-specific tmux launchers" git push
Result
Now you have keyboard shortcuts for each project:
- Cmd+T β Smart session based on current directory
- Cmd+Shift+M β Midimaze project
- Cmd+Shift+W β Website project
- Cmd+Shift+P β PhD project
Recommended Setup for Your Workflow
Based on your setup (chezmoi + midimaze focus), I recommend:
1. Update Ghostty Config
bashchezmoi edit "Library/Application Support/com.mitchellh.ghostty/config"
Add:
bash# Theme theme = Blue Matrix window-save-state = always # Default directory for new tabs working-directory = /Users/ntiruviluamala/Code/github.com/theslyprofessor/midimaze # Keybindings for splits keybind = cmd+d=new_split:right keybind = cmd+shift+d=new_split:down # Navigate between panes (vim-style) keybind = ctrl+h=goto_split:left keybind = ctrl+j=goto_split:bottom keybind = ctrl+k=goto_split:top keybind = ctrl+l=goto_split:right # Project shortcuts keybind = cmd+shift+m=new_tab:~/.local/bin/start-midimaze keybind = cmd+shift+w=new_tab:~/.local/bin/start-website
2. Create tmux Auto-Attach Script
bash# Create ~/.local/bin/tmux-auto-attach as shown in Method 1 # Add to chezmoi chezmoi add ~/.local/bin/tmux-auto-attach
3. Update .zshrc
bashchezmoi edit ~/.zshrc
Add:
bash# Auto-attach to tmux in Ghostty if [ -z "$TMUX" ] && [ "$TERM_PROGRAM" = "ghostty" ]; then ~/.local/bin/tmux-auto-attach fi
4. Commit Everything
bashcd ~/.local/share/chezmoi git add . git commit -m "Configure Ghostty + tmux auto-start workflow" git push
Now when you press Cmd+T:
- β Opens in midimaze directory
- β Attaches to tmux session
- β All config is version controlled with chezmoi
- β Works on all your machines
Troubleshooting
Terminal opens but tmux doesn't start
Check if script is executable:
bashls -la ~/.local/bin/tmux-auto-attach # Should show: -rwxr-xr-x
Make it executable:
bashchmod +x ~/.local/bin/tmux-auto-attach
Script runs twice (nested tmux)
Add the TMUX check to your script:
bashif [ -n "$TMUX" ]; then exec $SHELL exit 0 fi
Ghostty config not applying
Apply chezmoi changes:
bashchezmoi apply
Restart Ghostty.
Wrong directory opens
Check Ghostty config:
bashchezmoi cat "Library/Application Support/com.mitchellh.ghostty/config" | grep working-directory
Update if needed:
bashchezmoi edit "Library/Application Support/com.mitchellh.ghostty/config"
Next Steps
- tmux Session Presets - Create complex multi-window layouts for each project
- TPM - Tmux Plugin Manager - Add plugins like tmux-resurrect to save layouts automatically
- tmux Basics - Review core tmux concepts
Related:
- tmux Configuration with chezmoi - Managing tmux config
- Dev Environment Stack - Understanding configuration layers