My personal configuration for macOS — terminal, editors, apps, and packages.
| App / Tool | What's stored | How |
|---|---|---|
| zsh | .zshrc |
Symlink |
| tmux | .tmux.conf |
Symlink |
| git | .gitconfig |
Symlink |
| iTerm2 | Preferences plist + profile | Copied on sync |
| Alfred | Full Alfred.alfredpreferences |
Symlink |
| VS Code | settings.json, keybindings.json, extension list |
Symlink + list |
| Positron | settings.json |
Symlink |
| Zotero | user.js preferences + 4 plugins (.xpi) |
Copied on sync/install |
| Pandoc | All templates in ~/.local/share/pandoc/templates/ |
Symlink (whole dir) |
| Homebrew | Brewfile (formulae + casks) |
Generated on sync |
| oh-my-zsh | Plugins + Dracula theme | Git submodules |
Symlinked files are live — edits in the app instantly update the git repo with no copying needed.
git clone --recursive https://github.com/kinelhu/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
./install.shinstall.sh will:
- Install oh-my-zsh if missing
- Initialize git submodules (zsh plugins + Dracula theme)
- Create all symlinks
- Run
brew bundle installto restore all Homebrew packages and casks - Install VS Code extensions
- Copy Zotero plugins and
user.jsinto the active Zotero profile
After install: open Zotero and download Better BibTeX manually (too large to store in git). Also update the machine-specific paths in
~/.dotfiles/zotero/user.js.
One command captures everything and pushes to GitHub:
~/.dotfiles/sync.shThis will automatically refresh:
- Brewfile (new/removed packages)
- VS Code extension list
- iTerm2 preferences
- Zotero plugin files
Then shows a diff, asks for a commit message, and pushes.
To pull on another machine:
cd ~/.dotfiles && git pull
source ~/.zshrc~/.dotfiles/
├── install.sh # Bootstrap for new machines
├── sync.sh # One-command sync & push
├── Brewfile # Homebrew formulae + casks
├── .zshrc # zsh config → ~/.zshrc
├── .tmux.conf # tmux config → ~/.tmux.conf
├── .gitconfig # git config → ~/.gitconfig
├── alfred/
│ └── Alfred.alfredpreferences/ # → ~/Library/Application Support/Alfred/
├── vscode/
│ ├── settings.json # → ~/Library/Application Support/Code/User/
│ ├── keybindings.json # → ~/Library/Application Support/Code/User/
│ └── extensions.txt # Installed via `code --install-extension`
├── positron/
│ └── settings.json # → ~/Library/Application Support/Positron/User/
├── zotero/
│ ├── user.js # Preferences (copied to Zotero profile)
│ └── extensions/ # .xpi plugins (Better BibTeX excluded — see above)
├── iterm2/
│ ├── profile.plist # Readable preferences
│ └── com.googlecode.iterm2.plist
├── pandoc/
│ └── templates/ # → ~/.local/share/pandoc/templates/ (whole dir)
└── oh-my-zsh-custom/
├── plugins/
│ ├── zsh-autosuggestions/ (submodule)
│ ├── zsh-syntax-highlighting/ (submodule)
│ └── fzf-tab/ (submodule)
└── themes/
└── dracula/ (submodule)
The iTerm2 profile is copied (not symlinked) because iTerm2 doesn't support symlinked plists reliably.
To import on a new machine:
cp ~/.dotfiles/iterm2/com.googlecode.iterm2.plist ~/Library/Preferences/com.googlecode.iterm2.plistThen restart iTerm2.
Plugins not loading
cd ~/.dotfiles && git submodule update --init --recursiveSymlinks not set up correctly
ls -la ~ | grep "\->"
ls -la ~/.oh-my-zsh/custom/plugins/Zotero preferences not applying
Make sure user.js is in the right profile directory. Zotero applies it at every startup:
find ~/Library/Application\ Support/Zotero/Profiles -name "*.default" -type d
# copy user.js into that directoryMIT — feel free to use and adapt.