One-command terminal setup for macOS. Catppuccin Mocha everything.
- What Are Dotfiles?
- What You Get
- Prerequisites
- Installation
- Your First 10 Minutes
- Understanding the Tools
- Shell Aliases Cheat Sheet
- Power Functions
- Customization
- Optional: macOS System Defaults
- How It All Works
- Updating
- Uninstalling
- Troubleshooting
- Acknowledgments
On macOS (and Linux), programs store their settings in hidden files that start with a dot — like .zshrc, .gitconfig, or files inside ~/.config/. These are called "dotfiles."
This repository collects all of those config files in one place so you can:
- Set up a new Mac in minutes instead of hours of manual tweaking
- Keep your configs under version control so you never lose them
- Share a consistent environment across multiple machines
The installer creates symlinks (shortcuts) from where each program expects its config file to the files in this repo. That means when you edit a file in this repo, the changes take effect immediately — and you can commit them to git.
| Tool | What It Does | What It Replaces |
|---|---|---|
| Ghostty | GPU-accelerated terminal with shaders | iTerm2, Terminal.app |
| Starship | Fast, minimal prompt with git info | Oh My Zsh themes, Powerlevel10k |
| zinit | Plugin manager with lazy loading | Oh My Zsh, antigen |
| bat | cat with syntax highlighting & line numbers |
cat |
| eza | ls with icons, colors & git status |
ls, exa |
| fd | find but simpler and faster |
find |
| fzf | Fuzzy finder — search anything interactively | — |
| ripgrep | grep but 10-100x faster |
grep, ag |
| zoxide | Smart cd that remembers your directories |
z, autojump |
| atuin | Searchable shell history with optional sync | Ctrl+R default |
| delta | Beautiful side-by-side git diffs | diff, diff-so-fancy |
| lazygit | Full git UI in the terminal | — |
| yazi | Terminal file manager with image previews | ranger, lf |
| mise | Manages Node, Python, Ruby, Go versions | nvm, pyenv, rbenv |
| gh | GitHub from the terminal | hub |
| Monaspace | Coding font with ligatures & texture healing | Fira Code |
Theme: Catppuccin Mocha — a soothing dark palette applied consistently across every tool.
- macOS (Apple Silicon or Intel)
- A terminal (Terminal.app is fine — Ghostty will be installed for you)
- An internet connection (the installer downloads tools via Homebrew)
That's it. The installer handles everything else, including Xcode Command Line Tools and Homebrew.
git clone https://github.com/vale-c/dotfiles.git ~/.dotfilesThis puts the dotfiles in
~/.dotfiles(a hidden folder in your home directory). You can clone it anywhere, but~/.dotfilesis the convention.
~/.dotfiles/install.shThe installer will:
- Check that you're on macOS and install Xcode Command Line Tools if needed
- Install Homebrew (the macOS package manager) if you don't have it
- Install all the tools listed above via Homebrew
- Back up your existing configs to
~/.dotfiles-backup-YYYYMMDD/(nothing is lost) - Create symlinks from each tool's config location to the files in this repo
- Ask for your git name and email (stored privately in
~/.gitconfig.local) - Install Node.js LTS and Python via mise
- Set zsh as your default shell if it isn't already
Safe to run multiple times. The installer is idempotent — running it again won't break anything or duplicate configs.
Close and reopen your terminal, or run:
exec zshGhostty was installed by Homebrew. Open it from Spotlight (Cmd + Space, type "Ghostty") or your Applications folder. This is your new terminal — everything is pre-configured.
Here are some things to try right away to see what's changed:
ls # icons, colored by type, directories first
ll # detailed view with permissions, git status
lt # tree view (2 levels deep)cat ~/.zshrc # syntax highlighted with line numbers# Press Ctrl+T in the terminal to fuzzy-search files
# Press Ctrl+R to search your shell history (via atuin)
# Press Alt+C to fuzzy-cd into a directorygs # short git status
gl # compact git log with graph
gd # pretty side-by-side diff (powered by delta)Press Cmd + ` (backtick) anywhere on your Mac. A terminal drops down from the top of your screen. Press it again to hide it. This works even when Ghostty isn't focused.
y # opens yazi — navigate with arrows, press Enter to open, q to quitcd ~/some/project # visit a directory once...
cd ~ # go somewhere else...
cd some # zoxide remembers — it'll jump to ~/some/projectGhostty is a modern, GPU-accelerated terminal emulator. It's fast, configurable, and renders text beautifully.
What's configured:
- Theme: Catppuccin Mocha (dark, easy on the eyes)
- Font: Monaspace Neon at size 14 with ligatures (e.g.,
=>renders as⇒) - Background: Slightly transparent (92% opacity) with blur
- Cursor: Blinking bar, hides when you type
- Scrollback: 100,000 lines
Key shortcuts:
| Shortcut | Action |
|---|---|
Cmd + `` |
Drop-down quake terminal (works globally) |
Cmd + D |
Split pane to the right |
Cmd + Shift + D |
Split pane downward |
Cmd + Alt + arrows |
Navigate between splits |
Cmd + Shift + Enter |
Zoom/unzoom a split |
Cmd + = / Cmd + - |
Increase / decrease font size |
Cmd + 0 |
Reset font size |
Config location: ghostty/config
Starship is the line that appears before your cursor. It shows you where you are and what's happening in your git repo — and it renders in under 50ms.
What you see:
~/Desktop/CODING/my-project main ?1 !2 2.1s
❯
- Directory — truncated to 3 levels, with smart substitutions (
Desktop/CODING→code) - Git branch — the current branch name (e.g.,
main) - Git status —
?untracked,!modified,+staged,=conflicts,⇡ahead,⇣behind - Command duration — shown when a command takes longer than 2 seconds
- ❯ — green when the last command succeeded, red when it failed
Language versions (Python, Rust) appear on the right side only when you're in a project that uses them.
Config location: starship/starship.toml
Four plugins are installed via zinit, all loaded lazily to keep startup fast (~150ms):
| Plugin | What It Does |
|---|---|
| zsh-autosuggestions | Shows a faded suggestion as you type, based on your history. Press Ctrl + Space to accept. |
| fast-syntax-highlighting | Colors your commands as you type — green for valid commands, red for typos. |
| zsh-completions | Adds completions for hundreds of tools (docker, git, npm, etc.). Press Tab to use. |
| zsh-you-should-use | Nudges you when you type a full command that has a shorter alias. Helps you learn your aliases. |
These tools replace slow, bare-bones Unix defaults with fast, colorful, feature-rich alternatives. They're aliased so you use them automatically:
cat file.py # syntax highlighted, line numbers, paging
catp file.py # plain mode (no line numbers, no decoration)Also used as the man page viewer — try man git.
ls # icons, directories first, color by file type
l # same as ls
ll # long format with permissions, sizes, git status
lt # tree view, 2 levels deep
llt # tree view, 3 levels, long formatfd "\.py$" # find all Python files (recursive, ignores .git)
fd -t d config # find directories named "config"rg "TODO" # search file contents recursively, super fast
rg "TODO" --type py # search only Python filesPre-configured to use smart case, search hidden files, and ignore build directories (node_modules/, dist/, .git/, etc.).
cd my-project # zoxide learns this path
# ...later, from anywhere:
cd my # jumps back to ~/Desktop/CODING/my-projectThe more you use it, the smarter it gets. It ranks directories by frequency and recency.
You don't call delta directly — it's configured as the git pager. Whenever you run git diff, git show, or git log -p, you'll see beautiful side-by-side diffs with syntax highlighting.
This setup gives you three layers of git tooling:
| Alias | Command | Use When |
|---|---|---|
gs |
git status -sb |
Quick status check |
gl |
git log --oneline --graph -20 |
Browse recent history |
gla |
git log --oneline --graph --all |
See all branches |
gd |
git diff |
See unstaged changes |
gds |
git diff --staged |
See what you're about to commit |
ga file |
git add file |
Stage a file |
gaa |
git add . |
Stage everything |
gc |
git commit |
Commit (opens editor) |
gcm "msg" |
git commit -m "msg" |
Quick commit |
gca |
git commit --amend |
Fix the last commit |
gco branch |
git checkout branch |
Switch branches |
gcb new-branch |
git checkout -b new-branch |
Create & switch to a new branch |
gp |
git pull --rebase |
Pull with rebase (cleaner history) |
gpsh |
git push |
Push |
gpshf |
git push --force-with-lease |
Force push (safe — won't overwrite others' work) |
gf |
git fetch --all --prune |
Fetch & clean stale remote branches |
gst |
git stash |
Stash changes |
gstp |
git stash pop |
Restore stashed changes |
grb |
git rebase |
Rebase |
gwip |
Add all + commit "WIP [skip ci]" | Quick save of work in progress |
| Alias | Command |
|---|---|
git undo |
Soft-reset last commit (keeps changes) |
git amend |
Amend last commit without editing message |
git graph |
Visual branch graph (last 20 commits) |
git branches |
Branches sorted by most recent commit |
git stale |
Branches that have been merged (safe to delete) |
git contributors |
Contributor leaderboard |
git conflicts |
Files with merge conflicts |
git last |
Show last commit with diff stats |
lg # opens lazygitLazygit gives you a full visual interface for staging, committing, branching, rebasing, and more — all from the keyboard. It's especially useful for:
- Staging individual lines or hunks (not just whole files)
- Interactive rebasing
- Resolving merge conflicts visually
- Browsing commit history
Press ? inside lazygit to see all keybindings.
fzf is the backbone of the interactive experience. It turns any list into a searchable, filterable menu.
Built-in shortcuts (work anywhere in the shell):
| Shortcut | What It Does |
|---|---|
Ctrl + T |
Search for a file by name, insert the path |
Ctrl + R |
Search shell history (via atuin) |
Alt + C |
Search for a directory, cd into it |
Custom functions that use fzf:
| Command | What It Does |
|---|---|
fe |
Find a file and open it in your editor |
fcd |
Find a directory and cd into it |
gbr |
Switch git branches with a preview of recent commits |
glog |
Browse git log, preview diffs, copy commit hash |
zz |
Jump to any directory zoxide has learned about |
Inside fzf menus:
- Type to filter results
Ctrl + D/Ctrl + U— scroll half page down/upCtrl + /— toggle the preview panelCtrl + YorEnter— selectEsc— cancel
Yazi is a terminal file manager. Think of it like Finder, but in the terminal with keyboard navigation and image previews.
y # open yazi in the current directory- Arrow keys or h/j/k/l — navigate
- Enter — open file / enter directory
- Space — select files
- d — delete selected
- r — rename
- q — quit (your terminal
cds to wherever you navigated)
The theme is configured with Catppuccin Mocha colors and file-type-specific color coding.
Mise manages programming language versions. It replaces the need for nvm (Node), pyenv (Python), rbenv (Ruby), etc. — one tool for all languages.
What's pre-installed:
- Node.js — LTS version
- Python — latest version
Common commands:
mise list # see installed versions
mise use node@20 # switch to Node 20 for this project
mise use python@3.12 # switch to Python 3.12 for this project
mise install # install versions specified in configMise reads .tool-versions or mise.toml files in your project directories, so each project can use its own language versions automatically.
Config location: mise/config.toml — edit to add more languages (Ruby, Go, Bun, Deno, etc. are commented out and ready to enable).
gh lets you interact with GitHub from the terminal. First-time setup:
gh auth login # authenticate (one-time)Custom aliases:
| Command | What It Does |
|---|---|
gh mine |
List your open PRs |
gh rv |
List PRs requesting your review |
gh co 123 |
Check out PR #123 locally |
gh dash |
Open the current repo in your browser |
gh prc |
Create a PR in your browser |
gh prv |
View the current PR in your browser |
gh runs |
Show the last 5 CI runs |
gh last-run |
View logs from the latest CI run |
| Alias | Action |
|---|---|
.. |
cd .. |
... |
cd ../.. |
.... |
cd ../../.. |
- |
cd - (previous directory) |
| Alias | Action |
|---|---|
vim / v |
Opens Neovim |
c |
Opens VS Code in current directory |
o |
Opens Finder in current directory |
| npm | yarn | bun | pnpm | Action |
|---|---|---|---|---|
ni |
yr |
bi |
pi |
Install dependencies |
ns |
— | — | — | Start |
nr |
— | br |
pr |
Run script |
nd |
— | bd |
pd |
Run dev server |
nb |
— | — | — | Build |
nt |
— | — | — | Test |
| Alias | Action |
|---|---|
path |
Print each PATH entry on its own line |
ports |
Show processes listening on TCP ports |
ip |
Show your public IP address |
localip |
Show your local network IP |
flushdns |
Flush the DNS cache |
cleanup |
Delete all .DS_Store files recursively |
reload |
Reload the shell config |
These are custom shell functions for common workflows:
| Command | What It Does |
|---|---|
gbr |
Fuzzy switch git branches — shows a preview of recent commits for each branch |
glog |
Interactive git log — pick a commit to preview its diff, copies the hash to clipboard |
fe |
Fuzzy find any file and open it in your editor |
fcd |
Fuzzy find any subdirectory and cd into it |
zz |
Jump to any directory zoxide knows about, with a tree preview |
y |
Open yazi file manager — when you quit, your terminal is in the directory you navigated to |
week |
Summary of your git work from the past 7 days |
today |
Show your git commits from today |
note "text" |
Append a timestamped note to ~/.notes/YYYY-MM-DD.md |
note |
Open today's note file in your editor |
mkcd dir |
Create a directory and cd into it in one step |
extract file |
Extract any archive (.zip, .tar.gz, .7z, .rar, etc.) |
killport 3000 |
Kill whatever process is using port 3000 |
serve |
Start a quick HTTP server in the current directory (default port 8000) |
Two .local files let you customize without touching the repo (they're gitignored and never overwritten by the installer):
Add extra aliases, PATH entries, or environment variables:
# Extra PATH entries
export PATH="$HOME/custom/bin:$PATH"
# Work-specific aliases
alias vpn="networksetup -connectpppoeservice 'Work VPN'"
alias k="kubectl"
alias dc="docker compose"
# Override the default editor
export EDITOR="cursor"This is created during installation. You can edit it anytime:
[user]
name = Your Name
email = your@email.com
# signingkey = YOUR_GPG_KEY
# Uncomment for GPG commit signing:
# [commit]
# gpgsign = trueEdit ghostty/config and change this line:
theme = catppuccin-mocha
Ghostty supports many built-in themes. The rest of the tools (fzf, bat, eza, starship, lazygit, yazi, atuin) also use Catppuccin Mocha — for a fully consistent experience with a different theme, you'd need to update each tool's config.
Edit ghostty/config and change:
font-family = "Monaspace Neon"
to any font installed on your system. Fira Code is already installed as a fallback:
font-family = "Fira Code"
Ghostty supports custom GLSL shaders for visual effects. To enable one, add this line to ghostty/config:
custom-shader = shaders/bloom.glsl
The included bloom.glsl adds a subtle glow around bright text. You can find more community shaders online.
Add them to ~/.zshrc.local for machine-specific aliases (won't be committed), or edit zsh/zshrc directly if you want them in the repo.
~/.dotfiles/macos.shThis script applies power-user system preferences. Run it once on a new machine, then log out and back in.
What it changes:
| Category | Changes |
|---|---|
| Keyboard | Blazing fast key repeat (essential for vim/terminal). Disables press-and-hold, smart quotes, smart dashes, auto-correct, and auto-capitalize. |
| Dock | Auto-hides with zero delay, fast animation (0.15s), minimizes to app icon, hides recent apps. |
| Finder | Shows hidden files, path bar, status bar, and full POSIX path in the title. Defaults to list view. Searches the current folder (not the whole Mac). |
| Screenshots | Saves to ~/Screenshots as PNG without window shadows. |
| System | Expanded save/print dialogs by default (no more clicking "expand" every time). |
Note: Some changes require a logout or restart to take full effect. The script automatically restarts Dock and Finder.
Understanding the structure helps when you want to customize things.
~/.dotfiles/
├── install.sh # Installer — run to set up or re-run safely
├── uninstall.sh # Removes symlinks, optionally restores backups
├── macos.sh # macOS system preferences
├── Brewfile # List of tools installed by Homebrew
│
├── ghostty/ # Terminal emulator
│ ├── config # Main Ghostty config
│ ├── shaders/ # Visual effects
│ │ └── bloom.glsl
│ └── themes/ # Color themes
│ └── catppuccin-mocha
│
├── zsh/ # Shell
│ ├── zshrc # Main shell config → ~/.zshrc
│ └── zshrc.local.example # Template for machine-specific overrides
│
├── starship/ # Prompt
│ └── starship.toml # → ~/.config/starship.toml
│
├── git/ # Git
│ ├── gitconfig # → ~/.gitconfig
│ ├── gitconfig.local.example # Template for name/email
│ ├── gitignore_global # → ~/.gitignore_global
│ └── ripgreprc # → ~/.ripgreprc
│
├── lazygit/ # Git UI
│ └── config.yml # → ~/.config/lazygit/config.yml
│
├── atuin/ # Shell history
│ └── config.toml # → ~/.config/atuin/config.toml
│
├── yazi/ # File manager
│ └── theme.toml # → ~/.config/yazi/theme.toml
│
├── gh/ # GitHub CLI
│ └── config.yml # → ~/.config/gh/config.yml
│
└── mise/ # Version manager
└── config.toml # → ~/.config/mise/config.toml
The installer creates symbolic links (shortcuts) from where each tool looks for its config to the files in this repo:
~/.zshrc → ~/.dotfiles/zsh/zshrc
~/.config/ghostty → ~/.dotfiles/ghostty
~/.config/starship.toml → ~/.dotfiles/starship/starship.toml
...
This means:
- Editing
~/.dotfiles/zsh/zshrcand editing~/.zshrcare the same thing - Changes are instant — no need to "apply" or re-run anything (just
reloador restart your terminal for shell changes) git diffin the dotfiles repo shows exactly what you've changed
To pull the latest changes:
cd ~/.dotfiles
git pullMost changes take effect immediately thanks to symlinks. If the Brewfile changed (new tools added), re-run:
~/.dotfiles/install.sh~/.dotfiles/uninstall.shThis will:
- Remove all symlinks (only symlinks — real files are never touched)
- Ask if you want to restore from your latest backup (
~/.dotfiles-backup-YYYYMMDD/)
Your .local files (~/.zshrc.local, ~/.gitconfig.local) are always preserved.
The uninstaller does not remove Homebrew or any installed tools. To remove those, use brew uninstall <tool>.
Restart your terminal or run exec zsh. If the problem persists, make sure Homebrew is in your PATH:
eval "$(/opt/homebrew/bin/brew shellenv)"Make sure it was installed: brew list --cask | grep ghostty. If not, run brew install --cask ghostty.
Rebuild the font cache:
fc-cache -fvThen restart Ghostty.
The target is under 150ms. To profile:
- Uncomment the first and last lines in
zsh/zshrc(zmodload zsh/zprofandzprof) - Open a new terminal
- The profiling output shows which plugins take the longest
The Catppuccin theme is configured for Ghostty specifically. Other terminals may not render the 256-color palette the same way. For best results, use Ghostty.
Atuin works offline by default. The login prompt is for optional cloud sync of your shell history across machines. You can ignore it or run atuin login if you want that feature.
Re-run the installer — it's safe to run multiple times:
~/.dotfiles/install.shOr restore from backup:
~/.dotfiles/uninstall.sh # say "y" when asked to restore- Catppuccin — the pastel theme that ties everything together
- Monaspace — GitHub's monospace font family
- Ghostty — Mitchell Hashimoto's terminal emulator