Skip to content

Repository files navigation

Dotfiles

My personal macOS dotfiles, managed with GNU Stow for symlink-based config deployment.

Overview

ComponentToolConfig Location
TerminalKitty~/.config/kitty/
ShellZsh + Starship~/.config/zsh/
EditorAstroNvim (Neovim)~/.config/nvim/
Window ManagerAeroSpace~/.config/aerospace/
Status BarSketchyBar~/.config/sketchybar/
Window BordersJankyBorders~/.config/borders/
LauncherLeader Key~/.config/leader-key/
Mouse ControlMouselessGUI (v1.0.0)
Keyboard NavHomerow~/.config/homerow/
Gitdelta, lazygit~/.config/git/, ~/.config/lazygit/
Searchripgrep, fzf, zoxide~/.config/ripgrep/
Version Managermise~/.config/mise/
Password Manager1Password
Passwords (CLI)gcloud SDK~/google-cloud-sdk/

Setup

One-Shot Install (Fresh Machine)

zsh -c "$(curl -fsSL https://raw.githubusercontent.com/edygar/dotfiles/main/.local/bin/install.sh)"

This will:

  1. Clone the repo to ~/Code/personal/dotfiles
  2. Install Homebrew + all packages from Brewfile (including stow)
  3. Stow all config files into place via symlinks
  4. Set macOS system defaults
  5. Prompt for API keys and work email
  6. Set up Leader Key, Homerow, default apps, cron jobs, and wallpapers

Refresh Existing Setup

~/.local/bin/install.sh

Re-running the same script on an existing machine will:

  • Pull latest dotfiles
  • Re-stow config files (updating symlinks)
  • Refresh Homebrew packages
  • Re-apply macOS defaults
  • Skip already-configured items (API keys, cron jobs)
  • Only download wallpapers if none exist

The install script handles:

  1. Homebrew + all packages from Brewfile (including stow)
  2. Stow config files into ~/.config/, ~/.local/, ~/.hammerspoon/, etc.
  3. macOS system defaults (menu bar autohide, dock, finder, keyboard, trackpad)
  4. Unsplash API key prompt (for wallpaper rotation)
  5. Git work identity (.gitconfig.work)
  6. Leader Key config symlink (to ~/Library/Application Support/Leader Key/)
  7. Raycast extension builds (Chrome, Kitty, QR Code, Notification History)
  8. Hammerspoon GridTile patch + reload
  9. Homerow config import
  10. Default app association for code files (Neovim.app)
  11. Cron jobs (hourly wallpaper rotation)
  12. Initial wallpaper download

Manual Steps After Install

  • Restart kitty (fully quit, not just reload)
  • Run :Lazy sync in nvim
  • Grant accessibility permissions: System Settings > Privacy & Security
    • Mouseless, Homerow, AeroSpace
  • Configure Mouseless via GUI (mouseless://settings)
  • Add Raycast script commands from ~/.local/bin/raycast-*.zsh
  • Rebuild neovim: ~/.local/bin/buildnvim.sh (if using local build)
  • Install SF Pro font: brew install --cask font-sf-pro (requires sudo)

Shell

Zsh (~/.config/zsh/)

  • .zshrc: Main config — mise, starship, zsh-autosuggestions, .nvmrc auto-switching, gcloud SDK
  • env.zsh: Portable XDG paths, Zsh directory, and executable path
  • aliases.zsh: Git aliases, navigation, ls/eza with icons, zoxide, functions
  • key-bindings.zsh: Vi mode (bindkey -v), kitty window close, autosuggestions

~/.zshenv is machine-local and only sources ~/.config/zsh/env.zsh. The tracked environment then optionally sources ~/.env.zsh. Machine-local environment values, managed shell blocks, and credentials belong in ~/.env.zsh, which stays outside the repository and should use mode 600.

Key Features

  • Vi mode in shell (KEYTIMEOUT=1)
  • .nvmrc auto-switching via mise
  • Google Cloud SDK in PATH
  • SauceCodePro Nerd Font throughout

OpenCode

OpenCode configuration is tracked under ~/.config/opencode/, but installed skills are machine-local. They live in ~/.local/share/opencode/skills, with ~/.config/opencode/skills pointing there. Stow ignores the skills path so private or work-specific skills never enter this repository.

Terminal

Kitty (~/.config/kitty/)

  • Font: SauceCodePro Nerd Font
  • Colors: Gruvbox dark theme
  • Scrollback: Neovim pager (nvim_open_term) with q/Ctrl-C/Shift+Q to quit
  • Window nav: Ctrl+h/j/k/l via vim-kitty-navigator (IS_VIM user var)
  • Remote control: allow_remote_control yes, listen_on unix:/tmp/mykitty
  • Icon: Alternate >^_^< cat icon from sodapopcan/kitty-icon
  • Tab bar: Custom active/inactive colors (#659DDA active)
  • Transparent background: 0.8 opacity, 30 blur

Key Bindings

KeyAction
Cmd+eOpen scrollback in nvim
Cmd+Shift+.Open nvim config tab
Ctrl+h/j/k/lNavigate between nvim splits / kitty windows

Editor

Neovim / AstroNvim (~/.config/nvim/)

  • Plugin Manager: lazy.nvim
  • Theme: onedarker (with transparent background)
  • Picker: Snacks.nvim (files, grep, buffers, explorer, LSP)
  • Status bar: Heirline (tabline with tab numbers)
  • LSP: vtsls, lua_ls, efm (formatting/linting via mason)
  • Completion: blink.cmp
  • Syntax: Treesitter with textobjects
  • Git: gitsigns, diffview, gitlinker
  • Navigation: dropbar (breadcrumbs), hop (jump), syntax-tree-surfer
  • Diagnostics: tiny-inline-diagnostic, trouble
  • File explorer: Snacks explorer (replaces nvim-tree)
  • Search: grug-far (find & replace)
  • Testing: neotest (jest)
  • DAP: nvim-dap (jest debugging)
  • Other: which-key, noice, undotree, oil, auto-save, nvim-surround, mini.indentscope

Custom Keymaps

KeyAction
<Leader>ffFind files (Snacks)
<Leader>fgLive grep (Snacks)
<Leader>eToggle explorer (Snacks)
<Leader>ulToggle line number style (both/relative)
<Leader>uvToggle inline diagnostics
<Leader>gbGit blame line
<Leader>gdOpen diffview
<Leader>ssFind & replace (grug-far)
<Leader><Leader>Hop jump
<Leader>gwGit worktree picker

Per-Project Config

.localrc.lua files in project roots provide project-specific keymaps and LSP settings. See after/plugin/localrc.lua for the loader.

Window Management

AeroSpace (~/.config/aerospace/)

  • Workspaces: A S D F Z X V Q R T (keyboard layout order)
  • Layout: Accordion (default), tiles, floating
  • Gaps: 8px inner, 46px top (for sketchybar), 8px others
  • Start at login: Yes
  • Config version: 2
  • JankyBorders: Launched on startup, #659DDA active, style=round

Key Bindings

KeyAction
Alt+letterSwitch to workspace
Alt+Shift+letterMove window to workspace
Alt+h/j/k/lFocus left/down/up/right
Alt+Shift+h/j/k/lMove window
Alt+Cmd+EnterToggle tiles layout
Alt+Shift+EnterToggle accordion layout
Alt+EscService mode (reload, reset, fullscreen, floating)
Alt+- / Alt+=Resize

SketchyBar (~/.config/sketchybar/)

  • Left: AeroSpace workspaces (A-Z) with app icons, focused workspace accented
  • Left: Current focused app name with icon
  • Right: Calendar, Volume, Battery, CPU usage
  • Font: SF Pro (icons), SauceCodePro Nerd Font (space letters)
  • Colors: Dark blue bar, accent on focused space only
  • Auto-update: On workspace change and focus change via aerospace callbacks

JankyBorders (~/.config/borders/)

  • style=round, width=3.0
  • Active: #659DDA (matches kitty active tab)
  • Inactive: #494d64

Launcher

Leader Key (~/.config/leader-key/)

Uses the maintained kevintraver/LeaderKey fork, installed from source by ~/.local/bin/install-leader-key.zsh when full Xcode is available.

Config is symlinked from ~/.config/leader-key/config.json to ~/Library/Application Support/Leader Key/config.json, so changes made in Leader Key update the tracked file directly. Custom icons use /Users/Shared/leader-key-icons, a username-independent symlink to ~/.config/leader-key/icons/apps, and point directly at image files. This requires the fork because upstream treats non-.appiconPath values as SF Symbols.

KeyGroup
gGo to (Browser, Slack, WhatsApp, Kitty, Notes, Gmail, Calendar, etc.)
sSearch (Browser tabs, Files, Slack, WhatsApp)
fBrowse folder (Home, Downloads, Desktop)
FOpen folder (Home, Desktop, Downloads)
rRaycast (Screenshots, Notes, Ticket, Snippets)
wWorkspace (AeroSpace: A, B, D, F, G, M, O, P, Q, R, S, T, U, V, X, Z)
aAeroSpace (Reset, Floating, Fullscreen, Close, Join)
cChange case
Shift+RReload (Kitty, AeroSpace, Leader Key, Mouseless, SketchyBar)

All URLs use raycast-x:// scheme (except script commands which use raycast://).

Raycast Extensions

The install script builds the Chrome, Kitty, QR Code, and Notification History extensions from the source tracked in this repository. The external Store extensions referenced by Leader Key or script commands must be installed manually:

ExtensionUsed forStore
Google ChromeSearch browser tabsInstall
CalendarCalendar searchInstall
Change CaseText case conversionsInstall
JQParse and query clipboard JSONInstall

Scripts (~/.local/bin/)

Raycast Scripts

ScriptDescription
raycast-next-wallpaper.zshSwitch to next wallpaper
raycast-previous-wallpaper.zshSwitch to previous wallpaper
raycast-reload-configs.zshReload all configs (kitty, aerospace, leader key, mouseless, sketchybar)
raycast-git-quick-commit.zshStage tracked files, prompt commit message, push
raycast-dotfiles-commit.zshShow dotfiles diff, select files, nvim commit, push

Kitty Scripts

ScriptDescription
dotfiles.zshOpen dotfiles in nvim (kitty tab)
nvim-config.zshOpen nvim config in kitty tab
lazygit.zshOpen lazygit in kitty tab
kitty-launcher.zshLaunch commands in kitty split panes
tab_title.zshGenerate kitty tab titles with git branch

Browser Scripts

ScriptDescription
focus-tab.jsFocus a Chrome tab (AppleScript)
focus-url-tabFocus or open a tab by URL
list-tabs.jsList all Chrome tabs (for Raycast)

System Scripts

ScriptDescription
macos-defaults.zshSet macOS system preferences
install_dotfiles.shFull machine setup script
buildnvim.shBuild neovim from source
open-in-nvim.zshOpen files in nearest running nvim (via kitty remote control)
wallpaper.zshFetch space/astronomy wallpapers (JWST + NASA APOD + Unsplash)
organize_windows.shOrganize windows with AeroSpace
toggle-chain-click.zshToggle Homerow chain clicks
dismiss-notifications.applescriptDismiss macOS notifications
get-ticket.shGet Jira ticket from clipboard
shortcut.shLaunch app and trigger shortcut
json.shParse clipboard as JSON
sh.shRun shell commands via Raycast

Neovim.app (Finder Integration)

An app bundle at ~/Applications/Neovim.app (not tracked in git) that:

  • Shows up in Finder's "Open with" menu with the Neovim icon
  • Opens files in the nearest running nvim instance via kitty remote control
  • Is set as default for 50+ code file extensions via duti

Wallpaper System

Wallpapers are fetched from three sources (in priority order):

  1. NASA APOD — Astronomy Picture of the Day (free, high quality processed images)
  2. JWST API — James Webb Space Telescope raw images (free key at jwstapi.com)
  3. Unsplash — Space/astronomy themed backup
  • Stored in ~/.config/wallpapers/ (gitignored)
  • API keys in ~/.config/wallpapers/.unsplash-key and .jwst-key (gitignored)
  • Rotates hourly via cron job
  • Next/Previous via Raycast scripts
  • Minimum resolution filter (1000x500)

Git Configuration

  • Main config: ~/.config/git/config (aliases, delta pager, nvim as editor)
  • Personal identity: ~/.gitconfig.user (edygar@users.noreply.github.com)
  • Work identity: ~/.gitconfig.work (gitignored, prompted on install)
  • Conditional includes: ~/Code/work/ uses work identity
  • Lazygit: Custom commands (s sync, S force sync, K commit --no-verify, o edit config)

Fonts

FontUsage
SauceCodePro Nerd FontKitty, Neovim, eza icons, starship
SF ProSketchyBar icons
sketchybar-app-fontSketchyBar app icons

macOS Defaults

Set via macos-defaults.zsh:

  • Dock: autohide, no delay
  • Menu bar: always hide
  • Finder: show hidden files, list view, path bar, status bar
  • Keyboard: fast key repeat, no auto-correct
  • Trackpad: tap to click
  • Screenshots: no shadow, save to Desktop
  • Windows: minimize on double-click title bar

License

Personal dotfiles. Use at your own risk.

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages