# Dotfiles

> Learn what dotfiles are (and how mine work).

Source: https://curiouslychase.com/engineering/dotfiles/

A **dotfile** is a configuration file that allows a user to customize the way their computer and applications on their computer are setup.
**Dotfiles** is a term for a collection of configuration files, usually stored in version control (somewhere like GitHub, GitLab or BitBucket) so that the user can port their current configuration between computers.

# How My Dotfiles Work

My dotfiles are managed through a Makefile-based system with symlinks. I previously used [Literate Programming](https://curiouslychase.com/engineering/literate-programming/) for this, but switched to directly editing config files—for dotfiles, it's easier to update the files themselves rather than maintaining separate documentation that generates them.

## Repository Structure

Located at `~/src/github.com/curiouslychase/dotfiles`, organized by tool:
- **nvim/**: Neovim config with Lua plugins (lazy.nvim)
- **zsh/**: Zsh config with antidote plugin manager
- **vscode/**: VS Code/Cursor settings, keybindings, projects
- **tmux/**: Tmux configuration
- **ghostty/**: Ghostty terminal config
- **kitty/**: Kitty terminal config
- **scripts/**: Utility scripts (e.g., claude-mv for project contexts)
- **ssh/**: SSH config files
- **Brewfile**: Homebrew dependencies

## Setup Process

1. Clone repo: `git clone https://github.com/curiouslychase/dotfiles.git ~/src/github.com/curiouslychase/dotfiles`
2. Run `make init` to create symlinks from repo to system locations
3. Run `brew bundle` to install dependencies from Brewfile
4. Symlinks managed automatically (e.g., `~/.zshrc` → `dotfiles/zsh/zshrc.zsh`)

The Makefile handles all symlinking for both VS Code and Cursor configs, ensuring consistency across editors.

### Setup Lifecycle

```mermaid
flowchart TD
    A[New Machine] --> B[Install Homebrew]
    B --> C[Clone dotfiles repo]
    C --> D[cd ~/src/github.com/curiouslychase/dotfiles]
    D --> E[make init]
    E --> F[Create symlinks]
    F --> G{Symlinks created?}
    G -->|Yes| H[brew bundle]
    G -->|No| I[Fix permissions/paths]
    I --> E
    H --> J[Install all dependencies]
    J --> K[Configure Zsh]
    K --> L[antidote plugin install]
    L --> M[Configure Neovim]
    M --> N[lazy.nvim plugin sync]
    N --> O[Configure VS Code/Cursor]
    O --> P[Setup SSH config]
    P --> Q[Ready to use]

    style A fill:#f9f,stroke:#333
    style Q fill:#9f9,stroke:#333
    style E fill:#bbf,stroke:#333
    style H fill:#bbf,stroke:#333
```

## Key Tools

- **Zsh**: Shell with antidote plugin manager
- **Neovim**: Primary editor with Lua-based config
- **Ghostty/Kitty**: Terminal emulators
- **tmux**: Terminal multiplexer
- **Homebrew**: Package management via Brewfile

# Why Dotfiles?

One of my favorite things about programming is the *power* you have to make things work the way you want them to.
For me, configuring through dotfiles gives me so much power.
