**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.