GitPedia

Dotfiles

Dotfiles for my macos setup

From joelazarยทUpdated June 28, 2026ยทView on GitHubยท

**dotfiles** is a Dotfiles for my macos setup The project is written primarily in Shell, distributed under the MIT License license, first published in 2018. Key topics include: atuin, chezmoi, config, configuration, dotfiles.

joelazar's dotfiles ๐Ÿš€

Screenshots ๐Ÿ–ผ๏ธ

Wallpaper + Raycast ๐Ÿ–Œ๏ธ

joedotfiles - wallpaper+raycast

Neovim with my custom config ๐Ÿ“

joedotfiles - neovim

Eza + fzf ๐Ÿ“‚๐Ÿ”

joedotfiles - eza+fzf

Lazygit ๐Ÿฆฅ๐ŸŒฑ

joedotfiles - lazygit

Zen browser ๐Ÿง˜โ€โ™€๏ธ

joedotfiles - zen

Zed ๐Ÿ“

joedotfiles - zed


Overview ๐Ÿงฐ

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:


What lives here ๐Ÿ“

PathWhat 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/Local skill library in skills/, tracked alongside the global skill lock file dot_agents/dot_skill-lock.json
dot_claude/Claude Code configuration
dot_claude-work/Separate Claude Code profile for work
dot_codex/Codex configuration templates
dot_ipython/IPython profile config
private_dot_local/bin/Personal utility scripts
scripts/Shared helper scripts used by install/setup flows, including pi-packages-update and pi-extensions-sync
Brewfile.private, Brewfile.work, Brewfile.workstationPackage sets by machine type

Highlights โœจ

Shell and terminal ๐Ÿš

My day-to-day shell is Fish, with config in dot_config/private_fish/.

That setup includes:

The terminal is Ghostty, configured in dot_config/ghostty/config. It uses Catppuccin Mocha, Maple Mono NF, split navigation shortcuts, a huge scrollback buffer, and a top-mounted quick terminal.

Editors โœ๏ธ

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.

Search, navigation, and file management ๐Ÿ”Ž

A lot of this setup is about moving around quickly:

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 and GitHub workflow ๐ŸŒฟ

Git tooling is a big part of this repo:

The Lazygit setup includes custom PR commands, conventional commit helpers, GitHub shortcuts, Catppuccin Mocha styling, and delta-powered diff views.

macOS workflow ๐ŸŽ

This repo also handles the machine itself, not just terminal tools.

AeroSpace is set up with workspace assignments, vim-style focus movement, resize modes, and app launch shortcuts for tools I use constantly.


AI and coding-agent setup ๐Ÿค–

A lot of this repo is devoted to AI-assisted development. That part has grown quite a bit.

Agent clients and configs ๐Ÿ› ๏ธ

This repo currently tracks config for:

There is also a small helper script, ai-update, that updates the main CLI agents and Pi extensions.

Pi agent ๐Ÿฅง

Pi is where most of the custom work happens.

The config in dot_pi/agent/ includes:

Models cycle forward with ctrl+space via dot_pi/agent/keybindings.json. The enabled set lives in enabledModels in the managed settings.

Local Pi extensions ๐Ÿงฉ

There are 12 local Pi extensions in dot_pi/agent/extensions/. The ones I rely on most are:

  • lazygit integration
  • sandbox and the guardrails.json config for policy and permission control
  • answer, context, and split-fork for session and context handling
  • commit and pr-create for git and GitHub workflows
  • copy-command, cwd-history, and export-md for everyday shortcuts
  • project-trust and anthropic-extra for provider and trust setup
  • private_rtk.ts, which rewrites bash commands through rtk to save tokens

Local skills ๐ŸŽฏ

The skill library under dot_agents/ uses the skills CLI's global lock file, tracked as dot_agents/dot_skill-lock.json and applied to ~/.agents/.skill-lock.json.

Local skills live under dot_agents/skills/ and include exe-dev, github, listen-later, mermaid, presenterm, reddit, session-analyzer, simplify, uv, and web-search, plus symlinked kagi-cli and save-to-spotify. Remote skills are tracked in the lock file and updated with skills update -g.

The skills-invocation script re-applies the local invocation policy after skills update re-clones github-sourced skills.


Package management ๐Ÿ“ฆ

Package installation is split by machine type:

On first apply, run_once_install_packages.sh.tmpl takes care of the rest. That script installs the Homebrew bundle, UV tools, GitHub CLI plugins, Yazi plugins, and Magic from Modular.

Some notable pieces from the current setup:

  • Node globals managed by mise through dot_default-npm-packages: Pi, gondolin, ccusage, defuddle, npm-check, obsidian-headless, and skills
  • UV tools installed with extra dependencies: ansible-core (with ansible and netaddr) and pgcli (with Catppuccin styling and psycopg[binary])
  • GitHub CLI plugins gh-dash and gh-repo-man
  • Casks vary by machine type, for example Karabiner-Elements, plus Helium browser and Inkscape on the work profile

Setup โšก

Fresh machine ๐Ÿ†•

If Homebrew and chezmoi are not installed yet, start with:

sh
curl -sSL https://raw.githubusercontent.com/joelazar/dotfiles/main/bootstrap.sh | bash

Or clone locally and run:

sh
git clone https://github.com/joelazar/dotfiles.git cd dotfiles ./bootstrap.sh

Existing chezmoi setup ๐Ÿ”ง

If you already have Homebrew and chezmoi:

sh
brew install chezmoi chezmoi init https://github.com/joelazar/dotfiles.git chezmoi apply

First-time prompts ๐Ÿ’ฌ

During initialization, chezmoi asks for:

  • git email
  • git username
  • machine type: work, private, or workstation

Those values come from .chezmoi.toml.tmpl.

Important note โš ๏ธ

This repo is the chezmoi source directory, not the live destination.

If you edit files here, you need to run:

sh
chezmoi apply

Without that step, your real dotfiles under $HOME will not change.


Day-to-day maintenance ๐Ÿ”

A few commands I use a lot:

sh
chezmoi apply # push source changes into the live home directory chezmoi diff # preview what will change

Custom scripts ๐Ÿง‘โ€๐Ÿ’ป

Most of the personal helpers live in private_dot_local/bin/.

ScriptWhat it does
agent-mdCreates or fixes AGENTS.md / CLAUDE.md files for coding-agent projects
ai-updateUpdates Claude Code, Codex, Pi, and Pi local packages
backupEncrypted backups with restic and age
chatterboxLocal text-to-speech via the Chatterbox TTS model
chtQuick cheat-sheet lookup via cht.sh
claude-privateLaunches the Claude desktop app with the default profile
claude-workLaunches the Claude desktop app with a separate work data dir
code-snippet.applescriptRaycast script that wraps selected text in a code block
custom-updateRuns broader system and tool updates
discord-summarySummarizes the last 24h of selected Discord channels via kagi
fonttestChecks terminal font rendering
formatterFormats USB drives and SD cards with a gum UI
git-repo-managerFinds git repos recursively and offers interactive actions
git-resetResets repos back to their default branch state
git-worktree-newCreates sibling worktrees for the current repo
init-windowsOpens my usual app set for a work session
kokoroLocal text-to-speech via the Kokoro ONNX model
listen-laterTurns an article, file, or text into a Kokoro-narrated Spotify episode
obsidian-updateTriggers Obsidian plugin and theme updates across vaults
piRuns the Pi agent CLI through the mise-managed Node 24 runtime
pr-createCreates pull requests with a guided interactive prompt
skills-invocationRe-applies the skill invocation policy after skills update
switch-main-displayChanges the primary display on multi-monitor setups
transcribeOffline audio/video transcription via whisper.cpp
transferUploads files through transfer.sh
untilfailRepeats a command until it fails
update-submodulesUpdates git submodules
wtfportShows 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.


Theming ๐ŸŽจ

Catppuccin Mocha is the common thread through most of the environment: Ghostty, Tmux, Fish, Yazi, Television, Lazygit, Bat, Btop, Starship, Atuin, Eza, Delta, Fzf, Gh-Dash, K9s, and Zed 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.


Acknowledgements ๐Ÿ™

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:

AuthorGitHubContributions
Mario Zechner@badlogicPi itself, plus extensions and skills adapted from the Pi ecosystem, such as sandbox
Armin Ronacher@mitsuhikoExtensions and skills adapted from agent-stuff, including answer, context, and split-fork
Aliou Diallo@alioupi-guardrails and pi-processes packages
Fero@ferologicssession-analyzer skill from the Pi skills ecosystem

License ๐Ÿ“„

This repository is available under the MIT license.

Contributors

Showing top 1 contributor by commit count.

View all contributors on GitHub โ†’

This article is auto-generated from joelazar/dotfiles via the GitHub API.Last fetched: 6/29/2026