This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
This is a chezmoi dotfiles repository that manages configuration files across multiple environments (work and home machines). The repository uses Go templating for environment-specific configurations and supports automated theme switching across all applications.
dot_prefix: Files/directories that become.filenamein the home directoryexecutable_prefix: Files that should be executable after deploymentsymlink_prefix: Files that should be symlinked rather than copiedprivate_prefix: Files with restricted permissions.tmplsuffix: Template files using Go templating with chezmoi variables
chezmoi apply # Apply changes to home directory
chezmoi diff # Show pending changes before applying
chezmoi edit <file> # Edit files in chezmoi source directory
chezmoi cd # Navigate to chezmoi source directory (/Users/grunewaldtsv/.local/share/chezmoi)
chezmoi update # Pull and apply changes from remote repositorytm <session> # tmux session manager (attach or create)
toggle-theme.sh [theme] # System-wide theme switching with automation
install-dark-mode-notify.sh # Setup automated theme switching via LaunchAgent
install-sbarlua.sh # Install SbarLua for SketchyBar configuration
secretive-ssh-keygen [args] # SSH key generation using Secretive app
restart-gpg-agent.fish # GPG agent management for multi-user conflictsfirefox-new-window # Open new Firefox Developer Edition window
ghostty-new-window # Open new Ghostty terminal window (AppleScript)
kitty-new-window # Open new Kitty terminal window with single-instance mode
reload-sketchybar # Reload SketchyBar configuration for developmentbrew info <package> # Get detailed information about a package (description, dependencies, installation status)
brew search <term> # Search for packages by name or description
brew bundle cleanup --file Brewfile # Show packages installed but missing from this repository's Brewfilebrew autoupdate start [interval] [options] # Start automatic Homebrew updates via launchd
brew autoupdate stop # Stop autoupdating but retain logs
brew autoupdate status # Check current autoupdate status
brew autoupdate logs # View autoupdate logs- Work machine:
CO-MBP-KC9KQV64V3- Different Git signing, package sets, restricted configurations - Home machine:
yobuko- Full package access, personal configurations - Templates use
{{ .chezmoi.hostname }}for conditional logic
The repository prompts for sensitive configuration during initial setup:
- Email address (Git configuration)
- Atuin sync server URL
- Claude Code Vertex AI settings (base URL, project ID, location)
Sophisticated automated theme switching with cross-application coordination:
- Supported themes: tokyonight (day/storm/night)
- Applications: bat, fish, kitty, sketchybar, git-delta, aichat, neovim, wezterm
- Implementation: Symlinks managed by toggle-theme.sh with validation and logging
- Automation: LaunchAgent integration with dark-mode-notify binary for system detection
- State management: Theme persistence in
~/.cache/system-theme.txt - Logging: Comprehensive logging with rotation in
~/toggle-theme.log
- Runtime management: mise configuration in
dot_config/mise/config.toml.tmpl - Shell: Fish with custom functions and theme integration
- Terminal: Multiple terminal configurations (kitty, wezterm, ghostty)
- Git: Environment-specific signing keys and configurations
- SketchyBar: Complete SbarLua configuration with modular architecture (
init.lua,bar.lua,default.lua, items/*). Includes window manager integration (Rift), custom items (battery, network, clock, volume, meal planning), and theme coordination. Coding agents can use the deepwiki mcp to retrieve information about SketchyBar and SbarLua. - Window Manager: Rift - BSP tiling window manager with Mach IPC. Configuration in
dot_config/rift/config.toml. Uses CLI subscriptions to trigger SketchyBar updates on workspace/window changes. - Package management: Comprehensive Brewfile (260+ work packages, 290+ home packages) with custom taps, MAS automation, and environment-specific tool sets
- Karabiner: Custom keyboard modifications in
private_karabiner/ - LaunchAgent automation: Automated theme switching and system integration services
The Brewfile uses hostname-based conditional logic to manage different package sets across environments:
hostname = `hostname -s`.strip
is_work = (hostname == "CO-MBP-KC9KQV64V3")
is_home = (hostname == "yobuko")- Custom taps: Specialized repositories for tools not in homebrew-core
domt4/autoupdate: Automatic Homebrew updates via launchd background service
- Fonts: Nerd fonts and typography packages for terminal/editor use
- Linters/formatters/LSPs: Development tools for code quality and IDE integration
- Terminal entertainment: Fun terminal applications (asciiquarium, cbonsai, lolcat, pipes-sh)
- Various tools: General CLI utilities (should be split into more specific categories)
- Neovim-related: Editor-specific dependencies
- Git tools: Enhanced Git workflow utilities
- Container tools: Docker/container management utilities
- Keyboard tools: QMK/hardware development dependencies
- Work machine (
is_work): Enterprise tools (Azure CLI, Heroku, Terraform utilities, browser testing) - Home machine (
is_home): Personal tools (gaming, 3D printing, home automation, creative software)
Uses mas command for App Store applications with specific app IDs, also environment-conditional.
- Use
brew searchto find package names - Use
brew infoto understand package purpose and dependencies - Place in appropriate category or create new category if needed
- Consider if package should be universal, work-only, or home-only
- For custom taps, add tap declaration before the package
- Update package counts in documentation when adding significant numbers
- GPG configuration: Agent settings with multi-user conflict resolution and smart card support
- SSH: Separate configurations for different services with Secretive app integration (home machine)
- Authentication: SSH agent socket management for tmux/screen sessions
- Private files: Use
private_prefix for sensitive configurations (Karabiner, SSH keys)
When editing .tmpl files, common patterns include:
{{ if eq .chezmoi.hostname "CO-MBP-KC9KQV64V3" }}- Work-specific configuration{{ .email }}- User-provided email address{{ .atuin_sync_server }}- Atuin sync server URL{{ .vertex_ai.base_url }}- Claude Code Vertex AI configuration{{ env "HOME" }}- Environment variable access{{- if eq .chezmoi.hostname "work" }}- Conditional blocks with whitespace control
Always test template changes with chezmoi diff before applying to avoid syntax errors in generated configurations.
install-dark-mode-notify.sh # Install automated theme switching
launchctl load ~/Library/LaunchAgents/com.user.darkmode.plist- Environment bootstrapping: Use
chezmoi initwith template variable prompts - Theme automation: LaunchAgent responds to system dark mode changes automatically
- GPG agent conflicts: Use
restart-gpg-agent.fishwhen multiple users conflict - SSH key management: Use
secretive-ssh-keygenfor Secretive app integration
Coding agents can use the DeepWiki MCP server to retrieve documentation for the following third-party projects used in this repository:
| Software | GitHub Repo | DeepWiki | Config Location | Purpose |
|---|---|---|---|---|
| SketchyBar | FelixKratz/SketchyBar | deepwiki.com/FelixKratz/SketchyBar | dot_config/sketchybar/ |
Custom macOS status bar |
| SbarLua | FelixKratz/SbarLua | deepwiki.com/FelixKratz/SbarLua | dot_config/sketchybar/ |
Lua API for SketchyBar |
| Rift | acsandmann/rift | deepwiki.com/acsandmann/rift | dot_config/rift/config.toml |
BSP tiling window manager |
Usage: mcp__deepwiki__ask_question with repoName set to the GitHub repo (e.g., "acsandmann/rift") and a relevant question.
- Use conventional commit message format for all commits
- Common scopes based on repository files:
Brewfile: Package management updatesfish: Fish shell configurationskitty,alacritty,wezterm,ghostty: Terminal emulator configssketchybar: Status bar configurationmise: Runtime version managementgit,gitconfig: Git configurationclaude: Claude Code settingskarabiner: Keyboard customizationterminal: Cross-terminal featuresatuin: Command history settingschezmoi: Dotfiles managementbin: Custom scripts in ~/.bin/raycast: Raycast launcher scripts
- Type usage patterns:
feat: New features or additions (most common)fix: Bug fixes or correctionschore: Maintenance, updates without functional changesrefactor: Code restructuring without behavior changesdocs: Documentation updatesstyle: Formatting, cosmetic changesperf: Performance improvementstest: Testing-related changesci: CI/CD configurations
- Format:
<type>(<scope>): <description>- Scope is optional for general changes (e.g.,
chore: add CLAUDE.md) - Use present tense, imperative mood
- Keep descriptions concise and specific
- Scope is optional for general changes (e.g.,