Personal dotfiles managed with Homeshick
and external zsh plugins managed with Antidote.
Homeshick links the personal configuration in home/, including the modules in
home/.zsh/; Antidote loads public and optional private third-party plugins.
Inspiration from mathiasbynens/dotfiles, getantidote/zdotdir, maximbaz/dotfiles, and paulirish/dotfiles.
Get Homebrew first (includes Command Line Tools):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install gh
brew install ghostty
brew install bitwarden
brew install homeshick
export HOMESHICK_DIR=/opt/homebrew/opt/homeshick
source "/opt/homebrew/opt/homeshick/homeshick.sh"
Set up SSH (one key per device):
brew install gh
gh auth login # choose SSH, generates key & uploads to GitHub
Then grab these dotfiles:
homeshick clone git@github.com:jordi9/dotfiles.git
Run homeshick link dotfiles after adding files so the new modules are linked
into ~/.zsh/.
home/.zshrc loads the shell configuration in this order:
- Public Antidote plugins from
~/.zsh_plugins.txt. - Personal modules:
core.zsh,jj.zsh,navigation.zsh,git.zsh, andcommands.zsh. - Optional private Antidote plugins (and the legacy
~/.antidote-boost) viaprivate-plugins.zsh, after personal config so private definitions win. environment.zshconfigures PATH, terminal behavior, and SDK runtimes.- Completion, autosuggestions, and keybindings load before
integrations.zshinitializes Carapace, Atuin, direnv, and zoxide; the prompt loads last.
Add personal aliases and functions to the module that owns their concern:
core.zsh: locale, config/reload helpers, completion refresh, native historyjj.zsh: jj workspace/open/wrapper behaviornavigation.zsh: directory aliases, ZLE implementations, Magic Enter commandgit.zsh: Git aliases and functionscommands.zsh: general shortcuts plus Aerospace, Gradle, IDE, OS, media, and Yazi commandsenvironment.zsh: PATH, terminal/SSH behavior, SDKMAN, Bun, and pnpmintegrations.zsh: Carapace, Atuin, direnv, and zoxide shell hookskeybindings.zsh: ZLE widget registration and key bindings
Homeshick owns these personal modules. Add public external plugins to
home/.zsh_plugins.txt; Antidote generates ~/.zsh_plugins.zsh at shell
startup when the manifest is newer. The generated file is not a source file
and should not be edited manually.
For machine-specific or work plugins, create ~/.zsh_plugins.local.txt:
$HOMESHICK_REPOS/my-private-dotfiles
git@github.com:company/zsh-tools
private-plugins.zsh generates and sources ~/.zsh_plugins.local.zsh
independently when the local manifest exists. It loads after the personal
modules, allowing private plugin definitions to override them. The generated
file is ignored when the local manifest is absent.
Private configs, license keys, work stuff:
homeshick clone git@github.com:jordi9/private-dotfiles-example.git
homeshick link private-dotfiles-example
Scripts in init/ for fresh machines:
init/brew.sh # CLI tools (bat, git, jq, kubectl, etc.)
init/cask.sh # GUI apps
init/go.sh # Go paths and caches (avoids ~/go)
init/macos.zsh # macOS preferences
init/sdkman.zsh # Java version management
Run init/brew.sh before init/go.sh. Review scripts before running—some
aren't idempotent.
Need to install flavours and plugins, in .config/yazi:
ya pkg install
Moom/Manytricks: If settings don't load, try killall cfprefsd. Some hotkeys based
on Rectangle.
dot # jump to the dotfiles repo
reload # reload zsh configAfter editing, reload picks up personal configuration changes. Restart the
shell after changing an Antidote manifest so its static plugin file is updated.