A highly portable, secure, and modular development environment configuration designed to work out-of-the-box on both personal macOS workstations and headless Linux VM servers.
- Multi-OS Support: Automatic detection and installation of packages on both macOS (via Homebrew) and Linux/Ubuntu/Debian (via apt).
- Safe Secrets Management: Automatically separates private API keys/tokens into
~/.secretsto prevent committing them to Git. - Zero-Dependency Linking: The symlink bootstrapper has zero external dependencies, meaning you can configure your environment first, even on clean installations.
- Modular Shell Architecture:
config.zsh: Core settings (history, completion matching, globbing).aliases.zsh: Portable commands (git, docker, navigation, Neovim).aliases-macos.zsh: macOS specific bindings (clipboard integrations, app launchers).functions.zsh: Ported functions (kpkill port,cpfilecross-platform clipboard copy, folder copying, base64 encoding/decoding).
- Tmux Integration: Configured for seamless persistence on remote SSH/VM sessions with scrollback, mouse support, and Vim keybindings.
- Runtime and Version Managers: Auto-configures ASDF plugins, Bun, Cargo (Rust), Pipx (Python CLI apps), and global packages.
dotfiles/
├── bootstrap.sh # Main installer (OS detection, package install, symlinks)
├── sync.sh # Auto git pull/commit/push sync script
├── install/ # Installation modules
│ ├── os-packages.sh # Installs packages (brew for macOS, apt for Linux)
│ ├── runtimes.sh # Installs Bun, Rustup, ASDF, Pipx, NVM/fnm, Node
│ ├── symlinks.sh # Symlinking script (with backups)
│ └── ohmyzsh.sh # Oh My Zsh and plugins (syntax, autosuggestions)
├── configs/ # Configurations to be symlinked
│ ├── zsh/ # Modular Zsh files (.zshrc, .zshenv, aliases, functions)
│ ├── git/ # Git configs (.gitconfig, .gitignore_global)
│ ├── npm/ # NPM and Yarn settings
│ ├── tmux/ # Tmux settings (.tmux.conf)
│ └── pip/ # Pip settings (pip.conf)
├── scripts/ # User scripts
│ └── dotfiles # CLI management script
└── templates/
└── .secrets.example # Template for API keys (e.g. GEMINI_API_KEY, GITHUB_TOKEN)
You can clone the repository, pull updates, and launch the interactive setup with a single command:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/hoojinguyen/dotfiles/main/bootstrap.sh)"After bootstrapping completes:
source ~/.zshrcOpen ~/.secrets in your editor to check or fill in your API keys (like GEMINI_API_KEY, GITHUB_PERSONAL_ACCESS_TOKEN):
nano ~/.secretsThis repository includes a dotfiles CLI wrapper linked to ~/bin/dotfiles. You can run it from anywhere in your shell:
dotfiles sync: Pull latest changes and push local additions.dotfiles status: Rungit statusinside your dotfiles repository.dotfiles edit: Open the dotfiles directory in your default editor.dotfiles bootstrap: Run the setup bootstrapper again.dotfiles help: Show the help guide.
If you need to remove the symlinks and restore your original configuration files, you can run the uninstaller script:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/hoojinguyen/dotfiles/main/uninstall.sh)"This will:
- Safely remove all generated symlinks in your home directory.
- Revert and restore your original configuration files from their latest backups (
*.bak_*). - Clean up empty installation folders (like
~/binor~/.pipif empty).