Skip to content

simshanith/dotfiles

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

192 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dotfiles

Personal macOS (Apple Silicon) dotfiles for zsh, managed with chezmoi + mise. One idempotent bootstrap brings a fresh machine — or a headless box — up to a full shell, toolchain, and editor setup.

zsh + Starship prompt

Quick start

Fresh machine, one-liner (self-clones to ~/.dotfiles):

bash -c "$(curl -fsSL https://raw.githubusercontent.com/simshanith/dotfiles/main/install.sh)"

Or from a clone:

git clone https://github.com/simshanith/dotfiles.git ~/.dotfiles
~/.dotfiles/install.sh
exec zsh

install.sh is idempotent and safe to re-run. It: installs Homebrew (which pulls Xcode CLT → git) → brew bundle (shells, casks, terminfo) → chezmoi init --apply (symlinks dotfiles, renders templates, prompts once for name/email/work/machine) → mise install (the CLI toolchain). The first chezmoi run is bootstrapped via mise exec to break the chicken-and-egg where chezmoi itself lives in the mise baseline.

Verify:

echo $SHELL              # /opt/homebrew/bin/zsh
which brew               # /opt/homebrew/bin/brew
mise doctor              # toolchain healthy
chezmoi status           # empty = $HOME matches the repo

Architecture

Four tools, clear lanes:

Tool Owns Lives in
chezmoi (mode = symlink) dotfiles, templates, per-machine data repo root (dot_*, private_*, *.tmpl)
mise CLI toolchain (node, rust, go, bun, starship, ripgrep, chezmoi itself, LSP servers…) dot_config/mise/conf.d/fresh.toml (shared) + config.local.toml (per-machine)
uv Python interpreters, venvs, one-off scripts (uv run); executes mise's pipx: tools declared as pipx:<pkg> in fresh.toml
Homebrew shells, system PATH replacements, GUI casks, fonts, terminfo, keychain-integrated tools Brewfile (+ Brewfile.optional)

chezmoi source naming

Source files use chezmoi's encoding; chezmoi decodes them on apply:

  • dot_zshrc~/.zshrc
  • private_dot_emacs.d/~/.emacs.d/ (the private_ prefix preserves 0700-style perms)
  • *.tmpl → rendered templates (e.g. dot_gitconfig.tmpl folds in git identity)
  • private_bin/~/bin (e.g. executable_cross_origin_chrome)

Daily use: chezmoi status / chezmoi diff / chezmoi apply / chezmoi edit. Per-machine answers (name/email/work/machine) live in ~/.config/chezmoi/chezmoi.toml — prompted by chezmoi init, never committed.

Several configs are symlinked straight into the repo (e.g. ~/.zshrc sources shell/*.sh directly from $DOTFILES, and ~/.emacs.d/init.el is a symlink into private_dot_emacs.d/). Edits to those are live; no chezmoi apply round-trip.

What's inside

  • Shell — zsh (dot_zshrc) sourcing shell-agnostic helpers from shell/*.sh (exports, path, aliases, functions, dircolors); Starship prompt; zoxide, fzf, history-substring-search.
  • Gitdot_gitconfig.tmpl (templated identity), git-delta for diffs.
  • tmuxdot_tmux.conf sourcing the vendored seebi solarized theme.
  • Emacs — Emacs 30 config (private_dot_emacs.d/init.el) for polyglot dev (TS/Rust/YAML/JSON/Markdown via tree-sitter + Eglot). See emacs.md.
  • Terminal — Ghostty is primary (dot_config/ghostty/config); iTerm2 kept as a secondary for tmux -CC control mode (its prefs are intentionally unmanaged).
  • mise baseline — shared tool set in conf.d/fresh.toml.
  • private_bin/ — small scripts deployed to ~/bin.
  • Vendored colors — seebi dircolors / tmux solarized files committed into the repo (chezmoi can't fetch remote git the way Fresh did).

The 2026 refresh

This repo began as a bash + Bash-It + Fresh setup (the Paul-Irish-talk era). The 2026 refresh modernized it end to end — macOS made zsh the default back in Catalina, and the Intel→Apple-Silicon move (/usr/local/opt/homebrew) was overdue.

What changed:

Old New Why
bash + Bash-It zsh + shell/*.sh macOS default; shell-agnostic helpers
Fresh chezmoi per-machine templating, no build step, active project
nvm mise polyglot, fast, no shell-startup penalty
Bash-It themes Starship cross-shell, fast
fasd zoxide faster, maintained
hub gh official GitHub CLI
Python 2 http.server Python 3 / uv Py2 EOL

Added along the way: bat, fd, ripgrep, fzf, git-delta. The Brewfile was pared to essentials (dropped boot2docker/docker-machine/fig, reattach-to-user-namespace, discontinued editors, stale caskroom/* taps).

Fresh → chezmoi: GNU Stow was considered and rejected — the recurring pain here is per-machine state (mise config.local.toml, git identity, future work/personal split), which chezmoi templates solve natively and Stow does not. tuckr was evaluated and dropped. Full rationale and cut-over log: CHEZMOI_MIGRATION.md.

nvm → mise: mise owns the CLI toolchain via conf.d/fresh.toml (committed baseline) with config.local.toml for per-machine tools; eval "$(mise activate zsh)" runs from .zshrc. Python is delegated to uv.

Per-machine & headless notes

  • Per-machine datachezmoi init prompts for name / email / work / machine (.chezmoi.toml.tmpl) and records them in ~/.config/chezmoi/chezmoi.toml (not committed). Templates read {{ .name }} etc. from there.
  • Per-machine tools~/.config/mise/config.toml is seeded once and edit-freely; config.local.toml holds overrides. The committed conf.d/fresh.toml is the shared baseline that every machine gets.
  • Optional extrasBrewfile.optional for things not wanted everywhere.
  • Mostly-headless fleet — most machines (pi / servers / mac-mini) run headless; GUI tooling is opt-in and self-gates on app presence (e.g. App-CLI PATH entries in dot_zprofile, and Emacs's exec-path-from-shell gated to GUI sessions). Headless boxes still get the shell + toolchain + terminal Emacs.

About

dotfiles for macOS; powered by chezmoi

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors