**Repository:** https://codeberg.org/kglitchy/dotfiles A fully terminal-centric macOS environment managed by [`chezmoi`](https://www.chezmoi.io/). Like most everything I do I try to make it so that I can publish the source. You can see this repository on the [Codeberg](https://codeberg.org). [^1] I'm aiming for a few goals with my config: - **Terminal-first**: Email, calendar, contacts, tasks, RSS all in the terminal - **Offline-first**: Full email and calendar sync to local storage - **Declarative**: Single source of truth in `~/.local/share/chezmoi` - **Secret-safe**: No credentials in repo — secrets from macOS Keychain - **Multi-machine**: Same repo, hostname-gated templates <!-- TODO: Issue | Document macOS version requirements, Xcode Command Line Tools, and estimated space needed ## Prerequisites - MacOS Tahoe --> ## Quick Start > [!Tip] > Prefer automated installs? After applying chezmoi, run `brew bundle` to install all packages from `~/Brewfile`. See [[Managing Dependencies with Brewfile]] for details. > [!Warning] > Make sure you provision your secrets first! The config expects credentials for email, RSS, and CalDAV — without these, services will fail to authenticate. See [[Secrets Management]] for setup. ```bash # 1. Install Homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 2. Install chezmoi brew install chezmoi # 3. Initialize chezmoi init https://codeberg.org/kglitchy/dotfiles.git # 4. YOUR SECRETS MUST BE SET BY NOW # 5. Apply chezmoi diff chezmoi apply ``` ## What I Have Configured ### Daily Driver Stack **Terminal:** [`ghostty`](https://ghostty.org/) — fast, native, minimal configuration. Renders ligatures properly, handles images, stays out of the way. Install with: `brew install ghostty` **Shell:** zsh with Oh My Zsh. Plugins managed declaratively in `.chezmoiexternal.toml` and refreshed weekly. Key additions: `zsh-autosuggestions` for greyed-out history hints, `zsh-syntax-highlighting` for visual feedback, `fzf` for fuzzy everything. **Editor:** Neovim with [LazyVim](https://www.lazyvim.org/). Gets you LSP, treesitter, and sensible defaults without the configuration marathon. Custom tweaks live in `lua/config/` and `lua/plugins/`. ### Search & Navigation Three tools that make finding things feel instant: - **`ripgrep`** — `rg "pattern"` respects smart-case and skips `.git` automatically. `brew install ripgrep` - **`fd`** — `fd "*.md"` finds files without the arcane syntax; drives all `fzf` commands. `brew install fd` - **`fzf`** — `Ctrl+T` inserts files, `Ctrl+R` searches history, `Alt+C` jumps directories. `brew install fzf` Modern replacements for standard tools: `bat` instead of `cat` (syntax highlighting), `eza` instead of `ls` (git status icons, tree view), `zoxide` instead of `cd` (frecency ranking). ```bash brew install bat eza zoxide ``` ### The Offline PIM Stack Everything syncs locally. You can read email, check your calendar, and manage tasks without a network connection. **Email:** `mbsync` pulls IMAP to `~/Mail/`, `notmuch` indexes it, `neomutt` provides the interface. `himalaya` offers a CLI for scripting. The `nm` alias runs the full workflow: sync → index → `neomutt` → sync. **Calendar & Contacts:** `vdirsyncer` handles CardDAV/CalDAV. `khal` shows your calendar, `khard` manages contacts, `todoman` handles tasks. All stored as plain text (vcalendar/vcard) in `~/.calendars/` and `~/.contacts/`. **RSS:** `newsboat` syncs with NewsBlur. `j/k` navigation, password pulled from Keychain on startup. ### Version Control `git` with SSH commit signing (the same key used for auth). [`jj`](https://jj-vcs.github.io/jj/) (Jujutsu) for experimental workflows — it understands `git` but provides automatic rebasing and a simpler mental model. ### Quality of Life Aliases **`cat` → `bat`** `bat` adds syntax highlighting, git change markers, and a pager when output exceeds the screen. Use `-p` (plain) when you need raw output for piping. ```bash bat ~/.zshrc # Scrollable, highlighted, with line numbers bat -p file.json # Plain mode, suitable for | jq ``` **`ls` → `eza`** `eza` shows git status (modified, untracked, staged) as emoji indicators, displays directories differently, and supports tree view natively. ```bash eza --tree --git-ignore # Tree view respecting .gitignore eza -la --sort=modified # Detailed list, newest last ``` **`cd` → `z`** `zoxide` learns where you go. Type partial matches and it jumps to the most frequent match. ```bash z dot # cd ~/.local/share/chezmoi (if that's where you go most) z dot config # cd to 'config' subdirectory within best 'dot' match z -i dot # Interactive selection if multiple matches ``` **`nm`** One command for the full email workflow. Runs `mbsync -a` to pull mail, `notmuch new` to index it, launches `neomutt`, then syncs again on exit. Your entire email session in one alias. **`config`** Opens a fuzzy finder over all chezmoi-managed files. Select one to edit in Neovim; saves trigger a background `chezmoi apply`. One alias to browse, edit, and sync your dotfiles. ## Additional References - ~~[[Cheatsheet]] — day-to-day commands~~ - ~~[[Secrets Management]] — adding and managing credentials~~ - ~~[[Email]] — full PIM stack (email, calendar, contacts, tasks)~~ - ~~[[Multi-Machine]] — work vs. personal templates~~ [^1]: The [Codeberg](https://codeberg.org) source forge is built on [Forgejo](https://forgejo.org/). I generally prefer to use open source providers for my software so this is increasingly a go-to.