Personal development environment setup for macOS with Ghostty, TMUX, and Zsh (Powerlevel10k)
- Ghostty Terminal - Modern GPU-accelerated terminal
- TMUX - Persistent terminal sessions with custom keybindings
- Zsh + Oh My Zsh - Enhanced shell experience
- Powerlevel10k - Beautiful and fast prompt theme
- Optimized for macOS - Keyboard shortcuts that don't conflict with system
dotfiles/
βββ ghostty/
β βββ config # Ghostty configuration
β βββ start-session.sh # TMUX session auto-start script
βββ tmux/
β βββ .tmux.conf # TMUX configuration
βββ zsh/
β βββ .zshrc # Zsh configuration
βββ macos/
β βββ airplay-hisense-proxy.sh # AirPlay fix for Hisense VIDAA TV
βββ claude/
β βββ output-styles/caveman.md # Caveman output style (terse prose)
β βββ commands/caveman.md # /caveman slash command
β βββ caveman-toggle.sh # Toggles Caveman prose + ponytail together
β βββ install-caveman-ponytail.sh # Installs both into ~/.claude
βββ install.sh # Automated installation script
βββ README.md # This file
git clone https://github.com/YOUR_USERNAME/dotfiles.git ~/dotfiles
cd ~/dotfiles
chmod +x install.sh
./install.shIf you prefer to install manually:
-
Install Homebrew (if not installed):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
Install TMUX:
brew install tmux
-
Install Ghostty:
- Download from ghostty.org
-
Install Oh My Zsh:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" -
Install Powerlevel10k:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k -
Install Zsh plugins:
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
-
Copy config files:
cp tmux/.tmux.conf ~/.tmux.conf cp zsh/.zshrc ~/.zshrc mkdir -p ~/.config/ghostty cp ghostty/config ~/.config/ghostty/config cp ghostty/start-session.sh ~/.config/ghostty/start-session.sh chmod +x ~/.config/ghostty/start-session.sh
-
Restart your terminal or run:
source ~/.zshrc
| Shortcut | Action |
|---|---|
Ctrl+a then Tab |
Next window |
Ctrl+a then Shift+Tab |
Previous window |
Ctrl+a then 0-9 |
Jump to window number |
Ctrl+a then n |
New window |
Ctrl+a then q |
Close window |
| Shortcut | Action |
|---|---|
Ctrl+a then | |
Split vertically |
Ctrl+a then - |
Split horizontally |
Ctrl+a then x |
Close pane |
Alt+Arrows |
Navigate panes (no prefix!) |
| Shortcut | Action |
|---|---|
Ctrl+a then r |
Reload TMUX config |
Ctrl+a then [ |
Scroll mode (press q to exit) |
Edit ghostty/start-session.sh to customize your workspace layout:
# Example: Add a new window
$TMUX_BIN new-window -t main:5 -n "My Project" -c ~/Projects/my-projectEdit ghostty/config to change the theme:
theme = Laser # Change this
background-opacity = 0.8
background-blur-radius = 30
Add your custom aliases in zsh/.zshrc at the bottom:
alias myalias='my command'Make sure the startup script is executable:
chmod +x ~/.config/ghostty/start-session.shRun the configuration wizard:
p10k configureEnsure your terminal is set to use true color:
echo $TERM # Should be "tmux-256color" inside TMUXThe TV's AirPlay 2 receiver is fine (port 7000 is open and answers /info) β what
fails is discovery: this Wi-Fi drops mDNS multicast (224.0.0.251), so the TV's
Bonjour announcement never reaches the Mac. Note that ping to the TV always fails
because the TV drops ICMP; that is not a network problem.
Workaround β ask the TV for the TXT record it would advertise and register it locally, bypassing multicast entirely:
./macos/airplay-hisense-proxy.sh start # then: Control Center -> Screen Mirroring
./macos/airplay-hisense-proxy.sh status
./macos/airplay-hisense-proxy.sh stop
./macos/airplay-hisense-proxy.sh diag # 30s tcpdump, pinpoints the root cause (needs sudo)
./macos/airplay-hisense-proxy.sh install-agent # persist across rebootThe real fix is upstream: either IGMP Snooping on the router, or Internet Sharing
interfering with mDNSResponder. Run diag to find out which.
Two settings that cover different halves of the same taste, driven by one switch.
- Caveman is an output style: how the agent talks. No preamble, no closing recap, no praise; answer in the first words. Code, commands, paths, identifiers, error text and stated risks are never compressed β brevity is not allowed to buy a vaguer answer.
- ponytail is a plugin: what the agent builds. It climbs a YAGNI ladder before writing code β does this need to exist, is it already in the codebase, does the stdlib or a native platform feature cover it, can it be one line β and never simplifies away validation, error handling, security or accessibility.
ponytail's own skill file says to pair it with Caveman, which is what this setup
does: /caveman writes both settings at once so they cannot drift apart.
./claude/install-caveman-ponytail.sh # install and enable both
./claude/install-caveman-ponytail.sh --no-enable # install onlyIt copies the output style, the slash command and the toggle script into
~/.claude (backing up anything it replaces), rewrites the absolute paths in the
command for your home directory, and installs the ponytail plugin through Claude
Code's plugin manager. ponytail is deliberately not vendored here β it has its
own release cadence, so only the glue lives in this repo.
Needs claude and python3, plus node on the non-interactive shell's PATH
for ponytail's lifecycle hooks (relevant for nvm and Nix users).
| Command | Effect |
|---|---|
/caveman on |
Both on, ponytail at full |
/caveman on lite |
Caveman prose + ponytail names the lazier option, you pick |
/caveman on ultra |
Caveman prose + YAGNI extremist |
/caveman off |
Both off |
/caveman |
Toggle |
/caveman status |
Report both |
The ponytail level applies immediately; an output style change may need a new
session. /ponytail lite|full|ultra|off still changes the code side alone.
The toggle writes three places: outputStyle in ~/.claude/settings.json,
the live mode in ~/.claude/.ponytail-active, and defaultMode in
~/.config/ponytail/config.json (so it survives a restart).
Feel free to fork and customize for your own needs!
MIT License - Feel free to use and modify as you like.
- Ghostty - Terminal emulator
- TMUX - Terminal multiplexer
- Oh My Zsh - Zsh framework
- Powerlevel10k - Zsh theme
Made with β€οΈ by vb