dotfiles
My dotfiles - including aerospace/sketchybar setup
git clone https://github.com/mehd-io/dotfiles.gitmehd-io/dotfilesdotfiles
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
- mise — pinned Rust, uv, Node, pnpm, and Bun versions across Macs
- Herdr Continuity — searchable Claude/Codex history and encrypted cross-Mac session handoff
- 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.
Table of Contents
- Getting Started
- What Each Install Script Does
- Secrets Management
- Tmux
- Claude Code Integration
- Cheatsheet
- My Mac Setup
- About Aerospace
Getting Started
Prerequisites
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)"
Install
git clone https://github.com/mehd-io/dotfiles ~/.dotfiles cd ~/.dotfiles ./install.sh # Full install: apps + macOS defaults + dotfiles + neovim + sketchybar + aerospace
Run 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 --toolchain # install exact runtime versions through mise ./install.sh --continuity # install/link Herdr Continuity + periodic sync ./install.sh --help
Post-Install
After 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)
Repo Layout
| 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. |
mise/ |
Exact global developer-tool selections and cross-platform lock metadata. |
herdr-continuity/ |
Herdr configuration, isolated 1Password template, and launchd definition. |
What Each Subcommand Does
--apps
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.).
--defaults
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.
--dotfiles
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.
--neovim
Clones the LazyVim starter into ~/.config/nvim. Skips if already present.
--sketchybar
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.
--aerospace
Symlinks aerospace.toml to ~/.config/aerospace/aerospace.toml. The aerospace cask comes from --apps.
--toolchain
Links the global mise configuration and installs pinned Rust, uv, Node, pnpm, and Bun versions. Rust uses rustup underneath; Cargo lockfiles continue to pin project dependencies.
--continuity
Builds and installs the Rust herdr-continuity binary, links its Herdr plugin,
and registers an hourly launchd fallback sync. Claude's Stop hook pushes only
the exact session that stopped. The Herdr picker searches a local cache and never
wakes the database; sync performs an incremental push followed by a
cursor-based pull.
Create a 1Password item named herdr-continuity with database-url and
encryption-key fields before enabling database sync. Raw events are compressed
and encrypted locally; searchable message projections remain plaintext in
PostgreSQL by design.
HERDR_CONTINUITY_AUTO_SYNC is enabled for the upgraded Neon project. Scheduled
fallback sync runs only from 07:00 to 23:00 local time; explicit handoffs and
Claude Stop-hook pushes are not restricted by that window. Remote handoff
receive runs through the same isolated wrapper so it can load the shared
encryption key from 1Password and fail safely when credentials are unavailable.
Secrets Management
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.
Tmux
- 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
Tmux Scripts
| 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 Integration
Claude Code is configured via claude/settings.json (symlinked to ~/.claude/settings.json).
Hooks
| 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" |
| Stop | herdr-continuity-sync.sh |
Incrementally pushes the stopped Claude session |
Status Line
claude-statusline.sh provides a compact status line showing: state icon, directory, git branch (with worktree detection), model, and context remaining.
Cheatsheet
See docs/cheatsheet.md for all keyboard shortcuts (tmux, neovim, zsh, Claude Code).
My Mac Setup
A comprehensive list of apps and tools I use for development and productivity.
Terminal & Shell
| 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 |
Code Editors & IDEs
| Tool | Description |
|---|---|
| Cursor | AI-powered code editor |
| Neovim + LazyVim | Extensible text editor |
AI Tools
| Tool | Description |
|---|---|
| Claude Desktop | Claude AI desktop app |
| Claude Code | AI coding assistant CLI |
Window Management & Menu Bar
| Tool | Description |
|---|---|
| Aerospace | i3-like tiling window manager |
| Sketchybar | Customizable status bar |
| Hiddenbar | Hide menu bar icons |
| Stats | System monitoring in menu bar |
Productivity
| 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 |
Development & DevOps
| 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 |
Browsers
| Tool | Description |
|---|---|
| Brave | Privacy-focused browser |
| Chrome | Google Chrome |
| Firefox | Mozilla Firefox |
Media & Creative
| Tool | Description |
|---|---|
| Spotify | Music streaming |
| OBS | Streaming and recording |
| Adobe Photoshop | Image editing |
| Adobe Premiere Pro | Video editing |
| Ableton Live | Music production |
Utilities
| Tool | Description |
|---|---|
| Keka | File archiver |
| Zoom | Video conferencing |
About Aerospace
I made a deep dive video on this tiling window manager:
Starship Prompt : Pastel Powerline
This setup uses Starship with the Pastel Powerline preset for a modern, colorful, and informative shell prompt.
more like this