Chase Adams

Dotfiles

Learn what dotfiles are (and how mine work).

2 minute read

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 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., ~/.zshrcdotfiles/zsh/zshrc.zsh)

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

Setup Lifecycle

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.