Personal macOS development environment managed with Chezmoi and Homebrew. Shell, Git, editor, and XDG configuration also work on Linux where supported.
| Area | Configuration |
|---|---|
| Terminal | Ghostty opens the persistent tmux session main |
| Shell | Zsh, Oh My Zsh, Starship, fzf, mise, and direnv |
| Editors | Zed, VS Code, Vim, and Neovim |
| Shortcuts | Raycast Caps Lock Hyper translated by Ghostty into tmux commands |
| Packages | Homebrew bundle with personal and work profiles |
| SSH | Portable client config; keys stay local to each machine |
| macOS | Dock, Finder, keyboard, Safari, and general defaults |
git clone https://github.com/froppa/dotfiles.git ~/.local/share/chezmoi
cd ~/.local/share/chezmoi
./init.sh --macosUse WORK=true ./init.sh --macos for the work package profile. An existing
~/.gitconfig is left unchanged and any detected global identity is reused. If
the file does not exist, bootstrap prompts for a missing Git name or email
before creating the default config. Put machine-specific overrides or signing
settings in ~/.gitconfig.local. On new machines, the root config includes
repository defaults from the managed ~/.config/git/dotfiles.gitconfig. Omit
--macos to apply the dotfiles without changing macOS defaults.
SSH keys are never managed by this repository. Generate a new key on each machine when needed:
./scripts/ssh-keygen.shSSH behavior is config-driven: AddKeysToAgent and macOS Keychain integration
load the key on first use. Shell startup does not call ssh-add.
| Component | Once per machine |
|---|---|
| Raycast | Configure Caps Lock as Hyper (Control+Option+Command, no Shift) |
| Raycast scripts | Add ~/.config/raycast/scripts/ as a Script Command directory |
| Neovim | Open once to finish Lazy, Mason, and tree-sitter setup |
Raycast exports are intentionally not managed because they can contain private local data and did not reliably restore settings. To add a Ghostty launcher, open Raycast's Applications extension, add a Command for Ghostty, and assign the hotkey there. tmux plugins install through TPM; Continuum and Resurrect handle session restoration.
Raycast owns Caps Lock and emits Ctrl+Option+Command. Ghostty converts the
following chords to tmux commands. Right Option remains available for Danish
symbols.
| Shortcut | Action |
|---|---|
Command+K |
Clear the active application screen through tmux |
Shift+Enter |
Insert a newline in Claude Code and shell prompts |
Caps+C |
New window |
Caps+I |
Side-by-side pane |
Caps+- |
Stacked pane |
Caps+Arrow |
Move between panes |
Caps+0…9 |
Select window |
Caps+Z |
Toggle pane zoom |
Caps+R |
Reload tmux |
Caps+X / Caps+W |
Kill pane after confirmation |
chezmoi diff # inspect changes
chezmoi apply -v # apply source state
chezmoi update -v # pull and apply
chezmoi edit --apply ~/.zshrc # edit through Chezmoi
chezmoi re-add ~/.zshrc # capture a target change
chezmoi cd # open the source repositoryMachine-specific overrides use unmanaged *.local files such as
.zshrc.local, .exports.local, .aliases.local, .functions.local, and
.gitconfig.local.
| Path | Purpose |
|---|---|
home/dot_config/ghostty/ |
Ghostty and Hyper mappings |
home/dot_config/tmux/ |
tmux, status scripts, and plugins |
home/dot_config/raycast/ |
Raycast Script Commands |
home/dot_config/zed/ |
Zed settings and keybindings |
home/dot_config/Code/User/ |
VS Code XDG settings |
home/dot_config/nvim/ |
Neovim configuration |
home/.chezmoidata/ |
Packages, profiles, and VS Code extensions |
home/.chezmoiscripts/ |
Ordered and change-triggered setup |
home/.chezmoiexternal.toml |
Pinned shell and TPM sources |
macos-scripts/ |
Auditable macOS defaults |
scripts/ |
Local SSH key generation and preference helpers |
macos-scripts/macos-defaults.sh --audit # show differences
macos-scripts/macos-defaults.sh # apply defaults
macos-scripts/macos-defaults.sh --update # apply and update macOS./test.shThe same ShellCheck, template, profile, and Chezmoi dry-run checks run in CI. Neovim reference: docs/nvim-cheat-sheet.md.