- Compatible with macOS and Linux (Ubuntu)
- Managed using Stow
- Primary IDE: Cursor (AI-powered code editor)
curl -fsSL https://raw.githubusercontent.com/kylelundstedt/dotfiles/master/install.sh | bashOr manually:
git clone https://github.com/kylelundstedt/dotfiles ~/dotfiles
cd ~/dotfiles
./install.shThe install script will:
- ✅ Prompt you for Git name and email (if not already configured)
- ✅ Install Homebrew (if not present)
- ✅ Install all CLI tools from Brewfile
- ✅ Set up your shell configuration (zsh + Starship prompt)
- ✅ Stow all dotfiles to your home directory
- ✅ Create local config templates (AWS, SSH) from examples
The install script will prompt you for your Git name and email during installation. If you need to update it later, edit ~/dotfiles/git/.gitconfig_common and re-run ./install.sh or manually stow: stow git
The install script automatically creates local config files from examples. Customize them as needed:
-
AWS Config:
~/dotfiles/aws/.aws/config- Update SSO URLs, account IDs, and regions
-
SSH Config:
~/dotfiles/ssh/.ssh/config- Add your SSH hosts and configurations
Note: These local configs are gitignored and won't be committed to the repository.
The repository uses GNU Stow for symlink management. Each directory represents a "package" that gets stowed:
| Directory | Purpose | Stow Target | Platform |
|---|---|---|---|
1Password/ |
1Password CLI config | ~/.config/op/ |
macOS |
aws/ |
AWS CLI configuration | ~/.aws/ |
Both |
cursor/ |
Cursor IDE settings & extensions | ~/Library/Application Support/Cursor/ |
macOS |
git/ |
Git configuration with OS-specific includes | ~/ |
Both |
homebrew/ |
Brewfile for macOS packages | ~/ |
macOS |
nushell/ |
Nushell shell configuration | ~/Library/Application Support/nushell/ |
Both |
python/ |
Python package requirements & install script | ~/ |
Both |
ssh/ |
SSH client configuration | ~/.ssh/ |
Both |
starship/ |
Starship prompt configuration | ~/.config/ |
Both |
zsh/ |
Zsh shell configuration | ~/ |
Both |
The git configuration uses conditional includes for OS-specific settings:
~/.gitconfig # Main config with includeIf directives
├── ~/.gitconfig_common # Shared configuration
├── ~/.gitconfig_local # User-specific (name, email) - gitignored
├── ~/.gitconfig_macos # macOS-specific (1Password SSH signing)
└── ~/.gitconfig_linux # Linux-specific (nano editor)
- All CLI tools from
homebrew/Brewfile(including casks and Mac App Store apps) - Shell: zsh with Starship prompt
- Git configuration with macOS-specific settings (1Password SSH signing)
- CLI tools from
homebrew/Brewfile(excluding macOS-only packages) - Shell: zsh with Starship prompt
- Git configuration with Linux-specific settings
cat→bat(syntax highlighting)ls→exa(better file listing)grep→ripgrep(faster search)cd→zoxide(smart directory jumping)
- Nushell - Primary shell with structured data handling
- Starship - Cross-shell prompt with git integration
- Atuin - Encrypted shell history sync across devices
- Zoxide - Smart
cdreplacement with frecency algorithm - Carapace - Universal completion engine
- Direnv - Directory-based environment variables
- Cursor: AI-powered code editor (primary IDE)
- 1Password CLI: Secure secret management
- Git: Multi-OS configuration with SSH signing via 1Password
- AWS CLI v2: Cloud resource management
- DuckDB: Embedded analytics database
- Homebrew installs to
/opt/homebrew/on Apple Silicon - 1Password SSH agent integration requires specific socket path
- Terminal app set to Warp via
terminal.external.osxExec - Some GUI apps installed via
mas(Mac App Store CLI)
- Shell change requires
chsh -s /usr/bin/zsh - DuckDB installed manually for ARM64 architecture
- Carapace installed via Fury.io APT repository
- Tailscale with IP forwarding configuration for exit nodes
- Nushell configuration works identically on both platforms
- Starship prompt configuration shared between platforms
- Git includes OS-specific configs automatically
- Python UV setup creates platform-agnostic virtual environments
# Reload shell configuration
source ~/.zshrc # or source ~/.config/nushell/config.nu for Nushell
# Update Homebrew packages (macOS)
brew bundle --file=~/dotfiles/homebrew/Brewfile
# Sync Atuin history
atuin syncCheck if zsh is in /etc/shells and use chsh -s $(which zsh)
Verify permissions: chmod 700 ~/.config/op and ensure 1Password desktop app is running
Ensure starship binary is in PATH and initialization script exists
Verify 1Password SSH agent is running and identityagent path is correct in .gitconfig_macos
Run brew doctor and ensure Xcode Command Line Tools are installed: xcode-select --install
To test the Linux installation path locally, you can use a one-off Docker container that mimics a fresh environment.
This command uses the official uv image (which has Python, Curl, and Git) but mimics a clean start by ensuring dependencies are installed before running the script:
docker run --rm -it ghcr.io/astral-sh/uv:python3.12-bookworm bash -c "apt-get update && apt-get install -y sudo zsh && curl -fsSL https://raw.githubusercontent.com/kylelundstedt/dotfiles/master/install.sh | bash; exec zsh -l"Alternatively, you can use the included test script if you have OrbStack installed:
./test-linux.shThis uses OrbStack's Linux VM to verify the installation works on Linux.