My personal macOS dotfiles, managed with GNU Stow.
git clone git@github.com:loremipson/dotfiles.git ~/dotfiles
cd ~/dotfiles && ./installThe install script will:
- Install Homebrew if not already present
- Run
brew bundleto install all dependencies from theBrewfile - Symlink all config packages into
$HOMEvia Stow - Ask for your git name and email (saved to
~/.gitconfig, not this repo) - Rebuild bat's theme cache
- Install language runtimes with mise
- Install TPM and the tmux plugins
- Set zsh as the default shell if it isn't already
There's a couple things you'll want to do after (or before, honestly) installing.
- Set the Menu Bar in MacOS Settings to "Always" hide. You might want to enable the background as well, the default Menu Bar is still accessible by hovering at the top, and background enabled makes it easier to interact with.
- Change or remove the shortcut for MacOS Spotlight found in System Settings -> Keyboard -> Keyboard Shortcuts -> Spotlight. I set mine to
⌥+spaceso that it's still accessible if I ever need it. Vicinae will operate with⌘+space.
The install script is safe to run again whenever. If a step fails, the rest still run, and you'll get a summary at the end with the command to rerun just that part.
./install # everything
./install mise tpm # just these steps
./install stow git yazi # just these packages (package names go after "stow")
./install --backup stow git # move existing files out of the way, then stowIf Stow finds a real file where a symlink should go, it won't touch it. Run with --backup to move those files to ~/.dotfiles-backup/ first. Logs from every run end up in ~/.local/state/dotfiles/.
Shared settings (delta, aliases, defaults) live in ~/.config/git/config, which comes from this repo. Your name, email, and anything else personal go in ~/.gitconfig, which stays yours. Git reads both, and ~/.gitconfig wins if they overlap, so git config --global works like normal.
The Zsh config maps several familiar commands to newer tools:
| Command | Runs |
|---|---|
cat |
bat |
ls |
eza with Git status and icons |
tree |
eza --tree |
cd |
Zoxide's z |
grep |
rg |
find |
fd |
These tools do not support every option or behavior of the commands they replace. Add _ to use the original command when needed: cat_, ls_, grep_, find_, or cd_.
mise installs the default versions of Node, pnpm, Bun, Deno, and Go from mise/.config/mise/config.toml. To pin different versions for a project (or a whole folder of them), drop a mise.toml in that directory:
[tools]
node = "24"
pnpm = "11"Tmux hooks can log session activity to Timewarrior so time is tracked per tmux session. This is off by default, since it's only useful for specific situations, not every machine.
To enable it:
- Create
~/.tmux.conf.localwith:
set-hook -g client-attached 'run-shell "~/.config/tmux/track-time.sh"'
set-hook -g client-session-changed 'run-shell "~/.config/tmux/track-time.sh"'
set-hook -g client-detached 'run-shell "~/.config/tmux/track-time.sh"'- Reload tmux config or restart the server.
Each tmux session name becomes a Timewarrior tag. View tracked time with timew summary :all or timew day.
This configuration uses workmux to manage Git worktrees and their associated tmux sessions.
There are two supported workflows:
- Git — the default, for repositories using normal Git branches.
- Graphite — for repositories where Graphite owns the branch/stack topology and workmux owns the worktrees.
The workflow can be selected in ~/.tmux.conf.local:
set -g @workflow "graphite"If no Graphite workflow is configured, the normal Git/workmux workflow is used.
Open the workmux menu with:
prefix + w
Use the menu's help entry or run man dotfiles-workmux for the full Git and Graphite workflows.