Automated setup script for a development environment on macOS and Linux.
bash -c "$(curl -fsSL https://raw.githubusercontent.com/wstuckey/dotfiles/main/setup.sh)"| Tool | Description |
|---|---|
| Zsh | Shell |
| Oh My Zsh | Zsh framework with plugins |
| Git | Version control |
| Python + pipx | Python and isolated package manager |
| OpenJDK 17 | Java runtime |
| Neovim | Text editor (with full IDE config) |
| ripgrep + fd | Fast search tools (for Telescope) |
| eza | Modern replacement for ls and tree |
| zoxide | Smarter cd that learns your habits |
| tmux | Terminal multiplexer |
| NVM + Node.js | Node version manager with LTS |
dotfiles/
├── setup.sh # Main installation script
├── .zshrc # Zsh configuration
├── .zshrc.work # Work-specific config (optional)
├── .gitignore # Excludes SSH private keys
├── ssh/
│ ├── config # SSH config (symlinked to ~/.ssh/config)
│ ├── id_personal # Your personal SSH key (not committed)
│ ├── id_personal.pub
│ ├── id_work # Your work SSH key (not committed)
│ └── id_work.pub
└── nvim/ # Neovim configuration (symlinked to ~/.config/nvim)
├── init.lua
├── lazy-lock.json # Plugin version lock file
└── lua/
├── config/ # Core configuration
└── plugins/ # Plugin configurations
The setup script manages your SSH keys. Before running setup on a new machine:
- Run the setup script
- When prompted, copy your SSH keys to
~/dotfiles/ssh/:
cp ~/.ssh/id_personal ~/dotfiles/ssh/
cp ~/.ssh/id_personal.pub ~/dotfiles/ssh/
cp ~/.ssh/id_work ~/dotfiles/ssh/
cp ~/.ssh/id_work.pub ~/dotfiles/ssh/- Press Enter to continue
The script will:
- Copy keys to
~/.ssh/with correct permissions (600 for private, 644 for public) - Symlink
ssh/configto~/.ssh/config - Add keys to the SSH agent
- Clone dotfiles:
git clone https://github.com/wstuckey/dotfiles.git ~/dotfiles - Copy your SSH keys to
~/dotfiles/ssh/(via USB, secure transfer, etc.) - Run
./setup.sh
Note: Private keys (id_personal, id_work) are in .gitignore and will never be committed.
After installation:
- Restart your terminal or run
exec zsh - Set your terminal font to "JetBrainsMono Nerd Font" (required for icons)
- Verify SSH keys:
ssh-add -l - Test connections:
ssh -T git@github.com ssh -T git@git.ein-softworks.com
The setup script will ask: "Is this a work machine?"
- Yes → Symlinks
.zshrc.workfor work-specific aliases (sites, pushDebug, etc.) - No → Only the main
.zshrcis used
You can also manually enable/disable work config:
# Enable work config
ln -sf ~/dotfiles/.zshrc.work ~/.zshrc.work
# Disable work config
rm ~/.zshrc.workAdditional local overrides can go in ~/.zshrc.local (not tracked in git).
If you prefer to install manually:
# Clone the repo
git clone https://github.com/wstuckey/dotfiles.git ~/dotfiles
# Symlink .zshrc
ln -sf ~/dotfiles/.zshrc ~/.zshrc
# Set up SSH
mkdir -p ~/.ssh && chmod 700 ~/.ssh
ln -sf ~/dotfiles/ssh/config ~/.ssh/config
cp ~/dotfiles/ssh/id_* ~/.ssh/
chmod 600 ~/.ssh/id_personal ~/.ssh/id_work
chmod 644 ~/.ssh/id_personal.pub ~/.ssh/id_work.pub
# Set up Neovim config
mkdir -p ~/.config
ln -sf ~/dotfiles/nvim ~/.config/nvim
# Install Neovim plugins
nvim --headless "+Lazy! sync" +qa
# (Optional) Copy work config
cp ~/dotfiles/.zshrc.work ~/.zshrc.work
# Reload
source ~/.zshrccd ~/dotfiles
git pull
source ~/.zshrcAfter setup, these commands are available:
| Command | Description |
|---|---|
aliases |
Show all available aliases |
lsaliases |
Show work-specific aliases (if enabled) |
tmux-help |
Show tmux cheatsheet |
z <path> |
Smart cd (zoxide) |
zi |
Interactive directory picker |
ll |
List files with details (eza) |
lt |
Tree view (eza) |
dotfiles |
cd to ~/dotfiles |
dotfiles-update |
Pull latest and refresh |
refresh |
Reload .zshrc |
The shell automatically checks for dotfiles updates once per day (in the background, non-blocking). If updates are available, you'll see:
⚠️ Dotfiles update available! Run: cd ~/dotfiles && git pull && refresh
Or just run: dotfiles-update