My productivity setup for macOS (Apple Silicon). Not tested on Linux.
A modern, opinionated development environment for macOS:
- Aerospace — i3-like tiling window manager for macOS
- Sketchybar — highly customizable status bar for macOS
- Zsh — main shell with Starship prompt using the Pastel Powerline preset
- Atuin — magical shell history with sync across machines
- Tmux — terminal multiplexing with Claude Code integration and process management
- Neovim with LazyVim — pre-configured, extensible code editing
- Ghostty — fast, native terminal emulator
- Claude Code — AI coding assistant with custom hooks and status line
- 1Password CLI — secrets injected at login via
op inject - Hiddenbar and Stats — menu bar and system monitoring
Example: Starship prompt (Pastel Powerline), Ghostty terminal, and Sketchybar on macOS.
- Getting Started
- What Each Install Script Does
- Secrets Management
- Tmux
- Claude Code Integration
- Cheatsheet
- My Mac Setup
- About Aerospace
The install script backs up existing configuration files, but read below before running it!
Requirements:
- Git
- Homebrew (macOS package manager)
- 1Password CLI (
op) — for secrets injection
# Install Homebrew if not already installed
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"git clone https://github.com/mehd-io/dotfiles ~/.dotfiles
cd ~/.dotfiles
./install.sh # Full install: apps + macOS defaults + dotfiles + neovim + sketchybar + aerospaceRun a subset via flags:
./install.sh --apps # Homebrew packages from Brewfile
./install.sh --defaults # macOS defaults (runs macos.sh)
./install.sh --dotfiles # symlinks for zsh, tmux, ghostty, starship, atuin, claude, borders
./install.sh --neovim # clone LazyVim starter
./install.sh --sketchybar # symlink sketchybar config + install custom font
./install.sh --aerospace # symlink aerospace config
./install.sh --helpAfter installation, you may want to:
- Restart your terminal to apply all shell changes
- Log out and back in for Aerospace to take effect
- Configure Atuin by running
atuin loginto sync shell history across machines - Set up 1Password — create items referenced in
zsh/env.tpl(see Secrets Management)
| File | Purpose |
|---|---|
Brewfile |
macOS source of truth: Homebrew formulae + casks. Run with brew bundle. Each entry has a one-line comment. |
install.sh |
Orchestrator with subcommand flags: apps, defaults, dotfiles, neovim, sketchybar, aerospace. |
macos.sh |
macOS defaults write settings, one comment per line. Safe to run standalone. |
Runs brew bundle --file=Brewfile. Installs all CLI tools (neovim, tmux, atuin, fzf, ripgrep, etc.), data tooling (duckdb, libpq), cloud CLIs (aws, gcloud), window manager + status bar (aerospace, sketchybar, hiddenbar, stats), terminal (ghostty), and apps (1Password, Raycast, Obsidian, Notion, Slack, Spotify, Brave, Chrome, Firefox, Cursor, Claude Desktop, etc.).
Runs macos.sh. Sets dock, menu bar, keyboard, text input (disables smart quotes / em-dash substitution), Finder, screenshot, animation, and multi-monitor preferences. Each line is annotated; comment out anything you want to skip.
Backs up any existing real files in ~ to ~/dotfiles-backup, then creates symlinks for:
~/.zshrc,~/.zprofile(Zsh)~/.tmux.conf,~/.tmux.conf.local(Tmux)~/.tmux/pane-info.sh,open-url.sh,log-pane.sh(Tmux runtime scripts)~/.config/ghostty/config(Ghostty)~/.config/starship.toml(Starship)~/.config/atuin/config.toml(Atuin)~/.config/borders/bordersrc(Borders)~/.claude/settings.json(Claude Code hooks and status line)
Sets Zsh as the default shell.
Clones the LazyVim starter into ~/.config/nvim. Skips if already present.
Symlinks the sketchybar config to ~/.config/sketchybar, downloads sketchybar-app-font for workspace app icons, and restarts the brew service. The sketchybar formula itself comes from --apps.
Symlinks aerospace.toml to ~/.config/aerospace/aerospace.toml. The aerospace cask comes from --apps.
Environment variables (API keys, tokens) are injected at first login via 1Password CLI op inject. The template zsh/env.tpl contains op:// references that resolve at runtime and are cached for the session.
- Theme from gpakosz/.tmux, prefix remapped to backtick (
`) - Vim-style pane navigation (
h/j/k/l) - Pane borders show: git branch, listening ports, devcontainer status
- Process state written to
/tmp/tmux-proc-state/for tooling integration - Auto-cleanup: when the last pane for a repo closes, orphaned processes and devcontainers are stopped
| Script | Purpose |
|---|---|
pane-info.sh |
Pane border info: branch, ports, devcontainer links |
open-url.sh |
prefix + U — open URLs from pane border in browser |
log-pane.sh |
prefix + L — toggle log viewer pane |
toggle-nvim.sh |
prefix + n — toggle nvim + Neotree pane |
tmux-cleanup.sh |
Auto-kill processes/devcontainers on pane exit |
Claude Code is configured via claude/settings.json (symlinked to ~/.claude/settings.json).
| Hook | Script | Purpose |
|---|---|---|
| PreToolUse | claude-on-busy.sh |
Sets Claude status to "busy" for tmux status line |
| PreToolUse (Bash) | claude-pretool-check.sh |
Blocks duplicate server starts when ports are in use |
| Notification | claude-on-waiting.sh |
Sets Claude status to "waiting" |
| Stop / SubagentStop | claude-on-idle.sh |
Sets Claude status to "idle" |
claude-statusline.sh provides a compact status line showing: state icon, directory, git branch (with worktree detection), model, and context remaining.
See docs/cheatsheet.md for all keyboard shortcuts (tmux, neovim, zsh, Claude Code).
A comprehensive list of apps and tools I use for development and productivity.
| Tool | Description |
|---|---|
| Ghostty | Fast, native terminal emulator |
| Starship | Cross-shell prompt with Pastel Powerline theme |
| Atuin | Magical shell history with sync |
| Tmux | Terminal multiplexer |
| Yazi | Blazing fast terminal file manager |
| Tool | Description |
|---|---|
| Cursor | AI-powered code editor |
| Neovim + LazyVim | Extensible text editor |
| Tool | Description |
|---|---|
| Claude Desktop | Claude AI desktop app |
| Claude Code | AI coding assistant CLI |
| Tool | Description |
|---|---|
| Aerospace | i3-like tiling window manager |
| Sketchybar | Customizable status bar |
| Hiddenbar | Hide menu bar icons |
| Stats | System monitoring in menu bar |
| Tool | Description |
|---|---|
| Raycast | Spotlight replacement with extensions |
| Obsidian | Markdown-based knowledge base |
| Notion | All-in-one workspace |
| 1Password | Password & secrets manager |
| Annotate | Screenshot annotation tool |
| Tool | Description |
|---|---|
| Homebrew | Package manager for macOS |
| OrbStack | Fast Docker & Linux on macOS |
| AWS CLI | Amazon Web Services CLI |
| gcloud CLI | Google Cloud CLI |
| dua | Disk usage analyzer |
| Tool | Description |
|---|---|
| Brave | Privacy-focused browser |
| Chrome | Google Chrome |
| Firefox | Mozilla Firefox |
| Tool | Description |
|---|---|
| Spotify | Music streaming |
| OBS | Streaming and recording |
| Adobe Photoshop | Image editing |
| Adobe Premiere Pro | Video editing |
| Ableton Live | Music production |
| Tool | Description |
|---|---|
| Keka | File archiver |
| Zoom | Video conferencing |
I made a deep dive video on this tiling window manager:
This setup uses Starship with the Pastel Powerline preset for a modern, colorful, and informative shell prompt.
