Dotfiles are all those files beginning with a "." in your user directory and make your system (particularly anything to do with the command line) work and look the way you want it.
You can clone the repository wherever you want. (I like to keep it in ~/.dotfiles).
The installation step requires the XCode Command Line Tools, although you should be prompted to install these if you don't have them installed already.
Fair warning: The bootstrap script attempts to backup existing dotfiles in your HOME directory, but to be safe you should probably make your own copy...
git clone https://github.com/jppferguson/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
src/script/bootstrapThis will symlink the appropriate files in .dotfiles to your home directory.
Everything is configured and tweaked within ~/.dotfiles.
The main file you'll want to change right off the bat is zsh/zshrc.symlink,
which sets up a few paths that'll be different on your particular machine.
dot is the main command for managing your dotfiles environment.
You can find this script in src/bin/. Run dot help to see all available commands.
dot cd- Navigate into the dotfiles directorydot clean- Clean up caches (brew)dot claude {cmd}- Manage Claude Code configuration (install|status|diff|sync|backup)dot dock- Apply macOS Dock settingsdot duti- Set default apps for file types (UTI)dot edit- Open dotfiles in your IDE and Git GUIdot help- Show all available commandsdot install {pkg}- Install a specific package/topicdot macos- Apply macOS system defaultsdot reload- Reload shell configurationdot symlink- Re-run bootstrap to create/update symlinksdot test- Run testsdot update- Update all packages via topgrade
To install these dotfiles without Git:
cd; curl -#L https://github.com/jppferguson/dotfiles/tarball/master | tar -xzv --strip-components 1 --exclude={README.md}
src/script/bootstrapThe repository includes several custom git commands in src/topics/git/:
git-all- Stage all unstaged filesgit-amend- Amend commits easilygit-nuke- Remove branches locally and remotelygit-switcheroo- Switch between branches quicklygit-track- Track remote branchesgit-undo- Undo the last commitgit-unpushed- Show unpushed commitsgit-wtf- Show the current git status in detail
Additional commands available in src/bin/:
e- Quick edit commandgitgui- Open git GUIsearch- Search for filestodo- Show TODO items in code
Everything's built around topic areas. If you're adding a new area to your
forked dotfiles — say, "Java" — you can simply add a java directory under src/topics/ and put
files in there. Anything with an extension of .zsh will get automatically
included into your shell. Anything with an extension of .symlink will get
symlinked without extension into $HOME when you run src/script/bootstrap.
- asdf - Version manager for Node.js, Ruby, and other tools
- bash - Bash shell configuration
- duti - Default application settings for file types on macOS
- git - Git configuration and custom commands
- hammerspoon - macOS automation and window management
- homebrew - Package management via Brewfile
- macos - macOS system defaults (YAML-based configuration)
- node - Node.js configuration and global packages
- prezto - Zsh framework configuration
- sublime - Sublime Text settings
- topgrade - Tool for updating all package managers at once
- vs-code - Visual Studio Code settings and keybindings
- zsh - Zsh shell configuration
The claude topic manages your Claude Code configuration, including custom commands, hooks, and settings.
dot claude install- Install/reinstall Claude configurationdot claude status- Show sync status between dotfiles and~/.claudedot claude diff- Show differences between dotfiles and~/.claudedot claude sync- Sync dotfiles to~/.claude(with backup)dot claude backup- Create manual backup of~/.claude
src/topics/claude/commands/- Custom slash commands (.mdfiles)src/topics/claude/hooks/- Git hooks and automation scriptssrc/topics/claude/settings.json- Claude Code settingssrc/topics/claude/CLAUDE.md.symlink- Global Claude configuration (symlinked to~/.CLAUDE.md)
Due to a known bug in Claude Code, we cannot use symlinks for the commands and hooks directories. Instead, we copy files from the dotfiles to ~/.claude/. This means:
- Changes to commands/hooks in dotfiles need to be synced with
dot claude sync - Local changes in
~/.claude/are automatically backed up before syncing - We'll switch back to symlinks when the upstream bug is fixed
- Edit commands/hooks in
src/topics/claude/ - Run
dot claude statusto see what needs syncing - Run
dot claude syncto update~/.claude/from dotfiles - Your changes are now available in Claude Code
There's a few special files in the hierarchy.
- src/bin/: Anything in
src/bin/will get added to your$PATHand be made available everywhere. - src/functions/: Shell functions that get loaded into your environment.
- src/script/: Installation and maintenance scripts (bootstrap, install, test, etc.).
- src/topics/*/*.zsh: Any files ending in
.zshget loaded into your environment. - src/topics/*/path.zsh: Any file named
path.zshis loaded first and is expected to setup$PATHor similar. - src/topics/*/completion.zsh: Any file named
completion.zshis loaded last and is expected to setup autocomplete. - src/topics/*/*.symlink: Any files ending in
*.symlinkget symlinked into your$HOME. This is so you can keep all of those versioned in your dotfiles but still keep those autoloaded files in your home directory. These get symlinked in when you runsrc/script/bootstrap.
Largely based off @holman's awesome repo, but also with some help/ideas/blatent pilfering from these fantastic people: