Personal dotfiles for macOS and Linux, managed by Dotbot. Every linked file lives under config/<tool>/; install.conf.yaml declares where each one gets symlinked.
On a new machine (macOS or Linux), clone the repo and run the bootstrap script:
git clone https://github.com/thijskok/dotfiles.git ~/.dotfiles
cd ~/.dotfiles
bin/first-setup
All operational scripts live under bin/.
Bootstraps a fresh machine end-to-end:
- Installs packages: Homebrew + everything in
config/homebrew/Brewfileon macOS,apt+ everything inconfig/apt/packages.txton Linux. - Installs oh-my-zsh if it isn't already present.
- Sets zsh as the default login shell.
- Runs
bin/installto symlink everything in this repo. - Applies macOS system defaults via
bin/macos-defaults(macOS only).
Runs Dotbot against install.conf.yaml — initializes the dotbot/ submodule first, then symlinks every entry under link: into the right destination. Idempotent; safe to re-run after editing any config or adding a new link: entry.
Brings everything on the machine up to date:
git pullthe dotfiles repo.- Re-run
bin/installto pick up any newly-addedlink:entries. - macOS:
brew update,brew upgrade, re-apply the Brewfile,brew cleanup, then runbin/brewfile-sync. Linux:apt-get update && upgrade, reinstall fromconfig/apt/packages.txt. npm update -gandcomposer global update(skipped if either isn't installed).
macOS only. Keeps config/homebrew/Brewfile in sync with whatever is actually installed locally. Compares brew leaves (top-level formulae), brew list --cask, and mas list (Mac App Store apps) against the Brewfile and appends any missing entries as a dated block:
# Added by brewfile-sync on 2026-06-28
brew "pnpm"
cask "orbstack"
mas "Things", id: 904280696
Idempotent — running twice in a row adds nothing the second time. The script tolerates tap-prefixed entries (e.g. jordond/tap/jolt) and resolves renamed/aliased formulae and casks to their current name first, so neither shows up as a spurious duplicate. Grouping (Dev / Apps / Fonts) is left to manual re-sorting when convenient. Called automatically by bin/update.
Applies a curated set of macOS system defaults: faster key-repeat, Finder tweaks, save/print panel expansion, Dock and Mission Control timings, automatic software-update checks, etc. Some changes only take effect after logout/restart.
Adding or changing a config:
- Place the file under
config/<tool>/(the directory layout mirrors the tool name, not the destination path). - Add a
link:entry toinstall.conf.yamlmapping the destination (e.g.~/.config/foo/bar) to the repo-relative source. - Run
bin/install. There's noforce/relinkdefault set, so it'll refuse to overwrite a destination that already exists as a real file rather than a symlink — reconcile the content first, then remove the real file so it can link.