Dotfiles
EJ Fox Dotfiles: The Complete Field Guide
A survival manual for your future self when you inevitably forget how your own terminal works.
The Daily Workflow
When you open a terminal, your startup script automatically runs a custom dashboard that shows you everything you need to know right now. It pulls from Things for your tasks, icalBuddy for calendar events, scans your ~/code directory for recent git repos, checks Obsidian for recent notes, and gives you an AI-powered email summary that filters out all the financial spam automatically.
The AI (using your CIPHER persona) gives you cryptic but helpful daily insights cached for 3 hours. If you're in a tmux session, it won't spam you with this info unless you explicitly run `~/.startup.sh --force`.
Your Custom Commands
When you want to check email, just type `m` to open neomutt. Inside neomutt, press `1` to see only unread emails, `2` for emails you've replied to, `3` to jump to sent mail, `4` for flagged items, and `0` to show everything. If an email looks important but you don't want to read the whole thing, press `S` to get an AI summary.
For deeper email analysis when you have a pile of unread messages, run `ei` (email-insights). This feeds your recent email subjects to the AI and gives you a prioritized breakdown of what actually needs your attention versus what's just noise.
Your git workflow is enhanced with an AI-powered commit command. Just type `commit` and it'll analyze your staged changes, generate 10 different commit message options using conventional commit format, and let you pick one with fzf. No more staring at a blank commit message prompt.
Your tmux setup is designed to be completely monochrome and distraction-free. The prefix key is `C-a` (not the default C-b). Use `Alt+h` and `Alt+l` to switch between windows quickly without hitting the prefix. For panes, it's pure vim: `hjkl` to navigate, `HJKL` (capital) to resize. Split with `-` for horizontal or `_` for vertical.
The status bar shows geometric symbols for pane counts: ⚌ for 2 panes, ☰ for 3, ⚍ for 4, etc. When you're using the prefix key, you'll see a ◼ indicator. The whole thing is centered like your code editor and completely theme-agnostic.
Zen Mode System
When you need deep focus, run `~/.zen-mode.sh` to hide the dock, menu bar, and disable notifications system-wide. This creates a `/tmp/.zen-mode-state` file that all your other tools check for. Your startup script won't show, tmux and nvim know to be extra minimal, and everything just gets out of your way. Run the script again to toggle back.
Email System Deep Dive
Your email setup is a three-part system: mbsync pulls from Gmail in the background, neomutt provides the interface, and AI processes everything to keep you sane.
The background sync happens automatically, but you can manually sync with `Ctrl+S` inside neomutt. Your startup script shows a smart summary that categorizes emails: 🤖 for dev notifications (GitHub, CI failures), ⚠️ for urgent items, 📅 for calendar stuff, and → for normal emails. Financial emails, payment failures, and subscription spam are automatically filtered out.
The AI email summarization happens in two places. The startup summary processes recent email subjects and cleans up encoding artifacts while filtering spam. The deeper `ei` command analyzes patterns in your inbox and suggests workflows for handling everything efficiently.
Inside neomutt, everything is monochrome to match your tmux aesthetic. No colors, just reverse highlighting for the current selection. Raw emails are shown in chronological order with no threading - pure and simple. Auto-mark-read is enabled so emails mark themselves read as you scroll past them.
Shell Customizations
Your zsh is heavily customized but loads fast through lazy loading. Tools like conda, zoxide, and atuin only initialize when you first use them. Your PATH prioritizes modern replacements: `lsd` instead of `ls`, `bat` instead of `cat`, `dust` instead of `du`.
The `c` command doesn't just clear the screen - it clears and runs your refresh function. The `l` command gives you a detailed directory listing with icons and human-readable sizes. When you want to jump directories, just type `z` followed by part of a path name - zoxide will figure out where you meant to go.
Your Ruby environment uses rbenv instead of RVM (you migrated away from RVM chaos). Python uses uv for everything - it's aliased to replace pip, pip3, python, and venv commands with helpful reminders to use uv instead.
Modern CLI Arsenal
You've replaced most traditional Unix commands with modern alternatives. `lsd` gives you colored ls output with file type icons. `bat` provides syntax highlighting when viewing files. `dust` shows disk usage visually instead of boring du output. `duf` presents disk free information with actual graphs. `btop` replaces top with a modern TUI that looks like a sci-fi interface.
These aren't just aliases - they're fundamental workflow changes. When you `cat` a code file, you get syntax highlighting automatically. When you `ls` a directory, you see file types at a glance. When you check disk usage, you get immediate visual understanding instead of scanning numbers.
Development Environment
Your nvim setup is LazyVim with minimal customizations. It auto-detects light/dark mode and switches themes accordingly. Zen mode integration means it goes completely minimal when you're in focus mode. The statusline is stripped down to essentials only.
Sketchybar replaces the default macOS menu bar with custom widgets. It shows git status for your current directory, battery percentage, and tracks how much you're using Claude API. Everything matches your minimal aesthetic - no flashy colors or animations.
The AI Integration Layer
Throughout your system, AI provides contextual assistance without being intrusive. The startup script uses your CIPHER persona to give daily insights. Email processing removes spam and categorizes everything intelligently. Git commits get smart suggestions based on your actual changes.
The key is that AI enhances your workflow without taking over. It filters noise, suggests actions, and provides context - but you're always in control. When the LLM is unavailable, everything falls back to sensible defaults.
File and Process Management
Yazi handles file management in the terminal with vim-like navigation but no distracting colors. Everything is about content and structure, not visual candy. Btop monitors system processes with transparency effects that integrate with your desktop.
For search, ripgrep (rg) handles text searching with blazing speed. The startup script uses it extensively to scan through your email and notes quickly.
Backup and Recovery
Your entire setup is version controlled in the dotfiles repo. The sync script handles symlinking everything to the right places. If you're setting up a new machine or recovering from a system wipe, just clone the repo and run the sync script.
All secrets are in macOS Keychain, never committed to git. Email authentication goes through keychain lookup commands. Your app passwords and API keys are safely stored in the system keychain and retrieved dynamically.
Troubleshooting Your Own System
If neomutt throws library errors, run `brew reinstall neomutt` to fix dependency issues. If the startup script seems slow, check if the AI reflection cache is stale - it's in `/tmp/startup_cache/reflection_cache.txt` and refreshes every 3 hours.
If email isn't syncing, manually run `mbsync gmail` to see error messages. The most common issue is keychain access - make sure your app password is stored correctly with the security command.
When tmux keybindings feel wrong, remember your prefix is `C-a`, not the default `C-b`. If you're getting weird characters in terminal output, check that your TERM variable is set to "xterm-256color".
The Philosophy in Practice
Everything in your setup follows the principle of minimal visual noise with maximum functional density. Colors are used sparingly and meaningfully. Animations are disabled. Information is presented geometrically and consistently across all tools.
The goal is a computing environment that stays out of your way but provides powerful capabilities when needed. AI handles the tedious filtering and categorization. Modern tools provide better UX than their Unix ancestors. Everything is designed for your future self to understand and maintain.
When you inevitably customize something new, follow the same principles: monochrome where possible, geometric symbols for status, intelligent defaults, and always provide a way to get back to baseline functionality.
---