This site is driven by two keys, like the machine it came from. Reading: j and k scroll, d and u move half a page, gg goes to the top, G to the bottom, H and L switch windows, ? opens the help. Space is the Neovim leader and handles content: Space then h home, r research, p projects, g gear, a about, / tags, or Space then a digit to jump to that window. Home is the tmux prefix and handles windows: Home then c opens a terminal, Home then & closes a window, Home then space goes to the next one. While focus is on the keyboard, h j k l move between keys and Enter opens one.

ResearchR AboutA Gear — G for gear — keyboard, terminal, editor, homelab.G
    ProjectsP Tags — / as in vim: search./
    ×
    Menu

    Dotfiles: Workstation Bootstrap with GNU Stow

    Terminal, editor, and macOS window-manager config managed via GNU Stow + Homebrew Bundle — clone, run one script, machine ready.

    A single repository that pins every piece of my macOS workstation config: terminal, editor, window manager, Homebrew packages, and system preferences. Bootstrapping a fresh machine to a ready-to-work environment takes one curl | bash.

    Philosophy

    Each tool gets one directory in the repo. GNU Stow symlinks that directory into the actual config location under $HOME or ~/.config. The practical consequences:

    • Single source of truth. Edit config in the repo, the change is live on the system instantly.
    • No copy-paste. No “copy this file to ~/.config/...” step that’s easy to forget on updates.
    • Reversible. stow -D unlinks cleanly without leaving residue.

    Repo Layout

    dotfiles/
    ├── aerospace/        # tiling window manager for macOS
    ├── alacritty/        # GPU terminal (pre-Ghostty)
    ├── ghostty/          # active terminal
    ├── nvim/             # Neovim — primary IDE
    ├── vim/              # Vim fallback
    ├── tmux/             # terminal multiplexer
    ├── zsh/              # shell + prompt
    ├── sketchybar/       # macOS status bar
    ├── borders/          # macOS window borders
    ├── git/              # gitconfig + global gitignore
    ├── ssh/              # ssh client config
    ├── mise/             # version manager (Node/Go/Python)
    ├── nix/              # nix-darwin config
    ├── joshuto/          # TUI file manager
    ├── yazi/             # alternate TUI file manager
    ├── fonts/            # locally installed fonts
    ├── Brewfile          # 39 brew formulas + 11 casks
    ├── __scripts__/      # plugin installers (zsh, version manager)
    ├── __macos__/        # macOS system defaults scripts
    └── install.sh        # bootstrap entrypoint

    Bootstrap

    One command from a fresh machine:

    bash -c "$(curl -fsSL https://raw.githubusercontent.com/arisros/dotfiles/main/install.sh)"

    The script in order:

    1. Creates target directories under ~/.config/...
    2. Runs stow -t <target> <package> for each tool — symlinks materialize
    3. Runs brew bundle --file=Brewfile (optional, commented by default) to install ~50 packages
    4. Calls __scripts__/install_zsh_plugins.sh for shell plugins
    5. Executes __macos__/defaults.sh for macOS system preferences

    Tooling

    LayerToolNotes
    WMAerospacei3-style tiling for macOS
    Status barSketchyBarreplaces the default macOS menubar
    Window borderJankyBordersfocus indicator for tiling
    TerminalGhosttyGPU-accelerated, default since 2025
    Multiplexertmuxsession persistence + split panes
    ShellZshprompt + plugins via __scripts__/install_zsh_plugins.sh
    EditorNeovimLua config, see nvim/.config/nvim/
    File managerYazi / JoshutoTUI, keyboard-fast navigation
    Version managermisereplaces asdf/nvm/pyenv
    Package managerHomebrewBrewfile pins 56 packages

    Brewfile

    Brewfile is the package manifest — tracked in git so installs are reproducible:

    tap "felixkratz/formulae"     # for sketchybar
    tap "nikitabobko/tap"          # for aerospace
    tap "leoafarias/fvm"
    tap "kardolus/chatgpt-cli"
    
    brew "[email protected]"
    brew "ffmpeg"
    brew "neovim"
    brew "tmux"
    ...
    
    cask "ghostty"
    cask "raycast"
    cask "rectangle-pro"
    ...

    brew bundle dump regenerates this file from currently-installed packages — so the machine state can always be snapshotted back into the repo.

    Update Workflow

    Updating config:

    # Edit directly in the repo (symlinks make changes immediately live)
    nvim ~/dotfiles/nvim/.config/nvim/lua/plugins/lsp.lua
    
    # Commit + push
    cd ~/dotfiles && git add . && git commit -m "nvim: ..." && git push

    Updating Brewfile:

    brew bundle dump --force --file=~/dotfiles/Brewfile
    cd ~/dotfiles && git add Brewfile && git commit -m "brew: snapshot" && git push

    Status

    Active repo — used daily, updated whenever new tools land. Goal: from fresh Mac to “ready to work” in <10 minutes, without touching keys one by one.

    id en
    rss gh in