Personal dotfiles for a terminal-centric workflow. Cross-platform setup for macOS and Arch Linux, with first-class support for Omarchy (DHH's Arch Linux).
git clone https://github.com/<your-user>/dotfiles.git ~/dotfiles
cd ~/dotfiles
./install.sh
The installer auto-detects your platform and picks the right strategy:
| Platform |
Default Mode |
What Happens |
| macOS |
full |
Installs everything via Homebrew |
| Arch Linux |
full |
Installs everything via pacman |
| Omarchy |
overlay |
Keeps Omarchy base, selectively replaces configs |
./install.sh full # Install everything
./install.sh overlay # Overlay on existing setup (Omarchy)
./install.sh minimal # Only install missing tools
./install.sh uninstall # Remove dotfiles symlinks
./install.sh --dry-run # Preview without changes
./install.sh --yes full # Non-interactive
dotfiles/
βββ install.sh # Main entry point
βββ Makefile # Quick commands (make help)
βββ lib/ # Modular shell library
β βββ logging.sh # Colored output utilities
β βββ platform.sh # OS & environment detection
β βββ packages.sh # Cross-platform package installer
β βββ stow.sh # GNU Stow wrapper with backup/restore
β βββ omarchy.sh # Omarchy coexistence logic
βββ configs/ # Stow packages (symlinked to ~)
β βββ bash/ # .bashrc (slim wrapper)
β βββ ghostty/ # Ghostty terminal config
β βββ git/ # .gitconfig
β βββ mise/ # mise global tool versions
β βββ neovim/ # Neovim (kickstart.nvim based)
β βββ shell/ # Shared shell modules (aliases, fzf, toolsβ¦)
β βββ starship/ # Starship prompt config
β βββ tmux/ # tmux config with plugins
β βββ tools/ # Custom scripts (fzf-git, aws_creds)
β βββ zsh/ # .zshrc (slim wrapper) + vendored plugins
βββ docs/ # Platform-specific guides
β βββ archlinux.md
β βββ macos.md
β βββ omarchy.md # Omarchy coexistence guide
β βββ windows_setup.md
βββ .github/
βββ workflows/lint.yml
βββ ISSUE_TEMPLATE/
- Detection β Identifies OS, package manager, and Omarchy presence
- Prerequisites β Installs
gum (TUI) and stow (symlinks)
- Tools β Installs CLI tools via the platform package manager
- Configs β Symlinks config files to
~ using GNU Stow
- Backup β Existing configs are backed up to
~/.dotfiles-backup/ before replacement
Both .bashrc and .zshrc are slim wrappers that source shared modules from ~/.config/shell/:
~/.config/shell/
environment.sh # EDITOR, HISTSIZE, LANG, XDG dirs, PATH
aliases.sh # General, directory, safety-net, and git aliases
fzf.sh # fzf config, colors, previews, fzf-git
tools.sh # zoxide, starship, mise activation
functions.sh # mkcd, extract, serve, gclone, fkill, path
ai.sh # AI tools: Claude Code, GitHub Copilot CLI, aicommit
tmux.sh # tmux auto-attach, GPG agent
Each RC file only contains shell-specific setup (bash shopt options, zsh plugins) and a loop that sources the shared modules. Adding a new alias or function means editing one file instead of two.
| Tool |
Description |
| neovim |
Hyperextensible text editor |
| tmux |
Terminal multiplexer with session persistence |
| ghostty |
Fast, native terminal emulator |
| fzf |
Fuzzy finder for files, history, and more |
| fd |
Fast alternative to find |
| bat |
cat with syntax highlighting |
| eza |
Modern ls replacement |
| zoxide |
Smarter cd that learns your habits |
| ripgrep |
Blazing fast recursive grep |
| starship |
Minimal, fast, customizable prompt |
| mise |
Dev tool version manager (node, python, go, etc.) |
| lazygit |
Simple terminal UI for Git |
| sesh |
Smart tmux session manager |
| fzf-git |
Git + fzf keybindings |
| Claude Code |
AI coding agent in the terminal |
| GitHub Copilot CLI |
AI command suggestions (??, explain) |
| Key |
Action |
| Ctrl-T |
Fuzzy file search |
| Alt-C |
Fuzzy directory search |
| Ctrl-R |
History search |
| Key |
Action |
| Ctrl-G Ctrl-F |
Files |
| Ctrl-G Ctrl-B |
Branches |
| Ctrl-G Ctrl-T |
Tags |
| Ctrl-G Ctrl-R |
Remotes |
| Ctrl-G Ctrl-H |
Commit Hashes |
| Ctrl-G Ctrl-S |
Stashes |
| Ctrl-G Ctrl-L |
Reflogs |
| Ctrl-G Ctrl-W |
Worktrees |
| Ctrl-G Ctrl-E |
Each ref |
| Key |
Action |
| Ctrl-A |
Prefix (replaces Ctrl-B) |
| Prefix T |
Session switcher (sesh + fzf) |
| Ctrl-H/J/K/L |
Navigate panes (vim-aware) |
| Prefix H/J/K/L |
Resize panes |
| Prefix | |
Split horizontal |
| Prefix - |
Split vertical |
| Key |
Mode |
Action |
| Space a a |
n |
Toggle CopilotChat |
| Space a q |
n |
Quick AI question |
| Space a m |
n |
Generate commit message |
| Space a p |
n |
Prompt actions (Telescope) |
| Space a e |
v |
Explain selection |
| Space a r |
v |
Review selection |
| Space a f |
v |
Fix selection |
| Space a o |
v |
Optimize selection |
| Space a d |
v |
Generate docs |
| Space a t |
v |
Generate tests |
| Space a c |
n |
Avante: ask AI about code |
| Tab |
i |
Accept Copilot suggestion |
| Command |
Action |
?? |
AI shell command suggestion (gh copilot) |
git? |
AI git command suggestion |
explain |
Explain a command with AI |
ask "..." |
Quick question to Claude / Copilot |
how "..." |
Get a shell command for a task |
aicommit |
AI-generated git commit message |
review file |
AI code review of a file |
| Alias |
Command |
vim |
nvim |
c |
clear |
ls |
eza with icons |
tree |
Tree view (3 levels) |
lg |
lazygit |
| Alias |
Command |
Category |
gs |
git status -s |
basics |
gd / gds |
git diff / --staged |
basics |
ga / gap |
git add . / add -p (interactive) |
staging |
grs |
git restore --staged (unstage) |
staging |
gc / gce |
git commit -m / open editor |
commits |
gca / gcae |
amend (silent / open editor) |
commits |
gcam |
git commit -am (tracked + commit) |
commits |
gwip |
quick WIP commit (skip CI) |
commits |
gundo |
undo last commit, keep staged |
commits |
gsw / gswc |
git switch / -c (create) |
branches |
gb / gba |
branch / branch -a |
branches |
gbd / gbD |
delete merged / force delete |
branches |
gf / gfa |
fetch / --all --prune |
remote |
gpl / gplr |
pull / --rebase |
remote |
gps / gpsf |
push / --force-with-lease |
remote |
gpsu |
push new branch + set upstream |
remote |
grbi |
git rebase -i (interactive) |
rebase |
grbc / grba |
rebase continue / abort |
rebase |
gst / gstp / gstl |
stash / pop / list |
stash |
glog / gll / glp |
graph / last 20 / pretty dated |
log |
gbl |
git blame -C |
utils |
gcp |
git cherry-pick |
utils |
gbclean |
delete branches merged into main |
utils |
| Alias |
Command |
git undo |
Reset last commit (soft) |
git unstage |
Restore --staged |
git wip |
Quick WIP commit |
git unwip |
Pop WIP commit |
git today |
Commits since midnight |
git bclean |
Delete merged branches |
git gone |
List branches with deleted remotes |
git prune-gone |
Delete branches with deleted remotes |
git last |
Diff from last commit |
git aliases |
List all git aliases |
git root |
Show repo root path |
make help # Show all commands
make install # Auto-detect and install
make install-full # Full install
make install-overlay # Overlay mode
make install-dry # Dry-run preview
make stow-neovim # Stow single config
make unstow-neovim # Unstow single config
make doctor # Check system health
make lint # Run shellcheck
make backup # List config backups
make restore # Restore a backup
make update # Pull + re-install
make version # Show current version
make changelog # Changes since last release
This project uses CalVer β tags follow the format YYYY.MM.DD.
Every push to main automatically creates a GitHub Release with a changelog grouped by Conventional Commits:
| Prefix |
Changelog Section |
feat: |
β¨ Features |
fix: |
π Bug Fixes |
docs: |
π Documentation |
refactor: |
β»οΈ Refactoring |
chore: |
π§ Chores |
perf: |
β‘ Performance |
ci: |
π· CI |
To skip a release, add [skip release] to your commit message.
See all releases: GitHub Releases
MIT