Automated, secure, and cross-platform dotfiles managed with chezmoi.
Supported Environments:
- 🐧 CachyOS / Arch Linux (Wayland / Hyprland / Full Desktop & CLI)
- 📱 Termux (Android) (Fish / Neovim / CLI Development)
sudo pacman -S --needed git chezmoi && chezmoi init --apply https://github.com/erikenz/dotfiles.gitpkg update && pkg install -y git chezmoi && chezmoi init --apply https://github.com/erikenz/dotfiles.gitThis repository follows official chezmoi best practices:
~/.local/share/chezmoi/
├── .chezmoiroot # Sets target root to home/
├── .chezmoidata/ # Static data manifests
│ └── packages.yaml # Declarative package lists for CachyOS and Termux
├── .chezmoiscripts/ # Lifecycle scripts
│ ├── run_onchange_before_10-install-packages-cachyos.sh.tmpl
│ ├── run_onchange_before_10-install-packages-termux.sh.tmpl
│ ├── run_onchange_after_20-mise-install.sh.tmpl
│ ├── run_onchange_after_30-fisher-install.sh.tmpl
│ ├── run_once_before_configure-git-hooks.sh.tmpl
│ └── run_once_before_configure-mchose-udev.sh.tmpl
├── home/ # Source state for target files (~/)
│ ├── .chezmoi.toml.tmpl # Dynamic platform detection & config
│ ├── .chezmoiignore # Ignores logs, caches, and filters desktop configs on Termux
│ ├── dot_config/ # Managed configurations (~/.config)
│ └── dot_local/bin/ # Local executable helper scripts (~/.local/bin)
└── bootstrap.sh # Universal bootstrap script
The repository manages software across three clean tiers:
-
System Packages (
.chezmoidata/packages.yaml):common: Shared CLI tools (fish,starship,neovim,ripgrep,fd,bat,eza,zoxide,fzf,jq,bottom,lazygit,tmux,curl,wget).cachyos: Full desktop & CLI stack (ghostty,zed,hyprland,hyprpicker,hyprpolkitagent,xdg-desktop-portal-hyprland,uwsm,wofi,zathura,zathura-pdf-mupdf,cliphist,grim,slurp,pavucontrol,playerctl,brightnessctl,translate-shell,cachyos-fish-config,fisher,fastfetch,mise,lazydocker,shelly,swash,rbw, AUR:input-remapper-git).termux: Android CLI stack (termux-api,termux-exec,termux-tools,openssh,proot,python,nodejs,gh).
-
Toolchain & Agent Runtimes (
~/.config/mise/config.toml):- Automated post-apply script (
run_onchange_after_20-mise-install.sh.tmpl) runsmise install -yto provision:herdr(terminal multiplexer for coding agents)agy(Google Antigravity CLI)bun,node,pnpm(runtimes & package managers)mcp-hub(MCP server aggregator)@dokploy/cli,cc-safety-net
- Automated post-apply script (
-
Fish Shell Plugins (
~/.config/fish/fish_plugins):- Automated post-apply script (
run_onchange_after_30-fisher-install.sh.tmpl) updates Fisher plugins:fzf.fish,gitnow,fish-abbreviation-tips,puffer-fish,zoxide.fish.
- Automated post-apply script (
On Termux, GUI and desktop components (Hyprland, Wayland, Ghostty, Zed, GTK/QT, Udev rules) are automatically ignored and never copied to Android storage.
All scripts use #!/usr/bin/env bash and respect Termux's $PREFIX pathing and non-root execution model.
No sensitive tokens, credentials, or private keys are ever published in this public repository.
- API Keys & Passwords:
- Retrieved at runtime using
rbw(Bitwarden CLI) viaget-secretor chezmoi template functions:{{ (rbw "openai").password }} - Falls back to local environment variables (e.g.
OPENCODE_API_KEY).
- Retrieved at runtime using
- Encrypted Files (SSH Keys, Certificates):
- Encrypted with age before committing:
chezmoi add --encrypt ~/.ssh/id_ed25519
- Encrypted with age before committing:
- Pre-Commit Secret Scanner:
- A Git pre-commit hook automatically scans staged changes for API keys, personal access tokens, and private key headers.
| Task | Command |
|---|---|
| Edit configuration | chezmoi edit ~/.config/fish/config.fish |
| Inspect pending changes | chezmoi diff |
| Apply changes to home | chezmoi apply -v |
| Add new file to management | chezmoi add ~/.config/app/config.json |
| Update from GitHub on another machine | chezmoi update -v |
| Open shell in chezmoi source | chezmoi cd |
| Verify setup health | chezmoi doctor |