Complete installation guide for dev-config across different platforms.
- Git - Version control
- Zsh - Shell (or willingness to switch from bash)
The following will be installed automatically if missing:
- Homebrew (macOS only)
- Docker (20.10+) - Container platform
- Neovim (0.9.0+)
- tmux (1.9+)
- fzf - Fuzzy finder
- ripgrep - Fast grep
- lazygit - Git TUI
- make - Build tools (telescope-fzf-native)
- node - Node.js runtime
- npm - Node package manager
- imagemagick - Image processing
- Docker Compose - Container orchestration (optional)
- Oh My Zsh - Zsh framework
- Powerlevel10k - Zsh theme
- zsh-autosuggestions - Zsh plugin
- TPM - Tmux Plugin Manager
These are automatically installed when you first open Neovim:
LSP Servers:
- ts_ls - TypeScript/JavaScript language server
- pyright - Python language server
- lua_ls - Lua language server (for Neovim config)
Formatters:
- stylua - Lua code formatter
- prettier - JavaScript/TypeScript/JSON/YAML/Markdown formatter
- ruff - Python formatter and linter
-
GitHub CLI (
gh) - For PR/issue management in Neovim# macOS brew install gh # Linux (Debian/Ubuntu) sudo apt install gh # Authenticate after installing gh auth login
-
pkg-config - For blink.cmp Rust optimization (optional)
# macOS brew install pkg-config # Linux (Debian/Ubuntu) sudo apt install pkg-config
git clone https://github.com/yourusername/dev-config ~/Projects/dev-config
cd ~/Projects/dev-configbash scripts/install.shWhat the installer does:
- ✅ Checks for sudo (script should run as normal user)
- ✅ Verifies repository structure
- ✅ Installs Homebrew (macOS) if missing
- ✅ Installs core dependencies (git, zsh, neovim, tmux, fzf, ripgrep, lazygit)
- ✅ Checks tool versions (Neovim ≥ 0.9.0, tmux ≥ 1.9)
- ✅ Installs Oh My Zsh + Powerlevel10k + zsh-autosuggestions
- ✅ Installs TPM (Tmux Plugin Manager)
- ✅ Creates backups of existing configs (timestamped)
- ✅ Creates symlinks from home directory → repository
- ✅ Creates
~/.zshrc.localfor machine-specific config - ✅ Auto-installs Neovim plugins (via Lazy.nvim)
- ✅ Auto-installs tmux plugins (via TPM)
- ✅ Verifies installation
Zero manual intervention required!
exec zshOpen Neovim and tmux - everything should work automatically.
Secure SSH authentication and Git commit signing using 1Password SSH Agent. This approach stores private keys in your encrypted 1Password vault instead of on disk.
Security:
- Private keys never touch disk (encrypted in 1Password vault)
- Biometric unlock (Touch ID/Face ID/Windows Hello)
- No secrets committed to Git (safe for public repos)
Convenience:
- Keys sync across all your devices via 1Password
- No manual SSH key management
- Auto-fill for SSH passphrases
- Commit signing with single setup
- 1Password Account - Sign up (free for personal use)
- 1Password Desktop App - Install from website or:
# macOS brew install --cask 1password - 1Password CLI (auto-installed by
install.sh)
macOS/Windows:
- Open 1Password desktop app
- Settings → Developer
- Enable "Use the SSH agent"
- Enable "Display key names when authorizing connections" (optional but helpful)
Linux: See 1Password SSH Agent Setup Guide
Option A: Generate new SSH key in 1Password (Recommended)
- 1Password desktop app → New Item → SSH Key
- Name: "GitHub SSH Key"
- Click "Generate a new key"
- Key Type: Ed25519 (recommended) or RSA 4096
- Save
Option B: Import existing SSH key
- 1Password desktop app → New Item → SSH Key
- Name: "GitHub SSH Key"
- Private Key: Paste contents of
~/.ssh/id_ed25519 - Public Key: Paste contents of
~/.ssh/id_ed25519.pub - Save
From 1Password Desktop:
- Open your SSH key item
- Click "Copy Public Key"
From CLI:
# After authenticating 1Password CLI
op read "op://Dev/GitHub SSH Key/public key"Manual extraction (if needed):
# View all SSH keys in 1Password
ssh-add -LAdd your SSH public key to GitHub for both authentication and signing.
For Authentication (Required):
- GitHub → Settings → SSH and GPG keys
- New SSH key → Authentication key
- Title: "1Password - [Your Computer Name]"
- Key: Paste public key (starts with
ssh-ed25519orssh-rsa) - Add SSH key
For Signing (Recommended):
- GitHub → Settings → SSH and GPG keys
- New SSH key → Signing key
- Title: "1Password - Signing Key"
- Key: Paste the same public key
- Add SSH key
Test authentication:
ssh -T git@github.com
# Expected: "Hi <username>! You've successfully authenticated..."Create machine-specific configuration file (gitignored, not committed):
# Copy template
cp secrets.nix.example ~/.config/home-manager/secrets.nix
# Edit with your details
nvim ~/.config/home-manager/secrets.nixExample secrets.nix:
{
# Your Git identity (used for commits)
gitUserName = "Your Name";
gitUserEmail = "your-email@example.com";
# Your SSH public key from 1Password (for commit signing)
# Get from 1Password or: op read "op://Dev/GitHub SSH Key/public key"
sshSigningKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your-email@example.com";
}Important:
- Replace with your actual values
- Use the same public key you added to GitHub
- Never commit this file (already gitignored)
# Activate Nix environment (if using Nix)
cd ~/Projects/dev-config
nix run .#activate
# Or reload shell config
source ~/.zshrcTest SSH authentication:
ssh -T git@github.com
# Expected: "Hi <username>! You've successfully authenticated..."Test Git commit signing:
cd ~/Projects/dev-config
git commit --allow-empty -m "Test commit signing"
git log --show-signature -1
# Should show "Good signature" with your SSH keyTest 1Password CLI:
# Should prompt for 1Password authentication
op whoami"Could not open a connection to your authentication agent"
- Ensure 1Password SSH agent is enabled in settings
- Restart 1Password desktop app
- Check socket path:
# macOS ls -la ~/Library/Group\ Containers/2BUA8C4S2C.com.1password/t/agent.sock # Linux ls -la ~/.1password/agent.sock
"Permission denied (publickey)"
- Verify SSH key added to GitHub (Authentication key)
- Test with verbose output:
ssh -Tvvv git@github.com - Check 1Password SSH agent logs in 1Password desktop app
"Bad signature" when verifying commits
- Ensure SSH key added to GitHub as Signing key (not just Authentication)
- Verify
sshSigningKeyinsecrets.nixmatches GitHub public key - Check Git config:
git config --get gpg.ssh.program
"op: not found" errors
- Ensure 1Password CLI installed:
which op - If missing, install manually:
brew install 1password-cli
For more troubleshooting, see docs/nix/09-1password-ssh.md
On any other machine:
git clone https://github.com/yourusername/dev-config ~/Projects/dev-config
cd ~/Projects/dev-config
bash scripts/install.shAll configs and plugins will be set up identically.
- Homebrew will be installed automatically
- Ghostty config path:
~/Library/Application Support/com.mitchellh.ghostty/config - Python paths in
.zprofileare macOS Framework Python installations
- Uses system package manager (apt/dnf/pacman/zypper)
- Ghostty config path:
~/.config/ghostty/config - Homebrew detection includes Linuxbrew paths
- Not officially supported yet
- WSL users: treat as Linux installation
After installation, verify everything is working:
bash scripts/validate.shThis will check:
- ✅ Repository structure
- ✅ Symlinks pointing to correct locations
- ✅ All dependencies installed
- ✅ Tool versions meet requirements
- ✅ Oh My Zsh, Powerlevel10k, TPM installed
Pull latest changes from repository:
bash scripts/update.shThis will:
- Stash uncommitted changes (with prompt)
- Pull latest from Git
- Reload tmux config (if running)
- Remind you to restart Neovim and shell
Remove all symlinks and restore backups:
bash scripts/uninstall.shNote: This removes symlinks but keeps the repository intact at ~/Projects/dev-config.
macOS:
- Docker Desktop installed via Homebrew cask
- Auto-starts after installation
- May require manual start:
open -a Docker
Linux:
- Installed via package manager (apt, dnf, pacman, zypper)
- User added to docker group automatically
- Service started and enabled
- Important: Log out and back in for group changes to take effect
After installation, verify Docker is working:
# Test Docker daemon
docker --version
# Test Docker functionality
docker run hello-world
# Check Docker Compose (if installed)
docker-compose --version
# or
docker compose versionDocker aliases are available in ~/.zshrc.local (commented out by default):
# Edit ~/.zshrc.local and uncomment aliases you want:
alias d='docker'
alias dc='docker-compose'
alias dcu='docker-compose up'
alias dcd='docker-compose down'
alias dcb='docker-compose build'
alias dps='docker ps'
alias di='docker images'
# ... and moreDocker daemon not running:
# macOS
open -a Docker
# Linux
sudo systemctl start dockerPermission denied on Linux:
# Add user to docker group (if not done automatically)
sudo usermod -aG docker $USER
# Log out and back inDocker Desktop not starting on macOS:
- Check if Docker Desktop is installed:
brew list --cask docker - Reinstall if needed:
brew reinstall --cask docker
See TROUBLESHOOTING.md for common issues and solutions.
| Source (Repository) | Target (Home Directory) |
|---|---|
nvim/ |
~/.config/nvim |
tmux/tmux.conf |
~/.tmux.conf |
ghostty/config |
~/Library/Application Support/com.mitchellh.ghostty/config (macOS) or ~/.config/ghostty/config (Linux) |
zsh/.zshrc |
~/.zshrc |
zsh/.zprofile |
~/.zprofile |
zsh/.p10k.zsh |
~/.p10k.zsh |
Backups: Original files are backed up with timestamp: ~/.config/nvim.backup_20251006_120000