A highly opinionated development environment configuration for macOS.
This repository represents my personal preferences and workflow. It's constantly evolving based on my needs and experiments. I strongly encourage you to:
- Fork this repo and customize it to your preferences
- Browse and borrow individual configurations that interest you
- Use it as inspiration for your own dotfiles
Unless you share my exact preferences (unlikely!), directly using this configuration will probably frustrate you. You've been warned! 😊
These dotfiles reflect years of iteration on my development workflow. They're optimized for:
- Keyboard-driven workflows (minimal mouse usage)
- Terminal-first development
- Fast navigation and editing
- Consistent keybindings across tools
- Reducing context switching
The setup is intentionally opinionated and may include experimental configurations.
- Shell: zsh with Starship prompt
- Terminal Multiplexer: tmux with custom keybindings
- Editor: Neovim with extensive plugin configuration
- Terminal Emulators: Kitty, Alacritty, Ghostty
- Version Control: Git with lazygit and delta
- File Manager: yazi
- Package Management: Homebrew for macOS packages
- Languages: Node.js (via fnm), Rust, Python (via uv), Go
- Containers: Docker with lazydocker
- Kubernetes: kubectl with k9s
- Search: ripgrep, fd, fzf
- Machine-specific configurations (Personal Air, Mac Mini, Work machines)
- Automated installation and update scripts
- macOS system preferences configuration
- VS Code settings and extensions
- Custom keyboard layout (Kinesis Advantage 2)
- Connect to the internet
- Sign into iCloud in System Preferences (required for App Store installations via
mas
) - Install Xcode Command Line Tools:
xcode-select --install
- Update macOS:
Repeat until fully updated.
sudo softwareupdate --install --all --restart
curl -s https://raw.githubusercontent.com/ooloth/dotfiles/main/setup.zsh | zsh
This will:
- Clone this repository to
~/Repos/ooloth/dotfiles
- Run all installation scripts in sequence
- Set up symlinks for all configurations
- Configure macOS system preferences
If you prefer more control:
# Clone the repository
git clone https://github.com/ooloth/dotfiles.git ~/Repos/ooloth/dotfiles
cd ~/Repos/ooloth/dotfiles
# Run the setup script
./setup.zsh
# Preview what would be installed without making changes
./setup.zsh --dry-run
# Or run individual installation scripts
cd bin/install
source ssh.zsh # SSH keys and GitHub auth
source github.zsh # GitHub CLI setup
source homebrew.zsh # Homebrew and packages
source zsh.zsh # Shell configuration
source rust.zsh # Rust toolchain
source uv.zsh # Python package manager
source node.zsh # Node.js via fnm
source tmux.zsh # tmux plugins
source neovim.zsh # Neovim plugins
source yazi.zsh # File manager plugins
source content.zsh # Personal content repos
source settings.zsh # macOS preferences
- Restart your terminal for all changes to take effect
- Open tmux and install plugins: Press
prefix + I
(default prefix isCtrl-a
) - Open Neovim and wait for plugins to install automatically
- Sign into applications that require authentication
The setup automatically detects machine type based on hostname:
- Machines with "Air" in the name → Personal laptop configuration
- Machines with "Mini" in the name → Home server configuration
- All others → Work machine configuration
To customize for your machines, edit the detection logic in setup.zsh
or set the environment variables manually.
- Git Configuration: Edit
config/git/config
with your information - Shell Aliases: Modify
config/zsh/aliases.zsh
- Neovim: Customize
config/nvim/init.lua
- Homebrew Packages: Edit
macos/Brewfile
- macOS Preferences: Adjust
macos/macos-defaults
- Add Homebrew packages to
macos/Brewfile
- Add configuration files to
config/<tool-name>/
- Add symlinks in
bin/update/symlinks.zsh
- Run
symlinks
to create the links
# Update everything (recommended)
u
# Or run individual update scripts directly
$DOTFILES/bin/update/homebrew.zsh # Update Homebrew packages
$DOTFILES/bin/update/npm.zsh # Update global npm packages
$DOTFILES/bin/update/neovim.zsh # Update Neovim plugins
$DOTFILES/bin/update/tmux.zsh # Update tmux plugins
$DOTFILES/bin/update/rust.zsh # Update Rust toolchain
$DOTFILES/bin/update/symlinks.zsh # Recreate symlinks
The u
function runs all updates and reloads your shell.
The installation preserves existing files. To replace them:
- Back up the existing file
- Remove it manually
- Run
symlinks
Ensure /opt/homebrew/bin
(Apple Silicon) or /usr/local/bin
(Intel) is in your PATH.
- Open Neovim
- Run
:Lazy sync
- Restart Neovim
Set the environment variables manually in your shell:
export IS_WORK=true # or false
export IS_AIR=true # or false
export IS_MINI=true # or false
Since these are personal dotfiles, I'm not accepting pull requests for feature additions. However, please feel free to:
- Open issues for bugs or questions
- Fork and customize for your own use
- Share your own improvements in your fork
MIT - See LICENSE.md
- Dotfiles community
- Nick Nisi's dotfiles
- The many developers who share their configurations publicly