🤗 These dotfiles help me to set up and maintain my macOS or Linux installations. They intend to automate the installation and update process of, well, everything. Feel free to explore, copy and re-use the code to your liking.
💥 Warning: Please fork and review the code first, before giving these dotfiles a try. In theory, they can be installed on an existing system as well, but a fresh installation is recommended. Use at your own risk.
macOS notes: Make sure to install the Xcode Command Line Tools by running
xcode-select --install first, then log into iCloud and the Apple App Store.
The installer asks for your admin password once up front — Rosetta, Homebrew
casks, FileVault and the /etc/hosts symlink all need it later on.
The following command will install the dotfiles into ~/.dotfiles and runs the
installer automatically 🤖:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/finalangel/dotfiles/master/bootstrap)"
🤔 Yeah that's it, really, I think...
👉 Once installed, use the following command to manage the dotfiles:
$ dotfiles --help
Usage: dotfiles [options]
Options:
-e, --edit Edit dotfiles
-g, --go Go to dotfiles directory
-h, --help Show help
-i, --install Runs installer
-u, --update Runs updater
dotfiles -u is the one that matters day to day: it pulls this repository,
then runs every topic's update script — Homebrew, npm globals, uv tools,
tmux plugins, fonts, the Dock layout and macOS software updates.
Except for bin/, scripts/ and utils/, every top-level folder is a
self-contained topic providing an install and update script. You can
easily disable individual topics by commenting the lines in scripts/. On top
of that:
- every
aliases.zsh,paths.zshandfunctions.zshfile in a topic is automatically loaded - every
.symlinkfile in a topic will be mapped to~/.[filename] - everything in the
bin/folder gets automatically added to your$PATH
The following package flavours are installed:
- FiraCode with nice custom font management
- Git with GPG signing enabled, plus delta as the diff pager
- Homebrew with cask and mas
- Neovim
- Node with fnm manager
- Oh My Zsh
- Python with uv and pyenv
- Starship 🚀
- tmux with TPM and an agent sidebar
- Zed and iTerm2 with their settings
A few things are kept in sync across machines rather than installed:
- Claude config (
~/.claude,~/.agents) lives in iCloud and is symlinked into place, so settings, memory, skills and hooks follow both machines - Private files (secrets,
.pypirc, tmuxinator projects) are linked out of iCloud too, which keeps them out of this public repository - The Dock is declared in
macos/Dockfileand reapplied on every update;macos/dock-dumpregenerates it from the current Dock - Dark mode re-themes a running tmux server automatically through a
dark-notifylaunch agent
🐛 Feel free to send me pull requests if something is misconfigured or could be enhanced upon. These are very personal, but if they work for others as well, the more, the merrier.
scripts/lint syntax-checks every bash, zsh, ruby and python file in the
repository and runs on each push through GitHub Actions — the badge at the top
reflects it. Run it locally before opening a pull request:
./scripts/lint
I generally still want to improve on:
- Adding real tests beyond linting would be nice :)
❤️ Many thanks to the dotfiles community and the excellent work from dotphiles, holman, mathiasbynens, pchampio and webpro. This work wouldn't be possible without them.
