AgentToolHub
Skill

frontend-design

frontend-design — a Claude Code skill from connorads/dotfiles

Features

  • ✓Git-based dotfiles management without symlinks
  • ✓macOS and Linux compatibility with nix-darwin/home-manager
  • ✓Integrated software setup with brew and mise
  • ✓Customizable hooks for code quality checks
  • ✓Quick start with a bootstrap script for Linux/Codespaces

Installation Guide

Quick start (recommended)

If you are setting up this exact repo on Linux/Codespaces, use the bootstrap script:

sh
curl -fsSL https://raw.githubusercontent.com/connorads/dotfiles/master/install.sh | bash

It installs dotfiles and sets upstream tracking so git status/LazyGit show ahead-behind correctly.

Manual setup (from this repo)

If you want to follow the manual path (or fork this repo), use this.

  • Clone using a separate git dir
  • sh
        DOTFILES_REPO=https://github.com/connorads/dotfiles.git
        DOTFILES_DIR=$HOME/git/dotfiles
        BOOTSTRAP_WORKTREE=$(mktemp -d "$HOME/.dotfiles-bootstrap.XXXXXX")
    
        git clone --separate-git-dir="$DOTFILES_DIR" "$DOTFILES_REPO" "$BOOTSTRAP_WORKTREE"
        rm -rf "$BOOTSTRAP_WORKTREE"

    Why the temporary BOOTSTRAP_WORKTREE dir? git clone needs a checkout target path, and $HOME is non-empty. The temp dir keeps bootstrap safe and disposable.

  • Point the repo at $HOME and ensure tracking refs
  • sh
        git --git-dir="$DOTFILES_DIR" config core.bare false
        git --git-dir="$DOTFILES_DIR" config core.worktree "$HOME"
        git --git-dir="$DOTFILES_DIR" config --replace-all remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
        git --git-dir="$DOTFILES_DIR" fetch origin --prune

  • Check out dotfiles into $HOME (⚠️ this overwrites conflicting files)
  • sh
        git --git-dir="$DOTFILES_DIR" checkout 2>&1 | sed -n 's/^[[:space:]]\+//p' | while IFS= read -r file; do
          if [ -f "$file" ]; then
            mv "$file" "$file.bak"
          fi
        done
    
        git --git-dir="$DOTFILES_DIR" --work-tree="$HOME" checkout -f

  • Set upstream for the current branch
  • sh
        CURRENT_BRANCH=$(git --git-dir="$DOTFILES_DIR" symbolic-ref --quiet --short HEAD)
        git --git-dir="$DOTFILES_DIR" --work-tree="$HOME" branch --set-upstream-to="origin/$CURRENT_BRANCH" "$CURRENT_BRANCH"

  • Set up nix, brew and install software
  • macOS (nix-darwin):

    sh
        # Install Homebrew
        /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        eval "$(/opt/homebrew/bin/brew shellenv)"
    
        # Install Nix (vanilla, not Determinate Nix)
        curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --determinate false
        . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
    
        # Build and activate nix-darwin configuration
        nix run nix-darwin/master#darwin-rebuild -- switch --flake ~/.config/nix

    Linux (home-manager):

    sh
        # Install Nix (vanilla, not Determinate Nix)
        curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --determinate false
        . ~/.nix-profile/etc/profile.d/nix.sh
    
        # Build and activate home-manager configuration
        nix run home-manager/master -- switch --flake ~/.config/nix

  • Reload your shell
  • sh
        exec zsh

    Migration helper (if needed)

    If an existing machine has an older setup, run:

    sh
    DOTFILES_DIR=$HOME/git/dotfiles
    if [ "$(git --git-dir=$DOTFILES_DIR rev-parse --is-bare-repository 2>/dev/null || true)" = "true" ]; then
      git --git-dir=$DOTFILES_DIR config --unset core.bare || true
    fi
    git --git-dir=$DOTFILES_DIR config core.worktree $HOME
    CURRENT_BRANCH=$(git --git-dir=$DOTFILES_DIR/ symbolic-ref --quiet --short HEAD)
    git --git-dir=$DOTFILES_DIR/ config --replace-all remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
    git --git-dir=$DOTFILES_DIR/ fetch origin --prune
    git --git-dir=$DOTFILES_DIR/ --work-tree=$HOME branch --set-upstream-to=origin/$CURRENT_BRANCH $CURRENT_BRANCH

    Create from scratch (optional)

    This section is for anyone who wants to build their own dotfiles repo using the same git-dir + work-tree technique (not specifically this repo).

    <details>
    <summary>Show from-scratch setup</summary>

  • Create the git dir and point work-tree at $HOME
  • sh
        DOTFILES_DIR=$HOME/git/dotfiles
        mkdir -p "$DOTFILES_DIR"
        git init "$DOTFILES_DIR"
        git --git-dir="$DOTFILES_DIR" config core.worktree "$HOME"
        git --git-dir="$DOTFILES_DIR" config --replace-all remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"

  • Add a safe default ignore policy (ignore everything, then un-ignore specific files)
  • sh
        touch "$HOME/.gitignore"
        grep -qxF '/*' "$HOME/.gitignore" || printf '%s\n' '/*' >> "$HOME/.gitignore"
        grep -qxF '!.gitignore' "$HOME/.gitignore" || printf '%s\n' '!.gitignore' >> "$HOME/.gitignore"

  • Start tracking files by un-ignoring paths in ~/.gitignore, then adding them
  • sh
        git --git-dir="$DOTFILES_DIR" --work-tree="$HOME" add .gitignore
        git --git-dir="$DOTFILES_DIR" --work-tree="$HOME" commit -m "chore(dotfiles): initialise from scratch"

  • Optional: connect a remote and push
  • sh
        DOTFILES_REPO=git@github.com:your-user/dotfiles.git
        dotfiles remote add origin "$DOTFILES_REPO"
        dotfiles push -u origin HEAD

    </details>

    Setup YubiKey for sudo

    macOS sudo auth is configured in [darwin.nix](.config/nix/modules/darwin.nix):

  • Touch ID is enabled for both Macs

  • pam_reattach is enabled so Touch ID works inside tmux

  • pam_u2f remains in the sudo PAM stack for YubiKey auth
  • In practice:

  • MacBook Air uses Touch ID first, with YubiKey as fallback

  • Mac mini falls through to YubiKey unless it has a Touch ID-capable keyboard
  • The YubiKey mapping file is local per machine and is not tracked in dotfiles:

    sh
    mkdir ~/.config/Yubico
    pamu2fcfg > ~/.config/Yubico/u2f_keys

    Add a second key if you like

    sh
    pamu2fcfg -n >> ~/.config/Yubico/u2f_keys

    Reviews