joelazar's dotfiles π
Neovim with my custom config π
Lazygit π¦₯π±
Zen browser π§ββοΈ
Zed π
This repo is the source of truth for my macOS setup.
I use chezmoi to manage shell config, editor settings, package installs, macOS defaults, AI tooling, and a pile of small workflow tweaks that are easy to forget until you lose them. The point is simple: I should be able to set up a new machine, run chezmoi apply, and get back to work without rebuilding my environment from memory.
A few quick facts:
- Platform: macOS
- Dotfile manager: chezmoi
- Profiles:
private,work, andworkstation - Bootstrap path:
bootstrap.sh - First-run automation:
run_once_install_packages.sh.tmplandrun_once_settings.sh.tmpl - Theme: Tokyo Night across most of the stack
- Fonts: Maple Mono / Maple Mono NF
| Path | What it contains |
|---|---|
dot_config/ |
App and CLI configuration for tools like Fish, Ghostty, Zed, Yazi, Television, Starship, Mise, Lazygit, pgcli, Wireshark, and more |
dot_pi/ |
Pi agent configuration, prompts, themes, modes, and local extensions |
dot_agents/skills/ |
Local skill library for coding agents |
dot_claude/ |
Claude Code configuration |
dot_claude-work/ |
Separate Claude Code profile for work |
dot_gemini/ |
Gemini CLI settings |
dot_codex/ |
Codex configuration templates |
private_dot_local/bin/ |
Personal utility scripts |
scripts/ |
Shared helper scripts used by install/setup flows |
Brewfile.private, Brewfile.work, Brewfile.workstation |
Package sets by machine type |
My day-to-day shell is Fish, with config in dot_config/private_fish/.
That setup includes:
- vi-style key bindings
- Starship prompt with
mise,sudo, and Yazi indicators viadot_config/starship.toml - Atuin for history
- Zoxide for smarter directory jumping
- Mise for runtime management via
dot_config/mise/config.toml - Television shell integration so
Ctrl+Topens context-aware pickers instead of a generic file list
The terminal is Ghostty, configured in dot_config/ghostty/config. It uses Tokyo Night, Maple Mono NF, split navigation shortcuts, a huge scrollback buffer, and a top-mounted quick terminal.
I mostly use Zed and Neovim.
Zed is configured in dot_config/zed/ with:
- Vim mode and which-key hints
- custom pane and tab navigation
- tuned git panel and inline blame
- Television-powered file and text search tasks
- Yazi and Lazygit tasks wired into the editor
- AI assistant defaults for day-to-day coding work
Neovim lives in a separate repo: joelazar/nvim-config. This repo bootstraps it during first-run setup.
A lot of this setup is about moving around quickly:
- Yazi for file management via
dot_config/yazi/ - fzf, fd, and ripgrep for fast terminal navigation
- Eza for directory listings via
dot_config/eza/ - Television with 97 channels in
dot_config/television/cable/
Those Television channels cover far more than files. There are pickers for git branches, worktrees, diffs, repositories, Docker and Kubernetes resources, AWS resources, ports, launchd services, recent files, markdown search, and more.
Git tooling is a big part of this repo:
- Lazygit config in
private_Library/private_Application Support/lazygit/config.yml - gh-dash config in
dot_config/gh-dash/config.yml - gh-repo-man config in
dot_config/gh-repo-man/config.yml delta+diffnavfor readable diffs- custom scripts for repo cleanup, worktree creation, and recursive repo management
The Lazygit setup includes custom PR commands, conventional commit helpers, GitHub shortcuts, Tokyo Night styling, and delta-powered diff views.
This repo also handles the machine itself, not just terminal tools.
- AeroSpace tiling window manager config in
dot_aerospace.toml - macOS defaults and shell/editor bootstrapping in
run_once_settings.sh.tmpl - launch agents in
private_Library/LaunchAgents/ - app defaults, file associations, Dock behavior, keyboard repeat, Touch ID for
sudo, and similar setup tasks
AeroSpace is set up with workspace assignments, vim-style focus movement, resize modes, and app launch shortcuts for tools I use constantly.
A lot of this repo is devoted to AI-assisted development. That part has grown quite a bit.
This repo currently tracks config for:
- Claude Code in
dot_claude/ - a separate Claude work profile in
dot_claude-work/ - Pi in
dot_pi/ - Gemini CLI in
dot_gemini/ - Codex templates in
dot_codex/ - Ollama for local models
There is also a small helper script, ai-update, that updates the main CLI agents I use.
Pi is where most of the custom work happens.
The config in dot_pi/agent/ includes:
- Tokyo Night theme and custom modes in
dot_pi/agent/modes.json - local model definitions in
dot_pi/agent/models.json - path blocking for secrets and sensitive files in
dot_pi/agent/path-policy.json - prompt templates in
dot_pi/agent/prompts/ - a managed settings modifier in
dot_pi/agent/modify_private_settings.json
Current Pi modes are built around a few practical defaults rather than a giant matrix:
default: Claude Opus 4.7fast-claude: Claude Sonnet 4.6fast-gpt: GPT-5.3 Codexfastest: GPT-5.4 minideep: GPT-5.4
There are 25 local Pi extensions in dot_pi/agent/extensions/. The ones I rely on most are:
pi-ffffor fuzzy file finding and indexed code searchmulti-editfor batch edits and patch-style editsdefault-toolsto enablegrepandfindby defaultprompt-editorfor editing and storing prompt/model combinationscopy-commandfor pulling runnable commands out of responseslazygitandghosttyintegrationspath-policy,permission-gate, andsandboxfor guardrailstodos,loop,session-breakdown, andauto-session-namefor session managementuvto steer Python workflows towarduv
The agent skill library under dot_agents/skills/ currently includes 43 skills.
That set covers a few different categories:
- Design and frontend work:
frontend-design,impeccable,adapt,animate,polish,typeset,layout,colorize, and related design skills - Workflow and coding support:
github,humanizer,session-analyzer,summarize,tmux,uv,web-browser,youtube-transcript - Research and external systems:
perplexity-search,pdf,linear-cli,mermaid,pi-share - Google Workspace helpers: calendar, docs, drive, gmail, and sheets skills
Package installation is split by machine type:
On first apply, run_once_install_packages.sh.tmpl takes care of the rest. That script installs Homebrew packages, Bun globals, Go tools, UV tools, GitHub CLI plugins, Yazi plugins, and a few extra utilities.
Some notable pieces from the current setup:
- Bun packages for Pi, Codex usage tooling, Defuddle, Obsidian automation, and Google Workspace CLI access
- UV-managed tools such as
gitingest,pylatexenc, andnginx-language-server - GitHub CLI plugins like
gh-dash,gh-repo-man, andgh-markdown-preview
If Homebrew and chezmoi are not installed yet, start with:
curl -sSL https://raw.githubusercontent.com/joelazar/dotfiles/main/bootstrap.sh | bashOr clone locally and run:
git clone https://github.com/joelazar/dotfiles.git
cd dotfiles
./bootstrap.shIf you already have Homebrew and chezmoi:
brew install chezmoi
chezmoi init https://github.com/joelazar/dotfiles.git
chezmoi applyDuring initialization, chezmoi asks for:
- git email
- git username
- machine type:
work,private, orworkstation
Those values come from .chezmoi.toml.tmpl.
This repo is the chezmoi source directory, not the live destination.
If you edit files here, you need to run:
chezmoi applyWithout that step, your real dotfiles under $HOME will not change.
A few commands I use a lot:
chezmoi apply # push source changes into the live home directory
chezmoi diff # preview what will changeThere is also a local Pi extension in .pi/extensions/chezmoi-auto-apply/ that automatically runs chezmoi apply after agent-driven edits in this repo.
Most of the personal helpers live in private_dot_local/bin/.
| Script | What it does |
|---|---|
agent-md |
Creates or fixes AGENTS.md / CLAUDE.md files for coding-agent projects |
ai-update |
Updates Claude Code, Gemini CLI, Codex, Pi, and Pi extensions |
backup |
Encrypted backups with restic and age |
cht |
Quick cheat-sheet lookup via cht.sh |
custom-update |
Runs broader system and tool updates |
fonttest |
Checks terminal font rendering |
formatter |
Formats USB drives and SD cards with a gum UI |
git-repo-manager |
Finds git repos recursively and offers interactive actions |
git-reset |
Resets repos back to their default branch state |
git-worktree-new |
Creates sibling worktrees for the current repo |
init-windows |
Opens my usual app set for a work session |
obsidian-update |
Triggers Obsidian plugin and theme updates across vaults |
switch-main-display |
Changes the primary display on multi-monitor setups |
transfer |
Uploads files through transfer.sh |
untilfail |
Repeats a command until it fails |
update-submodules |
Updates git submodules |
wtfport |
Shows what is listening on a port and can kill it |
Shared shell helpers used by the setup scripts live in scripts/utils and scripts/utils_install.
Tokyo Night is the common thread through most of the environment: Ghostty, Zed, Lazygit, Television, Eza, Bat, and Pi all use it in one form or another.
Fonts are centered on Maple Mono and Maple Mono NF, including OpenType alternates like cv02, cv05, cv61, and cv63.
Some helper functions and setup patterns were originally adapted from alrra/dotfiles.
Parts of the Pi setup are also adapted from or inspired by work from:
| Author | GitHub | Contributions |
|---|---|---|
| Mario Zechner | @badlogic | Pi itself, plus extensions and skills adapted from the Pi ecosystem, including antigravity-image-gen, editor-with-context, notify, permission-gate, sandbox, session-name, and youtube-transcript-related work |
| Armin Ronacher | @mitsuhiko | Extensions and skills adapted from agent-stuff, including answer, context, loop, prompt-editor, session-breakdown, todos, whimsical, frontend-design, github, humanizer, summarize, uv, and web-browser |
| Daniel Griesser | @HazAT | ghostty extension from pi-ghostty |
| Fero | @ferologics | session-analyzer skill from the Pi skills ecosystem |
This repository is available under the MIT license.





