This repository uses Dotbot to manage dotfiles. Dotbot creates symlinks from the home directory to files in the dotfiles repository based on YAML configuration. Dotbot competes with Chezmoi but is simpler, avoiding the need for templating.
Clone this repository into ~/.dotfiles and run the install script:
git clone https://github.com/motlin/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
./install mac # For macOSThis works even on a freshly installed system.
The standard Dotbot setup uses ./install to run a single configuration file on every host. However, this repository follows the multiple-target pattern to support environment-specific configurations.
When you run ./install mac, the script processes both:
install.conf.yaml(always runs first)mac.conf.yaml(environment-specific)
The base configuration is implicit—you specify only the environment name, not the base config.
The repository supports multiple environments through separate configuration files:
install.conf.yaml- Base configuration applied to all environmentsmac.conf.yaml- My macOS-specific configurations- Additional
*.conf.yamlfiles can be created for other environments
mac.conf.yaml is my only public environment-specific config, so you'll have to use your imagination and pretend there are several. At work, I maintain a private branch where ./install work would apply both base and work-specific configurations.
Configurations apply in order, allowing environment-specific settings to override the base.
A key design in my dotfiles is the use of .local files for environment-specific overrides. The base configuration files source their .local counterparts if they exist:
.zshrc→ sources.zshrc.local.alias→ sources.alias.local.env→ sources.env.local.config/git/config→ includes.config/git/config.local
The environment-specific configurations (like mac.conf.yaml) create these .local symlinks pointing to actual environment files:
~/.alias.local:
path: alias.mac
~/.env.local:
path: env.mac
~/.zshrc.local:
path: zshrc.macThis supports environment-specific customizations without introducing the complexity of git branches or templates.
My configuration files use standard Dotbot features:
- 📦 Update
gitsubmodules (Oh My Zsh plugins, Powerlevel10k theme,vimplugins) - 📂 Create directories (
~/.bin) - 🔗 Create symlinks from the home directory to files in this repository
- 🧹 Cleans up broken symlinks
You can also run shell commands during installation. I use this in mac.conf.yaml to inject 1Password secrets.
.zshrc - Main Zsh configuration that sets up Oh My Zsh with the Powerlevel10k theme, configures shell behavior (history sharing, case-sensitive completion, emacs keybindings), and loads various plugins including zsh-autosuggestions, fzf, and syntax highlighting. It also integrates direnv, zoxide (replacing cd), and sources local overrides.
.p10k.zsh - Powerlevel10k theme configuration that defines the prompt layout with segments for OS icon, directory, and Git status on the left, and command status/execution time on the right.
.config/git/config (like .gitconfig) - See my blog post which explains my customizations in depth. Includes aliases, advanced log formatting with graph visualization, aggressive optimizations, automatic stashing during merges/rebases, and integration with git-absorb for fixup commits.
.vimrc - Vim configuration that sets up pathogen for plugin management, enables quality-of-life improvements (smart searching, visual cues for whitespace, tab completion), and defines custom key mappings. Configures the inkpot color scheme and includes functions for viewing diffs.
.alias - Defines shell aliases for common commands including navigation (up, up2), ls commands using eza with icons, Git shortcuts, and replacements like bat for cat. Also includes utility aliases for lazygit, just, and timestamp formatting.
.env - Minimal environment configuration that extends PATH with local directories, sets vim as the default editor, configures less as the pager with specific options, and points to a ripgrep configuration file.
- 🔍
.ripgreprc- Ripgrep search tool configuration - 📁
config/- Directory containing configurations for various tools: