Personal dotfiles managed with GNU Stow. Works on Linux (Debian/Ubuntu/Fedora/Alpine, including devcontainers) and macOS.
| Package | What it manages |
|---|---|
tmux |
~/.tmux.conf — Dracula theme, TPM plugins |
zsh |
~/.zshrc, ~/.zshenv, ~/.zprofile, ~/.zsh_custom/ aliases & plugins |
p10k |
~/.p10k.zsh, ~/.p10k-lean.zsh — Powerlevel10k prompt configs |
git |
~/.gitconfig, ~/.config/git/ignore |
vim |
~/.vimrc |
ghostty |
~/.config/ghostty/config — Ghostty terminal config |
atuin |
~/.config/atuin/config.toml — shell history, sync disabled |
Not managed by Stow (installed by install.sh or kept local):
~/.oh-my-zsh/— installed by the oh-my-zsh installer~/.oh-my-zsh/custom/themes/powerlevel10k/— cloned byinstall.sh~/.oh-my-zsh/custom/plugins/zsh-autosuggestions/— cloned byinstall.sh~/.oh-my-zsh/custom/plugins/zsh-completions/— cloned byinstall.sh~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting/— cloned byinstall.sh~/.tmux/plugins/— installed automatically by TPM viainstall.sh~/.zsh_custom/.env.zsh— machine-local credentials, never committed~/.zsh_local— machine-local PATH/alias overrides, never committed~/.gitconfig.local— machine-local git identity (email, signing key); lives at~/.dotfiles/git/.gitconfig.local(gitignored) and is stow-linked into$HOME
# 1. Clone the repo
git clone https://github.com/ismailtzn/.dotfiles.git ~/.dotfiles
# 2. Run the bootstrap script
cd ~/.dotfiles
bash install.shThe script will:
- Install GNU Stow (via apt / apk / dnf on Linux, Homebrew on macOS)
- Install oh-my-zsh
- Clone powerlevel10k, zsh-autosuggestions, zsh-completions, zsh-syntax-highlighting
- Clone TPM (Tmux Plugin Manager) — only if tmux is installed
- Install atuin shell history binary into
~/.atuin/bin/(local-only, sync disabled; if install fails, Ctrl-R falls back to fzf; on first run, seeds the DB by importing~/.zsh_history) - Create a stub
~/.zsh_custom/.env.zshfor machine-local credentials - Back up any existing dotfiles to
~/dotfiles-backup-YYYYMMDD/ - Stow all packages (create symlinks in
$HOME) - Install tmux plugins automatically via TPM
- Set zsh as your default shell
Pass --dry-run to preview all steps without making changes:
bash install.sh --dry-run-
Set git identity (email, optional signing key). The local file lives inside
~/.dotfiles/git/(gitignored) so stow symlinks it to~/.gitconfig.local:cp ~/.dotfiles/git/.gitconfig.local.example ~/.dotfiles/git/.gitconfig.local # edit ~/.dotfiles/git/.gitconfig.local cd ~/.dotfiles && stow --restow --no-folding git
install.shdoes the copy automatically on first run. -
Fill in credentials:
cp ~/.dotfiles/zsh/.zsh_custom/.env.example ~/.zsh_custom/.env.zsh # then edit ~/.zsh_custom/.env.zsh
-
Create machine-local overrides (Flutter SDK, CUDA, etc.):
cp ~/.dotfiles/zsh/.zsh_custom/.local.zsh.example ~/.zsh_local # then edit ~/.zsh_local
-
If tmux plugin installation failed, start tmux and press
prefix+I(default prefix isCtrl-b). -
If the Powerlevel10k prompt looks wrong, re-run the wizard:
p10k configure
| Feature | macOS | Linux |
|---|---|---|
| Package manager | Homebrew (brew) — install first |
apt / apk / dnf |
| Homebrew location | /opt/homebrew (Apple Silicon) or /usr/local (Intel) |
/home/linuxbrew/.linuxbrew |
File opener (o alias) |
open |
xdg-open |
| Clipboard | pbcopy / pbpaste |
xclip or wl-copy |
| fzf shell integration | /opt/homebrew/opt/fzf/shell/ |
/usr/share/doc/fzf/examples/ |
| Ghostty config | ~/.config/ghostty/config |
~/.config/ghostty/config |
Add these to your user settings.json to apply dotfiles automatically in every devcontainer:
"dotfiles.repository": "ismailtzn/.dotfiles",
"dotfiles.targetPath": "~/dotfiles",
"dotfiles.installCommand": "install.sh"install.sh detects the environment and adapts:
- No sudo / already root — uses
apt-get,apk, ordnfwithoutsudoas appropriate - oh-my-zsh unavailable —
.zshrcfalls back to a minimal zsh config (completions only, no theme) chshfails — warns instead of exiting; runexec zshor open a new terminal to use zsh- tmux not installed — skips TPM setup silently
Before stowing, install.sh copies any existing plain files (non-symlinks) that would be overwritten to ~/dotfiles-backup-YYYYMMDD/. The backup preserves the original directory structure relative to $HOME.
-
Create the package directory mirroring
$HOME:mkdir -p ~/.dotfiles/<package>/path/to/ mv ~/path/to/configfile ~/.dotfiles/<package>/path/to/configfile
-
Stow it:
cd ~/.dotfiles stow --no-folding <package>
-
Commit:
git add <package>/ git commit -m "feat: add <tool> config"
cd ~/.dotfiles
stow --restow --no-folding <package>
# or re-stow everything:
for pkg in tmux zsh p10k git vim ghostty atuin; do stow --restow --no-folding $pkg; done