My macOS dotfiles, managed with GNU Stow.
This setup is built around a few core ideas:
omniwmfor a Hyprland-style tiling workflow on macOSsketchybarto replace the native menu bar with the info I actually wanttmuxplustmux-sessionizerfor fast context switching between projectscodexandclaudesurfaced in the bar so usage is visible at a glanceghostty,zsh, andnvimas the terminal-first daily drivers
omniwm/- window manager settings, keybinds, layouts, and app rulessketchybar/- status bar config, widgets, plugins, and launch agent helperstmux/- tmux config plus thetmux-sessionizerhelperzsh/- shell config, prompt, aliases, and lazy-loading setupghostty/- terminal confignvim/- Neovim config, LSP, editing workflow, and AI integration
brew bundle
stow omniwm sketchybar tmux zsh ghostty nvimIf you only want part of the setup, stow the packages you need individually.
omniwm is the window manager layer for the desktop. The config leans into:
- tiled layouts by default
- strong window borders and visible gaps
- workspace switching with
Option+1throughOption+4 Option+Shift+<number>for moving windows between workspaces- a quake-style terminal for quick access
The config lives in omniwm/.config/omniwm/settings.toml.
sketchybar replaces the stock macOS menu bar with a minimal, functional status bar.
It currently surfaces:
- workspace and window state from
omniwm - CPU, battery, and clock info
- Claude usage
- Codex usage
The bar depends on the font-sketchybar-app-font cask for app icons, so make sure brew bundle has installed it before starting the bar.
Also you need to do
chmod +x ~/Library/LaunchAgents/com.omniwm.sketchybar-watcher.plist
The Claude widget shows session and weekly usage in the bar.
It reads the Claude Code-credentials item from macOS Keychain, expects that item to contain JSON with an accessToken, and uses that token to query Anthropic's usage endpoint.
If the keychain item is missing, the widget will show an error until Claude Code has been signed in and the credentials item exists locally.
To set it up manually:
- Open
Keychain Access. - Search for
Claude Code-credentials. - Open the item, go to
Access Control, and add SketchyBar as an allowed app. - If you need to find the binary manually, use
Cmd+Shift+Gin Finder, jump to/opt/homebrew/bin, and selectsketchybar. - Make sure the item still contains the Claude JSON payload, including the
accessToken.
The widget looks for that exact item name, so keep it consistent.
The Codex widget reads ~/.codex/auth.json, uses the stored access token, and displays usage percentage plus reset timing in the bar.
tmux is configured for a fast, editor-like terminal workflow:
F12is the prefix but I use Hyperkey to rebind this to my Caps LockOption-free navigation and split managementlazygitopens in a popuptmux-sessionizerjumps between project sessions quickly
The sessionizer helper lives in tmux/.local/bin/tmux-sessionizer.
Useful bindings:
F12thensfor a horizontal splitF12thenvfor a vertical splitF12thengforlazygitF12thenffor the sessionizer popup
zsh is set up for a practical shell-first workflow:
zinitfor plugin management- lazy-loaded completion and
nvm - aliases for
nvim,tmux-sessionizer, andlazygit oh-my-poshprompt styling- paths for Go, Android, Bun, Node, PostgreSQL, and local binaries
nvim is the main editor config and includes:
- LSP setup
- formatting and treesitter
- file navigation and git tooling
- AI integration
- This repo is organized as stow packages, so each top-level directory maps to a package.
- Some configs expect local secrets or machine-specific files, such as the Claude cookie and Codex auth state.
- The SketchyBar OmniWM watcher is wired through a LaunchAgent at
sketchybar/Library/LaunchAgents/com.omniwm.sketchybar-watcher.plist.