Modern, comprehensive dotfiles managed with chezmoi and synchronized via GitHub.
All configurations use the Catppuccin Mocha color palette for a consistent, eye-friendly visual experience across all tools. The setup emphasizes:
- π― Vim-first workflow - Vim keybindings everywhere
- π Modern CLI tools - Replacements for traditional Unix tools
- π¦ Modular configuration - Clean, organized, well-documented
- π Cross-machine sync - Seamless setup on new machines
This setup uses chezmoi's templating capabilities to apply different configurations based on MACHINE_PROFILE, detected at runtime from hostname, OS, and hardware. This allows for a clean separation between machine types.
MACHINE_PROFILE |
Detection | OS | Package Manager | Theme |
|---|---|---|---|---|
mac-pro |
hostname jsoyer-macOS |
macOS | Homebrew | Catppuccin |
mac-personal |
macOS (other hosts) | macOS | Homebrew | Catppuccin |
ubuntu-desktop |
Ubuntu, hostname not ubuntu-server* |
Linux | apt + Linuxbrew | Catppuccin |
ubuntu-server |
Ubuntu, hostname ubuntu-server* |
Linux | apt + Linuxbrew | Snazzy |
fedora-desktop |
Fedora, hostname not fedora-server* |
Linux | dnf + Linuxbrew | Catppuccin |
fedora-server |
Fedora, hostname fedora-server* |
Linux | dnf | Snazzy |
fedora-atomic |
rpm-ostree present |
Linux | rpm-ostree | Snazzy |
debian |
Debian (non-RPi) | Linux | apt | Snazzy |
toolbox |
TOOLBOX_PATH set |
Linux | (host tools) | Snazzy |
rpi |
/proc/device-tree/model contains rpi |
Linux | apt + Linuxbrew | Snazzy |
windows |
cygwin/msys/mingw | Windows | Scoop | N/A |
- Zsh - Primary shell with Oh-My-Zsh + 48 plugins
- Bash - Universal fallback shell with matching configuration
- Nushell - Modern structured data shell
- Fish - Friendly interactive shell (backup)
- WezTerm - Primary (GPU-accelerated, Lua config)
- Ghostty - Fast, native alternative
- Alacritty - Lightweight alternative
- Kitty - Feature-rich option
- Zellij - Modern Rust-based multiplexer
- Tmux - Classic terminal multiplexer
- Neovim - Primary editor
- Starship - Cross-shell prompt
- Atuin - Magical shell history with sync
- Direnv - Per-directory environment switching
| Traditional | Modern | Description |
|---|---|---|
ls |
eza |
File listings with icons & git |
cat |
bat |
Syntax highlighting |
cd |
zoxide |
Smart directory jumping |
find |
fd |
Fast file finding |
grep |
ripgrep |
Faster searching |
vim |
neovim |
Hyperextensible Vim |
- Aerospace - Tiling window manager (i3-like, vim keybindings)
- Sketchybar - Custom status bar (Catppuccin Mocha, pill-style)
- NeoMutt - Terminal email client
- mbsync (isync) - IMAP synchronization
- msmtp - SMTP relay
- notmuch - Email indexing and search
- Claude Code - AI coding assistant (165 agents, 84 skills, 15 MCP servers)
- OpenCode - Alternative AI coding CLI (shared MCP config)
- RTK - Token optimization proxy for Claude Code
- codecompanion.nvim - Multi-provider AI in Neovim (Claude, OpenAI, Gemini, Mistral, Ollama + CLI agents)
- FZF - Fuzzy finder
- Vivid - LS_COLORS generator
- TheFuck - Command corrector
- LazyGit - Terminal Git UI
- gh - GitHub CLI
- Git, Jujutsu, Brew, Chezmoi - Version control and system management with extensive custom aliases.
The bootstrap script detects your platform and installs everything automatically:
macOS / Linux / Fedora / Raspberry Pi:
curl -sL https://raw.githubusercontent.com/jsoyer/dotfiles/main/scripts/bootstrap.sh | bashWindows (PowerShell):
irm https://raw.githubusercontent.com/jsoyer/dotfiles/main/scripts/bootstrap.ps1 | iexThe bootstrap script will:
- Detect your platform (macOS, Fedora, Debian/RPi, Windows)
- Install prerequisites (git, package manager)
- Install chezmoi
- Install gh (GitHub CLI) via official repo (Debian/RPi/Fedora/Toolbox)
- Apply all dotfiles and run platform-specific setup scripts
If you already have git and a package manager:
sh -c "$(curl -fsLS get.chezmoi.io)" -- init --apply jsoyer| Feature | macOS | Fedora Desktop | Fedora Server/Atomic | Ubuntu Desktop | Ubuntu Server / RPi | Windows |
|---|---|---|---|---|---|---|
| Theme | Catppuccin Mocha | Catppuccin Mocha | Snazzy | Catppuccin Mocha | Snazzy | N/A |
| Package Manager | Homebrew | dnf + Linuxbrew | dnf / rpm-ostree | apt + Linuxbrew | apt + Linuxbrew | Scoop |
| Editor | Neovim | Neovim | Neovim | Neovim | nano | N/A |
| Tmux Prefix | Ctrl+A |
Ctrl+A |
Ctrl+A |
Ctrl+A |
Ctrl+B |
Ctrl+A |
- Log out and log back in to apply shell changes
- Install tmux plugins: Press tmux prefix then
Iinside tmux
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"brew install chezmoi# Using GitHub username
chezmoi init jsoyer
# Or with full URL
chezmoi init https://github.com/jsoyer/dotfiles.git
# With SSH (if you have keys configured)
chezmoi init git@github.com:jsoyer/dotfiles.git# See what will be applied
chezmoi diff
# List all managed files
chezmoi managed# Apply all dotfiles
chezmoi apply
# Apply with verbose output
chezmoi apply -vAfter applying dotfiles, install the modern CLI tools:
brew install \
eza bat fd ripgrep vivid fzf zoxide atuin direnv \
neovim starship git-deltabrew install zsh nushell fishbrew install --cask wezterm alacritty kittybrew install tmux zellijbrew install \
docker kubectl helm terraform \
node npm yarn pnpm \
python pyenv rbenv jenv \
go rust cargobrew install --cask \
font-jetbrains-mono-nerd-font \
font-fira-code-nerd-font \
font-meslo-lg-nerd-fontThis is your source of truth for configuration changes.
# 1. Edit config file directly
nvim ~/.config/alacritty/alacritty.toml
# 2. Test your changes
# (reload app, run commands, etc.)
# 3. Sync to chezmoi (auto-commits & pushes!)
chezmoi re-add ~/.config/alacritty/alacritty.tomlWith autoCommit and autoPush enabled in your chezmoi.toml, this automatically:
- β Adds changes to chezmoi
- β Commits to git
- β Pushes to GitHub
# 1. Edit in chezmoi
chezmoi edit ~/.config/alacritty/alacritty.toml
# 2. Apply changes
chezmoi apply
# 3. Test# Pull latest changes and apply
chezmoi update
# Or manually:
cd ~/.local/share/chezmoi
git pull
chezmoi apply# Add new file to chezmoi
chezmoi add ~/.config/newtool/config.toml
# Commit and push
cd ~/.local/share/chezmoi
git add .
git commit -m "feat(newtool): add initial configuration"
git push# Quick edit and test
nvim ~/.config/tool/config
chezmoi re-add ~/.config/tool/config # Auto-commits & pushes
# Or via chezmoi
chezmoi edit ~/.config/tool/config
chezmoi applyA custom breww script wraps the brew command. When you install a package with breww install <package>, it automatically:
- Installs the package via Homebrew.
- Dumps the machine's current list of packages into the correct profile-specific Brewfile.
- Commits and pushes the change to GitHub.
Brewfile profiles:
| Profile | Brewfile | Content |
|---|---|---|
mac-pro |
Brewfile_common + Brewfile_pro |
Full workstation (casks, mas, go) |
mac-personal |
Brewfile_common + Brewfile_personal |
Personal Mac (casks, mas) |
rpi |
Brewfile_common + Brewfile_rpi |
Minimal RPi subset |
Usage:
# Instead of 'brew install ...', use 'breww install ...'
breww install ripgrepThe same auto-sync pattern from breww is extended to Linux and Windows package managers via aptw, dnfw, and scoopw. Shell aliases make these transparent β just use apt, dnf/yum, or scoop as usual.
How it works:
- Install or remove a package with the normal command (
apt install foo). - The wrapper adds/removes the package from the correct manifest file (
dot_private/Aptfile_*,Dnffile_*, orScoopfile.json). - The manifest change is committed and pushed automatically.
Manifest files (in dot_private/):
| Profile | Manifest | Package Manager |
|---|---|---|
rpi |
Aptfile_rpi |
aptw |
ubuntu-server |
Aptfile_ubuntu_server |
aptw |
ubuntu-desktop |
Aptfile_ubuntu_desktop |
aptw |
debian |
Aptfile_debian |
aptw |
fedora-server |
Dnffile_fedora_server |
dnfw |
fedora-desktop |
Dnffile_fedora_desktop |
dnfw |
windows |
Scoopfile.json |
scoopw |
Shell aliases (set automatically based on MACHINE_PROFILE):
aptβaptw(Linux non-Fedora profiles)dnf/yumβdnfw(Fedora desktop/server)scoopβscoopw(Windows, via PowerShell alias)
Usage:
# Install a package β tracked automatically in the manifest
apt install htop
# Remove a package β removed from manifest
apt remove htop
# Fedora
dnf install btop
# Windows
scoop install neovim# See differences between chezmoi source and actual files
chezmoi diff
# Check status
chezmoi status
# List all managed files
chezmoi managedThe cup command (chezmoi update + packages) updates everything:
# chezmoi update + Homebrew/DNF/Scoop + Docker/Podman
cupThis performs:
chezmoi update- Pull latest dotfiles- Package updates:
- macOS:
brew upgrade+brew update+mas upgrade(App Store) - Linux (RPi):
apt dist-upgrade+apt autoremove - Linux (Fedora):
dnf upgradeorrpm-ostree upgrade - Windows:
scoop update+scoop update --all
- macOS:
- Docker/Podman (if running): Update containers and prune images
# On master machine (after changes)
cd ~/.local/share/chezmoi
git push
# On other machines
chezmoi update # Pull + apply automatically~/.local/share/chezmoi/
βββ .chezmoiscripts/ # Lifecycle scripts (numbered phases)
β βββ 01-setup/ # System prerequisites (Xcode, Homebrew)
β βββ 02-install/ # Package installation (1Password, brew, dnf)
β βββ 03-configure/ # Post-install config (GPG, mail)
β βββ 04-update/ # Package updates (Homebrew, App Store, dnf)
β βββ 05-maintenance/ # Container maintenance
βββ dot_claude/ # Claude Code AI assistant
β βββ agents/ # 165 specialized sub-agents
β βββ skills/ # 84 skills (slash commands)
β βββ hooks/ # Event hooks (RTK, state tracking)
β βββ private_settings.json.tmpl # Permissions, MCP servers
βββ dot_config/
β βββ aerospace/ # Tiling window manager (macOS)
β βββ alacritty/ # Terminal emulator
β βββ atuin/ # Shell history sync
β βββ bat/ # Syntax-highlighted cat
β βββ ghostty/ # Terminal emulator
β βββ isync/ # IMAP sync (mbsync)
β βββ kitty/ # Terminal emulator
β βββ lazygit/ # Terminal Git UI
β βββ msmtp/ # SMTP relay
β βββ neomutt/ # Email client
β βββ nushell/ # Structured data shell
β βββ nvim/ # Neovim editor (LazyVim)
β βββ opencode/ # OpenCode AI assistant
β βββ private_fish/ # Fish shell (restricted)
β βββ sketchybar/ # macOS status bar
β βββ starship/ # Cross-shell prompt
β βββ tmux/ # Terminal multiplexer
β βββ wezterm/ # Terminal emulator (primary)
β βββ zed/ # Zed editor
β βββ zellij/ # Rust multiplexer
β βββ CONFIGURATION_INDEX.md # Tool index documentation
βββ dot_zsh/ # Modular Zsh configuration
β βββ 00-env.zsh # Environment variables
β βββ 01-path.zsh # PATH management
β βββ 02-completions.zsh # Completion system
β βββ 10-aliases.zsh # Command aliases
β βββ 20-functions.zsh # Custom functions
β βββ 30-keybindings.zsh # Vim-style keybindings
β βββ 99-integrations.zsh # FZF, Atuin, plugins
β βββ README.md # Zsh documentation
βββ dot_bash/ # Bash fallback configuration
βββ dot_private/ # Brewfiles: common, pro, personal, linux, rpi (0600)
βββ dot_ssh/ # SSH config (1Password-integrated)
βββ dot_local/bin/ # Custom scripts
β βββ executable_breww # Homebrew wrapper with auto-sync
β βββ executable_update-claude-agents # Agent updater
β βββ executable_claude-init # CLAUDE.md generator for new projects
βββ scripts/
β βββ bootstrap.sh # Multiplatform bootstrap (macOS/Linux)
β βββ bootstrap.ps1 # Windows bootstrap (PowerShell/Scoop)
βββ .chezmoi.toml.tmpl # Chezmoi configuration template
βββ .chezmoiignore.tmpl # Platform-specific file exclusions
βββ .chezmoiexternal.toml.tmpl # External git repos (Oh-My-Zsh, TPM)
βββ CLAUDE.md # Claude Code instructions
βββ README.md # This file
Your chezmoi.toml is configured for automatic synchronization:
[git]
autoAdd = true # Automatically add changes
autoCommit = true # Automatically commit
autoPush = true # Automatically push to GitHub
[data]
name = "Jerome Soyer"
email = "jeromesoyer@gmail.com"
github_user = "jsoyer"This means when you use chezmoi re-add, it automatically:
- Adds the file to chezmoi
- Commits with a generated message
- Pushes to GitHub
No manual git commands needed! οΏ½οΏ½
| Method | Used For |
|---|---|
1Password CLI (op) |
SSH keys, mail passwords, GPG signing |
| Environment variables | API tokens (GitHub, Slack, etc.) |
| chezmoi templates | Machine-specific emails, hostnames |
private_ prefix |
Files requiring 0600 permissions |
secrets.zsh |
Local-only tokens (excluded from git) |
SSH config, git signing, and mail passwords are fetched from 1Password at apply time:
// SSH config pulled from 1Password document
{{ onepasswordDocument "wf34z662n2u3kn5jhrmrmo3o4u" }}
// Mail password at runtime
passwordeval "op read 'op://Private/Gmail NeoMutt/password'"Files depending on op are conditionally ignored when the CLI is unavailable.
Claude Code and OpenCode MCP servers reference environment variables -- never hardcoded:
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"Required env vars: GITHUB_TOKEN, SLACK_BOT_TOKEN, SLACK_TEAM_ID, BRAVE_API_KEY, LINEAR_API_KEY, DISCORD_TOKEN, OBSIDIAN_API_KEY, NOTION_API_KEY.
chezmoi add --encrypt ~/.zsh/secrets.zshgraph LR
A[Edit Config] --> B[Test]
B --> C[chezmoi re-add]
C --> D[Auto-commit]
D --> E[Auto-push to GitHub]
graph LR
A[chezmoi update] --> B[Pull from GitHub]
B --> C[Apply configs]
C --> D[Reload apps]
chezmoi init <repo> # Initialize with a repository
chezmoi apply # Apply all changes
chezmoi apply -v # Apply with verbose output
chezmoi update # Pull from git + apply
chezmoi diff # Show differenceschezmoi add <file> # Add new file
chezmoi re-add <file> # Re-add modified file
chezmoi edit <file> # Edit in chezmoi source
chezmoi remove <file> # Remove from management
chezmoi forget <file> # Untrack file (keep local copy)chezmoi status # Show status
chezmoi managed # List managed files
chezmoi cd # Go to chezmoi source directory
chezmoi doctor # Check for potential issueschezmoi apply --dry-run -v # Preview what would be applied
chezmoi merge <file> # Merge conflicts
chezmoi verify # Verify all managed filesAll tools are configured with consistent Catppuccin Mocha colors:
| Color | Hex | Usage |
|---|---|---|
| Rosewater | #f5e0dc |
- |
| Flamingo | #f2cdcd |
- |
| Pink | #f5c2e7 |
Magenta |
| Mauve | #cba6f7 |
Purple |
| Red | #f38ba8 |
Errors |
| Maroon | #eba0ac |
- |
| Peach | #fab387 |
Orange |
| Yellow | #f9e2af |
Warnings |
| Green | #a6e3a1 |
Success |
| Teal | #94e2d5 |
Cyan |
| Sky | #89dceb |
- |
| Sapphire | #74c7ec |
- |
| Blue | #89b4fa |
Info |
| Lavender | #b4befe |
- |
| Text | #cdd6f4 |
Foreground |
| Subtext1 | #bac2de |
- |
| Subtext0 | #a6adc8 |
- |
| Overlay2 | #9399b2 |
- |
| Overlay1 | #7f849c |
- |
| Overlay0 | #6c7086 |
- |
| Surface2 | #585b70 |
- |
| Surface1 | #45475a |
- |
| Surface0 | #313244 |
- |
| Base | #1e1e2e |
Background |
| Mantle | #181825 |
- |
| Crust | #11111b |
- |
Detailed documentation is available in each configuration directory:
~/.zsh/README.md- Comprehensive Zsh setup guide~/.config/starship/README.md- Starship prompt documentation~/.config/alacritty/README.md- Alacritty configuration guide~/.config/tmux/README.md- Tmux configuration and usage~/.config/wezterm/README.md- WezTerm setup and features~/.config/zellij/README.md- Zellij layouts and keybindings
# Check for issues
chezmoi doctor
# Verify all files
chezmoi verify
# Force re-apply everything
chezmoi apply --force# If you have conflicts between machines
cd ~/.local/share/chezmoi
git status
git pull --rebase
chezmoi apply# Check what's installed
which eza bat fd rg vivid fzf zoxide atuin
# Install missing tools
brew install <tool-name># Check differences
chezmoi diff
# Re-apply specific file
chezmoi apply ~/.config/alacritty/alacritty.toml
# Force apply all
chezmoi apply --forceThis is a personal dotfiles repository, but feel free to:
- Fork and adapt for your own use
- Submit issues if you find problems
- Suggest improvements via pull requests
These dotfiles are based on various open-source projects and personal customizations. Feel free to use and modify as needed.
- Catppuccin - Beautiful pastel theme
- Chezmoi - Dotfiles management
- Oh-My-Zsh - Zsh framework
- Starship - Cross-shell prompt
- All the amazing open-source tool creators
Last Updated: 2026-03-09 Maintained by: Jerome Soyer (@jsoyer)
# Setup new machine (macOS/Linux)
curl -sL https://raw.githubusercontent.com/jsoyer/dotfiles/main/scripts/bootstrap.sh | bash
# Setup new machine (Windows PowerShell)
# irm https://raw.githubusercontent.com/jsoyer/dotfiles/main/scripts/bootstrap.ps1 | iex
# Update configuration (master machine)
nvim ~/.config/tool/config
chezmoi re-add ~/.config/tool/config
# Sync + update packages (all platforms)
cup
# Check status
chezmoi status
# View managed files
chezmoi managedHappy configuring!
Bash configuration mirrors the Zsh setup for consistency when Zsh isn't available (e.g., minimal servers, containers, or recovery scenarios).
~/.bashrc # Main entry point
~/.bash/ # Modular configuration directory
βββ 00-env.bash # Environment & theme configurations
βββ 01-path.bash # PATH management with lazy loading
βββ 10-aliases.bash # Command aliases & shortcuts
βββ 20-functions.bash # Custom shell functions
βββ 99-integrations.bash # External tool integrations
βββ README.md # Detailed documentation
| Feature | Description |
|---|---|
| π¨ Themed | Catppuccin Mocha (macOS) / Snazzy (Linux) |
| π Modern Tools | eza, bat, zoxide, fzf, starship |
| π Zsh Parity | Same aliases, functions, and integrations |
| β‘ Fast Startup | Lazy loading for pyenv/jenv |
| π Cross-Platform | macOS, Linux, Raspberry Pi detection |
| Zsh Feature | Bash Equivalent |
|---|---|
| Oh-My-Zsh plugins | bash-completion + manual sources |
typeset -U path |
path_prepend/path_append functions |
unfunction |
unset -f |
| zsh-autosuggestions | N/A (use atuin for history) |
| zsh-syntax-highlighting | N/A |
| Starship prompt | Starship prompt β |
See ~/.bash/README.md for detailed documentation including:
- File-by-file breakdown
- All aliases and functions
- Customization guide
- Troubleshooting tips