This repo uses placeholder values for personal info (name, email, SSH hosts, etc.). See CUSTOMIZE.md for a full list of placeholders to replace.
Personal dotfiles managed with GNU Stow and automated with mise.
-
Install mise:
curl https://mise.run | sh -
Clone this repo (use HTTPS on a new machine — SSH isn't configured yet):
git clone --recursive https://github.com/your-username/.dotfiles.git ~/.dotfiles cd ~/.dotfiles && mise trust cd ~/.dotfiles/tmux/.tmux && git checkout master && cd ~/.dotfiles git config submodule.recurse true
-
Bootstrap everything:
cd ~/.dotfiles && mise run init
-
After SSH keys are set up, switch the remote to SSH:
git -C ~/.dotfiles remote set-url origin git@github.com:your-username/.dotfiles.git
The
setup:dotfilestask can also clone the repo for you if~/.dotfilesdoesn't exist yet. It will prompt you to set up SSH auth for GitHub first.
- Installs nala, stow, and runtimes (Rust, Go, Node) in parallel
- Sets up zsh + oh-my-zsh + powerlevel10k + plugins
- Installs all mise-managed tools
- Deploys dotfiles via stow (auto-detects laptop/desktop)
- Configures shell integrations (fzf, zoxide, bat, etc.)
- Post-setup: corepack, VeraCrypt
mise run setup:dotfilescd ~/.dotfiles
# Each package uses tag-default/ (or tag-<variant>/) subdirectories
stow -d bash -t ~ tag-default
stow -d git -t ~ tag-default
# ... etc. for each packagestow -d ssh -t ~ tag-laptop # or tag-desktopstow -nv -d bash -t ~ tag-default # dry-run
stow -D -d zsh -t ~ tag-default # unstow| Package | Contents |
|---|---|
| bash | .bashrc, .bash_logout, .profile |
| mise | .config/mise/ (config, conf.d, tasks) |
| bat | .config/bat/themes/ (tokyonight) |
| fzf | .fzf.bash, .fzf.zsh |
| git | .gitconfig, .git-completion.bash, .git-prompt.sh, .git-template/ |
| gnome_themes | .themes/ (ChromeOS-dark, WhiteSur-dark) |
| gpg | .gnupg/gpg-agent.conf |
| p10k | .p10k.zsh (laptop/desktop variants) |
| ssh | .ssh/config (laptop/desktop variants) |
| tmux | .config/tmux/ (oh-my-tmux submodule) |
| yazi | .config/yazi/ (config, keymap, plugins, theme) |
| zsh | .zshrc, .zshenv |
| nvim | .config/nvim/ (Neovim config — git submodule) |
| gh | .config/gh/config.yml (GitHub CLI config) |
| gh-dash | .config/gh-dash/config.yml (GitHub dashboard TUI) |
| claude | .claude/ (Claude Code settings, keybindings, plugins, commands, agents, skills) |
| Task | Description |
|---|---|
init |
Entry point: install stow, deploy mise config, optionally run bootstrap |
bootstrap |
Full machine setup |
install:stow |
Install GNU Stow (apt/nala or from source if no sudo) |
install:nala |
Install nala apt frontend |
install:runtimes |
Install Rust, Go, Node via mise |
install:veracrypt |
Install latest VeraCrypt |
setup:zsh |
Full zsh environment setup |
setup:custom-dotfiles |
Manage custom config packages (add/remove your own configs) |
setup:dotfiles |
Deploy dotfiles via stow (resolves device tag) |
setup:shell-tools |
Configure shell integrations |
setup:p10k-configure |
Run p10k configuration wizard |
setup:zsh-config |
Configure .zshrc with mise integration, plugins, and theme (run after setup:dotfiles) |
setup:completions |
Set up shell completions directory |
setup:nodes-tools |
Enable corepack |
update:oh-my-tmux |
Update oh-my-tmux submodule to latest master |
Based on oh-my-tmux (git submodule). Plugins are configured in tmux.conf.local but the plugins directory is not tracked. After cloning or pulling new plugin configs, install them inside a tmux session with <prefix> I.
To update the submodule to the latest upstream:
mise run update:oh-my-tmuxYou can extend this repo with your own config packages (e.g., alacritty, wezterm, hyprland) in a separate directory (~/.dotfiles-custom/). See CUSTOM-PACKAGES.md for full details.
mise run setup:custom-dotfiles # Interactive add/remove
mise run setup:dotfiles # Deploy everything